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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.03.2009, 00:38   #1
777Артём777
 
Регистрация: 21.11.2008
Сообщений: 3
По умолчанию Нужна помощь в сортировке

Ребят помогите пожалуйста готова задача кроме сортировки, надо выполнить сортировку студентов по среднему балу помогите... Вот код программы


unit StudSpis;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Buttons, Grids, StdCtrls;

const NumSemestr=10;

type
TFormStud = class(TForm)
SGstud: TStringGrid;
Add: TButton;
Del: TButton;
Izmenenie: TButton;
Uporyd: TButton;
CloseStud: TButton;
procedure FormShow(Sender: TObject);
procedure AddClick(Sender: TObject);

private
{ Private declarations }
public
{ Public declarations }
end;

TStud=record
FIO: string [80];
Year: TDateTime;
MedB: array [1..NumSemestr] of real;
Kurs: byte;
Group: byte;
sredbal:real;

end;
fil = file of TStud;

var
FormStud: TFormStud;
kol: integer;
f: fil;
stud: TStud;


procedure displayall(SGstud: TStringGrid);

implementation

uses AddStud, DelStud, IzmenStud;




{$R *.dfm}

procedure autocaption(SGstud: TStringGrid);
begin
with SGstud do
begin
Cells[0, 0] := '№';
Cells[1, 0] := 'ФИО';
Cells[2, 0] := 'Дата рожд-я';
Cells[3, 0] := 'Курс';
Cells[4, 0] := 'Группа';
Cells[5, 0] := '1';
Cells[6, 0] := '2';
Cells[7, 0] := '3';
Cells[8, 0] := '4';
Cells[9, 0] := '5';
Cells[10, 0] := '6';
Cells[11, 0] := '7';
Cells[12, 0] := '8';
Cells[13, 0] := '9';
Cells[14, 0] := '10';
Cells[15, 0] := 'Ср.Балл'
end;
end;

procedure display(SGstud: TStringGrid; stud: TStud; k: integer);
var i: integer;
begin //отображение одной записи
with SGstud do
begin
Cells[0, k] := inttostr(k);
Cells[1, k] := stud.FIO;
Cells[2, k] := datetostr(stud.Year);
Cells[3, k] := inttostr(stud.Kurs);
Cells[4, k] := inttostr(stud.Group);
for i:=5 to 14 do begin
Cells [i, k] := floattostr(stud.MedB[i - 4]);
end;
Cells[15,k]:= Floattostr(stud.sredbal);
end;
end;

procedure displayall(SGstud: TStringGrid); //отображение таблицы
begin
kol := 0;
assignfile(f, 'Stud.dat');
autocaption(SGstud);
reset(f);

while not(eof(f)) do //считывание из файла каждый раз по записи
begin
kol := kol + 1;
read(f, stud);
display(SGstud, stud, kol);
end;
SGstud.RowCount := filesize(f) + 1;

closefile(f);
end;

procedure TFormStud.FormShow(Sender: TObject);
begin
kol := 0;
displayall(SGstud);
end;

procedure TFormStud.AddClick(Sender: TObject);
begin
FormAdd.Show;
end;
end.


unit AddStud;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Buttons, StdCtrls, Grids;

type
TFormAdd = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Edit4: TEdit;
Edit5: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
AddStud: TSpeedButton;
StringGrid1: TStringGrid;
SrbalStud: TButton;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
Label10: TLabel;
Label11: TLabel;
Label12: TLabel;
Label13: TLabel;
Label14: TLabel;
Label15: TLabel;
Label16: TLabel;
procedure AddStudClick(Sender: TObject);
procedure CloseAddClick(Sender: TObject);
procedure SrbalStudClick(Sender: TObject);

private
{ Private declarations }
public
{ Public declarations }
end;

var
FormAdd: TFormAdd;

implementation

{$R *.dfm}

uses StudSpis, DelStud;

procedure TFormAdd.SrbalStudClick(Sender: TObject);
var //Подсчитуем средний балл за все семестры
srbal:real;
x,y:real;
begin
x:= strtofloat(Edit4.text);
y:= x*2;
with StringGrid1 do
begin

srbal:=((strtofloat(cells[0,0]))+(strtofloat(cells[1,0]))+(strtofloat(cells[2,0]))+
(strtofloat(cells[3,0]))+(strtofloat(cells[4,0]))+(strtofloat(cells[5,0]))+
(strtofloat(cells[6,0]))+(strtofloat(cells[7,0]))+(strtofloat(cells[8,0]))
+(strtofloat(cells[9,0])))/y;
end;
with StringGrid1 do
begin
cells[10,0] := floattostr(srbal);
end;
end;

procedure TFormAdd.AddStudClick(Sender: TObject);
var
i: integer;
begin
stud.FIO := edit1.text;
stud.Year := strtodate(edit2.text);
stud.Kurs := strtoint(edit4.text);
stud.Group := strtoint(edit5.text);
with StringGrid1 do
begin
for i := 0 to 9 do
stud.MedB[i + 1] := strtofloat(Cells[i, 0]);
stud.sredbal:=strtofloat(cells[10,0]);
end;

reset(f);
seek(f, filesize(f));
write(f, stud);
closefile(f);
displayall(FormStud.SGstud);
FormAdd.Close;
end;
end.
777Артём777 вне форума Ответить с цитированием
Старый 14.03.2009, 00:52   #2
eskander
Пользователь
 
Аватар для eskander
 
Регистрация: 01.03.2009
Сообщений: 29
По умолчанию

А что вызывает у вас трудность?
Используйте простейшую сортировку пузырьком по "sredbal"(wikipedia)
eskander вне форума Ответить с цитированием
Старый 14.03.2009, 00:57   #3
777Артём777
 
Регистрация: 21.11.2008
Сообщений: 3
По умолчанию

Чё та я с ним сильно запутался
777Артём777 вне форума Ответить с цитированием
Старый 14.03.2009, 09:17   #4
AndrzejX
Пользователь
 
Регистрация: 12.11.2008
Сообщений: 55
По умолчанию

Компонент ComboBox прекрасно сортирует свои строки. Его параметр Sorted поставь в True. Заведи туда строки вида 'сред.балл пробел ФИО' типа
4,7 Иванов
4,5 Петров
3,7 Сидоров
Он выдаст по возрастанию первых символов, т.е.
3,7 Сидоров
4,5 Петров
4,7 Иванов
и всё...
Скажешь, ComboBox мне в программе не нужен - Так сделай его невидимым.
AndrzejX вне форума Ответить с цитированием
Старый 14.03.2009, 09:39   #5
CahekG
Пользователь
 
Регистрация: 25.02.2009
Сообщений: 28
По умолчанию

А если есть желание самому организовать сортировку.
Например чтобы номера сортировались в порядки их возрастания а не так что 101 идет раньше чем 25 к примеру,
или лишнии пробелы между фамилией и именем (в данном случае надо доработать функцию сравнения), то вот пример
А вообще я drawgrid использовал раньше, она в drawcell сразу из файла брала строки, а для работы с файлом компоненту сделал там и индексный доступ организовал (файлы были DBF, делал надстройку старой ДОС программе, которую не чем было заменить )
А сортировка с перемещением строк при больших количествах может времени много занять

Кстати в процедуре procedure displayall(SGstud: TStringGrid); //отображение таблицы
строка SGstud.RowCount := filesize(f) + 1; стоит после заполнения таблицы, а размер надо задать до её заполнения!
Код:

// обмен строки с предыдущей строркой
procedure Echng(RowE:integer;var SGrid: TStringGrid);
var j:integer;s:string;
begin
 // проверяем пределы, на всякий случай
 if (RowE>=SGrid.RowCount) or (RowE<2) then exit;
 for j:=0 to pred(SGrid.ColCount) do
   with SGrid do
     begin
      s:=Cells[j,RowE];Cells[j,RowE]:=Cells[j,pred(RowE)];Cells[j,pred(RowE)]:=s;
     end;
end;

// сравниваем две строки
// при желании можно сравнивать по определённому алгоритму
// например игнорируя одинаковые по написанию Лат/Рус
// или игнорируя пробелы внутри текста, которые мешают правильной сортировке
// "правильно" для восприятия человека - два пробела после фамилии к примеру
function Compare(s1,s2:string;a:boolean):boolean;
var i1,j1,i2,j2:integer;
begin
 Compare:=false;
 val(s1,i1,j1);
 if (j1>0)  then
  begin
   if a then begin if S1>S2 then Compare:=true; end else if S2>S1 then Compare:=true;
   exit;
  end;
  val(s2,i2,j2);
   if (j2>0)  then
    begin
        if a then begin if S1>S2 then Compare:=true; end else if S2>S1 then Compare:=true;
    end
    else
         if a then begin if i1>i2 then Compare:=true; end else if i2>i1 then Compare:=true;
end;

// сама процедура пузырьковой сортировки
// procedure Sort(Colum:integer;var SGrid: TStringGrid;A:boolean = false);
//  Colum - Колонка для сортировки
// A - направление, по умолчанию по возрастанию 
procedure Sort(Colum:integer;var SGrid: TStringGrid;A:boolean = false);
var i:integer;
NextS:boolean;
begin
// проверяем на всякий случай колонку по которой сортируем 
if (Colum>=SGrid.ColCount) and (Colum<0)  then exit;
// этот цикл повторяется 
// до тех пор пока не будет ни одного обмена соседних элементов
repeat
i:=2;
NextS:=true;
while i<=pred(SGrid.RowCount) do
 begin
   with SGrid do
    begin
     if Compare(Cells[Colum,pred(i)],Cells[Colum,i],A) then
        begin
          NextS:=false;
          Echng(i,SGrid);
        end;
     end;
   inc(i);
  end;
 until NextS;
end;

Последний раз редактировалось CahekG; 14.03.2009 в 10:33.
CahekG вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
нужна помощь DIzza Помощь студентам 54 22.02.2009 13:29
Двумерный массив в сортировке anco Паскаль, Turbo Pascal, PascalABC.NET 21 21.06.2008 00:49
Вопрос по сортировке Ermiss БД в Delphi 5 17.02.2008 17:32
Ошибка в сортировке Veiron Общие вопросы Delphi 14 21.01.2008 21:35
Нужна помощь!!! Anil Помощь студентам 0 04.12.2007 17:32