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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.05.2008, 19:44   #1
Elizabeth Black
Новичок
Джуниор
 
Аватар для Elizabeth Black
 
Регистрация: 27.05.2008
Сообщений: 2
По умолчанию Сортировка в файлах и записях. Паскаль

Помогите с такой задачей пожалуйста.

1. Создать на диске файл (типизированный или текстовый) file4.dat, компонентами которого являются: фамилия студента; его пол; год рождения: оценки по трем предметам. Считать эти данные из файла и вывести их на экран упорядоченно:
а) согласно успеваемости;
б) в алфавитном порядке фамилий;
в) по возрасту студентов.

А вот мой вариант...

Код:
program kursovaua;
uses crt;
Type Student = Record
Name : String[20];
Sex : Boolean;
Year: integer;
m1,m2,m3 : byte 
end;
var 
s : array [1..15] of student;
c, i1: integer;
f: file of student;
Procedure READDATA; 
h : Student;
Begin
i1 := 0;
Assign(F,'Zad3.out'); Reset(F);
While Not EOF(F) Do
begin
Read(F,h);
With h do
begin
S[i1] := h; 
end;
Close(F);
End;
end; 

{1} PROCEDURE SortFamiliy;
i,j : Integer;
h : Student;
Begin
For i := 1 to i1-1 do
For j := i to i1-1 do
If s.Name > s[j].Name then 
begin
h := s;
s := s[j];
s[j] := h
end;
For i := 1 to i1-1 do
write( s[i]);
end;
End;

{2}PROCEDURE SortAge;
Var 
i,j : Integer;
h : Student;
Begin
For i := 1 to i1-1 do 
For j := i to i1-1 do
If s.YEar > s[j].Year then 
begin  
h := s;
s := s[j];
s[j] := h
end;
For i := 1 to i1-1 do
write( s[i]);
End;

{3}PROCEDURE SortMark;
Var 
i,j : Integer;
h : Student;
Begin
For i := 1 to i1-1 do
For j := i to i1-1 do
If (s.m1+s.m2+s.m3)/3 < (s[j].m1+s[j].m2+s[j].m3)/3 then
begin 
h := s;
s := s[j];
s[j] := h
end;
For i := 1 to i1-1 do
write( s[i]);
End;
end;
begin  clrscr;
PROCEDURE SortFamiliy;
PROCEDURE SortAge;
PROCEDURE SortMark;
end.
Можете сказать, что не правильно? Буду очень благодарна за помощь. :-)
Elizabeth Black вне форума Ответить с цитированием
Старый 27.05.2008, 21:05   #2
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от Elizabeth Black Посмотреть сообщение
Можете сказать, что не правильно? Буду очень благодарна за помощь. :-)
Огорчу Вас. Такое ощущение, что пишете первый раз.
...
Попробуйте вот это:

Код:
Type
  Student = Record
     Name : String[20];
     Sex : Boolean;
     Year: integer;
     m1,m2,m3 : byte
  end;

var
  s : array [1..15] of student;
  count : integer;

// Генерация файла для тестирования
procedure generateFile;
var f:file of Student;

 procedure newStudent(Nm:String; Sex:boolean; Y, m1, m2, m3:integer);
 var h:Student;
 begin
   h.Name := Nm;
   h.Sex  := Sex;
   h.Year := Y;
   h.m1   := m1;
   h.m2   := m2;
   h.m3   := m3;
   write(f, h);
 end;

begin
   assign(f, 'file4.dat'); rewrite(f);
   newStudent('Ivanov'  , true, 1999, 5, 4, 4);
   newStudent('Petrov'  , true, 1998, 3, 4, 4);
   newStudent('Sidorov' , true, 1997, 4, 5, 4);
   newStudent('Vasilev' , true, 1999, 5, 5, 4);
   newStudent('Kuznezov', true, 1997, 3, 5, 4);
   close(f);
end;

procedure readData;
var h : Student;
    f:file of student;
begin
   count := 0;
   Assign(f, 'file4.dat'); Reset(F);
   While not EOF(F) Do begin
      Read(F, h);
      inc(Count);
      if count <= 15 then begin
         S[count] := h;
      end;
   end;
   Close(F);
end;

procedure printList;
var i:integer;
begin
   for i:=1 to count do begin
      writeln(S[i].Name:20, S[i].Sex:6, S[i].Year:5, S[i].m1:5, S[i].m2:5, S[i].m3:5);
   end;
end;

// N = 1 - по фамилии, 2 - по возрасту, 3 - по успеваемости
procedure Sort(N:integer);
var t:Student;
    changed, B : boolean;
    i:integer;
begin
   repeat
      changed := false;
      for i := 1 to count-1 do begin
         case N of
            1 : B := s[i].Name > s[i+1].Name;
            2 : B := s[i].Year > s[i+1].Year;
            3 : B := (s[i].m1+s[i].m2+s[i].m3) < (s[i+1].m1+s[i+1].m2+s[i+1].m3)
         else   B := false;
         end;
         if B then begin
            changed := true;
            t := S[i];
            S[i] := S[i+1];
            S[i+1] := t;
         end;
      end;
   until not changed;
end;

begin
   generateFile;
   readData;
   writeln('unsorted list');
   printList;

   Sort(1);
   writeln('sorted by name');
   printList;

   Sort(2);
   writeln('sorted by year');
   printList;

   Sort(3);
   writeln('sorted by rating');
   printList;
   readln;
end.
alexBlack вне форума Ответить с цитированием
Старый 27.05.2008, 21:51   #3
Elizabeth Black
Новичок
Джуниор
 
Аватар для Elizabeth Black
 
Регистрация: 27.05.2008
Сообщений: 2
По умолчанию

alexBlack
Спасибо большое... Вы мне очень помогли! Будем все-таки разбираться... Еще раз спасибо.
Elizabeth Black вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Паскаль.Сортировка массива Никита35 Помощь студентам 12 24.10.2012 20:13
Упорядочивание (сортировка) массиса(Паскаль) NTFS Помощь студентам 1 25.03.2008 20:22
Типизированные файлы.Создание, удаление, редактирование, сортировка записей типизированного файла.Паскаль Студент Шиза Помощь студентам 6 08.12.2007 13:41
Паскаль. Сортировка в Паскале. FeelTheSkill Помощь студентам 4 10.02.2007 07:54