PTA 1004 成绩排名(C语言实现)

一、题目解析

本题较为简单。
使用结构体来实现数据读入。

需要注意的是要学会对数组进行动态申请资源。

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 
#include 
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;
}

你可能感兴趣的:(PTA)