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

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

Форум «Всё о Паскале» _ Задачи _ Опять записи и сортировка

Автор: Гость 15.05.2007 2:54

Вот такая задача: В библиотеке содержатся следующие сведения о книгах: фамилия автора, название и год издания.
 Упорядочить сведения по фамилиям авторов.
 Определить, сколько в библиотеке книг, изданных в указанном году.
 Определить, имеется ли книга с указанным названием. Если да, то сообщить фамилию автора и год издания. Если таких книг несколько, то сообщить имеющиеся сведения обо всех этих книгах.

Надо сделать ее на Бейсике и Паскале
Пытаюсь сортировку сделать хотя бы на Паскале. Все просмортел на форума, вроде все понятно. Попробовал в кучу использовать для своей задачи ничего не выходит. Подскажите нубу че здесь не так.

program idz1_vivod;
uses crt;
function Compare(a, b: String): Integer;
function Min(a, b: Integer): Integer;
begin
if a < b then
Min := a
else
Min := b;
end;
var
i, n, lA, lB: Integer;
begin
lA := Length(a);
lB := Length(b);
n := Min(lA, lB);
i := 1;
while (i <= n) and (a[i] = b[i]) do inc(i);
if (i > n) then begin
if (lA = lB) then Compare := 0
else
if lA > lB then Compare := - 1
else Compare := 1;
end
else
if ord(a[i]) < ord(b[i]) then
Compare := 1
else
Compare := -1
end;
type book=record
aut:string[20];
name:string[15];
year:integer;
end;
var lib:file of book;
arrtype:array[1..5] of book;
ar:array[1..5] of book;
i,j:Integer;
t:book;
begin
For i:=1 to 5 do
for j:=5 downto i+1 do
if compare(ar[pred(j)],ar[j])=-1 then begin <---- Вот здесь постоянно пишет Type mismatch.
T:=pred(j); pred(j):=ar[j]; ar[j]:=T
end
assign(lib,'idz.dat');
reset(lib);
i:=0;
while not EOF(lib) do
begin
i:=i+1;
read(lib,q[i]);
writeln(q[i].aut,' ',q[i].name,' ',q[i].year);
end;
readln;
close(lib);
sort;
end.



Автор: volvo 15.05.2007 4:10

Может, лучше:

if compare(ar[pred(j)].aut,ar[j].aut)=-1 then begin
, если по фамилиям?

Автор: мисс_граффити 15.05.2007 4:15

ох...
что-то ты с Compare намудрил.
почему бы не сравнивать строки просто через ">" и "<"?

дальше.
ты забываешь открыть файл и считать из него в массив данные о книгах ДО сортировки массива. что ты, собственно, сортируешь-то?

теперь об ошибке, которую выдает компилятор: типы.
смотри:
function Compare(a, b: String): Integer;
ar:array[1..5] of book;
compare(ar[pred(j)],ar[j])=-1

то есть надо писать
compare(ar[pred(j)].aut,ar[j].aut)=-1

это что в глаза бросилось...

Автор: Гость 15.05.2007 8:03

Хм..ну и на том спасибо. Я вот этот вариант делал часа в три ночи smile.gif Поэтому мог и ступить совсем... Седня опять весь день буду делать

Автор: Гость 15.05.2007 8:45

Ну поправил, теперь выглядит вот так

program idz1_vivod;
uses crt;
function Compare(a, b: String): Integer;
function Min(a, b: Integer): Integer;
begin
if a < b then
Min := a
else
Min := b;
end;
var
i, n, lA, lB: Integer;
begin
lA := Length(a);
lB := Length(b);
n := Min(lA, lB);
i := 1;
while (i <= n) and (a[i] = b[i]) do inc(i);
if (i > n) then begin
if (lA = lB) then Compare := 0
else
if lA > lB then Compare := - 1
else Compare := 1;
end
else
if ord(a[i]) < ord(b[i]) then
Compare := 1
else
Compare := -1
end;
type book=record
aut:string[20];
name:string[15];
year:integer;
end;
var lib:file of book;
arrtype:array[1..5] of book;
ar:array[1..5] of book;
i,j:Integer;
t:book;
begin
For i:=1 to 5 do
for j:=5 downto i+1 do
if compare(ar[pred(j)],ar[j])=-1 then begin
T:=pred(j); pred(j):=ar[j]; ar[j]:=T
end
assign(lib,'idz.dat');
reset(lib);
i:=0;
while not EOF(lib) do
begin
i:=i+1;
read(lib,q[i]);
writeln(q[i].aut,' ',q[i].name,' ',q[i].year);
end;
readln;
close(lib);
sort;
end.


Но выводит все в том же порядке как и было введено до этого. Не сортирует.

Автор: Гость 15.05.2007 8:49

Блин... Забыл файл то сохранить перед тем как копировать... то же самое написал... Вот так переделал

program idz1_vivod;
uses crt;
type book=record
aut:string[20];
name:string[15];
year:integer;
end;
var lib:file of book;
ar:array[1..5] of book;
i,j:Integer;
t:book;
begin
assign(lib,'idz.dat');
reset(lib);
For i:=1 to 5 do
for j:=5 downto i+1 do
if ar[pred(j)].aut>ar[j].aut then
begin
T:=ar[pred(j)];
ar[pred(j)]:=ar[j];
ar[j]:=T;
end;
i:=0;
while not EOF(lib) do
begin
i:=i+1;
read(lib,ar[i]);
writeln(ar[i].aut,' ',ar[i].name,' ',ar[i].year);
end;
readln;
close(lib);
end.


Ну вот он просто мен выводит массив. Все

Автор: мисс_граффити 15.05.2007 19:49

смотри, что ты делаешь:
1. открыл файл
2. отсортировал массив (заполненный неизвестно каким мусором)
3. заполнил массив информацией из файл
4. вывел массив.