Помощь - Поиск - Пользователи - Календарь
Полная версия: Ничего оригинального, тупо ещё одна проблема с прогой).
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Jonathan Davis
Задание: создать файл, содержащий сведения о студентах вашей группы(фамилия, имя, отчество, экзаменационные оценки)
а)упорядочить список студентов по успеваемости
б)подсчитать средний балл в группе
в)посчитать средний балл каждого студента

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

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
Ты хочешь прямо в файле сортировать данные? Или все-таки прочесть их в массив, отсортировать и сбросить обратно в файл? Первый вариант тоже можно реализовать, но дольше и... Оно надо?
Гость
Цитата(volvo @ 23.12.2006 19:23) *

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

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

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

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

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

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


эт да, но мне потом ещё надо вывести всё красивенько, типа сначала такой то студент с самой хорошей успеваемостью, потом другой, это как осуществить. В файл же запишеться просто упорядоченный массив, никакой привязки к именам студентов не будет...или как?
Гость
Цитата(мисс_граффити @ 23.12.2006 19:44) *

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

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

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

Сортировать массив ЗАПИСЕЙ по определенному признаку умеешь?
Гость
Цитата(volvo @ 23.12.2006 19:58) *

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

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

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

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

Вот тут то моя слабость, насчёт этих записей не представляю, как они работают, мне кажется, отсортирую я массив, запишу в файл, а там тока одни цифры...как связать с именами студентов не понимаю...
volvo
Цитата
Ну я сразу как считаю средний балл студента, записываю его в массив.
Аааа... smile.gif Нет, так не пойдет... Тебе надо сортировать именно массив ВСЕХ данных... Как это делается - здесь: Как упорядочить данные по возрастанию?
мисс_граффити
Можно в этот, но тогда ты потеряешь тот порядок, который был изначально, безвозвратно.
По поводу записей: представь, что держишь в руках анкеты - заполненные листы бумаги. В каждой указаны ФИО и возраст. Ты раскладываешь их по возрасту в порядке убывания. Ведь не отрываешь кусочек, на котором указан возраст, правда? Когда разложишь, связь между фамилией и возрастом сохранится.
То же самое с записями...
Jonathan Davis
Там возраст уже дан, а мне успеваемость нужно вычислить. Куда мне её сохранять?
volvo
Да не надо ничего сохранять! Что, нельзя написать еще одну функцию, которая для определенной записи будет "на лету" вычислять успеваемость?
Jonathan Davis
Цитата(volvo @ 23.12.2006 21:04) *

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

Наверно можно. Да не обижайтесь, я ж ламер). Чтото мне казалось, что программа значительно легче...
volvo
Смотри (банальный "пузырек"):
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
Цитата(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
Ой, мож кто поможет связать код volvo с моей прогой...Я, конечно, понимаю, что мне и так уже многое размусолили да ещё и задаром, но голова кругом от алгебры(сейчас решал)... wacko.gif
Jonathan Davis
Помогите пожалуйста, завтра сдавать(
Как посчитать средний балл???
мисс_граффити
передаешь функции запись как параметр... а внутри нее считаешь сумму оценок (имена полей ты знаешь) и делишь на количество (его ты тоже знаешь). Этот результат и возращаешь
Jonathan Davis
Цитата(мисс_граффити @ 11.01.2007 19:30) *

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

Что вы подразумеваете под понятием параметр?
мисс_граффити
Цитата
function sredn (const student: ank): real;

а какие еще варианты, что можно подразумевать под этим понятием?
Jonathan Davis
Код
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.

Вот так???
мисс_граффити
 m:m+an.ozenki[i];

ты имел в виду "присвоить"?
не забудь обнулить m сначала
Jonathan Davis
Цитата(мисс_граффити @ 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 с функцией, если это номер анкеты студента...?
мисс_граффити
Ты хочешь передавать именно номер, а не саму анкету? Не проблема... Но зачем?
Jonathan Davis
Цитата(мисс_граффити @ 11.01.2007 21:09) *

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

Я хочу передавать анкету, что для этого надо сделать??? а то уменя х не задействован
мисс_граффити
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
Цитата(мисс_граффити @ 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), и считаешь среднее только по ней.
или тебе надо среднее всей группы?

одной анкеты, как с полями х работать?
мисс_граффити
так же, как с полями an. они же одного типа (ank), значит, поля у них одни и те же будут.
Jonathan Davis
Цитата(мисс_граффити @ 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.

Так?
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.