欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

编写一个C程序,实现以下功能:定义一个学生结构体Student(含学号、姓名、年龄、身高)和一个函数sort(struct Student *p),该函数使用选择排序法按年龄由小到大排序。在主函数中

发布时间:2024/9/27 编程问答 55 豆豆

编写一个C程序,实现以下功能:

定义一个学生结构体Student(含学号、姓名、年龄、身高)和一个函数sort(struct Student *p),该函数使用选择排序法按年龄由小到大排序。在主函数中输入10个学生的学号、姓名、年龄和身高,调用sort函数对学生数据排序,最后输出排序后的学生全部信息。

比较结构体部分成员,交换整个结构体的思维。

#define _CRT_SECURE_NO_WARNINGS 1 /*编写一个C程序,实现以下功能: 定义一个学生结构体Student(含学号、姓名、年龄、身高) 和一个函数sort(struct Student *p), 该函数使用选择排序法按年龄由小到大排序。 在主函数中输入10个学生的学号、姓名、年龄和身高, 调用sort函数对学生数据排序,最后输出排序后的学生全部信息。 */ #define MAX 20 #include<stdio.h> static int n; struct Student {int id;char Name[MAX];int age;float tell; }; void Sort(Student *p) {//选择排序排序年龄。for (int i = 0; i < n ; i++) {for (int j = 0; j < n - i -1; j++) {if (p[j+1].age < p[j].age) {//比较的是结构体部分成员,但对整个结构体交换。则需要创建一个新的结构体。Student tmp = p[j];p[j] = p[j + 1];p[j + 1] = tmp;}}}for (int i = 0; i < n; i++) printf("%d\t%s\t%d\t%f\t\n", p[i].id,p[i].Name, p[i].age, p[i].tell); } int main() {Student stu[MAX];printf("要创建学生对象的个数:");scanf("%d", &n);for (int i = 0; i < n; i++){printf("输入学生id:");scanf("%d", &stu[i].id);printf("输入学生姓名:");scanf("%s", &stu[i].Name);printf("输入学生年龄:");scanf("%d", &stu[i].age);printf("输入学生身高:");scanf("%f", &stu[i].tell);}Sort(stu); //这里对于数组而言,直接传入数组名即可,但如果是其他数据,则需要传入地址的方式, //因为传参并不能改变实参的值,只能通过传址的方式来改值, //对于数组来说,arr[]可以改写成*arr,也就是指针形式。所以可以直接传数组名 }

 我犯得一些错误,

:打印出来烫烫烫,

可能存在的原因是:1.字符串没有结束符 2.数据输入有问题

我一开始写的是

scanf("%s",stu[i].Name[MAX]);

这里Name后面不应有方括号,%s本意就是输出一个字符串。

二:数据重复

一开始以为是浅拷贝导致数据没有完全达成转换,而我只会C++的深拷贝处理,对于C的深拷贝要全部数据都进行替换感觉很麻烦,询问之后才知道原来是冒泡排序写错了。。。

 

总结,马虎害死人,之后的学习会涉及到更多的数据处理,万一搞错一点很难处理,所以还是要细心排查啊。泪目 

也算是有所成长了,这些地方一直没有练到

总结

以上是生活随笔为你收集整理的编写一个C程序,实现以下功能:定义一个学生结构体Student(含学号、姓名、年龄、身高)和一个函数sort(struct Student *p),该函数使用选择排序法按年龄由小到大排序。在主函数中的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。