Помощь - Поиск - Пользователи - Календарь
Полная версия: Типизированный файл. Записи. Сортировка.
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
-SOKOL-
И снова здраствуйте...
В программе нужно сделать регистрацию товара и вывод списка товаров отсортированных по алфавиту...
У меня получается так, что когда я регистрирую новый товар, на выводе он выводит себя несколько раз+ стирает предыдущий =\ что я не так сделал?

program a;
uses crt;
type
rega=record
num:integer;
name:string;
har:string;
data:integer;
garant:integer;
cenao:integer;end;

var
out:file of rega;
nam:rega; buf:rega;
i,j:integer;
mass:array[1..20] of rega;

procedure registration;begin
clrscr;
assign(out,'firma.dat');
reset(out);

write ('Введите регистрационный номер:');
readln(nam.num);
write ('Введите наименование');
readln (nam.name);
write ('Введите характеристику');
readln (nam.har);
write ('‚Введите дату производства:');
readln (nam.data);
write ('Введите срок гарантии');
readln (nam.garant);
writeln ('Введите оптовую цену:');
readln (nam.cenao);
seek(out,filesize(out));
write(out,nam);
close(out);
end;

procedure prosmotr;
var t,k:integer; begin clrscr;
assign(out,'firma.dat');
reset(out);
t:=filesize(out);
for i:=1 to t-1 do
if mass[i].name>mass[i+1].name then begin
buf:=mass[i];
mass[i]:=mass[i+1];
mass[i+1]:=buf;
end;
rewrite (out);
for i:=1 to t do
write (out,mass[i]);
close(out);
reset(out);
while not eof(out) do
begin
read(out,buf);
writeln (nam.name);
end;
close(out);
readln;
end;

{здесь процедура меню}

begin
menu;
end.

volvo
-SOKOL-, то что у тебя есть в процедуре prosmotr - недостаточно для сортировки. Нужно 2 вложенных цикла, посмотри тему в FAQ-е. Да и потом, ты сортируешь содержимое массива, а где ты читаешь данные из файла в mass?
-SOKOL-
Думаю вот так? Но ничего не изменилось...

program a;
uses crt;
type
rega=record
num:integer;
name:string;
har:string;
data:integer;
garant:integer;
cenao:integer;end;

var
out:file of rega;
nam:rega; buf:rega;
i,j:integer;
mass:array[1..20] of rega;

procedure registration;begin
clrscr;
assign(out,'firma.dat');
reset(out);

write ('Введите регистрационный номер:');
readln(nam.num);
write ('Введите наименование');
readln (nam.name);
write ('Введите характеристику');
readln (nam.har);
write ('‚Введите дату производства:');
readln (nam.data);
write ('Введите срок гарантии');
readln (nam.garant);
writeln ('Введите оптовую цену:');
readln (nam.cenao);
seek(out,filesize(out));
write(out,nam);
close(out);
end;

procedure prosmotr;
var t,k:integer; begin clrscr;
assign(out,'firma.dat');
reset(out);
t:=filesize(out);
while not eof(out) do begin
read(out,buf)
mas[j]:=buf;
j:=j+1;
end;
for i:=1 to t-1 do
for j:=1 to t-i do
if mass[j].name>mass[j+1].name then begin
buf:=mas[j];
mass[j]:=mass[j+1];
mass[j+1]:=buf;
end;
rewrite (out);
for j:=1 to t do
write (out,mass[j]);
close(out);
reset(out);
while not eof(out) do
begin
read(out,buf);
writeln (nam.name);
end;
close(out);
readln;
end;

{здесь процедура меню}

begin
menu;
end.

renesko1
if mass[j].name>mass[j+1].name then begin

Ты сравнивешь по длине имени или я что то не так понял ?
volvo
Во-первых, форматируй исходники, их же читать невозможно... А во вторых - внимательнее с несколькими вещами:
procedure prosmotr;
var
i, j: integer; { не надо работать с глобальными переменными - это чревато ошибками }
t,k:integer;

begin
clrscr;
assign(out,'firma.dat'); reset(out);

j := 0; { инициализировать переменную не помешает }
while not eof(out) do begin
read(out,buf);
j:=j+1; mass[j]:=buf; { <-- СНАЧАЛА увеличиваем, потом заносим в массив }
end;

t := j; { <-- как видишь, filesize был лишним, размер известен и так... }
for i:=1 to t do
for j:=t downto i+1 do
if mass[j-1].name>mass[j].name then begin
buf:=mass[j-1];
mass[j-1]:=mass[j];
mass[j]:=buf;
end;

rewrite (out);
for j:=1 to t do
write (out,mass[j]);
reset(out); { <--- переоткрываешь для чтения - close не обязателен }

while not eof(out) do begin
read(out,buf);
writeln (buf.name); { <--- Печатаешь то, что ПРОЧЕЛ, а не что-то другое }
end;
close(out);
readln;
end;


Добавлено через 1 мин.
Цитата
Ты сравнивешь по длине имени или я что то не так понял ?
Сравнение строк - обычная операция...
renesko1
Спасибо, буду знать.
-SOKOL-
volvo, огромное спасибо!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.