Показать сообщение отдельно

  #5  
Старый 30.11.2009, 03:39
StealthMaster
Познающий
Регистрация: 03.12.2008
Сообщений: 56
С нами: 9176827

Репутация: 29
По умолчанию

Цитата:
Сообщение от Ci5  
Delphi 7

Доброй ночи. Понадобилась помощь в написании программы. Поджимает сильно время. Очень прошу помочь, завтра уже сдавать её.

Составить список, содержащий сведения об N студентах. Для каждого учащегося указать:
- фамилия;
- ИНН (идентификационный номер налогоплательщика);
- дата выдачи Свидетельства о постановке на учет в налоговом органе;
- дата рождения;
- год поступления в университет;
- курс;
- группа;
- количество семестров обучения;
- оценки каждой сессии по всем семестрам.
Информацию о каждом студенте оформить в виде записи. Совокупность записей объединить в массив.
Составить программу, которая обеспечивает ввод исходных данных, об-работку и вывод на экран информации в соответствии с вариантом задания, приведенного в таблице

Из таблицы: Упорядочить список студентов по среднему баллу последней сданной сессии и вывести его на экран. N = 4

Снизу приведу программу-пример указанную в методичке, может поможет чем-то.

Разработать программу для обработки информационного массива данных по группе студентов из 30 человек. Для каждого студента указаны фамилия и оценки по пяти дисциплинам. Необходимо вычислить средний балл и упорядо-чить список студентов группы по убыванию среднего балла.

Код:
PROGRAM PRIM2;
USES CRT;
TYPE
STR=RECORD
FAM: STRING [30];
B1,B2,B3,B4,B5: 2..5;
SB: REAL
END;
VAR
TBL: ARRAY [1..25] OF STR;
Y:STR;
I,J,K,M:INTEGER;
X,R:REAL;
PR:BYTE;
BEGIN
CLRSCR;
REPEAT
WRITELN ('Введите число студентов');
READLN (M);
FOR I:= 1 TO M DO
WITH TBL[I] DO
BEGIN
WRITELN('Введите фамилию');
READLN (FAM);
WRITELN('Введите пять оценок студента');
READLN (B1,B2,B3,B4,B5);
END;
FOR I:= 1 TO M DO
WITH TBL[I] DO
SB:= (B1+B2+B3+B4+B5)/5;
FOR I:= 1 TO M DO
BEGIN
K:=1;
X:=TBL[I].SB;
FOR J:=I TO M DO
IF TBL[J].SB >=X THEN
BEGIN
K:=J;
X:=TBL[J].SB;
Y:=TBL[K];
TBL[K]:=TBL[I];
TBL[I]:=Y
END;
END;
WRITELN ('Список студентов');
FOR I:=1 TO M DO
WITH TBL[I] DO
WRITELN (FAM, SB:4:2);
WRITELN ('Обработать еще один список? 1-да 0-нет');
READLN(PR);
UNTIL PR=0
END.
Заранее спасибо

Код:
type
  TStudent = record
    LastName: string;
    ITIN: string;
    ITINDate: TDate;
    Birthday: TDate;
    EnterDate: integer;
    Cource: integer;
    Group: integer;
    SemesterNumber: integer;
    Marks: array of integer; // оценки за последнюю сессию
    AverageMark: double;
  end; // TSudent


var
  Students: Array of TStudent;

procedure AddMark(M: integer; Number: integer);
var
  tmp: integer;
begin
  if (M in [2..5]) then
    begin
      tmp := Length(Students[Number].Marks);
      SetLength(Students[Number].Marks, tmp + 1);
      Students[Number].Marks[tmp] := M;
    end;
end;

procedure AddStudent(pLastName: string; pITIN: string; pITINDate, pBirthDay: TDate;
                      pEnterDate, pCource, pGroup, pSemesterNumber: integer;
                      M1: integer = 0; M2: integer = 0; M3: integer = 0;
                      M4: integer = 0; M5: integer = 0);
var
  tmp, stmp: integer;
  i: integer;
begin
  tmp := length(Students);
  SetLength(Students, tmp + 1);

  with Students[tmp] do
    begin
      LastName := pLastName;
      ITIN := pITIN;
      ITINDate := pITINDate;
      Birthday := pBirthDay;
      EnterDate := pEnterDate;
      Cource := pCource;
      Group := pGroup;
      SemesterNumber := pSemesterNumber;

      AddMark(M1, tmp);
      AddMark(M2, tmp);
      AddMark(M3, tmp);
      AddMark(M4, tmp);
      AddMark(M5, tmp);

      stmp := length(Marks);
      AverageMark := 0;
      if (stmp <> 0) then
        for i := 0 to stmp - 1 do
          AverageMark := AverageMark + Marks[i]/stmp;
    end;  // with
end;

procedure QSort(Left, Right: integer);
// Left, Right - границы сортируемой области
var
  i, j: integer;
  x: double;
  tmp: TStudent;
begin
  i := Left;
  j := Right;

  // в качестве опорного элемента выбираем медиану сортируемой области
  x := Students[(Left + Right) div 2].AverageMark;
  repeat
    while x > Students[i].AverageMark do
      inc(i);

    while x < Students[j].AverageMark do
      dec(j);

    if i <= j then
      begin
        tmp := Students[i];
        Students[i] := Students[j];
        Students[j] := tmp;
        inc(i);
        dec(j);
      end;
  until i>j;

  if i < Right then QSort(i, Right);
  if j > Left  then QSort(Left, j);
end;

procedure TForm1.ButtonAddClick(Sender: TObject);
begin
  AddStudent(edName.text, edITIN.text, DateTimePickerITIN.Date, DateTimePickerBithday.Date,
              StrToInt(edYear.text), StrToInt(edCource.text), StrToInt(edGroup.text), 
             StrToInt(edSNumber.text), StrToInt(edM1.text), StrToInt(edM2.text), StrToInt(edM3.text), 
             StrToInt(edM4.text), StrToInt(edM5.text));
end;

procedure TForm1.ButtonAddClick(Sender: TObject);
begin
  QSort(0, length(Students)-1);
end;

Может быть что-то забыл, это всегда можно быстро подправить)

Последний раз редактировалось StealthMaster; 30.11.2009 в 03:43..
 
Ответить с цитированием