Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Задача


Автор: Yanochka 22.12.2004, 17:38
Не могу решить, помогите.
http://yahol.narod.ru/Delphi.doc
Цитата
Условие задачи. Дана последовательность сведений об успе-ваемости студентов. Сохранить сведения в файле. Прочитать из файла по запросу и определить средний балл успеваемости и список успевающих студентов. Формат сведений: Фамилия, од-на оценка.

Автор: Alex 22.12.2004, 17:48
Что именно не можешь решить?

Автор: Vit 22.12.2004, 17:48
Формат файла оговаривается? Можно использовать наприммер CSV или хотя бы типизированные файлы?

Автор: Yanochka 22.12.2004, 17:51
Нужно типизированный файл для данных следующего формата: Фамилия студента, оценка:
Type Studwnt=record
Добавлено @ 17:52
Цитата
функции и процедуры для работы с типизированными файлами:
1. Для определения размера файла ______________________
2. Для поиска записи в файле по ее номеру _______________
3. Для добавления записи в файл ________________________


Автор: Alex 22.12.2004, 17:58
Работа с типизированными файлами http://vingrad.ru/ART-DP-002029
Добавлено @ 18:00
А вообще я бы использовал dbf.

Автор: Yanochka 22.12.2004, 18:04
Alex
Спасибо.

Автор: Alex 22.12.2004, 18:18
не за что

Автор: Yanochka 22.12.2004, 18:21
Alex
все равно ни чего не пойму.. smile

Автор: Alex 22.12.2004, 18:23
Что именно не можешь понять? Давай объясню.

Автор: Yanochka 22.12.2004, 18:34
Цитата
Запишите функции и процедуры для работы с типизированными файлами:
1. Для определения размера файла ______________________
2. Для поиска записи в файле по ее номеру _______________
3. Для добавления записи в файл ________________________

procedure TForm1.FormCreate(Sender: TObject);
begin
StringGrid1.cells[____]:= _________________ ;
StringGrid1.cells[____]:= _________________ ;
edit1.text:= ________ ;
setlength ______________________________
ListBox1 ______________________________
Filename:='Primer.dat';
end;



Я только создала все компаненты, еще не писала процедуры.

Автор: Alex 22.12.2004, 22:19
Новички кто сделает задание в точности, до пятницы ставлю плюсик, если ни кто не сделает, то я в пятницу сделаю.

Автор: Alex 22.12.2004, 23:43
Текст задания http://yahol.narod.ru/Delphi.doc

Автор: Flibustier 23.12.2004, 03:10
М
 
Обсуждение других участников производится в разделе обсуждения форума а не здесь. Пока только устное предупреждение
Vit

Автор: SlaUr 23.12.2004, 08:57
М
 
del by Vit. Обсуждать других можно в разделе обсуждения форума. Это общее правило для всех.

p.s. Сейчас некогда , может вечером если никто не напишет - попробую написать решение я.

Автор: SoWa 23.12.2004, 09:50
А можно ли перед оценкой ставит "^"? Так ведь легче будет:
-Читаешь строчку из файла
-Проходишься по ней циклом while до условия s='^' (s: string & в цикле s становится текущей буквой)
-Заносишь отметку в массив
-СРЕДНЕЕ АРИФМЕТИЧЕСКОЕ

ИЛИ:
если отметка<10 then прочитать последний символ из строчки.
У нас в школе пока пятибальная система, как в институте-не знаю(не дорос еще) smile

Автор: Yanochka 23.12.2004, 10:41
Делаем по 5-и бальной системе. Не надо как легче, надо в точности по заданию.

Автор: SlaUr 23.12.2004, 14:10
Цитата
p.s. Сейчас некогда , может вечером если никто не напишет - попробую написать решение я.

Задание не сложное но трудоемкое я пока делать не хочу к тому же Alex написал:
Цитата
если ни кто не сделает, то я в пятницу сделаю.


p.s.Просто мне не понятно как заносить новые данные (вроде бы в stringGrid,присутствующий на форме писать нельзя или я ошибаюсь?),
к тому же мне не хочется это делать из-за перспективы получить плюс
:-) (ощущение корыстности выполнения задания)

Автор: SoWa 23.12.2004, 15:27
Извини, а у тебя DRKB есть? Если да-то можно работать с BDE(в DRKB много об этом), а если нету-скачай!

Автор: Alex 23.12.2004, 19:19
Ребят, задание нужно выполнить именно по той технологии, которая написана в задании.

Автор: Alex 24.12.2004, 20:28
Вот:
Код

type
 Student = record
   Name:       String[254]; // Фамилия студента
   Estimation: Integer;     // Оценка студента
 end;

type
 Students = array of Student;


type
 TfrmStud = class(TForm)
   StringGrid1: TStringGrid;
   ListBox1: TListBox;
   MainMenu1: TMainMenu;
   N1: TMenuItem;
   N2: TMenuItem;
   N3: TMenuItem;
   N4: TMenuItem;
   N5: TMenuItem;
   N6: TMenuItem;
   N7: TMenuItem;
   OpenDialog1: TOpenDialog;
   Edit1: TEdit;
   procedure FormCreate(Sender: TObject);
   procedure N7Click(Sender: TObject);
   procedure N3Click(Sender: TObject);
   procedure N2Click(Sender: TObject);
   procedure N5Click(Sender: TObject);
   procedure N6Click(Sender: TObject);
 private
   
   function GetSizeF: Integer;
   procedure AddStud(stud: Student);
   function GetStud(Ind: Integer): Student;
   { Private declarations }
 public
   { Public declarations }
 end;

var
 frmStud: TfrmStud;
 f: File of Student;
 Stud: Student;
 Studs: Students;
 FileName: String;

implementation

uses StrUtils;

{$R *.dfm}

function TfrmStud.GetSizeF: Integer;
// Определение размера файла
begin
 Result:= FileSize(f)-1;
end;

procedure TfrmStud.AddStud(stud: Student);
// Добавление студента
begin
 seek(f, GetSizeF+1);
 Write(f, stud);
end;

function TfrmStud.GetStud(Ind: Integer): Student;
// Возвращение информации о студенте по его номеру
begin
 seek(f, Ind);
 Read(f, Result);
end;

procedure TfrmStud.FormCreate(Sender: TObject);
begin
 with StringGrid1 do begin // Настройка внешнего вида
   Cells[0, 0]:= 'Фамилия';
   Cells[1, 0]:= 'Оценки';
 end;
 Edit1.Text:= '';
 SetLength(Studs, 0);
 ListBox1.Items.Clear;
 FileName:= 'Primer.dat'
end;

procedure TfrmStud.N7Click(Sender: TObject);
// Выход
begin
 Close;
end;

procedure TfrmStud.N3Click(Sender: TObject);
// Чтение данных
var
 i: Integer;
begin
 if not OpenDialog1.Execute then Exit;
 AssignFile(f, OpenDialog1.FileName);
 Reset(f);
 SetLength(Studs, GetSizeF+1);
 ListBox1.Font.Style:= ListBox1.Font.Style + [fsBold];
 ListBox1.Font.Color:= clRed;
 ListBox1.Sorted:= True;
 for i:= 0 to GetSizeF do begin
   stud:= GetStud(i);
   ListBox1.Items.Add(Format('%s %d', [stud.Name, stud.Estimation]));
   StringGrid1.Cells[0, i+1]:=          stud.Name      ;
   StringGrid1.Cells[1, i+1]:= IntToStr(stud.Estimation);
   Studs[i]:= stud;
 end;
 CloseFile(f);
 if ListBox1.Items.Count = 0 then
   Application.MessageBox('Найдите файл', 'Ошибка', MB_ICONERROR);
end;

procedure TfrmStud.N2Click(Sender: TObject);
// Запись
var
 n: Integer;
begin
 SetLength(Studs, StringGrid1.RowCount-2);
 for n:= 0 to Length(Studs) do begin
   Studs[n].Name:= StringGrid1.Cells[0, n+1];
   Studs[n].Estimation:= StrToIntDef(StringGrid1.Cells[0, n+1], 0);
 end;
 AssignFile(f, FileName);
 Rewrite(f);
 for n:= 0 to Length(Studs) do begin
   AddStud(Studs[n])
 end;
 CloseFile(f);
end;

function Count(s: Students): Real;
var
 n: Integer;
 sum: Integer;
begin
 sum:= 0;
 for n:= 0 to Length(s) do
   Inc(sum, s[n].Estimation);
 result:= sum / Length(s);

end;

procedure TfrmStud.N5Click(Sender: TObject);
begin
 Edit1.Text:= Format('%8.3f', [Count(Studs)]);
end;

procedure TfrmStud.N6Click(Sender: TObject);
var
 n: Integer;
begin
 ListBox1.Font.Style:= ListBox1.Font.Style - [fsBold];
 ListBox1.Font.Color:= clWindowText;
 ListBox1.Items.Clear;
 for n:= 0 to Length(Studs) do
   if Studs[n].Estimation > 2 then
     ListBox1.Items.Add(studs[n].Name);
end;

Я бы за такие задания увольнял преподов. Такого маразма я еще не видел.

Автор: Yanochka 24.12.2004, 21:07
Alex
Спасибо тебе за помощь. От таких преподавателей, страдают студенты ни за что... smile

Автор: Alex 24.12.2004, 22:13
Не за что.

Автор: mutex 25.12.2004, 03:14
Дополнительно.

Вот описание класса (из книги "Delphi5, Руководство разработчика" - С.Тейксейра и К.Пачеко, стр.514, гл.12, Работа с файлами), к-рый обеспечивает использование привычных "БД-методов" для типизированного файла:

TRecordStream = class(TFileStream)
private
function GetNumRecs: Longint;
function GetCurRec: Longint;
procedure SetCurRec(RecNo: Longint);
protected
function GetRecSize: Longint; virtual;
public
function SeekRec(RecNo: Longint; Origin: Word = 0): Longint;
function WriteRec(const Rec): Longint;
function AppendRec(const Rec): Longint;
function ReadRec(var Rec): Longint;
procedure FirstRec;
procedure LastRec;
procedure NextRec;
procedure PreviousRec;
property NumRecs: Longint read GetNumRecs;
property CurRec: Longint read GetCurRec write SetCurRec;
end;

Не помню где, кажется был один глюк при реализации какого-то метода. Плюс нет возможности удаления записи.
Почитайте, это очень полезно.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)