程序改错——计算学生的总分和平均分

极为隐蔽的错误:1.把二维数组的地址传给pScore指针时,不能用二维指针(没有定义)下标的方式来表示地址,而应该用列指针的方式i*n+j来计算地址。For example,不能用pScore[i][j]来表示score[i][j]的,而是应该用pScore[i*n+j](传给的是score的首地址)。

2.如果直接在main函数里给二维数组赋值,会出现错误的原因:因为二维数组score的列为5,而输入的n是小于5的。所以在输入的数据是保存在列为5的二维数组score中,当后面用指针*pScore指向二维数组score的时候,输入的地址pScore[i*n+j]表示在二维数组score里的顺序(还是5列)来的,for example:pScore[2*3+2]表示的是score[1*5+3],所以如果直接在main函数里给二维数组赋值的话,只需要把pScore[i*n+j]改成pScore[i*5+j]。所以还是建议用指针来给二维数组赋值。

我直接将用指针来给二维数组score赋值的代码是/*注释*/;

没有/*注释*/的是直接在main函数里给二维数组赋值的代码。

这也是我debug了许久才发现的错误原因,太累了(-'v'-)

#include <stdio.h>
#define STUD 30
#define COURSE 5
/*void Input(int *score,int m,int n);*/
void Total(int *pScore,int sum[], float aver[], int m, int n);
void Print(int *pScore,int sum[], float aver[], int m, int n);
int main(void)
{
    int i,j,m,n,score[STUD][COURSE],sum[STUD];
    float aver[STUD];
    printf("Enter the total number of students and courses:\n");
    scanf("%d%d",&m,&n);
    printf("Enter score:\n");
   /* Input(*score,m,n);*/
    for (i = 0; i < m; i++)
        for (j = 0; j < n; j++)
         scanf("%d", &score[i][j]);
    Total(*score,sum,aver,m,n);
    Print(*score,sum,aver,m,n);
    return 0;
}
/*void Input(int *pscore,int m,int n)
{
    int i,j;
    for (i=0;i<m;i++)
        for (j=0;j<n;j++)
            scanf("%d",&pscore[i*n+j]);
}*/
void Total(int *pscore,int sum[],float aver[],int m,int n)
{
    int i,j;
    for (i=0;i<m;i++)
    {
        sum[i]=0;
        for (j=0;j<n;j++)
            {
                sum[i]+=pscore[i*5+j];
                printf("sum:%5d\n",sum[i]);
            }
        aver[i]=(float)sum[i]/n;
        printf("aver:%6.1f\n",aver[i]);
    }
}
void Print(int *pscore,int sum[],float aver[],int m,int n)
{
    int i,j;
    for(i=0;i<m;i++)
    {
        for (j=0;j<n;j++)
            printf("%4d\t",pscore[i*5+j]);
        printf("%5d\t%6.1f\n",sum[i],aver[i]);
    }

}
 

上一篇:Java-Work11-图形界面设计1(2)


下一篇:C++STL标准库学习笔记(六)multimap