Консультация № 178427
16.05.2010, 14:16
0.00 руб.
0 3 1
Добрый день.
Помогите мне пожалуйста с задачкой. Дан файл в котором содержиться данные о студенте. ФИО(символов).первая оценка,вторая оценка,третья оценка (по 1 символу),номер зачетки(4символа). Нужно найти
1) колличество неуспевающих и процент успеваимости.
2) с помощью Seek, по номеру зачетки, нужно изменить оценки.

я сделал,но по поиску 2 условия у меня не получается. помогите пожалуйста.

Приложение:
program pro;
uses crt;
type stud=record
nz:integer;
fio:string[15];
o1,o2,o3:string[1];
end;
var
stude:stud;
i,j,n,o,m,k,aa:integer;
u:real;
f:file of stud;
f1:file of integer;
procedure vvod;
begin
rewrite(f);
write('Љ®«ЁзҐбвў® г祭ЁЄ®ў: ');
readln(n);
for i:=1 to n do
begin
write(' ‚ўҐ¤Ё Ё¬п Ё д ¬Ё«Ёо ', i ,'-Ј®',' г祭ЁЄ  ');
readln(stude.fio);
write(' ‚ўҐ¤Ё 1-о',' ®жҐ­Єг г祭ЁЄ  ');
readln(stude.o1);
write(' ‚ўҐ¤Ё 2-о',' ®жҐ­Єг г祭ЁЄ  ');
readln(stude.o2);
write(' ‚ўҐ¤Ё 3-о',' ®жҐ­Єг г祭ЁЄ  ');
readln(stude.o3);
write(' ‚ўҐ¤Ё ь § зҐвЄЁ: ');
readln(stude.nz);
write(f,stude);
end;
close(f);
end;
procedure pros;
begin
reset(f);
writeln('€¬п г祭ЁЄ  ':4,' ','ЏҐаў п ®жҐ­Є  ',' ','‚в®а п ®жҐ­Є  ','’аҐвмп ®жҐ­Є  ','Ќ®¬Ґа § зҐвЄЁ');
while not(eof(f)) do
begin
read(f,stude);
writeln(stude.fio:5,stude.o1:4,' ',stude.o2:13,' ',stude.o3:13,' ',stude.nz:12);
end;
close(f);
end;
{procedure poisk;
begin
writeln;
reset(f);
reset(f1);
k:=0;
writeln('€¬п г祭ЁЄ ',' ','ЏҐаў п ®жҐ­Є  ',' ','‚в®а п ®жҐ­Є  ','’аҐвмп ®жҐ­Є  ');
while not(eof(f)) do
begin
read(f,stude);
if (stude.o1='2') or (stude.o2='2') or (stude.o3='2') then
begin
writeln(stude.fio:4,' ',stude.o1:4,' ',stude.o2:10,' ',stude.o3:10);
k:=k+1;
end;
end;
u:=0;
Writeln('ЌҐгбЇҐў йЁе: ',k);
read(f1,n);
u:=(k/n)*100;
writeln('Џа®жҐ­в гбЇҐў Ё¬®бвЁ:',u:2:0,' %');
close(f);
end; }
procedure poisk2;
begin
reset(f);
write('‚ўҐ¤Ё ь ЁЈагиЄЁ: ');
readln(aa);
while aa=stude.nz do
begin
seek(f,aa-1);
read(f,stude);
if aa=stude.nz then
begin
write('Enter New GAMES: ');
read(stude.o2);
write(f,stude);
end;
write('Enter aa');
readln(aa);
end;
close(f);
end;begin
clrscr;
assign(f,'d:\stud.dat');
o:=-1;
writeln('1-sozd');
writeln('2-prosmotr');
writeln('3-obrabotka');
while o<>0 do
begin
readln(o);
case o of
0:exit;
1:vvod;
2:pros;
{3:poisk;}
4:poisk2;
end;
end;
readkey;
end.

Обсуждение

Неизвестный
17.05.2010, 19:01
общий
это ответ
Здравствуйте, Романов Артем.

Исправленная программа — в приложении. Я изменил описание записи, чтобы сделать возможным использование цикла при вводе оценок. (Вывод на экран я не изменял, там по-прежнему без циклов.)

Кстати, структура создаваемого Вашей программой файла не соответствует описанию в задаче: поле имени предваряется байтом длины (в условии про это ничего не сказано), номер зачетки — 2 байта (бинарное представление типа integer), порядок полей иной. Если требуется точное соответствие условию — обращайтесь в мини-форум, можно исправить.

Кроме того, подправлено вычисление процента успеваемости: кол-во студентов определяется по размеру файла, нет обращения к неопределенному файлу f1; у Вас вычислялся процент НЕуспеваемости; сообщение вида 'Процент успеваимости:50 %' — корявое, исправил (если Вы пишете "Процент успеваемости", то знак '%' в конце является лишним, если хотите его использовать, то достаточно написать "Успеваемость".

Еще несколько замечаний:
  • Старайтесь свести к минимуму использование глобальных переменных. Если Вы пытаететсь сэкономить память таким образом, то эффект получается обратный. Локальные переменные размещаются в стеке и освобождаются при выходе из процедуры (функции). По возможности, переменные должны быть локальными. Не бойтесь, что их имена повторяются.
  • Используйте оператор WITH, если многократно обращаетесь к членам записи.
  • Если Вы выводите несколько строк подряд, особенно в одном операторе write
  • [ln], то лучше их объединить.
  • В сообщениях старайтесь использовать вежливое обращение: "Введи" — это слишком грубо.

Программа протестирована в Borland Pascal 7.0

Успехов!

Приложение:
{
Дан файл, в котором содержатся данные о студентах.
ФИО(символов). Первая оценка, вторая оценка, третья оценка (по 1 символу),
номер зачетки (4символа). Нужно найти:
1) количество неуспевающих и процент успеваемости.
2) с помощью Seek, по номеру зачетки, нужно изменить оценки.
}
program pro;
uses crt;

type stud=record
nz : integer;
fio : string[15];
o : array[1..3] of char;
end;

var
f:file of stud;

procedure vvod;
var i, j, n : integer;
stude: stud;
begin
rewrite(f);
write('Количество учеников: ');
readln(n);
for i:=1 to n do
with stude do
begin
write(' Введите имя и фамилию ', i ,'-го ученика ');
readln(fio);
for j:=1 to 3 do
begin
write(' Введите ', j, '-ю оценку ученика ');
readln(o[j]);
end;
write(' Введите № зачетки: ');
readln(nz);
write(f,stude);
end;
close(f);
end;

procedure pros;
var stude: stud;
begin
reset(f);
writeln('Имя ученика':15,' Первая оценка Вторая оценка Третья оценка Номер зачетки');
while not(eof(f)) do
begin
read(f,stude);
with stude do
writeln( fio:15, o[1]:8, o[2]:14, o[3]:14, nz:16 );
end;
close(f);
end;

procedure poisk;
var stude: stud;
j, k, n : integer;
u: real;
begin
writeln;
reset(f);
k:=0;
writeln('Имя ученика':15,' Первая оценка Вторая оценка Третья оценка Номер зачетки');
while not(eof(f)) do
with stude do
begin
read(f,stude);
for j:=1 to 3 do
if o[j]='2' then
begin
writeln( fio:15, o[1]:8, o[2]:14, o[3]:14, nz:16 );
inc(k);
break;
end;
end;
u:=0;
Writeln('Неуспеващих: ',k);
n := FileSize(f);
u:= (n-k)/n *100;
writeln('Успеваемость: ',u:5:1,'%');
close(f);
end;

procedure poisk2;
var nz, j, n: integer;
stude: stud;
begin
reset(f);
write('Введите № зачетки: ');
readln(nz);
while not(eof(f)) do
begin
read(f,stude);
if nz = stude.nz then
with stude do
begin
writeln( 'Ученик: ', fio );
for j:=1 to 3 do
begin
write(' Введите ', j, '-ю оценку ученика ');
readln(o[j]);
end;
seek( f, FilePos(f)-1 );
write(f,stude);
exit;
end;
end;
writeln( 'Номер зачетки ', nz, ' не найден.' );
close(f);
end;

var ch: char;

begin
clrscr;
assign(f,'c:\bp\stud.dat');

repeat
writeln('--------------');
writeln('1-создание');
writeln('2-просмотр');
writeln('3-успеваемость');
writeln('4-исправление');
writeln('--------------');
writeln('0-выход');

{ этот цикл позволяет исключить повторный вывод меню при
нажатии неверной клавиши }
repeat ch := readkey; until (ch >= '0') and (ch <= '4');

case ch of
'1': vvod;
'2': pros;
'3': poisk;
'4': poisk2;
end;
until ch = '0';
end.
5
Неизвестный
17.05.2010, 21:13
общий
amnick:
Спасибо Вам. То что было нужно.спасибо за красивое меню и шапку. Так бы мучился с выводом измененных оценок.
Неизвестный
17.05.2010, 21:32
общий
Романов Артем:
Пожалуйста. Хорошо, что смог помочь.
Форма ответа