Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.08.2012, 23:33   #1
HellMercenariess
Форумчанин
 
Аватар для HellMercenariess
 
Регистрация: 27.07.2009
Сообщений: 547
Сообщение Посимвольная обработка строк

Может кто нибуть уже стыкался с такими задачами?
если есть наработки делитесь

выяснить содержит ли строка любую гласную букву,
желательно выдавать True как только найдет первую гласную и останавливать проверку чтобы не нагружать лишнее
выяснить содержит ли строка любую согласную букву

Выяснить если любые гласные символы 3 подряд
Выяснить если любой один и тот же символ(букву) 3 раза подряд

последние два вообще плохо понимаю как кроме перебирать каждый символ в строке к каждому символу, но не будет ли это сильно нагружать машину?
"Виновник этого парада,он не дурак, ушел как надо!" Похороны панка.
HellMercenariess вне форума Ответить с цитированием
Старый 23.08.2012, 23:53   #2
kangreon
Форумчанин
 
Аватар для kangreon
 
Регистрация: 03.04.2009
Сообщений: 305
По умолчанию

Цикл перебора всех символов:
Код:
c := Length(str);
for i := 1 to c do
begin
  str[i]; // символ
end;
С предпоследним можно сделать так: каждый раз, когда встречается гласная буква, увеличивать некий счетчик на 1, а если согласная, сбрасывать счетчик. И прверять, равно ли число счетчика трем.

В последнем надо делать тоже самое, что и в предыдущем, только условие увеличение счетчика немного изменить. Сверять текущий символ с символом в переменной, а если сиволы схожи, увеличивать счетчик. В противном случае, сбрасывать счетчик. Заносить новый символ в переменную и проверять условие равенства счетчика трем.

Последний раз редактировалось kangreon; 23.08.2012 в 23:59.
kangreon вне форума Ответить с цитированием
Старый 24.08.2012, 06:08   #3
Johnson
кривокодер ;)
Форумчанин
 
Аватар для Johnson
 
Регистрация: 20.06.2008
Сообщений: 707
По умолчанию

На этом форуме есть негласное правило...
Наработки должны показывать Вы, когда задаете вопрос. Если их нет в вопросе - многие даже одну букву поленятся написать, так как Вы поленились подумать сами хоть немного.
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид}
Johnson вне форума Ответить с цитированием
Старый 24.08.2012, 07:48   #4
HellMercenariess
Форумчанин
 
Аватар для HellMercenariess
 
Регистрация: 27.07.2009
Сообщений: 547
По умолчанию

Цитата:
Сообщение от Johnson Посмотреть сообщение
На этом форуме есть негласное правило...
Наработки должны показывать Вы, когда задаете вопрос. Если их нет в вопросе - многие даже одну букву поленятся написать, так как Вы поленились подумать сами хоть немного.
Не путайте меня со студентами которым задают задачи для решения, "подумать хоть немного" это мы уже сделали когда продумали как дальше фильтровать поступающие после обработки
Код:
procedure TForm1.Bearbeiten;
var
   Data : TData;
   i,ix ,adCount :Integer;
   c    : AnsiChar;
begin
   if Length(Symbol.Text)>0 then
     c:=Symbol.Text[1]
   else
     c:=#32;
  for ix:=0 to RichEdit1.Lines.Count-1 do  begin
   Data:=Split(richEdit1.LineS.strings[ix], c);
   for i := 0 to Length(Data)-1 do
    begin
   { if(isKonsont())and(isVokale)}
    if not (Worten.Lines.IndexOf(Data[i])>0) then
     begin
     Worten.Lines.Add(Data[i]);
     inc(adCount);
                              end;       end;
 tCount:=tCount+adCount;
 RichEdit1.Lines.Add('добавлено: '+intToStr(adCount));
end;
строки, а сейчас заняты ломанием головы почему последняя строчка которая вроде не в цикле срабатывает несколько раз произвольно всегда больше трех раз. Процедура исполняется при нажатии кнопки.

Зачем плохо изобретать с нуля то что уже хорошо придумали другие причем не один раз?
"Виновник этого парада,он не дурак, ушел как надо!" Похороны панка.
HellMercenariess вне форума Ответить с цитированием
Старый 24.08.2012, 07:56   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Сделайте счетчики подряд идущих гласных и согласных. А так последняя строка в первом цикле, end-ы посчитайте
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 24.08.2012, 08:29   #6
Johnson
кривокодер ;)
Форумчанин
 
Аватар для Johnson
 
Регистрация: 20.06.2008
Сообщений: 707
По умолчанию

Код писался на коленке, могут быть ошибки синтаксиса.
И ещё плохо помню как работает операция IN... Возможно, есть ошибка.

Прерывать код по обнаружении какого-либо соответствия смысла нет.
Эта процедура прогонит через себя "Войну и мир" за пару секунд.

Код:
procedure CheckString;
const
	S: String = 'Строкааа ддля проверки';
var
	Glasn: array [0..9] of char = ['а', 'у', 'о', 'ы', 'э', 'я', 'ю', 'ё', 'и', 'е'];
	
	CntTrippleGlasn : word = 0;
	CntTrippleChar  : word = 0;
	
	FlagHaveGlasn : boolean = false;
	FlagHaveSoglasn : boolean = false;
	FlagTrippleGlasn : boolean = false;
	FlagTrippleChar : boolean = false;
	
	I,L:cardinal;
begin
	L := Length(S);
	if L = 0 then Exit;
	for I := 1 to L do begin
		// Проверяем, есть ли гласные или согласные в строке
		if (S[I] in Glasn) then FlagHaveGlasn := True
		else FlagHaveSoglasn := True;
		
		// Проверяем количество подряд идущих гласных
		if (I > 1 AND (S[I] in Glasn) AND (S[I-1] = S[I])) then
			Inc(CntTrippleGlasn);
			if (CntTrippleGlasn => 3) then begin
				// ЕСТЬ ТРИ ИДУЩИЕ ПОДРЯД ГЛАСНЫЕ!
				FlagTrippleGlasn := true;
			end;
		end else CntTrippleGlasn := 0;
		
		// Проверяем количество подряд идущих букв
		if (I > 1 AND (S[I-1] = S[I])) then
			Inc(CntTrippleChar);
			if (CntTrippleChar => 3) then begin
				// ЕСТЬ ТРИ ИДУЩИЕ ПОДРЯД БУКВЫ!
				FlagTrippleChar := true;
			end;
		end else CntTrippleChar := 0;
	end;
	// Тут делаем что-то со флагами...
end;
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид}

Последний раз редактировалось Johnson; 24.08.2012 в 08:32.
Johnson вне форума Ответить с цитированием
Старый 24.08.2012, 08:37   #7
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Тут Джонсон прав - перебор можно проводить неявно, через множества.

Цитата:
последние два вообще плохо понимаю
Правильно оформив в процедуры и функции. Тебе просто нужно логически разбить программу на независимые блоки. Решение последних задач опирается на решение первых.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обработка строк Bell Mort Общие вопросы C/C++ 0 28.11.2010 16:15
Посимвольная замена текста в мемо Marsel737 Общие вопросы Delphi 2 21.09.2010 22:00
Обработка строк Dmitriy1989100 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 02.11.2009 22:28
обработка строк на Си HoOpe Помощь студентам 35 20.05.2009 19:11