今天同学问我一道关于数组排序的问题:
#要求:排序出原数组中数据从大到小的位置值,但不能调换数据的位置,把结果保存到另外一个数组中。
要排序是很简单的,选择排序、冒泡随便都可以解决,但这不能调换数据位置,这让我情何以堪?运用结构体数组!这让我想起以前《数据结构》的课程设计-《考试成绩统计》,而很巧的是那孩子的原始问题也就是这个同名课程设计;
好吧,让我再一次熟悉了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、还是一直困扰的数组数据输入后怎么保存问题;