day12-成绩管理系统

成绩管理系统

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;
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

2

思维导图

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值