学生成绩管理系统——C语言版(含源码)

发抖的葫芦娃Zz 2024-07-02 11:05:02 阅读 61

一、开发环境

操作系统:Ununtu 16 开发环境工具:vscode 开发语言:C语言

二、功能需求

制作学生管理系统

在系统中能够实现 录入学生信息、帮助菜单、列出学生信息、计算总成绩平均值、根据总成绩平均值完成排序、根据学号查询学生信息、清屏、退出等功能。

三、功能说明

系统运行:列出系统帮助菜单(即命令菜单),提示输入命令。

( 开始时还没有录入成绩,所以输入命令 L 也无法列出成绩。应提示“成绩表为空!请先使用命 令 T 录入学生成绩。”)

录入成绩:输入命令 T,录入成绩,界面提示输入学生人数。

列出成绩表:输入命令 L,输出成绩表。

计算平均分:输入命令 A,计算平均分,用命令L查看。

按平均分排序:输入命令 P,完成排序,使用命令L查看。

查询学生成绩:根据学号查询该学生信息。

清屏:输入指令C,清屏。

帮助菜单:输入指令H,调出帮助菜单。

退出系统:输入指令Q,退出系统。

四、构造算法架构

1.构造功能框架

主函数

#include <stdio.h>

#include <stdlib.h>

struct student

{

int id; //学号

float b; //语文

float c; //数学

float d; //外语

float e; //平均成绩

}stu[32];

//函数声明

int Type(struct student *p);

void List(struct student *p, int n);

void Average(struct student *p, int n);

void Sort(struct student *p, int n);

void Search(struct student *p, int n);

void Help();

int main(int argc, char const *argv[])

{

Help ();

char ch;

int n = 0; //学生人数

//struct student stu[32];

while (1)

{

printf("请输入命令=");

scanf("%c", &ch);

//getchar();

if (ch == 'T')

n = Type(stu);

else if (ch == 'L')

{

if (n == 0)

printf("成绩列表为空!请先使用命令T录入学生系统\n");

else

List(stu, n);

}

else if (ch == 'A')

{

if (n == 0)

printf("成绩列表为空!请先使用命令T录入学生系统\n");

else

Average(stu, n);

}

else if (ch == 'P')

{

if (n == 0)

printf("成绩列表为空!请先使用命令T录入学生系统\n");

else

Sort(stu, n);

}

else if (ch == 'S')

{

if (n == 0)

printf("成绩列表为空!请先使用命令T录入学生系统\n");

else

Search(stu, n);

}

else if (ch == 'C')

system("clear");

else if (ch == 'H')

Help();

else if (ch == 'Q')

break;

getchar();

}

return 0;

}

2.设计系统菜单

void Help() //帮助菜单

{

printf("*********************************************\n");

printf("* 学生成绩管理系统—— ——帮助菜单 *\n");

printf("*********************************************\n");

printf("* H = 显示帮助菜单 *\n");

printf("* T = 成绩录入 *\n");

printf("* A = 计算学生平均分 *\n");

printf("* L = 列出成绩表 *\n");

printf("* P = 按平均成绩由高到低排序 *\n");

printf("* S = 按学号查询学生成绩 *\n");

printf("* C = 清屏 *\n");

printf("* Q = 退出系统 *\n");

printf("*********************************************\n");

printf("* Copyright <C> 2023.02.03 By xushaowei *\n");

printf("*********************************************\n");

}

运行结果

五、在框架的基础上实现各个功能

调用Type子函数 录入成绩

(1)代码如下

int Type(struct student *p) //输入成绩

{

int i, n = 0;

printf("请输入学生人数\n");

scanf("%d", &n);

printf("请输入%d个学生3门课的成绩\n", n);

printf("学号 语文 数学 外语\n");

for (i = 0; i < n; i++)

{

printf(" %d ", i + 1);

(p + i)->id = i + 1;

scanf("%f %f %f", &(p + i)->b, &(p + i)->c, &(p + i)->d);

}

return n;

}

(2)运行结果

成绩输入 输入命令T,界面提示输入学生人数。

输入3 提示输入3名学生的3门课成绩,列出成绩单的表头“学号 语文 数学 英语”,提示学号:1 。

输入1号学生的3门课成绩,用空格间隔,回车结束。提示学号:2 。

输入2号学生的3门课成绩,用空格间隔,回车结束。提示学号:3 。

输入3号学生的3门课成绩,用空格间隔,回车结束。Type子函数调用结束,返回。提示输入命令。

调用List 函数 输出成绩表

(1)代码如下

void List(struct student *p, int n) //列出成绩

{

printf("学生成绩如下\n");

printf("学号 语文 数学 外语 平均分\n");

for (int i = 0; i < n; i++)

{

printf("%d %.1f %.1f %.1f %.1f", (p + i)->id, (p + i)->b, (p + i)->c, (p + i)->d, (p + i)->e);

putchar(10);

}

putchar(10);

}

(2)运行结果

输入命令 L ,调用List子函数输出成绩表。List子函数调用结束,返回。提示输入命令。

调用Average子函数计算平均分

(1)代码如下

void Average(struct student *p, int n) //计算成绩平均值

{

int i;

for (i = 0; i < n; i++)

{

(p + i)->e = ((p + i)->b + (p + i)->c + (p + i)->d) / 3;

}

printf("平均成绩已计算请使用命令 L 查看\n");

}

(2)运行结果

输入命令 A,提示“平均分已计算。请使用命令L查看。” Average子函数调用结束,返回。提示输入命令。

输入命令 L ,调用List子函数输出成绩表。List子函数调用结束,返回。提示输入命令。

4. 调用Sort子函数将各学生记录按平均分由高到低排序

(1)代码如下

void Sort(struct student *p, int n) //将学生成绩按高低排序 冒泡排序

{

struct student t; //中间交换结构体变量

int i, j;

for (i = 0; i < n; i++) //冒泡排序

{

for (j = 0; j < n - i - 1; j++)

{

if ((p + j)->e < (p + j + 1)->e)

{

t = p[j];

p[j] = p[j + 1];

p[j + 1] = t;

}

}

}

printf("完成排序,请使用命令L查看\n");

}

(2)运行结果

输入命令 P,提示“完成排序。请使用命令L查看。” Sort子函数调用结束,返回。提示输入命令。

输入命令 L ,调用List子函数输出成绩表。List子函数调用结束,返回。提示输入命令。

5.调用Search子函数查询学生成绩

(1)代码如下

void Search(struct student *p, int n) //根据学号查询学生信息

{

int a = 0;

printf("请输入要查询的学号\n");

scanf("%d", &a);

printf("学号 语文 数学 外语 平均分\n");

for (int i = 0; i < n; i++)

{

if ((p + i)->id == a)

{

printf("%d %.1f %.1f %.1f %.1f", (p + i)->id, (p + i)->b, (p + i)->c, (p + i)->d, (p + i)->e);

}

}

putchar(10);

}

(2)运行结果

输入命令 S,提示“输入要查询的学生学号”。

输入2找到2号学生的成绩并输出。Search子函数调用结束,返回。提示输入命令。

6.调用Help子函数显示帮助菜单

(1)代码如下

void Help() //帮助菜单

{

printf("*********************************************\n");

printf("* 学生成绩管理系统—— ——帮助菜单 *\n");

printf("*********************************************\n");

printf("* H = 显示帮助菜单 *\n");

printf("* T = 成绩录入 *\n");

printf("* A = 计算学生平均分 *\n");

printf("* L = 列出成绩表 *\n");

printf("* P = 按平均成绩由高到低排序 *\n");

printf("* S = 按学号查询学生成绩 *\n");

printf("* C = 清屏 *\n");

printf("* Q = 退出系统 *\n");

printf("*********************************************\n");

printf("* Copyright <C> 2023.02.03 By xsw *\n");

printf("*********************************************\n");

}

(2)运行结果

输入命令H,调用Help子函数,调用结束返回。提示输入命令。

7.清屏功能

由于系统库自带清屏功能,直接调用#include <stdlib.h>库即可

(1)代码在main中

else if (ch == 'C')

system("clear");

(2)运行结果

输入命令C,执行清屏函数语句system("clear");清除屏幕的所有内容。提示输入命令。

8退出系统

利用break退出整个程序

(1)代码如下

else if (ch == 'Q')

break;

(2)运行结果

输入命令Q,则退出系统

六、源代码

#include <stdio.h>

#include <stdlib.h>

struct student

{

int id; //学号

float b; //语文

float c; //数学

float d; //外语

float e; //平均成绩

}stu[32];

int Type(struct student *p);

void List(struct student *p, int n);

void Average(struct student *p, int n);

void Sort(struct student *p, int n);

void Search(struct student *p, int n);

void Help();

int main(int argc, char const *argv[])

{

Help ();

char ch;

int n = 0; //学生人数

//struct student stu[32];

while (1)

{

printf("请输入命令=");

scanf("%c", &ch);

//getchar();

if (ch == 'T')

n = Type(stu);

else if (ch == 'L')

{

if (n == 0)

printf("成绩列表为空!请先使用命令T录入学生系统\n");

else

List(stu, n);

}

else if (ch == 'A')

{

if (n == 0)

printf("成绩列表为空!请先使用命令T录入学生系统\n");

else

Average(stu, n);

}

else if (ch == 'P')

{

if (n == 0)

printf("成绩列表为空!请先使用命令T录入学生系统\n");

else

Sort(stu, n);

}

else if (ch == 'S')

{

if (n == 0)

printf("成绩列表为空!请先使用命令T录入学生系统\n");

else

Search(stu, n);

}

else if (ch == 'C')

system("clear");

else if (ch == 'H')

Help();

else if (ch == 'Q')

break;

getchar();

}

return 0;

}

int Type(struct student *p) //输入成绩

{

int i, n = 0;

printf("请输入学生人数\n");

scanf("%d", &n);

printf("请输入%d个学生3门课的成绩\n", n);

printf("学号 语文 数学 外语\n");

for (i = 0; i < n; i++)

{

printf(" %d ", i + 1);

(p + i)->id = i + 1;

scanf("%f %f %f", &(p + i)->b, &(p + i)->c, &(p + i)->d);

}

return n;

}

void List(struct student *p, int n) //列出成绩

{

printf("学生成绩如下\n");

printf("学号 语文 数学 外语 平均分\n");

for (int i = 0; i < n; i++)

{

printf("%d %.1f %.1f %.1f %.1f", (p + i)->id, (p + i)->b, (p + i)->c, (p + i)->d, (p + i)->e);

putchar(10);

}

putchar(10);

}

void Average(struct student *p, int n) //计算成绩平均值

{

int i;

for (i = 0; i < n; i++)

{

(p + i)->e = ((p + i)->b + (p + i)->c + (p + i)->d) / 3;

}

printf("平均成绩已计算请使用命令 L 查看\n");

}

void Sort(struct student *p, int n) //将学生成绩按高低排序 冒泡排序

{

struct student t; //中间交换结构体变量

int i, j;

for (i = 0; i < n; i++)

{

for (j = 0; j < n - i - 1; j++)

{

if ((p + j)->e < (p + j + 1)->e)

{

t = p[j];

p[j] = p[j + 1];

p[j + 1] = t;

}

}

}

printf("完成排序,请使用命令L查看\n");

}

void Search(struct student *p, int n) //根据学号查询学生信息

{

int a = 0;

printf("请输入要查询的学号\n");

scanf("%d", &a);

printf("学号 语文 数学 外语 平均分\n");

for (int i = 0; i < n; i++)

{

if ((p + i)->id == a)

{

printf("%d %.1f %.1f %.1f %.1f", (p + i)->id, (p + i)->b, (p + i)->c, (p + i)->d, (p + i)->e);

}

}

putchar(10);

}

void Help() //帮助菜单

{

printf("*********************************************\n");

printf("* 学生成绩管理系统—— ——帮助菜单 *\n");

printf("*********************************************\n");

printf("* H = 显示帮助菜单 *\n");

printf("* T = 成绩录入 *\n");

printf("* A = 计算学生平均分 *\n");

printf("* L = 列出成绩表 *\n");

printf("* P = 按平均成绩由高到低排序 *\n");

printf("* S = 按学号查询学生成绩 *\n");

printf("* C = 清屏 *\n");

printf("* Q = 退出系统 *\n");

printf("*********************************************\n");

printf("* Copyright <C> 2023.02.03 By xsw *\n");

printf("*********************************************\n");

}

七、总结

在制作学生管理系统时,学生人数n贯穿始终,通过n的值判断当前命令的子函数是否能够调用执行。输出数组元素时,要将学号单独处理,输出为整数(即保留0位小数)。同理,在计算成绩时也要将第1列的学号撇开,只计算第2列之后的。成绩保留1位小数。各项功能的实现一定要在心中有一个大概的流程,然后再使用C语言进行编译,要理解各种函数的作用和意义,这样帮助我们更好的制作出想要的系统。



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。