20.03.2012, 16:56 | #1 (permalink) |
Member
Регистрация: 08.10.2011
Сообщений: 49
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Паскаль, проблема с файлами
Помогите пожалуйста разобраться с задачей. Дан текстовый файл, содержащий сведения о студентах:фамилия ,имя и три оценки; необходимо вычислить средний балл всей группы за сессию и средний балл каждого студента ,создать новый файл и записать туда информацию о студентах у которых средний балл выше среднего балла всей группы. сделала так, но проблемы с циклом .(программа должна быть сделана именно по этому алгоритму) program upr1; const d=3; var st:string; t1,t2:text; k,a:integer; f,i,o1,o2,o3:string; s,sb:real; n1,n2,n3,code:integer; begin assign(t1,'file.txt'); reset(t1); assign(t2,'file2.txt'); rewrite(t2); k:=0; sb:=0; while not eof(t1) do begin readln(t1,st); a:=pos(' ',st); f:=copy(st,1,a-1); delete(st,1,a); a:=pos(' ',st); i:=copy(st,1,a-1); delete(st,1,a); o1:=st[1]; o2:=st[3]; o3:=st[5]; val(o1,n1,code); val(o2,n2,code); val(o3,n3,code); s:=(n1+n2+n3)/d; sb:=sb+s; if s>sb/n then begin k:=k+1; writeln(t2,k,'.',' ',f,' ',i,' ',o1,' ',o2,' ',o3); end; end; close(t1); close(t2); reset(t2); writeln('студенты , у котрорых средний балл выше среднего балла группы'); while not eof(t2) do begin readln(t2,st); writeln(st); end; writeln('количество таких студентов ',k); close(t2); end. вот исходный файл. Иванов Иван 5 5 5 Иванова Иарина 4 4 4 Сидоров Максим 3 2 4 Сидорова Ирина 4 5 4 Мишкина Мария 5 4 3 а также необходимо составить другую программу, по такому же исходному файлу , сформировать новый файл , записав в него информацию о студентах, отсортированную в порядке уменьшения среднего балла за сессию. при этом средний балл каждого студента так же записать в текстовый файл. нужно использовать массив. с алгоритмами сортировки знакома, но никак не пойму как связать программу с массивами. Заранее благодарю!!! |
20.03.2012, 16:56 | |
Helpmaster
Member
Регистрация: 08.03.2016
Сообщений: 0
|
На форуме люди обсуждали что то схожее, посмотрите Проблема с торрент- файлами Паскаль. Задача с файлами, помогите пожалуйста Паскаль, работа с файлами Проблема с файлами Проблема с файлами с расширением ЕХЕ |
20.03.2012, 20:57 | #2 (permalink) |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Ильгиза, во-первых, подобных задач на нашем форуме рассмотрено море, и все они решаются через массивы, но не простые, а массивы записей. Могли бы и поискать самостоятельно. Во-вторых, Ваша программа... ну, неряшливая, что ли. Ведь для чего вводятся константы? А для того, чтобы при необходимости их значение можно было бы заменить, и при этом программа работала бы по-прежнему. А у Вас? Задаете число предметов в виде константы (d=3) и тут же в теле программы используете это количество в явном виде. Ну что это такое:
s:=(n1+n2+n3)/d; А если я поменяю значение d на, например, 5 - что будет? Ответ: ахинея. Отвыкайте от подобных подходов, для программиста они недопустимы. Вот работающий код. Обе задачи там "в одном флаконе": Код:
Const d=3; Type stud=record FIO:string; Mark:Array[1..d] of Byte; Mark_med:real; end; Var st:Array[1..20] of stud; stdm:stud; t1,t2,t3:text; i,j,Nst,Nbest,n,code:integer; Ch:Char; Mark_med_gr:real; Begin assign(t1,'file.txt'); reset(t1); assign(t2,'file2.txt'); rewrite(t2); assign(t3,'file3.txt'); rewrite(t3); Nst:=0; Mark_med_gr:=0; while not eof(t1) do begin Inc(Nst); with st[Nst] do begin FIO:=''; repeat read(t1,Ch); val(Ch,n,code); If code<>0 then FIO:=FIO+Ch else Mark[1]:=n; until code=0; for i:=2 to d do read(t1,Mark[i]); readln(t1); Mark_med:=0; for i:=1 to d do begin Mark_med:=Mark_med+Mark[i]/d; Mark_med_gr:=Mark_med_gr+Mark[i]; end; end; end; Close(t1); Mark_med_gr:=Mark_med_gr/(Nst*d); Writeln('Group medium mark: ',Mark_med_gr:4:2); Writeln('Students whose medium mark is higher then group one:'); Nbest:=0; For i:=1 to Nst do with St[i] do If Mark_med>Mark_med_gr then begin Inc(Nbest); write(t2,FIO); for j:=1 to d do write(t2,Mark[j]:2); writeln(t2,Mark_med:5:2); write(FIO); for j:=1 to d do write(Mark[j]:2); writeln(Mark_med:5:2); end; Close(t2); Writeln('Number of such students ',Nbest); Writeln; Writeln('Sorted list of sudents:'); For i:=1 to Nst do For j:=1 to Nst-i do If St[j].Mark_med<St[j+1].Mark_med then begin Stdm:=St[j]; St[j]:=St[j+1]; St[j+1]:=Stdm; end; For i:=1 to Nst do with St[i] do begin write(t3,FIO); for j:=1 to d do write(t3,Mark[j]:2); writeln(t3,Mark_med:5:2); write(FIO); for j:=1 to d do write(Mark[j]:2); writeln(Mark_med:5:2); end; Close(t3); Readln End. |
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
|
|