Помощь - Поиск - Пользователи - Календарь
Полная версия: Указатели
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
setare
Нам дан текстовый файл в кот написано 1000 слов. Длина стлов не превышает 150. Нужно используя указатель сортировать эти слова по альфавиту и записать в новый файл.
Код

type
mas=array[1..200] of string;
 var
  ukm:^mas;
  flname,s:string;
  f,f1:text;
  i,j:integer;
   begin
    writeln('Vvedit imya fila.');
    readln(flname);
    assign(f,flname);
    reset(f);
    new(ukm);
     for i:=1 to 200 do
      readln(f,ukm^[i]);
      writeln(ukm^[i]);
      close(f);
     for J:=1 to 199 do
      for i:=1 to 200-j do
       if Ukm^[i]>Ukm^[i+1] then
        begin
         s:=ukm^[i];
         Ukm^[i]:=Ukm^[i+1];
         Ukm^[i+1]:=S;
        end;
     writeln('Vvedite imya novogo fila.');
     readln(flname);
     assign(f1,flname);
     rewrite(f1);
      for i:=1 to 200 do
       writeln(f1,Ukm^[i]);
      close(f1);
      Dispose(Ukm);
   end.
volvo
Вопрос-то собственно в чем?

Вы задаете вопрос и приводите программу. Что я должен подумать? Что программа уже написана... И тему можно закрывать...
setare
Нет! Извините! Проблема в том, что эта программа не работает. И я не понимаю в чем ошибка. Она не считывает и не записывает в новый файл. Она вообще ничего не делает.
volvo
Ну, а если я перепишу ее вот так:
Код

const
 maxLines = 1000;
Type
 PStr = ^TStr;
 TStr = String[150]; { Это же максимальный размер, не так ли? }
 mas = array[1 .. maxLines] of PStr;
var
 ukm: mas;
 flname,s:string;
 f,f1:text;
 i,j:integer;

begin
 writeln('Vvedit imya fila.');
 readln(flname);
 assign(f,flname);
 reset(f);

 for i:=1 to maxLines do
   begin
     ukm[i] := new(pstr)
     readln(f, ukm[i]^);
     writeln(ukm[i]^);
   end;
 close(f);

 { пузырьковая сортировка ? }
 for i:=1 to maxLines do
   for j:=maxLines downto i+1 do
     if Ukm[j - 1]^ > Ukm[j]^ then
       begin
         s:=ukm[j-1]^;
         Ukm[j-1]^:=Ukm[j]^;
         Ukm[j]^:=S;
       end;

 writeln('Vvedite imya novogo fila.');
 readln(flname);
 assign(f1,flname);
 rewrite(f1);
 for i:=1 to 1000 do
   begin
     writeln(f1,Ukm[i]^);
     dispose(ukm[i]);
   end;
 close(f1);
end.


Вот так, скорее всего, должно работать...
setare
Он к сожалению что-то ничего не считывает. Дает пустой экран. Что делать?
volvo
Не может быть... Файл со словами находится в той же директории, где и программа? Он должен содержать столько слов, сколько написано в maxLines... Я только что прогнал свою версию, все работает...

Вот, пробуйте: здесь исходник, входной файл (FF.TST) и выходной файл (у меня - OUT.ONE)...
setare
Нет не получается. Я только что напечатала 1000 слов в файле. Он все равно не считывает их. Он вообще ничего не делает. sad.gif
setare
При малом количестве получается, а при 1000 слов нет.
volvo
Где он останавливается? Или даже не начинает обработку файла?
setare
Он даже не начинает. При написании имя файла он сразу выдает черный экран и просит название нового файла(входного). Он даже не думает и ничего не считывает.ри 4 слов все прекрасно получилось.
volvo
Только что прогнал файл из 1000 слов... Все сработало...
setare
Спасибо! Оно зработало! Хотя я ничего особенно другого не делала. Не знаю в чем проблема. Может в том что слова были в строчку. Ведь они написаны в строчку и отделены несколькими или 1 пробелом. Это ничему не мешает?
volvo
Ну конечно мешает !!! smile.gif Каждое слово должно быть на отдельной строке... Иначе будут проблемы при чтении из файла... Программа просто напросто не будет знать, сколько символов считывать для каждого слова.

Сейчас она просто считывает до конца строки, и заносит все, что есть в этой строке в массив как одно слово...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.