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

编写一个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的深拷贝要全部数据都进行替换感觉很麻烦,询问之后才知道原来是冒泡排序写错了。。。

 

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

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

  • 6
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值