Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Сортировка списка, введенного из файла

Автор: Совсем новичок 26.11.2007 20:51

Привет.
Вот задачу решал, не могу коечто одолеть:

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

Программа недописана нет последней процедуры под г).
И когда я начинаю создавать файл (цифра 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 мин.
Файл логический.

Автор: Совсем новичок 27.11.2007 23:42

Ктонить посмотрите эту задачку.
Вот на всякий случай исходник выкладываю:


Прикрепленные файлы
Прикрепленный файл  SPISOKN3.PAS ( 3.64 килобайт ) Кол-во скачиваний: 239

Автор: Совсем новичок 4.12.2007 2:31

Не могли бы вы подсказать в чем здесь ошибка? Компилер говорит что ошибка чтения диска, из-за чего?

Автор: not_programmer 16.12.2007 23:53

Решил таки... Если есть ошибки - пожалуйста напищите.


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 мин.
)) *напишите