IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Опять записи и сортировка
сообщение
Сообщение #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 <---- Вот здесь постоянно пишет 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.


 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Может, лучше:
if compare(ar[pred(j)].aut,ar[j].aut)=-1 then begin
, если по фамилиям?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


просто человек
******

Группа: Пользователи
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


ох...
что-то ты с 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

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


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Хм..ну и на том спасибо. Я вот этот вариант делал часа в три ночи smile.gif Поэтому мог и ступить совсем... Седня опять весь день буду делать
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гость






Ну поправил, теперь выглядит вот так
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.


Но выводит все в том же порядке как и было введено до этого. Не сортирует.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






Блин... Забыл файл то сохранить перед тем как копировать... то же самое написал... Вот так переделал
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.


Ну вот он просто мен выводит массив. Все
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


просто человек
******

Группа: Пользователи
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


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


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 2.10.2020 3:33
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name