nixp.ru v3.0

20 октября 2017,
пятница,
17:26:05 MSK

DevOps с компанией «Флант»
AlexSt написал 25 мая 2007 года в 18:43 (826 просмотров) Ведет себя неопределенно; открыл 1 тему в форуме, оставил 1 комментарий на сайте.

Пусть в файле фамилий ffam находятся фамилии студентов(одна запись — одна фамилия), в файле оценок fnote — в том же порядке оценки студентов( одна запись — массив оценок одного студента), в файле fchg — изменения к файлу оценок(структура записи:номер студента, совпадающий с номером фамилии в файле ffam, номер изменённой оценки, новая оценка). Записи упорядочены по номеру студента. Распечатайте список фамилий студентов, сдавших сессию на 4 и 5. Файлы ffam, fnote, fchg читаются один раз.

решение:

program file_stipendiya_n23;

uses crt;

type fam=record

f:string[20]

end;

note=record

a:array[1..10] of byte

end;

chg=record

ns,no,new:byte

end;

var ffam:file of fam;

fnote:file of note;

fchg:file of chg;

p,f:string[20];

i,j,exam,kolstud:integer;

mark:byte;

b:boolean;

fam1:fam;

note1:note;

chg1:chg;

a:array[1..10] of byte;

begin clrscr;

writeln(’введтите путь к файлу, содержащему фамилии студентов’);

readln(p);

assign(ffam,p);

rewrite(ffam);

writeln(’введите фамилии студентов, окончание ввода — «0»’);

kolstud:=0;

repeat readln(f);

if f<>’0\′ then begin write(ffam,fam(f));

kolstud:=kolstud+1

end;

until f=’0\′; close(ffam);

reset(ffam);

writeln(’введтите путь к файлу, содержащему оценки студентов’);

readln(p);

assign(fnote,p);

writeln(’введите количество экзаменов’);

readln(exam);

writeln(’введите оценки каждого студента’);

rewrite(fnote);

for i:=1 to kolstud do

begin writeln(’оценки студента № ',i,’:');

for j:=1 to exam do

readln(a[j]);

write(fnote,note(a));

end; close(fnote);

reset(fnote);

writeln(’введтите путь к файлу, содержащему изменения к файлу оценок’);

readln(p);

assign(fchg,p);

rewrite(fchg);

with chg1 do

repeat writeln(’введите номер студента, номер изменённой оценки и новую оценку, окончание ввода — «0»’);

readln(ns);

readln(no);

readln(new);

if (ns<>0)and(no<>0)and(new<>0) then write(fchg,chg1);

until (ns=0)and(no=0)and(new=0); close(fchg);

reset(fchg);

b:=true; j:=0;

writeln(’студенты, получающие стипендию:’);

while not eof(ffam) do {считывание данных}

begin j:=j+1;

read(ffam,fam(f));

read(fnote,note(a));

for i:=1 to exam do

if a<4 then with chg1 do

begin b:=false;

while eof(fchg) do

begin read(fchg,chg1);

if (ns=j)and(no=i)and(new>3) then b:=true

end;

close(fchg);

reset(fchg);

end;

if b=true then writeln(f);

end;

end.

metal


b:=true; j:=0;
        writeln('студенты, получающие стипендию:');
        while not eof(ffam) do {считывание данных}
        begin j:=j+1;
              read(ffam,fam(f));
              read(fnote,note(a));
              for i:=1 to exam do
              if a[i]<4 then with chg1 do
                             begin b:=false;
                                   while eof(fchg) do
                                   begin read(fchg,chg1);
                                    if (ns=j)and(no=i)and(new>3) then b:=true
                                   end;
                                   close(fchg);
                                   reset(fchg);
                             end;
              if b=true then writeln(f);
        end;

Напиши комментарии к этой части своей программы. Что у тебя здесь что?

Данные реально в файлы записываются?

Еще надо разбить по функциям, в такой помойке сам разобраться не можешь.

И программа не соответствует условияс задачи Файлы ffam, fnote, fchg читаются один раз

Отладчиком ты умеешь пользоваться?

AlexSt
metal

b:=true; j:=0;
        writeln('студенты, получающие стипендию:');
        while not eof(ffam) do {считывание данных}
        begin j:=j+1;
              read(ffam,fam(f)); {читаем фамилию}
              read(fnote,note(a));{читаем первоначальные оценки}
              for i:=1 to exam do{просматриваем их}
              if a[i]<4 then with chg1 do{если оценка "плохая" смотрим изменения}
                             begin b:=false;
                                   while eof(fchg) do
                                   begin read(fchg,chg1);{читаем изменения оценок}
                                    if (ns=j)and(no=i)and(new>3) then b:=true
                                   end;{если оценка подходит проверяем дальше}
                                   close(fchg);
                                   reset(fchg);
                             end;
              if b=true then writeln(f);{выводим фам студента со стипендией}
        end;

metal


if a[i]<4 then with chg1 do{если оценка "плохая" смотрим изменения}

Ошибочная логика, оценка может измениться и с хорошей на плохую.

close(fchg);
reset(fchg);

здесь ты читаешь файл больше одного раза и нарушаешь условия задачи.

Правильно будет читать этот файл вмести с другими файлами. Смотреть, если номер меньше текущего студента, то надо считывать из него следующую запись. Если равен, то это изменения иначе пока ничего не счиытывать.

Что такое j у тебя?

b становится true только при наличие изменений в оценке. Фактически ты выводишь всех кто перездал тройки на более высокую оценку по всем экзаменам.

Ответь на остальные вопросы из предыдущего поста:)

Melnix

Опять студенты не могут сдать зачеты по паскалю…

Сам за деньги им делаю.

Только меня не упрашивать, у меня и так график напряженный :D