1 Востаннє редагувалося Odin88 (05.10.2013 19:04:44)

Тема: Записи в Pascal(Record)

Завдання:
Ввести інформацію про групу студентів(прізвище,ініціали,набір предметів).
Набір предметів це масив який містить інформацію про назву предмету та оцінку(лише одну) з даного предмету.
Кожен учень може містити різну кількість предметів.
Вивести на екран табличку з інформацією про студентів,предметів які вони вивчають,та оцінку з кожного предмету.

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;
type
  Subject=record
    NofS:string; //name of the subject(предмет)
    ANote:real; //mark(оцінка)
  end;
  Student=record
  SName:string;     //(прізвише студента)
  Initials:string; //(П.І.Б)
  Sub:array[1..10] of subject;//(предмет,який вивчає даний студент)
  end;
var
  S:array[1..25] of student;
  n,i:integer;

begin
Write('Enter count of students=');//(кількість студентів)
Readln(n);
for i := 1 to n  do//(цикл введення даних)
   begin
    write('Student ',i,' has surname= ');
    readln(S[i].SName);
    write('initials of the ',S[i].SName,'= ');
    readln(S[i].Initials);
    Write(S[i].SName,' Studying subject= ');
     readln(S[i].Sub[i].NofS);
     Write(' and has the following marks=');
    readln(S[i].Sub[i].ANote);
    end;
for i := 1 to n  do//(цикл виведення даних)
  begin
  with S[i] do
    writeln(Sname,' ',Initials,' ',Sub[i].NofS,' ',Sub[i].ANote:0:2);
end;
readln;
readln;
end. 

Проблема:
Як кожному студенту надати певну кількість предметів.
Пробував ввести цикл:

begin
Write('Enter count of students');//(кількість студентів)
Readln(n);
for i := 1 to n  do//(цикл введення даних)
   begin
    write('Student ',i,' has surname= ');
    readln(S[i].SName);
    write('initials of the ',S[i].SName,'= ');
    readln(S[i].Initials);
    Writeln('Count of subjects=');
    Readln(a); for b :=1 to a do
                 begin

    Write(S[i].SName,' Studying subject= ');
     readln(S[i].Sub[i].NofS);
     Write(' and has the following marks=');
    readln(S[i].Sub[i].ANote);
    end;
   end;
for i := 1 to n  do//(цикл виведення даних)
  begin
  with S[i] do
    writeln(Sname,' ',Initials,' ',Sub[i].NofS,' ',Sub[i].ANote:0:2);
end;
readln;
readln;
end.

Але програма запам'ятовує лише останній предмет.
Дякую.

2

Re: Записи в Pascal(Record)

Odin88, ви неправильно побудували цикли для вводу і виводу.
Щоб все правильно працювало треба так:

program Project1;
 
type
  Subject=record
    NofS:string; 
    ANote:real; 
  end;
  Student=record
  SName:string;     
  Initials:string; 
  Sub:array[1..10] of subject;
  end;
var
  S:array[1..10] of student;
  n,i,a,b:integer;

begin
Write('Enter count of students=');
Readln(n);
for i := 1 to n  do
   begin
    write('Student ',i,' has surname= ');
    readln(S[i].SName);
    write('initials of the ',S[i].SName,'= ');
    readln(S[i].Initials);

    Write('Count of subjects=');
    Readln(a); for b :=1 to a do
                 begin

    Write(S[i].SName,' Studying subject= ');
     readln(S[i].Sub[b].NofS);
     Write(' and has the following marks=');
    readln(S[i].Sub[b].ANote);
    end;
   end;
writeln('Surname', #9, 'Initials', #9, 'subject', #9, 'mark');
for i := 1 to n  do
  begin
  with S[i] do
  for b := 1 to a do
    writeln(Sname,#9,Initials,#9,Sub[b].NofS,#9,Sub[b].ANote:0:2);
end;
readln;
end.  
Подякували: Odin881

3

Re: Записи в Pascal(Record)

Dr.WoZD,дуже вдячний :)

4 Востаннє редагувалося Odin88 (05.10.2013 19:58:12)

Re: Записи в Pascal(Record)

Dr.WoZD.Поясніть,будь-ласка, що означає:

writeln('Surname', #9, 'Initials', #9, 'subject', #9, 'mark');

І ще чомусь вибиває ось таке:

Post's attachments

Безымянный.png 168.24 kb, 368 downloads since 2013-10-05 

5

Re: Записи в Pascal(Record)

Це заголовок для таблиці(назви колонок), щоб було зрозуміліше ту таблицю читати. #9 це код символу табуляції, щоб красивіше виглядало.
P.S Після  'Initials' можна два #9 поставити, бо слово довге і назва предмету виводиться вже не в своїй колонці.

Подякували: Odin881

6

Re: Записи в Pascal(Record)

Чомусь вибиває помилку *WALL*

7 Востаннє редагувалося Odin88 (05.10.2013 19:57:20)

Re: Записи в Pascal(Record)

А ні,все гаразд.Просто не вставив:

{$APPTYPE CONSOLE}

uses
  SysUtils;

Dr.WoZD,ще раз, дуже дякую. ;)

8

Re: Записи в Pascal(Record)

Для кожного студента іще треба зберігати кількість його власних предметів. Зараз воно виводитиме для кожного студента стільки предметів, скільки було в останнього.

Подякували: Odin881

9

Re: Записи в Pascal(Record)

Torbins,а дійсно,я й не зауважив.Треба тепер подумати..

10

Re: Записи в Pascal(Record)

Odin88 написав:

Можливо ви зможете якось принаймні натякнути, як це зробити)

Перемістіть змінну a в запис Student.

Подякували: Odin881

11

Re: Записи в Pascal(Record)

Torbins,вельми вдячний :)
Зрозумів)

program Project1;
{$APPTYPE CONSOLE}
 
uses
  SysUtils;
type
  Subject=record
    NofS:string; 
    ANote:real; 
  end;
  Student=record  a:integer;
  SName:string;     
  Initials:string; 
  Sub:array[1..10] of subject;
  end;
var
  S:array[1..10] of student;
  n,i,b:integer;
 
begin
Write('Enter count of students=');
Readln(n);
for i := 1 to n  do
   begin
    write('Student ',i,' has surname= ');
    readln(S[i].SName);
    write('initials of the ',S[i].SName,'= ');
    readln(S[i].Initials);
 
    Write('Count of subjects=');
      Readln(s[i].a);  for b :=1 to S[i].a do
                 begin
 
    Write(S[i].SName,' Studying subject= ');
     readln(S[i].Sub[b].NofS);
     Write(' and has the following marks=');
    readln(S[i].Sub[b].ANote);
    end;
   end;
writeln('Surname', #9, 'Initials', #9, 'subject', #9, 'mark');
for i := 1 to n  do
  begin
  with S[i] do
  for b := 1 to a do
    writeln(Sname,#9,Initials,#9,Sub[b].NofS,#9,Sub[b].ANote:0:2);
end;
readln;
end.  

12 Востаннє редагувалося Odin88 (06.10.2013 13:58:28)

Re: Записи в Pascal(Record)

Підкажіть як мені просумувати кількість балів для кожного окремого студента?

program Project1;
{$APPTYPE CONSOLE}

uses
  SysUtils;
type
  Subject=record
    NofS:string;//name of the subject(предмет)
    ANote:real;//mark(оцінка)
  end;
  Student=record
    a:integer;
    SName:string;//(прізвише студента)
    Initials:string;//(П.І.Б)
    Sub:array[1..10] of subject;//(предмет,який вивчає даний студент)
  end;
var
  S:array[1..25] of student;
  n,i,b:integer;
  sum:real;
begin
  Write('Enter count of students=');
  Readln(n);;//(кількість студентів)
    for i := 1 to n  do//(цикл введення даних)
  begin
  Write('Student ',i,' has surname= ');
  Readln(S[i].SName);
  Write('initials of the ',S[i].SName,'= ');
  Readln(S[i].Initials);
  Write('Count of subjects=');
  Readln(s[i].a);
    for b :=1 to S[i].a do
  begin
  Write(S[i].SName,' Studying subject= ');
  Readln(S[i].Sub[b].NofS);
  Write(' and has the following marks=');
  Readln(S[i].Sub[b].ANote);
  end;
  end;
  Writeln('Surname', #9, 'Initials', #9, 'subject', #9, 'mark');
    for i := 1 to n  do//(цикл виведення даних)
  begin
  with S[i] do
    for b := 1 to a do
  Writeln(Sname,#9,Initials,#9,Sub[b].NofS,#9,Sub[b].ANote:0:2);
   end;
sum:=0;
    for i := 1 to n  do
  begin
    for b := 1 to S[i].a  do
  sum:=sum+S[i].Sub[b].ANote;
  end;
    for i := 1 to n  do
  begin
  with S[i] do
    for b := 1 to a do
  Writeln(Sname,#9,Initials,#9,sum:0:2);
  end;
Readln;
end.

Чомусь сумує загальну кількість балів усіх студентів.А мені потрібно буде пізніше знайти середній бал кожного.

13

Re: Записи в Pascal(Record)

Odin88, треба суму запам'ятовувати для кожного студента окремо(або зразу виводити). Ось приблизно так:

program Project1;
{$APPTYPE CONSOLE}
 
uses
  SysUtils;
type
  Subject=record
    NofS:string;
    ANote:real;
  end;
  Student=record
    a:integer;
    SName:string;
    Initials:string;
    sum:real;  
    Sub:array[1..10] of subject;
  end;
var
  S:array[1..25] of student;
  n,i,b:integer;
begin
  Write('Enter count of students=');
  Readln(n);;
    for i := 1 to n  do
  begin
  Write('Student ',i,' has surname= ');
  Readln(S[i].SName);
  Write('initials of the ',S[i].SName,'= ');
  Readln(S[i].Initials);
  Write('Count of subjects=');
  Readln(s[i].a);
    for b :=1 to S[i].a do
  begin
  Write(S[i].SName,' Studying subject= ');
  Readln(S[i].Sub[b].NofS);
  Write(' and has the following marks=');
  Readln(S[i].Sub[b].ANote);
  end;
  end;
  Writeln('Surname', #9, 'Initials', #9, 'subject', #9, 'mark');
    for i := 1 to n  do
  begin
  with S[i] do
    for b := 1 to a do
  Writeln(Sname,#9,Initials,#9, #9,Sub[b].NofS,#9,Sub[b].ANote:0:2);
   end;
    for i := 1 to n  do
  begin
  with S[i] do
    for b := 1 to a  do
  sum:=sum+Sub[b].ANote;
  end;
  
    for i := 1 to n  do
  begin
  with S[i] do
  Writeln(Sname,#9,Initials,#9,sum:0:2);
  end;
Readln;
end.
Подякували: Odin881

14

Re: Записи в Pascal(Record)

Dr.WoZD,дякую,тепер зрозумів.