Четверг, 09.01.2025
Pascal 4 All
[ · Новые сообщения · Участники · Правила форума · Поиск · RSS ]

 

  • Страница 1 из 1
  • 1
Модератор форума: Seqular, Pavel  

Помогите С задачей С текстовыми файлами....
M@DДата: Среда, 11.06.2008, 21:22 | Сообщение # 1
Знакомый
Группа: Пользователи
Сообщений: 16
Репутация: 0
Замечания: 0%
Статус: Offline
Помогите с задачей...
Пусть дан текстовый файл. Распечатайте первую строку содержащую наибольшее количество неповторяющихся слов.

Вот программа.Помогите написать процедуру,которая распечатывает строку с наибольшем кол-вом неповторяющихся слов...
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 prosm; {Процедура просмотра файлов}
begin
Writeln('Введите имя просматриваемого файла ->');
writeln('(t1.dat,t2.dat или t3.dat): ');
Readln©; {Считывание введенного имени файла}
assign(f1,c); {связывание переменной с именем}
reset(f1); {Открытие для просмотра}
while not eof(f1) do {Цикл пока не конец файла}
begin
a:='';
readln(f1,a); {Считывание строки}
writeln(a); {Печать строки}
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.

Помогите с процедурой вывода наибольшей строки содержащее наибольшее кол-вом неповторяющихся слов...
Срочно нужно


ПросТИте За коРявЫй ПочЕрКК...
 
AlexanderДата: Среда, 11.06.2008, 23:09 | Сообщение # 2
Всевышний
Группа: Модераторы
Сообщений: 475
Репутация: 16
Замечания: 0%
Статус: Offline
Quote
Помогите с процедурой вывода наибольшей строки содержащее наибольшее кол-вом неповторяющихся слов...

самое простое- читаем слово, ищем его делее в строке(функцией Pos), если находим, то не считаем его, если не находим, то считаем. К концу строки счётчик будет содержать количество уникальных слов в строке. Дальше наверно понятно. Сами реализуете, или мне придётся код писать wacko ?


Скажем дружно- нафиг нужно!
 
M@DДата: Четверг, 12.06.2008, 05:24 | Сообщение # 3
Знакомый
Группа: Пользователи
Сообщений: 16
Репутация: 0
Замечания: 0%
Статус: Offline
А там же строка в целом читается...Я вот так вот придумал:
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...

Если не сложно я был бы очень признателен,если бы написал процедуру..

Добавлено (11.06.2008, 18:13)
---------------------------------------------
cry

Добавлено (11.06.2008, 18:48)
---------------------------------------------
БЛина, помогите плиз...Послезавтра сдача практики,еще отчет недописал....((((

Добавлено (11.06.2008, 22:24)
---------------------------------------------
Ну помогите....Очень надо....


ПросТИте За коРявЫй ПочЕрКК...
 
AlexanderДата: Четверг, 12.06.2008, 05:28 | Сообщение # 4
Всевышний
Группа: Модераторы
Сообщений: 475
Репутация: 16
Замечания: 0%
Статус: Offline
Гм.. действительно как-то муторно с Pos'ом получается, придётся тогда ещё на пару процедур разбить. Тогда пойдём самым тупым, но зато очень простым способом- читаем слово, записываем его куда-нибудь(в файл или память), затем каждое последующее проверяем не считали ли мы его уже и если нет, то тоже туда дописываем.
Код завтра или сегодня позже- совсем нет настроения что-либо делать crazy .


Скажем дружно- нафиг нужно!
 
M@DДата: Четверг, 12.06.2008, 05:40 | Сообщение # 5
Знакомый
Группа: Пользователи
Сообщений: 16
Репутация: 0
Замечания: 0%
Статус: Offline
Quote (Alexander)
Код завтра или сегодня позже- совсем нет настроения что-либо делать

Желательно сегодня либо завтро утром...
Quote (Alexander)
Гм.. действительно как-то муторно с Pos'ом получается, придётся тогда ещё на пару процедур разбить. Тогда пойдём самым тупым, но зато очень простым способом- читаем слово, записываем его куда-нибудь(в файл или память), затем каждое последующее проверяем не считали ли мы его уже и если нет, то тоже туда дописываем.

Я вот сегодня сидел над ней...У меня была идея с массивом...Каждое слово заносить в массив и потом сверять....Только чет у меня какая то несостыковка получатся.....все строки распечатывает...Либо циклит...
Задачка интересная...Со своим заколом

Добавлено (11.06.2008, 22:40)
---------------------------------------------

Quote (Alexander)
читаем слово, записываем его куда-нибудь(в файл или память), затем каждое последующее проверяем не считали ли мы его уже и если нет, то тоже туда дописываем.

А если так,то нужно условие,которое в этом файле считает кол-во слов.Да и несколько файлов...Ведь строки в исходном файле вводятся пользователем..А строку надо вывести одну, с наибольшем кол вом слов...


ПросТИте За коРявЫй ПочЕрКК...
 
AlexanderДата: Четверг, 12.06.2008, 05:52 | Сообщение # 6
Всевышний
Группа: Модераторы
Сообщений: 475
Репутация: 16
Замечания: 0%
Статус: Offline
Quote
А если так,то нужно условие,которое в этом файле считает кол-во слов

Зачем? Можно писать по одному слову в строчку wink .
Quote
Да и несколько файлов...Ведь строки в исходном файле вводятся пользователем..

ну так мы в одной строчке сосчитали, сохранили в переменную, затем во второй посчитали и сохранили номер строки где больше слов и количество слов. Т.е. нужен один файл и три переменные- одна с номером строки, а две другие с количеством слов.
Quote
Желательно сегодня либо завтро утром...

хорошо, в течение 4-ёх часов постараюсь написать.


Скажем дружно- нафиг нужно!
 
M@DДата: Четверг, 12.06.2008, 06:00 | Сообщение # 7
Знакомый
Группа: Пользователи
Сообщений: 16
Репутация: 0
Замечания: 0%
Статус: Offline
Quote (Alexander)
Зачем? Можно писать по одному слову в строчку

Quote (Alexander)
ну так мы в одной строчке сосчитали, сохранили в переменную, затем во второй посчитали и сохранили номер строки где больше слов и количество слов. Т.е. нужен один файл и три переменные- одна с номером строки, а две другие с количеством слов.

Громостко наверное будет...
Ну интересно,что получится...Я о таком не думал..
Заранее спасибо..


ПросТИте За коРявЫй ПочЕрКК...
 
AlexanderДата: Четверг, 12.06.2008, 08:50 | Сообщение # 8
Всевышний
Группа: Модераторы
Сообщений: 475
Репутация: 16
Замечания: 0%
Статус: Offline
Чего-то я тоже не могу интуитивно понятный и читабельный код написать, надо выспаться и подумать на свежую голову. Пока вот такая штука получилась:
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), но чего-то не работает. Завтра переделаю.


Скажем дружно- нафиг нужно!
 
M@DДата: Четверг, 12.06.2008, 17:42 | Сообщение # 9
Знакомый
Группа: Пользователи
Сообщений: 16
Репутация: 0
Замечания: 0%
Статус: Offline
Quote (Alexander)
но чего-то не работает

Я посмотрел,работает но не то...
Он пишет например:string 2 words 4(Во второй строке 4 слова)Но надо чтобы он выводил саму строку


ПросТИте За коРявЫй ПочЕрКК...
 
AlexanderДата: Четверг, 12.06.2008, 19:20 | Сообщение # 10
Всевышний
Группа: Модераторы
Сообщений: 475
Репутация: 16
Замечания: 0%
Статус: Offline
Quote
Но надо чтобы он выводил саму строку

А прочитать j-тую строчку из текстового файла вы не можете?
Code
reset(f);
for i:=1 to j-1 do
    ReadLn(f);
while not SeekEoLn(f) do
    begin
       Read(f,s);
       Write(s);
    end;


Скажем дружно- нафиг нужно!
 
M@DДата: Пятница, 13.06.2008, 02:57 | Сообщение # 11
Знакомый
Группа: Пользователи
Сообщений: 16
Репутация: 0
Замечания: 0%
Статус: Offline
Quote (Alexander)
Второй цикл явно должен быть not seekEOLn(f), но чего-то не работает.

не нераюотает.Не проверяет слова на совпадения
Например:Введешь подряд 6 одинаковых слов,а во вторую строку 4 неповторяющихся слов...Выведет где больше слов,независимо уникальны они или нет..


ПросТИте За коРявЫй ПочЕрКК...
 
AlexanderДата: Пятница, 13.06.2008, 03:09 | Сообщение # 12
Всевышний
Группа: Модераторы
Сообщений: 475
Репутация: 16
Замечания: 0%
Статус: Offline
Quote
не нераюотает.Не проверяет слова на совпадения

Понятное дело, если туда SeekEOLn вставить, то нужно алгоритм слегка подштукотурить, убрать или заменить проверки на возврат каретки и перенос строки. Я привёл не красивый, но полностью рабочий вариант.


Скажем дружно- нафиг нужно!
 
M@DДата: Пятница, 13.06.2008, 03:25 | Сообщение # 13
Знакомый
Группа: Пользователи
Сообщений: 16
Репутация: 0
Замечания: 0%
Статус: Offline
Quote (Alexander)
SeekEOLn вставить, то нужно алгоритм слегка подштукотурить

А если без него...???ТОже можно...но проверки на совпадений не ту...Отладил .... не получается...


ПросТИте За коРявЫй ПочЕрКК...
 
AlexanderДата: Пятница, 13.06.2008, 03:49 | Сообщение # 14
Всевышний
Группа: Модераторы
Сообщений: 475
Репутация: 16
Замечания: 0%
Статус: Offline
В эту процедуру посылаешь текстовый файл и на экран выводится количество уникальных слов для каждой строки и в самом низу выводится номер искомой строки и количество символов в ней. И в отладке она не нуждается.

Скажем дружно- нафиг нужно!

Сообщение отредактировал Alexander - Пятница, 13.06.2008, 03:50
 
M@DДата: Воскресенье, 15.06.2008, 02:54 | Сообщение # 15
Знакомый
Группа: Пользователи
Сообщений: 16
Репутация: 0
Замечания: 0%
Статус: Offline
С преподом посоветовался, говорит что пошли по заковыристому пути, громоздко.Предложила с массивом.
В принципе написал, но надо подредоктировать:
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;

for i:=1 to k do
write(f2,a[i]);
end;
end;

close(f1);
close(f2);
end;
{Оцените}

Добавлено (13.06.2008, 18:04)
---------------------------------------------
k-слова,l-повторяющие слова.

Добавлено (14.06.2008, 19:54)
---------------------------------------------
ВОт Доделал biggrin
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}

end;


ПросТИте За коРявЫй ПочЕрКК...
 
  • Страница 1 из 1
  • 1
Поиск:

Copyright MyCorp © 2025
Используются технологии uCoz
javascript:;" rel="nofollow" onclick="loginPopupForm(); return false;