Помощь - Поиск - Пользователи - Календарь
Полная версия: Задача с решением и обьяснениями.
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
GrukhvinEV
Выкладываю решение задачи с пояснениями, мб кому пригодится.
В файле содержится последовательность слов, разделенных пробелом. Текст заканчивается точкой. Вывести в новый файл все слова, отличные от последнего слова.

Program Lab_3; {Имя программы}
uses crt; {Команда подключения модулей}
const {Секция объявления констант}
filename1='a.txt';{Присваиваем константе filename1 имя файла, a.txt}
filename2='b.txt'; {Присваиваем константе filename2 имя файла, b.txt}
var {Секция объявления переменных}
f:text; {Переменная для объявления текстового файла}
s,last:string; {Переменная типа строка}
p,o:byte;{Переменная типа byte, переменная типа byte может принимать значения от 0 до 255}
begin
assign(f,filename1);{Связываем файловую переменную f с конкретным именем внешнего файла 'filename1'}
reset(f); {Открываем существующий файл с которым мы связали переменную f}
s:=''; {Присваиваем переменной строки s пустое значение}
repeat {Выполняем оператор после repeat до тех пор пока не выполнится условие заданное после оператора until}
inc(byte(s[0]));{ Увеличиваем значение кода символа s[0] на 1, т.к. s[0] имеет пустое значение, то к пустому значению прибавляем 1}
read(f,s[byte(s[0])]);{Считываем текст из файловой переменной f в переменную s }
until s[byte(s[0])]='.';{Условие выхода из цикла оператора repeat: переменная s[byte(s[0])] равна '.'}
dec(byte(s[0]));{ Уменьшаем кода символа s[0] на 1, т.е. после выполнения цикла организованного оператором repeat код символа s[0] будет равняться количеству символов в файле, а оператор dec уменьшит это значение на 1}
writeln('Строка файла: ',s); {Выводим текст 'Строка файла: s' , где s переменная строки, которая хранит считанную с файла информацию}
close(f);{Закрываем ранее открытый файл f}
for p:=length(s) downto 1 do {Для всех p от length(s) до 1 выполняется оператор после do, где length(s) – количество символов переменной s}
if s[p]=' ' {Если переменная s[p] равна пробелу, то выполняем оператор после then}
then
begin
last:=copy(s,p+1,255);{Присваиваем переменной строки last значение извлеченное из переменной s начиная с символа p+1 до 255, т.е считываем с переменной s в переменную last последнее слово}
break;{Принудительно завершаем цикл, т.к. нет смысла выполнять цикл полностью если мы дошли до конечного значения переменной s}
end;
assign(f,filename2); {Связываем файловую переменную f с конкретным именем внешнего файла 'filename2'}
rewrite(f); {Открываем файл f в режиме записи. Если указанный файл отсутствует на диске, то он будет создан. Если файл существует и содержит данные, то все они будут удалены и заменены в дальнейшем новыми (перезаписаны)}
writeln('Последнее слово: ',last); {Выводим текст 'Последнее слово: last' , где last переменная строки, которая хранит последнее слово файла}
o:=1;{Переменной о присваиваем значение 1, о – переменная с которой будем начинать извлечение слова из переменной s}
for p:=1 to p do {Для p от 1 до p выполняем оператор после do}
if s[p]=' ' {Если переменная s[p] равна пробелу, то выполняем оператор после then}
then
begin
if copy(s,o,p-o)<>last {Если извлеченное значение из переменой s от o до o-p не равно значению переменной last, то выполняется оператор после then, т.е сравниваем извлеченное слово с последним словом и если слова не равны то переходим к выполнению оператора после then}
then writeln(f,copy(s,o,p-o)); {Записываем в файл f значение извлеченное из переменной s от о до p-о, т.е. извлеченное слово}
o:=p+1;{Присваиваем переменной о значение переменной p+1, т.е. задаем номер символа с которого будет начинаться извлечение из переменной s}
end;
close(f); {Закрываем ранее открытый файл f}
readln{Ожидание нажатия клавиши Enter}
end.

IUnknown
И зачем? На этом форуме подобная задача решалась неоднократно, достаточно было воспользоваться поиском (а коли ты не воспользовался - то и другой на твое решение плевать хотел). А по поводу комментариев - я бы за такой ужас больше двух баллов не поставил: комментарии "забивают" собственно программу. Не надо комментировать каждый символ.

Цитата
s,last:string; {Переменная типа строка}
Это что, для даунов? Недостаточно ":string", чтобы понять, что происходит?

Цитата
p,o:byte;{Переменная типа byte, переменная типа byte может принимать значения от 0 до 255}
А всю справочную систему скопировать не хочешь? Кстати, "низачОт" тебе: не указал, при каких условиях сколько символов может храниться в строке...

Дальше комментировать нет смысла...
GrukhvinEV
Ну вообще по скольку у меня это 3 программа по счету, то с самого нуля было тяжко разбираться как это все работает, вот ушел весь день. Были бы все задачи так расписаны было бы проще разбираться начаинающим, типа меня. А то задаешь вопрос на какую нибудь задачу и фиг кто ответит. И если ты такой умный, то коменти пожалуйста только то что не верно описано.
Гость
Был бы под рукой у каждого свой собсвенный программист,математик,физик,финансист, менеджер,тогда вообще делать было бы нечего....А в остальном согласен с предыдущим оратором.
GrukhvinEV
Умники, лучше ответте на вопрос тут:
Динамические переменные
GrukhvinEV
А все спасибо, не надо разобрался.
IUnknown
Цитата
лучше ответте на вопрос тут:
Да с чего бы? Тот, кто тебе это написал - пусть и отвечает. Тем более, что на другом форуме я тебе до такой степени разжевал работу со списками и стеками, что это понял бы даже "дуб, в тени которого сидел Пушкин" (С) Г. Хазанов
GrukhvinEV
Да фиг с вами не буду больш выкладывать.
Krjuger
Ой как испугал.
Ты суда пришел учить или помощи просить?То, как ты спрашиваешь и просишь помощи, будет влиять на то,как тебе будут отвечать,если конешно будут.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.