Помогите с задачей... Пусть дан текстовый файл. Распечатайте первую строку содержащую наибольшее количество неповторяющихся слов.
Вот программа.Помогите написать процедуру,которая распечатывает строку с наибольшем кол-вом неповторяющихся слов... uses wincrt; var f1,f2:text; {текстовые файлы} i,kol_str,n,t,w:integer; c,a,b:string; procedure wwod; begin assign(f1,'t1.dat'); {Связывание переменной с именем} rewrite(f1); {Открытие для записи} writeln('Введите число вводимых строк-> '); readln(kol_str); for i:=1 to kol_str do {Цикл для кол-ва строк} begin writeln('Введите ',i,' строку исходного текста-> '); readln(a);{чтение введенной строки} writeln(f1,a);{Запись строки в файл F1} end; close(f1); end;
procedure delp; {Процедура удаления лишних пробелов} begin assign(f1,'t1.dat'); reset(f1); assign(f2,'t2.dat'); rewrite(f2); while not eof(f1)do {пока не конец файла} begin a:='';{обнуление} readln(f1,a); b:='';{обнуление} for i:=1 to length(a)do {цикл посимвольной проверки строки} begin b:=b+a[i];{Занос символa в b} if a[i]=' ' then {Если a[i] ровно пробел} begin while a[i]=' 'do {Пока a[i] = пробел} inc(i);{Считывание следующего символа} dec(i);{Удаление пробела} end; end; writeln(f2,b);{Печать в файл f2 строку без лишних пробелов} end; close(f1);close(f2); end;
begin w:=0; while w<>4 do begin Writeln(' МЕНЮ ПРОГРАММЫ '); Writeln('1-ввод исходного файла'); writeln('2-просмотр файла'); writeln('3-запись наибольшей строки в t3.dat'); writeln('4-Удаление лишних пробелов'); writeln('5-Выход '); readln(w); case w of 1:wwod; 2:prosm; 4:delp; end; end; end.
Помогите с процедурой вывода наибольшей строки содержащее наибольшее кол-вом неповторяющихся слов... Срочно нужно
самое простое- читаем слово, ищем его делее в строке(функцией Pos), если находим, то не считаем его, если не находим, то считаем. К концу строки счётчик будет содержать количество уникальных слов в строке. Дальше наверно понятно. Сами реализуете, или мне придётся код писать ? Скажем дружно- нафиг нужно!
А там же строка в целом читается...Я вот так вот придумал: a:=''; while not eof(f1) do begin b:=''; readln(f1,a); for i:=1 to length(a) do begin b:=b+a[i]; if a[i]:=' ' then...
Если не сложно я был бы очень признателен,если бы написал процедуру..
Гм.. действительно как-то муторно с Pos'ом получается, придётся тогда ещё на пару процедур разбить. Тогда пойдём самым тупым, но зато очень простым способом- читаем слово, записываем его куда-нибудь(в файл или память), затем каждое последующее проверяем не считали ли мы его уже и если нет, то тоже туда дописываем. Код завтра или сегодня позже- совсем нет настроения что-либо делать . Скажем дружно- нафиг нужно!
Код завтра или сегодня позже- совсем нет настроения что-либо делать
Желательно сегодня либо завтро утром...
Quote (Alexander)
Гм.. действительно как-то муторно с Pos'ом получается, придётся тогда ещё на пару процедур разбить. Тогда пойдём самым тупым, но зато очень простым способом- читаем слово, записываем его куда-нибудь(в файл или память), затем каждое последующее проверяем не считали ли мы его уже и если нет, то тоже туда дописываем.
Я вот сегодня сидел над ней...У меня была идея с массивом...Каждое слово заносить в массив и потом сверять....Только чет у меня какая то несостыковка получатся.....все строки распечатывает...Либо циклит... Задачка интересная...Со своим заколом
читаем слово, записываем его куда-нибудь(в файл или память), затем каждое последующее проверяем не считали ли мы его уже и если нет, то тоже туда дописываем.
А если так,то нужно условие,которое в этом файле считает кол-во слов.Да и несколько файлов...Ведь строки в исходном файле вводятся пользователем..А строку надо вывести одну, с наибольшем кол вом слов... ПросТИте За коРявЫй ПочЕрКК...
А если так,то нужно условие,которое в этом файле считает кол-во слов
Зачем? Можно писать по одному слову в строчку .
Quote
Да и несколько файлов...Ведь строки в исходном файле вводятся пользователем..
ну так мы в одной строчке сосчитали, сохранили в переменную, затем во второй посчитали и сохранили номер строки где больше слов и количество слов. Т.е. нужен один файл и три переменные- одна с номером строки, а две другие с количеством слов.
Quote
Желательно сегодня либо завтро утром...
хорошо, в течение 4-ёх часов постараюсь написать. Скажем дружно- нафиг нужно!
ну так мы в одной строчке сосчитали, сохранили в переменную, затем во второй посчитали и сохранили номер строки где больше слов и количество слов. Т.е. нужен один файл и три переменные- одна с номером строки, а две другие с количеством слов.
Громостко наверное будет... Ну интересно,что получится...Я о таком не думал.. Заранее спасибо.. ПросТИте За коРявЫй ПочЕрКК...
Чего-то я тоже не могу интуитивно понятный и читабельный код написать, надо выспаться и подумать на свежую голову. Пока вот такая штука получилась:
Code
procedure findmax(var f:text); var temp:text; s,s1:string; c:char; test:boolean; i,j,k,l:byte; begin Append(f); WriteLn(f); Reset(f); Assign(temp,'c:\temp.txt'); ReWrite(temp); i:=0; j:=0; l:=0; While not SeekEOF(f) do begin Read(f,c); inc(i); k:=0; while c<>#13 do begin while c=' ' do Read(f,c); s:=c; Read(f,c); while (c<>' ') and (c<>#13) do begin S:=s+c; Read(f,c); end; Reset(temp); test:=false; While not Eof(temp) do begin ReadLn(temp,s1); if s=s1 then begin test:=true; break; end; end; if not test then begin Append(temp); WriteLn(temp,s); Inc(k); end; end; if k>l then begin l:=k; j:=i; end; WriteLn(k); ReWrite(temp); if c=#13 then Read(f,c); end; WriteLn('string ',j,' words ',l); end;
В переменной j хранится номер искомой строки. Второй цикл явно должен быть not seekEOLn(f), но чего-то не работает. Завтра переделаю. Скажем дружно- нафиг нужно!
Я посмотрел,работает но не то... Он пишет например:string 2 words 4(Во второй строке 4 слова)Но надо чтобы он выводил саму строку ПросТИте За коРявЫй ПочЕрКК...
Второй цикл явно должен быть not seekEOLn(f), но чего-то не работает.
не нераюотает.Не проверяет слова на совпадения Например:Введешь подряд 6 одинаковых слов,а во вторую строку 4 неповторяющихся слов...Выведет где больше слов,независимо уникальны они или нет.. ПросТИте За коРявЫй ПочЕрКК...
Понятное дело, если туда SeekEOLn вставить, то нужно алгоритм слегка подштукотурить, убрать или заменить проверки на возврат каретки и перенос строки. Я привёл не красивый, но полностью рабочий вариант. Скажем дружно- нафиг нужно!
В эту процедуру посылаешь текстовый файл и на экран выводится количество уникальных слов для каждой строки и в самом низу выводится номер искомой строки и количество символов в ней. И в отладке она не нуждается. Скажем дружно- нафиг нужно!
Сообщение отредактировал Alexander - Пятница, 13.06.2008, 03:50
С преподом посоветовался, говорит что пошли по заковыристому пути, громоздко.Предложила с массивом. В принципе написал, но надо подредоктировать: procedure findmax; begin assign(f1,'t2.dat');reset(f1); assign(f2,'t3.dat');rewrite(f2); max:=0; while not eof(f1) do begin readln(f1,a); for i:=1 to length(a) do for k:=1 to m do begin begin b:=b+a[i]; if a[i]=' ' then begin inc(i); ar[k]:=b;
end; end; end; k:=0; l:=0; for i:=1 to m do begin if ar[1]<>ar[i] then inc(k) else inc(l); end; if max<k-l then begin rewrite(f2); max:=k-l;
Добавлено (14.06.2008, 19:54) --------------------------------------------- ВОт Доделал begin assign(f1,'t2.dat');reset(f1); assign(f2,'t3.dat'); max:=0; {НАчальное значение } while not eof(f1) do {Цикл пока не конец файла F1} begin readln(f1,a); {Считывание строки }
str:=''; {Строка, хранит прочитанное слово} k:=1; {индекс массива слов} for i:=1 to length(a) do begin
if a[i]<>' ' then {Условие на проверку крнца слова} str:=str+a[i] {составление символов в слово} else begin ar[k]:=str; {присваивание слова в массив} str:=''; {'обнуление' строковой переменной} inc(k); {Увеличение индекса массива}
end;
end;
slov:=0;{начальное значение кол-ва уникальных слов} for j:=1 to k-1 do if ar[1]<>ar[j+1] then inc(slov);{Увеличение кол-ва слов} if max<slov then begin max:=slov; rewrite(f2); {Открытие для записи} write(f2,a); {Запись текущей строки} close(f2); {Закрытие файла F2} end; end; close(f1); {Закрытие файла F1}