C语⾔学习笔记——使⽤字符数组和实型数组分别存储学⽣姓名和成绩,并通过
对学⽣成绩的排序,按名次输出
题⽬来⾃C语⾔从⼊门到精通第三版:使⽤字符数组和实型数组分别存储学⽣姓名和成绩,并通过对学⽣成绩的排序,按照名次输出字符数组中对应的学⽣姓名
在⽹上⼤致了⼀下没有看到C语⾔实现的版本,于是⾃⼰写了⼀个。对这个题⽬的要求并不是很明确,题⽬中的使⽤字符数组和实型数组分别存储学⽣姓名和成绩到底是直接通过代码预先储存到相应的字符数组中,还是要通过gets()函数或scanf_s()函数获取字符串再储存。因为是作为学习理解过程,所以我直接按照先获取学⽣姓名,成绩,再储存到相应数组中,然后对成绩排序,最后按分数从低到⾼输出姓名与成绩。
先附上全部代码,再对其中的⼀些函数作解释:
#include<stdio.h>
#include<string.h>
#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);
}
}
}scanf输入整型数组
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()循环是通过冒泡法来对输⼊的学⽣成绩进⾏排序,关于排序算法可以参考我的另⼀篇⽂章
因为前⾯的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);
}
}
}
最后再将排序好的字符数组和整型数组输出即可。完整代码可供免费下载。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论