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

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

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

Автор: Hardip 30.11.2010 2:56

Вот думаю над задачей, даже похожая есть.. Дан файл содержащий сведения о книгах: фамилия автора, название, год издания, цена книги.
Как вывести на экран книгу с заданным годом издания (нужно указать в write), упорядоченные по алфавиту, а если таковых нет, то выдать соответствующее сообщение; а так же отсортировать записи в порядке возрастания цены книги.
Файл, я сделал, прикладываю. Если кто-то поможет буду благодраен. Видел похожую программу, но не могу сделать под себя..

Код

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type
qwe=record
fio,db:string;
a,b,c:byte;
end;
rty=record
a:real;
b:integer;
end;
const
n=10;
var
d:array[1..n]of qwe;
e:array[1..n]of rty;
f:text;
i,j,x,y:integer;
s:string;
begin
i:=1;
assign(f,'school');
reset(f);
while not(eof(f)) do begin
  readln(f,d[i].fio);
  readln(f,d[i].db);
  readln(f,d[i].a,d[i].b,d[i].c);
  i:=i+1;
end;
for i:=1 to n do begin
  e[i].a:=(d[i].a+d[i].b+d[i].c)/3;
  e[i].b:=i;
end;
for i := n downto 2 do
        for j := 2 to i do
          if e[j].a < e[j - 1].a then
            begin
              x := Round(e[j].a);
              y:=e[j].b;
              e[j].a := e[j - 1].a;
              e[j].b := e[j - 1].b;
              e[j - 1].a := x;
              e[j - 1].b := y;
            end;
for i:=1 to n do
  writeln(d[e[i].b].fio,': ',e[i].a);
writeln('Vvdeite FIO');
readln(s);
for i:=1 to n do if d[i].fio=s then
  writeln('FIO: ',d[i].fio,', DR: ',d[i].db,', Osenki: ',d[i].a:2,d[i].b:2,d[i].c:2);
writeln('Srednie ball menishe treh:');
for i:=1 to n do if e[i].a<=3 then writeln(d[e[i].b].fio,': ',e[i].a);
readln;
end.



Она делат вот что - Дан файл в котором содержится информация о школьниках:
1) Ф.И.О.
2) год рождения, месяц, число
3) оценки экзаменов
а) отсортировать записи по возрастанию среднего
экзаменационного балла;
б) по запросу по Ф.И.О. - выдать средний балл;
в) распечатать ведомость школьников со средним баллом
меньше 3.




Прикрепленные файлы
Прикрепленный файл  knig.txt ( 115 байт ) Кол-во скачиваний: 371

Автор: Krjuger 30.11.2010 5:14

Ну для начала посмотри,то как у тебя тип обьявлен.у тебя 3 переменных типа байт.Но разве в файле число у тебя храниться в таком виде?Попробуй написать число 10 типа байт в блокнот а потом открой его и посомтри,что там будет.Там будет какая нибудь билеберда нарисована,это потому что целые числа(integer) занимают 2,4,8 байт в разных типах компиляторов(имеется в виду из разрядность),а ты береш только 1 байт от этого числа,поэтому у тебя исходные данные при считывании из файла неверные.есть 2 способа это исправить,изменить тип переменных.Либо записывать в файл информацию в виде байтов,а потом и считывать соответствующе.

Автор: volvo 30.11.2010 6:16

Начнем с того, что в Дельфи приведенный код вообще компилироваться не будет. Потому что структура содержит String. Либо ShortString, либо String[размер].

Во-вторых, если используется Дельфи - то почему вопрос здесь?

Автор: Hardip 30.11.2010 15:54

Цитата(volvo @ 30.11.2010 2:16) *

Начнем с того, что в Дельфи приведенный код вообще компилироваться не будет. Потому что структура содержит String. Либо ShortString, либо String[размер].

Исходный код, рабочий и проверенный. Выкладываю его и откомпилированный файл.
Цитата(volvo @ 30.11.2010 2:16) *

Во-вторых, если используется Дельфи - то почему вопрос здесь?

Консольное приложение Delphi и просто Pascal не сильно отличаются, но реализация то на Pascal-e. Так что вот прошу помочь





Прикрепленные файлы
Прикрепленный файл  Compile.rar ( 31 килобайт ) Кол-во скачиваний: 208
Прикрепленный файл  Ishodnik.rar ( 1.8 килобайт ) Кол-во скачиваний: 231

Автор: volvo 30.11.2010 18:20

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.


Только не надо повторения истории с Сурсов... Я СПЕЦИАЛЬНО поставил здесь FPC, и проверил обе программы. dry.gif

Автор: Hardip 30.11.2010 19:59

Спасибо Вам большое!! А сортировка

Код
procedure Sort(var ar: array of R; n: integer);

это "книга с заданным годом издания" ? А отсортировать записи в порядке возрастания цены книги, я что-то искал-искал - не нашёл - ?
Код
begin
    ReadRec(f, MyRec);
    if MyRec.Year = Yr then
    begin
      inc(n);
      arr[n] := MyRec;
    end;
  end;

Автор: Client 30.11.2010 23:05

дали же код, там есть сортировка.
надо по другому полю - измени поле сортировки