Добрый день!
Решаю задачи из книжки А.В. Столярова «Программирование. Введение в профессию. Задачи и этюды». Там, в частности, есть задача 2.42:
«Напишите программу, которая читает из стандартного потока ввода строки, состоящие из слов (слова могут разделяться произвольными группами пробельных символов), и в ответ на каждую прочитанную строку печатает слова из этой строки в обратном порядке; например, в ответ на фразу «Humpty Dumpty sat on a wall» должно быть напечатано «wall a on sat Dumpty Humpty». Вводить ограничния на длины строк, слов и др. нельзя; в частности, недопустимо использовать тип string для хранения читаемых строк и/или отдельных слов. Вся выделенная динамическая память должна быть корректно освобождена сразу после обработки очередной строки.»
Я написал текст программы:
program ReverseStringsOfWords;
type
ListOfChrPtr = ^ListOfChr; {list of chars}
ListOfChr = record
ch: char;
next: ListOfChrPtr;
end;
ListOfWrdPtr = ^ListOfWrd; {list of words}
ListOfWrd = record
wr: ListOfChrPtr;
next: ListOfWrdPtr;
end;
procedure AddWord(var first: ListOfWrdPtr; var LOCfirst: ListOfChrPtr);
var
tmp: ListOfWrdPtr;
begin
new(tmp);
tmp^.wr := nil;
LOCfirst := tmp^.wr;
tmp^.next := first;
first := tmp;
end;
procedure AddToWord(
var first, last: ListOfChrPtr; var LOW: ListOfWrdPtr; c: char
);
begin
if first = nil then
begin
new(LOW^.wr);
last := LOW^.wr;
first := last;
end
else
begin
new(last^.next);
last := last^.next;
end;
last^.ch := c;
last^.next := nil;
end;
procedure TypeAWord(first: ListOfChrPtr);
begin
while first <> nil do
begin
write(first^.ch);
first := first^.next;
end;
end;
procedure TypeWordsInReverseOrder(first: ListOfWrdPtr);
begin
while first <> nil do
begin
TypeAWord(first^.wr);
write(' ');
first := first^.next;
end;
end;
var
c: char;
SpcPressed: boolean;
LOW: ListOfWrdPtr;
LOCfirst, LOClast: ListOfChrPtr;
begin
while not SeekEof do
begin
LOW := nil;
LOCfirst := nil;
LOClast := nil;
SpcPressed := true;
while not SeekEoln do
begin
read(c);
if (SpcPressed = true) and (c <> ' ') and (c <> #9) then
begin
AddWord(LOW, LOCfirst);
AddToWord(LOCfirst, LOClast, LOW, c);
{just create a new word}
{start filling in a new word}
SpcPressed := false;
end
else
if (c = ' ') or (c = #9) then
begin
{end of word}
SpcPressed := true;
end
else
if (SpcPressed = false) and (c <> ' ') and (c <> #9) then
begin
AddToWord(LOCfirst, LOClast, LOW, c);
{continuing typing a word (adding elements to old list)}
end;
end;
TypeWordsInReverseOrder(LOW);
writeln;
{cleaning up heap}
end;
end.
Но по какой-то причине программа «не видит» вводимые пробельные символы. Например, если напечатать «pi po» выводом будет «pipo».
Что я упустил?