• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Необходимо ввести и сохранить в файле данные следующей структуры

  • Автор темы Автор темы SendiH
  • Дата начала Дата начала

SendiH

Ученик
Регистрация
13 Май 2018
Сообщения
4
Реакции
0
Баллы
0
Необходимо ввести и сохранить в файле данные следующей структуры

Ввести и сохранить в файле данные следующей структуры:
наименование товара, фирма изготовитель, срок хранения, стоимость товара,
количество на складе. Организовать просмотр исходных данных и вывести
список товаров, количество на складе которых не меньше заданного,
отсортированный по возрастанию методом пузырька, с указанием срока
хранения и стоимости.
Ввод и вывод данных организовать в виде таблиц. Отладку программы
производить на примере файла, состоящего не менее чем из 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.
 
Полную отладку, если потребуется, сделаю завтра, а пока попробуйте начать с исправления явных ошибок:
1. Readln из второй снизу строки поставьте ПЕРЕД until (n=4);
2. halt(1), Begin, который в третьей снизу строке, и end;, который в четвертой снизу строке, уберите СОВСЕМ.
 
Полную отладку, если потребуется, сделаю завтра, а пока попробуйте начать с исправления явных ошибок:
1. Readln из второй снизу строки поставьте ПЕРЕД until (n=4);
2. halt(1), Begin, который в третьей снизу строке, и end;, который в четвертой снизу строке, уберите СОВСЕМ.

Здесь был выложен код уже с добавлением дополнительных begin и end без которых программа не компилируется,а выдаёт Встречено '.', а ожидалось ';'. Ваши исправления внесла,но ошибка осталась.
 
Вот, попробуйте погонять. Ошибок, конечно, море, вроде причесал.
Код:
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.
 
Спасибо огромное. Но почему-то по запросу сортировки мне так же выводит саму бд как и по второму запросу. И есть один вопрос. Для чего вы разбили количество товара на заданное и фактическое и чем они отличаются? Заранее простите за то,что надоедаю.
 
Но почему-то по запросу сортировки мне так же выводит саму бд как и по второму запросу.
Мой косяк. Виноват. Исправил код программы. Попробуйте.
SENDIH01.webp
SENDIH03.webp
И есть один вопрос. Для чего вы разбили количество товара на заданное и фактическое и чем они отличаются?
Для того, что по условию задачи требуется
вывести список товаров, количество на складе которых не меньше заданного, отсортированный по возрастанию методом пузырька
Отсюда и необходимость сравнить "заданное" и фактическое количество товара.
Заранее простите за то,что надоедаю.
Ничего, пожалуйста, работа у нас такая. :)
 
Ещё раз огромное вам спасибо
 
Назад
Сверху