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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.11.2013, 00:35   #1
mishammm
Форумчанин
 
Регистрация: 21.09.2013
Сообщений: 232
По умолчанию вложенные записи в паскаль

помогите плиз решить задачку (на картинке, задание 11.2 2 вариант). Перевод:
Нужно написать программу с помощью иерархических записей которая обеспечивает ввод информации и вывод в виде таблицы. Найти заработную плату военнообязаных мужчин
Вот моя ахинея

Код:
program k_11_2;
type anketa =record
surname:string[20];
rik_n:word;
adres:string[30];
case ozn:integer of
1 :(voenniy:Boolean,zarplata:real);
2 :(num_children:integer,zamij:Boolean,zarplata:real);
end;
var a:array[1..5] of anketa;
procedure lin(m:integer);
var 
i:integer;
begin
for i:=1 to m do 
write('-');
writeln;
end;
for i:=1 to 5 do begin
writeln('vvedi dannie');
readln(a[i].surname , a[i].rik_n , a[i].adres, a[i].ozn.voenniy , a[i].ozn.zarplata , a[i].ozn.num_children , a[i].ozn.zarplata);
end;
Line(80);
writeln('| Фамилия | Год рождения| Адрес|Пол| Военный|Зарплата |');
Line(80);
for i:=1 to 5 do
begin
if sp[i].ozn=1 then
begin
writeln('| ',a[i].surname:13,'| ',a[i].rik_n:8,' | ',a[i].adres:19,'|',a[i].ozn:3,' |',a[i].viisk:10,'|',
a[i].zarplata:7:0,' |');
Line(80);
if ... // как записать условие хз
end;
end;
writeln;
Line(80);
writeln('| Фамилия| Год рождения|Адрес|Замужем|Количество детей| Зарплата |');
Line(80);
for i:=1 to 5 do
begin
if sp[i].ozn=2 then
begin
writeln('| ',a[i].surname:14,'| ',a[i].rik_n:8,' | ',a[i].adres:19,'|',a[i].zamij:5,'|',a[i].num_children:5,' |',
a[i].zarplata:7:0,' |');
Line(80);
end;
end;
дальше не знаю как с моми условием быть, помогите плиз дописать
Изображения
Тип файла: jpg 111111111111111111111111111.jpg (117.6 Кб, 129 просмотров)

Последний раз редактировалось mishammm; 26.11.2013 в 01:48.
mishammm вне форума Ответить с цитированием
Старый 26.11.2013, 07:50   #2
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

Ты написал условие, но что это за условие непонятно. Какое условие нужно выразить?
Если помог, проси поставить минус. Будь оригинален!
Rin вне форума Ответить с цитированием
Старый 26.11.2013, 10:44   #3
mishammm
Форумчанин
 
Регистрация: 21.09.2013
Сообщений: 232
По умолчанию

Нужно найти зарплату военнообязаных мужчин
mishammm вне форума Ответить с цитированием
Старый 26.11.2013, 11:02   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

давайте начнём с начала.
Вам нужны вложенные записи или записи с вариантами (с вариантной частью) ?
Вы описали запись именно с вариантной частью.
Но используете её НЕВЕРНО. дело в том, что запись с вариантной частью может хранить данные одного из вариантов (физически место в записи отводится одно, определяется по наибольшей длине ветки). Вы же пытаетесь использовать одновременно обе ветки. Так не выйдет!
Но, с учётом того, что, возможно, Вам вообще запись с вариантами не нужна, может быть, это и не стоит исправлять?!
прочитал внимательно текст задания на рисунке. Нужна Вам вариантная запись.
И определять. какие поля заполнять нужно исходя из пола ("мужчина" или "женщина")!

хотя задание, конечно, за уши притянутое и кривопоставленное! Но это уж не ваша вина!



UPDATE
если до 13-00 по МСК не справитесь с заданием самостоятельно (или никто раньше не поможет), я выкрою время и обязательно попытаюсь Вам помочь!

Последний раз редактировалось Serge_Bliznykov; 26.11.2013 в 11:10.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 26.11.2013, 11:10   #5
mishammm
Форумчанин
 
Регистрация: 21.09.2013
Сообщений: 232
По умолчанию

киньте пожалуйста код сегодня уже здавать (( я это непрошарил ( мне до обеда желательно бы. в универе зайду в инет! буду вас очень признателен
mishammm вне форума Ответить с цитированием
Старый 26.11.2013, 12:04   #6
Unique_Maks
Пользователь
 
Регистрация: 07.06.2010
Сообщений: 89
По умолчанию

а что вот это такое:
Код:
case ozn:integer of
1 :(voenniy:Boolean,zarplata:real);
2 :(num_children:integer,zamij:Boolean,zarplata:real);
end;
Unique_Maks вне форума Ответить с цитированием
Старый 26.11.2013, 13:10   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

вот, ловите код в первом приближении...
Код:
program k_11_2;
type
 anketa = record
    surname: string[20];
    rik_n: word;
    adres: string[30];
    case ozn:integer of
      1: (voenniy: Boolean; zarplataM: real);
      2: (num_children: integer; zamij: Boolean; zarplataJ: real);
  end;
var
  a: array[1..5] of anketa;
  i : integer;
  pol : integer;
  k   : integer;

procedure Line(m: integer);
var
  i: integer;
begin
  for i := 1 to m do
    write('-');
  writeln;
end;

begin
  for i := 1 to 5 do begin
    writeln('vvedi dannie:');
    Write('Name: '); readln(a[i].surname);
    Write('Year of birthdate: '); readln(a[i].rik_n);
    Write('Adress: '); readln(a[i].adres);
    repeat
       Write('Pol (1 == muzchina; 2== jenshina): ');
       Readln(Pol);
    until (Pol=1) or (Pol=2);
    a[i].ozn := Pol;
    if a[i].ozn=1 then begin
       repeat
         Write('Is military ? (0/1): '); readLn(k);
       until (k=0) or (k=1);
       a[i].voenniy := (k=1);
       Write('salary :'); readln(a[i].zarplataM);
    end
    else begin
       Write('Number of children :'); Readln(a[i].num_children);
       repeat
         Write('Is married ? (0/1): '); readLn(k);
       until (k=0) or (k=1);
       a[i].zamij := (k=1);
       Write('salary :'); readln(a[i].zarplataJ);
    end;
end;

{сначала выведем ВСЕ записи в виде таблицы}
Line(80);
writeln('| Фамилия     |Год рожд.|          Адрес           |Пол| дополнительные поля');
Line(80);
for i := 1 to 5 do
begin
  if a[i].ozn=1 then
    writeln('| ', a[i].surname: 13, '| ', a[i].rik_n: 6, ' | ', a[i].adres: 19, '|', 'Муж','|',
       a[i].voenniy: 7, ' |', a[i].zarplataM:7:2, '|')
  else
    writeln('| ', a[i].surname: 13, '| ', a[i].rik_n: 6, ' | ', a[i].adres: 19, '|', 'Жен','|',
       a[i].zamij: 7, ' |', a[i].zarplataJ:7:2, '|');
end;
Line(80);

WriteLn;
WriteLn('Press enter to continue...');
Readln;


Line(80);
writeln('| Фамилия     |Год рожд.|          Адрес           | Пол |Военный|Зарплата |');
Line(80);
for i := 1 to 5 do
begin
  if (a[i].ozn = 1) {если мужчина} and (a[i].voenniy) {и военный}  then
  begin
    writeln('| ', a[i].surname: 13, '| ', a[i].rik_n: 6, ' | ', a[i].adres: 19, '| Муж |',
       a[i].voenniy, ' |', a[i].zarplataM:7:2, '|');
  end;
end;
Line(80);
WriteLn;
Readln;

end.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 26.11.2013, 13:33   #8
mishammm
Форумчанин
 
Регистрация: 21.09.2013
Сообщений: 232
По умолчанию

спасибо наверно прийдеться компилировать в turbo pascal ! ABC не понимает case благодарю выручили меня
mishammm вне форума Ответить с цитированием
Старый 26.11.2013, 15:20   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от mishammm Посмотреть сообщение
спасибо наверно прийдеться компилировать в turbo pascal ! ABC не понимает case благодарю выручили меня
пожалуйста.

Да, Pascal ABC не понимает записи с вариантами!
я свой код в TurboPascal проверял, там работает.

кстати, рекомендую один раз запомнить записи в файл, потом уже использовать их. Ибо каждый раз вводить кучу информации - это задача не для ленивых.

чтобы обеспечить работу с файлом можно дописать примерно такой код (для TurboPascal):
Код:
......
procedure Line(m: integer);
var
  i: integer;
begin
  for i := 1 to m do
    write('-');
  writeln;
end;

var f: file of anketa;
begin
  Assign(f, 'anket1.dat');

{$I-} {отключили обработку ошибок Паскалем, взяли на себя}
  Reset(f); {попытались открыть файл}
{$I+}

  if IOResult <> 0 then {не нашли нужного файла, тогда создаём его!}
  begin
    rewrite(f);
    for i := 1 to 5 do begin
      writeln('vvedi dannie:');
      Write('Name: '); readln(a[i].surname);
      Write('Year of birthdate: '); readln(a[i].rik_n);
      Write('Adress: '); readln(a[i].adres);
      repeat
        Write('Pol (1 == muzchina; 2== jenshina): ');
        Readln(Pol);
      until (Pol = 1) or (Pol = 2);
      a[i].ozn := Pol;
      if a[i].ozn = 1 then begin
        repeat
          Write('Is military ? (0/1): '); readLn(k);
        until (k = 0) or (k = 1);
        a[i].voenniy := (k = 1);
        Write('salary :'); readln(a[i].zarplataM);
      end
      else begin
        Write('Number of children :'); Readln(a[i].num_children);
        repeat
          Write('Is married ? (0/1): '); readLn(k);
        until (k = 0) or (k = 1);
        a[i].zamij := (k = 1);
        Write('salary :'); readln(a[i].zarplataJ);
      end;
      Write(f, a[i]);
    end;
    close(f);
  end
  else begin
    for i := 1 to 5 do Read(f, a[i]);
    Close(f);
  end;

{сначала выведем ВСЕ записи в виде таблицы}....
Serge_Bliznykov вне форума Ответить с цитированием
Старый 26.11.2013, 19:43   #10
mishammm
Форумчанин
 
Регистрация: 21.09.2013
Сообщений: 232
По умолчанию

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

Да, Pascal ABC не понимает записи с вариантами!
я свой код в TurboPascal проверял, там работает.

кстати, рекомендую один раз запомнить записи в файл, потом уже использовать их. Ибо каждый раз вводить кучу информации - это задача не для ленивых.

чтобы обеспечить работу с файлом можно дописать примерно такой код (для TurboPascal):
Код:
......
procedure Line(m: integer);
var
  i: integer;
begin
  for i := 1 to m do
    write('-');
  writeln;
end;

var f: file of anketa;
begin
  Assign(f, 'anket1.dat');

{$I-} {отключили обработку ошибок Паскалем, взяли на себя}
  Reset(f); {попытались открыть файл}
{$I+}

  if IOResult <> 0 then {не нашли нужного файла, тогда создаём его!}
  begin
    rewrite(f);
    for i := 1 to 5 do begin
      writeln('vvedi dannie:');
      Write('Name: '); readln(a[i].surname);
      Write('Year of birthdate: '); readln(a[i].rik_n);
      Write('Adress: '); readln(a[i].adres);
      repeat
        Write('Pol (1 == muzchina; 2== jenshina): ');
        Readln(Pol);
      until (Pol = 1) or (Pol = 2);
      a[i].ozn := Pol;
      if a[i].ozn = 1 then begin
        repeat
          Write('Is military ? (0/1): '); readLn(k);
        until (k = 0) or (k = 1);
        a[i].voenniy := (k = 1);
        Write('salary :'); readln(a[i].zarplataM);
      end
      else begin
        Write('Number of children :'); Readln(a[i].num_children);
        repeat
          Write('Is married ? (0/1): '); readLn(k);
        until (k = 0) or (k = 1);
        a[i].zamij := (k = 1);
        Write('salary :'); readln(a[i].zarplataJ);
      end;
      Write(f, a[i]);
    end;
    close(f);
  end
  else begin
    for i := 1 to 5 do Read(f, a[i]);
    Close(f);
  end;

{сначала выведем ВСЕ записи в виде таблицы}....
препод проверил сказала для женщины не выводит инфорамацию (жената ли и количество детей) )))
mishammm вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вложенные функции kilogram PHP 7 03.04.2012 17:32
Вложенные циклы voron86618 Паскаль, Turbo Pascal, PascalABC.NET 1 26.12.2011 18:55
Вложенные операторы if Just Be Общие вопросы C/C++ 18 26.07.2011 22:05
вложенные циклы. pyzhov Помощь студентам 1 12.12.2010 18:04
Вложенные подзапросы FACE OFF Помощь студентам 2 04.11.2010 12:53