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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.01.2012, 13:30   #1
pandaaaaa
Пользователь
 
Регистрация: 09.12.2011
Сообщений: 27
Восклицание зацикливание

Если последний элемент строки - заглавная буква, то происходит зацикливание. Посмотрите что не так.
Код:
uses crt;
const
m=80;
var
 a:string;
 i:integer;
begin
write('Vved stroku: ');
read(a);
writeln;
for i:=1 to m do
begin
 case a[i] of
 'A'..'Z':begin
               delete(a,i,1);
               i:=i-1;
          end;
 'À'..'ß':begin
               delete(a,i,1);
               i:=0;
          end;
 end;
end;
writeln('Izmen stroka: ',a);
end.
pandaaaaa вне форума Ответить с цитированием
Старый 23.01.2012, 13:34   #2
Vanta11a
Lawful Evil
Участник клуба
 
Аватар для Vanta11a
 
Регистрация: 13.05.2008
Сообщений: 1,208
По умолчанию

Может потому что где-то там лежит символ конца строки?

Код:
for i:=1 to m do
попробуйте сменить на
Код:
for i:=1 to length(a) do
апд:
и не удалять из строки, а копировать в другую строковую переменную. Ну или сразу выводить.
Алгоритм - бесплатен. Поиск багов - бесплатен. Реализация алгоритма - за отдельную плату.
На форуме помогают советами и объясняют, а не пишут на халяву программы, лабы, курсачи и т.д. (c)
Vanta11a вне форума Ответить с цитированием
Старый 23.01.2012, 13:34   #3
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

Начнем с того, что изменять переменную-счетчик в цикле For — глупость из глупостей
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Старый 23.01.2012, 13:36   #4
pandaaaaa
Пользователь
 
Регистрация: 09.12.2011
Сообщений: 27
По умолчанию

Цитата:
Сообщение от Luuzuk Посмотреть сообщение
Начнем с того, что изменять переменную-счетчик в цикле For — глупость из глупостей
тогда при повторении заглавных букв, он выполняет удаление через 1.



насчет length пробовал, не помогает =\
pandaaaaa вне форума Ответить с цитированием
Старый 23.01.2012, 13:40   #5
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

Тогда он потом обращается ЗА границы массива символов "а" (строка есть массив симвалов, ага?)
Длина массива, ясен пень, уменьшится после удаления одного символа, а ОБЛАСТЬ ПАМЯТИ - нет.
На примере: а = "abcD"
символ "D" будет удален, i станет равна 3м. На следующей итерации она опять станет равна 4м и обратится к несуществующему 4му символу в "а". А там, ВНЕЗАПНО, осталась наша старая добрая "D". И так пока конец света не настанет
Access Violation вообще за такие вещи положен
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Старый 23.01.2012, 13:42   #6
pandaaaaa
Пользователь
 
Регистрация: 09.12.2011
Сообщений: 27
По умолчанию

пойду осмысливать вышесказанное) и зарядка на ноуте кончается....
pandaaaaa вне форума Ответить с цитированием
Старый 23.01.2012, 13:43   #7
Step_UA
Форумчанин
 
Аватар для Step_UA
 
Регистрация: 09.06.2011
Сообщений: 388
По умолчанию

А можно само задание?
на неконкретные вопросы даю неконкретные ответы ...
Step_UA вне форума Ответить с цитированием
Старый 23.01.2012, 13:44   #8
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

замените цикл for на цикл while (i <= length(a)) и будет вам счастье только переменную i не забудьте увеличивать при каждом прохождении цикла. И инициализируйте её перед использованием)
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Старый 23.01.2012, 13:45   #9
pandaaaaa
Пользователь
 
Регистрация: 09.12.2011
Сообщений: 27
По умолчанию

почему там D останется?
pandaaaaa вне форума Ответить с цитированием
Старый 23.01.2012, 13:53   #10
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

Потому что длина массива символов изменится (число поменяется), участок памяти размером в один символ будет считаться освобожденным (его сможет использовать какая-нибудь другая программа), а само содержимое ячейки памяти никто менять не будет. А в массивах элементы располагаются в памяти строго по порядку, это вам не списки
"D" там останется необязательно: эту область памяти может успеть забрать себе и перезаписать какая-нибудь другая программа. Но в вашем случае других программ нет, один турбопаскаль. Так что "D" в памяти никто не потревожит
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Зацикливание C++ Shift_sk Общие вопросы C/C++ 5 18.01.2011 19:01
Рекурсивное зацикливание Alex_Almaty Помощь студентам 8 06.07.2010 07:49
Зацикливание программы Arcanum Общие вопросы Delphi 7 12.04.2010 10:20
Зацикливание в паскале. sir.andrey Помощь студентам 2 19.03.2010 13:57
Почему получается зацикливание?? _Studentka_ Общие вопросы по Java, Java SE, Kotlin 1 09.12.2009 02:13