成绩管理系统
1> 完成系统的注册和登录功能
2> 登录成功后,现在菜单
3> 功能1:完成信息的录入(姓名(二维字符数组)和成绩(一维整形数组))
4> 功能2:展示学生信息
张三 100
李四 90
王五 98
5> 功能3:求最高分和最低分学生的信息
最高分是张三,成绩100
最低分是李四,成绩90
6> 功能4:查找,提示并输入一个姓名,输出该学生对于的成绩
7> 功能5:将所有学生按照成绩的降序进行排序
张三 100
王五 98
8> 功能6:修改信息,提示并输入一个学生姓名,更改该学生的成绩
9> 功能7:添加学生,提示并输入一个学生姓名及成绩,添加到最后
10> 功能8:提示并输入一个学生的姓名,从系统中将该学生的信息删除
11> 功能9:求班级总成绩及平均分
12> 功能10:提示并输入一个范围,将成绩在该范围内的学生信息全部输出
实现
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(int argc, const char *argv[])
{
//准备容器存储注册账号和注册密码
char regest_usr[20] = ""; //注册名称
char regest_pwd[20] = ""; //注册密码
int menu1 = 0; //菜单1的选择
int flag = 0; //标识是否登录成功
while(flag==0)
{
printf("\t\t 1、注册\n");
printf("\t\t 2、登录\n");
printf("请输入选项:");
scanf("%d", &menu1);
//多分支选择
switch(menu1)
{
case 1: //注册操作
{
printf("请输入注册账号:");
scanf("%s", regest_usr);
printf("请输入注册密码:");
scanf("%s", regest_pwd);
printf("注册成功\n");
}
break;
case 2: //登录操作
{
char usrName[20] = ""; //登录账号
char pwd[20] = ""; //登录密码
printf("请输入登录账号:");
scanf("%s", usrName);
printf("请输入登录密码:");
scanf("%s", pwd);
//判断登录是否成功
if(strcmp(usrName, regest_usr)==0 && strcmp(pwd, regest_pwd)==0||
strcmp(usrName,"1")==0&&strcmp(pwd,"1")==0)
{
printf("登录成功\n");
flag = 1;
}else
{
printf("登录失败\n");
}
}
break;
case 0:exit(0); //退出
default:printf("您输入的功能有误请重新输入\n");
}
/*判断是否执行了登录
if(flag == 1)
{
break; //结束循环
}*/
}
system("clear");
/******************************************************************/
printf("登录成功后的程序\n");
// 定义存储学生姓名的二维数组
char stuName[128][50];
// 定义存储学生成绩的一维数组
int stuScore[128];
// 记录当前已录入的学生数量
int stuCount = 0;
// 用于存储用户在菜单中做出的选择
int choice;
do {
// 显示菜单
printf("**********学生成绩管理系统菜单**********\n");
printf("1. 完成信息的录入\n");
printf("2. 展示学生信息\n");
printf("3. 求最高分和最低分学生的信息\n");
printf("4. 查找学生成绩\n");
printf("5. 将所有学生按照成绩的降序进行排序\n");
printf("6. 修改信息\n");
printf("7. 添加学生\n");
printf("8. 删除学生信息\n");
printf("9. 求班级总成绩及平均分\n");
printf("10. 按成绩范围输出学生信息\n");
printf("0. 退出系统\n");
printf("请输入你的选择: ");
scanf("%d", &choice);
switch (choice) {
case 1: {
// 用于临时存储本次要录入的学生个数
int n;
// 提示用户输入要录入的学生个数
puts("请输入录入学生个数:");
scanf("%d", &n);
// 循环录入每个学生的信息
for (int i = 0; i < n; i++) {
puts("请输入学生姓名 分数");
scanf(" %s%d", stuName[i], &stuScore[i]);
}
puts("录入完成");
// 更新已录入的学生总数
stuCount += n;
break;
}
case 2: {
// 如果还没有录入学生信息
if (stuCount <= 0) {
puts("无数据");
break;
}
puts("全部学生成绩为:");
// 循环遍历已录入的每个学生信息,并输出学生姓名和成绩
for (int i = 0; i < stuCount; i++) {
printf("%s的成绩是:%d\n", stuName[i], stuScore[i]);
}
break;
}
case 3: {
if (stuCount <= 0) {
puts("无数据");
break;
}
// 初始化最高分和最低分,先假设第一个学生的成绩为最高分和最低分
int max = stuScore[0];
int min = stuScore[0];
// 遍历所有已录入学生的成绩,寻找最高分和最低分
for (int i = 0; i < stuCount; i++) {
// 如果当前学生成绩大于已知的最高分,则更新最高分
if (max < stuScore[i]) {
max = stuScore[i];
}
// 如果当前学生成绩小于已知的最低分,则更新最低分
if (min > stuScore[i]) {
min = stuScore[i];
}
}
printf("全班最高分为%d 最低分为%d\n", max, min);
break;
}
case 4: {
if (stuCount <= 0) {
puts("无数据");
break;
}
// 用于存储要查找的学生姓名
char name[50];
// 用于记录找到的符合条件的学生个数
int count = 0;
puts("请输入你要查找的学生姓名");
scanf("%s", name);
// 遍历所有已录入学生的姓名,查找匹配的学生
for (int i = 0; i < stuCount; i++) {
// 使用strcmp函数比较当前学生姓名和要查找的学生姓名
if (strcmp(stuName[i], name) == 0) {
count++;
printf("%d.%s的成绩是%d\n", count, name, stuScore[i]);
}
}
break;
}
case 5: {
if (stuCount <= 0) {
puts("无数据");
break;
}
// 使用冒泡排序法对学生成绩进行降序排序,外层循环控制比较轮数
for (int i = 1; i < stuCount; i++) {
for (int j = 0; j < stuCount - i; j++) {
if (stuScore[j] < stuScore[j + 1]) {
int score = stuScore[j];
stuScore[j] = stuScore[j + 1];
stuScore[j + 1] = score;
char name[50];
strcpy(name, stuName[j]);
strcpy(stuName[j], stuName[j + 1]);
strcpy(stuName[j + 1], name);
}
}
}
puts("排序完成 按2查看");
break;
}
case 6: {
if (stuCount <= 0) {
puts("无数据");
break;
}
puts("请输入要修改学生");
char name[50];
int count = 0;
scanf("%s", name);
// 遍历所有已录入学生的姓名,查找匹配的学生
for (int i = 0; i < stuCount; i++) {
// 使用strcmp函数比较当前学生姓名和要修改的学生姓名,如果相等表示找到
if (strcmp(name, stuName[i]) == 0) {
// 告知用户找到第几个匹配的学生,并提示输入修改后的成绩
printf("发现第%d个 请修改:", ++count);
scanf("%d", &stuScore[i]);
}
}
// 提示修改操作已完成
puts("修改完成");
break;
}
case 7: {
if (stuCount <= 0) {
puts("无数据");
break;
}
puts("请输入要添加的学生姓名 与 成绩");
// 直接将新学生的姓名存储到stuName数组的下一个空闲位置,成绩存储到stuScore数组对应的下一个位置
// 同时更新已录入学生数量(stuCount自增1)
scanf("%s%d", stuName[stuCount++], &stuScore[stuCount]);
break;
}
case 8: {
if (stuCount <= 0) {
puts("无数据");
break;
}
char name[50];
puts("请输入要删除的学生姓名");
scanf("%s", name);
for (int i = 0; i < stuCount; i++) {
// 使用strcmp函数比较当前学生姓名和要删除的学生姓名,如果相等表示找到要删除的学生
if (strcmp(stuName[i], name) == 0) {
// 输出已找到要删除的学生的姓名和成绩信息
printf("已找到 姓名%s 成绩%d 已删除\n", stuName[i], stuScore[i]);
// 已录入学生数量减1
stuCount--;
// 将后面的学生信息向前移动覆盖当前要删除的学生信息
for (int j = i; j < stuCount; j++) {
strcpy(stuName[j], stuName[j + 1]);
stuScore[j] = stuScore[j + 1];
// 因为移动后当前位置的下一个元素又变成了原来的当前位置元素,所以i需要减1,再次检查这个位置
i--;
}
}
}
break;
}
case 9: {
if (stuCount <= 0) {
puts("无数据");
break;
}
int sum = 0;
double avg = 0;
// 遍历所有已录入学生的成绩,累加求总成绩
for (int i = 0; i < stuCount; i++) {
sum += stuScore[i];
}
avg = (double)sum / stuCount;
printf("总分是:%d 平均分是:%.2lf\n", sum, avg);
break;
}
case 10: {
if (stuCount <= 0) {
puts("无数据");
break;
}
int star = 0, end = -1;
// 循环让用户输入正确的成绩范围,直到输入合法范围为止
while (1) {
puts("请输入起始分数,与结束分数");
scanf("%d%d", &star, &end);
// 如果起始分数大于结束分数,提示范围错误,重新输入
if (star > end) {
puts("范围错误");
continue;
}
// 如果起始分数小于0,提示起始值错误,重新输入
if (star < 0) {
puts("起始值小于0");
continue;
}
// 如果结束分数大于已录入学生的最大数量对应的成绩范围或者小于0,提示结束值错误,重新输入
if (end > stuCount || end < 0) {
puts("结束值错误");
continue;
}
// 如果起始分数小于等于结束分数,说明输入的范围合法,跳出循环
if (star <= end) break;
puts("S");
}
int count = 0;
// 遍历所有已录入学生的成绩,查找在指定成绩范围内的学生信息并输出
for (int i = 0; i < stuCount; i++) {
if (stuScore[i] >= star && stuScore[i] <= end) {
count++;
printf("%d.姓名是:%s 成绩是%d\n", count, stuName[i], stuScore[i]);
}
}
// 如果没有找到符合成绩范围的学生,提示无
if (count == 0) {
puts("无");
}
break;
}
case 0:
printf("已退出系统,感谢使用!\n");
break;
default:
printf("输入的选择无效,请重新输入!\n");
}
} while (choice!= 0);
return 0;
}