C语言小项目——学生成绩管理系统

系统界面及相关要求

1)系统运行,打开如下界面。列出系统帮助菜单(即命令菜单),提示输入命令。

在这里插入图片描述

2)开始时还没有录入成绩,所以输入命令 L 也无法列出成绩。应提示“成绩表为空!请先使用命令 T 录入学生成绩。”
同理,当输入其他的成绩处理命令时也作相应的处理。
在这里插入图片描述

3)输入命令 T,调用Type子函数录入成绩。
界面提示输入学生人数

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

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

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

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

4)输入命令 L ,调用List子函数输出成绩表。List子函数调用结束,返回。提示输入命令。在这里插入图片描述

5)输入命令 A ,调用Average子函数计算平均分,提示“平均分已计算。请使用命令L查看。” Average子函数调用结束,返回。提示输入命令。
输入命令 L ,调用List子函数输出成绩表。List子函数调用结束,返回。提示输入命令。
在这里插入图片描述

6)输入命令 P ,调用Sort子函数将各学生记录按平均分由高到低排序,提示“完成排序。请使用命令L查看。” Sort子函数调用结束,返回。提示输入命令。

输入命令 L ,调用List子函数输出成绩表。List子函数调用结束,返回。提示输入命令。
在这里插入图片描述

7)输入命令 S ,调用Search子函数查询学生成绩,提示“输入要查询的学生学号”。

输入2 找到2号学生的成绩并输出。Search子函数调用结束,返回。提示输入命令。
在这里插入图片描述

8)输入命令C 执行清屏函数语句system(“clear”);

清除屏幕的所有内容。提示输入命令。
在这里插入图片描述在这里插入图片描述

9)输入命令H 调用Help子函数显示帮助菜单。Help子函数调用结束,返回。提示输入命令。
在这里插入图片描述

10)输入命令Q ,则退出系统。
在这里插入图片描述

注意:
1)输出数组元素时,要将学号单独处理,输出为整数(即保留0位小数)。同理,在计算成绩时也要将第1列的学号撇开,只计算第2列之后的。成绩保留1位小数。
2)学生人数n贯穿始终,通过n的值判断当前命令的子函数是否能够调用执行。例如:当n=0时,说明还没有录入成绩。而一旦输入命令T,也即调用Type子函数录入了成绩,则n的值就不再是0。当n!=0时,就可以进行其他的成绩操作,但不能再执行录用成绩的操作。所以当用户输入的命令无法执行时,应当给出提示。

代码

#include <stdio.h>
#include <stdlib.h>
//#include "hs.h"
struct student
{
	int id;
	float yw;
	float sx;
	float wy;
	float pj;
};
void help(void);
int type(struct student *p);
void list(struct student *p,int n);
void average(struct student *p,int n);
void search (struct student *p);
void sort(struct student *p,int n);
int main(int argc, const char *argv[])
{
	char ch;
	struct student stu[32];
	int n=0;
	while(1)
	{
		printf("请输入命令 = ");
		//getchar();
		scanf("%c",&ch);
		putchar(10);
		if(ch=='T')
		{
			n=type(stu);
		}
		else if(ch=='L')
		{
			if(n==0)
			{
				printf("成绩表为空!请先使用T录入成绩!\n");
				putchar(10);
			}
			else
				list(stu,n);
		}
		else if(ch=='A')
		{
			if(n==0)
			{
				printf("成绩表为空!请先使用T录入成绩!\n");
				putchar(10);
			}
			else
			{
				average(stu,n);
				printf("平均分已计算,请使用命令L查看!\n");
				putchar(10);
			}
		}
		else if(ch=='H')
			help();
		else if(ch=='C')
			system("clear");
		else if(ch=='S')
		{
			if(n==0)
			{
				printf("成绩表为空!请先使用T录入成绩!\n");
				putchar(10);
			}
			else
			{
				search(stu);
				putchar(10);
			}
		}
		else if(ch=='P')
		{
			if(n==0)
			{
				printf("成绩表为空!请先使用T录入成绩!\n");
				putchar(10);
			}
			else
			{
				sort(stu,n);
				putchar(10);
			}
		}
		else if(ch=='Q')
		{
			printf("Press any key to continue!\n");
			return -1;
		}
		getchar();
	}
	return 0;
}
int type(struct student *p)
{
	int n=0;
	printf("请输入学生人数:");
	scanf("%d",&n);
	printf("请输入学生三门课的成绩:\n");
	printf("学号 语文 数学 外语\n");
	for(int i=0;i<n;i++)
	{
		printf("%d    ",i+1);
		struct student stu[i];
		scanf("%f %f %f",&(p+i)->yw,&(p+i)->sx,&(p+i)->wy);
	}
	return n;
}
void list(struct student *p,int n)
{
	printf("学生成绩如下:\n");
	printf("学号 语文 数学 外语 平均分\n");
	for(int i=0;i<n;i++)
	{
		printf("%d    ",i+1);
		printf("%.1f %.1f %.1f %.1f",p->yw,p->sx,p->wy,p->pj);
		p++;
		putchar(10);
	}
}
void average(struct student *p,int n)
{
	for(int i=0;i<n;i++)
	{
		(p->pj)=((p->yw)+(p->sx)+(p->wy))/3;
		p++;
	}
}
void help(void)
{
	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) 2022.3.15 By liq* \n");
	printf("**********************************\n");
}
void search(struct student *p)
{
	int s=0;
	printf("请输入要查询的学生号:");
	scanf("%d",&s);
	printf("学号 语文 数学 外语 平均分\n");
	printf("%d   %.1f  %.1f  %.1f  %.1f",s,(p+s-1)->yw,(p+s-1)->sx,(p+s-1)->wy,(p+s-1)->pj);
	putchar(10);
}
void sort(struct student *p,int n)
{
	struct student temp;
	int i,j;
	for(i=0;i<n;i++)
	{
		for(j=0;j<n-i-1;j++)
		{
			if(p[j].pj<p[j+1].pj)
			{
				temp=p[j];
				p[j]=p[j+1];
				p[j+1]=temp;
			}
		}
	}
	printf("排序完成,请使用命令L查看!\n");
}

注意

如需要分文件编写。
只需要将上述代码的函数部分拿出来,新建两个个文件:fun.c、fun.h。其中fun.c文件用来存放上述代码的结构体声明以及函数部分(加上相应的头文件)。fun.h用来存放结构体声明以及函数声明(加上相应的头文件)。
在主函数中要加上对应的头文件:#include “fun.h”(双引号,不是<>)。
编译的时候需要将主函数以及新建的fun.c文件一起编译,运行还是同之前一样,用./a.out运行即可。
具体如下图所示:
1.新建两个文件(同名,不同后缀),编译并运行(需要多文件同时编译)。
在这里插入图片描述

2.hs.c存放结构体声明及对应的函数(这里面的函数还可以拆分成其他的文件,这里我就不拆分了)。

#include <stdio.h>
#include <stdlib.h>
struct student
{
	int id;
	float yw;
	float sx;
	float wy;
	float pj;
};
int type(struct student *p)
{
	int n=0;
	printf("请输入学生人数:");
	scanf("%d",&n);
	putchar(10);
	printf("请输入学生三门课的成绩:\n");
	putchar(10);
	printf("学号 语文 数学 外语\n");
	for(int i=0;i<n;i++)
	{
		printf("%d    ",i+1);
		struct student stu[i];
		scanf("%f %f %f",&(p+i)->yw,&(p+i)->sx,&(p+i)->wy);
	}
	putchar(10);
	return n;
}
void list(struct student *p,int n)
{
	printf("学生成绩如下:\n");
	printf("学号 语文 数学 外语 平均分\n");
	for(int i=0;i<n;i++)
	{
		printf("%d    ",i+1);
		printf("%.1f %.1f %.1f %.1f",p->yw,p->sx,p->wy,p->pj);
		p++;
		putchar(10);
	}
	putchar(10);
}
void average(struct student *p,int n)
{
	for(int i=0;i<n;i++)
	{
		(p->pj)=((p->yw)+(p->sx)+(p->wy))/3;
		p++;
	}
}
void help(void)
{
	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) 2022.3.15 By liq* \n");
	printf("**********************************\n");
}
void search(struct student *p)
{
	int s=0;
	printf("请输入要查询的学生号:");
	scanf("%d",&s);
	putchar(10);
	printf("学号 语文 数学 外语 平均分\n");
	printf("%d   %.1f  %.1f  %.1f  %.1f",s,(p+s-1)->yw,(p+s-1)->sx,(p+s-1)->wy,(p+s-1)->pj);
	putchar(10);
}
void sort(struct student *p,int n)
{
	struct student temp;
	int i,j;
	for(i=0;i<n;i++)
	{
		for(j=0;j<n-i-1;j++)
		{
			if(p[j].pj<p[j+1].pj)
			{
				temp=p[j];
				p[j]=p[j+1];
				p[j+1]=temp;
			}
		}
	}
	printf("排序完成,请使用命令L查看!\n");
}

3.hs.h存放结构体声明以及hs.c里面函数对应的函数声明。

#include <stdio.h>
#include <stdlib.h>
struct student
{
	int id;
	float yw;
	float sx;
	float wy;
	float pj;
};
int type(struct student *p);
void list(struct student *p,int n);
void average(struct student *p,int n);
void help(void);
void search(struct student *p);
void sort(struct student *p,int n);

4.main函数

#include <stdio.h>
#include <stdlib.h>
#include "hs.h"
int main(int argc, const char *argv[])
{
	char ch;
	struct student stu[32];
	int n=0;
	while(1)
	{
		printf("请输入命令 = ");
		scanf("%c",&ch);
		putchar(10);
		if(ch=='T')
		{
			n=type(stu);
		}
		else if(ch=='L')
		{
			if(n==0)
			{
				printf("成绩表为空!请先使用T录入成绩!\n");
				putchar(10);
			}
			else
				list(stu,n);
		}
		else if(ch=='A')
		{
			if(n==0)
			{
				printf("成绩表为空!请先使用T录入成绩!\n");
				putchar(10);
			}
			else
			{
				average(stu,n);
				printf("平均分已计算,请使用命令L查看!\n");
				putchar(10);
			}
		}
		else if(ch=='H')
			help();
		else if(ch=='C')
			system("clear");
		else if(ch=='S')
		{
			if(n==0)
			{
				printf("成绩表为空!请先使用T录入成绩!\n");
				putchar(10);
			}
			else
			{
				search(stu);
				putchar(10);
			}
		}
		else if(ch=='P')
		{
			if(n==0)
			{
				printf("成绩表为空!请先使用T录入成绩!\n");
				putchar(10);
			}
			else
			{
				sort(stu,n);
				putchar(10);
			}
		}
		else if(ch=='Q')
		{
			printf("Press any key to continue!\n");
			return -1;
		}
		getchar();
	}
	return 0;
}
  • 5
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值