学生成绩表c语言,在C语言中利用动态结构数组处理学生成绩表

摘要:基于C语言中只能定义定长数组,容易造成大量内存资源浪费,影响实际使用的情况。对C语言中的变长数组的定义和使用进行了探索和分析,在此基础上提出了用指针来处理预先不能确定数组大小的可行性,进一步提出了建立动态结构数组来解决学生成绩统计的方法,通过实际编程,解决了这一问题。

关键词:动态数组;结构数组;成绩统计;指针

中图分类号:TP312文献标识码:A文章编号:16727800(2012)008004503

作者简介:杨雪松(1976-),男,硕士,云南昭通师范高等专科学校计算机科学系教师,研究方向为计算机信息安全、小型MIS及检索。

0引言

C语言拥有简单的数据类型即整型、浮点型和字符型,并且有简洁的格式转换形式,可以灵活处理不同数据,需要处理的数据量比较大并且这些数据都属于同一数据类型时,可以将它们定义为一个数组,便于采用统一的名字进行管理和使用。然而,在C语言中也拥有不足之处,就是在定义数组的同时必须指明数组的大小,也就是可以存放数据的个数。这个个数必须是一个常数,这就导致了在定义数组之前必须弄清楚所要存放数据量的多少,从而给出准确定义。一旦定义的数组过大,会造成存储空间的浪费,影响程序执行的效率;反之,如果定义的数组太小,又不能满足实际需要。并且一旦程序完成,要改变数组的大小就必须修改程序本身,导致程序通用性差。比如,要对一个学校各个班级学生的成绩进行相应的统计,由于各个班级人数不一样,就会导致每处理一个班级后都要再次修改程序,重新统计。

在C语言中有没有一种办法可以将数组的长度定义为不定长的动态数组,可以根据实际数据的个数自由调整数组长度,这样既保证了数组够用,也不会造成浪费呢?下面以对学生成绩表进行统计计算为例,阐述使用动态数组处理这一类问题的方法。

1一维动态数组

假定学校要计算的成绩只有一门,比如只是为了统计期末各班数学成绩,在程序中可以定义定长数组score

\[100\],这样就能计算出每一个班级的平均分和最大最小值。程序段如下:

int score\[10\],average=0,max,min,i;

for(i=0;i<10;i++)

scanf("%d",&score\[i\]);

max=score\[0\];

min=score\[0\];

for(i=0;i<10;i++)

{

if (score\[i\]>max) max=score\[i\];

if (score\[i\]<min) min=score\[i\];

average=average+score\[i\];

}printf("max=%d,min=%d,average=%d\\n",max,min,average/10);

这样固然解决了成绩统计的问题,可是并不是每一个班级都有100人的,这样就会造成大量空间浪费。其实,在C语言中提供了可以根据自己需要来申请所需空间大小的内存空间动态分配函数,利用这样的函数就可以为自己的数组申请到满足需要的空间,从而也就解决了每个班级学生人数不同的问题,比如malloc( )函数。malloc( )是一个可以根据用户要求而分配内存空间,这样就可以在分配内存空间之前设置变量用于保存学生人数,然后根据输入的学生人数来分配内存空间,保证了内存空间够用而不浪费的原则。写程序段如下:

int average=0,max,min,i,n;

int *p;

scanf("%d",&n);

p=(int*)malloc(n*sizeof(int));

if (p==NULL)

{printf("error");exit(0);}

for(i=0;i<n;i++)

scanf("%d",&p\[i\]);

max=p\[0\];

min=p\[0\];

for(i=0;i<n;i++)

{if (p\[i\]>max) max=p\[i\];

if (p\[i\]<min) min=p\[i\];

average=average+p\[i\];

}

printf("max=%d,min=%d,average=%d\\n",max,min,average/n);

2二维动态数组

用一维动态数组解决了不同班级的单科成绩求平均和最大最小值的问题,然而在现实生活中学校面对的更多不同班级的成绩表,要求求取每个班级每一个同学的总分,每一门课程的平均分、最高分、最低分等问题。比如,每一个学期结束,中小学都要统计各个年级的班级之间不同科目的成绩情况,每个班级也要统计不同学生的成绩情况。为了减少篇幅,假设只需要计算每一个同学的总分。

在这样的情况下,用一维动态数组就不能解决问题,只能设计使用二位动态数组。假设每一个同学都有5门课,用一个n行6列的动态二维数组,前5列用于存放学生的原始成绩,最后一列用于存放计算所得的每一个学生的总分。

为了在输入输出以及计算二维数组时表示直观,我们将用于指向动态存储空间的指针P定义为行指针的形式,这样可以直接用直观的p\[i\]\[j\]的形式来表示成绩表中的每一个成绩。程序段如下:

int n,(*p)\[6\];int i,j;

scanf("%d",&n);

p=(int*)malloc(n*sizeof(int)*6);

if (p==NULL)

{printf("error");exit(0);}

for(i=0;i<n;i++)

for(j=0;j<5;j++)

scanf("%d",&p\[i\]\[j\]);

你可能感兴趣的:(学生成绩表c语言)