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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.12.2008, 00:41   #1
Андрю)(@
Пользователь
 
Регистрация: 07.11.2008
Сообщений: 23
По умолчанию Помогите имправить задачку в паскале

Тема: "Записи и типизированные файлы"
Смысл задачи такой, что в первой процедуре, спаршивается сколько пассажиров всего, далее идёт ввод пассажиров с параметрами (фамилия, инициалы, кол-во вещей, общий вес вещей), все введённые данные записываются в файл. Также в первой процедуре ведётся подсчёт "Среднего веса одной вещи всех пассажиров". Одним словом первая процедура работает НА УРА и правильно считает если вводить такие вот записи:
Три пассажира
petrov s.s. 12 60
kozlov k.k. 15 43
sidorov v.v. 9 7.
Основная формула, которая используется во второй процедуре
ABS(R-An.ves/An.kolvo)
R-это средний вес одной вещи всех пассажиров;
An.ves-вес вещей одного пассажира;
An.kolvo - количество вещей одного пассажира.
Весь гемор начинается во второй процедуре во первых тоже самое среднее значение считается не правильно. Во вторых не удаётся посчитать "Средний вес вещи одного пассажира".
Необходимо при запуске пргоги нажать '1' заполнить файл данными, при нажатии цифры '2' должно произвестись решение этой задачи, при использовании этих пассажиров на экран должно вывестись
kozlov k.k. 15 43
sidorov v.v. 9 7.
При повторных запусках программы необходимо нажатием '2' вывести решение, Это для меня самый боольшой гемор...
Может кто-нибудь может помочь в дополнении этих недочётов..
Вот сама програмка:
Код:
Program 888;
USES Crt;
Type
 H=Record
  familia, initials:string[10];
  kolvo:integer;
  ves:integer;
  end;
  Spis=file of H;
  Var
  Spi:Spis;
  An:H;
  I,N,M:integer;
  F:real;
  T:real;
  G:real;
  R:real;
  W:real;
  c:char;
Procedure menu;
Begin
Writeln('┌────────────────────────┐');
Writeln('│1.Заполнить файл данными                         │');
Writeln('├────────────────────────┤');
Writeln('│2.Нахождение пассажира                           │');
Writeln('├────────────────────────┤');
Writeln('│3.Выход                                                    │');
Writeln('└────────────────────────┘');
End;
Procedure proc1;
Begin
 F:=0;
 G:=0;
 Assign(Spi,'D:\MYFILE.DAT');
 Rewrite(Spi);
 Writeln('Введите количество пассажиров');
 Readln(N);
 For I:=1 to N do
  Begin
  With An do
  Begin
  Writeln('Введите фамилию пассажира');
  Readln(familia);
  Writeln('Введите инициалы пассажира');
  Readln(initials);
  Writeln('Введите количество вещей пассажира');
  Readln(kolvo);
  Writeln('Введите вес вещей пассажира');
  Readln(ves);
  Writeln(' ');
  begin
  F:=F+kolvo;
  G:=G+ves;
  end;
  end;
  write(Spi,An);
  end;
  begin
   R:=G/F;
  Writeln('Средний вес одной вещи всех пассажиров',R);
  end;
  Close(Spi);
End;
Procedure proc2;
Begin
Assign(Spi,'D:\MYFILE.DAT');
Reset(Spi);
begin
F:=0;
G:=0;
For I:=1 to N do
 begin
 F:=F+An.kolvo;
 G:=G+An.ves;
 end;
 R:=G/F;
Writeln('Средний вес одной вещи всех пассажиров',R);
For I:=1 to N do
 begin
 Reset(Spi);
 begin
 With An do
 begin
 If ABS(R-(An.ves/An.kolvo))<0.3 then
  Writeln(An.familia,' ',An.initials,' ',An.kolvo,' ',An.ves)
 end;
end;
end;
end;
end;
begin
ClrScr;
Repeat
menu;
c:=readkey;
case c of
'1':proc1;
'2':proc2;
else writeln ('Ошибка');
end;
  until (c=#27) or (c='3');
end.

Последний раз редактировалось Андрю)(@; 06.12.2008 в 01:08.
Андрю)(@ вне форума Ответить с цитированием
Старый 06.12.2008, 09:13   #2
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Напиши точное условие задачи без своих комментариев, где что делать. Ты столько наворотил лишнего, что разобраться уже не представляется возможным.
Вот пока переделал начало и первую процедуру.
Код:
Program aaaa; //интересно как у тебя запускается программа с именем 888?
USES Crt;
Type H=Record
       fio:string[10];
       kol:byte;
       ves:integer;
       sr:real;  //средний вес вещей пассажира делаем полем
       end;
     mas=array[1..100] of H; //массив записей, иначе как будешь хранить записи
     Spis=file of H; //тип файла для передачи в процедуры
var f:Spis;
    sp:mas;  //здесь еще буду разбираться и лишнее выкидывать
    I,N,M:integer;
    T,G,R,W:real;
    c:char;
Procedure menu;
Begin
Writeln('-------------------------м');
Writeln('|1.Заполнить файл данными                         |');
Writeln('+------------------------+');
Writeln('|2.Нахождение пассажира                           |');
Writeln('+------------------------+');
Writeln('|3.Выход                                                    |');
Writeln('L-------------------------');
End;
Procedure proc1(n:integer;var An:mas;var Spi:Spis);//входные параметры размер массива, сам массив, выходной параметр-файл
Begin
 Assign(Spi,'MYFILE.DAT');
 Rewrite(Spi);
 Writeln('Введите количество пассажиров:');
 Readln(N);
 For I:=1 to N do
  Begin
    With An[i] do //обязательно запись с номером An[i]
      Begin
        Writeln('Пассажир ',i);
        write('Введите фамилию и инициалы пассажира: ');Readln(fio);
        Write('Количество вещей: ');Readln(kol);
        Write('Вес вещей: ');Readln(ves);
        sr:=ves/kol; //сразу считаем средний вес вещей одного пассажира
      end;
    write(Spi,An[i]);//заносим запись в файл
  end;
Close(Spi);
End;
Дальше надо разбираться. Короче будет условие, помогу.
puporev вне форума Ответить с цитированием
Старый 06.12.2008, 12:09   #3
Андрю)(@
Пользователь
 
Регистрация: 07.11.2008
Сообщений: 23
Стрелка

Условие такое:
Создать файл, содержащий информацию о багаже пассажиров (фамилию, инициалы, количество вещей, общий вес вещей): найти пассажиров средний вес одной вещи которых отличается не более чем на 0.3 кг от общего среднего веса одной вещи.
А по желанию препода:
1)Нельзя пользоваться массивом (но с того момента как я его выкинул из проги пошли все беды...);
2) Необходимо, чтобы в первой процедуре запрашивал число пассажиров с их данными;
3) При следующем запуске программы, процедуру '1' не вызывать, а сразу вызывать процедуру '2' и должно всё считываться из существующего файла и работать.
4) Ну и конечно обязательно чтобы было в виде меню.

Последний раз редактировалось Андрю)(@; 06.12.2008 в 12:11.
Андрю)(@ вне форума Ответить с цитированием
Старый 06.12.2008, 12:14   #4
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Да, это посложнее чем я думал, тут действительно придется шариться по типизированному файлу напрямую, без масива.
puporev вне форума Ответить с цитированием
Старый 06.12.2008, 14:01   #5
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Вот поправил твою программу, повыкидывал лишнее, сейчас работает.
Код:
Program aaaa;
USES Crt;
Type H=Record
       fio:string[10]; //объединил фамилию и и инициалы, это не важно
       kol:byte;
       ves:integer;
       sr:real;  //средний вес у каждого делаем полем
       end;
     Spis=file of H;
var An:H;
    Spi:Spis;
    I,N:integer;
    G:real;  //средний вес вещи по всему списку
    c:char;
Procedure menu;
Begin
Writeln('1.Заполнить файл данными');
Writeln('2.Нахождение пассажиров');
Writeln('3.Выход');
End;
Procedure proc1;
Begin
 Assign(Spi,'MYFILE.DAT');
 Rewrite(Spi);
 Writeln('Введите количество пассажиров:');
 Readln(N);
 For I:=0 to N-1 do //счет в типизированных файлах от ноля, 
  Begin
    With An do
      Begin
        Writeln('Пассажир ',i);
        write('Введите фамилию и инициалы пассажира: ');Readln(fio);
        Write('Количество вещей: ');Readln(kol);
        Write('Вес вещей: ');Readln(ves);
        sr:=ves/kol;
      end;
    write(Spi,An);
  end;
Close(Spi);
End;
Procedure proc2;
Begin
Assign(Spi,'MYFILE.DAT');
Reset(Spi);
G:=0;
For I:=0 to FileSize(Spi)-1 do  // FileSize(Spi)-количество записей
  begin
   read(spi,An);  //читаем запись
   G:=G+An.sr/n; //к общему среднему весу прибавляем средний вес каждого, деленный на n
  end;
Seek(Spi,0); //возвращаемся в начало файла
Writeln('Список пассажиров, средний вес одной вещи отл. от ср. на 0.3 кг:');
For I:=0 to FileSize(Spi)-1 do
  begin
   read(spi,An); //читаем запись
   If ABS(G-An.sr)<=0.3 then //если не превышает
   Writeln(An.fio,'  ',An.kol,' ',An.ves);  //выводим на экран
  end;
end;
begin
ClrScr;
Repeat
menu;
c:=readkey;
case c of
'1':proc1;
'2':proc2;
else writeln ('Выход');
end;
  until (c=#27) or (c='3');
  readln
end.
puporev вне форума Ответить с цитированием
Старый 06.12.2008, 16:19   #6
Андрю)(@
Пользователь
 
Регистрация: 07.11.2008
Сообщений: 23
По умолчанию

Спасибо огромное теперь она правильно работает.
Такой ещё вопросик, как можно связать '1' процедуру и '2', что было, например, запустил прогу всё выполнил, он показал мне результат. А уже приследующем запуске этой проги, не вызывая процедуры '1', сразу вызвать процедуру '2' и получить тот же самый результат.
Андрю)(@ вне форума Ответить с цитированием
Старый 06.12.2008, 16:33   #7
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Код:
G:=0;
For I:=0 to FileSize(Spi)-1 do
  begin
   read(spi,An);
   G:=G+An.sr/FileSize(Spi); {перепиши эту строку(вместо n FileSize(Spi)) и программа будет работать с пункта 2}
  end;
puporev вне форума Ответить с цитированием
Старый 06.12.2008, 18:58   #8
Андрю)(@
Пользователь
 
Регистрация: 07.11.2008
Сообщений: 23
По умолчанию

puporev, огромное спасибо!!! теперь всё отлично!!!
Андрю)(@ вне форума Ответить с цитированием
Старый 06.12.2008, 20:31   #9
Андрю)(@
Пользователь
 
Регистрация: 07.11.2008
Сообщений: 23
По умолчанию

А With An do как обозначается в блоксхеме??
Также, как и FOR?
Андрю)(@ вне форума Ответить с цитированием
Старый 07.12.2008, 02:23   #10
slips
Форумчанин
 
Аватар для slips
 
Регистрация: 28.10.2008
Сообщений: 350
Радость

Цитата:
Сообщение от Андрю)(@ Посмотреть сообщение
А With An do как обозначается в блоксхеме??
Также, как и FOR?
Никак это всего ли упрощенная форма
slips вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите решить интересную математическую задачку на Паскале. skl1f Помощь студентам 9 04.12.2008 01:10
ПОМОГИТЕ ПРОВЕРИТЬ ЗАДАЧКУ НА ПАСКАЛЕ!Матрица,2-Х мерный массив! vdv08 Помощь студентам 6 23.09.2008 13:13
Помогите Помогите Пожалуйста Решить Одну Задачку в Паскале!!! VisTBacK Помощь студентам 6 19.09.2008 13:44
Помогите решить задачку на строки в Паскале. TakeR Помощь студентам 8 26.12.2007 00:09