c - 矩阵中的算术平均值
问题描述
您好,我的代码有问题。我需要再计算 2 个选项:
- 主对角线下的算术平均值
- 第二条对角线的算术平均值
我写了下面的代码,但我不知道如何计算这两个选项。任何帮助都会很高兴看到。谢谢!
double arithmetic(int *arr, int n);
int main() {
int n, sum = 0, **A, *arr, l;
printf("Enter size of matrix: ");
scanf("%d", &n);
A = (int **)malloc(sizeof(int *) * n);
arr = (int *)malloc(sizeof(int *) * n);
if (!A)
printf("Error");
for (int i = 0; i < n; i++) {
A[i] = (int *)malloc(sizeof(int) * n);
if (!A[i])
printf("Error");
}
printf("Give numbers by lines:\n");
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
scanf("%d", &A[i][j]);
}
}
printf("Give the line and column to count: ");
scanf("%d", &l);
for (int i = 0; i < n; i++) {
arr[i] = A[l][i];
}
printf("Arithmetic average in line %d, is %.2f\n", l, arithmetic(arr, n));
for (int i = 0; i < n; i++) {
arr[i] = A[i][l];
}
printf("Arithmetic average in column %d, is %.2f\n", l, arithmetic(arr, n));
for (int i = 0; i < n; i++) {
arr[i] = A[i][i];
}
printf("Arithmetic average on main diagonal, is %.2f\n", arithmetic(arr, n));
}
double arithmetic(int *arr, int n) {
double sum = 0;
for (int i = 0; i < n; i++) {
if (arr[i] > 0)
sum = sum + arr[i];
}
double result = sum / n;
return result;
}
解决方案
代码中有一些问题:
的分配大小
arr
不正确:应该arr = (int *)malloc(sizeof(int) * n);
注意,这个中间数组不是必需的。您应该在分配错误时退出程序。
为什么只计算正数?
这是修改后的版本:
#include <stdio.h>
#include <stdlib.h>
int main() {
double sum;
int n, sum = 0, l;
int **A;
printf("Enter matrix size: ");
if (scanf("%d", &n) != 1)
return 1;
A = calloc(sizeof(*A), n);
if (!A) {
fprintf(stderr, "Allocation error\n");
return 1;
}
for (int i = 0; i < n; i++) {
A[i] = calloc(sizeof(int), n);
if (!A[i]) {
fprintf(stderr, "Allocation error\n");
return 1;
}
}
printf("Give numbers by lines:\n");
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
scanf("%d", &A[i][j]);
}
}
printf("Give the line and column to count: ");
scanf("%d", &l);
sum = 0;
for (int i = 0; i < n; i++) {
sum += A[l][i];
}
printf("Arithmetic average in line %d, is %.2f\n", l, sum / n);
sum = 0;
for (int i = 0; i < n; i++) {
sum += A[i][l];
}
printf("Arithmetic average in column %d, is %.2f\n", l, sum / n);
sum = 0;
for (int i = 0; i < n; i++) {
sum += A[i][i];
}
printf("Arithmetic average on main diagonal, is %.2f\n", sum / n);
sum = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < i; j++) {
sum += A[i][j];
}
}
printf("Arithmetic average under main diagonal, is %.2f\n",
sum / (n * (n - 1) / 2));
sum = 0;
for (int i = 0; i < n; i++) {
sum += A[i][n - i - 1];
}
printf("Arithmetic average on second diagonal, is %.2f\n", sum / n);
return 0;
}
推荐阅读
- javascript - Onclick 多个开关按钮不起作用
- c# - 使“下一步”按钮更改数组中的标签
- c++ - 如何在 C++ 初始化程序列表中将 const 引用成员初始化为另一个成员(标准向量)
- c++ - 在 for 循环中将向量推入另一个向量时出现分段错误
- c - 这个 TFLite 输出对应的 C 对象的形状是什么?
- php - PHP FTP 目录列表失败并显示“ftp_nlist(): php_connect_nonb() failed: Operation now in progress (115)”,但在 FTP 客户端中有效
- java - JOOQ - 递归查询
- amazon-web-services - Amazon AWS RDS 预置存储成本
- python - 如何设置目录的路径?
- c++ - 如何在 Linux 的控制台应用程序中播放声音文件?C++