Помощь - Поиск - Пользователи - Календарь
Полная версия: Сортировка списка, введенного из файла
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Совсем новичок
Привет.
Вот задачу решал, не могу коечто одолеть:

Напишите процедуру создания линейного списка, в информационные поля элементов которого заносятся числа, считываемые из файла (файл может оказаться пустым). Имя файла вводится с клавиатуры в главной программе и передается в процедуру в качестве параметра. Рассмотрите следующие варианты создания списка:
а)первый включенный в список элемент оказывается в хвосте списка (последним);
б)первый включенный в список элемент оказывается в голове списка (первым);
в)элементы включаются в список в порядке возрастания: в информационном поле первого элемента списка должно быть записано минимальное значение, а последнего элемента – максимальное;
г)элементы, содержащие отрицательные значения, заносятся всегда в конец списка, а положительные – в начало (в порядке считывания из файла), нулевые – между положительными и отрицательными.

Программа недописана нет последней процедуры под г).
И когда я начинаю создавать файл (цифра 3) говорит что "файл закрыт или подобное", пять я с процедурами перехимичил (.
И вообще есть ли помимо этих недочетов еще какиенибудь.

Вот сама прога:


Program work_N3_spiski;

Uses
    Crt;

Type
    Point = ^List;
    List = Record
         Inf : Integer;
        Next : Point;
           END;

Var
   Head, Temp, First : Point;
                Data : Integer;
          FileOfData : File Of Integer;
          NameOfFile : String;
        Buffer, K, I : Integer;
              V1, V2 : Point;
        FlagExitMenu : Boolean;
          FlagSelect : Integer;

{CREATE NAME OF FILE}

Procedure CreateName;
 BEGIN
   WriteLn('Enter name of file: ');
   Read(NameOfFile);
 END;

{CREATE FILE}

Procedure CreateFile;
 BEGIN
   CreateName;
   WriteLn('Enter count elements of the file: ');
   ReadLn(K);
   Assign(FileOfData,NameOfFile);
   Rewrite(FileOfData);
   For I := 1 To K Do
       BEGIN
         WriteLn('Enter element: ');
         ReadLn(Data);
         Write(FileOfData,Data);
       END;
   Close(FileOfData);
 END;

{HEAD IN THE END}

Procedure Inp(Var NameOfFile : String);
 BEGIN
   Assign(FileOfData,'NameOfFile');
   Reset(FileOfData);
   If FileSize(FileOfData) = 0 Then
      BEGIN
        WriteLn('File is empty');
        ReadLn;
        Exit;
      END;
   While Not EOF(FileOfData) Do
     BEGIN
       Read(FileOfData,Data);
       New(Temp);
       Temp^.Inf := Data;
       Temp^.Next := Head;
       Head := Temp;
     END;
   Close(FileOfData);
 END;

{HEAD IN THE BEGIN}

Procedure _Inp(Var NameOfFile : String);
 BEGIN
   Assign(FileOfData,'NameOfFile');
   Reset(FileOfData);
   If FileSize(FileOfData) = 0 Then
      BEGIN
        WriteLn('File is empty');
        ReadLn;
        Exit;
      END;
   While Not EOF(FileOfData) Do
     BEGIN
       Read(FileOfData,Data);
       New(Temp);
       Temp^.Inf := Data;
       Temp^.Next := NIL;
       If Head = NIL Then
          Head := Temp
       Else
          First^.Next := Temp;
          First := Temp;
     END;
   Close(FileOfData);
 END;

{OUTPUT OF THE LIST}

Procedure Out;
 BEGIN
   Temp := Head;
   WriteLn('Elements of the list: ');
   While (Temp <> NIL) Do
     BEGIN
       WriteLn(Temp^.Inf);
       Temp := Temp^.Next;
     END;
 END;

{DELETE OF ELEMENTS OF THE LIST}

Procedure Del;
 BEGIN
   While (Head <> NIL) Do
     BEGIN
       Dispose(Head);
       Head := Temp;
     END;
 END;

{SORTING OF LIST}

Procedure S(L : Point);
 BEGIN
   V1 := L;
   While V1^.Next <> NIL Do
     BEGIN
       V2 := V1^.Next;
       While V2 <> NIL Do
         BEGIN
           If V1^.Inf > V2^.Inf Then
              BEGIN
                Buffer := V1^.Inf;
                V1^.Inf := V2^.Inf;
                V2^.Inf := Buffer;
              END;
         V2 := V2^.Next;
         END;
       V1 := V1^.Next;
     END;
 END;

{=======MAIN PROGRAM=======}

BEGIN
  ClrScr;
  FlagExitMenu := False;
  Repeat
    WriteLn('Choose point: ');
    WriteLn('0 - Create of file');
    WriteLn('1 - FIFO');
    WriteLn('2 - LIFO');
    WriteLn('3 - Sorting of list');
    WriteLn('4 - Sorting of list number two');
    WriteLn('5 - Exit');
    ReadLn(FlagSelect);
    Case FlagSelect Of
      0 : BEGIN
            CreateFile;
          END;
      1 : BEGIN
            _Inp(NameOfFile);
            Out;
            Del;
          END;
      2 : BEGIN
            Inp(NameOfFile);
            Out;
            Del;
          END;
      3 : BEGIN
            Inp(NameOfFile);
            S(Temp);
            Out;
            Del;
          END;
     { 4 : BEGIN

          END;}
      5 : FlagExitMenu := True;
    END;
    WriteLn('Please, push batton "Enter"');
    ReadLn;
    ClrScr;
  Until FlagExitMenu;
END.



Добавлено через 3 мин.
Файл логический.
Совсем новичок
Ктонить посмотрите эту задачку.
Вот на всякий случай исходник выкладываю:
Совсем новичок
Не могли бы вы подсказать в чем здесь ошибка? Компилер говорит что ошибка чтения диска, из-за чего?
not_programmer
Решил таки... Если есть ошибки - пожалуйста напищите.


Program work_N3_spiski;

Uses
    Crt;

Type
    Point = ^List;
    List = Record
         Inf : Integer;
        Next : Point;
           END;

Var
   Head, Temp, First : Point;
                Data : Integer;
          FileOfData : File Of Integer;
          NameOfFile : String;
        Buffer, K, I : Integer;
              V1, V2 : Point;
        FlagExitMenu : Boolean;
          FlagSelect : Integer;

{CREATE NAME OF FILE}

Procedure CreateName;
 BEGIN
   WriteLn('Enter name of file: ');
   Read(NameOfFile);
 END;

{CREATE FILE}

Procedure CreateFile;
 BEGIN
   CreateName;
   Write('Enter count elements of the file: ');
   ReadLn(K);
   Assign(FileOfData,NameOfFile);
   Rewrite(FileOfData);
   For I := 1 To K Do
       BEGIN
         Write('Enter element: ');
         ReadLn(Data);
         Write(FileOfData,Data);
       END;
   Close(FileOfData);
 END;

{BROWSE}

Procedure browse(var NameOfFile : String);
 BEGIN
   Write('Enter name of file: ');
   ReadLn(NameOfFile);
   Assign(FileOfData,NameOfFile);
   {$I-}{otkl prover oshib}
   Reset(FileOfData);
   {$I+}
   If IOResult = 0 Then
      BEGIN
        If FileSize(FileOfData) = 0 Then WriteLn('File is empty ')
        Else
           Seek(FileOfData,0);
           WriteLn('Output from file');
           While (NOT EOF(FileOfData)) Do
             BEGIN
               Read(FileOfData, Data);
               Write(Data:3);
             END;
      END
   Else
      WriteLn('File with this name is not ');
 END;

{HEAD IN THE END}

Procedure Inp(Var NameOfFile : String);
 BEGIN
   Assign(FileOfData,NameOfFile);
   Reset(FileOfData);
   If FileSize(FileOfData) = 0 Then WriteLn('File is empty ')
   Else WriteLn;
   While Not EOF(FileOfData) Do
     BEGIN
       Read(FileOfData,Data);
       New(Temp);
       Temp^.Inf := Data;
       Temp^.Next := Head;
       Head := Temp;
     END;
   Temp := Head;
   Close(FileOfData);
 END;

{HEAD IN THE BEGIN}

Procedure _Inp(Var NameOfFile : String);
 BEGIN
   Assign(FileOfData,NameOfFile);
   Reset(FileOfData);
   If FileSize(FileOfData) = 0 Then WriteLn('File is empty ')
   Else WriteLn;
   While Not EOF(FileOfData) Do
     BEGIN
       Read(FileOfData,Data);
       New(Temp);
       Temp^.Inf := Data;
       Temp^.Next := NIL;
       If Head = NIL Then
          Head := Temp
       Else
          First^.Next := Temp;
          First := Temp;
     END;
   Close(FileOfData);
 END;

{OUTPUT OF THE LIST}

Procedure Out;
 BEGIN
   Temp := Head;
   WriteLn('Elements of the list: ');
   While (Temp <> NIL) Do
     BEGIN
       WriteLn(Temp^.Inf);
       Temp := Temp^.Next;
     END;
 END;

{DELETE OF ELEMENTS OF THE LIST}

Procedure Del;
 BEGIN
   While (Head <> NIL) Do
     BEGIN
       Dispose(Head);
       Head := Temp;
     END;
 END;

{SORTING OF LIST}

Procedure S(L : Point);
 Var
    V1, V2 : Point;
    Buffer : Integer;
 BEGIN
   V1 := L;
   While V1^.Next <> NIL Do
     BEGIN
       V2 := V1^.Next;
       While V2 <> NIL Do
         BEGIN
           If V1^.Inf > V2^.Inf Then
              BEGIN
                Buffer := V1^.Inf;
                V1^.Inf := V2^.Inf;
                V2^.Inf := Buffer;
              END;
         V2 := V2^.Next;
         END;
       V1 := V1^.Next;
     END;
 END;

Procedure S2(L : Point);
 Var
    V1, V2 : Point;
    Buffer : Integer;
 BEGIN
   V1 := L;
   While V1^.Next <> NIL Do
     BEGIN
       V2 := V1^.Next;
       While V2 <> NIL Do
         BEGIN
           If V1^.Inf < V2^.Inf Then
              BEGIN
                Buffer := V1^.Inf;
                V1^.Inf := V2^.Inf;
                V2^.Inf := Buffer;
              END;
         V2 := V2^.Next;
         END;
       V1 := V1^.Next;
     END;
 END;

{=======MAIN PROGRAM=======}

BEGIN
  ClrScr;
  FlagExitMenu := False;
  Repeat
    WriteLn('Choose point: ');
    WriteLn('0 - Create file');
    WriteLn('1 - Browse file');
    WriteLn('2 - List # 1');
    WriteLn('3 - Sorting # 1');
    WriteLn('4 - Sorting # 2');
    WriteLn('5 - List # 2');
    WriteLn('6 - Sorting # 1');
    WriteLn('7 - Sorting # 2');
    WriteLn('8 - Exit');
    WriteLn;
    WriteLn('9 - Delete');
    ReadLn(FlagSelect);
    Case FlagSelect Of
      0 :  CreateFile;
      1 :  browse(NameOfFile);
      2 : BEGIN
            Inp(NameOfFile);
            Out;
            Del;
          END;
      3 : BEGIN
            Inp(NameOfFile);
            s(Temp);
            Out;
            Del;
          END;
      4 : BEGIN
            Inp(NameOfFile);
            s2(Temp);
            Out;
            Del;
          END;
      5 : BEGIN
            _Inp(NameOfFile);
            Out;
            Del;
          END;
      6 : BEGIN
            _Inp(NameOfFile);
            s(Temp);
            Out;
            Del;
          END;
      7 : BEGIN
            _Inp(NameOfFile);
            s2(Temp);
            Out;
            Del;
          END;
      8 : FlagExitMenu := True;
      9 : Del;
    END;
    WriteLn('Please, push batton "Enter"');
    ReadLn;
    ClrScr;
  Until FlagExitMenu;
END.



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