|
Вопрос # 3 573/ вопрос открыт / |
|
Здравствуйте, уважаемые эксперты! Вот у меня есть програма, она запускаеться даные я могу вводить, но потом когда нажимаю ентер окно ввода закрываеться и дельфи выдаёт ошибку. помогите мне пожалуйста, подскажи в чём ошибка в этой задаче.
ниже задача. Ошибка: FOR-loop variable "i" may be undefined after loop может я в чёмто задачу не правельно построил. подскажите пожалуйста.
Приложение: Переключить в обычный режим- program Ryadki;
-
- {$APPTYPE CONSOLE}
-
- uses
- SysUtils;
- const n=10;
-
- i,j:Integer;
- sy:char;
- s:string;
- begin
- { TODO -oUser -cConsole Main : Insert code here }
- writeln('vvedite spisok slov');
- for i:=1 to n do read(list[i]);
- begin
- s:=List[i];
- sy:=s[1];
- j:=1;
- while j<=Length(s) do if s[j]=sy then Delete(s,j,1)
- else inc(j);
- List[i]:=s;
- end;
- writeln(S);
- readln;
- end.
Ответ #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;
Полный код в приложении.
Приложение: Переключить в обычный режим- uses
- SysUtils;
-
- const n=10;
-
- i,j:Integer;
- sy:char;
- s:string;
- begin
- { TODO -oUser -cConsole Main : Insert code here }
- writeln('vvedite spisok slov');
- for i:=1 to n do
- begin
- readln(list[i]);
- if length(List[i])=0 then continue;
- s:=List[i];
- sy:=s[1];
- j:=1;
- while j<=Length(s) do if s[j]=sy then Delete(s,j,1)
- else inc(j);
- List[i]:=s;
- end;
-
- for i:=1 to n do
- begin
- writeln(List[i]);
- end;
- readln;
- end.
 |
Ответ отправил: Егор (статус: 10-ый класс)
Время отправки: 23 декабря 2009, 23:35
|
Мини-форум вопроса
Всего сообщений: 2; последнее сообщение — 23 декабря 2009, 23:08; участников в обсуждении: 2.
|
Паровоз (статус: 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;
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|