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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.06.2009, 03:36   #1
foE
 
Регистрация: 26.05.2009
Сообщений: 4
По умолчанию Цикл работает не полностью почему?

Вот написал два очень простых цикла:
-во внешнем из строки берется первый символ и присваивается значению tx1, далее из этой же строки удаляется первый символ.
-во внутреннем тоже самое + еще там идет сравнение символов из первой и второй строки.
Если совпадают tx и tx1 то к-счетчик увеличивается на единицу.
Не могу понять почему-то выполняется только внутренний цикл, а во внешнем только одна первая итерация проходит...
Код:
l:=length(text);
    for I := 1 to 32 do
    begin
       tx1:=copy(buf1,1,1);
       delete(buf1,1,1);
       for j := 1 to l do
       begin
          tx:=copy(text,1,1);
          if tx1=tx then begin k:=k+1;
          Memo5.Lines.Add('Кол-во повтерений буквы'+tx1+'='+IntToStr(k)); end
            else k:=k;
          delete(text,1,1);
       end;
    end;
Программа выдает
Кол-во повторений буквыА=1
Кол-во повторений буквыА=2
...
Кол-во повторений буквыА=18(кол-во повторений считает верно, но только одной буквы)
text-строка не упорядоченных символов от А..Я
buf -строка упорядоченных символов от А..Я упорядоченная по алфавиту и имеющая размер 32(алфавит, без буквы ё)
Программа ищет кол-во повторений каждой буквы алфавита в строке.

Последний раз редактировалось foE; 07.06.2009 в 03:41.
foE вне форума Ответить с цитированием
Старый 07.06.2009, 10:01   #2
Daramant
Форумчанин
 
Регистрация: 06.01.2009
Сообщений: 340
По умолчанию

Просто, во внутреннем цикле, ты из text удаляешь все символы, а остальные итерации цикла проходят в холостую с пустой строкой.
Код:
l:=length(text);
    for I := 1 to 32 do
    begin
       tx1:=copy(buf1,1,1);
       delete(buf1,1,1);
       for j := 1 to l do
       begin
          tx:=copy(text,1,1);
          if tx1=tx then begin k:=k+1;
          Memo5.Lines.Add('Кол-во повтерений буквы'+tx1+'='+IntToStr(k)); end
            else k:=k;
          delete(text,1,1); { <-- }
       end;
    end;
P.S. Зачем удалять символы (delete) и копировать (copy), ведь можно просто обращаться по индексу к строке:
Код:
tx1 := text[2] {<- вернет 2 символ строки }
Истинный успех – это то, что Вы сделали в сравнении с тем, что могли бы сделать.
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили "Титаник".
Daramant вне форума Ответить с цитированием
Старый 07.06.2009, 14:32   #3
foE
 
Регистрация: 26.05.2009
Сообщений: 4
Хорошо

Цитата:
Сообщение от Daramant Посмотреть сообщение
Просто, во внутреннем цикле, ты из text удаляешь все символы, а остальные итерации цикла проходят в холостую с пустой строкой.
Спасибо все получилось
Вот готовый кусочек программы, которая считает кол-во повторных вхождений символов строки buf1 из строки text
buf1 - строка от А..Я плюс пробел, которая считывается из файла alfavit.txt
text - строка нормализованного текста( буквы от А..Я без Ё + пробел), считывается также по подобию как и строка buf1.
Код:
fName := 'c:\1\alfavit.txt'; AssignFile(fkey, fName);
Reset(fkey);
while not EOF(fkey) do begin
read(fkey, bufkey);
buf1:=bufkey;
end;
CloseFile(fkey);

for I := 1 to 33 do
    begin
    tx1:=copy(buf1,1,1);
    delete(buf1,1,1);
    k:=0;
    for j := 1 to l do
    begin
    if tx1=text[j] then
    k:=k+1
    else k:=k;
    end;
    Memo5.Lines.Add('Кол-во повторений символа *'+tx1+'*='+IntToStr(k));
    end;
Результат:

Кол-во повторений символа *А*=10
Кол-во повторений символа *Б*=8
Кол-во повторений символа *В*=1
Кол-во повторений символа *Г*=2
Кол-во повторений символа *Д*=16
...
Кол-во повторений символа *Э*=0
Кол-во повторений символа *Ю*=0
Кол-во повторений символа *Я*=4
Кол-во повторений символа * *=6

P.S. Еще раз большое спасибо Daramant!
foE вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему не работает цикл??? kobolok Помощь студентам 1 06.05.2009 12:24
Почему появляется цикл? valerij Microsoft Office Excel 11 11.02.2009 00:20
Почему не работает тег align=right?valign работает а align нет! aviv HTML и CSS 5 21.01.2009 17:46
Почему не работает цикл????? Marsik Помощь студентам 2 22.06.2008 14:16
Цикл не работает...? Иринкаа Помощь студентам 6 17.11.2007 00:27