tp_lammer
Newbie | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Ребят, вот написал написал свою задачку, знаю что все работает корректно (процедуры работы с базой данных, но по страшному косячит интерфейс (менюшка и вывод) помогите найти ошибку пожалуйста. Напоминаю условие: В текстовом файле храниться список товаров. Для каждого товара указаны его название, название магазина, в котором продаеться товар, стоимость товара в тыс. руб. и его кол-во с указанием единицы измерения (например, 100шт, 20 кг). Написать программу, выполняющую: 1) корректировку или дополнение списка с клавиатуры 2) сортировку по названию товара или по названию магазина 3) вывод на экран информации о товаре, название которого введено с клавиатуры 4) запись списка в файл под тем же или новым именем Код проги: {Объявляем максимальный размер массива под товары} uses Crt; const StockMaxSize = 100; {Описываем тип строк для названий товаров и магазинов кратный 8-ми (32 байта)} type TMyString = string[31]; {Описываем структуру данных для хранения информации о товарах} TProduct = record Name : TMyString; Shop : TMyString; Price : real; Count : word; end; TStock = array [1..StockMaxSize] of TProduct; var Stock : TStock; j, cmd, StockSize : integer; fname : string; DefaultMode,ActiveColor,InactiveColor:word; key:char; item:word; prev:word; {Выполняем сортировку по названию товара} procedure SortByName; var I, J: Integer; T : TProduct; begin for I := StockSize downto 1 do for J := 1 to StockSize - 1 do if Stock[J].Name > Stock[J + 1].Name then begin T := Stock[J]; Stock[J] := Stock[J + 1]; Stock[J + 1] := T; end; end; {Выполняем сортировку по названию магазина} procedure SortByShop; var I, J: Integer; T : TProduct; begin for I := StockSize downto 1 do for J := 1 to StockSize - 1 do if Stock[J].Shop > Stock[J + 1].Shop then begin T := Stock[J]; Stock[J] := Stock[J + 1]; Stock[J + 1] := T; end; end; {Очищаем экран без применения функции стандартного модуля Crt} procedure ClearScreen; var k : integer; begin for k:=1 to 24 do Writeln; end; {Ищем по названию товар в списке и возвращаем его индекс в массиве Stock, либо возвращаем нуль} {Return: 0 - product not found, 1.. - index of product in Stock array} function GetProductIndexByName( ProdName : string ): integer; var k : integer; begin k:=StockSize; while (k>0) and (Stock[k].Name<>ProdName) do Dec(k); GetProductIndexByName:=k; end; {Добавляем товар в список Stock} procedure AddProduct( Prod: TProduct ); begin Inc(StockSize); Stock[StockSize]:=Prod; end; {Обновляем информацию о товаре в списке Stock} procedure UpdateProduct( Index : word; Prod: TProduct ); begin Stock[Index]:=Prod; end; {Выполняем добавление товара} procedure ModeAddProduct; var Prod : TProduct; begin gotoXY(1,3); Writeln('== Add Product =='); Writeln('Enter Product Name: '); Readln(Prod.Name); Writeln('Enter Shop Name: '); Readln(Prod.Shop); Writeln('Enter Product Price: '); Readln(Prod.Price); Writeln('Enter Product Count: '); Readln(Prod.Count); AddProduct( Prod ); end; {Выполняем редактирование товара} procedure ModeEditProduct; var Prod : TProduct; j, index : integer; begin gotoXY(1,3); Writeln('== Edit Product =='); Writeln('Product list: '); for j:=1 to StockSize do if j=1 then Write(Stock[j].Name) else Write(', ', Stock[j].Name); Writeln; Writeln('Select and enter name of product: '); Readln(Prod.Name); index:=GetProductIndexByName(Prod.Name); if index=0 then begin Writeln('Error: Product name is not exists. Press enter.'); Readln; exit; end; Prod:=Stock[index]; {Выводим старую информацию о товаре для помощи пользователю} Writeln('Product info: ', Prod.Name, ' => ', Prod.Shop, ' => ', Prod.Price:4:2, ' => ', Prod.Count); Writeln('Editing of "', Prod.Name, '" product...'); Writeln('Enter Shop Name: '); Readln(Prod.Shop); Writeln('Enter Product Price: '); Readln(Prod.Price); Writeln('Enter Product Count: '); Readln(Prod.Count); UpdateProduct( index, Prod ); end; {Загружаем список товаров из указанного файла} procedure ModeOpenStock; var Prod : TProduct; f: text; begin gotoXY(1,3); Writeln('== Open Stock =='); Writeln('Enter file name: '); Readln(fname); assign(f,fname); {$I-} reset(f); {$I+} if IOResult<>0 then begin Writeln('Error: file "', fname, '" not found. Press enter.'); readln; exit; end; StockSize:=0; while not Eof(f) do begin Readln(f,Prod.Name); Readln(f,Prod.Shop); Readln(f,Prod.Price); Readln(f,Prod.Count); AddProduct( Prod ); end; close(f); end; {Сохраняем список товаров в текущий файл} procedure ModeSaveStock; var f: text; k : integer; begin gotoXY(1,3); Writeln('== Save Stock =='); assign(f,fname); rewrite(f); for k:=1 to StockSize do begin Writeln(f,Stock[k].Name); Writeln(f,Stock[k].Shop); Writeln(f,Stock[k].Price:4:2); Writeln(f,Stock[k].Count); end; close(f); end; {Сохраняем список товаров в указанный файл} procedure ModeSaveAsStock; var f: text; k : integer; begin gotoXY(1,3); Writeln('== SaveAs Stock =='); Writeln('Enter file name: '); Readln(fname); assign(f,fname); rewrite(f); for k:=1 to StockSize do begin Writeln(f,Stock[k].Name); Writeln(f,Stock[k].Shop); Writeln(f,Stock[k].Price:4:2); Writeln(f,Stock[k].Count); end; close(f); end; {Выводим таблицу товаров} procedure ShowProducts; var k : integer; s : string; begin if StockSize=0 then exit; Writeln('== Stock =='); Writeln(' Product | Shop | Price | Count '); Writeln('====================|====================|===================|================='); for k:=1 to StockSize do begin str(Stock[k].Price:4:2,s); Writeln(Stock[k].Name:20, '|', Stock[k].Shop:20, '|', s:19, '|', Stock[k].Count:11); end; end; procedure DrawItem(item,color:word); const d=13; items:array [1..9] of string[d]= ('AddProd', 'EditProd', 'OpenFile', 'Save', 'SaveAs', 'SortName', 'SortShop','ShowProd','Quit'); pos:array[1..9] of integer=(1,9,19,28,33,40,49,58,67); begin window(1,1,80,2); TextBackGround(LightGray); TextColor(color); gotoXY(pos[item],1); write(items[item]); end; procedure InitMenu(ActiveColor,InactiveColor:word); var item:word; begin window(1,1,80,2); TextBackGround(LightGray); clrscr; DrawItem(1,ActiveColor); for item:=2 to 9 do DrawItem(item,InactiveColor); gotoXY(1,2); TextColor(InactiveColor); gotoXY(1,1); end; procedure Clear; begin window(1,3,80,25); TextAttr:=White; clrscr; end; begin StockSize:=0; fname:='stock.txt'; clrscr; ActiveColor:=LightGreen; InactiveColor:=Green; InitMenu(ActiveColor,InactiveColor); item:=1; prev:=1; while true do begin key:=readkey; if key=#0 then key:=readkey; case ord(key) of 13: case item of 1: begin ModeAddProduct; end; 2: begin ModeEditProduct;end; 3: begin ModeOpenStock;end; 4: begin ModeSaveStock;end; 5: begin ModeSaveAsStock;end; 6: begin SortByName; end; 7: begin SortByShop;end; 8: begin ShowProducts;end; 0: begin Halt; end; end; 15,75: begin prev:=item; dec(item); if item=0 then item:=9; end; 9,77: begin prev:=item; inc(item); if item=9+1 then item:=1; end; end; Clear; DrawItem(prev,InactiveColor); DrawItem(item,ActiveColor); end; end. База данных в файле stock.txt пример ее содержания: Pepsi MsDon 35.00 125 Coke MsDon 58.00 24567 French Fries McDonalds Sennaya 62.00 322 Добавлено: По-моему не работают процедуры при вызове из интерфейса SortByName SortByShop И эа тема 0: begin Halt; end; Или они работают но не отображаються или ваще не работают, помогите плиз =\ |