1

Тема: Проблеми з кодом

(Завдання для створення функції з одним або двома результатами)
Розмір  масиву:4x5
Тип   даних: цілий
Обчислити середнє арифметичне мінімального  та максимального елементів матриці.

#include "pch.h"
#include <iostream>
#include <time.h>
int Foo(int Arr[4][5])
{ 
    int min = Arr[0][0];
    int max = Arr[0][0];
    for (int i = 0; i < 4; i++)
    {
        
        for (int j = 0; j < 3; j++)
        {
            if (Arr[i][j] < min)
                min = Arr[i][j];
            if (Arr[i][j] > max)
                max = Arr[i][j];
        }
    }
    return (min + max) / 2;
}
int main()
{
    srand(time(NULL));
    int Arr[4][5]; 
    for (int i = 0;i < 4;i++)
    {
        for (int j = 0;j < 5;j++)
        {
            Arr[i][j] = rand() % 50 - i;
            printf("%5d\t", Arr[i][j]);
        }
    printf("\n");
    }
    printf("Average:%i",Foo(Arr));
    return 0;
}

Результат:
     2      44      27      44      18
   24      37      45      10      10
   27      14      15      29      42
   44       7       31      22       4
Average:23

Як мені зробити так, щоб результат був дробовим? Я перепробув різні перестановки типів і вводив змінну типу float в якій зберігав значення середнього арифметичного, але жодго разу в мене не вийшло отримати число з цифрою відмінною від нуля після коми.
І ще тут результат вийшов адеватний (2+45)/2=23,5 але буває ось таке:
   11      13      26      20      38
   35      10      19      44      16
    3       28      24      35      32
   37      13      -2       45       9
Average:17

(-2+45)/2=17????? це як так виходить? Де я зробив помилки?

Подякували: koala, leofun012

2

Re: Проблеми з кодом

О, давно не бачив добре оформленого питання. На таке і відповідати приємно. Отже:
1. Тип int - ціле число. А вам потрібне float. Оскільки середнє значення обчислюється в функції, то ця функція має повертати float,  а виводити слід "%f".

float Foo(...
printf("%f",Foo(...)

2. Якщо поділити ціле на ціле, то результат в C буде теж цілим. Це постійна проблема для новачків. Щоб отримати число з рухомою комою, треба, щоб хоча б один з операндів був з рухомою комою (а краще - обидва).

return (min + max) / 2.0;

3. Назва функції не відповідає її дії, а це погано. Краще назвати її average чи навіть extremum_average.
4. У вас розмір масиву 4 на 5, а цикл в одному місці не до 5, а до 3. Щоб уникнути подібних помилок, краще всюди посилатися на ідентифікатори - наприклад, через #define

#define M 4
#define N 5
...
int arr[M][N]
...
for(int i=0;i<M;i++)
...

І взагалі слід уникати конкретних чисел в основному коді, крім зовсім необхідних (на кшталт 0-го елементу масиву). Зазвичай подібне зветься "магічними числами".

Подякували: grinyuk309, leofun012

3

Re: Проблеми з кодом

koala написав:

О, давно не бачив добре оформленого питання. На таке і відповідати приємно. Отже:
1. Тип int - ціле число. А вам потрібне float. Оскільки середнє значення обчислюється в функції, то ця функція має повертати float,  а виводити слід "%f".

float Foo(...
printf("%f",Foo(...)

2. Якщо поділити ціле на ціле, то результат в C буде теж цілим. Це постійна проблема для новачків. Щоб отримати число з рухомою комою, треба, щоб хоча б один з операндів був з рухомою комою (а краще - обидва).

return (min + max) / 2.0;

3. Назва функції не відповідає її дії, а це погано. Краще назвати її average чи навіть extremum_average.
4. У вас розмір масиву 4 на 5, а цикл в одному місці не до 5, а до 3. Щоб уникнути подібних помилок, краще всюди посилатися на ідентифікатори - наприклад, через #define

#define M 4
#define N 5
...
int arr[M][N]
...
for(int i=0;i<M;i++)
...

І взагалі слід уникати конкретних чисел в основному коді, крім зовсім необхідних (на кшталт 0-го елементу масиву). Зазвичай подібне зветься "магічними числами".

Все прекрасно працює, дякую

#include "pch.h"
#include <iostream>
#include <time.h>
#define M 4
#define N 5
float extremum_average(int Arr[M][N])
{ 
    int min = Arr[0][0];
    int max = Arr[0][0];
    for (int i = 0; i < 4; i++)
    {
        
        for (int j = 0; j < 5; j++)
        {
            if (Arr[i][j] < min)
                min = Arr[i][j];
            if (Arr[i][j] > max)
                max = Arr[i][j];
        }
    }
    return (min + max) / 2.0;
}
int main()
{
    srand(time(NULL));
    int Arr[M][N];
    for (int i = 0;i < M;i++)
    {
        for (int j = 0;j < N;j++) 
        {
            Arr[i][j] = rand() % 50 - i;
            printf("%5d\t", Arr[i][j]);
        }
    printf("\n");
    }
    printf("Average:%5.1f", extremum_average(Arr));
    return 0;
}

4

Re: Проблеми з кодом

grinyuk309 написав:
    for (int i = 0; i < 4; i++)
    {
        for (int j = 0; j < 5; j++)

Магічні числа забули.

Подякували: ping, grinyuk3092

5

Re: Проблеми з кодом

koala написав:
grinyuk309 написав:
    for (int i = 0; i < 4; i++)
    {
        for (int j = 0; j < 5; j++)

Магічні числа забули.

:D