成绩排行c语言,题解 1739: 成绩排序(C语言)详细解释

本文介绍如何使用冒泡排序算法对一组学生数据进行排序,依据是成绩从低到高,成绩相同则按姓名字典序排序,姓名相同再按年龄从小到大。通过结构体存储数据并结合strcmp函数进行字符串比较。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

解题思路:

首先通过结构体来存储这些数据struct student{

char name[200];

int age;

int score;

}stu[1005];

之后再依次进行排序,我这里选用的是冒泡排序,这样才更容易组合

冒泡排序(Bubble Sort),是一种较简单的排序算法。

它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果他们的顺序(如从大到小、首字母从A到Z)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。

这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。

831838254e04f27c3d112e66b523417a.gif// 冒泡排序

void BubbleSort(int arr[], int length)

{

for (int i = 0; i 

{

for (int j = 0; j 

{

if (arr[j] > arr[j + 1])

{

int temp;

temp = arr[j + 1];

arr[j + 1] = arr[j];

arr[j] = temp;

}

//位置1

}

}

}

//这样子就是从小到大的冒泡排序

知道这些后,就解这道题的时候,就只需要在冒泡排序的位置1处加上题目的额外要求就可以了

注意事项:

这道题的比较名字可以用strcmp函数来进行比较原型:int strcmp(const char *s1, const char *s2);

头文件:#include 

功能:用来比较两个字符串

参数:s1、s2为两个进行比较的字符串

返回值:若s1、s2字符串相等,则返回零;若s1大于s2,则返回大于零的数;否则,则返回小于零的数。

说明:strcmp()函数是根据ACSII码的值来比较两个字符串的;strcmp()函数首先将s1字符串的第一个字

符值减去s2第一个字符,若差值为零则继续比较下去;若差值不为零,则返回差值。

本题的排序规律:

1、成绩低的在上面

2、成绩相同时,名字小的在上面(用strcmp比较)

3、名字也相同时,年龄小的在上面

参考代码:#include 

#include 

struct student{

char name[200];

int age;

int score;

}stu[1005];

int main()

{

int n;

struct student t;

while(~scanf("%d", &n))

{

for (int i = 0; i 

scanf("%s%d%d", stu[i].name, &stu[i].age, &stu[i].score);

for (int i = 0; i 

for (int j = 0; j 

{

if (stu[j].score > stu[j + 1].score)

{

t = stu[j];

stu[j] = stu[j + 1];

stu[j + 1] = t;

}

else if (stu[j].score == stu[j + 1].score)

{

if (strcmp(stu[j].name,stu[j + 1].name) > 0)

{

t = stu[j];

stu[j] = stu[j + 1];

stu[j + 1] = t;

}

else if (strcmp(stu[j].name,stu[j+1].name) == 0)

{

if (stu[j].age > stu[j + 1].age)

{

t = stu[j];

stu[j] = stu[j + 1];

stu[j + 1] = t;

}

}

}

}

for (int i = 0; i 

printf("%s %d %d\n", stu[i].name, stu[i].age, stu[i].score);

}

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值