| 
|||||
  | 
|||||
  | 
|||||
ВВедение.
Данная программа автоматизированного рабочего места разработана для работников складских помещений, естественно если у них имеется компьютер классом не ниже Pentium. Сейчас на рынке программного обеспечения появляются все больше и больше различных программ для работы не только со складом, но и различные другие программные средства автоматизированного рабочего места, но стоимость их лицензионных копий доходит порой до нескольких десятков тысяч, а моя программа может быть конечно маленько еще «сыровата», но в процессе работы с нею её можно «довести ее до ума» и все это лишь за пятерку по программированию цена не велика за произведение программного искусства. Каковы её плюсы: ну это естественно простота и понятность (для русского человека) интерфейса программы, что не требует дополнительного обучения или прохождения специальных курсов, особенно для женщин, работающих на складах и не посвященных в азы компьютеров и программного обеспечения; не требовательность к системным ресурсам машины; легкость ввода и отслеживания; простота резервирования базы данных (всего 1 файл), что не маловажно для такой программы. При написании и разработке курсового проекта я научился работать с Borland Pascal, Microsoft Windows 95OSR2, Microsoft Word 97 SR-2 которые использовались для работы над курсовым проектом, научился использовать справку и другие функции Borland Pascal при этом даже разобрался с английским языком и использованием электронных словарей переводчиков таких как Promt, Stylus, Magic Gooddy 98. Огромное спасибо Волкову А.И. – за отличное преподавание предметов, Billу Gaits – за то что он умеет зарабатывать деньги собственным умом, Мерзлякову Д.С. – за поддержку в трудную минуту, Барышеву А.А. – за техническую поддержку, Русских А.И. – за программную поддержку, Казакову В.С. – за разрешение работать на компьютере, Sting, Queen, и другим за хорошую музыку во время работы над курсовым.
I. Задание.
Составить программу автоматического рабочего места для работы со складом.
Программа должна предоставлять пользователю возможность:
1. Вводить новый товар, указывая следующие параметры
-Наименование;
-Количество;
-Цену;
-Дату поступления.
2. Осуществлять поиск товара по наименованию и выдавать его параметры.
3. Помечать выбывший товар, указывая дату выдачи.
4. Выводить список имеющегося товара с возможностью сортировки по любому параметру.
5. Выводить список выбывшего товара с возможностью сортировки по любому параметру.
6. Выдавать общую статистическую характеристику:
-Общая стоимость имеющегося товара;
-Количество имеющегося товара;
-Количество выбывшего товара.
7. Сохранять и восстанавливать всю информацию АРМ с диска.
II. описание переменных и алгоритма работы программы.
Описание переменных.
-basskl – основная запись с необходимыми переменными это:
-naim – наименование товара;
-kol – количество товара;
-price – цена товара;
-kol_p – количество пришедшего товара;
-kol_r – количество товара который ушел;
-date_p – дата прихода товара;
-date_r – дата расхода товара.
-f – file базы слада;
-list – массив данных базы;
-schet – cчетчик;
-curs – показатель позиции;
-stran – счетчик позиции курсора;
-i – переменная использования;
-mcurs – переменная начальной позиции меню;
-k –переменная определения клавиши;
-res –переменная выбора меню;
-da – переменная использования;
-er – переменная ошибки преобразования;
-tx – переменная текста при поиске;
-fil – переменная имени базы;
-key – флажок;
-seter – переменная использования.
Кроме переменных в программе используются процедуры и функции описание которых приведено ниже;
Функция 
probel;
Используется для дополнения текста требуемыми количествами пробелов.
Вход: Текст, требуемая длина.
Выход: Текст требуемой длины.
Функция 
Edtext;
Используется для вывода на экран в нужную позицию текста и его последующего редактирования
Функция работает следующим образом:
Зацикливается до тех пор пока не будет нажатия Enter или Esc. В это время выводит на экран текст в нужную позицию, обновляется , ожидает нажатия клавиш или delete.
Вход: Координаты, текст, длина текста, флажок.
Выход: Вывод на экран текста, отредактированный текст.
Функция 
Cifri;
Подобна функции Edtext
только ввод текста ограничен цифрами.
Работает также.
Процедура 
Prishlo;
Применяется для вывода на экран меню «Приход» и занесения данных в позицию базы.
Описание работы: Работает со строкой массива базы. Выводит на экран меню «Приход», преобразует текстовые переменные после ввода в строки меню.
Процедура 
Ushlo;
Аналогична процедуре Prishlo
.Заменена только формула вычисления количества.
Процедура 
Vvodnov;
Процедура обеспечивающая вывод на экран меню «Новый товар», ввод новой строки в базу.
Работает: Ограничивается строкой, для работы с переменными записи, выводит на экран меню, пользователем редактируются строки меню, преобразуются, увеличивается счетчик числа строк базы на 1.
Процедура 
Edzapic
;
Используется для редактирования записи в текущей позиции курсора листинга перечня товаров.
Вход: Позиция
Выход: отредактированный текст в данной позиции.
Процедура 
Ekran;
Отображает на экране заголовок таблицы базы и заполняет таблицу, рассчитывает и отображает на экране нижнюю строку состояния базы общую сумму, общий приход, общий расход, общее количество товаров.
Описание: Формирует окно для работы, отображает заголовок таблицы, цикл для вывода первых двадцати строк базы в окно, обнуление счетчиков сумм, цикл на все позиции базы, расчет сумм в этом цикле вывод результата на экран в виде строки состояния.
Функция 
Vivstr;
Формирует строку по позиции в базе.
Обнуляется. Работает со строкой в массиве базы. Производит преобразование в стринговые переменные числовых значений базы (количества цены, приход, расход), сумма формируется путем вычисления. Добавление нужными пробелами функцией Probel.
Процедура 
Vivlist;
Обеспечивает формирование экрана с помощью процедуры Ekran
, вывод поясняющей строки. Подкрашивание строки в позиции курсора, опрос клавиш курсора и служебных (для ввода новой, корректировки, удаления). Работает следующим образом: Выполняет процедуру Ekran,
прорисовывает строку пояснения, цикл пока не нажата клавиша «влево», «вправо», «Enter», «Esc» – опрашивает клавиатуру с помощью функции «Readkey» если нажата «Вниз» или «Вверх» уменьшаетя или увеличивается соответственно текущий счетчик позиций меню 
Функция 
Vstroca;
Функция организует главное меню в верхней строке экрана.
Устанавливает параметры цвета, выводит на экран массив с переменными меню т.е. названиями меню. Опрашивает клавиатуру на нажатие клавиши «Влево», «Вправо», «Enter» выполняет соответствующие этим клавишам команды. Затем если было нажато «Esc» функция принимает значение меньшее 1 и затем в головной программе происходит выход.
Процедура 
Sortirovka;
Сортирует данные по заданной колонке.
Организуется цикл на все позиции массива базы. База переносит данные в стороннюю базу. Выбирает столбец сортировки сравнивает со сторонней базой если больше то переносит в стороннюю базу запоминает позицию. В конце цикла переставляет позиции основной базы.
Описание алгоритма работы программы.
Очищается экран выводится меню для указания месторасположения и названия файла базы по умолчанию это «С:base.dat» затем проверяется создан ли файл если нет то создается. Организуется цикл до конца файла переписываются данные в массив базы. Обнуляются переменные. организуется меню по данным функции Vstroka 
затем происходи выбор с помощью оператора Case по которому осуществляются переходы. В случае «1» прихода функции Vstroka
выводится листинг данных базы и заголовков, организация движения курсора по строкам базы при помощи процедуры Vivlist
. В случае результата «2» формируется окно с тенью «Пришло», заполняется окно с помощью процедуры Prishlo 
по текущей позиции курсора экрана и листинга.
«3» формируется окно «Расход», заполняется с помощью процедуры Ushlo. 
«4» организуется окно «Найти наименование» вводится текст с помощью функции Edtext
. сравнивается с наименованиями базы если находит устанавливает курсор на это место. Если не находит выводит сообщение и устанавливает на конечную позицию. «5» Окно сортировки. Выполняется процедура Sortirovka
. При других значениях функции Vstroca
происходит запись файла базы, закрытие файла.
III.
Алгоритм программы.IV. Текст программы.
Program kursovoi;
uses crt;
type basskl = record
 naim:string[40];
 kol:integer;
 price:single;
 kol_p:integer;
 date_p:string[8];
 kol_r:integer;
 date_r:string[8];
 end;
var f:file of basskl;
 List:array[0..255] of basskl;
 Schet:Integer;
 curs,stran,i,mcurs:integer;
 k:char;
 Res,da,er,seter:Integer;
 Tx,files:String;
 key:boolean;
const
 mnu:array[1..6] of string[13]=(
 ' Ввод ',
 ' Приход ',
 ' Расход ',
 ' Найти ',
 ' Сортировка ',
 ' Выход ');
function Probel(Text:String;Len:Integer):String;
 begin
 While length(Text)<Len do Text:=Text+' ';
 Probel:=copy(Text,1,len)
 end;
function Edtext(x,y:Integer; Text:String;Len:Integer;var key:boolean):String;
 var c:char;
 begin
 key:=true;
 Edtext:='';
 repeat
 gotoxy(x,y);
 write(Text);
 write(Probel('',len));
 gotoxy(x,y);
 write(Text);
 c:=Readkey;
 if c=#8 then delete(Text,length(Text),1);
 if c in ['A'..'z',' ','.','0'..'9','А'..'я','-'] then Text:=Text+c;
 Text:=copy(Text,1,len);
 until (c=#27) or (c=#13);
 if c=#13 then Edtext:=Text else key:=false;
 end;
function Cifri(x,y:Integer; Text:String;Len:Integer;var key:boolean):String;
 var c:char;
 begin
 key:=true;
 Cifri:='';
 repeat
 gotoxy(x,y);
 write(Text);
 write(Probel('',len));
 gotoxy(x,y);
 write(Text);
 c:=Readkey;
 if c=#8 then delete(Text,length(Text),1);
 if c in ['.','0'..'9','-'] then Text:=Text+c;
 Text:=copy(Text,1,len);
 until (c=#27) or (c=#13);
 if c=#13 then Cifri:=Text else key:=false;
 end;
procedure Prishlo(posiz:integer);
var Tx:String;
 er:integer;
 key:Boolean;
 kl:integer;
begin
 clrscr;
 With List[Posiz] do begin
 writeln(' Приход');
 writeln(' Количество ->');
 writeln(' Дата прихода ДД.ММ.ГГ->');
 val(Cifri(25,2,'',6,key),kl,er); if NOT key then exit;
 kol_p:=kol_p+kl; kol:=kol+kl;
 Date_p:=Cifri(25,3,'',8,key); if NOT key then exit;
 end;
end;
procedure Ushlo(p
var er:integer;
 key:Boolean;
 kl:integer;
begin
 clrscr;
 With List[Posiz] do begin
 writeln(' Расход');
 writeln(' Количество ->');
 writeln(' Дата расхода ДД.ММ.ГГ->');
 val(Cifri(25,2,'',6,key),kl,er); if NOT key then exit;
 kol_r:=kol_r+kl; kol:=kol-kl;
 Date_r:=Cifri(25,3,'',8,key); if NOT key then exit;
 end;
end;
procedure Vvodnov;
var Tx:String;
 er:integer;
 key:Boolean;
begin
 clrscr;
 With List[Schet] do begin
 writeln(' Новый товар');
 writeln(' Наименование товара :');
 writeln(' Количество :'); 
 writeln(' Цена :'); 
 writeln(' Дата прихода ДД.ММ.ГГ:'); {readln(date_p);}
 Naim:=Edtext(25,2,'',20,key); if NOT key then exit;
 val(Cifri(25,3,'',6,key),kol,er); if NOT key then exit;
 kol_p:=kol;
 val(Cifri(25,4,'',10,key),price,er); if NOT key then exit;
 Date_p:=Cifri(25,5,'',8,key); if NOT key then exit;
 inc(Schet);
 end;
end;
procedure Edzapic(posiz:integer);
var Tx:String;
 er:integer;
 key:Boolean;
begin
 clrscr;
 With List[posiz] do begin
 writeln(' Редактирование товара');
 writeln(' Наименование товара :');
 writeln(' Цена :');
 Tx:=Edtext(25,2,Naim,20,key); if key then Naim:=tx;
 str(price:0:2,tx);
 tx:=Cifri(25,3,tx,10,key); if key then val(tx,price,er);
 end;
end;
 function vstroca(var curs:integer):integer;
 var i:integer;
 begin
 Textbackground(15);
 TextColor(0);
 gotoxy(1,1); write(Probel('',80));
 for i:=0 to 5 do
 begin
 gotoxy(i*13+1,1); write(mnu[i+1]);
 end;
 Textbackground(0);
 TextColor(14);
 gotoxy((curs-1)*13+1,1); write(mnu[curs]);
 repeat
 k:=readkey;
 Textbackground(15);
 TextColor(0);
 gotoxy((curs-1)*13+1,1); write(mnu[curs]);
 if k=#0 then k:=readkey;
 case k of
 #75: if curs>1 then dec(curs) else curs:=6;
 #77: if curs<6 then inc(curs) else curs:=1;
 end;
 Textbackground(0);
 TextColor(14);
 gotoxy((curs-1)*13+1,1); write(mnu[curs]);
 if k=#13 then vstroca:=curs;
 until (k=#27) or (k=#13);
 if k=#27 then vstroca:=-1;
 end;
 function VIVSTR(nstr:integer):String;
 var Skol,sprice,summ,
 Pkol,Rkol:String[10];
 begin
 VIVSTR:='';
 if (nstr<Schet) and (nstr>=0) then
 With List[nstr] do
 begin
 str(kol,skol);
 str(price:9:2,sprice);
 str(price*kol:9:2,summ);
 str(kol_p,pkol);
 str(kol_r,rkol);
 VIVSTR:=Probel(naim,20)+Probel(skol,6)+Probel(sprice,11)+Probel(summ,11)+
 Probel(Pkol,6)+Probel(Date_p,10)+Probel(Rkol,6)+Probel(Date_r,9);
 end;
 end;
 procedure Ekran;
 var i:integer;
 Summ_,Sum_p,Sum_r:Double;
 begin
 Window(1,2,80,25);
 Textbackground(5);
 TextColor(10);
 Clrscr;
 gotoxy(1,1);
 Textbackground(3);
 write(Probel('Наименование',20)+Probel('Кол-во',9)+Probel('Цена',10)+
 Probel('Сумма',7)+Probel('Приход ',7)+Probel('Дата пост',10)+Probel('Расход',6)
 +Probel(' Дата выд',9));
 Textbackground(5);
 TextColor(14);
 for i:=0 to 20 do
 begin
 gotoxy(1,2+i); Write(Vivstr(i+stran));
 end;
 Textbackground(15);
 TextColor(0);
 gotoxy(1,1+curs); write(VIVSTR(curs+stran-1));
 Summ_:=0; Sum_p:=0; Sum_r:=0;
 for i:=0 to Schet-1 do
 begin
 Summ_:=Summ_+(List[i].price*List[i].kol);
 Sum_p:=Sum_p+(List[i].price*List[i].kol_p);
 Sum_r:=Sum_r+(List[i].price*List[i].kol_r);
 end;
 Textbackground(4);
 TextColor(15);
 gotoxy(1,23); write(Probel('',80));
 gotoxy(1,23); write(' Итого: ',
 Summ_:12:2,' руб. Приход: ',Sum_p:0:2,' руб. Расход:',Sum_r:0:2,' руб.');
 gotoxy(15,24); write ('Общее количество наименований товара: ',schet,' шт');
 end;
procedure Sortirovka(num:Integer);
var i,j,k:Integer;
 Bas:Basskl;
begin
 for i:=0 to Schet-1 do
 begin
 Bas:=List[i];
 for j:=i+1 to Schet-1 do
 begin
 case Num of
 1: if Bas.Naim>List[j].naim then begin Bas:=List[j]; k:=j end;
 2: if Bas.kol>List[j].kol then begin Bas:=List[j]; k:=j end;
 3: if Bas.price>List[j].price then begin Bas:=List[j]; k:=j end;
 5: if Bas.kol_p>List[j].kol_p then begin Bas:=List[j]; k:=j end;
 6: if Bas.date_p>List[j].date_p then begin Bas:=List[j]; k:=j end;
 7: if Bas.kol_r>List[j].kol_r then begin Bas:=List[j]; k:=j end;
 8: if Bas.date_r>List[j].date_r then begin Bas:=List[j]; k:=j end;
 end;
 end;
 List[k]:=List[i]; List[i]:=Bas;
 end;
end;
 procedure Vivlist(var seek,curs:integer);
 var c,k:char;
 i:integer;
 begin
 Ekran;
 Textbackground(3);
 gotoxy(1,24); write(Probel(' <- -> - меню | Ins - Добавить | Ctrl+F8 - Удалить | Ctrl+Enter - Изменить',79));
 Textbackground(15);
 TextColor(1);
 gotoxy(1,1+curs); write(VIVSTR(curs+stran-1));
 repeat
 c:=readkey;
 Textbackground(5);
 TextColor(14);
 gotoxy(1,1+curs); write(VIVSTR(curs+stran-1));
 if c=#0 then k:=readkey;
 case k of
 #72: begin {Вверх курсор}
 if (curs=1) and (stran>0) then begin dec(stran); Ekran end;
 if (curs>1) then dec(curs);
 end;
 #80: begin {Вниз курсор}
 if (curs=20) and (stran+20<Schet) then
 begin inc(stran); Ekran end;
 if ((curs<20) and (Schet>=20))
 or ((Schet<20) and (curs<Schet)) then inc(curs);
 end;
 #101: begin{Удалить} {Ctrl+F8}
 if Schet>0 then
 for i:=curs+stran-1 to Schet-1 do
 begin
 List[i]:=List[i+1];
 end;
 dec(Schet);
 dec(curs);
 Ekran;
 end;
 #82: begin {Ins - новая запись}
 Window(12,12,72,17);
 Textbackground(0);
 clrscr;
 Window(10,11,70,16);
 Textbackground(7);
 clrscr;
 {новоя запись}
 Vvodnov;
 Sortirovka(1);
 Window(1,1,80,25);
 Ekran;
 end;
 end;
 if c=#10 then {Ctrl+Enter}
 begin
 Window(12,12,72,17);
 Textbackground(0);
 clrscr;
 Window(10,11,70,16);
 Textbackground(7);
 clrscr;
 {новоя запись}
 Edzapic(Curs+stran-1);
 Sortirovka(1);
 Window(1,1,80,25);
 Ekran;
 end;
 Textbackground(15);
 TextColor(1);
 gotoxy(1,1+curs); write(VIVSTR(curs+stran-1));
 until (k=#27) or (k=#13) or (k=#75)or (k=#77);
 Window(1,1,80,25);
 end;
begin
 clrscr;
 Window(16,12,66,15);
 Textbackground(9);
 textcolor (3);
 clrscr;
 write (' Введите название и полный путь базы');
 gotoxy (3,3);
 readln (files);
 if files='' then files:='c:base.dat';
 assign(f,files);
 {$I-}
 reset(f);
 {$I+}
 if IOResult<>0 then rewrite(f);
 Schet:=0;
 While not eof(f) do
 begin
 inc(Schet);
 read(f,List[Schet-1]);
 end;
 Textbackground(0);
 clrscr;
 curs:=1; stran:=0; mcurs:=1; seter:=15;
 repeat
 Ekran;
 Window(1,1,80,25);
 res:=vstroca(mcurs);
 case res of
 1:begin
 Vivlist(stran,curs);
 Window(1,1,80,25);
 end;
 2:begin
 Window(16,12,66,15);
 Textbackground(0);
 clrscr;
 Window(14,11,64,14);
 Textbackground(7);
 clrscr;
 {Запуск новой записи}
 Prishlo(Curs+stran-1);
 Window(1,1,80,25);
 end;
 3:begin
 Window(16,12,66,15);
 Textbackground(0);
 clrscr;
 Window(14,11,64,14);
 Textbackground(7);
 clrscr;
 {Запуск новой записи}
 Ushlo(Curs+stran-1);
 Window(1,1,80,25);
 end;
 4:begin {Поиск}
 Window(16,12,66,14);
 Textbackground(7);
 clrscr;
 Window(14,11,64,13);
 Textbackground(8);
 clrscr;
 Gotoxy(2,2); Write('Найти наименование:');
 Tx:=Edtext(25,2,'',20,key);
 for i:=0 to Schet-1 do
 if List[i].naim=tx then begin seter:=1; break; end;
 if i>20 then begin curs:=1; stran:=i end
 else begin curs:=i+1; stran:=0; end;
 if seter<>1 then
 begin
 Window(16,12,66,14);
 Textbackground(7);
 clrscr;
 Window(14,11,64,13);
 Textbackground(8);
 clrscr;
 Gotoxy(2,2); Write('Наименование ненайдено'); readln; stran:=1; curs:=1;
 end;
 Vivlist(stran,curs);
 Window(1,1,80,25);
 end;
 5:begin {Сортировка}
 Window(16,12,66,14);
 Textbackground(0);
 clrscr;
 Window(14,11,64,13);
 Textbackground(7);
 clrscr;
 Gotoxy(2,2); Write('Введите поле для сортировки (1..8):');
 val(Cifri(38,2,'',1,key),da,er);
 if da in [1..8] then Sortirovka(da);
 Window(1,1,80,25);
 end;
 end;
 until (res<1) or (res=6);
 Rewrite(f);
 Sortirovka(1);
 for i:=0 to Schet-1 do Write(f,List[i]);
 close(f);
end.