Консультация № 184003
11.09.2011, 10:53
80.00 руб.
0 15 1
Уважаемые эксперты! Пожалуйста, помогите написать программу на PascalABC.NET :
https://rfpro.ru/upload/6244
заранее спасибо.

Обсуждение

давно
Профессионал
304622
583
11.09.2011, 16:37
общий
нужно продумать формат входных /выходных файлов, наиболее подходящих для ручного редактирования файлов.


Это означает, что формат должен быть текстовым.

Необходимо предусмотреть контроль ошибок пользователя при вводе данных.


А вот это довольно странно. Какой контроль можно сделать в файле данных, который дозволено редактировать вручную? По моим представлениям только один: если при чтении файла что-то идёт не так, то всё -- сообщение "Файл данных испорчен" и выход из программы.
Неизвестный
11.09.2011, 19:04
общий
насчет контроля ввода я тоже не совсем понимаю, что подразумевается.
программу я частично написал.
не могу продумать алгоритм для третьего запроса: вывести три лучших книги пользовавшиеся наибольшим спросом.
Неизвестный
11.09.2011, 19:21
общий
Подозреваю, что лучше текстового формата с имеющейся задачей справится формат XML. То есть, он, тоже текстовый и достаточно удобный для ручного редактирования, но наличие поименованных полей позволит легче достичь результата, требуемого в задании, посредством программирования.
давно
Мастер-Эксперт
425
4118
12.09.2011, 05:14
общий
Адресаты:

Цитата: Сергей Бендер
Какой контроль можно сделать в файле данных, который дозволено редактировать вручную?

Цитата: 327099
насчет контроля ввода я тоже не совсем понимаю, что подразумевается.

Если исходить из практики программирования, то 100% - эти функции контроля должны быть в той программе, которая осуществляет ввод данных. Логично предположить, что, раз мы пишем программу, которая так же делает ввод данных, то эти функции и будут находиться во вновь сочиняемой программе, ибо наивно думать, что сии функции удастся встроить в Notepad.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Мастер-Эксперт
425
4118
12.09.2011, 11:00
общий
Вы не могли бы выложить сюда тот код, который уже написали? Чтобы эксперты не писали всё заново, а дописали то, что осталось.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
12.09.2011, 13:06
общий
Так и Вам понятнее будет, а то наворочаем .... Вам же разбираться
Неизвестный
12.09.2011, 16:59
общий
13.09.2011, 02:43
уважаемые эксперты, надеюсь на вашу помощь. выложил код. в нем не сделан третий запрос. https://rfpro.ru/upload/6246
алгоритм такой: в третьей таблице "выдача" для каждого номера книги подсчитать сколько раз ее брали. и во вторую таблицу добавить столбец "количество " и записать в него для каждой книги сколько раз ее брали.
а затем отсортировать столбец количество по убыванию, меняя при этом и столбец"номер книги" местами и затем первые три книги вывести.
давно
Профессионал
304622
583
13.09.2011, 15:34
общий
14.09.2011, 19:58
Вот что получилось с третьей процедурой:

[code h=200]procedure zapros3(j,k:integer);
var i,n,m:integer;
z:zap;
begin
// Подсчёт
for i:=1 to j do
begin
base2[i].kol:=0;
for n:=1 to k do
if base2[i].book_nomber=base3[n].book_nomber then
inc(base2[i].kol);
end;
//Сортировка прфмым выбором
for i:=1 to j do
begin
m:=i;
//Поиск максимальной по kol записи начиная с i-й
for n:=i+1 to j do
if base2[n].kol>base2[m].kol then
m:=n;
//Обмен i-й и максимальной (m-ой) записи
if i<>m then
begin
z:=base2[i];
base2[i]:=base2[m];
base2[m]:=z;
end;
end;
//Вывод
for i:=1 to 3 do
writeln(base2[i].book_nomber, ' ',base2[i].avtor, ' ',base2[i].nazvanie,' ', base2[i].god,' ',base2[i].kol);
end;[/code]


Работает правильно. Судя по написанному вами коду, здесь вам всё будет ясно (я написал в вашем стиле, но должен отметить, что экономить на названиях переменных не стоит -- у вас очень рискованный баланс между глобальными и локальными переменными). Если вас устраивает, я перенесу это в ответы. Если что непонятно (например, алгоритм сортировки) естественно спрашивайте.

По поводу написанного вами кода.
1) По моему вы не совсем поняли задание для четвёртого запроса. Удалять сами книги вместе с читателем нсколько странно. Скорее всего имелось в виду удалить записи из таблицы выдачи книг.
2) Читатель "Смирнова" и записи о выданных её книгах должны быть удалены из самой базы. Это означает, что: а) файл "output.txt" должен быть записан в "chitateli.txt" и б) их форматы должны совпадать, т.е. тот же порядок полей и тот же разделитель -- ';'. Тут, конечно, есть неудобство -- перед каждым запуском надо восстанавливать исходную базу данных. Но перезапись можно написать ( rename(f,'chitateli.txt') ) и закомментарить. А вот формат вывода, конечно, надо привести в соответствие.
Неизвестный
13.09.2011, 20:21
общий
здравствуйте, сергей. спасибо что откликнулись. вы меня не совсем поняли. в запросе нужно подсчет вести по третьей таблице. то есть берем в третьей таблице первый номер книги и ищем сколько раз он встречается в таблице, посчитали и написали во вторую таблицу количество и т.д. а затем для тех книг которых нет в третьей таблице ставим нули. а так получается нерационально: книгу из списка второй таблицы может ни разу не брали, а мы будем искать ее по всей третьей таблице... третья таблица ведь по сути в базе будет самая большая. Постарался понятно объяснить, может не совсем получилось. не могу реализовать этот кусочек кода. надеюсь на вашу помощь.
Неизвестный
13.09.2011, 20:24
общий
И СПАСИБО ЧТО ПОДСКАЗАЛИ ПРО ЧЕТВЕРТЫЙ ЗАПРОС, обязательно переделаю.
давно
Профессионал
304622
583
14.09.2011, 17:47
общий
Если брать по очереди каждый элемент 3-й таблицы и искать его значение пробегая эту же таблицу, то получится объём действий порядка k2. Если k считается самым большим, то это худший вариант.

Можно сделать так:
а) Добавить записям 3-й базы флаг "подсчитано". Тогда сравнение на большинстве шагов вложенного цикла будет делаться не по string, а по boolean -- это быстрее.
б) Не делать поиска по 3-й базе, а каждую запись искать во 2-й базе и увеличивать там счётчик на единицу.

Что предпочтёте? (Мне больше нравится б). )
Неизвестный
14.09.2011, 17:55
общий
здравствуйте. я бы тоже предпочел Б), изначально так и делал, но увы и ах ...нужно А)
давно
Профессионал
304622
583
14.09.2011, 21:02
общий
Цитата: 327099
я бы тоже предпочел Б), изначально так и делал, но увы и ах ...нужно А)


Хорошо. Выбирайте:

а)
В структуру zap добавляется поле "neprosmotren:boolean;"
Теперь код:
[code h=200]
procedure zapros3(j,k:integer);
var i,n,m,s:integer;
z:zap;
begin
for i:=1 to j do
base2[i].kol:=0;
for n:=1 to k do
base3[n].neprosmotren:=true;

// Подсчёт
for n:=1 to k do
if base3[n].neprosmotren then
begin
base3[n].neprosmotren:=false;
s:=1;
for m:=n+1 to k do
if base3[m].neprosmotren and (base3[n].book_nomber=base3[m].book_nomber) then
begin
base3[m].neprosmotren:=false;
inc(s);
end;
i:=1;
while base3[n].book_nomber<>base2[i].book_nomber do
inc(i);
base2[i].kol:=s;
end;

//Сортировка прямым выбором
for i:=1 to j do
begin
m:=i;
//Поиск максимальной по kol записи начиная с i-й
for n:=i+1 to j do
if base2[n].kol>base2[m].kol then
m:=n;
//Обмен i-й и максимальной (m-ой) записи
if i<>m then
begin
z:=base2[i];
base2[i]:=base2[m];
base2[m]:=z;
end;
end;
//Вывод
for i:=1 to 3 do
writeln(base2[i].book_nomber, ' ',base2[i].avtor, ' ',base2[i].nazvanie,' ', base2[i].god,' ',base2[i].kol);
end;
[/code]

Вариант б)

[code h=200]
procedure zapros3(j,k:integer);
var i,n,m:integer;
z:zap;
begin
// Подсчёт
for i:=1 to j do
base2[i].kol:=0;


for n:=1 to k do
begin
i:=1;
while base3[n].book_nomber<>base2[i].book_nomber do
inc(i);
inc(base2[i].kol);
end;

//Сортировка прямым выбором
for i:=1 to j do
begin
m:=i;
//Поиск максимальной по kol записи начиная с i-й
for n:=i+1 to j do
if base2[n].kol>base2[m].kol then
m:=n;
//Обмен i-й и максимальной (m-ой) записи
if i<>m then
begin
z:=base2[i];
base2[i]:=base2[m];
base2[m]:=z;
end;
end;
//Вывод
for i:=1 to 3 do
writeln(base2[i].book_nomber, ' ',base2[i].avtor, ' ',base2[i].nazvanie,' ', base2[i].god,' ',base2[i].kol);
end;[/code]
Неизвестный
14.09.2011, 22:08
общий
спасибо большое за помощь!!!!
давно
Профессионал
304622
583
14.09.2011, 23:12
общий
это ответ
Здравствуйте, Невалёный Виталий Владимирович!

Итак. По результатам обсуждения мы решили ограничиться 3-м заданием (остальные вы сделали). Получилось два неплохих варианта:

а)
В структуру zap добавляется поле "neprosmotren:boolean;"
Теперь код:
[code h=200]
procedure zapros3(j,k:integer);
var i,n,m,s:integer;
z:zap;
begin
for i:=1 to j do
base2[i].kol:=0;
for n:=1 to k do
base3[n].neprosmotren:=true;

// Подсчёт
for n:=1 to k do
if base3[n].neprosmotren then
begin
base3[n].neprosmotren:=false;
s:=1;
for m:=n+1 to k do
if base3[m].neprosmotren and (base3[n].book_nomber=base3[m].book_nomber) then
begin
base3[m].neprosmotren:=false;
inc(s);
end;
i:=1;
while base3[n].book_nomber<>base2[i].book_nomber do
inc(i);
base2[i].kol:=s;
end;

//Сортировка прямым выбором
for i:=1 to j do
begin
m:=i;
//Поиск максимальной по kol записи начиная с i-й
for n:=i+1 to j do
if base2[n].kol>base2[m].kol then
m:=n;
//Обмен i-й и максимальной (m-ой) записи
if i<>m then
begin
z:=base2[i];
base2[i]:=base2[m];
base2[m]:=z;
end;
end;
//Вывод
for i:=1 to 3 do
writeln(base2[i].book_nomber, ' ',base2[i].avtor, ' ',base2[i].nazvanie,' ', base2[i].god,' ',base2[i].kol);
end;
[/code]

Вариант б)

[code h=200]
procedure zapros3(j,k:integer);
var i,n,m:integer;
z:zap;
begin
// Подсчёт
for i:=1 to j do
base2[i].kol:=0;


for n:=1 to k do
begin
i:=1;
while base3[n].book_nomber<>base2[i].book_nomber do
inc(i);
inc(base2[i].kol);
end;

//Сортировка прямым выбором
for i:=1 to j do
begin
m:=i;
//Поиск максимальной по kol записи начиная с i-й
for n:=i+1 to j do
if base2[n].kol>base2[m].kol then
m:=n;
//Обмен i-й и максимальной (m-ой) записи
if i<>m then
begin
z:=base2[i];
base2[i]:=base2[m];
base2[m]:=z;
end;
end;
//Вывод
for i:=1 to 3 do
writeln(base2[i].book_nomber, ' ',base2[i].avtor, ' ',base2[i].nazvanie,' ', base2[i].god,' ',base2[i].kol);
end;[/code]

Удачи!
5
Форма ответа