Форум «Всё о Паскале» _ Задачи _ Ничего оригинального, тупо ещё одна проблема с прогой).
Автор: 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)
Некоторые сортировки (внешние) и на файлах дают неплохие результаты, но скорость доступа к элементам массива несравнимо выше. Обычно сортируют именно файлы, когда они довольно большие и создать такой массив проблематично. И то - иногда просто разбивают их на части, сортируют массивы, а потом делают слияние.
Да для меня скорость обработки не главное , главное чтоб работало).
Автор: volvo 23.12.2006 23:58
Ну, перед сбрасыванием в файл пробегись по массиву и посчитай, все что надо... Или уже после сбрасывания отсортированной информации в файл опять переоткрой его и считай любые показатели прямо оттуда...
Цитата
никакой привязки к именам студентов не будет
У тебя же файл ЗАПИСЕЙ? А каждая запись содержит фамилию студента, и все данные на него...
Сортировать массив ЗАПИСЕЙ по определенному признаку умеешь?
Автор: Гость 24.12.2006 0:04
Цитата(volvo @ 23.12.2006 19:58)
Ну, перед сбрасыванием в файл пробегись по массиву и посчитай, все что надо... Или уже после сбрасывания отсортированной информации в файл опять переоткрой его и считай любые показатели прямо оттуда...
Ну я сразу как считаю средний балл студента, записываю его в массив. А мне писать в другой файл или в этот же можна??? Чёт мне кажетсся нельзя мне в этот. Вобще спасибо, что помогаете, не ожидал такого отклика))).
Цитата(volvo @ 23.12.2006 19:58)
У тебя же файл ЗАПИСЕЙ? А каждая запись содержит фамилию студента, и все данные на него...
Сортировать массив ЗАПИСЕЙ по определенному признаку умеешь?
Вот тут то моя слабость, насчёт этих записей не представляю, как они работают, мне кажется, отсортирую я массив, запишу в файл, а там тока одни цифры...как связать с именами студентов не понимаю...
Автор: volvo 24.12.2006 0:13
Цитата
Ну я сразу как считаю средний балл студента, записываю его в массив.
Аааа... Нет, так не пойдет... Тебе надо сортировать именно массив ВСЕХ данных... Как это делается - здесь: 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 с моей прогой...Я, конечно, понимаю, что мне и так уже многое размусолили да ещё и задаром, но голова кругом от алгебры(сейчас решал)...
Автор: 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.