本关任务:编写一个C程序,要求采用模块化设计思想,将相关功能用函数实现,并提供菜单选项,每次程序运行结束后需通过功能0退出程序。该程序具有以下功能:
退出程序;
输入n个学生的姓名和C语言课程的成绩;
将成绩按从高到低的次序排序,姓名同时进行相应调整(成绩相同的按姓名首字母排序,首字母相同的按第二个字母排序,依次类推);
输出所有学生的姓名和C语言课程的成绩。
示例
输入1:
依次输入功能编号1,学生数量n,每个学生的姓名和成绩,功能编号3:
1 (功能编号)
3 (学生人数)
xiaoming 90 (学生姓名和成绩)
xiaohong 79
zhangsan 83
3 (功能编号)
0 (功能编号)
输出1:
xiaoming 90
xiaohong 79
zhangsan 83
输入2:
依次输入功能编号1,学生数量n,每个学生的姓名和成绩,功能编号2,功能编号3:
1 (功能编号)
3 (学生人数)
xiaoming 79 (学生姓名和成绩)
xiaohong 79
zhangsan 83
2 (功能编号,成绩相同的按姓名排序)
3 (功能编号)
0 (功能编号)
输出2:
zhangsan 83
xiaohong 79
xiaoming 79
//#pragma warning(disable : 4996)
#include<stdio.h>
#include<conio.h>
#define NUM 50
void menu();
void scoreSort(int[], char[][NUM], int);
void input();
void print();
int n, C[NUM];
char xm[NUM][NUM];
void swap(int, int);
int main()
{
char c;
printf("choice (0~3)\n");
menu();
while (1)
{
c = getchar();
switch (c)
{
case '1': input(); break;
case '2': scoreSort(C, xm, n); break;
case '3': print(); break;
case '0': return 0; break;
default:break;
}
}
return 0;
}
void menu()
{
printf("1--input\n");
printf("2--scoreSort\n");
printf("3--print\n");
printf("0--exit\n");
}
void input()
{
int i;
printf("n=:");
scanf("%d", &n);
for (i = 0; i < n; i++)
scanf("%s %d", xm[i], &C[i]);
}
void print()
{
int i;
for (i = 0; i < n; i++)
printf("%s %d\n", xm[i], C[i]);
}
void swap(int i, int j)
{
int a, k = 0;
char b;
a = C[i]; C[i] = C[j]; C[j] = a;//交换了成绩
while (k < NUM)//交换姓名
{
b = xm[i][k]; xm[i][k] = xm[j][k]; xm[j][k] = b; k++;
}
}
// C[] C的成绩 xm[][NUM]姓名
void scoreSort(int C[], char xm[][NUM], int n)
{
int a, i, j, k;
printf("\n");
for (i = 0; i < n - 1; i++)
for (j = i + 1; j < n; j++)
{
if (C[i] < C[j])
{
swap(i, j);
}
else if (C[i] == C[j])//如果成绩相同
{
k = 0;
while (k < NUM)
{
if (xm[i][k] > xm[j][k])//比较两个名字的第k个位置,如果前者比后者大则
break;
k++;
}
if (k != NUM)//说明满足交换的条件
swap(i, j);
}
}
}