一、题目解析
本题较为简单。
使用结构体来实现数据读入。
需要注意的是要学会对数组进行动态申请资源。
calloc()
是一个C语言函数;
用 法: void *calloc(unsigned n,unsigned size);
功 能: 在内存的动态存储区中分配n个长度为size的连续空间,函数返回一个指向分配起始地址的指针;如果分配不成功,返回NULL;
跟malloc()
的区别:
calloc()
在动态分配完内存后,自动初始化该内存空间为零,而malloc()
不初始化,里边数据是随机的垃圾数据。
例如本题中:
sData *sdata; //定义一个sData类型的指针,用于动态申请结构体指针数组
scanf("%d", &n);
sdata = (sData *)calloc(n, sizeof(sData)); //动态结构体指针数组。
以上使用calloc()
函数申请了以sdata
指向的地址开头的,分配n
个长度为sizeof(sData)
的连续空间。
注意:当内存不再使用时,应使用free()函数将内存块释放。
free(sdata);
二、代码实现
#include <stdio.h>
#include <stdlib.h>
typedef struct studentData{
char name[11];
char num[11];
int score;
}sData;
//typedef struct studentData sData; 此时struct studentData 等价于 sData
int main(int argc, char *argv[]) {
int i;
int n;
sData *sdata; //定义一个sData类型的指针,用于动态申请结构体指针数组
int max,min; //最高分,最低分
int maxIndex, minIndex; //成绩最高、最低学生序号
scanf("%d", &n);
sdata = (sData *)calloc(n, sizeof(sData)); //动态结构体指针数组。
for(i=0; i<n; i++)
{
//结构体成员变量为数组时不需要取地址符号“&”,为基本数据类型时需要取地址符“&“。
scanf("%s %s %d", sdata[i].name, sdata[i].num, &sdata[i].score);
if(i==0){ //将第一个读入的数据组同时默认为最大值和最小值
max= sdata[0].score;
min= sdata[0].score;
maxIndex=0;
minIndex=0;
continue;
}
if(sdata[i].score>max)
{
max=sdata[i].score;
maxIndex=i;
}
if(sdata[i].score<min)
{
min=sdata[i].score;
minIndex=i;
}
}
printf("%s %s\n", sdata[maxIndex].name, sdata[maxIndex].num);
printf("%s %s\n", sdata[minIndex].name, sdata[minIndex].num);
free(sdata); //注意释放资源!!!
return 0;
}