PDA

Просмотр полной версии : Pascal. Процедуры и запросы.


Firelord
23.05.2008, 19:10
Никак не могу сделать программу :( Точнее сделал, но не получаются 2 запроса по ней.
Задание:
В БД хранится информация о продовольственных товарах: название товара, дата
выработки, срок годности, производитель, адрес производителя, цена товара, отметка о
том, является ли продукт скоропортящимся (если срок годности составляет менее недели),
«льготная» цена товара.
Предусмотреть возможность ввода данных, дополнения базы данных, редактирования и
просмотра данных.
Предусмотреть возможность вывода на печать и экран следующих видов запросов:
1) Все производители.
2) Все товары конкретного производителя.
3) Скоропортящиеся товары.
4) Рассчитать «льготную» цену товара с истекшим сроком годности по формулам: для скоропортящихся товаров цена снижается на 1% за каждый просроченный час до 36 часов, сверх этого срока цена =0; если срок годности продукта менее двух месяцев, то цена снижается на 1% за каждый просроченный день до 14 дней, сверх этого срока цена =0;для других товаров расчет цены не проводится.
В пояснительную записку входят следующие разделы: содержание, задание, описание логической структуры (файловая структура, структурная схема программы), руководство пользователя, список источников, текст программы, примеры запросов.
Программа и моя БД: http://firelord47.narod.ru/iformatica/pascal.rar
Суть проблемы:
1)В первом запросе при выводе всех производителей повторяет наименования. Например, kotik произвёл halva и hvostik. При запросе он поэтому котика 2 раза выводит, а надо каждого производителя по разу.
2) Четвёртый запрос :oops: Как связать стринговую дату со сроком годности (пусть даже если в часах) :quest:

Господа, программисты, помогите, пожалуйста :sos:

Zhlobny Hmur
24.05.2008, 16:11
Firelord, Первый и глобальный косяк

procedure menu;
var
deystv:char;
begin

While True Do Begin
clrscr;
writeln('vybor dejstvija:');
writeln('1 - vvod novoj BD');
writeln('2 - prosmotr BD');
writeln('3 - dobavlenie');
writeln('4 - udalenie');
writeln; writeln('Procedury');
writeln('5 - proizvoditeli');
writeln('6 - Tovary proizvoditela');
writeln('7 - Skoroportashiesa tovary');
writeln;
writeln('0 - vyhod iz programmy');
writeln;
readln(deystv);
case deystv of
'1':begin vvod; menu; end;
'2':begin prosmotr; menu; end;
'3':begin dobavl; menu; end;
'4':begin udalen; menu; end;
'5':begin prosmotr_pr; menu; end;
'6':begin pr_tov; menu; end;
'7':begin pr_skor; menu; end;
'0':exit
else menu;
end; end end;

В том, что ты делаешь рекурсивный вызов процедуры Menu... Зачем? Вобщем, красное убрать, синее - добавить!

И что, не учили, как на паскале нормально писать, чтобы код читать можно было без напрягов! :eek:

В первом запросе при выводе всех производителей повторяет наименования. Например, kotik произвёл halva и hvostik. При запросе он поэтому котика 2 раза выводит, а надо каждого производителя по разу.

procedure prosmotr_pr;
Type
Pr:Array [1..8191] of string[7];

var
fs:file of TS;
zs:TS;
Unique,i:Integer;
List_Of_Producers:^Pr;

begin
clrscr;
writeln('prosmotr BD');
assign(fs,'tovarka.dat');
reset(fs);
Unique:=0;
GetMem(List_Of_Producers,SizeOf(fs)*SizeOf(zs.proi zvodutel));

write('proizvodutel');
writeln; writeln;
while not(eof(fs)) do begin
read(fs,zs);
for I:=1 to Unique do
if zs.proizvodutel=List_Of_Producers^[i] then break;
if i=Unique+1 then begin
writeln(' ',zs.proizvodutel,' ');
inc(Unique);
List_Of_Producers^[Unique]:=zs.proizvodutel
end
end;
close(fs);
Release(List_Of_Producers);
writeln; writeln;
writeln('v BD drugih proizvoditeley net');
readkey
end;

связать стринговую дату
А на хрена такое далеть?

Несколько изменяем твою структуру:
1) Создаем флаг (булевского типа) скоропортящийся товар/обычный: Tovar:Boolean
2) Делаем поля в записи
Day, Mouns, Year, Hour, Expiried:Integer
3) В зависимости от состояния поля Tovar определяем использовать или нет поле Hour, и интерпретируем поле Expiried часы там или дни.
4) С помощью функции GetDate/GetTime вычитываем текущее время и сравнивая с временем по базе определяем степень протухлости товара.
5) Можно еще для прикола ввести поле - товар уже протух, пора его выкидывать!

Студент, блин, где мое пиво?!!! :beer: Или туча спасибок, на худой конец! :ex:

Firelord
25.05.2008, 13:10
Большое спасибо!!! Буду в ваших краях, обязательно с меня пиво! :) Уж в наши края вряд ли кто приедет <_<
P.S.
И что, не учили, как на паскале нормально писать, чтобы код читать можно было без напрягов!
Не учили :( Всё наше практическое обучение сводилось к выдаче задания, все объяснения подразумевались в лекциях...

Zhlobny Hmur
25.05.2008, 23:17
Firelord, а-а-а-а-а, на лекции то кто-то и не ходил получаеться!