Вот такая задача: В библиотеке содержатся следующие сведения о книгах: фамилия автора, название и год издания.
Упорядочить сведения по фамилиям авторов.
Определить, сколько в библиотеке книг, изданных в указанном году.
Определить, имеется ли книга с указанным названием. Если да, то сообщить фамилию автора и год издания. Если таких книг несколько, то сообщить имеющиеся сведения обо всех этих книгах.
Надо сделать ее на Бейсике и Паскале
Пытаюсь сортировку сделать хотя бы на Паскале. Все просмортел на форума, вроде все понятно. Попробовал в кучу использовать для своей задачи ничего не выходит. Подскажите нубу че здесь не так.
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.
Может, лучше:
if compare(ar[pred(j)].aut,ar[j].aut)=-1 then begin, если по фамилиям?
ох...
что-то ты с 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
это что в глаза бросилось...
Хм..ну и на том спасибо. Я вот этот вариант делал часа в три ночи Поэтому мог и ступить совсем... Седня опять весь день буду делать
Ну поправил, теперь выглядит вот так
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.
Блин... Забыл файл то сохранить перед тем как копировать... то же самое написал... Вот так переделал
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.
смотри, что ты делаешь:
1. открыл файл
2. отсортировал массив (заполненный неизвестно каким мусором)
3. заполнил массив информацией из файл
4. вывел массив.