1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... 2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения. 3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора). 5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM! 6. Одна тема - один вопрос (задача) 7.Проверяйте программы перед тем, как разместить их на форуме!!! 8.Спрашивайте и отвечайте четко и по существу!!!
помогите решить задачу!, Нужно решить задачу с помощью процедуры и функции.
В общем надо решить следующую задачу: Известно, что в следующем фрагменте программы массив матрица содержит оценки студентов группы, фамилии которых перечислены в типе фамилий
type
fam=(Ivanov,Petrov,Sidorov);
pred=(Algebra,Russkii,Informatika);
var
matr:array[fam,pred] of integer
Необходимо выяснить сколько студентов группы имеют средний балл, наименее всего отклоняющийся по абсолютному значению от среднего балла всей группы. Не могу понять как решать с помощью процедуры и функции.Помогите!!!
Делаешь функцию, возвращающую средний балл студента:
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) doif Abs(AvegrageGrade(i)-TotalAverage)<MinDeviation thenbegin
MinDeviation:= Abs(AvegrageGrade(i)-TotalAverage);
Count:= 1endelseif Abs(Abs(AvegrageGrade(i)-TotalAverage)-MinDiviation)<1e-8then Inc(Count) //corrected, see post from TarasBer below
WriteLn(Count,' студентов имеют минимальное отклонение от среднего балла группы');
Вот, примерно все.. Осталось только собрать все, правильно описать переменные и сделать ввод данных. Спрашивай, что неясно. Успехов тебе.
Сообщение отредактировано: Lapp -
--------------------
я - ветер, я северный холодный ветер я час расставанья, я год возвращенья домой
Делаешь функцию, возвращающую средний балл студента:
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) doif Abs(AvegrageGrade(i)-TotalAverage)<MinDeviation thenbegin
MinDeviation:= Abs(AvegrageGrade(i)-TotalAverage);
Count:= 1endelseif Abs(AvegrageGrade(i)-TotalAverage)<1e-8then Inc(Count)
WriteLn(Count,' студентов имеют минимальное отклонение от среднего балла группы');
Вот, примерно все.. Осталось только собрать все, правильно описать переменные и сделать ввод данных. Спрашивай, что неясно. Успехов тебе.
спасибо.а не подскажешь откуда в Abs(AvegrageGrade(i)-TotalAverage)<1e-8 мы берем 1e-8?
С точки зрения здравого смысла.Потому что минимальное отклонение число физически может быть только у одного человека,шанс того, что 2 человека имеют абсолютно идентичную разницу с средним балом, очень мал.Поэтому ставиться наш собственный рубеж дескать,если есть те кто в районе 0,00000001 от среднего значения,то их тоже рассматривать как ближайших.В то время,как само минимальное отклонение может быть 1е-20, например.
С точки зрения здравого смысла.Потому что минимальное отклонение число физически может быть только у одного человека,шанс того, что 2 человека имеют абсолютно идентичную разницу с средним балом, очень мал.Поэтому ставиться наш собственный рубеж дескать,если есть те кто в районе 0,00000001 от среднего значения,то их тоже рассматривать как ближайших.В то время,как само минимальное отклонение может быть 1е-20, например.
а нельзя допустим никак обойтись без abs и inc.b заменить это нимимальное отклонение на что нибудь другое?
Необходимо выяснить сколько студентов группы имеют средний балл, наименее всего отклоняющийся по абсолютному значению от среднего балла всей группы.
Это и есть наименшее значение отклонения.Абсолютное значение означает,что средний балл студента может быть и меньше и больше на эту величину.Вообще, когда говорят абсолютное подразумевается модуль.Именно поэтому и модуль числа,а в паскале abs- функция реализующая модуль числа.Так что без нее никак, только если самому писать.Но зачем создавать свой велосипед,когда уже есть спортивный байк. inc(b),эт всего лишь встроенная функция, означает она увеличить число b на единицу.По сути это равносильно написанию b:=b+1;
Это и есть наименшее значение отклонения.Абсолютное значение означает,что средний балл студента может быть и меньше и больше на эту величину.Вообще, когда говорят абсолютное подразумевается модуль.Именно поэтому и модуль числа,а в паскале abs- функция реализующая модуль числа.Так что без нее никак, только если самому писать.Но зачем создавать свой велосипед,когда уже есть спортивный байк. inc(b),эт всего лишь встроенная функция, означает она увеличить число b на единицу.По сути это равносильно написанию b:=b+1;
[Error] str45n34c67g.dpr(26): Incompatible types: 'Integer' and 'pred' он мне выдает эту ошибку.как её исправить. P.S. я знаю я туплю...но что поделать,я только учусь(
Может, мы все-таки увидим, как все эти фрагменты были собраны в одну программу? Или нам надо собрать самим, убедиться что ошибки нет (при правильной последовательности ее не будет) и опять затеять обсуждение на полсотни постов по методу "испорченный телефон"?
P. S. Стоп. У тебя тип называется Pred? Напрасно. Уже есть функция с тем же именем, и вполне возможно, что у тебя просто конфликт между именами типа и функции.
Может, мы все-таки увидим, как все эти фрагменты были собраны в одну программу? Или нам надо собрать самим, убедиться что ошибки нет (при правильной последовательности ее не будет) и опять затеять обсуждение на полсотни постов по методу "испорченный телефон"?
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) doif Abs(sred(i)-Total)<MinDev thenbegin
MinD:= Abs(sped(i)-Total);
Count:= 1endelseif Abs(sred(i)-Total)<1e-8then
Inc(Count)
WriteLn(Count,' студентов имеют минимальное отклонение от греднего балла группы');
end.
я знаю,что скорее всего тут миллион ошибок.помогите пожалуйста((
Госпади,что вы наворотили,ладно щас разберемся. Ну для начала, переименовывать то ,что было- было плохой идеей.Затем вы ооочень невнимательно пишите, ваш 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) doif Abs(sred(i)-Averege)<MinDev thenbegin
MinDev:= Abs(sred(i)-Averege);
Count:= 1;
endelseif Abs(sred(i)-Averege)<1e-8then
Inc(Count);
WriteLn(Count,' студентов имеют минимальное отклонение от греднего балла группы');
readln;
end;
begin
a[Ivanov,Russkii]:=4;
a[Petrov,Russkii]:=4;
a[Sidorov,Russkii]:=4;
MinDev(a);
end.
С точки зрения здравого смысла.Потому что минимальное отклонение число физически может быть только у одного человека,шанс того, что 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 оказалось почти равно среднему, но чуть меньше, попадает в случай "меньше", а не "равно", это тоже неверно, тоже надо исправить.
Помогите, пожалуйста!!! 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
Ты дезой не занимайся. Шанс, что у двоих будет одинаковый сдрений балл? Да как нафиг. Знаешь, что такое 1Е-8, и что означает запись abs(a-b)<1e-8? Это так сравнивают вещественные числа. Из-за погрешности вычислений (которым такие числа подвержены) их нельзя сравнивать в лоб, поэтому их сравнивают так.
Если тебе ленно вникнуть в то,что я написал,то это не моя вина,я и сказал,что это погрешность вычислений.Или,если правильней сказать, то область, которую мы считаем погрешностью. Real 11-12 значащих цифр, так что ничто нам не помешает сделать 1e-10,а если погрешность не важна, то и 1e-4.Никаких четких правил и инструкций, почему 1e-8 я не видел,возможно они и есть.Тогда просветите. Ошибки,приведенные тобой,тут каюсь,я доверился Lapp'у и не смотрел даже,просто привел программу в вид,который компилируется и считает.Форматирование я потерял,когда копировал с форума.