C语言学习笔记——使用字符数组和实型数组分别存储学生姓名和成绩,并通过对学生成绩的排序,按名次输出

题目来自C语言从入门到精通第三版:使用字符数组和实型数组分别存储学生姓名和成绩,并通过对学生成绩的排序,按照名次输出字符数组中对应的学生姓名

在网上大致找了一下没有看到C语言实现的版本,于是自己写了一个。对这个题目的要求并不是很明确,题目中的使用字符数组和实型数组分别存储学生姓名和成绩到底是直接通过代码预先储存到相应的字符数组中,还是要通过gets()函数或scanf_s()函数获取字符串再储存。因为是作为学习理解过程,所以我直接按照先获取学生姓名,成绩,再储存到相应数组中,然后对成绩排序,最后按分数从低到高输出姓名与成绩。
先附上全部代码,再对其中的一些函数作解释:

#include 
#include 
#define N 1000

char name[N][N];
char temp_name[N];  //作用类似于temp,作为交换字符数组中字符位置的中间变量
int temp;  //作为排序时交换次序的中间变量
int score[N]; //将成绩定义为一个数组
int i,j = 0;
int length; //输入总人数

int main()
{
     
	printf("总人数:\n");
    scanf("%d",&length);
    for(i = 0;i < length;i++)
	{
     
		printf("姓名:\n");
		scanf("%s",&temp_name);
		strcpy(name[i],temp_name);
		printf("成绩:\n");
		scanf("%d",&score[i]);
	}	
	for(i = 0;i < 10;i++)  // 冒泡法排序
	{
     
		for(j = 9;j > i;j--)
		{
     
			if(score[j-1] > score[j])
			{
     
				temp = score[j];
				score[j] = score[j-1];
				score[j-1] = temp;
				strcpy(temp_name,name[j]);
				strcpy(name[j],name[j-1]);
				strcpy(name[j-1],temp_name);
			}
		}
	}
	for(i = 0;i < 10;i++)
	{
     
		printf("%s的分数:%d \n",name[i],score[i]);
	}
}

第一个for()循环中,根据前面输入的总人数length来循环,先将第一个字符串通过scanf函数获取并存到临时数组temp_name中去,这里并不能直接对数组进行赋值操作 name[i] = temp_name[],只能通过字符串的复制函数strcpy来实现。这里有一个需要注意的是此处的scanf()函数的中止符是空格或回车,所以在姓名字符串中并不能储存空格,如果用gets()函数则可以储存空格。关于scanf()函数和gets()函数的异同点可以自行查找相关资料,以后有时间的话我也会再更一篇关于scanf()函数和gets()函数的文章。

for(i = 0;i < length;i++)
	{
     
		printf("姓名:\n");
		scanf("%s",&temp_name);
		strcpy(name[i],temp_name);
		printf("成绩:\n");
		scanf("%d",&score[i]);
	}

第二个for()循环是通过冒泡法来对输入的学生成绩进行排序,关于排序算法可以参考我的另一篇文章
C语言中数组的排序算法详解——选择法、冒泡法、交换法、插入法、折半法
因为前面的for循环当中,每位同学的姓名和成绩对应这相同的i值,所以这里只需要在对成绩进行排序的同时,将字符数组的编号做同样的操作。但是还是不能通过“=”赋值语句来实现,需通过strcpy字符串复制来实现。

for(i = 0;i < 10;i++)  // 冒泡法排序
	{
     
		for(j = 9;j > i;j--)
		{
     
			if(score[j-1] > score[j])
			{
     
				temp = score[j];
				score[j] = score[j-1];
				score[j-1] = temp;
				strcpy(temp_name,name[j]);
				strcpy(name[j],name[j-1]);
				strcpy(name[j-1],temp_name);
			}
		}
	}

最后再将排序好的字符数组和整型数组输出即可。完整代码可供免费下载。
按名词排序姓名与成绩.c

你可能感兴趣的:(字符串,算法,c语言,数据结构)