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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.10.2007, 13:19   #1
Gorinicher
 
Регистрация: 22.10.2007
Сообщений: 7
Восклицание Задача на Delphi

Доброго времени суток всем, кто заглянул в эту тему!!!
Условие:
Каждая запись типа tz содержит в 1 поле – номер, в 2 поле название группы (string [8]), в поле 3 – фамилию (string [12]), а в 4,5,6 полях – 3 оценки студента.
Составить программу с меню, содержащую 4 обработчика его пунктов выполняющих:
А) Создание файла ‘999.dat’ типа ftz=File of tz из 5 записей.
В) Отображение в таблице StringGrid данных файлов типа ftz.
С) Создание файла ‘999.max’ из двух записей файла ‘999.dat’ с минимальными номерами.
Д) Создание файла ‘999.gr’ из записей ‘999.dat’ сгруппированных по названиям групп.

Преподавателю в особенности не нравиться как я реализую пункт С.

Вот сама задача в реализации, то что у меня получилось:

Код:
 
unit Unit1;
 
interface
 
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, Grids;
 
type
TForm1 = class(TForm)
MainMenu1: TMainMenu;
StringGrid1: TStringGrid;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N11: TMenuItem;
N21: TMenuItem;
procedure Formcreate(Sender: TObject);
procedure N2Click(Sender: TObject);
procedure N3Click(Sender: TObject);
procedure N4Click(Sender: TObject);
procedure N5Click(Sender: TObject);
 
private
{ Private declarations }
public
{ Public declarations }
end;
tz=record
Nom:integer;
Gruppa:string[8];
Fam:string[12];
o1,o2,o3:integer;
end;
tfz=File of tz;
tm=array[1..5] of tz;
var
Form1: TForm1;
f:tfz;
m:tm=((Nom:1;Gruppa:'ИУ1-3';Fam:'Иванов';o1:2;o2:3;o3:4),
(Nom:2;Gruppa:'ИУ2-4';Fam:'Петров';o1:3;o2:4;o3:5),
(Nom:3;Gruppa:'ИУ3-5';Fam:'Сидоров';o1:4;o2:5;o3:2),
(Nom:4;Gruppa:'ИУ4-1';Fam:'Лавров';o1:5;o2:2;o3:3),
(Nom:5;Gruppa:'ИУ5-2';Fam:'Кашин';o1:2;o2:3;o3:4));
implementation
 
{$R *.dfm}
 
procedure TForm1.Formcreate(Sender: TObject);
begin
stringgrid1.ColCount:=6;
stringgrid1.RowCount:=6;
stringgrid1.options:=stringgrid1.options+[goEditing];
stringgrid1.FixedRows:=1;
stringgrid1.FixedCols:=0;
StringGrid1.Cells[0,0]:='№';
stringgrid1.cells[1,0]:='Группа';
stringgrid1.cells[2,0]:='Фамилия';
stringgrid1.cells[3,0]:='O1';
stringgrid1.cells[4,0]:='O2';
stringgrid1.cells[5,0]:='O3';
end;
 
procedure TForm1.N2Click(Sender: TObject);
Var i:integer;
begin
assignFile(f, '999.dat');
rewrite(f);
For i:=1 to 5 do
Write(f,m[i]);
closeFile(f);
end;
 
 
procedure TForm1.N3Click(Sender: TObject);
var z1,z2:tz; f1,f2:tfz; i,j,n:integer;
begin
assignfile(f1, '999.dat');//связываем файловую переменную f1 c файлом 999.dat
assignfile(f2, '999.max');//связываем файловую переменную f2 с файлом 999.max
reset(f1);//открываем файл f1 для чтения
rewrite(f2);//создаем файл f2, если он был создан то очищаем его
read(f1,z1);
n:=z1.Nom;
Seek(f1,0);
for i:=1 to 2 do begin
read(f1,z2);//читаем запись с которой мы будем сравнивать
if (z2.Nom=n) and (i<>n) then read(f1,z2);//если вдруг намер этой записи оказался наименьшим
Seek(f1,0);//переводим на начало указатель
while (not Eof(f1)) do begin
read(f1,z1);//читаем запись для сравнения
if ((z1.Nom<z2.Nom) and (z1.Nom<>n)) then //если номер записи меньше текущей
z2:=z1;//то записываем ее в z2
end;
n:=z2.Nom;//запоминаем номер наименьшей записи
Seek(f1,0);//переводим на начало указатель
write(f2,z2);//записываем наименьшую запись в файл f2
end;//конец цикла
closefile(f1);//закрываем файл f1
closefile(f2);//закрываем файл f2
end;//конец процедуры N11Click
 
procedure TForm1.N4Click(Sender: TObject);
Var i:integer;
z:tz;
begin
assignFile(f, '999.gr');
reset(f);
i:=1;
while Not Eof(f) do
Begin
read(f,z);
stringgrid1.Cells[0,i]:=intToStr(z.Nom);
stringgrid1.Cells[1,i]:=z.Gruppa;
stringgrid1.Cells[2,i]:=z.Fam;
stringgrid1.Cells[3,i]:=IntToStr(z.o1);
stringgrid1.Cells[4,i]:=IntToStr(z.o2);
stringgrid1.Cells[5,i]:=IntToStr(z.o3);
i:=i+1;
End;
 
end;
 
procedure TForm1.N5Click(Sender: TObject);
var i,j,leng:integer; z1,z2:tz; st:string; f1,f2:tfz; stat:array of bool;
begin
assignfile(f1, '999.dat');//связываем файловую переменную с файлом 999.dat
assignfile(f2, '999.gr');//связываем файловую переменную с файлом 999.gr
reset(f1);//открываем файл для чтения
rewrite(f2);//создаем файл, если он был создан то очищаем его
leng:=filesize(f1);//запоминаем длину файла
Setlength(stat,leng);//устанавливаем длину динамического массива
for i:=0 to leng-1 do begin //заполняем false массив статусов
stat[i]:=false;
end;
i:=0;
while i<leng do begin
read(f1,z1);//читаем запись z1, с которой дальше будем сравнивать
if (stat[i]<>true) then begin //если мы ее еще не записали в файл f2
Seek(f1, 0);//переводим указатель на начало
j:=0;
while (j<leng) do begin
read(f1,z2);//читаем запись z2
if (z2.Gruppa=z1.Gruppa) then begin //если названия групп совпадают
stat[j]:=true; //запоминаем что мы записали эту запись в файл
write(f2,z2);//записываем запись z2 в файл
end;
j:=j+1;
end;
Seek(f1, i+1);//переводим указатель на следующую запись
end;
i:=i+1;
end;
closefile(f1);//закрываем файл f1
closefile(f2);//закрываем файл f2
end;
 
end.

Заранее всех благодарю, кто откликнеться на зов о помощи!!!!!!
Gorinicher вне форума Ответить с цитированием
Старый 22.10.2007, 13:26   #2
Maslan
Форумчанин
 
Регистрация: 15.10.2007
Сообщений: 147
По умолчанию

А не говорит препод ЧТО не нравится?
Maslan вне форума Ответить с цитированием
Старый 22.10.2007, 13:39   #3
Gorinicher
 
Регистрация: 22.10.2007
Сообщений: 7
По умолчанию

Он всё время говорит "а вы минимум то искать умеете?", этой фразой он меня в тупик ставит.
Gorinicher вне форума Ответить с цитированием
Старый 22.10.2007, 13:44   #4
Maslan
Форумчанин
 
Регистрация: 15.10.2007
Сообщений: 147
По умолчанию

эммммм. прикольно.....
Я твою N3Click переделал чуток:
Код:
var z1,z2:tz; f1,f2:tfz; i,j,n:integer;
begin
assignfile(f1, '999.dat');//связываем файловую переменную f1 c файлом 999.dat
assignfile(f2, '999.max');//связываем файловую переменную f2 с файлом 999.max
reset(f1);//открываем файл f1 для чтения
rewrite(f2);//создаем файл f2, если он был создан то очищаем его
{***}
read(f1,z1);//Читаем очередную запись
while not Eof(f1) do//перебираем все записи в файле
 begin
   read(f1,z2);//читаем очередной для сравнения
   if z1.Nom > z2.Nom then// если он меньше, то 
       z1:=z2; // z1:=z2 =)
 end;
write(f2,z1);//Сохраняем найденный минимальный
Reset(f1);//Сбрасываемся
n:=z1.Nom;// Запоминаем номер уже найденного
read(f1,z1);//читаем первый
if z1.Nom=n then// Если нашли как раз первый 
 read(f1,z1);//- идём дальше
while not Eof(f1) do//перебираем
 begin
   read(f1,z2);
   if z2.Nom=n then// Проверяем, не находили ли мы его
    read(f1,z2);//Если находили - берём следующий
   if  (z1.Nom > z2.Nom)then  z1:=z2;
 end;
write(f2,z1);// записываем ВТОРОЙ результат
closefile(f1);//закрываем файл f1
closefile(f2);//закрываем файл f2
Некомментированные строки - мои. Комментировать надо? (Вроде бы всё то же самое, но чуть изменена запись.....

Последний раз редактировалось Maslan; 22.10.2007 в 14:08.
Maslan вне форума Ответить с цитированием
Старый 22.10.2007, 13:44   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Мнеб тоже не понравилось
Автор плиз поясни как ты выполняешь третий пункт на словах. Из кода мне видно только запись одного пункта
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.10.2007, 13:57   #6
Gorinicher
 
Регистрация: 22.10.2007
Сообщений: 7
По умолчанию

To Maslan :
Eсли не затруднит то лучше закоментировать

To Stilet:
Значится так, по условию нам необходимо найти две записи с минимальными номерами. При чтении первой записи z1 мы присваиваем номеру n момер певой строки этой записи, и считаем его минимальным. После чего при чтении второй записи z2 мы производим сравнивание с n при нахождении более меньшего значения, мы производим переприсваивание, и так до конца файла. В конце мы записываем найденные два номера в фаил f2. Вообщем что-то где-то так.
Gorinicher вне форума Ответить с цитированием
Старый 22.10.2007, 14:05   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Понятно, сразу совет: Записывай в dat отсортированные записи, тогда две последних (или первых) и будуд минимальными, и тебе не придется их заново искать.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.10.2007, 14:09   #8
Maslan
Форумчанин
 
Регистрация: 15.10.2007
Сообщений: 147
По умолчанию

Откомментировал.......
...

Цитата:
Значится так, по условию нам необходимо найти две записи с минимальными номерами. При чтении первой записи z1 мы присваиваем номеру n момер певой строки этой записи, и считаем его минимальным. После чего при чтении второй записи z2 мы производим сравнивание с n при нахождении более меньшего значения, мы производим переприсваивание, и так до конца файла. В конце мы записываем найденные два номера в фаил f2. Вообщем что-то где-то так.
По коду ты писал только один номер =)
По поводу "Совета-от-Стилета" - дело говорит.( Если у тебя номера уникальные)
Maslan вне форума Ответить с цитированием
Старый 22.10.2007, 14:12   #9
Gorinicher
 
Регистрация: 22.10.2007
Сообщений: 7
По умолчанию

Цитата:
По коду ты писал только один номер =)
Это почему?
Даже лучше так "А вот с этого места поподробней"
Gorinicher вне форума Ответить с цитированием
Старый 22.10.2007, 14:20   #10
Maslan
Форумчанин
 
Регистрация: 15.10.2007
Сообщений: 147
По умолчанию

Сначала начал писать то, что ниже, мелким шрифтом, но заметил for i:=1 to 2 do begin и только сейчас понял для чего эта байда
Решил оставить кусок......




Берём твой код и ищем в нём
Код:
Write(f*,z*);
:
Код:
procedure TForm1.N3Click(Sender: TObject);
var z1,z2:tz; f1,f2:tfz; i,j,n:integer;
begin
assignfile(f1, '999.dat');//связываем файловую переменную f1 c файлом 999.dat
assignfile(f2, '999.max');//связываем файловую переменную f2 с файлом 999.max
reset(f1);//открываем файл f1 для чтения
rewrite(f2);//создаем файл f2, если он был создан то очищаем его
read(f1,z1);
n:=z1.Nom;
Seek(f1,0);
for i:=1 to 2 do begin
read(f1,z2);//читаем запись с которой мы будем сравнивать
if (z2.Nom=n) and (i<>n) then read(f1,z2);//если вдруг намер этой записи оказался наименьшим
Seek(f1,0);//переводим на начало указатель
while (not Eof(f1)) do begin
read(f1,z1);//читаем запись для сравнения
if ((z1.Nom<z2.Nom) and (z1.Nom<>n)) then //если номер записи меньше текущей
z2:=z1;//то записываем ее в z2
end;
n:=z2.Nom;//запоминаем номер наименьшей записи
Seek(f1,0);//переводим на начало указатель
write(f2,z2);//записываем наименьшую запись в файл f2
end;//конец цикла
closefile(f1);//закрываем файл f1
closefile(f2);//закрываем файл f2
end;//конец процедуры N11Click
Maslan вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача на Delphi evrey Общие вопросы Delphi 1 01.06.2008 20:37
Задача в DELPHI. Absent Помощь студентам 7 25.02.2008 14:04
Задача в Delphi Oksana11 Помощь студентам 3 22.12.2007 00:12
Задача! (ListBox, Delphi.) Mr.User Помощь студентам 6 16.11.2007 08:39
Задача с матрицей на Delphi POPOV Помощь студентам 28 29.10.2007 06:39