Почему у меня логическая ошибка с домашним заданием?

Я младший студент в области информационных технологий. Я столкнулся с проблемой с выводом программы. Идея программы заключается в том, что я должен использовать функции для чтения массива из 10 элементов, затем получить среднее значение элементов, а затем получить максимальное и минимальное значения. Я правильно понял максимум и минимум, но среднее показывает странные вещи. Пожалуйста, проверьте код и скажите мне, что мне делать или как-то помогать.

Выходной результат (обратите внимание, что запрашивает 11 номеров вместо 10, и если я изменю параметры цикла, чтобы он занимал только 10, то это показывает странные вещи

enter the group of integers numbers
1
2
3
4
5
6
7
8
9
0
9
 1 2 3 4 5 6 7 8 9 0the avg is 3.500000
9
1Press any key to continue . . .

// func-sortarray.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#define size  10

void readarray(int []);
void average(int []);
void printArray(int []);
void max(int []);
void min(int []);

int _tmain(int argc, _TCHAR* argv[])
{
    int sarray[size];
    readarray(sarray);
    printArray(sarray);
    average(sarray);
    max(sarray);
    min(sarray);
    return 0;
}

void readarray(int a[])
{
    printf("enter the group of integers numbers\n");
    for (int i=0; i<=size-1 ;i++)
        scanf("%d\n",&a[i]);
}

void average(int a[])
{
    int i;
    double avg;
    double total = 0;
    for (i=0; i <= size-1; i++)
    {
        total = total + a[i];
    }

    avg = total /size-1;
    printf("the avg is %f\n",avg);
}

void printArray(int a[])
{
    int j;
    for (j = 0; j <= size - 1; j++) 
        printf( "%2d", a[ j ]);
}

void max(int a[])
{
    int ma =a[0];

    for (int j=0;j<size-1;j++)
    {
        if (ma<a[j])
            ma=a[j];
    }
    printf("%d",ma);
}

void min(int a[])
{
    int mi =a[0];

    for (int j=0;j<size-1;j++)
    {
        if (mi>a[j])
            mi=a[j];
    }
    printf("\n%d",mi);
}

спасибо заранее

3 ответа

Решение

Он пропускает первый входной номер из-за '\n' в строке scanf(). Чтобы исправить это, удалите '\n' из строки scanf, например так:

scanf("%d", &a[i]);

У вас есть некоторые проблемы с подсчетом, начиная с нуля и умножения перед правилами сложения. Ну, давай на первом. Чаще всего, когда вы начинаете считать с нуля, вы делаете это так:

for(i=0; i < count; i++)
    /* ... */;

Если вы начинаете считать с 1, вы делаете это так:

for(i=1; i <= count; i++)
    /* ... */

Если вы смешаете их, вы получите тот же результат, но это может сбить вас с толку и других, читающих код:

for(i=0; i <= count-1; i++) /* same, but better don't do this */
    /* ... */;

В коде, вычисляющем среднее значение, у вас было две ошибки. Во-первых, вы должны использовать скобки из-за математики:

avg = total / (size-1); /* there is still one bug */

И во-вторых, у вас есть size элементы. Таким образом, вы должны разделить на size и не size-1:

avg = total / size; /* right ! */

Эта строка, вероятно, проблема:

avg = total /size-1;

Вы, вероятно, хотите вместо этого:

avg = total / size;

Кроме того, ваш max() а также min() у функций есть такой цикл:

for (int j=0;j<size-1;j++)

Это, вероятно, проверка на меньшее число, чем вы намереваетесь.

Вышеуказанные виды ошибок обычно называют "ошибками столба". Название относится к следующему вопросу: Если вы хотите построить забор длиной 100 м, и вы хотите, чтобы через каждые 1 м был забор, сколько вам нужно заборов? Ответ не 100, а 101. Другое название для этого типа ошибки - "ошибка одной ошибки".

Другие вопросы по тегам