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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.11.2011, 00:44   #1
iCaesy
In progress...
Форумчанин
 
Регистрация: 25.09.2011
Сообщений: 161
Восклицание Паскаль. Сортировка.

Создать программу для ввода, вывода, записи в файл инфо о студенте:
Фамилия
Имя
Группа
Год рождения
Сред. рейтинг.

При выводе, добавить сортировку по году рождения.

Листинг:

Код:
program p;
uses crt;
type
 z=record
 srbal:real;
 Fam,Im,Grup:string[20];
 Godr:1950..2000;
end;

var i,n:integer; c,d:char;
 f:file of z; x:z; b:real;

procedure vvod;
 begin
  rewrite(f);
  Seek (F, FileSize(F));
  write (f,x);
  clrscr;
  writeln('Ââåäèòå êîëè÷åñòâî ñòóäåíòîâ:');
  readln(n);
   for i:=1 to n do
    begin
     writeln ('Familiya'); readln (x.fam);
     writeln ('Imya'); readln (x.Im);
     writeln ('Gruppa'); readln (x.grup);
     writeln ('Ãîä ðîæäåíèÿ <1950..2000>'); readln (x.godr);
     writeln ('Sr-Reyting'); readln (x.srbal);
     Seek (F, FileSize(F));
     write (f,x);
    end;
end;

Procedure Vivod;
begin
 reset (f);
 while not eof(f) do
  begin
   read (f,x);
  if   // ВОТ ТУТ НУЖНО ДОБАВИТЬ СОРТИРОВКУ ПО ГОДУ РОЖДЕНИЯ.             
    begin
     writeln (' ',x.fam);
     writeln (x.im);
     writeln (x.grup);
     writeln ('God rojdeniya: ',x.godr);
     writeln ('Sr-Reyting: ',x.srbal);
    end;
  end;
 read(c);
 close (f);
end;

Begin
 assign (f,'LAB8_f.dat');
  while true do
  begin
   clrscr;
  writeln ('1-Vvod studentov ');
  writeln ('2-Vivod studentov ');
  writeln ('4-Exit');

   readln (d);
  case d of
   '1':Vvod;
   '2':Vivod;
   '4':exit;
  end;
 end;
end.
iCaesy вне форума Ответить с цитированием
Старый 02.11.2011, 01:50   #2
val_nnm
Форумчанин
 
Регистрация: 18.10.2009
Сообщений: 185
По умолчанию

1) Вы написали "if // ВОТ ТУТ НУЖНО ДОБАВИТЬ СОРТИРОВКУ ПО ГОДУ РОЖДЕНИЯ." это както наводит на мысль что вы хотели сделать выбор года для которого выводить студентов? Или всёже нужна сортировка?
2) Дело в том что в вашем коде студенты считываються из файла по 1. И соответсвенно выводяться по 1 без сохранения всего списка в памяти.
Простые методы сортировки требуют чтобы был доступен одновременно весь список сортируемых данных. Т.е. нужно прочитать весь список студентов сохранить его в памяти, отсоритровать и вывести на экран данные из памяти. Тут встаёт вопрос хранить ли список в массиве фиксировнного размера либо использовать динамичискую память?
Также существуют алгоритмы внешней сортировки (например сортировка слиянием). Для них необязательно сохранять все данные в памяти, но их реализация намного сложнее простой сортировки в памяти.
На С# пишу лучше чем на русском.
"У меня правильнописание хромает. Оно хорошее, но почему-то хромает."
val_nnm вне форума Ответить с цитированием
Старый 02.11.2011, 02:29   #3
iCaesy
In progress...
Форумчанин
 
Регистрация: 25.09.2011
Сообщений: 161
По умолчанию

Я просто пытался сделать через if вот он там и стоит, мне без разницы как это будет реализовано.
iCaesy вне форума Ответить с цитированием
Старый 02.11.2011, 11:56   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Я просто пытался сделать через if вот он там и стоит, мне без разницы как это будет реализовано.
я Вас расстрою. через If подобные вещи не реализуешь. Точнее, этого недостаточно! Нужно, чтобы было что с чем сравнивать.
Я бы объявил массивчик, записей на 500. (причём, если в файле БОЛЬШЕ, чем размер этого массива - то материться и отказываться сортировать данные!)
Без условно, можно и неограниченное количество записей сортировать, но там уже или очень сложно, и/или при этом не очень эффективно. на форуме были решения сортировки типизированного файла без массива прямо в самом файле. я лично писал пример такого решения. Однако, я не думаю, что подобноее решение имеет хоть малейшее практическое применение. Скорость и эффективность манипулирования данными в ОЗУ и на hard-drive отличается в сотни (тысячи раз). я уже не говорю про износ диска...

поэтому, можно вот так поступить:
Код:
type
 z=record
 srbal:real;
 Fam,Im,Grup:string[20];
 Godr:1950..2000;
end;

const
  maxCount = 500;

type
  Massive_of_ZAP = array[1.. maxCount] of z;

.....
......

Procedure Vivod;
var 
 Mas : Massive_of_ZAP;
 i, j, CountRecN : integer;
 msX : z;
begin
 reset (f);

 CountRecN := FileSize(f);
 if CountRecN>MaxCount then begin 
   WriteLn('Извини, милок, записей в файле ',CountRecN, 
    ' это больше макс.возможного числа ',maxCount);  
   close (f);  {закрыть файл} 
   Exit; {выйти из процедуры вывода}
 end;

 {прочитать файл в массив в память}
 for i:=1 to CountRecN do read (f, Mas[i]);

 {закрыть файл}
 close (f);


  {сортировка массива методом простых обменов ("пузырька") }
 for i:=1 to CountRecN-1 do
    for j:=i+1 to CountRecN do
      if Mas[i].Godr > Mas[j].Godr then
        begin
          msX:=Mas[i];
          Mas[i]:=Mas[j];
          Mas[j]:=msX
        end;

 {вывод отсортированного массива записей}   
 for i:=1 to CountRecN do
    begin
     writeln (' ',Mas[i].fam);
     writeln (Mas[i].im);
     writeln (Mas[i].grup);
     writeln ('God rojdeniya: ',Mas[i].godr);
     writeln ('Sr-Reyting: ',Mas[i].srbal);
    end;

 readln;
end;
p.s код не проверял!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 02.11.2011, 20:47   #5
iCaesy
In progress...
Форумчанин
 
Регистрация: 25.09.2011
Сообщений: 161
По умолчанию

Спасибо.

Код:
program зк;
uses crt;
type
 z=record
 srbal:real;
 Fam,Im,Grup:string[20];
 Godr:1950..2000;
end;

const
  maxCount = 500;

type
  Massive_of_ZAP = array[1.. maxCount] of z;

var i,n:integer; c,d:char;
 f:file of z; x:z; b:real;
  
procedure vvod;
 begin
  rewrite(f);
  Seek (F, FileSize(F));
  write (f,x);
  clrscr;
  writeln('Vvedite kol-vo studentov:');
  readln(n);
   for i:=1 to n do
    begin
     writeln ('Familiya'); readln (x.fam);
     writeln ('Imya'); readln (x.Im);
     writeln ('Gruppa'); readln (x.grup);
     writeln ('God rojdeniya <1950..2000>'); readln (x.godr);
     writeln ('Sr-Reyting'); readln (x.srbal);
     Seek (F, FileSize(F));
     write (f,x);
    end;
end;

Procedure Vivod;
var
 Mas : Massive_of_ZAP;
 i, j, CountRecN : integer;
 msX : z;
begin
 reset (f);

 CountRecN := FileSize(f);
 if CountRecN>MaxCount then begin
   WriteLn('Erorr ',CountRecN'= ',maxCount);
   close (f);  
   Exit; 
 end;
 for i:=1 to CountRecN do read (f, Mas[i]);
 close (f);

 for i:=1 to CountRecN-1 do
    for j:=i+1 to CountRecN do
      if Mas[i].Godr > Mas[j].Godr then
        begin
          msX:=Mas[i];
          Mas[i]:=Mas[j];
          Mas[j]:=msX
        end;

 for i:=1 to CountRecN do
    begin
     writeln (' ',Mas[i].fam);
     writeln (Mas[i].im);
     writeln (Mas[i].grup);
     writeln ('God rojdeniya: ',Mas[i].godr);
     writeln ('Sr-Reyting: ',Mas[i].srbal);
    end;

 readln;
end;

begin
assign (f,'LAB8_f.dat');
  while true do
  begin
   clrscr;
  writeln ('1-Vvod studentov ');
  writeln ('2-Vivod studentov ');
  writeln ('4-Exit');

   readln (d);
  case d of
   '1':Vvod;
   '2':Vivod;
   '4':exit;
  end;
 end;
end.

Последний раз редактировалось iCaesy; 02.11.2011 в 20:49.
iCaesy вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сортировка паскаль Arabic_Coffee Помощь студентам 1 18.05.2011 21:03
Паскаль. Сортировка recerpascal Помощь студентам 3 20.04.2011 00:42
Сортировка, Паскаль masterlomaster Помощь студентам 1 16.12.2010 11:16
паскаль,одномерный массив,сортировка вставка,сортировка убывания,от максимального до конца немозг Помощь студентам 11 06.02.2010 21:57