си, количество элементов в двумерном массиве, среднее арифметическое
Подскажите пожалуйста, мне необходимо вычислить среднее арифметическое 1 и 4 строк массива. Я нашел сумму этих строк и количество в каждой строке. Как найти количество в этих двух строках? и как найти среднее арифм. 1 и 4 строки? Заранее спасибо за помощь.
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
void intrM (int n, int i, int j, int a[][10])
{
if (i<n) if (j<n)
printf("(%i,%i)= ",i,j),scanf("%i",&a[i][j]),intrM(n,i,j+1,a);
else j=0, intrM(n,i+1,j,a);
}
void afisM (int n, int i, int j, int a[][10])
{
if (i<n)
if (j<n)
printf("%5i",a[i][j]),afisM(n,i,j+1,a);
else {puts(" ");afisM(n,i+1,0,a); }
}
int sumM (int n, int i, int j, int a[][10], int s)
{
if (j<n) {
if (i==0||i==3) s+=a[i][j]; sumM(n,i,j+1,a,s);}
else return s;
}
void sumT (int n, int i, int j, int a[][10])
{
int s=0;
if (i<n) {printf("\n%i= %i",i,sumM(n,i,j,a,s)); sumT(n,i+1,j,a);}
}
int kolvoM (int n, int i, int j, int a[][10], int k)
{
if (j<n) {
if (i==0||i==3) k++; kolvoM(n,i,j+1,a,k); }
else return k;
}
void kolvoT (int n, int i, int j, int a[][10])
{
int k=0;
if (i<n) {printf("\n%i = %i",i,kolvoM(n,i,j,a,k)); kolvoT(n,i+1,j,a);}
}
main()
{
int c[10][10];
float sredn;
intrM(4,0,0,c); afisM(4,0,0,c);
sumT(4,0,0,c);
puts("\n");
kolvoT(4,0,0,c);
puts("\n");
system("pause");
}
Ответы (1 шт):
Конкретно задача из Вашего вопроса решается так:
double getArithmeticMean(int** A, int rowNumber, size_t rowSize){
if(rowSize == 0) throw "RowSize < 1; Matrix A is empty!";
double tmp = 0.0;
for(size_t i = 0; i < rowSize; i++)
tmp += A[rowNumber][i];
return tmp / rowSize;
}
void readMatrix(int** A, size_t columnSize, size_t rowSize){
for(size_t i = 0; i < columnSize; i++){
for(size_t j = 0; j < rowSize; j++){
printf("(%i,%i)= ",i,j);
scanf("%i", &a[i][j]);
}
}
}
int main(){
int** A = new int*[10];
for(size_t i = 0; i < 10; i++)
A[i] = new int[10];
readMatrix(A, 10, 10);
double mean1 = getArithmeticMean(1, 1-1, 10);
double mean4 = getArithmeticMean(1, 4-1, 10);
double mean = (mean1 + mean4)/2.0;
printf("mean is &d", mean);
system("pause");
return 0;
}
Все остальные функции Вам нужны для чего-то другого.
А теперь хотелось бы немного позанудствовать на счет кода. Возьмем первую же Вашу функцию:
void intrM (int n, int i, int j, int a[][10])
{
if (i<n) if (j<n)
printf("(%i,%i)= ",i,j),scanf("%i",&a[i][j]),intrM(n,i,j+1,a);
else j=0, intrM(n,i+1,j,a);
}
Во-первых. Я знаком с C и C++ около 8 лет, хотя никогда не писал на них промышленного кода и специалистом считаться никак не могу, но общее представление имею. И я никогда раньше даже не слышал об использовании запятой для записи нескольких операций в одну строку. Да, это работает. Использующие это будут гореть в аду. Не делайте так, понять, что делает Ваш код из-за таких вещей ооочень сложно.
Во-вторых. Вызываете функцию? Ставьте пробелы! Выполняете сравнение? Ставьте пробелы! Пробелов на клавиатуре количество бесконечное. А глаза людей, читающих Ваш код однажды портятся. Не пытайте глаза других.
И третье. Имена функций должны быть говорящими. Вы должны прочесть название функции и сразу понять, что она делает. Даже если писали код год назад. intM - это что-то странное. askUserInputForMatrix - сразу же говорит о том, что будет сделано. Если имя функции меньше 8 символов, то Вы придумали плохое имя. Желательно, чтобы имя было 10-15 символов. Если хоть раз в жизни Вы вернетесь к своему коду - будете невероятно благодарны себе прошлому за длинные имена функций.
Пример того, как могла бы выглядеть Ваша же верхняя функция, если привести ее в нормальный вид:
void askUserInputForMatrix(int n, int i, int j, int a[][10]){
if (i < n) {
if (j < n){
printf("(%i, %i)= ", i, j);
scanf("%i", &a[i][j]);
askUserInputForMatrix(n, i, j+1, a);
} else {
j = 0;
askUserInputForMatrix(n, i+1, j, a);
}
}
}
Места занимает больше. Но никому не придется ломать голову над тем, что Вы написали.