Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.01.2013, 19:42   #1
masi444
 
Регистрация: 21.01.2013
Сообщений: 5
По умолчанию Работа со списками - дан файл-словарь, содержащий слова из исходного файла в алфавитном порядке.

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

Код:
var f: text; 
i,j,k: byte; 
st: array [1..255] of string; 
r: array [1..255] of boolean; 
{работаем с файлом: открываем, читаем, смотрим и тд}
begin
assign(f,'tmp.txt'); 
reset(f); 
repeat 
inc(i); 
readln(f,st[i]); 
until eof(f); 
{далее ищем повторяющиеся слова и удаляем, оставляя только одно}
for j:=1 to i-1 do 
for k:=j+1 to i do 
if st[k]=st[j] then begin 
r[k]:=true; 
end;
close(f); 
rewrite(f); 
for i:=1 to i do 
if (st[i]<>' ') and (r[i]=false) then writeln(f,st[i]); 
close(f); 
end.


________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!

Модератор.

Последний раз редактировалось Serge_Bliznykov; 21.01.2013 в 22:14.
masi444 вне форума Ответить с цитированием
Старый 21.01.2013, 20:01   #2
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Не-не-не. Массивы приплетать не надо, нужны списки. Циклы различные не нужны. Т.к. слова по алфавиту, то достаточно при чтении запоминать последнее уникальное слово и если при следующих чтениях оно повторяется, то не вносить его в список.
http://programmersforum.ru/showthread.php?t=222328 - тут похожий пример чтения из файла в список

В поиске по форуму можно найти много разных примеров
eoln вне форума Ответить с цитированием
Старый 21.01.2013, 20:57   #3
masi444
 
Регистрация: 21.01.2013
Сообщений: 5
По умолчанию

оо спасибо огромное! буду что-то пытаться
masi444 вне форума Ответить с цитированием
Старый 21.01.2013, 22:18   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от eoln
Массивы приплетать не надо, нужны списки. Циклы различные не нужны. Т.к. слова по алфавиту, то достаточно при чтении запоминать последнее уникальное слово и если при следующих чтениях оно повторяется, то не вносить его в список.
Частично - согласен. Действительно, раз слова упорядочены по алфавиту, то хранить нужно одно крайнее слово.
Но списки, как и массивы - здесь не нужны.
Код:
цикл, пока не конец исходного файла
    Прочитали слово, если оно уникально - записали в выходной файл. 
переход к началу цикла.
и всё
Serge_Bliznykov вне форума Ответить с цитированием
Старый 21.01.2013, 22:35   #5
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Серж, я прально понимаю, что Вы предлагаете такой вариант

Код:
while no eof do begin
         читаем строку
         парсим
         if t <> word then begin
              vocab[count] := word;
              t := word
         end
end;
Poma][a вне форума Ответить с цитированием
Старый 21.01.2013, 22:56   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Серж, я прально понимаю, что Вы предлагаете такой вариант
нет, всё ещё проще.
во-первых, никакого парсинга не нужно - в исходном файле каждое слово в отдельной строке, через ReadLn(f, s) его TC прекрасно считывает.
во-вторых, массив вообще не нужен.
я предлагаю такой вариант.
Код:
var f, g: text;
  OneWord, PrevWord: string;
begin
  assign(f, 'tmp.txt');
  reset(f);
  if eof(f) then begin
    WriteLn('Исходный файл пуст! Делать тут нечего. ');
  end
  else begin
    assign(g, 'tmp$$.$$$');
    rewrite(g);

    readln(f, PrevWord);
    {первое слово уникально в любом случае, поэтому
          мы его сразу сохраняем в выходной файл}
    writeLn(g, PrevWord);

    while not eof(f) do begin
      readln(f, OneWord);
      if OneWord <> PrevWord then begin
          PrevWord := OneWord;
          writeLn(g, PrevWord)
      end;
    end;
    close(g);

    {
      при желании можно удалить исходный файл tmp.txt
      и переименовать файл tmp$$.$$$ в tmp.txt
     }


    WriteLn('Словарь успешно создан.');
    WriteLn;

  end;
  close(f);
  WriteLn('Нажмите Enter для выхода из программы.');
  readln;
end.

Цитата:
Сообщение от masi444
задачу надо написать со списками.
если это обязательное условие, то, разумеется, мой подход Ваш преподаватель не одобрит. Нужно формировать односвязный список и помещать исходные слова в этот список.
Впрочем, eoln об этом уже рассказал двумя постами выше...

Последний раз редактировалось Serge_Bliznykov; 21.01.2013 в 23:00.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 21.01.2013, 23:13   #7
masi444
 
Регистрация: 21.01.2013
Сообщений: 5
По умолчанию

Оо какие вы все добрые, спасибо огромное! Но я вам буду в n-ой степени благодарна, если напишите программу так, как она должна выглядеть с пояснением. Я даже от большой радости монету кину на телефон тому, кто напишет
masi444 вне форума Ответить с цитированием
Старый 22.01.2013, 00:05   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Но я вам буду в n-ой степени благодарна, если напишите программу так, как она должна выглядеть с пояснением.
Погодите-ка.. Что значит - "как она должна выглядеть" ?!
Кто же это может знать?!
Условие, насчёт того, чтобы использовать списки - оно обязательное?!
Почему Вы не хотите немножечко-немножечко напрячься и сделать данную (достаточно простую задачу) самостоятельно?

Цитата:
Я даже от большой радости монету кину на телефон
Serge_Bliznykov вне форума Ответить с цитированием
Старый 22.01.2013, 00:26   #9
masi444
 
Регистрация: 21.01.2013
Сообщений: 5
По умолчанию

Для кого-то простая, а для кого-то не очень
На счет условия со списками - да, обязательно. Нужно сделать так, как Вы и писали раньше: "Нужно формировать односвязный список и помещать исходные слова в этот список."
я так понимаю это должно быть правильно:
Код:
type
     PMyChar=^TMyChar;
     TMyChar=record;
       inf: char;
       next: PMyChar;
    end;

var
   f: file of char;
   c:char;
   p,head:PMyChar;
{чтение из файла в список}
begin
    assign(f,'tmp.txt');
    reset(f);
    read(f,c);
    new(p);
    p^.next:=nil;
    p^.inf:=c;
    head:=p;
    while not eof(f) do begin
    read(f,c);
    new(p^.next);
    p:=p^.next;
    p^.next:=nil;
    p^.inf:=c;
end;
close(f);

{далее надо пройтись по списку и удалить лишние слова}
а вот как это "далее" записать...

Последний раз редактировалось masi444; 22.01.2013 в 00:37.
masi444 вне форума Ответить с цитированием
Старый 22.01.2013, 00:46   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

я бы рекомендовал в списке хранить не буквы, а строки (хотя, конечно, это решение имеет некоторые недостатки):
Код:
type
     PMyWord=^TMyWord;
     TMyWord=record;
       inf: string[255]; {максимальная длина слова 255 байт}
       next: PMyWord;
    end;
и заполнять список очень просто так, чтобы в нём сразу не было повторов:
Код:
var
  head,p : PMyWord;
  sprev, scur : string;
begin
   assign(f,'tmp.txt');
   reset(f);

   new(head);
   read(f, sprev);
   head^.inf := sprev;
   head^.next:=nil;
   p:=head;
 
   while not eof(f) do begin
      readln(f, scur);
      if scur<>sprev then begin
        sprev := scur;
        new(p^.next);
        p^.next^.inf := sprev;
        p^.next^.next:=nil;
        p:=p^.next;
      end;
    end;
 
    {сохранить список в файл:}
    Rewrite(f);
    p:=head;
    while p <> nil do
    begin
       writeln(f, p^.inf);
       p:=p^.next;
    end;
    Close(f);

    {а вот тут ещё неплохо бы очистить занимаемаемую списком память}
       
end.
писал прямо на форуме. за ошибки прошу не винить..


Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Даны слова из строч. русских букв,слова разделены запятыми. Напечатать в алфавитном порядке гласные,входящие в каждое слово(Delphi Галенька Помощь студентам 5 11.01.2012 20:49
чистотный словарь в алфавитном порядке! FoX1990 Паскаль, Turbo Pascal, PascalABC.NET 2 13.12.2011 14:37
Дан файл вещественных чисел. Создать файл целых чисел, содержащий номера всех локальных максимумов в порядке возрастания zzz6 Помощь студентам 1 04.07.2011 12:59
Дан файл словарь. Написать функцию, возвращающую слова заданной длины по шаблону (Турбо паскаль) АНДРЮНЯ Паскаль, Turbo Pascal, PascalABC.NET 5 20.05.2011 03:09
Дан файл, содержащий текст на русском языке.Составить в алфавитном порядке список слов в файл. JiLiYa Паскаль, Turbo Pascal, PascalABC.NET 3 26.12.2008 12:05