Язык Си в примерах/Максимум: различия между версиями

Содержимое удалено Содержимое добавлено
Переписано.
Уточнения и дополнения; →‎Решение: разбит на подразделы.
Строка 3:
; {{Якорь2 |Дано}}: непустая последовательность разделенных ''пробельными символами'' [[w:Целое число |целых чисел]] (в «текстовом» представлении) на [[w:Стандартные потоки#Стандартный ввод |стандартном вводе]] программы. Последовательность конечна, но ее длина заранее неизвестна.
; Найти: предельные значения последовательности (минимум, максимум) и основные статистики (среднее, среднеквадратичное отклонение.)
; Указания: воспользуйтесь циклом «пока» (<code >while</code>) для чтения последовательности и функциями <code >pow</code>, <code >sqrt</code> для вычисления среднеквадратичного отклонения.
 
== Решение ==
Строка 16 ⟶ 17 :
{
int n = 1, cur, min, max;
double sum = 0, sum_sq = 0;
 
int r
Строка 46 ⟶ 47 :
}
</source>
 
<!-- FIXME: добавить проверочный набор. -->
 
=== Вычисление и вывод результатов ===
 
Разбор программы вновь начнем с ее завершения — вызова функции <code >printf</code><ref name="fprintf" /> для вывода результатов ее работы. В данном случае, мы выводим значения переменных <var >min</var>, <var >max</var>, <var >n</var> (обновляемых после успешного чтения каждого очередного элемента числовой последовательности.) Среднее значение считаем как отношение ''суммы'' всех элементов (<var >sum</var>) к их ''количеству'' (<var >n</var>).
 
{{Якорь |pow}}
{{Якорь |sqrt}}
''Среднеквадратичное отклонение'' вычислено как корень из [[w:Дисперсия |дисперсии]], которая, в свою очередь, вычислена по правилу «среднее квадратов минус квадрат среднего» — <source lang="c" enclose="none" >sum_sq / n - pow (sum / n, 2)</source> — тривиально следующему из ее определения. Значение используемой нами здесь функции <code >pow</code> — первый аргумент, возведенный в степень, заданную вторым аргументом; значение <code >sqrt</code> — квадратный корень единственного аргумента. Эти функции является частью ''стандартной библиотеки'' и ''объявлены'' в ''заголовке'' <code >math.h</code>.<ref name="pow" /><ref name="sqrt" />
 
=== Чтение и предобработка ===
 
Чтение последовательности выполнено в два этапа. Вначале, считанный первым элемент используется для инициализации ''предельных значений'' (<var >min</var>, <var >max</var>) и ''сумм'' (<var >sum</var>, <var >sum_sq</var>).
Строка 58 ⟶ 67 :
# кроме того, успешное чтение элемента приводит к ''инкременту'' (увеличению на 1) хранящей количество считанных элементов переменной <var >n</var>.
 
Каждый вызов <source lang="c" enclose="none" >scanf ("%d", &cur)</source> считывает целое десятичное число в десятичной записи (<code >%d</code>) в переменную <code >cur</code>. <em >Предшествующие</em> числу ''пробельные символы'' (пробел, табуляция, [[w:Перевод строки |перевод строки]]) при этом игнорируются, а значит могут быть использованы — в любых сочетаниях — для ''разделения'' элементов последовательности.
 
После завершения чтения последовательности, мы ''требуем'' (используя [[../Учимся складывать#assert |уже известную]] нам макроподстановку <code >assert</code><ref name="assert" />) равенства последнего возвращенного функцией <code >scanf</code> значения константе (макроопределению) <code >EOF</code> — что соответствует достижению ''конца файла'' для нашего входного потока (''стандартного ввода''.) Иными словами, мы требует, чтобы чтение последовательности <em >не должно бытьбыло прервано</em> наличием во входном потоке каких-либо «нечисловых» данных.
 
=== Цикл «пока» ===
 
{{Якорь |while}}
Строка 72 ⟶ 85 :
: ''пока'' удается считать очередное значение?
:: обновляй переменные <var >min</var>, <var >max</var>, <var >n</var>, <var >sum</var>, <var >sum_sq</var>.
 
После завершения чтения последовательности, мы ''требуем'' (используя [[../Учимся складывать#assert |уже известную]] нам макроподстановку <code >assert</code><ref name="assert" />) равенства последнего возвращенного функцией <code >scanf</code> значения константе (макроопределению) <code >EOF</code> — что соответствует достижению ''конца файла'' для ''стандартного ввода''. Иными словами, чтение последовательности не должно быть прервано наличием во входном потоке «нечисловых» данных.
 
== Задания ==
 
# Измените [[#intstats.c |программу]] для вычисления предельных значений и статистик последовательности [[w:Число с плавающей запятой |чисел с плавающей запятой.]]
# В [[#Дано |В условии задачи]] мы потребовали наличия в последовательности хотя бы одного элемента. Определите, какие сложности возникнут при попытке обобщить данную программу на случай ''пустой'' последовательности?
# Дополните программу выводом «промежуточных» значений — суммы элементов последовательности и суммы их квадратов.
# Реализуйте также вычисление и вывод [[w:Моменты случайной величины |моментов случайной величины]] вплоть до четвертого и, на их основе, — [[w:Коэффициент асимметрии |коэффициента асимметрии]] и [[w:Коэффициент эксцесса |коэффициента эксцесса]].