问题描述:
1. 从键盘输入包括学号、姓名、三门课程成绩(高数、大外、C语言),并计算三科总分;
2. 对输入的数据能够按照学号或者平均分排序;
3. 具有在文件中进行单项查询的功能(即能够按照给定的关键字,如姓名等找出满足条件的纪录);
4. 具有增加、删除、修改数据功能。
本程序包含注册(regist)、登录(login)、菜单(menu)、输入(input)、输出(display)、查找(find)、修改(change)、删除(del)基本功能。先分别定义各种全局函数和全局变量now和now2,同时定义结构体及结构体数组。其中now作为现有学生信息个数的一个标记,now2作为现有管理员个数的一个标记。每次执行完子函数就返回主菜单。共含有五个开关语句,依次在main,menu,display,find,change中,使界面更友好,用户操作更简单。
我的回复:
#include <stdio.h>
#include <string.h>
#define STUDENTS 5 // 宏定义学生的人数:5个
#define SUBJECTS 5 // 宏定义每个学生的科目:英语、数学、语文、体育、音乐
char Name[STUDENTS][11]; // 定义学生的姓名字符数组:Name[0]="小明",Name[1]="王一呜"
float Score[STUDENTS][SUBJECTS + 1]; // 总成绩=英语+数学+语文+体育+音乐
// 函数的声明
// 输入学生的姓名和它每科的成绩
void inputDate();
// 打印排序前的学生的姓名和成绩
void printData();
// 按学生的总成绩排序(从高到低:冒泡排序)
void sortData();
int main(int argc, char *argv[]) {
// 1、输入学生的姓名和它每科的成绩
inputDate();
// 2、打印排序前的学生的姓名和成绩
printf("排序前的学生的姓名和成绩:\n");
printData();
// 3、按学生的总成绩排序(从高到低)
sortData();
// 4、打印排序后的学生的姓名和成绩
printf("排序后的学生的姓名和成绩:\n");
printData();
return 0;
}
// 函数的定义
// 输入学生的姓名和它每科的成绩
void inputDate() {
// 使用for循环,输入每个学生的姓名和他们每科的成绩
for (int indexI = 0; indexI < STUDENTS; indexI++) {
// 1、输入学生的姓名
printf("请输入第%d个学生的姓名(一共%d个):", indexI + 1, STUDENTS);
scanf("%s", Name[indexI]);
// 2、输入这个学生的每科成绩
printf("请输入%s的英语、数学、语文、体育、音乐成绩(使用逗号分隔它们):", Name[indexI]);
scanf("%f,%f,%f,%f,%f", &Score[indexI][0], &Score[indexI][1], &Score[indexI][2], &Score[indexI][3], &Score[indexI][4]);
// 3、统计这个学生的总成绩
// Score[indexI][SUBJECTS] = Score[indexI][0] + Score[indexI][1] + Score[indexI][2] +Score[indexI][3] +Score[indexI][4];
Score[indexI][SUBJECTS] = 0.00; // 初始化总成绩为0.00
for (int indexJ = 0; indexJ < SUBJECTS; indexJ++) {
Score[indexI][SUBJECTS] += Score[indexI][indexJ];
}
// printf("%s的英语=%8.2f、数学=%8.2f、语文=%8.2f、体育=%8.2f、音乐=%8.2f、总成绩=%8.2f\n", Name[indexI], Score[indexI][0],
// Score[indexI][1], Score[indexI][2], Score[indexI][3], Score[indexI][4], Score[indexI][5]);
}
}
// 打印排序前的学生的姓名和成绩
void printData() {
// 1、打印标题
printf("+----------+--------+--------+--------+--------+--------+--------+\n");
printf("| 姓名 | 英语 | 数学 | 语文 | 体育 | 音乐 | 总成绩 |\n");
printf("+----------+--------+--------+--------+--------+--------+--------+\n");
// 2、使用for循环打印每个学生的姓名和成绩
for (int indexI = 0; indexI < STUDENTS; indexI++) {
printf("|%10s|", Name[indexI]); // 打印学生的姓名
for (int indexJ = 0; indexJ < SUBJECTS + 1; indexJ++) {
printf("%8.2f|", Score[indexI][indexJ]); // 打印学生每科的成绩(包括总成绩)
}
printf("\n" );
printf("+----------+--------+--------+--------+--------+--------+--------+\n");
}
}
// 按学生的总成绩排(从高到低:冒泡排序)
void sortData() {
for (int indexI = 0; indexI < STUDENTS - 1; indexI++) {
for (int indexJ = 0; indexJ < STUDENTS - 1 - indexI; indexJ++) {
if (Score[indexJ][SUBJECTS] < Score[indexJ + 1][SUBJECTS]) {
// 1、交换他们的姓名
char tempName[11];
strcpy(tempName, Name[indexJ]); // 把当前位置学生的姓名拷贝到临时变量中
strcpy(Name[indexJ], Name[indexJ + 1]); // 把下一个位置的学生姓名拷贝到当前位置
strcpy(Name[indexJ + 1], tempName); // 把临时变量拷贝到下一个位置的学生姓名中
// 2、交换他们每一科的成绩
for (int indexK = 0; indexK < SUBJECTS + 1; indexK++) {
float tempScore = Score[indexJ][indexK]; // 把当前位置学生的每一科成绩存放到临时变量中
Score[indexJ][indexK] = Score[indexJ + 1][indexK]; // 把下一个位置的学生成绩存放到当前位置上
Score[indexJ + 1][indexK] = tempScore; // 把临时变量存放到下一个位置的学生成绩中
}
}
}
}
}