Моя задача - найти все возможные режимы для набора чисел (от 0 до 100).
Нам сказали делать это с помощью массивов, а также подсчитывать частоту появления каждого числа.
Я закодировал этот режим, однако моя программа не работает, если есть несколько режимов (пример: 1, 2, 7, 7, 9, 10, 7, 2, 2. В этой позиции, 2 и 7 являются режимом, и моя программа должна распечатать их оба, но моя нет » т).
Я думаю, мне, возможно, придется создать еще один набор массивов, но я не уверен? Любой совет будет принят во внимание.
Вот что у меня есть:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
int main() {
int x, i, c[101], mode;
printf("please enter test scores between 0 and 100\n");
i = 0;
mode = 0;
while (i <= 100) { //setting all values to 0
c[i] = 0;
i = i + 1;
}
scanf("%d", &x); // scanning in the test scores
while ((x >= 0) && (x <= 100)) { // counting how often each score appears
c[x] = c[x] + 1;
if (c[x] >= mode) {
mode = x;
}
scanf("%d", &x);
}
printf("THE MODE(S) ARE %d\n", mode);
i = 0;
while (i <= 100) { //printing all values so long as they've occurred at least once
if (c[i] > 0) {
printf("%d occurs %d times\n", i, c[i]);
}
i = i + 1;
}
}
У вас есть модальное значение mode, и у вас есть цикл для печати всех значений, поэтому вы можете комбинировать их, печатая только значения со счетчиком, равным режиму. (c[i] == c[mode]). О, и, пожалуйста, используйте более длинное имя переменной, чем просто c. И еще один момент - является ли mode модальным значением или индексом в c модального значения? Он используется как ...
вы сканируете только ОДИН результат теста.
У меня очень тяжелые времена, чтобы понять вопрос
Я не понимаю, что такое "режим". На основе вашего кода mode - это значение максимум ячеек гистограммы. Но ваш printf подразумевает, что это счетчик (например, MODE(S)). Если бы это было количество ненулевых ячеек гистограммы больше единицы (т.е. c), то замените ваш if на if (c[x] == 2) mode++; ???





Вы должны посчитать самую высокую частоту любого числа, и если эта частота равна частоте любого другого числа, то это число также будет режимом. Итак, изменения, которые вам нужно сделать, это:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
int main ()
{
int x, i, c[101], mode;
printf("please enter test scores between 0 and 100\n");
i = 0;
mode = 0;
while (i <= 100) //setting all values to 0
{
c[i] = 0;
++i;
}
scanf("%d", &x); // scanning in the test scores
while ((x >= 0) && (x <= 100)) // counting how often each score appears
{
c[x] = c[x] + 1;
if (c[x] >= mode)
{mode = c[x];}
scanf("%d", &x);
}
for(i=0;i<=100;i++){//printing all values having highest frequency
if (c[i]==mode)
{
printf("THE MODE(S) ARE %d\n", i);
}
i = 0;
while (i<=100) //printing all values so long as they've occurred at least once
{
if (c[i] > 0)
{
printf("%d occurs %d times\n", i, c[i]);
}
++i;
}
}
Вместо определения режима в основном цикле ввода вы должны определить максимальное количество. Затем вы можете распечатать все значения с этим количеством вхождений в последнем цикле.
Вам также следует проверить возвращаемые значения scanf().
Я бы также посоветовал использовать инициализатор для массива, чтобы избежать цикла, и использовать циклы for, которые более четко определяют инициализацию, тестирование и приращение индекса цикла.
Вот исправленная версия вашего кода:
#include <stdio.h>
int main() {
int x, i, c[101] = { 0 }, max_repeat;
printf("please enter test scores between 0 and 100\n");
max_repeat = 0;
// read the test scores and compute the maximum repeat count
while (scanf("%d", &x) == 1 && x >= 0 && x <= 100) {
c[x] += 1;
if (max_repeat < c[x]) {
max_repeat = c[x];
}
}
printf("The mode(s) are");
for (i = 0; i <= 100; i++) {
if (c[i] == max_repeat) {
printf(" %d", i);
}
}
printf("\n");
return 0;
}
Не предполагаю, что нужно отвечать на домашнее задание, некоторые общие структуры данных могут помочь вам в вашем пути. Возможно, исследуйте стек, подумайте о состоянии, когда найдете новый режим.