Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.11.2017, 09:53   #1
kris14
Пользователь
 
Регистрация: 25.10.2017
Сообщений: 29
По умолчанию Работа с файлами

Здравствуйте. Было задание:
Багаж пассажира характеризуется количеством вещей и их общим весом. Дан файл bagazh, содержащий сведения о багаже нескольких пассажиров. Сведения о багаже каждого пассажира представляют собой записи с двумя полями:одно поле целого целого типа(количество вещей) и одно действительного(вес в килограммах). Выяснить, имеется ли пассажир, багаж которого состоит из одной вещи весом менее М кг.

Только начала работать с файлами. Написала такую программу, но вот в конце она проверяет только последнее и, например, выводит «нет», если последний не совпал с условием, даже если до этого совпадали. Хоть убей, не могу понять, как сделать так, чтобы она вывод делала по всему, а не только по последнему.

И я как бы просила пользователя вводить количество пассажиров, вещей и вес, а по сути в задании сказано, что это уже дано в файле. Не пойму, как потом из файла вытаскивать эти данные. Буду очень благодарна, если объясните!

Код:
var f: file of integer; 
i, n, kol, ves : integer; 
begin 
 WriteLn('Кол-во пассажиров: '); 
 ReadLn(n); 
 
Assign(f, 'D:\bagazh.txt'); 
 Rewrite(f); 
 
 for i:=1 to n do begin 
 writeln('Пассажир №', i); 
 write('Кол-во вещей: '); 
 readln(kol); 
 write('Общий вес: '); 
 readln(ves); 
 Write(f,n, kol, ves); 
end; 
 
 close(f); 
 
 begin 
 
 Reset(f); 
 
 for i:=1 to n do begin 
 if (kol=1) and (ves<30) then writeln('Такой пассажир имеется') 
 else 
 writeln('Такого пассажира нет'); 
end; 
Close(f); 
end; 
end.
Я понимаю, что спрашиваю глупые вопросы, простите, просто только начала работать с файлами, очень хочу разобраться, поэтому и задаю все вопросы, которые возникают, даже такие глупые.

Последний раз редактировалось kris14; 10.11.2017 в 09:55.
kris14 вне форума Ответить с цитированием
Старый 10.11.2017, 10:04   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от kris14 Посмотреть сообщение
Сведения о багаже каждого пассажира представляют собой записи с двумя полями:одно поле целого целого типа(количество вещей) и одно действительного(вес в килограммах).
Код:
type
  TBagazh = record
    kolvo: integer;
    ves: real;
  end;

var f : file of TBagazh;
  passagir : TBagazh;
  i : integer;

begin
  Assign(f, 'bagazh.dat');
  Reset(f);

  for i:=1 to FileSize(f) do begin
    Read(f, passagir);
    <что-то делаем с passagir>
  end;

  // либо можно читать в цикле до Not Eof(f)
  (* 
  while Not Eof(f) do begin
    Read(f, passagir);
    <что-то делаем с passagir>
  end;
 *)



  Close(f);
end.
p.s. такой файл называется "типизированный"

p.p.s. такой файл нужно создавать программно (и по другому никак).
Т.е. то, что он Вам дан, предполагает, что Вы сначала его с помощью своей программы создадите, заполните,
а потом, второй программой будете читать и производить обработку согласно вашему заданию.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 10.11.2017, 15:35   #3
kris14
Пользователь
 
Регистрация: 25.10.2017
Сообщений: 29
По умолчанию

Спасибо большое! А то я всю голову уже сломала над тем, как это сделать)

Последний раз редактировалось kris14; 10.11.2017 в 17:20.
kris14 вне форума Ответить с цитированием
Старый 10.11.2017, 15:41   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

пожалуйста.

Код для создания файла с данными самостоятельно напишете? или нужная помощь?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 10.11.2017, 17:15   #5
kris14
Пользователь
 
Регистрация: 25.10.2017
Сообщений: 29
По умолчанию

А как у меня выше не подойдёт? В нем я прошу пользователя выбрать данные) и я так поняла, что с помощью rewrite эти данные автоматически записываются в файл... если нет, то буду признательна, если объясните, в чем ошибка и как лучше сделать)

Последний раз редактировалось kris14; 10.11.2017 в 17:20.
kris14 вне форума Ответить с цитированием
Старый 10.11.2017, 22:04   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от kris14 Посмотреть сообщение
если объясните, в чем ошибка
Цитата:
Сообщение от kris14 Посмотреть сообщение
Сведения о багаже каждого пассажира представляют собой записи с двумя полями:одно поле целого целого типа(количество вещей) и одно действительного(вес в килограммах).
1) Слово "записи" в задании видите? У Вас в коде они есть? это первая ошибка.
2) поле "вес в килограммах" должно быть действительного типа. У Вас целого. это вторая ошибка.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 15.11.2017, 16:35   #7
kris14
Пользователь
 
Регистрация: 25.10.2017
Сообщений: 29
По умолчанию

Код:
type
    TBagazh = record
     kolvo: integer;
      ves: real;
    end;
 
var
   f : file of TBagazh;
    passagir : TBagazh;
     i: integer;
 
begin
  Assign(f, 'bagazh.txt');
  Reset(f);                           //вот здесь ошибка

  for i:=1 to FileSize(f) do begin
    Read(f, passagir);
     with passagir do begin
      writeln('Пассажир №', i); 
       write('Кол-во вещей: '); 
         readln(kolvo); 
          write('Общий вес: '); 
           readln(ves); 
   end;
        Write(f,passagir); 
   
   
  end;
  Close(f);
end.
Так?
Но вылезает ошибка "параметр цикла for должен описываться в заголовке"
kris14 вне форума Ответить с цитированием
Старый 15.11.2017, 16:51   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от kris14 Посмотреть сообщение
Assign(f, 'bagazh.txt');
это НЕ ТЕКСТОВЫЙ файл. Зачем Вы ему расширение TXT даёте?
но расширение это ещё полбеды. Судя по Reset(f) Вы ему какой-то левый файл пытаетесь подсунуть! А вот это уже баг и косяк. Поэтому там и ошибка.

если Вы хотите создать файл, вводя данные с клавиатуры, это можно сделать так:
Код:
type
    TBagazh = record
     kolvo: integer;
      ves: real;
    end;
 
var
   f : file of TBagazh;
    passagir : TBagazh;
     N: integer;
 
begin
  WriteLn('Сколько записей(пассажиров) будет в файле bagazh.dat ?');
  ReadLn(n);

  Assign(f, 'bagazh.dat');
  Rewrite(f);           

  for var i:=1 to N do begin
     writeln('Пассажир №', i); 
     with passagir do begin
       write('Кол-во вещей: '); 
         readln(kolvo); 
          write('Общий вес: '); 
         readln(ves); 
     end;
     Write(f,passagir); 
  end;
  Close(f);
  WriteLn('файл bagazh.dat создан!');
end.

Цитата:
Сообщение от kris14 Посмотреть сообщение
вылезает ошибка "параметр цикла for должен описываться в заголовке"
Это не ошибка, это предупреждение. Это ваш монстро-уродец Pascal ABC.NET ругается на то, что в FOR используется нормальная переменная.
я написал в примере так, как ему хочется.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 15.11.2017, 17:04   #9
kris14
Пользователь
 
Регистрация: 25.10.2017
Сообщений: 29
По умолчанию

Все, поняла, спасибо!

Код:
type
    TBagazh = record
     kolvo: integer;
      ves: real;
    end;
 
var
   f : file of TBagazh;
    passagir : TBagazh;
     N, k, i: integer;
 
begin
  WriteLn('Сколько записей(пассажиров) будет в файле bagazh.dat ?');
  ReadLn(n);

  Assign(f, 'bagazh.dat');
  Rewrite(f);           

  for i:=1 to N do begin
     writeln('Пассажир №', i); 
     with passagir do begin
       write('Кол-во вещей: '); 
         readln(kolvo); 
          write('Общий вес: '); 
         readln(ves); 
     end;
     Write(f,passagir); 
  end;
  Close(f);
  begin 
 
 Reset(f); 
 k:=0;
 for i:=1 to n do begin 
 if (passagir.kolvo=1) and (passagir.ves<30) then INC(k);
 if k>0 then writeln('Такой пассажир имеется')
 else 
 writeln('Такого пассажира нет'); 
end; 
Close(f); 
end;
end.
В итоге вот, что получилось, но программа опять-таки делает вывод только по последнему значению(
kris14 вне форума Ответить с цитированием
Старый 15.11.2017, 17:44   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от kris14 Посмотреть сообщение
спасибо
пожалуйста.


Цитата:
Сообщение от kris14 Посмотреть сообщение
Все, поняла
нет. не правильно поняли.

не нужно каждый раз переписывать файл заново.
нужно ДВЕ ОТДЕЛЬНЫЕ программы.

одна из пост #8 - исключительно для создания типизированного файла с записями.

вторая - которая решает поставленную задачу, исходя из условия задания
Цитата:
Сообщение от kris14 Посмотреть сообщение
Дан файл bagazh

Цитата:
Сообщение от kris14 Посмотреть сообщение
Выяснить, имеется ли пассажир, багаж которого состоит из одной вещи весом менее М кг.
Код:
type
    TBagazh = record
     kolvo: integer;
      ves: real;
    end;
 
var
   f : file of TBagazh;
   passagir : TBagazh;
   M:real;
   count:integer;
 
begin
  WriteLn('Введите вес M для поиска пассажира с одной вещью весом менее M:');
  ReadLn(M);

  Assign(f, 'bagazh.dat');
  Reset(f);           

  count:=0;
  for i:=1 to FileSize(f) do begin
     Read(f,passagir);
     if (passagir.kolvo=1) and (passagir.ves<M) then begin
      Inc(count);
      WriteLn('Пассажир №',i,' имеет 1 вещь весом ',passagir.ves:0:3,' кг.');
     end;
  end;
  Close(f);

  if count>0 
  then writeln('Такой пассажир имеется')
  else writeln('Такого пассажира нет'); 

end.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Лабораторная работа(очень простая) Структуры, работа с файлами yurda Фриланс 2 11.06.2016 08:44
Работа с файлами: запись, добавление, чтение (найти ошибку в коде) / C для начинающих Надо создать программу для работы с файлами Konlor Общие вопросы C/C++ 2 18.05.2014 12:37
работа с файлами Diana528 Общие вопросы C/C++ 11 04.11.2013 11:07
Работа с файлами Jalced Паскаль, Turbo Pascal, PascalABC.NET 5 30.11.2011 21:52
Работа с файлами. Pascaler Помощь студентам 6 13.05.2010 10:23