Во время решения следующей задачи будут задействованы массивы, циклы, условные операторы, генератор случайных чисел и математические функции.
Задача
- Сформировать для ученика список состоящий из n элементов, каждый элемент которого — это оценка от 2 до 5.
Подсчитать среднее арифметическое и в соответствии с этим дать определение ученику: отличник, хорошист, троечник, двоечник. - Подсчитать количество каждой полученной оценки.
Решение
Для решения первой части задачи требуется сгенерировать массив с оценками, при этом для формирования каждой оценки потребуется генератор случайных чисел.
Необходимо определить количество оценок, которое получал ученик, минимальный и максимальный баллы и пустой массив, который будет содержать оценки ученика, а также переменную, которая будет содержать средний балл и переменную, содержащую определение ученику:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | // кол-во полученных учеником оценок var n = 20; // определение массива, содержащего оценки ученика var scores = []; // минимальная оценка, которую может получить ученик var min = 2; // максимальная оценка, которую может получить ученик var max = 5; // средняя арифметическая оценка ученика var sum = 0; // определение переменной содержащей определение ученика var who = ''; |
Теперь необходимо провести цикл в котором будет случайным образом генерироваться оценка и помещаться в массив, цикл должен повториться n раз, чтобы набралось определенное ранее количество оценок в массиве:
1 2 3 4 5 6 7 8 9 | // цикл формирования списка оценок for ( var i = 0; i < n; i++ ) { // формирование оценки путем выбора случайного числа от min до max и помещение этой оценки в список всех оценок scores[ i ] = Math.floor( Math.random() * (max - min + 1) ) + min; // подсчет суммы всех оценок sum += scores[ i ]; } |
Также в цикле считается среднее арифметическое между всеми оценками:
1 | sum += scores[ i ]; |
К текущей сумме баллов прибавляется текущий балл, который был добавлен строкой выше и который является i-ым элементом массива, поэтому к нему можно обращаться указав его порядковый номер, что мы и делаем.
После окончания цикла необходимо полученную сумму в переменной sum
разделить на количество оценок в сформированном массиве. Можно было бы узнать размер массива с помощью .length
, но так как мы сами задавали размер в переменной n
достаточно будет просто разделить на n
, а за тем округлить результат.
1 | sum = Math.round( sum / n ); |
После всего проделанного осталось дать определение ученику:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | switch ( sum ) { case 5: who = 'отличник'; break; case 4: who = 'хорошист'; break; case 3: who = 'троечник'; break; case 2: who = 'двоечник'; break; default: who = 'не ясно кто'; } |
…и вывести результат:
1 2 3 4 | // вывод информации в консоль console.log( 'Оценки: ' + scores ); console.log( 'Средняя оценка - ' + sum ); console.log( 'Ученик - ' + who ); |
Вторая часть задачи
Для выполнения второй части задания до цикла необходимо определить переменную, которая будет содержать в себе количества каждой из оценок. Так как оценок несколько, то переменная, хранящая информацию о количестве каждой оценки, должна быть массивом. Мы условимся, что нулевой элемент будет содержать количество двоек, полученных учеником, первый — количество троек и так далее. В начальный момент мы еще не сформировали список оценок ученика, поэтому количество каждой из оценок равно нулю:
1 | var most = [ 0, 0, 0, 0 ]; |
Внутри цикла необходимо добавить подсчет количества оценок. Это можно сделать с помощью условного оператора switch:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | switch ( scores[ i ] ) { case 5: most[ 3 ]++; break; case 4: most[ 2 ]++; break; case 3: most[ 1 ]++; break; case 2: most[ 0 ]++; break; } |
Но данный подход не рационален, так как если максимальный балл увеличится с пятерки, скажем до 100, придется писать слишком много условий, поэтому мы запишем гораздо проще:
1 2 | // увеличение кол-ва конкретных оценок, так как порядковый номер для оценок соответствует формуле score - min most[ scores[ i ] - min ]++; |
В данном случае мы вычисляем индекс элемента, который надо увеличить на единицу: scores[ i ] - min
scores[ i ]
— это только что сгенерированная оценка, например 5, а min
— это минимальная оценка, равная 2. Если вычесть из пяти два, получится три, 3 — это порядковый номер элемента в массиве most
, который хранит количество пятерок и именно его значение мы увеличиваем на единицу.
После всего этого необходимо вывести информацию о количестве полученных оценок:
1 2 3 4 5 6 7 8 9 10 11 12 | // определение счетчика равного максимально возможной оценке i = max; // перебор оценкок, которые, по значению, больше min while ( i >= min ) { // вывод кол-ва каждой оценки console.log( 'Кол-во ' + i + '-к: ' + most[ i - 2 ] ); // декремент счетчика i--; } |