Консультация № 175677
27.12.2009, 21:24
35.00 руб.
0 8 1
Добрый вечер. Понадобилась помощь с задачей.Суть ее такова.
Описать запись с именем Price содержащую поля:
-название товара
-название магазина, в котором продается товар
-стоимость товара в рублях
Написать программу,выполняющую следующие действия:
-ввод данных с клавиатуры в массив,состоящий из восьми элементов типа Price;записи должны быть размещены в алфавитном порядке по названиям товаров
-вывод на экран информации о товаре,название которого введено с клавиатуры;если таких товаров нет, вывести на экран соответствующее сообщение
-запись массива в файл под заданным с клавиатуры именем

Обсуждение

Неизвестный
28.12.2009, 02:56
общий
Собственно осталась проблема в сортировке по алфавиту...пока выглядит так:
Program prog5;
uses ocna,crt;

const
n=5;
x11=2;y11=2;x12=58;y12=12;
x21=2;y21=14;x22=58;y22=23;
x31=60;y31=2;x32=79;y32=12;
type note=record
naz:string;
mg:string;
bd:integer;
end;
{------Описание процедур--------}
procedure vvod(var a:array[1..n] of note); {ВВОД ДАННЫХ}
var
i,j:integer;
x:byte;
begin
Window1(x11,y11,x12,y12);
for i:=1 to n do
begin
writeln('Введите название товара');
readln(a[i].naz);
writeln('Введите название магазина');
readln(a[i].mg);
writeln('Введите стоимость товара');
readln(a[i].bd);
clrscr;
end;
end; {конец ввода}

procedure sravn(s1,s2:array[1..3] of integer;var r:boolean);{Сравнение 2х массивов из записи}
var
i,j:integer;
begin
for i:=3 downto 1 do
begin
if s1[i]>s2[i] then begin r:=true;break end;
if s1[i]<s2[i] then begin r:=false;break end;
continue
end;
end;

procedure swap(var x,y:note);{подмена одной записи,другой}
var t:note;
begin
t := x;
x := y;
y := t
end;

procedure sort(var a:array[1..n] of note);
var i,j:byte;

begin
for i:=1 to n-1 do
for j:=i+1 to n do
if a[i].naz>a[j].naz then
begin
a[i]:=a[j];
end;
end;
{procedure sort(var a:array[1..n] of note);{сортировка по алфавиту в записи}

{var
i,j:integer;
r:boolean;
begin
for j:=1 to n-1 do
for i:=1 to n-j do
begin
sravn(a[i].unucualu,a[i+1].unucualu,r);
if r=true then
swap(a[i],a[i+1]);
end;
end; }


procedure found(a:array[1..n] of note);{Поиск товара}
var
i,j:integer;
s:string;
z:boolean;
x:byte;
begin
Window1(x11,y11,x12,y12);
writeln('Введите товар для поиска');
readln(s);
z:=false;
Window2(x21,y21,x22,y22);
Writeln;
for i:=1 to n do
if s<>a[i].naz then continue
else begin z:=true;
writeln(a[i].naz);
writeln(a[i].mg);
write(a[i].bd);
writeln( );
end;
if z=false then writeln('Ненайдено');
end; {конец поиска}

procedure zapis(a:array[1..n] of note);{запись в файл}
var
f:text;
i,j:integer;
name:string;
x:byte;
begin
Window1(x11,y11,x12,y12);
sort(a);
writeln('Введите название файла');
readln(name);
Assign(f,name+'.txt');
rewrite(f);
for i:=1 to n do
With a[i] do
begin
writeln(f,'-----------------------');
writeln(f,'Название товара: ',naz);
writeln(f,'Название магазина: ',mg);
Write(f,'Стоимость товара: ',bd);
writeln(f,'-----------------------');
end;

Window1(x11,y11,x12,y12);
Writeln('Запись совершенна!');
close(f);
end;{конец записи в файл}
{--------------Главная программа---------------------}
var
i,j:integer;
ch:Char;
a:array[1..n] of note;
begin

Window1(x11,y11,x12,y12);
Window2(x21,y21,x22,y22);
Window3(x31,y31,x32,y32);
repeat
begin
ch:= ReadKey;
TextMode(Co80);
if ch=#59 then vvod(a);{ввода данных в запись}
if ch=#67 then found(a); {Поиск по магазину}
if ch=#61 then zapis(a);{запись в файл}
end;
until ch=#27;
end.


давно
Профессионал
304622
583
28.12.2009, 18:43
общий
Александр Белов:
1) В этой программе используется модуль ocna. Где он?
2) Насколько я знаю вот такие конструкции
procedure vvod(var a:array[1..n] of note);
в Борланд Паскале недопустимы. Ты уже компилировал и запускал эту программу?
Неизвестный
29.12.2009, 01:33
общий
Unit ocna;
Interface
Uses Crt;
Procedure namewi (x1,y1,x2,y2:Integer);
Procedure Window1(x1,y1,x2,y2:Integer);
Procedure Window2(x1,y1,x2,y2:Integer );
Procedure Window3(x1,y1,x2,y2:Integer );
Implementation

Procedure namewi(x1,y1,x2,y2:integer);
var
x:byte;
begin;
Window(x1,y1,x2,y2);
TextBackground(blue);TextColor(Black);
ClrScr;
x := (X2-x1) Div 2 - 5;
GoToXY(x,1);
Write('Программа ');
writeln;
End;


Procedure Window1(x1,y1,x2,y2:integer);
var
x:byte;
begin;
Window(x1,y1,x2,y2);
TextBackground(red);TextColor(Black);
ClrScr;
x := (X2-x1) Div 2 - 5;
GoToXY(x,1);
Write('Ввод данных');
writeln;
End;

Procedure Window2(x1,y1,x2,y2:integer);
var
x:byte;

begin
Window(x1,y1,x2,y2);
TextBackground(yellow);TextColor(Blue);
ClrScr;
x := (X2-x1) Div 2 - 5;
GoToXY(x,1);
Write('Результат поиска');
writeln;
End;

Procedure Window3(x1,y1,x2,y2:integer);
var

x:byte;
begin
Window(x1,y1,x2,y2);
TextBackground(Cyan);TextColor(Black);
ClrScr;
x := (X2-x1) Div 2 ;
GoToXY(x,1);
Writeln('Меню');
WriteLn;
WriteLn('Ввести данные <F1>');
WriteLn('Поиск <F9>');
WriteLn('Запись в файл <=>');
WriteLn('Выход <ESC>');


End;
end.

вот ocna. Забыл выложить:)
Программу компилировал и запускал.
давно
Профессор
401888
1232
29.12.2009, 08:55
общий
это ответ
Здравствуйте, parazut!
Решение задачи в приложении.

Приложение:
uses crt;
const n=8;{количество записей}
type price=record{тип запись товар}
tov,mgz:string[20];{названия товара и магазина}
stm:word;{стоимость}
end;
var z:array[1..n] of price;{массив записей}
x:price;{переменная для считывания и сортировки записей}
i,j,k:byte;{счетчики, фиксатор}
t:string[20];{переменная для ввода названия товара}
f:file of price;{типизированный файл записей}
name:string;{переменная для имени файла}
begin
clrscr;
writeln('Введите данные о ',n,' товарах:');
for i:=1 to n do
with z[i] do{пока очередная запись}
begin
writeln('Товар ',i);
write(' Название товара: ');readln(tov);
write(' Название магазина: ');readln(mgz);
write(' Стоимость: ');readln(stm);
end;
clrscr;
for i:=1 to n-1 do{отсортируем записи}
for j:=i+1 to n do
if z[i].tov>z[j].tov then{по алфавиту(возрастанию) названий товаров}
begin
x:=z[i];
z[i]:=z[j];
z[j]:=x;
end;
write('Введите название товара для поиска:');
readln(t);
k:=0;
for i:=1 to n do
if z[i].tov=t then{если поле записи товар совпало с введенным}
begin
k:=1;
writeln(z[i].tov,' ',z[i].mgz,' ',z[i].stm);{выводим все поля записи}
end;
if k=0 then writeln('Такого товара нет!');
write('Press Enter...');
readln;
clrscr;
write('Введите имя файла для записи:');
readln(name);
assign(f,name);{связываем переменную с файлом на диске}
rewrite(f);{открываем файл для записи}
for i:=1 to n do{по размеру массива}
write(f,z[i]);{заносим его элементы в файл записей}
writeln('Содержание файла:');
reset(f);{откроем файл для чтения}
while not eof(f) do{пока не конец файла}
begin
read(f,x);{читаем записи в переменную}
writeln(x.tov,' ',x.mgz,' ',x.stm);{выводим на экран поля записи}
end;
close(f);{закрываем файл}
write('Press Enter...');
readln
end.
давно
Профессионал
304622
583
29.12.2009, 18:21
общий
Александр Белов:
Цитата: 317222
Программу компилировал и запускал.


Я весьма удивлён. У меня на строке
"
procedure vvod(var a:array[1..n] of note); {ВВОД ДАННЫХ}
"
компилятор стопорится со словами "Error 54. OF Expected" . Ты компилировал в Borland Pascal v7?
Неизвестный
29.12.2009, 20:31
общий
Pascal ABC
давно
Профессионал
304622
583
30.12.2009, 12:31
общий
Александр Белов:
Цитата: 317222
Pascal ABC


А!! Понятно.

Тебе ответ дали. Устраивает? Надо разбирать твою программу?
Неизвестный
30.12.2009, 12:49
общий
Не совсем,то. Я остановился на своей версии программы с некоторыми изменениями. Можно уже не разбирать. Спасибо за помощь:)
Форма ответа