Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 573

/ вопрос открыт /

Здравствуйте, уважаемые эксперты! Вот у меня есть програма, она запускаеться даные я могу вводить, но потом когда нажимаю ентер окно ввода закрываеться и дельфи выдаёт ошибку. помогите мне пожалуйста, подскажи в чём ошибка в этой задаче.
ниже задача. Ошибка: FOR-loop variable "i" may be undefined after loop может я в чёмто задачу не правельно построил. подскажите пожалуйста.

Приложение:
  1. program Ryadki;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. uses
  6. SysUtils;
  7. const n=10;
  8.  
  9. i,j:Integer;
  10. sy:char;
  11. s:string;
  12. begin
  13. { TODO -oUser -cConsole Main : Insert code here }
  14. writeln('vvedite spisok slov');
  15. for i:=1 to n do read(list[i]);
  16. begin
  17. s:=List[i];
  18. sy:=s[1];
  19. j:=1;
  20. while j<=Length(s) do if s[j]=sy then Delete(s,j,1)
  21. else inc(j);
  22. List[i]:=s;
  23. end;
  24. writeln(S);
  25. readln;
  26. end.


Дементьев Евгений Владимирович Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Дементьев Евгений Владимирович (статус: Посетитель)
Вопрос отправлен: 23 декабря 2009, 22:53
Состояние вопроса: открыт, ответов: 2.

Ответ #1. Отвечает эксперт: Паровоз

Здравствуйте, Дементьев Евгений Владимирович!

У Вас в цикле выполняется только оператор read(list[i]) поскольку после него стоит точка с запятой (больше в этом цикле ничего не делается). Следующий оператор в блоке begin/end
s:=List[i];
выполняется вне цикла.
Согласно принятым правилам значение переменной цикла после выхода из него не определено. Об этом и говорит компилятор.

Ответ отправил: Паровоз (статус: 10-ый класс)
Время отправки: 23 декабря 2009, 23:02
Оценка за ответ: 5

Комментарий к оценке: Спасибо)

Ответ #2. Отвечает эксперт: Егор

Здравствуйте, Дементьев Евгений Владимирович!
Паровоз верно отметил, что у вас нет работы со списком в цикле, а есть лишь работа уже после цикла только последнего слова, да и то, по стандарту, переменная после цикла может принимать любое значение - не обязательно последнее из границ, заданных в цикле. Значит, проверяться может не последнее слово, а вообще неизвестно что.

Я посмотрел - вы, видимо, хотели сделать так, чтобы из слова брался первый символ и удалялся повсюду из этого слова. и так для всех слов списка.
так?

Если так, то у вас следующие ошибки:

1. Внести удаление первого символа в цикл:

  for i:=1 to n do
  begin
    read(list[i]);
    s:=List[i];
...
2. Вместо оператора read нужно в данном случае использовать readln, иначе первое слово считается, а остальные - нет:
readln(list[i]);
слова надо будет вводить через Enter

3. Нужна проверка на длину слова - у вас программа вылетала из-за того, что вы пытались читать символ из слова нулевой длины:
readln(list[i]);
if length(List[i])=0 then continue;

4. Выводить надо все слова? Или только одно - последнее? У вас будет выводиться только последнее слово. Если нужно выводить все слова, то это нужно обернуть в цикл:
  for i:=1 to n do
  begin
    writeln(List[i]);
  end;

Полный код в приложении.

Приложение:
  1. uses
  2. SysUtils;
  3.  
  4. const n=10;
  5.  
  6. i,j:Integer;
  7. sy:char;
  8. s:string;
  9. begin
  10. { TODO -oUser -cConsole Main : Insert code here }
  11. writeln('vvedite spisok slov');
  12. for i:=1 to n do
  13. begin
  14. readln(list[i]);
  15. if length(List[i])=0 then continue;
  16. s:=List[i];
  17. sy:=s[1];
  18. j:=1;
  19. while j<=Length(s) do if s[j]=sy then Delete(s,j,1)
  20. else inc(j);
  21. List[i]:=s;
  22. end;
  23.  
  24. for i:=1 to n do
  25. begin
  26. writeln(List[i]);
  27. end;
  28. readln;
  29. end.


Ответ отправил: Егор (статус: 10-ый класс)
Время отправки: 23 декабря 2009, 23:35


Мини-форум вопроса

Всего сообщений: 2; последнее сообщение — 23 декабря 2009, 23:08; участников в обсуждении: 2.
Дементьев Евгений Владимирович

Дементьев Евгений Владимирович (статус: Посетитель), 23 декабря 2009, 23:05 [#1]:

а как же тогда правильно записать это?
Паровоз

Паровоз (статус: 10-ый класс), 23 декабря 2009, 23:08 [#2]:

Вы пропустили перед блоком begin/end строку for i:=1 to n do:
for i:=1 to n do read(list[i]);
for i:=1 to n do
begin
...............
end;

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:29
Выполнено за 0.03 сек.