Помощь - Поиск - Пользователи - Календарь
Полная версия: Задача с решением и обьяснениями.
Форум «Всё о Паскале» > 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
Ой как испугал.
Ты суда пришел учить или помощи просить?То, как ты спрашиваешь и просишь помощи, будет влиять на то,как тебе будут отвечать,если конешно будут.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.