Технический форум

Технический форум (http://www.tehnari.ru/)
-   Delphi, Kylix and Pascal (http://www.tehnari.ru/f43/)
-   -   Необходимо ввести и сохранить в файле данные следующей структуры (http://www.tehnari.ru/f43/t259559/)

SendiH 13.05.2018 21:54

Необходимо ввести и сохранить в файле данные следующей структуры
 
Ввести и сохранить в файле данные следующей структуры:
наименование товара, фирма изготовитель, срок хранения, стоимость товара,
количество на складе. Организовать просмотр исходных данных и вывести
список товаров, количество на складе которых не меньше заданного,
отсортированный по возрастанию методом пузырька, с указанием срока
хранения и стоимости.
Ввод и вывод данных организовать в виде таблиц. Отладку программы
производить на примере файла, состоящего не менее чем из 15 записей.
Код:

uses crt;
Function IOResult : Integer;
const g=6;
type
Tablica=record
Name:string[40]; //Название товара
Fir:integer; //Фирма изготовитель
Srok:integer; //Срок хранения
Stoim:string[20]; // Стоимость товара
Kol:integer; //Количество на складе
end;
var
users:file of Tablica; // Сам файл
k:1..g; // Счетчик для массива
work:array[1..g] of Tablica; //Массив записей для дальнейшей сортировки
NewTabl:string[15]; // Имя файла
n:1..4; // Кол-во для CASE
i:integer;
Procedure Name_file_for_tabl; // Задаем имя файла
begin
write('Введите имя файла данных ');
Readln(NewTabl);
End;
Procedure error(var i:integer); //Для ошибок связанных с отсутствием файла
begin
Name_file_for_tabl;
Assign(users,NewTabl);
{$I-} //Проверка на то, что файл существует
Reset(users);
{$I+}
if IOResult<>0 then
begin
Writeln('Файла с именем '+NewTabl+' на диске нет');
i:=999;
delay(5000);
clrscr;
end
else i:=0;
end;
procedure input; // Происходит ввод файла
begin
Name_file_for_tabl; // Спрашиваем имя
 assign(users, NewTabl);
 rewrite(users); //Создаем новый файл или перезаписываем
 for var k:= 1 to g do
 begin
  with work[k] do
  begin
  writeln ('Введите наименование товара: ');
  readln(Name);
  writeln ('Введите фирму изготовителя: ');
  readln (Fir);
  writeln ('Введите срок хранения: ');
  readln(Srok);
  writeln ('Введите стоимость товара: ');
  readln(Stoim);
  writeln ('Введите количество товара: ');
  readln(Kol);
  end;
 write(users,work[k]);
 end;
close(users); //Закрываем файл.
  writeln('1 - Дальше. 2 - Выход');
  readln(n);
  if n=2 then halt(1);
end;
Procedure OutputRec; //Вывод одиночной записи.
Begin
Read(users,work[k]);
with work[k] do
begin
write('Запись №',FilePos(users),';');
Writeln('Наименование товара: ',Name);
Writeln('Фирма изготовитель: ',Fir);
Writeln('Срок хранения: ',Srok);
Writeln('Стоимость товара: ',Stoim);
Writeln('Количество товара: ',Kol);
writeln();
end;
end;
procedure OutputAllRec; //Читает все записи
begin
error(i);
if i=999 then exit;
writeln('Вывод базы данных из файла ',NewTabl);
 for var k :=1 to g do
  if (not Eof(users)) then //Чтение до конца строки
    OutputRec; //Вывод отдельных записей
  writeln('*----------------------------------------*--------------------*---------------*--------------------*-------------------*');
  writeln('|          Наименование товара          | Фирма изготовитель | Срок хранения |  Стоимость товара  | Количество товара |');
  writeln('*----------------------------------------*--------------------*---------------*--------------------*-------------------*');
for var k:=1 to g do //Сортировка
  writeln('|', work[k].Name:40,'|',work[k].Fir:20,'|', work[k].Srok:15, '|', work[k].Stoim:20, '|', work[k].Kol:19, '|');
  writeln('*----------------------------------------*--------------------*---------------*--------------------*-------------------*');
  close(users);//Закрываем файл.
    writeln('1 - Дальше. 2 - Выход');
  readln(n);
  if n=2 then halt(1);
  end;
Procedure Sort;  //Сортировка по возрастанию методом пузырька.
var
x:Tablica;
begin
error(i);
if i=999 then exit;
 for var i:=1 to g-1 do 
for var j:=i+1 to g do
 if work[i].name>work[j].name then
  begin
    x:=work[i];
    work[i]:=work[j];
    work[j]:=x;
  end;
 writeln('Применение возрастающей сортировки по количеству товара');
  writeln('*----------------------------------------*--------------------*---------------*--------------------*-------------------*');
  writeln('|          Наименование товара          | Фирма изготовитель | Срок хранения |  Стоимость товара  | Количество товара |');
  writeln('*----------------------------------------*--------------------*---------------*--------------------*-------------------*');
for var k:=1 to g do
with work[k] do
  writeln('|', work[k].Name:40,'|',work[k].Fir:20,'|', work[k].Srok:15, '|', work[k].Stoim:20, '|', work[k].Kol:19, '|');
  writeln('*----------------------------------------*--------------------*---------------*--------------------*-------------------*');
  close(users);//Закрываем файл.
    writeln('1 - Дальше. 2 - Выход');
  readln(n);
  if n=2 then halt(1);
end;
begin
repeat
clrscr;
writeln('Что делать?');
writeln('1 - Создавать базу данных.');
writeln('2 - Смотреть базу данных. ');
writeln('3 - Сортировка по количеству товара.');
writeln('4 - Выход.');
readln(n);
case n of
1:input;
2:OutputAllRec;
3:Sort;
end;
until (n=4);
halt(1);
end;
Begin
Readln;
end.

Не компилируется и выдаёт ошибку Встречено '.', а ожидалось ';' для последнего end. Если добавить begin end. то всё компилируется но не выполняется, а просто закрывается. Помогите найти ошибки. Я новичок в паскале. Пользуюсь если что Pascal ABC.net.

Vladimir_S 13.05.2018 22:18

Полную отладку, если потребуется, сделаю завтра, а пока попробуйте начать с исправления явных ошибок:
1. Readln из второй снизу строки поставьте ПЕРЕД until (n=4);
2. halt(1), Begin, который в третьей снизу строке, и end;, который в четвертой снизу строке, уберите СОВСЕМ.

SendiH 13.05.2018 22:34

Цитата:

Сообщение от Vladimir_S (Сообщение 2578898)
Полную отладку, если потребуется, сделаю завтра, а пока попробуйте начать с исправления явных ошибок:
1. Readln из второй снизу строки поставьте ПЕРЕД until (n=4);
2. halt(1), Begin, который в третьей снизу строке, и end;, который в четвертой снизу строке, уберите СОВСЕМ.

Здесь был выложен код уже с добавлением дополнительных begin и end без которых программа не компилируется,а выдаёт Встречено '.', а ожидалось ';'. Ваши исправления внесла,но ошибка осталась.

Vladimir_S 14.05.2018 20:00

Вот, попробуйте погонять. Ошибок, конечно, море, вроде причесал.
Код:

Uses CRT;

Const
 g=6;

Type
 Tablica=record
          Name:string[20]; //Название товара
          Fir:string[20]; //Фирма изготовитель
          Srok:integer; //Срок хранения
          Stoim:integer; // Стоимость товара
          Kol_nom:integer; //Заданное количество товара
          Kol:integer; //Фактическое количество на складе
        end;
var
 users:file of Tablica; // Сам файл
 work:array[1..g] of Tablica; //Массив записей для дальнейшей сортировки
 NewTabl:string[15]; // Имя файла
 i,j,k,n:integer;

Procedure Name_file_for_tabl; // Задаем имя файла
 begin
  write('Введите имя файла данных ');
  Readln(NewTabl);
 end;

Function Err:boolean; //Для ошибок связанных с отсутствием файла
 begin
  Assign(users,NewTabl);
  {$I-} //Проверка на то, что файл существует
  Reset(users);
  {$I+}
  if IOResult<>0 then
  begin
    Err:=TRUE;
    clrscr;
  end
  else
  begin
    Err:=FALSE;
    Close(users);
  end;
 end;

Procedure input; // Происходит ввод файла
 begin
  assign(users, NewTabl);
  rewrite(users); //Создаем новый файл или перезаписываем
  for k:= 1 to g do
    begin
    with work[k] do
      begin
      write('Введите наименование товара: ');
      readln(Name);
      write('Введите фирму изготовителя: ');
      readln (Fir);
      write('Введите срок хранения: ');
      readln(Srok);
      write('Введите стоимость товара: ');
      readln(Stoim);
      write('Введите заданное количество товара: ');
      readln(Kol_nom);
      write('Введите фактическое количество товара: ');
      readln(Kol);
      writeln;
      end;
    write(users,work[k]);
    end;
  close(users); //Закрываем файл.
 end;

Procedure Form_Work; //Чтение данных из файла в массив.
 begin
  if Err then
  begin
    Write('Файла с именем '+NewTabl+' на диске нет. Создать? Да - 1, Нет - 2 ');
    Readln(n);
    if n=1 then input;
  end
  else
  begin
    Reset(users);
    for k:=1 to g do Read(users,work[k]);
    Close(users);
  end;
 end;

procedure OutputAllRec(b:byte); //Выводит записи
// b=1 - все, b=2 - те, у которых фактическое количество не меньше заданного
 begin
  if Err then
  begin
    Write('Файла с именем '+NewTabl+' на диске нет. Создать? Да - 1, Нет - 2');
    Readln(n);
    if n=1 then input;
  end
  else
  begin
    if b=1 then Form_Work;
    writeln('*---------------------*--------------------*-------*-------*--------*---------*');
    writeln('| Наименование товара | Фирма изготовитель | Ср.хр.| Стоим.|Кол.ном.|Кол.факт.|');
    writeln('*---------------------*--------------------*-------*-------*--------*---------*');
    for k:=1 to g do //Вывод
    if b=2 then
      begin
      if work[k].Kol>=work[k].Kol_nom then
        writeln('|', work[k].Name:20,' |',work[k].Fir:20,'|', work[k].Srok:7, '|', work[k].Stoim:7, '|', work[k].Kol_nom:8, '|', work[k].Kol:9,'|');
      end
    else
      writeln('|', work[k].Name:20,' |',work[k].Fir:20,'|', work[k].Srok:7, '|', work[k].Stoim:7, '|', work[k].Kol_nom:8, '|', work[k].Kol:9,'|');
    writeln('*---------------------*--------------------*-------*-------*--------*---------*');
    Readln;
  end;
 end;

Procedure Sort;  //Сортировка по возрастанию методом пузырька.
 var
  x:Tablica;
 begin
  if Not Err then
  begin
    Form_work;
    for i:=1 to g-1 do
    for j:=1 to g-i do
      if work[j].Kol>work[j+1].Kol then
      begin
        x:=work[j];
        work[j]:=work[j+1];
        work[j+1]:=x;
      end;
    writeln('Применение возрастающей сортировки по количеству товара');
    OutputAllRec(2);
  end
  else
  begin
    Write('Файла с именем '+NewTabl+' на диске нет. Создать? Да - 1, Нет - 2 ');
    Readln(n);
    if n=1 then input;
  end;
 end;

Begin
 clrscr;
 Name_file_for_tabl; // Спрашиваем имя
 Repeat
  clrscr;
  writeln('Что делать?');
  writeln('1 - Создавать базу данных.');
  writeln('2 - Смотреть базу данных. ');
  writeln('3 - Сортировка по количеству товара.');
  writeln('4 - Выход.');
  readln(n);
  case n of
  1:input;
  2:OutputAllRec(1);
  3:Sort;
  end;
 Until (n=4);
end.


SendiH 15.05.2018 14:56

Спасибо огромное. Но почему-то по запросу сортировки мне так же выводит саму бд как и по второму запросу. И есть один вопрос. Для чего вы разбили количество товара на заданное и фактическое и чем они отличаются? Заранее простите за то,что надоедаю.

Vladimir_S 15.05.2018 19:31

Вложений: 2
Цитата:

Сообщение от SendiH (Сообщение 2579319)
Но почему-то по запросу сортировки мне так же выводит саму бд как и по второму запросу.

Мой косяк. Виноват. Исправил код программы. Попробуйте.
Вложение 417112
Вложение 417113
Цитата:

Сообщение от SendiH (Сообщение 2579319)
И есть один вопрос. Для чего вы разбили количество товара на заданное и фактическое и чем они отличаются?

Для того, что по условию задачи требуется
Цитата:

Сообщение от SendiH (Сообщение 2578893)
вывести список товаров, количество на складе которых не меньше заданного, отсортированный по возрастанию методом пузырька

Отсюда и необходимость сравнить "заданное" и фактическое количество товара.
Цитата:

Сообщение от SendiH (Сообщение 2579319)
Заранее простите за то,что надоедаю.

Ничего, пожалуйста, работа у нас такая. :)

Vladimir_S 15.05.2018 22:04

Цитата:

Сообщение от Vladimir_S (Сообщение 2579378)
Отсюда и необходимость сравнить "заданное" и фактическое количество товара.

Может быть, правда, я не так понял условие. Формулировка какая-то... мутноватая.

SendiH 16.05.2018 10:19

Ещё раз огромное вам спасибо

Vladimir_S 16.05.2018 11:49

Цитата:

Сообщение от SendiH (Сообщение 2579499)
Ещё раз огромное вам спасибо

Да не за что, обращайтесь, если что.


Часовой пояс GMT +4, время: 07:09.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.