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

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

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

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


Новичок
*

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

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


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

Необходимо выяснить сколько студентов группы имеют средний балл, наименее всего отклоняющийся по абсолютному значению от среднего балла всей группы.
Не могу понять как решать с помощью процедуры и функции.Помогите!!!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 -


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


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

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

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


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

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

Тогда уж

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


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Профи
****

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

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


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

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


Новичок
*

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

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


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

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



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


Профи
****

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

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


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

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


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

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


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

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

Сообщение отредактировано: IUnknown -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Профи
****

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

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


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

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


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

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

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


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

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


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


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

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

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


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

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

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


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

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

 





- Текстовая версия 19.04.2024 10:09
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name