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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.02.2009, 19:35   #1
dzhI
 
Регистрация: 10.02.2009
Сообщений: 9
По умолчанию Delphi. Типизированные/нетипизированные Файлы.

Задание было таково: Сведения о студенте состоят из его фамилии, специальности и шифра группы(год поступления, номер группы).Дан файл f, содержащий сведения об учениках. Файл f содержит расширенную информацию, которая дополнена средним баллом студента в последней сессии. Выяснить, сколько студентов имеют средний балл выше 4.

Ниже программа, которая была сделана. Суть в том что она работает только на одного человека, и мне неизвестно, почему читается только один, нужно сделать список, в чем проблема?!

Код:
var
  Form1: TForm1;
  sp:array[1..50]of Tstud;
  n:integer;
  f:file of Tstud;
implementation

{$R *.dfm}



procedure TForm1.Edit3KeyPress(Sender: TObject; var Key: Char);
begin
case Key of
'0'..'9',#8 :  ;
else key := Chr(0);
end;
end;

procedure TForm1.Edit4KeyPress(Sender: TObject; var Key: Char);
begin
case Key of
'0'..'9',#8 :  ;
else key := Chr(0);
end;
end;

procedure TForm1.Edit5KeyPress(Sender: TObject; var Key: Char);
begin
case Key of
'0'..'9',#8,',' :  ;
else key := Chr(0);
end;
end;
//создание файла записей
procedure TForm1.Button1Click(Sender: TObject);
var i:byte;
begin
assignfile(f,'stud.dat');
rewrite(f);
n:=StrToInt(Edit7.Text);
for i:=1 to n do
  begin
    sp[i].fam:=Edit1.Text;
    Edit1.Text:='';      //очищаем поле
    Edit2.SetFocus;       //передаем фокус в Эдит2
    sp[i].spc:=Edit2.Text;
    Edit2.Text:='';      //очищаем поле
    Edit3.SetFocus;       //передаем фокус в Эдит3
    sp[i].shf.god:=StrToInt(Edit3.Text);
    Edit3.Text:='';      //очищаем поле
    Edit4.SetFocus;       //передаем фокус в Эдит4
    sp[i].shf.nom:=StrToInt(Edit4.Text);
    Edit4.Text:='';      //очищаем поле
    Edit5.SetFocus;       //передаем фокус в Эдит5
    sp[i].srb:=StrToFloat(Edit5.Text);
    Edit5.Text:='';      //очищаем поле
    Edit1.SetFocus;       //передаем фокус в Эдит1
    write(f,sp[i]);       //вводим данные в файл
  end;
closefile(f);
end;
//вывод данных в таблицу и подсчет по условию
procedure TForm1.Button2Click(Sender: TObject);
var i,k:byte;
begin
StringGrid1.ColCount:=6;
StringGrid1.RowCount:=n+1;
StringGrid1.Cells[1,0]:='Фамилия';
StringGrid1.Cells[1,0]:='Специальность';
StringGrid1.Cells[1,0]:='Год поступления';
StringGrid1.Cells[1,0]:='Номер группы';
StringGrid1.Cells[1,0]:='Средний балл';
assignfile(f,'stud.dat');
reset(f);
k:=0;
for i:=1 to n do
  begin
    read(f,sp[i]);
    StringGrid1.Cells[0,i]:=IntToStr(i);
    StringGrid1.Cells[1,i]:=sp[i].fam;
    StringGrid1.Cells[2,i]:=sp[i].spc;
    StringGrid1.Cells[3,i]:=IntToStr(sp[i].shf.god);
    StringGrid1.Cells[4,i]:=IntToStr(sp[i].shf.nom);
    StringGrid1.Cells[5,i]:=FloatToStrF(sp[i].srb,ffFixed,5,2);
    if sp[i].srb>4 then inc(k);
  end;
Edit6.Text:='Средний балл больше 4 имеют '+IntToStr(k)+' чел.';
end;

end.
Вложения
Тип файла: rar Студенты.rar (194.8 Кб, 32 просмотров)
dzhI вне форума Ответить с цитированием
Старый 10.02.2009, 23:21   #2
Dj_smart
Капсула от спама
Форумчанин
 
Аватар для Dj_smart
 
Регистрация: 04.03.2008
Сообщений: 779
По умолчанию

Возможно на момент чтения n=1 поэтому и один:
Код:
procedure TForm1.Button2Click(Sender: TObject);
var i,k:byte;
begin
StringGrid1.ColCount:=6;
StringGrid1.RowCount:=n+1;
StringGrid1.Cells[1,0]:='Фамилия';
StringGrid1.Cells[1,0]:='Специальность';
StringGrid1.Cells[1,0]:='Год поступления';
StringGrid1.Cells[1,0]:='Номер группы';
StringGrid1.Cells[1,0]:='Средний балл';
assignfile(f,'stud.dat');
reset(f);
k:=0;
repeat
    read(f,sp[i]);
    StringGrid1.Cells[0,i]:=IntToStr(i);
    StringGrid1.Cells[1,i]:=sp[i].fam;
    StringGrid1.Cells[2,i]:=sp[i].spc;
    StringGrid1.Cells[3,i]:=IntToStr(sp[i].shf.god);
    StringGrid1.Cells[4,i]:=IntToStr(sp[i].shf.nom);
    StringGrid1.Cells[5,i]:=FloatToStrF(sp[i].srb,ffFixed,5,2);
    if sp[i].srb>4 then inc(k);
until eof(f);
closefile(f); // файл забыли закрыть
Edit6.Text:='Средний балл больше 4 имеют '+IntToStr(k)+' чел.';
end;
Если данный ответ не столь конкретен, как Вы желаете его увидеть, возможно необходимо поразмыслить, стоит ли вопрос того, чтобы о нём спрашивать на форуме?
CncFiles.ru - бесплатный файловый хостинг
Dj_smart вне форума Ответить с цитированием
Старый 10.02.2009, 23:42   #3
Саня
Пользователь
 
Регистрация: 08.01.2007
Сообщений: 30
По умолчанию

Код:
//создание файла записей
procedure TForm1.Button1Click(Sender: TObject);
var i:byte;
begin
assignfile(f,'stud.dat');
rewrite(f);
n:=StrToInt(Edit7.Text);
for i:=1 to n do
  begin
    sp[i].fam:=Edit1.Text;
    Edit1.Text:='';      //очищаем поле
    Edit2.SetFocus;       //передаем фокус в Эдит2
    sp[i].spc:=Edit2.Text;
    Edit2.Text:='';      //очищаем поле
    Edit3.SetFocus;       //передаем фокус в Эдит3
    sp[i].shf.god:=StrToInt(Edit3.Text);
    Edit3.Text:='';      //очищаем поле
    Edit4.SetFocus;       //передаем фокус в Эдит4
    sp[i].shf.nom:=StrToInt(Edit4.Text);
    Edit4.Text:='';      //очищаем поле
    Edit5.SetFocus;       //передаем фокус в Эдит5
    sp[i].srb:=StrToFloat(Edit5.Text);
    Edit5.Text:='';      //очищаем поле
    Edit1.SetFocus;       //передаем фокус в Эдит1
    write(f,sp[i]);       //вводим данные в файл
  end;
closefile(f);
end;
А зачем ты Edit'ы в цикле очищаешь?
На втором проходе цикла они все пусты и пустую строку в целое перевести довольно трудно.
Тебе сначала нужно заполнить sp, а потом записывать.
Dj_smart прав, n в Button2Click неопределена.
Я не волшебник, я только учусь!

Последний раз редактировалось mihali4; 11.02.2009 в 01:06.
Саня вне форума Ответить с цитированием
Старый 11.02.2009, 00:57   #4
Саня
Пользователь
 
Регистрация: 08.01.2007
Сообщений: 30
По умолчанию

Немного подправил проект. Коменты оставил, где правил. Для работы с файлом прога полностью рабочая, а ввод данных оставляю тебе.

Штраф нужен?
Вы наплодили 4 поста подряд!
У вас со зрением проблемы? Вы кнопку "Правка" не видите?


Со зрением у меня нормально. Штраф не нужен.
Только в чём мой "смертный грех"?
Несколько постов подряд... Исхожу из собственной логики просмотра сообщений: открыл тему, если новых постов не было, значит новой информации в теме нет.
И вообще. Мне кажется о таких вещах нужно писать в правилах. Там я такого что-то не видел.
Вложения
Тип файла: rar Студенты.rar (195.8 Кб, 26 просмотров)
Я не волшебник, я только учусь!

Последний раз редактировалось Саня; 11.02.2009 в 03:14.
Саня вне форума Ответить с цитированием
Старый 11.02.2009, 04:55   #5
dzhI
 
Регистрация: 10.02.2009
Сообщений: 9
По умолчанию

Саня, Спасибо.
Вот такой вопрос, почему при вводе количества студентов, он выводит мне 10 одинаковых к примеру.. Количество "4" считает правильно, но только при добавлении след 11-го студента она заменяет эти все десять на одного а не добавляет вновь его?!
dzhI вне форума Ответить с цитированием
Старый 11.02.2009, 07:14   #6
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Вот переделал, сейчас нормально работает.
Вложения
Тип файла: rar Студенты.rar (193.1 Кб, 75 просмотров)

Последний раз редактировалось puporev; 11.02.2009 в 12:22. Причина: В программе была ошибка, заменил.
puporev вне форума Ответить с цитированием
Старый 11.02.2009, 10:31   #7
Саня
Пользователь
 
Регистрация: 08.01.2007
Сообщений: 30
По умолчанию

Цитата:
Сообщение от dzhI Посмотреть сообщение
Саня, Спасибо.
Вот такой вопрос, почему при вводе количества студентов, он выводит мне 10 одинаковых к примеру.. Количество "4" считает правильно, но только при добавлении след 11-го студента она заменяет эти все десять на одного а не добавляет вновь его?!
Я уже говорил, нужно сначала заполнить массив записей. Для этого я бы сделал отдельную кнопочку, при клике по которой данные из Edit'ов собираются в следующий элемент массива.
А потом при клике по "Записать данные", записываем массив в файл.
А так, для примера, в Button2Click в массив записываются одни и те же данные из Edit'ов.
Доработай!
Я не волшебник, я только учусь!
Саня вне форума Ответить с цитированием
Старый 11.02.2009, 12:18   #8
dzhI
 
Регистрация: 10.02.2009
Сообщений: 9
По умолчанию

Огромное спасибо, разобрался!
dzhI вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
типизированные и нетипизированные файлы andrey4623 Общие вопросы Delphi 1 28.12.2007 19:09
Типизированные файлы и Delphi Polina Помощь студентам 8 12.12.2007 18:40
ПОМОГИТЕ!! Типизированные и нетипизированные файлы. Zebo Помощь студентам 1 08.06.2007 09:35