Технический форум

Технический форум (http://www.tehnari.ru/)
-   Помощь студентам (http://www.tehnari.ru/f41/)
-   -   Задача на файлы (http://www.tehnari.ru/f41/t72853/)

gabriela 10.05.2012 16:23

Задача на файлы
 
Структура записи:

ФИО:..........40 знаков
№ курса.....1 знак
№ группы....1 знак
успеваемость-5 экзаменов в каждой из 10 сессий
форма обучения (целевая\договорная)..1 знак
Экзамен
наимен.предмета....10 знаков
оценка..................1 знак
создать файл студент.Занесите в отдельный файл записи из файла Студент о студентах 5-го курса ,упорядочив их по убыванию сумм баллов за все время обучения(фио,балл)
Код:

type
  session = array[1..10,1..5] of record            //Сведения об экзаменах
                                  name: string[10];
                                  mark: 1..5;
                                  end;
  student = record                // Сведения о студенте
            fio: string[40];
            curs: 1..5;
            group: 1..9;
            result:session;
            end;
  TFile= file of student ;
 //--------------------------------------------------------
procedure vvodstudent(var st:student);      // Ввод записи с клавиатуры
var i,j:integer;
begin
with st do
 begin
  write('Введите ФИО: '); readln(fio);
  write('Введите курс: '); readln(curs);
  write('Введите группу: '); readln(group);
  writeln('Введите результаты сессий:');
  i:=1;
  repeat
  writeln('Сейссия №',i,': ');
  for j:=1 to 5 do
    begin
    write('Название ',j,'-го экзамена: '); readln(result[i,j].name);
    write('Оценка за ',j,'-й экзамен: '); readln(result[i,j].mark);
    end;
  inc(i);
  until (i=curs*2+1);
 end;
writeln('Ввод закончен!');
end;
//-------------------------------------------------------------------
procedure writestudent(var st:student);            // Печать записи
var i,j:integer;
begin
with st do
 begin
  writeln(FIO,', ',curs,' курс, ',group,' группа.');
  for i:=1 to curs*2 do
  begin
    write('  Сессия ',i,': ');
    for j:=1 to 5 do
    write(result[i,j].name,': ',result[i,j].Mark,', ');
    readln
  end
 end;
end;
var f1:file;
    rec:student;
begin
 Assign(f1,'af.int');
 rewrite(f1);
 Write(f1,writestudent(rec));
 Close(f1);
 Reset(f1);
 while not Eof(f1) do
 begin
 
 end;
end.

помогите ,пожалуйста, доделать задачу

Vladimir_S 10.05.2012 16:48

Цитата:

Сообщение от gabriela (Сообщение 730412)
помогите ,пожалуйста, доделать задачу

Да... накручено всего много, а вот, похоже, того, что надо, как раз нету. Я бы, решая эту задачу, создал массив студентов (записей student), а в самой записи сделал бы еще одно поле суммы баллов, вычисление каковой запихал бы в конец процедуры ввода. Далее провел бы отбор по курсу (5) и упорядочение по суммам баллов методом пузырька.

gabriela 10.05.2012 17:07

Цитата:

Сообщение от Vladimir_S (Сообщение 730423)
Да... накручено всего много, а вот, похоже, того, что надо, как раз нету. Я бы, решая эту задачу, создал массив студентов (записей student), а в самой записи сделал бы еще одно поле суммы баллов, вычисление каковой запихал бы в конец процедуры ввода. Далее провел бы отбор по курсу (5) и упорядочение по суммам баллов методом пузырька.

а как это все в файлы засунуть?

Vladimir_S 10.05.2012 17:14

Цитата:

Сообщение от gabriela (Сообщение 730428)
а как это все в файлы засунуть?

Дык... Открыть файл на запись да циклом по студентам и отправить.
Кстати, заметил, что еще одного поля не хватает - символа формы обучения. И вопрос: а зачем в цикле по сессиям при вводе данных Вы применили Repeat - Until, а не просто for - to - do?

gabriela 10.05.2012 17:42

Код:

const
    n=10;
type
    session = array[1..10,1..5] of record
                                  subject: string[10];
                                  mark: 1..5;
                                  end;
    student=record
    fio:string[40];
    curs:1..5;
    group:1..9;
    formaobuch:string[1];
    end;
  TFile= file of student ;
  tmas=array [1..n] of student;
//------------------------------------------------------
procedure vvoddannuh(var a:tmas); //ввод
var i,s:Integer;
begin
  for i:=1 to n do
  begin
    Writeln('введите фио');
    Readln(a[i].fio);
    Writeln('введите курс');
    Readln(a[i].curs);
    Writeln('введите группу');
    Readln(a[i].group);
    Writeln('введите форму обучения');
    Readln(a[i].formaobuch);
    writeln;
  end
end;
//--------------------------------------------------------
Procedure vuvoddannuh(a:tmas);
var i:Integer;
begin
  writeln ('--------------------------------------------------------------------------');
  writeln ('    фио  / курс  / группа/  форма обучения /    ');
  writeln ('--------------------------------------------------------------------------');
  for i:=1 to n do
  writeln(a[i].fio,' ',a[i].curs,' ',a[i].group,' ',a[i].formaobuch);
end;
//-------------------------------------------------------------------

исправила.вот только никак понять не могу как вводить предметы и оценки

Vladimir_S 10.05.2012 23:08

Цитата:

Сообщение от gabriela (Сообщение 730447)
исправила.вот только никак понять не могу как вводить предметы и оценки

Так, ну вот Вам Ваша программа, правда как Вы собираетесь вводить данные но 10 студентов по 10 сессиям, каждая из коих включает 5 предметов, я не очень представляю, но дело Ваше. По-моему, этим можно заниматься "долгими зимними вечерами".
Код:

const
 n=10;
type
  session = array[1..10,1..5] of record
                                  name: string;
                                  mark: 2..5;
                                end;
  student = record
            fio: string;
            curs: 1..5;
            group: 1..9;
            result:session;
            formaobuch:char;
            sum:Word;
            end;
  TFile= file of student ;
  tmas=array [1..n] of student;
 //--------------------------------------------------------

procedure vvodstudent(var st:student);
 var
  i,j:integer;
begin
 with st do
  begin
  sum:=0;
  write('Name: ');
  readln(fio);
  write('Course: ');
  readln(curs);
  write('Group: ');
  readln(group);
  writeln('Session results:');
  for i:=1 to curs*2 do
    begin
    writeln('Session N',i,':');
    for j:=1 to 5 do
      begin
      write('Subject of examination: ');
      readln(result[i,j].name);
      write('Mark: ');
      readln(result[i,j].mark);
      Inc(sum,result[i,j].mark);
      end;
    end;
  write('Form of study: ');
  readln(formaobuch);
 end;
end;
//-------------------------------------------------------------------
procedure writestudent(var st:student);
var
 i,j:integer;
begin
 with st do
  begin
  writeln('Name: ',FIO,',    Course: ',curs,'  Group: ',group,'  Form: ',formaobuch);
  for i:=1 to curs*2 do
  begin
    writeln('Session ',i,': ');
    for j:=1 to 4 do
    write(result[i,j].name,': ',result[i,j].Mark,', ');
    writeln(result[i,5].name,': ',result[i,5].Mark);
  end;
  end;
 Writeln('Press "Enter" to continue...');
end;

var f1:Tfile;
    rec,rec5:tmas;
    q,p,N5:Byte;
    Dummy:student;

begin
 Assign(f1,'af.int');
 rewrite(f1);
 for q:=1 to n do
  begin
  vvodstudent(rec[q]);
  Write(f1,rec[q]);
  writeln;
  end;
 Close(f1);
 writeln;
 for q:=1 to n do
  begin
  writestudent(rec[q]);
  readln;
  end;
 writeln;
 N5:=0;
 for q:=1 to n do
  If rec[q].curs=5 then
  begin
    Inc(N5);
    rec5[N5]:=rec[q];
  end;

 For p:=1 to N5-1 do
  For q:=1 to N5-p do
  if rec5[q].sum<rec5[q+1].sum then
    begin
    Dummy:=rec5[q];
    rec5[q]:=rec5[q+1];
    rec5[q+1]:=Dummy;
    end;

 Assign(f1,'af5.int');
 rewrite(f1);
 for q:=1 to N5 do
  begin
  writeln(rec5[q].fio:40,rec5[q].sum:4);
  write(f1,rec5[q]);
  end;
 Close(f1);
 readln;
end.


gabriela 11.05.2012 20:35

спасибо огромное))

gabriela 11.05.2012 20:44

Код:

const
 n=10;
type
  session = array[1..10,1..5] of record
                                  name: string;
                                  mark: 2..5;
                                end;
  student = record
            fio: string;
            curs: 1..5;
            group: 1..9;
            result:session;
            formaobuch:char;
            sum:Word;
            end;
  TFile= file of student ;
  tmas=array [1..n] of student;
 //--------------------------------------------------------

procedure vvodstudent(var st:student);
 var
  i,j:integer;
begin
 with st do
  begin
  sum:=0;
  write('Name: ');
  readln(fio);
  write('Course: ');
  readln(curs);
  write('Group: ');
  readln(group);
  writeln('Session results:');
  for i:=1 to curs*2 do
    begin
    writeln('Session N',i,':');
    for j:=1 to 5 do
      begin
      write('Subject of examination: ');
      readln(result[i,j].name);
      write('Mark: ');
      readln(result[i,j].mark);
      Inc(sum,result[i,j].mark);
      end;
    end;
  write('Form of study: ');
  readln(formaobuch);
 end;
end;
//-------------------------------------------------------------------
procedure writestudent(var st:student);
var
 i,j:integer;
begin
 with st do
  begin
  writeln('Name: ',FIO,',    Course: ',curs,'  Group: ',group,'  Form: ',formaobuch);
  for i:=1 to curs*2 do
  begin
    writeln('Session ',i,': ');
    for j:=1 to 4 do
    write(result[i,j].name,': ',result[i,j].Mark,', ');
    writeln(result[i,5].name,': ',result[i,5].Mark);
  end;
  end;
 Writeln('Press "Enter" to continue...');
end;

var f1:Tfile;
    rec,rec5:tmas;
    q,p,N5:Byte;
    Dummy:student;

begin
 Assign(f1,'af.int');
 rewrite(f1);
 for q:=1 to n do
  begin
  vvodstudent(rec[q]);
  Write(f1,rec[q]);
  writeln;
  end;
 Close(f1);
 writeln;
 for q:=1 to n do
  begin
  writestudent(rec[q]);
  readln;
  end;
 writeln;
 N5:=0;
 for q:=1 to n do
  If rec[q].curs=5 then
  begin
    Inc(N5);
    rec5[N5]:=rec[q];
  end;

 For p:=1 to N5-1 do
  For q:=1 to N5-p do
  if rec5[q].sum<rec5[q+1].sum then
    begin
    Dummy:=rec5[q];
    rec5[q]:=rec5[q+1];
    rec5[q+1]:=Dummy;
    end;

 Assign(f1,'af5.int');
 rewrite(f1);
 for q:=1 to N5 do
  begin
  writeln(rec5[q].fio:40,rec5[q].sum:4);
  write(f1,rec5[q]);
  end;
 Close(f1);
 readln;
end.

выделяет строчку выделенную красным и пишет type 'student' needs finalization-not allowed in file type

Vladimir_S 11.05.2012 23:20

Цитата:

Сообщение от gabriela (Сообщение 731118)
выделяет строчку выделенную красным и пишет type 'student' needs finalization-not allowed in file type

Понятно. Это задвиги некоторых Паскаль-трансляторов (мой-то это дело жрет и не давится). Лечение: восстановите (как у Вас и было изначально) фиксированные длины строк в полях обеих записей:
name: string[10];
и
fio:string[40];
Должно помочь.


Часовой пояс GMT +4, время: 13:49.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.