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

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

Форум «Всё о Паскале» _ Задачи _ Ничего оригинального, тупо ещё одна проблема с прогой).

Автор: Jonathan Davis 23.12.2006 23:07

Задание: создать файл, содержащий сведения о студентах вашей группы(фамилия, имя, отчество, экзаменационные оценки)
а)упорядочить список студентов по успеваемости
б)подсчитать средний балл в группе
в)посчитать средний балл каждого студента

С б и в нет проблем, проблема с а. Понял, что нужно обращаться не к массиву, а к файлу и использовать один из методов сортировки(после прочтения форума), а реализовать не получается.


program bred;
uses crt;
const
w=2;
n=5;
type
ank=record
fam:string[25];
imya:string[25];
otch:string[30];
ozenki:array [1..n] of integer;
end;
spisok=file of ank;
var
a,b:real;
i,j:integer;
an:ank;
s:spisok;
sbs,sbg:real;
begin
assign(s,'d:\studenti.dat');
rewrite(s);
for i:=1 to w do
begin
with an do
begin
write('Familia '); readln(fam);
write('Imya '); readln(imya);
write('Otchestvo '); readln(otch);
write('Ozenki ');
begin
for j:=1 to n do
read(ozenki[j]);
end;
readln;
end;
write(s,an);
end;
close(s);
reset(s);
for i:=1 to w do
begin
read(s,an);
for j:=1 to n do
a:=a+an.ozenki[j];
end;
sbg:=a/(n*w);
Writeln('Srednii ball v gruppe =',sbg:1:1);
close(s);
reset(s);
for i:=1 to w do
begin
read(s,an);
b:=0;
begin
for j:=1 to n do
b:=b+an.ozenki[j];
end;
sbs:=b/n;
write(s,an);
with an do
writeln(an.fam,' ',an.imya,' ',an.otch,' ','srednii ball = ', sbs:1:1);
end;
close(s);
End.


Автор: volvo 23.12.2006 23:23

Ты хочешь прямо в файле сортировать данные? Или все-таки прочесть их в массив, отсортировать и сбросить обратно в файл? Первый вариант тоже можно реализовать, но дольше и... Оно надо?

Автор: Гость 23.12.2006 23:28

Цитата(volvo @ 23.12.2006 19:23) *

Ты хочешь прямо в файле сортировать данные? Или все-таки прочесть их в массив, отсортировать и сбросить обратно в файл? Первый вариант тоже можно реализовать, но дольше и... Оно надо?

А я думал в файле быстрей наоборот будет...в массиве я отсортировать без проблем могу, а как обратно сбрасывать???

Автор: volvo 23.12.2006 23:41

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

Цитата
а как обратно сбрасывать
Очень просто:
reset(f); { <--- Сбрасываешь файл-пойнтер в начало файла }
for i := 1 to n do write(f, arr[i]); { n - размер массива }

Автор: мисс_граффити 23.12.2006 23:44

Цитата
А я думал в файле быстрей наоборот будет...

Некоторые сортировки (внешние) и на файлах дают неплохие результаты, но скорость доступа к элементам массива несравнимо выше. Обычно сортируют именно файлы, когда они довольно большие и создать такой массив проблематично. И то - иногда просто разбивают их на части, сортируют массивы, а потом делают слияние.

Автор: Гость 23.12.2006 23:52

Цитата(volvo @ 23.12.2006 19:41) *

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

Очень просто:
reset(f); { <--- Сбрасываешь файл-пойнтер в начало файла }
for i := 1 to n do write(f, arr[i]); { n - размер массива }


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

Автор: Гость 23.12.2006 23:56

Цитата(мисс_граффити @ 23.12.2006 19:44) *

Некоторые сортировки (внешние) и на файлах дают неплохие результаты, но скорость доступа к элементам массива несравнимо выше. Обычно сортируют именно файлы, когда они довольно большие и создать такой массив проблематично. И то - иногда просто разбивают их на части, сортируют массивы, а потом делают слияние.

Да для меня скорость обработки не главное smile.gif , главное чтоб работало).

Автор: volvo 23.12.2006 23:58

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

Цитата
никакой привязки к именам студентов не будет
blink.gif У тебя же файл ЗАПИСЕЙ? А каждая запись содержит фамилию студента, и все данные на него...

Сортировать массив ЗАПИСЕЙ по определенному признаку умеешь?

Автор: Гость 24.12.2006 0:04

Цитата(volvo @ 23.12.2006 19:58) *

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

Ну я сразу как считаю средний балл студента, записываю его в массив. А мне писать в другой файл или в этот же можна??? Чёт мне кажетсся нельзя мне в этот. Вобще спасибо, что помогаете, не ожидал такого отклика))). smile.gif
Цитата(volvo @ 23.12.2006 19:58) *

blink.gif У тебя же файл ЗАПИСЕЙ? А каждая запись содержит фамилию студента, и все данные на него...

Сортировать массив ЗАПИСЕЙ по определенному признаку умеешь?

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

Автор: volvo 24.12.2006 0:13

Цитата
Ну я сразу как считаю средний балл студента, записываю его в массив.
Аааа... smile.gif Нет, так не пойдет... Тебе надо сортировать именно массив ВСЕХ данных... Как это делается - здесь: http://forum.pascal.net.ru/index.php?s=&showtopic=2401&view=findpost&p=20401

Автор: мисс_граффити 24.12.2006 0:14

Можно в этот, но тогда ты потеряешь тот порядок, который был изначально, безвозвратно.
По поводу записей: представь, что держишь в руках анкеты - заполненные листы бумаги. В каждой указаны ФИО и возраст. Ты раскладываешь их по возрасту в порядке убывания. Ведь не отрываешь кусочек, на котором указан возраст, правда? Когда разложишь, связь между фамилией и возрастом сохранится.
То же самое с записями...

Автор: Jonathan Davis 24.12.2006 0:48

Там возраст уже дан, а мне успеваемость нужно вычислить. Куда мне её сохранять?

Автор: volvo 24.12.2006 1:04

Да не надо ничего сохранять! Что, нельзя написать еще одну функцию, которая для определенной записи будет "на лету" вычислять успеваемость?

Автор: Jonathan Davis 24.12.2006 1:06

Цитата(volvo @ 23.12.2006 21:04) *

Да не надо ничего сохранять! Что, нельзя написать еще одну функцию, которая для определенной записи будет "на лету" вычислять успеваемость?

Наверно можно. Да не обижайтесь, я ж ламер). Чтото мне казалось, что программа значительно легче...

Автор: volvo 24.12.2006 1:12

Смотри (банальный "пузырек"):

Type
arrType = Array[1 .. n] Of Ank;

Function F(X: Ank): Real;
Begin
{ Здесь вычисляешь "успеваемость" для студента, чья анкета - X }
End;

Procedure Bubble(Var ar: arrType; n: integer);
Var
i, j: Integer;
T: Ank;
Begin
For i := 1 To n Do
For j := n DownTo i+1 Do
If F(ar[Pred(j)]) > F(ar[j]) Then Begin
T := ar[Pred(j)]; ar[Pred(j)] := ar[j]; ar[j] := T
End
End;
Если бы ты уточнил, что значит "успеваемость" - я бы написал, КАК именно ее вычислить... Средний балл? Макс. балл? Что-то другое?

Автор: Jonathan Davis 24.12.2006 1:16

Цитата(volvo @ 23.12.2006 21:12) *

Смотри (банальный "пузырек"):
Type
arrType = Array[1 .. n] Of Ank;

Function F(X: Ank): Real;
Begin
{ Здесь вычисляешь "успеваемость" для студента, чья анкета - X }
End;

Procedure Bubble(Var ar: arrType; n: integer);
Var
i, j: Integer;
T: Ank;
Begin
For i := 1 To n Do
For j := n DownTo i+1 Do
If F(ar[Pred(j)]) > F(ar[j]) Then Begin
T := ar[Pred(j)]; ar[Pred(j)] := ar[j]; ar[j] := T
End
End;
Если бы ты уточнил, что значит "успеваемость" - я бы написал, КАК именно ее вычислить... Средний балл? Макс. балл? Что-то другое?

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

Автор: Jonathan Davis 25.12.2006 1:25

Ой, мож кто поможет связать код volvo с моей прогой...Я, конечно, понимаю, что мне и так уже многое размусолили да ещё и задаром, но голова кругом от алгебры(сейчас решал)... wacko.gif

Автор: Jonathan Davis 11.01.2007 22:51

Помогите пожалуйста, завтра сдавать(
Как посчитать средний балл???

Автор: мисс_граффити 11.01.2007 23:30

передаешь функции запись как параметр... а внутри нее считаешь сумму оценок (имена полей ты знаешь) и делишь на количество (его ты тоже знаешь). Этот результат и возращаешь

Автор: Jonathan Davis 11.01.2007 23:47

Цитата(мисс_граффити @ 11.01.2007 19:30) *

передаешь функции запись как параметр...

Что вы подразумеваете под понятием параметр?

Автор: мисс_граффити 12.01.2007 0:13

Цитата
function sredn (const student: ank): real;

а какие еще варианты, что можно подразумевать под этим понятием?

Автор: Jonathan Davis 12.01.2007 0:21

Код
function f(x:ank):real;
var
i,m:integer;
begin
for i:=1 to n do
m:m+an.ozenki[i];
f:=m/n;
end.

Вот так???

Автор: мисс_граффити 12.01.2007 0:35

 m:m+an.ozenki[i];

ты имел в виду "присвоить"?
не забудь обнулить m сначала

Автор: Jonathan Davis 12.01.2007 0:41

Цитата(мисс_граффити @ 11.01.2007 20:35) *

ты имел в виду "присвоить"?
не забудь обнулить m сначала

Конечно)
Код
function f(x:ank):real;
var
i,m:integer;
begin
m:=0;
for i:=1 to n do
m:=m+an.ozenki[i];
f:=m/n;
end.

А какая связь переменной x с функцией, если это номер анкеты студента...?

Автор: мисс_граффити 12.01.2007 1:09

Ты хочешь передавать именно номер, а не саму анкету? Не проблема... Но зачем?

Автор: Jonathan Davis 12.01.2007 1:11

Цитата(мисс_граффити @ 11.01.2007 21:09) *

Ты хочешь передавать именно номер, а не саму анкету? Не проблема... Но зачем?

Я хочу передавать анкету, что для этого надо сделать??? а то уменя х не задействован

Автор: мисс_граффити 12.01.2007 1:15

function f(x:ank):real;
var
i,m:integer;
begin
m:=0;
for i:=1 to n do
m:=m+an.ozenki[i]; <-- вот здесь ты должен работать с полями х
f:=m/n;
end.

то есть смотри: ты передаешь одну анкету (x), и считаешь среднее только по ней.
или тебе надо среднее всей группы?

Автор: Jonathan Davis 12.01.2007 1:22

Цитата(мисс_граффити @ 11.01.2007 21:15) *

function f(x:ank):real;
var
i,m:integer;
begin
m:=0;
for i:=1 to n do
m:=m+an.ozenki[i]; <-- вот здесь ты должен работать с полями х
f:=m/n;
end.

то есть смотри: ты передаешь одну анкету (x), и считаешь среднее только по ней.
или тебе надо среднее всей группы?

одной анкеты, как с полями х работать?

Автор: мисс_граффити 12.01.2007 1:24

так же, как с полями an. они же одного типа (ank), значит, поля у них одни и те же будут.

Автор: Jonathan Davis 12.01.2007 1:26

Цитата(мисс_граффити @ 11.01.2007 21:24) *

так же, как с полями an. они же одного типа (ank), значит, поля у них одни и те же будут.

Код
function f(x:ank):real;
var
i,m:integer;
begin
m:=0;
for i:=1 to n do
m:=m+x.ozenki[i];
f:=m/n;
end.

Так?