Задача: Вычислить среднее значение [latex]x[/latex] и дисперсию [latex]d_{x}[/latex] для заданного массива [latex]X(k)[/latex] наблюдений:
[latex]x_{avg}=\frac{1}{k}\sum_{i=1}^{k}{x_{i}}[/latex]; [latex]d_{x}=\frac{1}{k-1}\sum_{i=1}^{k}{\left(x_{i}-x_{avg^{}} \right)^{2}}[/latex]Тесты:
k | x | среднее | дисперсия |
3 | 4, 5, 8 | 5,66666666666667 | 4,333333 |
5 | 2, 3, 6, 13, 22 | 9,2 | 69,7 |
6 | 0, 5, 23, 7, 11, 1 | 7,83333333333333 | 71,366667 |
2 | — | — | error: incomplete input x |
0 | — | — | error: wrong value k |
— | — | — | error: incomplete input k |
1 | 5 | 5 | error: wrong value k |
Код программы:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
#include <stdio.h> #define ARRAY_SIZE_MAX 1024 int main(void) { // рабочие переменные double avg = 0; double disp = 0; int i; int k; double x[ARRAY_SIZE_MAX]; // проверка ввода числа итераций if( scanf("%d", &k ) < 1 ) { printf("error: incomplete input of k\n"); return 0; } if( k <= 1 || k > ARRAY_SIZE_MAX ) { printf("error: wrong value of k\n"); return 0; } // вычисление среднего значения for( i = 0; i < k; i++ ) { if( scanf("%lf", &x[i] ) < 1 ) { printf("error: incomplete input of x\n"); return 0; } avg += x[i]; } avg /= k; // вычисление дисперсии for( i = 0; i < k; i++ ) { disp += ( x[i] - avg ) * ( x[i] - avg ); } disp /= ( k - 1 ); // вывод результата printf("%lf\n", avg); printf("%lf", disp); return 0; } |
Код на языке Java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
import java.util.*; import java.lang.*; import java.io.*; class MidApp { //private static final int ARRAY_SIZE_MAX = 1024; public static Integer scanInteger( Scanner in ) { return ( ( in.hasNextInt() ) ? in.nextInt() : null ); } public static Double scanDouble( Scanner in ) { return ( ( in.hasNextDouble() ) ? in.nextDouble() : null ); } public static void main( String[] args ) { // рабочие переменные double avg = 0; double disp = 0; int k = 0; int n = 0; Scanner in = new Scanner(System.in); n = scanInteger( in ); if( n <= 0 ) { System.out.printf("error: wrong value of n\n"); return; } double[] x = new double[ n ]; k = n; // вычисление среднего значения for( int i = 0; i < k; i++ ) { x[i] = scanDouble( in ); if( x[i] < 1 ) { System.out.printf("error: incomplete input of x\n"); return; } avg += x[i]; } avg /= k; in.close(); // вычисление дисперсии for( int i = 0; i < k; i++ ) { disp += ( x[i] - avg ) * ( x[i] - avg ); } disp /= ( k - 1 ); // вывод результата System.out.printf("%f\n", avg); System.out.printf("%f", disp); } } |
Ссылка: https://ideone.com/648LHr
План программы:
- Назначение рабочих переменных
- Проверка ввода числа итераций
- Вычисление среднего значения
- Вычисление дисперсии
- Вывод результата
Программа высчитывает среднее значение и дисперсию для заданного массива действительных чисел. Она состоит из двух циклов — в первом вычисляется среднее значение, а во втором цикле вычисляется дисперсия используя результаты предыдущего цикла — заполненный массив и среднее значение.
Ссылка на ideone.com: http://ideone.com/t9ALrA
Почему-то у Вас в тестах только среднее арифметическое показано. Дисперсию тоже стоило бы продемонстрировать.
И, раз Вы подробно разбираете варианты неверного ввода данных, то обращу Ваше внимание на случай k = 1. Дисперсия по Вашей формулене определена.
Спасибо, исправил.
Добавлю: В формуле дисперсии, почему-то указано 1 делить на 1-k, а не на k-1 ( в программе верно).
Исправил.
Зачтено