Вот думаю над задачей, даже похожая есть.. Дан файл содержащий сведения о книгах: фамилия автора, название, год издания, цена книги.
Как вывести на экран книгу с заданным годом издания (нужно указать в write), упорядоченные по алфавиту, а если таковых нет, то выдать соответствующее сообщение; а так же отсортировать записи в порядке возрастания цены книги.
Файл, я сделал, прикладываю. Если кто-то поможет буду благодраен. Видел похожую программу, но не могу сделать под себя..
Ну для начала посмотри,то как у тебя тип обьявлен.у тебя 3 переменных типа байт.Но разве в файле число у тебя храниться в таком виде?Попробуй написать число 10 типа байт в блокнот а потом открой его и посомтри,что там будет.Там будет какая нибудь билеберда нарисована,это потому что целые числа(integer) занимают 2,4,8 байт в разных типах компиляторов(имеется в виду из разрядность),а ты береш только 1 байт от этого числа,поэтому у тебя исходные данные при считывании из файла неверные.есть 2 способа это исправить,изменить тип переменных.Либо записывать в файл информацию в виде байтов,а потом и считывать соответствующе.
Начнем с того, что в Дельфи приведенный код вообще компилироваться не будет. Потому что структура содержит String. Либо ShortString, либо String[размер].
Во-вторых, если используется Дельфи - то почему вопрос здесь?
const
MaxSize = 10;
type
R = record
FIO: string;
Title: string;
Year: integer;
Price: double;
end;
procedure ReadRec(var f: text; var Rec: R);
begin
with Rec do
begin
readln(f, FIO);
readln(f, Title);
readln(f, Year);
readln(f, Price);
end;
end;
procedure WriteRec(const Rec: R);
begin
with Rec do
writeln(FIO: 20, Title:20, Year:8, Price:8 :2);
end;
procedure Sort(var ar: array of R; n: integer);
var
i, j, k: integer;
Temp: R;
begin
For i := 1 To Pred(n) do
Begin
k := i; Temp := ar[i - 1];
For j := Succ(i) To n Do
If Temp.Title > ar[j - 1].Title Then
Begin
k := j; Temp := ar[j - 1]
End;
ar[k - 1] := ar[i - 1];
ar[i - 1] := Temp
End;
end;
var
f: text;
arr: array[1 .. MaxSize] of R;
MyRec: R;
i, n, Yr: integer;
found: boolean;
begin
writeln('Year = '); readln(Yr);
assign(f, 'data.txt');
reset(f);
n := 0;
while not eof(f) do
begin
ReadRec(f, MyRec);
if MyRec.Year = Yr then
begin
inc(n);
arr[n] := MyRec;
end;
end;
close(f);
if n > 1 then
sort(arr, n);
if n > 0 then
for i := 1 to n do WriteRec(arr[i])
else
writeln('no matches');
end.
Спасибо Вам большое!! А сортировка
дали же код, там есть сортировка.
надо по другому полю - измени поле сортировки