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

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

Oksana777 06.09.2012 16:56

Массив
 
Создать массив из 20 элементов,хранящих информацию о студенках факультета.Каждый элемент содержит фамилию,курс,форму обучения,(специалист,бакалавр,магис тр)и оценки по 5 предметам за последнюю сессию.
Упорядочить массив по среднему баллу.Осуществить перевод студентов на следующий курс.Переводятся студенты ,не имеющие задолжностей за последнюю сессию,студенты 5-ого курса(специалисты) и 6-ого курса(магистры)должны быть удалены ,как окончившие курс обучения
Код:

uses
  SysUtils,Windows;

const n = 20;

type
  TForm = (Spec, Bak, Mag);
  TOsn = (Budjet, Dogovor);
  TSubj = record
    name: string[20];
    Mark: 2..5;
  end;
  TSession = array [1..5] of TSubj;
  TStudent = record
    Surname: string[20];
    Course: 1..6;
    Form: TForm;
    Osn: TOsn;
    Session: TSession;
  end;
  TMas = array [1..n] of TStudent;
//-----------------------------------------------
procedure ReadStudent (var f: textfile; var S: TStudent); //считывание информации об одном студенте
var buf: string;
    i: integer;
begin
    readln (f, S.Surname);
    readln (f, buf);
    if pos ('Курс ',buf) = 1 then
      delete (buf, 1, 5);
    S.Course := StrToInt(Trim(buf));
    readln (f);
    readln (f, buf);
    if buf = 'Специалист' then S.Form := Spec else
    if buf = 'Бакалавр' then S.Form := Bak else
    if buf = 'Магистр' then S.Form := Mag;
    readln (f);
    readln (f, buf);
    if buf = 'Госбюджет' then S.Osn := Budjet else
    if buf = 'Договор' then S.Osn := Dogovor;
    readln (f);
    for i := 1 to 5 do
    begin
      readln (f, buf);
      S.Session[i].name := copy (buf, 1, length(buf) - 2);
      S.Session[i].Mark := StrToInt (buf[length(buf)]);
    end;
    readln (f);
end;
//-----------------------------------------------
procedure ReadAll (var f: textfile; var a: TMas); //считывание информации обо всех студентах
var i: integer;
begin
for i := 1 to n do
  ReadStudent (f, a[i]);
end;
//-----------------------------------------------
procedure Swap (var a,b: TStudent); //"пузырьковый" обмен
var t: TStudent;
begin
  t := a;
  a := b;
  b := t;
end;
//-----------------------------------------------
function CountAverage (const S: TStudent): real;
var i: integer;
begin
  result := 0;
  for i := 1 to 5 do
    result := result + S.Session[i].Mark;
  result := result / 5;
end;

//-----------------------------------------------
procedure BubbleSort(var A: TMas; n: integer);//удорядочение массива по среднему баллу
var i,j: integer;
begin
  for i := 1 to n - 1 do
    for j := 1 to n - i  do
      if CountAverage(A[j]) > CountAverage(A[j+1]) then swap(A[j], A[j + 1]);
end;
//-----------------------------------------------
procedure PrintStudent (const S: TStudent; var f:textfile);
var i: integer;
begin
with S do
  begin
    writeln (f,Surname);
    writeln (f,'Курс ',Course);
    writeln (f,'Форма обучения:');
    case Form of
      Spec: writeln (f,'Специалист');
      Bak: writeln (f,'Бакалавр');
      Mag: writeln (f,'Магистр');
    end;
    writeln (f,'Основа обучения:');
    case Osn of
      Budjet: writeln (f,'Госбюджет');
      Dogovor: writeln (f,'Договор');
    end;
    writeln (f,'Сессия: ');
    for i := 1 to 5 do
      writeln (f,Session[i].name,' ',Session[i].Mark);
    writeln(f);
  end;
end;
//-----------------------------------------------
function NoDebts (const S: TStudent): boolean;//если студент не двоешник
var i: integer;
begin
  result := true;
  for i := 1 to 5 do
    if S.Session[i].Mark = 2 then result := false;
    NoDebts:=result;
end;
//-----------------------------------------------
procedure Transfer (var a: TMas; var Count: integer); //перевод студентов, не имеющих задолжностей на следующий курс
var i: integer;
begin
i := 1;
while i <= Count do
  begin
    if NoDebts (a[i]) then
        with a[i] do
          if ((Course = 4) and (Form = Bak)) or
            ((Course = 5) and (Form = Spec)) or
            ((Course = 6) and (Form = Mag)) then
            begin
            a[i] := a[Count];
            dec (Count);
            dec (i);
            end
          else inc (Course);
    inc (i);
  end;
end;
//-----------------------------------------------
procedure PrintAll (const a: TMas; Count: integer; var f:textfile); //печать информации о переведенных студентах
var i: integer;
begin
  for i := 1 to Count do
    PrintStudent (a[i],f);
end;
//-----------------------------------------------

var a: TMas;
    f: textfile;
    filename: string;
    f1: file of TStudent;
    count: integer;
Begin
  SetConsoleCP (1251);
  SetConsoleOutputCP (1251);
  writeln ('Введите имя файла:');
  readln (filename);
  if fileexists (filename) then
  begin
    assignfile (f,filename);
    reset (f);
    ReadAll (f, a);
    closefile (f);
    Count := n;
    BubbleSort (a, Count);
    Transfer (a, Count);
    assignfile(f,'output.txt');
    rewrite(f);
    PrintAll (a, Count, f);
    closefile(f);
    writeln('Перевод завершен!');
    end
      else
        writeln ('Файла с таким именем не существует!');
  readln
End.

Неправильно работает процедура перевода студентов и необходимы две процедуры ввода и вывода данных в типизированный файл.

Oksana777 09.09.2012 22:31

помогите кто может

Gruvi 09.09.2012 23:14

подобные программы уже были тут, особенно в разделе программирования на delphi/pascal


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

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