结构体数组排序

今天同学问我一道关于数组排序的问题:
#要求:排序出原数组中数据从大到小的位置值,但不能调换数据的位置,把结果保存到另外一个数组中。

要排序是很简单的,选择排序、冒泡随便都可以解决,但这不能调换数据位置,这让我情何以堪?运用结构体数组!这让我想起以前《数据结构》的课程设计-《考试成绩统计》,而很巧的是那孩子的原始问题也就是这个同名课程设计;
好吧,让我再一次熟悉了C的:清屏、数组的运用、循环结构程序的设计、函数的定义、排序和结构体的应用这些知识;Thanks!

*任务:给出n个学生的考试成绩表,每条信息由姓名和分数组成,试设计一个算法:

按分数高低次序,打印出每个学生在考试中获得的名次,分数相同的为同一名次;

按名次列出每个学生的姓名与分数。

*要求:学生的考试成绩表必须通过键盘输入数据而建立,同时要对输出进行格式控制。


先贴出我的课程设计:


/* 
----------------学生信息管理系统----------------

         在菜单中选择以下的操作类型
         1.增加记录
         2.显示所有学生信息
         3.信息排序
         4.退出程序
         5.制作人
         请输入你的选择:
*/

#include "stdio.h" 
#include "string.h" 
#include "stdlib.h" 
#include "conio.h" 

struct subject{		//	科目信息结构体 

	float Chinese;	//	语文 
	float Math;		//	数学 
	float English;	//	英语 
}; 

struct student{
	
	int no;			//	学号 
	char name[20];	//	姓名 
	subject score;	//	3门科目的成绩 
	float avg;		//	3门平均成绩 
}stud[50];			//	结构体数组 

	int count=0;	//	计数变量,记录学生人数 

	void add() {	//	增加学生信息函数 

		student a;	//	临时结构体变量a 
		char x, j;	 //	Yes or No输入字符变量 

		//	循环输入学生信息 
		for (int i=0; i<50; i++){ 

			system("cls"); //	清屏函数 
			int t=0; 
			printf("请输入学生的学号:"); 
			scanf("%d",&a.no); 

		//	寻找学号是否已存在 
		for (int k=0; k<count; k++) { 
			if (stud[k].no==a.no) { 
					t=1; 
			} 
		} 

	//	存在与否,分别输出 
	if (t == 1) 
    	printf("输入的学号已存在,请重新输入\n"); 

	else { 
		printf("请输入学生的姓名:"); 
		scanf("%s", a.name); 
		printf("请输入学生的语文成绩:"); 
		scanf("%f", &a.score.Chinese); 
		printf("请输入学生的数学成绩:"); 
		scanf("%f", &a.score.Math); 
		printf("请输入学生的英语成绩:"); 
		scanf("%f", &a.score.English); 
		a.avg = (a.score.Chinese + a.score.English + a.score.Math) / 3; 

		//	判定是否要增加该记录 
		printf("确定要增加该记录吗?(y/n)"); 
		scanf("%c",&x); 
		scanf("%c",&x); 

	if (x == 'y'){ 
		stud[count]=a; 
		count++; 
		} 
	} 

		//	判定是否要继续增加记录 
		printf("要继续增加记录吗?(y/n)"); 
		scanf("%c",&j); 
		scanf("%c",&j); 
	if (j == 'n')  break; 
	} 
		printf("\n按任意键返回主菜单:"); 
		getch();		//	从键盘接收任意一个字符就返回 
	} 

	void show() {		//	显示所有学生信息函数 

		system("cls"); //	清屏函数 
		//	循环显示 
		for (int i=0; i < count; i++) { 
			printf("学号:%-8d姓名:%-16s \n", stud[i].no, stud[i].name); 
			printf("语文成绩:%-8.1f 数学成绩:%-8.1f 英语成绩:%-8.1f平均成绩:%.1f\n", 
					stud[i].score.Chinese, stud[i].score.Math, stud[i].score.English, stud[i].avg); 
			printf("---------------------------------------------------------------------\n"); 
		} 
		printf("\n按任意键返回主菜单:"); 
		getch(); 
	} 

	void sort() {		//	根据学生的平均成绩由小到大进行排序 
	
		system("cls"); //	清屏函数 
		//	冒泡排序法 
		for (int i=0; i < count - 1; i++) { 
			for (int j=0; j < count -1 - i; j++) { 

				if(stud[j].avg > stud[j+1].avg){ 
					student t = stud[j]; 
					stud[j] = stud[j+1]; 
					stud[j+1] = t; 
				} 
			} 
		} 
		printf("排序已完成,按任意键返回主菜单:"); 
		getch(); 
	} 

 
	void getChoice() { 

		int choice=0;		//	保存用户输入的选择项 
		do { 
			system("cls");	//	清屏函数 
			printf("\t----------------学生信息管理系统----------------\n\n"); 
			printf("\t\t在菜单中选择以下的操作类型\n"); 
			printf("\t\t1.增加记录\n\t\t2.显示所有学生信息\n\t\t3.信息排序\n"); 
			printf("\t\t4.退出程序\n\t\t5.制作人\n"); 
			printf("\t\t请输入你的选择:"); 
			scanf("%d",&choice); 

			switch (choice) { 

				case 1: add(); break; 
				case 2: show(); break; 
				case 3: sort(); break; 
				case 5: getChoice(); break; 
			} 
		}while (choice != 4); 
	} 

void main() {
	
	char x[10]; 
	printf("\t----------------学生信息管理系统----------------\n\n"); 
	getChoice();

}

思考:
1、对比了同学的程序,缺少了显示名次的功能; 在结构体中加入:int order;
2、还是一直困扰的数组数据输入后怎么保存问题;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值