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