IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> помогите решить задачу!, Нужно решить задачу с помощью процедуры и функции.
natik3
сообщение 28.03.2012 1:07
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 34
Пол: Женский

Репутация: -  0  +


В общем надо решить следующую задачу: Известно, что в следующем фрагменте программы массив матрица содержит оценки студентов группы, фамилии которых перечислены в типе фамилий
 type 
fam=(Ivanov,Petrov,Sidorov);
pred=(Algebra,Russkii,Informatika);
var
matr:array[fam,pred] of integer

Необходимо выяснить сколько студентов группы имеют средний балл, наименее всего отклоняющийся по абсолютному значению от среднего балла всей группы.
Не могу понять как решать с помощью процедуры и функции.Помогите!!!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 28.03.2012 7:35
Сообщение #2


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Делаешь функцию, возвращающую средний балл студента:

function AverageGrade(Student: fam): real;
var
i: pred;
s: real;
begin
s:= 0;
for i:= Low(pred) to High(pred) do s:= s + matr[Student,i];
AverageGrade:= s/(Ord(High(pred))+1)
end;


А потом используешь ее..
Для нахождения общего среднего:
  s:= 0;
for i:= Low(fam) to High(fam) do s:= s + AvegrageGrade(i); // i is ot type fam here
TotalAverage:= s/(Ord(High(fam))+1);


И для выяснения наименьшее отклонение от него, тоже в цикле по студентам:
  MinDeviation:= High(integer);    // MaxDeviation опиши как real
for i:= Low(fam) to High(fam) do
if Abs(AvegrageGrade(i)-TotalAverage)<MinDeviation then begin
MinDeviation:= Abs(AvegrageGrade(i)-TotalAverage);
Count:= 1
end
else if Abs(Abs(AvegrageGrade(i)-TotalAverage)-MinDiviation)<1e-8 then Inc(Count) //corrected, see post from TarasBer below
WriteLn(Count,' студентов имеют минимальное отклонение от среднего балла группы');


Вот, примерно все.. Осталось только собрать все, правильно описать переменные и сделать ввод данных.
Спрашивай, что неясно. Успехов тебе.

Сообщение отредактировано: Lapp - 5.04.2012 0:56


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
TarasBer
сообщение 28.03.2012 9:22
Сообщение #3


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


> s/(Ord(High(pred))+1)

Неверно, а вдруг pred - это тип-поддиапазон?

Тогда уж

s/(Ord(High(pred)) - Ord(Low(pred)) +1)


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
natik3
сообщение 3.04.2012 18:38
Сообщение #4


Новичок
*

Группа: Пользователи
Сообщений: 34
Пол: Женский

Репутация: -  0  +


Цитата(Lapp @ 28.03.2012 8:35) *

Делаешь функцию, возвращающую средний балл студента:

function AverageGrade(Student: fam): real;
var
i: pred;
s: real;
begin
s:= 0;
for i:= Low(pred) to High(pred) do s:= s + matr[Student,i];
AverageGrade:= s/(Ord(High(pred))+1)
end;


А потом используешь ее..
Для нахождения общего среднего:
  s:= 0;
for i:= Low(fam) to High(fam) do s:= s + AvegrageGrade(i); // i is ot type fam here
TotalAverage:= s/(Ord(High(fam))+1);


И для выяснения наименьшее отклонение от него, тоже в цикле по студентам:
  MinDeviation:= High(integer);    // MaxDeviation опиши как real
for i:= Low(fam) to High(fam) do
if Abs(AvegrageGrade(i)-TotalAverage)<MinDeviation then begin
MinDeviation:= Abs(AvegrageGrade(i)-TotalAverage);
Count:= 1
end
else if Abs(AvegrageGrade(i)-TotalAverage)<1e-8 then Inc(Count)
WriteLn(Count,' студентов имеют минимальное отклонение от среднего балла группы');


Вот, примерно все.. Осталось только собрать все, правильно описать переменные и сделать ввод данных.
Спрашивай, что неясно. Успехов тебе.



спасибо.а не подскажешь откуда в Abs(AvegrageGrade(i)-TotalAverage)<1e-8 мы берем 1e-8?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Krjuger
сообщение 3.04.2012 19:34
Сообщение #5


Профи
****

Группа: Пользователи
Сообщений: 652
Пол: Мужской
Реальное имя: Алексей

Репутация: -  20  +


С точки зрения здравого смысла.Потому что минимальное отклонение число физически может быть только у одного человека,шанс того, что 2 человека имеют абсолютно идентичную разницу с средним балом, очень мал.Поэтому ставиться наш собственный рубеж дескать,если есть те кто в районе 0,00000001 от среднего значения,то их тоже рассматривать как ближайших.В то время,как само минимальное отклонение может быть 1е-20, например.

Сообщение отредактировано: Krjuger - 3.04.2012 19:35
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
natik3
сообщение 3.04.2012 20:18
Сообщение #6


Новичок
*

Группа: Пользователи
Сообщений: 34
Пол: Женский

Репутация: -  0  +


Цитата(Krjuger @ 3.04.2012 20:34) *

С точки зрения здравого смысла.Потому что минимальное отклонение число физически может быть только у одного человека,шанс того, что 2 человека имеют абсолютно идентичную разницу с средним балом, очень мал.Поэтому ставиться наш собственный рубеж дескать,если есть те кто в районе 0,00000001 от среднего значения,то их тоже рассматривать как ближайших.В то время,как само минимальное отклонение может быть 1е-20, например.



а нельзя допустим никак обойтись без abs и inc.b заменить это нимимальное отклонение на что нибудь другое?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Krjuger
сообщение 3.04.2012 20:38
Сообщение #7


Профи
****

Группа: Пользователи
Сообщений: 652
Пол: Мужской
Реальное имя: Алексей

Репутация: -  20  +


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

Это и есть наименшее значение отклонения.Абсолютное значение означает,что средний балл студента может быть и меньше и больше на эту величину.Вообще, когда говорят абсолютное подразумевается модуль.Именно поэтому и модуль числа,а в паскале abs- функция реализующая модуль числа.Так что без нее никак, только если самому писать.Но зачем создавать свой велосипед,когда уже есть спортивный байк.
inc(b),эт всего лишь встроенная функция, означает она увеличить число b на единицу.По сути это равносильно написанию b:=b+1;
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
natik3
сообщение 3.04.2012 20:45
Сообщение #8


Новичок
*

Группа: Пользователи
Сообщений: 34
Пол: Женский

Репутация: -  0  +


Цитата(Krjuger @ 3.04.2012 21:38) *

Хах у тебя задание

Это и есть наименшее значение отклонения.Абсолютное значение означает,что средний балл студента может быть и меньше и больше на эту величину.Вообще, когда говорят абсолютное подразумевается модуль.Именно поэтому и модуль числа,а в паскале abs- функция реализующая модуль числа.Так что без нее никак, только если самому писать.Но зачем создавать свой велосипед,когда уже есть спортивный байк.
inc(b),эт всего лишь встроенная функция, означает она увеличить число b на единицу.По сути это равносильно написанию b:=b+1;



[Error] str45n34c67g.dpr(26): Incompatible types: 'Integer' and 'pred'
он мне выдает эту ошибку.как её исправить.
P.S. я знаю я туплю...но что поделать,я только учусь(
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
IUnknown
сообщение 3.04.2012 20:53
Сообщение #9


a.k.a. volvo877
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской

Репутация: -  627  +


Может, мы все-таки увидим, как все эти фрагменты были собраны в одну программу? Или нам надо собрать самим, убедиться что ошибки нет (при правильной последовательности ее не будет) и опять затеять обсуждение на полсотни постов по методу "испорченный телефон"?

P. S. Стоп. У тебя тип называется Pred? Напрасно. Уже есть функция с тем же именем, и вполне возможно, что у тебя просто конфликт между именами типа и функции.

Сообщение отредактировано: IUnknown - 3.04.2012 20:56
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
natik3
сообщение 3.04.2012 21:02
Сообщение #10


Новичок
*

Группа: Пользователи
Сообщений: 34
Пол: Женский

Репутация: -  0  +


Цитата(IUnknown @ 3.04.2012 21:53) *

Может, мы все-таки увидим, как все эти фрагменты были собраны в одну программу? Или нам надо собрать самим, убедиться что ошибки нет (при правильной последовательности ее не будет) и опять затеять обсуждение на полсотни постов по методу "испорченный телефон"?

P. S. Стоп. У тебя тип называется Pred? Напрасно. Уже есть функция с тем же именем, и вполне возможно, что у тебя просто конфликт между именами типа и функции.


type
fam=(Ivanov,Petrov,Sidorov);
pred=(Algebra,Russkii,Informatika);
matr=array[fam ,predm] of real;
var
a:matr;

function sred(Student: fam): real;
var
i: predm;
s: real;
begin
s:= 0;
for i:= Low(predm) to High(predm) do s:= s + a[Student,i];
sred:= s/(Ord(High(predm))+1)
end;

function Total( a: matr):real;
var
i: fam;
s: real;
begin
s:= 0;
for i:= Low(fam) to High(fam) do
s:= s +sred(i); // i is ot type fam here
Total:= s/(Ord(High(fam))+1)
end;

function MinDev (a:matr):real;
var
i: fam;
s: real;
MinDev:real;
begin
MinDev:= High(integer); // MaxDeviation îïèøè êàê real
for i:= Low(fam) to High(fam) do
if Abs(sred(i)-Total)<MinDev then
begin
MinD:= Abs(sped(i)-Total);
Count:= 1
end
else if Abs(sred(i)-Total)<1e-8 then
Inc(Count)
WriteLn(Count,' студентов имеют минимальное отклонение от греднего балла группы');
end.



я знаю,что скорее всего тут миллион ошибок.помогите пожалуйста((
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Krjuger
сообщение 4.04.2012 0:41
Сообщение #11


Профи
****

Группа: Пользователи
Сообщений: 652
Пол: Мужской
Реальное имя: Алексей

Репутация: -  20  +


Госпади,что вы наворотили,ладно щас разберемся.
Ну для начала, переименовывать то ,что было- было плохой идеей.Затем вы ооочень невнимательно пишите, ваш sred периодически становится sped, у вашей функции Total,есть передаваемый параметр,но когда вы ее вызываете вы его не передаете,затем, ваша функция Total должна вычислить общее среднее значение,так зачем же в цикле его каждый раз вычислять??Вычислили, запомнили и используем.
В общем исправив все недочеты вышло следующее.

type
fam=(Ivanov,Petrov,Sidorov);
pred=(Algebra,Russkii,Informatika);
matr=array[fam ,pred] of real;
var
a:matr;
res:real;

function sred(Student: fam): real;
var
i: pred;
s: real;
begin
s:= 0;
for i:= Low(pred) to High(pred) do s:= s + a[Student,i];
sred:= s/(Ord(High(pred))+1)
end;

function TotalAverege:real;
var
i: fam;
s: real;
begin
s:= 0;
for i:= Low(fam) to High(fam) do
s:= s +sred(i) ; { i is ot type fam here }
TotalAverege:= s/(Ord(High(fam))+1)
end;

Procedure MinDev (a:matr);
var
i: fam;
s: real;
MinDev:real;
Averege:real;
Count:integer;
begin
MinDev:= High(integer); { MinDeviation ????? ??? real }
Averege:=TotalAverege;
for i:= Low(fam) to High(fam) do
if Abs(sred(i)-Averege)<MinDev then
begin
MinDev:= Abs(sred(i)-Averege);
Count:= 1;
end
else if Abs(sred(i)-Averege)<1e-8 then
Inc(Count);
WriteLn(Count,' студентов имеют минимальное отклонение от греднего балла группы');
readln;
end;

begin
a[Ivanov,Russkii]:=4;
a[Petrov,Russkii]:=4;
a[Sidorov,Russkii]:=4;
MinDev(a);
end.

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
TarasBer
сообщение 4.04.2012 9:22
Сообщение #12


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Цитата(Krjuger @ 3.04.2012 19:34) *

С точки зрения здравого смысла.Потому что минимальное отклонение число физически может быть только у одного человека,шанс того, что 2 человека имеют абсолютно идентичную разницу с средним балом, очень мал.Поэтому ставиться наш собственный рубеж дескать,если есть те кто в районе 0,00000001 от среднего значения,то их тоже рассматривать как ближайших.В то время,как само минимальное отклонение может быть 1е-20, например.

Ты дезой не занимайся.
Шанс, что у двоих будет одинаковый сдрений балл? Да как нафиг.
Знаешь, что такое 1Е-8, и что означает запись abs(a-b)<1e-8? Это так сравнивают вещественные числа. Из-за погрешности вычислений (которым такие числа подвержены) их нельзя сравнивать в лоб, поэтому их сравнивают так.
Ну и

else if Abs(AvegrageGrade(i)-TotalAverage)<1e-8 then Inc(Count)

написано с ошибкой, надо

else if Abs(MinDeviation - Abs(AvegrageGrade(i)-TotalAverage))<1e-8 then Inc(Count)

Что по смыслу похоже на

ЕСЛИ MinDeviation = CurrentDeviation ТОГДА Inc(Count);

Добавлено через 3 мин.
Кстати, случай, когда CurrentDeviation оказалось почти равно среднему, но чуть меньше, попадает в случай "меньше", а не "равно", это тоже неверно, тоже надо исправить.

То есть код должен быть такой:

const Eps = 1E-8;
...
for i:= Low(fam) to High(fam) do begin
CurrentDeviation := Abs(sred(i)-Average);
if Abs(CurrentDeviation - MinDeviation) < Eps then begin
Inc(Count);
end else if CurrentDeviation < MinDeviation then begin
MinDeviation := CurrentDeviation;
Count :=1;
end;
end;




Кстати, Krjuger, куда ты похерил форматирование кода в своём последнем коде.



--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
kiss
сообщение 4.04.2012 13:07
Сообщение #13





Группа: Пользователи
Сообщений: 2
Пол: Мужской

Репутация: -  0  +


Помогите, пожалуйста!!!
1. Написать программу, определяющую вид треугольника со сторонами a,b,c.
Входные данные: a, b, c
Выходные данные:
остроугольный/прямоугольный/тупоугольный/равнобедренный/равносторонний/

2. Написать программу, которая находит сумму n, n+3 и n+7 членов геометрической прогрессии с точностью до шести знаков после запятой, если известны ее первый член b1 и частное q.
Входные данные: b1, q, n
Выходные данные: sum

3. Написать программу, которая находит сумму n, n+3 и n+7 членов геометрической прогрессии с точностью до шести знаков после запятой, если известны ее первый член b1 и частное q.
Входные данные: b1, q, n
Выходные данные: sum

4. Дано число n, не превышающее 20.
Заполнить двумерный массив (матрицу) mass размерностью n х n числами {0,1} так, чтобы элементы на главной диагонали и выше нее были равны 1, элементы под главной диагональю — были равны 0.
Вывести массив на экран в виде таблицы.
Входные данные: n
Выходные данные: mass

5. Даны числа m и n, не превосходящие 100.

Заполнить двумерный массив mass размерностью т х n случайными целыми числами из диапазана (-50;50).
Вывести массив на экран в виде таблицы.
Найти и вывести на экран минимальные элементы в каждой строке.
Найти максимумы в каждом столбце и вывести на экран их сумму.
Входные данные: m, n
Выходные данные: массив, минимумы, сумма максимумов

6. Заполнить двумерный массив mass размерностью 5х5 случайными символами.
Вывести массив на экран в виде таблицы.
Выписать слово, получающееся из символов, расположенных на побочной диагонали1 матрицы.
Входные данные: -
Выходные данные: mass, summ
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Krjuger
сообщение 4.04.2012 14:42
Сообщение #14


Профи
****

Группа: Пользователи
Сообщений: 652
Пол: Мужской
Реальное имя: Алексей

Репутация: -  20  +


Цитата
Ты дезой не занимайся.
Шанс, что у двоих будет одинаковый сдрений балл? Да как нафиг.
Знаешь, что такое 1Е-8, и что означает запись abs(a-b)<1e-8? Это так сравнивают вещественные числа. Из-за погрешности вычислений (которым такие числа подвержены) их нельзя сравнивать в лоб, поэтому их сравнивают так.

Если тебе ленно вникнуть в то,что я написал,то это не моя вина,я и сказал,что это погрешность вычислений.Или,если правильней сказать, то область, которую мы считаем погрешностью.
Real 11-12 значащих цифр, так что ничто нам не помешает сделать 1e-10,а если погрешность не важна, то и 1e-4.Никаких четких правил и инструкций, почему 1e-8 я не видел,возможно они и есть.Тогда просветите.
Ошибки,приведенные тобой,тут каюсь,я доверился Lapp'у и не смотрел даже,просто привел программу в вид,который компилируется и считает.Форматирование я потерял,когда копировал с форума.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
TarasBer
сообщение 4.04.2012 15:05
Сообщение #15


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


> Если тебе ленно вникнуть в то,что я написал,то это не моя вина,я и сказал,что это погрешность вычислений.

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


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 5.04.2012 1:06
Сообщение #16


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(TarasBer @ 4.04.2012 16:05) *
Ну знаешь, я только с 3 раза догадался, что "только один человек может иметь именно такой-то средний балл" означает погрешность вещественных чисел.

Крюгер работает над ясностью изложения и четкостью объяснений, и у него есть успехи, но не все сразу..

Прошу прощения за ошибку, TarasBer'у +1
Крюгеру тоже, как пострадавшему через меня )) и за помощь на Форуме.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 28.04.2024 2:05
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"