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

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

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

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

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

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

Вводим:
Название кафедры
Факультет
№ Корпуса
Кол-во сотрудников
Кол-во сотрудников со званиями

Нужно отсортировать и вывести на экран кафедры 1го корпуса у которых кол-во сотр меньше 10.

Набросал примерно процедуру сортировки, естественно не работает...


Код:
uses crt;
type
 z=record
 kaf,fak:string[20];
 korp,sotr,sotrz:integer;
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 kafedr:');
  readln(n);
   for i:=1 to n do
    begin
     writeln ('Nazvanie kafedri: '); readln (x.kaf);
     writeln ('Nazvanie fakulteta: '); readln (x.fak);
     writeln ('Korpus: '); readln (x.korp);
     writeln ('Kol-vo sotrudnikov: '); readln (x.sotr);
     writeln ('Kol-so krutih sotrudnikov: '); readln (x.sotrz);
     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('Error');
   close (f);
   Exit;
 end;


 for i:=1 to CountRecN do read (f, Mas[i]);


 close (f);

 for i:=1 to CountRecN do
    begin
     writeln (' ',Mas[i].kaf);
     writeln ('Fakultet:  ',Mas[i].fak);
     writeln (' ');
     writeln ('Korpus:  ',Mas[i].korp);
     writeln ('Sotrudnikov:  ',Mas[i].sotr);
     writeln ('Krutih sotrudnikov:  ',Mas[i].sotrz);
     writeln (' ');
    end;

 readln;
end;

procedure Sort;
var
Mas : Massive_of_ZAP;
 i, j, CountRecN : integer;
begin
 for i:=1 to CountRecN-1 do
    for j:=i+1 to CountRecN do
 if (Mas[i].korp>1) and (Mas[i].sotr>10) then
    begin
     writeln (' ',Mas[i].kaf);
     writeln ('Fakultet:  ',Mas[i].fak);
     writeln (' ');
     writeln ('Korpus:  ',Mas[i].korp);
     writeln ('Sotrudnikov:  ',Mas[i].sotr);
     writeln ('Krutih sotrudnikov:  ',Mas[i].sotrz);
     writeln (' ');
    end;


end;


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

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

Тут скорее не сортировка нужна а фильтрация? А если отфильтровать и отсортировать то по какому полю отсортировать?
Код:
procedure Sort;
var
Mas : Massive_of_ZAP;
 i, CountRecN : integer;
begin
  reset (f);
  CountRecN := FileSize(f);
  if CountRecN>MaxCount then begin
    WriteLn('Error');
    close (f);
    Exit;
  end;

  for i:=1 to CountRecN do read (f, Mas[i]);

  close (f);
  for i:=1 to CountRecN do
    if (Mas[i].korp=1) and (Mas[i].sotr<10) then
      begin
        writeln (' ',Mas[i].kaf);
        writeln ('Fakultet:  ',Mas[i].fak);
        writeln (' ');
        writeln ('Korpus:  ',Mas[i].korp);
        writeln ('Sotrudnikov:  ',Mas[i].sotr);
        writeln ('Krutih sotrudnikov:  ',Mas[i].sotrz);
        writeln (' ');
      end;
end;
На С# пишу лучше чем на русском.
"У меня правильнописание хромает. Оно хорошее, но почему-то хромает."
val_nnm вне форума Ответить с цитированием
Старый 07.11.2011, 01:36   #3
iCaesy
In progress...
Форумчанин
 
Регистрация: 25.09.2011
Сообщений: 161
По умолчанию

Цитата:
Сообщение от val_nnm Посмотреть сообщение
Тут скорее не сортировка нужна а фильтрация? А если отфильтровать и отсортировать то по какому полю отсортировать?
Код:
procedure Sort;
var
Mas : Massive_of_ZAP;
 i, CountRecN : integer;
begin
  reset (f);
  CountRecN := FileSize(f);
  if CountRecN>MaxCount then begin
    WriteLn('Error');
    close (f);
    Exit;
  end;

  for i:=1 to CountRecN do read (f, Mas[i]);

  close (f);
  for i:=1 to CountRecN do
    if (Mas[i].korp=1) and (Mas[i].sotr<10) then
      begin
        writeln (' ',Mas[i].kaf);
        writeln ('Fakultet:  ',Mas[i].fak); <-
        writeln (' ');
        writeln ('Korpus:  ',Mas[i].korp);
        writeln ('Sotrudnikov:  ',Mas[i].sotr);
        writeln ('Krutih sotrudnikov:  ',Mas[i].sotrz);
        writeln (' ');
      end;
end;
Это моя процедура, она явно не правильна. А отсортировать по корпусу, и кол-во сотрудников.
Mas[i].korp
Mas[i].sotr
iCaesy вне форума Ответить с цитированием
Старый 07.11.2011, 01:43   #4
iCaesy
In progress...
Форумчанин
 
Регистрация: 25.09.2011
Сообщений: 161
По умолчанию

все сделал
iCaesy вне форума Ответить с цитированием
Старый 07.11.2011, 01:53   #5
val_nnm
Форумчанин
 
Регистрация: 18.10.2009
Сообщений: 185
По умолчанию

Может типа токого хотите?
Она сортирует записи по паре ключей korp, sotr но не фильтрует
Если хотите отфильтровать разкоментируйте строчку "{ if (Mas[i].korp=1) and (Mas[i].sotr<10) then }"
Код:
procedure Sort;
var
Mas : Massive_of_ZAP;
 i, CountRecN : integer;
 b:boolean;
 c:integer;
 temp:z;
begin
  reset (f);
  CountRecN := FileSize(f);
  if CountRecN>MaxCount then begin
    WriteLn('Error');
    close (f);
    Exit;
  end;

  for i:=1 to CountRecN do read (f, Mas[i]);

  close (f);
  b := true;
  while (b) do
    b := false;
    for i := 1 to CountRecN-1 do Begin
      c := 0;
      if (Mas[i].korp>Mas[i+1].korp) then c := 1;
      if (Mas[i].korp<Mas[i+1].korp) then c := -1;
      if (c = 0) then Begin
        if ((Mas[i].sotr>Mas[i+1].sotr)) then c := 1;
        if ((Mas[i].sotr<Mas[i+1].sotr)) then c := -1;
      end;
      if (c>0) then Begin
        temp := Mas[i];
        Mas[i] := Mas[i+1];
        Mas[i+1] := temp;
        b := true;
      end;
    end;
  for i:=1 to CountRecN do
{    if (Mas[i].korp=1) and (Mas[i].sotr<10) then }
      begin
        writeln (' ',Mas[i].kaf);
        writeln ('Fakultet:  ',Mas[i].fak);
        writeln (' ');
        writeln ('Korpus:  ',Mas[i].korp);
        writeln ('Sotrudnikov:  ',Mas[i].sotr);
        writeln ('Krutih sotrudnikov:  ',Mas[i].sotrz);
        writeln (' ');
      end;
end;
p.s. Сделал сортировку пузырьковым методом. Код не проверял.
На С# пишу лучше чем на русском.
"У меня правильнописание хромает. Оно хорошее, но почему-то хромает."
val_nnm вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сортировка массива методами предсортировки и слияния, и пирамидальная сортировка. lenny_24 Помощь студентам 2 17.04.2011 18:57
сортировка массива mego4el Помощь студентам 7 01.03.2011 21:30
Сортировка массива. n0rma1 Помощь студентам 9 25.04.2010 17:24
Сортировка массива Paladast Помощь студентам 2 18.01.2010 16:28
С:Сортировка массива Crazy_caramel Помощь студентам 1 18.11.2009 23:15