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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.01.2013, 14:05   #1
neytron007
Пользователь
 
Регистрация: 05.10.2012
Сообщений: 15
По умолчанию [Delphi] Задача на типизированные файлы. При работе часто вылетает окно 'CPU'. В чем проблема?

Задача: Упорядочить список студентов заданной группы по среднему баллу, вывести его.
При работе в большинстве случаев вылетает окно "CPU". Работает, только если я перед сортировкой нажму все кнопки: добавить,изменить, удалить запись(но в них ошибки не должно быть...скорее всего проблема в процедуре сортировки).

Код:
Код:
unit Unit1;

interface

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

const NumSemestr=10;

type
  TMainForm = class(TForm)
    AddButton: TButton;
    DelButton: TButton;
    ChangeButton: TButton;
    SortButton: TButton;
    StringGridStud: TStringGrid;
    procedure FormShow(Sender: TObject);
    procedure DelButtonClick(Sender: TObject);
    procedure ChangeButtonClick(Sender: TObject);
    procedure AddButtonClick(Sender: TObject);
    procedure SortButtonClick(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;
        srBal: Real;
  end;

  fil = file of TStud;

var
  MainForm: TMainForm;
  f: fil;
  s: TStud;
  procedure SetGrid(StringGridStud: TStringGrid);
implementation

uses Unit3, Unit4, Unit2;

{$R *.dfm}

procedure autocaption(StringGridStud: TStringGrid);
begin
  with StringGridStud do
  begin
    Cells[0, 0] := '№';
    Cells[1, 0] := 'ФИО';
    Cells[2, 0] := 'Дата рожд.';
    Cells[3, 0] := 'Курс';
    Cells[4, 0] := 'Группа';
    Cells[5, 0] := 'I';
    Cells[6, 0] := 'II';
    Cells[7, 0] := 'III';
    Cells[8, 0] := 'IV';
    Cells[9, 0] := 'V';
    Cells[10, 0] := 'VI';
    Cells[11, 0] := 'VII';
    Cells[12, 0] := 'VIII';
    Cells[13, 0] := 'IX';
    Cells[14, 0] := 'X';
    Cells[15, 0] := 'ср.б.';
  end;
end;

procedure SetGrid(StringGridStud: TStringGrid); //заполнение таблицы
var
  i,kol: integer;
begin
  kol := 0;
  assignfile(f, 'Stud.dat');
  autocaption(StringGridStud);
  Reset(f);

  while not(eof(f)) do
  begin
    kol := kol + 1;
    read(f, s);
    with StringGridStud do
    begin
      Cells[0, kol] := inttostr(kol);
      Cells[1, kol] := s.FIO;
      Cells[2, kol] := datetostr(s.Year);
      Cells[3, kol] := inttostr(s.Kurs);
      Cells[4, kol] := inttostr(s.Group);
      for i:=5 to 14 do
        Cells [i, kol] := floattostr(s.MedB[i - 4]);
      Cells[15, kol] := FloatToStr(s.srBal);
    end;
  end;
  StringGridStud.RowCount := kol + 1;

  closefile(f);
end;

procedure TMainForm.FormShow(Sender: TObject);
begin
  SetGrid(StringGridStud);
end;

procedure TMainForm.DelButtonClick(Sender: TObject);  //удалить студента
begin
  Delete.Show;
end;

procedure TMainForm.ChangeButtonClick(Sender: TObject); //изменить студента
begin
  Change.Show;
end;

procedure TMainForm.AddButtonClick(Sender: TObject);  //добавить студента
begin
  Add.Show;
end;

procedure TMainForm.SortButtonClick(Sender: TObject);
var
  i,n: Integer;
  s1: array of TStud;
  flag: Boolean;
  f2: fil;
  c: TStud;
begin
  AssignFile(f, 'Stud.dat');
  Reset(f);

  AssignFile(f2, 'Stud_sort.dat');
  Rewrite(f2);
  SetLength(s1,filesize(f));
  i := 0;
  n := 0;
  while not (Eof(f)) do
  begin
    i := i+1;
    n := n+1;
    read(f,s);
    s1[i] := s;
  end;

  CloseFile(f);

  repeat
    flag := True;
    for i := 1 to n-1 do
    if not (s1[i].srBal>=s1[i+1].srBal) then
    begin
      c:=s1[i];
      s1[i]:=s1[i+1];
      s1[i+1]:=c;
      flag:=False;
    end;
  until flag;

  for i:=1 to n do write(f2,s1[i]);

  CloseFile(f2);

  autocaption(StringGridStud);

  assignfile(f2, 'Stud_sort.dat');
  reset(f2);

  n := 0;
  while not(eof(f2)) do
  begin
    n := n + 1;
    read(f2, s);
    with StringGridStud do
    begin
      Cells[0, n] := inttostr(n);
      Cells[1, n] := s.FIO;
      Cells[2, n] := datetostr(s.Year);
      Cells[3, n] := inttostr(s.Kurs);
      Cells[4, n] := inttostr(s.Group);
      for i:=5 to 14 do
        Cells [i, n] := floattostr(s.MedB[i - 4]);
      Cells[15, n] := FloatToStr(s.srBal);
    end;
  end;

  StringGridStud.RowCount := n + 1;

  closefile(f2);
end;

end.
neytron007 вне форума Ответить с цитированием
Старый 03.01.2013, 14:28   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

ну, так, навскидку, я могу указать только на одну ошибку.
Вы совершенно забываете о том, что динамические массивы в Delphi индексируются от нуля.
Поэтому, читать нужно так:
Код:
  n := filesize(f);
  SetLength(s1, n);
  i := 0;
  while not (Eof(f)) do
  begin
    read(f,s1[i]);
    i := i+1;
  end;
а сортировать так:
Код:
 repeat
    flag := True;
    for i := 0 to n-2 do
    if not (s1[i].srBal>=s1[i+1].srBal) then
"окошко CPU" может возникать по разным причинам. Например, из за выхода за пределы используемой памяти, или при обращении к методу объекта, который ещё не создан (например, Delete.Show / Change.Show / Add.Show и т.д.)



Вы бы лучше исходники проекта запаковали в архив и архив выложили на форум - больше шансов получить конкретный ответ и/или готовый исправленный код..
Serge_Bliznykov вне форума Ответить с цитированием
Старый 03.01.2013, 19:25   #3
neytron007
Пользователь
 
Регистрация: 05.10.2012
Сообщений: 15
По умолчанию

точно!... спасибо большое, теперь вроде корректно работает странно, раньше пользовался индексированием с единицы в динамических массивах, хотя и помню, что говорили надо с 0, но вроде все работало правильно, поэтому и не придавал этому значения...до этой задачи...теперь учту это
neytron007 вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Небольшая проблема при работе с текстом (Delphi 7) beautifulboy Помощь студентам 2 21.11.2012 01:37
Очень нужно сделать задачу в Delphi(Типизированные файлы. файлы записи) Vitalik1 Помощь студентам 1 16.12.2011 10:38
Проблема при работе с датами sql server в delphi Fellot БД в Delphi 3 05.06.2010 22:50
Типизированные файлы (Delphi) ЭлЭрДжи Помощь студентам 1 04.01.2010 08:29
Часто вылетает клиент ICQ Виктор Вертиев Помощь студентам 3 15.10.2008 00:08