-1

我的应用程序应该采用双数组,找到偶数列元素的平均值,找到最大值,将平均值与 max / 2 进行比较,如果平均值 > max / 2 则将矩阵旋转 90 度。

这是代码:

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>

int M = 4, N = 4;

int ** rotateArr(int arr[4][4]) {
    int D[4][4];
    int i, n;
    for(i=0; i <= 4; i++ ){
        for(n =0; n <= 4; n++){
            D[i][n] = arr[n][M - i + 1];
        }
    }
    return D;
}
int getAvg(int arr[4][4]) {
    int sum = 0, num = 0;
    int i, n;
    for(i=0; i <= 4; i += 2){
        for(n=0; n <= 4; n++){
            sum += arr[i][n];
            num += 1;
        }
    }
    return sum/num;
}

int ** getMax(int arr[4][4]) {
    int maxa = arr[0][0];
    int i, n;
    for(i=0; i <= 4; i++){
        for(n=0;  n <= 4; n++){
            if (maxa < arr[i][n]){
                maxa = arr[i][n];
            }
        }
    }
    return maxa;
}

int main()
{

    int S[4][4] = { { 1, 4, 10, 3 }, { 0, 6, 3, 8 }, { 7, 10 ,8, 5 },  { 9, 5, 11, 2}  };
    int maxa = 0;
    float avg = 0;

    avg = getAvg(S);
    maxa = getMax(S);
    int i , n;
    if (avg > maxa/2){
        S[4][4] = rotateArr(S);
        for(i=0; i <= 4; i+=2){
            for(n=0 ; n <= 4; n++){
                    printf("%d", S[i][n]);
            }
            printf("\n");
        }
    }

    getch();

    return 0;
}

该应用程序不输出任何内容,只是在按键时结束

进程以状态 0 终止(0 分 2 秒)

4

2 回答 2

2

你的代码有很多问题。例如:

  • 你所有的循环都是形式for(i=0; i <= 4; i++ )The condition should be changed to i < 4because the valid array indices are 0 to 3.
  • rotateArr函数返回一个指向局部变量的指针。你不能这样做。一种解决方案是将输出数组作为参数接收并写入其中:

    void rotateArr(int arr[4][4], int output[4][4]) {
         ....
         output[i][j] = ...;
    }
    
  • int**不一样int[4][4]
  • S[4][4] = ...尝试分配给无效元素。看起来您正在尝试分配给S自己,这是无法完成的(您需要分配每个元素,或memcpy从另一个数组):

    int anArray[4][4];
    int anotherArray[4][4];
    memcpy(anArray, anotherArray, sizeof(anArray));
    
  • 在表达式arr[n][M - i + 1]中,第二个索引可能超出范围。考虑当 时会发生什么i==0

我建议您注意编译器警告,因为它们会捕获其中一些问题(在 GCC 编译器上使用该-Wall选项)。另外,学习使用调试器。

于 2013-11-11T15:07:06.430 回答
1

分析你的程序,你会发现;

  1. 您正在返回D(返回类型为int (*)[4].的类型,与 .类似的问题。 rotateArrint **getMax

  2. 因为n =4数组arr[i][n]会越界!

  3. sum/num实际上不是计算平均值(分子和分母都是int,你总是会得到一个int值(可能0也是)。
    还有更多......

于 2013-11-11T15:12:35.233 回答