Пусть в файле фамилий ffam находятся фамилии студентов(одна запись - одна фамилия), в файле оценок fnote - в том же порядке оценки студентов( одна запись - массив оценок одного студента), в файле fchg - изменения к файлу оценок(структура записи:номер студента, совпадающий с номером фамилии в файле ffam, номер изменённой оценки, новая оценка). Записи упорядочены по номеру студента. Распечатайте список фамилий студентов, сдавших сессию на 4 и 5. Файлы ffam, fnote, fchg читаются один раз. P. S. если Вам лень решать опишите хотя бы согласованное чтение файлов.
samec
17.05.2007 10:28
Цитата(AlexSt @ 17.05.2007 9:44)
P. S. если Вам лень решать опишите хотя бы согласованное чтение файлов.
Открываешь файл со студентами, читаешь из него всё в массив записей, закрываешь файл. Открываешь файл с оценками, читаешь из него всё в массив оценок, закрываешь файл. Открываешь файл с изменениями, читаешь из него в массив изменившихся оценок (например, таким образом: arr[1,i]:=номер студента, arr[2,i]=новая оценка) все что в нём есть.
А потом работаешь с полученными массивами.
Lapp
17.05.2007 10:38
Уточнение к ответу samec'а: третий файл читать в массив не надо, исправления в массиве оценок можно делать в процессе чтения файла.
AlexSt
19.05.2007 10:17
Всё таки не очень понятно как производить чтение из второго и третьего файла, пожалуйста опишите этот момент!
AlexSt
20.05.2007 22:28
Пусть в файле фамилий ffam находятся фамилии студентов(одна запись - одна фамилия), в файле оценок fnote - в том же порядке оценки студентов( одна запись - массив оценок одного студента), в файле fchg - изменения к файлу оценок(структура записи:номер студента, совпадающий с номером фамилии в файле ffam, номер изменённой оценки, новая оценка). Записи упорядочены по номеру студента. Распечатайте список фамилий студентов, сдавших сессию на 4 и 5. Файлы ffam, fnote, fchg читаются один раз.
program file_stipendiya_n23; 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:integer; k,ns,no,new:byte; fam1:fam; note1:note; chg1:chg; a:array[1..10] of byte; begin writeln('введтите путь к файлу, содержащему фамилии студентов'); readln(p); assign(ffam,p); writeln('введтите путь к файлу, содержащему оценки студентов'); readln(p); assign(fnote,p); writeln('введтите путь к файлу, содержащему изменения к файлу оценок'); readln(p); assign(fchg,p); reset(ffam); reset(fnote); reset(fchg); i:=0; while not eof(ffam) do begin i:=i+1; readln(f[i]); while not eof(fnote) do begin read(fnote,note1); for i:=1 to 10 do{тут надо организовать цикл, но я не знаю сколько оценок, 10 – число с потолка} readln(k) if a[i]<4 then begin b:=false while not eof(fchg) do
begin readln(k); end;
мисс_граффити
20.05.2007 22:36
файл fchg отсортирован по номерам студентов?
AlexSt
20.05.2007 22:42
Цитата
структура записи:номер студента, совпадающий с номером фамилии в файле ffam, номер изменённой оценки, новая оценка
вообщем там номера фамилий студентов которые что-то пересдавали. я думаю в том же порядке, только не все
мисс_граффити
21.05.2007 1:18
Тогда так: считали запись из файла изменений. Посмотрели на номер студента. Пока не дойдем до него, спокойно анализируем содержимое двух файлов: читаем фамилию и оценки. Дошли до него - проанализировали с учетом изменений. Считали из файла изменений следующего...
AlexSt
21.05.2007 10:57
а как прочесть что-то из файла записей номер студента, номер оценки из fchg и оценки из массива в fnote? в fnote я не знаю сколько оценок
Гость
22.05.2007 15:06
а как прочесть что-то из файла записей номер студента, номер оценки из fchg и оценки из массива в fnote? в fnote я не знаю сколько оценок
Ozzя
22.05.2007 15:32
Цитата
в fnote я не знаю сколько оценок
А надо?
While not eof(твой_файл) do
Lapp
22.05.2007 15:38
Я так понял, что ты работаешь с типизированными файлами. А для них нужно точно знать формат записи. Ты описал общую структуру записи, но не сказал, какой тип имеют поля в ней. Смею предположить, что все числа описаны как целые. Для работы со вторым файлом тебе нужен массив оценок - точнее, его тип. Делаешь в проге тип и файл этого типа, а потом читаешь. Допустим, всего оценок 10. Тогда можно делать примерно так:
const NMarks=10; type tMarks=array[1..NMarks]of integer; var Marks:tMarks; Fm:file of tMarks; ..... Assign(Fm,'marksfilename'); ReSet(Fm); while not EoF(Fm) do begin Read(Fm,Marks); ...... end;
Разберем работу с третьим файлом.. В своей программе делаешь тип для такой записи (номер студента, номер оценки, сама оценка) и описываешь файл таких записей. Потом читаешь из этого файла..
type tCorrection=record Student,Mark,Value:integer end; var Coorrection:tCorrection; Fc:file of tCorrection; ..... Assign(Fc,'filename'); ReSet(Fc); while not EoF(Fc) do begin Read(F,Correction); with Correction do begin ...... end end
Эти два фрагмента демонстрируют общие приципы работы с такими файлами по отдельности. Тебе нужно будет вести чтение из всех трех файлов параллельно: читаешь фамилию, потом читаешь оценки, потом возможно читаешь исправления (возможно, несколько раз) и результат после обработки выводишь на печать - а потом читаешь следующую фамилию..
Lapp
22.05.2007 16:27
!
AlexSt, предупреждаю тебя устно пока: не дублируй темы!! Я объединил
AlexSt
24.05.2007 21:34
Лэп, извини так получилось. Вообщем я написал задачу, но она в конце не работает:
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[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; end.
AlexSt
25.05.2007 0:57
Ну задачка в прынцыпе решена осталось найти ошибочку! (см. выше!) [u]
AlexSt
25.05.2007 21:06
Ну гляньте решение! В чём ошибка?
мисс_граффити
25.05.2007 23:33
прикрепи файлы, на которых ты тестируешь.
AlexSt
26.05.2007 0:34
как это понимать? куда их прикрепить? каким способом?
мисс_граффити
26.05.2007 3:19
В сообщение. У тебя же есть файлы
var ffam:file of fam; fnote:file of note; fchg:file of chg;
ты их уже создал. ввел какую-то информацию, правильно?
AlexSt
26.05.2007 10:38
вот они:
AlexSt
26.05.2007 16:45
Всем спасибо, сам решил, если кому надо вот true решение:
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 2 do if a[i]<4 then with chg1 do begin b:=false; while not 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; readln; end.
P. S. помогите с графикой!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.