班级成绩管理系统(C语言)



一、设计任务与目标

对一个有N个学生的班级,每个学生有M门课程。该系统实现对班级成绩的录入、显示、修改、排序、保存等操作的管理。

二、实现功能

(1)本系统采用一个结构体数组,每个数据的结构应当包括:学号、姓名、M门课程名称。
(2)本系统显示这样的菜单:
请选择系统功能项:
a、成绩录入
b、成绩显示
c、成绩保存
d、成绩排序
e、成绩修改(要求先输入密码)
f、成绩统计
1)显示每门课程成绩最高的学生的基本信息
2)显示每门课程的平均成绩
3)显示超过某门课程平均成绩的学生人数
g、退出系统
(3)执行一个具体的功能之后,程序将重新显示菜单。
(4)将学生成绩保存到文件中。

三、程序源码

菜单

void menu()          //菜单 
{
    printf("========================================\n");
    printf("|    欢迎来到班级成绩管理系统!          \n");
    printf("|   a:成绩录入\n");
    printf("|   b:成绩显示\n");
    printf("|   c:成绩保存\n");
    printf("|   d:成绩排序\n");
    printf("|   e:成绩修改\n");
    printf("|   f:成绩统计\n");
    printf("|   g:退出系统\n");
    printf("========================================\n");
    printf("请输入你的选择: ");
}

录入学生成绩

void inputScores()          //成绩录入 
{
    if (courseCount == 0)
	{
        printf("请输入课程数量:");
        scanf("%d", &courseCount);          //输入课程数量 
        for (int i = 0; i < courseCount; i++)          //输入课程名字 
		{
            Course course;
            printf("请输入第 %d 门课程名字:", i+1);
            scanf("%s", course.name);
            courses[i] = course;
        }
    }

    Student stu;
    printf("请输入学生学号:");
    scanf("%s", stu.id);          //输入学生学号 
    printf("请输入学生名字:");
    scanf("%s", stu.name);          //输入学生姓名 
    for (int j = 0; j < courseCount; j++)          //输入课程成绩 
	{
        printf("请输入 %s 课程成绩:", courses[j].name);
        scanf("%d", &stu.scores[j]);
    }
    students[studentCount++] = stu;
}

显示所录入的学生成绩

void displayScores()          //成绩显示 
{
    if (studentCount == 0)
	{
        printf("No student\n");
        return;
    }
    printf(" 学号    姓名 ");
    for (int i = 0; i < courseCount; i++)          //输出课程名字 
	{
        printf(" %s", courses[i].name);
    }
    printf("\n");
    for (int i = 0; i < studentCount; i++)          //输出学生信息 
	{
        printf("%s %s", students[i].id, students[i].name);          //输出学生学号,姓名 
        for (int j = 0; j < courseCount; j++)          //输出学生成绩 
		{
            printf(" %d", students[i].scores[j]);
        }
        printf("\n");
    }
}

保存录入的学生成绩

void saveScores()          //成绩保存 
{
    FILE* fp;
    fp = fopen("scores.txt", "w");          //打开文件 
    if (fp == NULL)
	{
        printf("open scores.txt failed!\n");
        return;
    }
    fprintf(fp, "%d\n", courseCount);          //输出文件信息 
    for (int i = 0; i < courseCount; i++)          //输出课程名字 
	{
        fprintf(fp, "%s\n", courses[i].name);
    }

    fprintf(fp, "%d\n", studentCount);          //输出学生信息 
    for (int i = 0; i < studentCount; i++) 
	{
        fprintf(fp, "%s\n%s\n", students[i].id, students[i].name);          //输出学生学号,姓名 
        for (int j = 0; j < courseCount; j++)          //输出学生成绩 
		{
            fprintf(fp, "%d ", students[i].scores[j]);
        }
        fprintf(fp, "\n");
    }
    fclose(fp);          //关闭文件 
}

对录入的课程成绩进行排序

void sort(int l,int r, int pos)          //对课程的成绩进行排序 
{
    if (r <= l)	return;
    int i = l, j = r;
    int key = students[l].scores[pos];
    while (i <= j)
	{
        while (students[i].scores[pos] > key)	i++;
        while (students[j].scores[pos] < key)	j--;
        if (i <= j)
		{
            Student temp = students[i];
            students[i] = students[j];
            students[j] = temp;
            i++;
            j--;
        }
    }
    sort(l, j, pos);
    sort(i, r, pos);
}

比较学生成绩

int compare(char a[], char b[])          //比较学生的成绩 
{
    int la = strlen(a);
    int lb = strlen(b);
    if (la < lb) return -1;
    if (la > lb) return 1;
    int len = 0;
    while (len < la)
	{
        if (a[len] < b[len]) return -1;
        if (a[len] > b[len]) return 1;
        len++;
    }
    return 0;
}

对程序进行排序

void orderScores()          //成绩排序 
{
    printf("Enter course name:");          //输入需要进行成绩排序的课程名字 
    char name[PROFILE_LENGTH];
    scanf("%s", name);
    int i = courseCount;
    for (i = 0; i < courseCount; i++)
	{
        if (compare(courses[i].name, name) == 0)
            break;
    }
    if (i == courseCount)
	{
        printf("No course %s\n", name);
        return;
    }
    sort(0, studentCount - 1, i);
}

修改已经录入但录入出错的学生成绩

void changeScores()          //成绩修改 
{
    printf("Enter password:");          //输入密码 
    char pwd[PROFILE_LENGTH];
    scanf("%s", pwd);          //输入密码 
    if (compare(password, pwd) != 0)
	{
        printf("密码错误!\n");
        return;
    }

    printf("Enter student id:"); 
    char id[PROFILE_LENGTH];
    scanf("%s", id);          //输入学生学号 
    int i = studentCount;
    for (i = 0; i < studentCount; i++)
	{
        if (compare(students[i].id, id) == 0)
            break;
    }
    if (i == studentCount)
	{
        printf("No student %s\n", id);
        return;
    }
    printf("Courses: ");
    for (int j = 0; j < courseCount; j++)          //输出课程名字 
	{
        printf(" %s", courses[j].name);
    }
    printf("\nEnter the scores:"); 
    for (int j = 0; j < courseCount; j++)          //输入更改后的成绩 
	{
        scanf("%d", &students[i].scores[j]);
    }
}

统计已经录入的学生成绩

void statisticScores()          //成绩统计 
{
    for (int j = 0; j < courseCount; j++)
	{
        printf("%s:\n", courses[j].name);

        int max = 0;
        int pos = studentCount;
        double aver = 0.0;

        for (int i = 0; i < studentCount; i++)          //比较学生成绩,找出成绩最高的学生 
		{
            aver = aver + students[i].scores[j];
            if (students[i].scores[j] > max)
			{
                max = students[i].scores[j];
                pos = i;
            }
        }
        aver /= studentCount;          //计算平均成绩 
        int count = 0;
        for (int i = 0; i < studentCount; i++)          //计算超过平均成绩的人数 
		{
            if (students[i].scores[j] > aver)
			{
                count ++;
            }
        }

        if (pos == studentCount)
		{
            printf("No student\n");
            break;
        }
		else
		{
            printf("成绩最高学生:");
            printf("  %s  %s  %d\n", students[pos].id, students[pos].name, max);
            printf("平均成绩:");
            printf("  %.2lf\n", aver);
            printf("超过平均成绩的人数:");
            printf("  %d\n", count);
        }
    }
}

四、效果展示

菜单

菜单

录入学生成绩(这里录入了6位学生的成绩,录入完毕后进行保存)

成绩录入-1
成绩录入-2
成绩录入-3

显示已经录入的学生成绩

成绩显示

保存已经录入的成绩,保存后的成绩存放在“scores.txt”文件中

成绩保存-1
成绩保存-2

按照课程将录入的成绩进行排序(分数从高到低)

成绩排序-1
成绩排序-2

修改已经录入的学生成绩

成绩修改-1
修改成绩-2

找出每个课程成绩最高的学生,统计出平均成绩和超过平均成绩的人数

成绩统计

  • 10
    点赞
  • 99
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值