为什么要使用动态内存分配
在声明数组时,必须用一个编译时常量指定数组长度。但是数组长度常常在程序运行时才知道,只是因为它所需要的内存空间取决于输入数据。
例如,一个用于计算学生成绩最大值,最小值,平均分的程序,可能需要存储一个班级所有学生的数据,但不同班级的学生数量可能不同。对此,动态分配数组长度大小,更利于存储空间的分配。
【例题】输出学生成绩
作者 张泳
单位 浙大城市学院
本题要求编写程序,根据输入学生的成绩,统计并输出学生的平均成绩、最高成绩和最低成绩。建议使用动态内存分配来实现。
输入格式:
输入第一行首先给出一个正整数N,表示学生的个数。接下来一行给出N个学生的成绩,数字间以空格分隔。
输出格式:
按照以下格式输出:
average = 平均成绩
max = 最高成绩
min = 最低成绩
结果均保留两位小数。
输入样例:
3
85 90 95
输出样例:
average = 90.00
max = 95.00
min = 85.00
代码
#include <stdio.h>
#include <stdlib.h>
int compare_integers(void const* a, void const* b)
{
register int const* pa = a; //定义局部指针变量接受外输入的指针变量
register int const* pb = b;
return *pa > *pb ? 1 : *pa < *pb ? -1 : 0;//判断两个变量的值的大小:pa>pb返回1;pa=pb返回0;pa<pb返回-1
}
int main()
{
float sum_score=0;
float *array;
int i,n_student;
scanf("%d",&n_student);
array = malloc(n_student * sizeof(float));
for(i=0;i<n_student;i++)
{
scanf("%f",array+i);
sum_score+=*(array+i);
}
qsort(array,n_student,sizeof(float),compare_integers);
printf("average = %.2f\n",sum_score/n_student);
printf("max = %.2f\n",*(array+n_student-1));
printf("min = %.2f\n",*array);
free(array);
return 0;
}