Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Записи

Автор: ko1hoz 15.05.2007 0:12

Нужно создать файл, состоящий из 20 записей.
-Район;
-№школы;
-количество учеников;
-количество неуспевающих учеников;
-количество отличников и хорошистов.
Так вот, надо вывести данные о школах каждого района, у которых процент качественной успеваемости наибольший. Информацию выводить, отсортировав по наименованию района.

Файл то я конечно создал. А вот в остальном запутался. Много что-то условий. Помогите пожалуйста. Напишите хотя бы примерный алгоритм действий, а дальше думаю сам разберусь.

Автор: Артемий 15.05.2007 0:18

Цитата
Так вот, надо вывести данные о школах каждого района, у которых процент качественной успеваемости наибольший.

А начиная со скольки процентов отличников и хорошистов в сравнении со всеми учениками школа считается "успеваемой"

Автор: Renbo 15.05.2007 0:32

Сортировку зри тут: http://forum.pascal.net.ru/index.php?showtopic=16473&hl=

Автор: ko1hoz 15.05.2007 0:44

Цитата(Артемий @ 15.05.2007 0:18) *

А начиная со скольки процентов отличников и хорошистов в сравнении со всеми учениками школа считается "успеваемой"

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

Автор: ko1hoz 15.05.2007 16:22

Вот так собственно я создаю файл

uses crt;
const
n=5;
type
spisok=record
raion:string;
p_p,nom,kol_uch,neus_uch,otl_hor:integer;
end;
var
i:integer;
sp:spisok;
F:file of spisok;
begin
assign (F,'d:\kurs.dat');
rewrite (F);
for i:=1 to n do
begin
with sp do
begin
writeln ('raion:'); readln(raion);
writeln ('p/p:'); readln(p_p);
writeln ('nomer shkoli:'); readln(nom);
writeln ('kolichestvo uch:'); readln(kol_uch);
writeln ('kolichestvo neusp:'); readln(neus_uch);
writeln ('kolichestvo otl i hor:'); readln(otl_hor);
end;
write(F,sp);
end;
close(F);
readln;
end.

А вот это я написал сортировку.
uses crt;
Const name='d:\kurs2.txt';
Type
spisok=record
raion:string;
p_p,nom,kol_uch,neusp,otl_hor:integer;
end;
Var
k,i:integer;sum:real;
sp:spisok;Ot:char;
sp1:array [1..50] of spisok;
pr:array [1..50] of real;
F:file of spisok;
F1:text;
begin
clrscr;
assign(F,'d:\kurs.dat');
reset(F);
Writeln('Zapisat v fail? Y/N');
Readln(Ot);
If (Ot='Y') or (Ot='y') then assign (F1,name) else assign (F1,'con');
Rewrite(F1);
Writeln(F1,' Svedeniya o shkolah raionov');
k:=0;
For i:=1 to 77 do write(F1,'-');
writeln(F1);
Writeln(F1,'| raion |nom_p/p|nom_shkoli|kol uch|kol neusp uch|otl i hor|procent|');
For i:=1 to 77 do write(F1,'-');
writeln(F1);
While not eof(F) do
begin
Read(F,sp);
With sp do
begin
if raion='oktyabrskii' then
begin
k:=k+1;
sp1[k]:=sp;
pr[k]:=sp.otl_hor/kol_uch*100;
end;
if raion='centralnii' then
begin
k:=k+1;
sp1[k]:=sp;
pr[k]:=sp.otl_hor/kol_uch*100;
end;
if raion='zaelcovskii' then
begin
k:=k+1;
sp1[k]:=sp;
pr[k]:=sp.otl_hor/kol_uch*100;
end;
if raion='zheleznodorozhnii' then
begin
k:=k+1;
sp1[k]:=sp;
pr[k]:=sp.otl_hor/kol_uch*100;
if raion='kirovskii' then
begin
k:=k+1;
sp1[k]:=sp;
pr[k]:=sp.otl_hor/kol_uch*100;
end;
if raion='pervomaiskii' then
begin
k:=k+1;
sp1[k]:=sp;
pr[k]:=sp.otl_hor/kol_uch*100;
end;
if raion='kalininskii' then
begin
k:=k+1;
sp1[k]:=sp;
pr[k]:=sp.otl_hor/kol_uch*100;
if raion='leninskii' then
begin
k:=k+1;
sp1[k]:=sp;
pr[k]:=sp.otl_hor/kol_uch*100;
end;
if raion='dzerzhinskii' then
begin
k:=k+1;
sp1[k]:=sp;
pr[k]:=sp.otl_hor/kol_uch*100;
end;
if raion='sovetskii' then
begin
k:=k+1;
sp1[k]:=sp;
pr[k]:=sp.otl_hor/kol_uch*100;
end;

end;
end;
end;
For i:=1 to k do with sp1[i] do
begin
write(F1,'|', raion:12 ,'|',p_p:7,'|',nom:10,'|');
writeln(F1,kol_uch:7,'|',neusp:13,'|',otl_hor:9,'|',pr[i]:7:2,'|');
end;
For i:=1 to 77 do write(F1,'-');
writeln(F1);
Close(F1);Readln;
end;
end.


Почему выводится только один район(заельцовский)? И как сделать, чтобы из каждого района выводилася школа только с мах процентом?

Автор: ko1hoz 17.05.2007 10:40

Нуу rolleyes.gif

Автор: Lapp 17.05.2007 11:01

Проясни ситуацию, плз..
Вот у тебя длинный набор операторов if идет в проге (по названиям районов). Но в каждом таком if'е ты делаешь абсолютно одно и то же. Спрашивается: зачем тебе эти "иф"ы?

И еще: прикрепи, пожалуйста, файл с данными (запакуй в архив и приаттач).

Автор: ko1hoz 17.05.2007 18:15

Цитата(Lapp @ 17.05.2007 11:01) *

Проясни ситуацию, плз..
Вот у тебя длинный набор операторов if идет в проге (по названиям районов). Но в каждом таком if'е ты делаешь абсолютно одно и то же. Спрашивается: зачем тебе эти "иф"ы?

И еще: прикрепи, пожалуйста, файл с данными (запакуй в архив и приаттач).

Ну как бы считаю процент отличников для каждой школы в данном районе и соответственно переписываю в массив.
P.S. Прикрепил данные, там 5 школ из 3ёх районов с произвольно введёнными данными. Соответственно в результате должно получится 3 школы.


Прикрепленные файлы
Прикрепленный файл  KURS.rar ( 184 байт ) Кол-во скачиваний: 143

Автор: Гость 18.05.2007 10:19

осталась 1 неделя до сдачи rolleyes.gif

Автор: ko1hoz 18.05.2007 10:21

Цитата(Гость @ 18.05.2007 10:19) *

осталась 1 неделя до сдачи rolleyes.gif

изивине, от гостя написал.

Автор: ko1hoz 23.05.2007 20:45

Подскажите пожалуйста, вот программа а также файл с данными. В итоге у меня выводятся все школы районов (20 штук) с их качественными процентными, всё как и нужно. А как сделать, чтобы от каждого района выводилось только по одной школе с максимальным процентом?

 
uses crt;
Const name='d:\kurs2.txt';
Type
spisok=record
raion:string;
p_p,nom,kol_uch,neusp,otl_hor:integer;
end;
Var
k,i:integer;sum:real;
sp:spisok;Ot:char;
sp1:array [1..50] of spisok;
pr:array [1..50] of real;
F:file of spisok;
F1:text;
max:real;
begin
clrscr;
assign(F,'d:\kurs.dat');
reset(F);
Writeln('Zapisat v fail? Y/N');
Readln(Ot);
If (Ot='Y') or (Ot='y') then assign (F1,name) else assign (F1,'con');
Rewrite(F1);
Writeln(F1,' Svedeniya o shkolah raionov');
k:=0;
For i:=1 to 77 do write(F1,'-');
writeln(F1);
Writeln(F1,'| raion |nom_p/p|nom_shkoli|kol uch|kol neusp uch|otl i hor|procent|');
For i:=1 to 77 do write(F1,'-');
writeln(F1);
While not eof(F) do
begin
Read(F,sp);
begin
if sp.raion='oktyabrskii' then
begin
k:=k+1;
sp1[k]:=sp;
pr[k]:=sp.otl_hor/sp.kol_uch*100;
end;
if sp.raion='centralnii' then
begin
k:=k+1;
sp1[k]:=sp;
pr[k]:=sp.otl_hor/sp.kol_uch*100;
end;
if sp.raion='zaelcovskii' then
begin
k:=k+1;
sp1[k]:=sp;
pr[k]:=sp.otl_hor/sp.kol_uch*100;
end;
if sp.raion='sovetskii' then
begin
k:=k+1;
sp1[k]:=sp;
pr[k]:=sp.otl_hor/sp.kol_uch*100;
end;
if sp.raion='pervomaiskii' then
begin
k:=k+1;
sp1[k]:=sp;
pr[k]:=sp.otl_hor/sp.kol_uch*100;
end;
if sp.raion='kalininskii' then
begin
k:=k+1;
sp1[k]:=sp;
pr[k]:=sp.otl_hor/sp.kol_uch*100;
end;
if sp.raion='leninskii' then
begin
k:=k+1;
sp1[k]:=sp;
pr[k]:=sp.otl_hor/sp.kol_uch*100;
end;
if sp.raion='dzerzhinskii' then
begin
k:=k+1;
sp1[k]:=sp;
pr[k]:=sp.otl_hor/sp.kol_uch*100;
end;
if sp.raion='zheleznodorozhnii' then
begin
k:=k+1;
sp1[k]:=sp;
pr[k]:=sp.otl_hor/sp.kol_uch*100;
end;
if sp.raion='kirovskii' then
begin
k:=k+1;
sp1[k]:=sp;
pr[k]:=sp.otl_hor/sp.kol_uch*100;
end;

end;
end;
For i:=1 to k do with sp1[i] do
begin
write(F1,'|', raion:12 ,'|',p_p:7,'|',nom:10,'|');
writeln(F1,kol_uch:7,'|',neusp:13,'|',otl_hor:9,'|',pr[i]:7:2,'|');
end;
For i:=1 to 77 do write(F1,'-');
writeln(F1);
Close(F1);Readln;
close(F)
end.



Прикрепленные файлы
Прикрепленный файл  KURS.rar ( 389 байт ) Кол-во скачиваний: 145

Автор: ko1hoz 25.05.2007 2:38

Сделал, можно тему закрыть.