利用指针写一份学生信息管理系统


前言

因为自己学校实验室考核C语言要求写一份学生信息管理系统,当然是简易的那种,话不多说先上题目一个简单的题目


提示:以下是本篇文章正文内容,下面案例可供参考

一、分析题目

要求有一个菜单栏,可以考虑创建一个menu函数。

要求
到目前为止的要求都还挺容易的,根据要求,创建相应的Function函数就行了
注意

其实我认为注意事项1,2才是本程序的难点之处,一开始的想法是再创建一个函数来专门判断是否进行了程序录入,但是在却卡在了switch,于是我觉得先给二维数组的第一个数赋值为101,通过判断它是否为101来判断是否录入

grade[0][0]=101;

而二维数组在引用它时增加了一定难度,不过还好

二、解决步骤

1.菜单栏

代码如下:

void menu()
{
	printf("\n*******************学生成绩综合管理系统***************\n");
	printf("		1 成绩录入\n");
	printf("		2 计算平均分\n");
	printf("		3 计算最高分\n");
	printf("		4 成绩排序\n");
	printf("		5 退出\n");
	printf("*******************************************************\n");
}

2.功能1

这里我直接用for语句实现了数据的录入,用if实现判断是否为0~100

代码如下:

int Function_One()
{
	int a,b;
	grade_p=grade[0];
	printf("Function_One....\n");
	printf("直接按照顺序写下这20个成绩\n");
	for(a=0;a<4;a++)
		for(b=0;b<5;b++)
		{
			scanf("%d",&grade[a][b]);
/*判断成绩是否为0~100*/
			if(*(grade_p+a*5+b)>100||*(grade_p+a*5+b)<0)
			{
				printf("成绩应为0~100之间的数值\n");
				b--;//如果不是,重新输入并覆盖刚刚的成绩
				if(b<0)/*这一步就是为了使指针能够重新指向上一个地址
						其实如果直接用grade_p++这里就能直接写它--,
						但是这样容易出错,我还是选择了*(grade_p+a*5+b)
						这种方式*/
				{
					b=4;
					a--;
					if(a<0)
					{
						a=0;
					}
				}
			}
		}
		printf("成绩成功录入!\n");
}

3.功能2

代码如下:

int Function_Two()
{	
	int a,b;
	float c,d;
	grade_p=grade[0];
	c=0;
	printf("Function_Two....\n");
	printf("正在计算平均数\n");
	for(a=0;a<4;a++)/*这里也没什么难处,进行20次相加就直接除以20*/
		for(b=0;b<5;b++)
		{
			c=c+*(grade_p+a*5+b);	
		}
		d=c/20;
	printf("平均数为%.2f\n",d);/*对数进行修饰 %.2f 修饰成保留两位小数*/
}

4.功能3

代码如下:

int Function_Three()
{
	int m,a,b;
	grade_p=grade[0];
	for(a=0;a<4;a++)/*同样的,进行20次判断,有更大的就赋值给m*/
		for(b=0;b<5;b++)
		{
			if(m<*(grade_p+a*5+b))
			{
				m=*(grade_p+a*5+b);
			}
		}
	printf("最大值为%d\n",m);
}

5.功能4

代码如下:

/*这段代码我是改了又改,最后发现大循环得用20次,小循环得用
19次,数学很重要/doge哈哈*/
int Function_Four()
{
	int grade1[20];
	int *grade1_p=grade1;
	int m,a,b,n,x;
	grade_p=grade[0];
	m=0;
	for(a=0;a<4;a++)/*二维数组实在是太难写了
					这里将它重新改为一维数组进行运算*/
		for(b=0;b<5;b++,m++)
		{
			*(grade1_p+m)=*(grade_p+a*5+b);
			
		}

	for(m=0;m<20;m++)/*就是这个地方,是将每个数进行20次判断,才能得到
						最终的排位顺序*/
	{	
		for(x=0;x<19;x++)
		{
			if (*(grade1_p+x)<*(grade1_p+x+1))
			{
				n=*(grade1_p+x+1);
				*(grade1_p+x+1)=*(grade1_p+x);
				*(grade1_p+x)=n;
			}
		}
	}

	for(m=0;m<20;m++)
		{
			printf("%d\n",*(grade1_p+m));
		}
}

6.功能5

代码如下:

int Function_Five()
{
	printf("正在退出系统……\n");
	exit(0);
}

7.主函数

代码如下:

int main()
{
	int t,x;
	int *t_p=&t;
	grade[0][0]=101;
	grade_p=grade[0];
	for(x=0;x<13;x++)
		printf("%c",*(a_p+x));
	while(1)
	{
		menu();
		printf("选择:");
		scanf("%d",t_p);
		switch(*t_p)
		{
		case 1:
			Function_One();
			break;
		case 2:
			if(grade[0][0]==101)
			{
				printf("请先输入成绩~\n");
			}
			else Function_Two();
			break;
		case 3:
			if(grade[0][0]==101)
			{
				printf("请先输入成绩~\n");
			}
			else Function_Three();
			break;
		case 4:
			if(grade[0][0]==101)
			{
				printf("请先输入成绩~\n");
			}
			else Function_Four();
			break;
		case 5:
			Function_Five();
			break;
		default:
			printf("输入错误\n");
			break;
		}
	
	}

}

包涵的头文件为

#include "stdio.h"
#include "stdlib.h"

使用的全局变量有

int grade[4][5];
int *grade_p=grade[0];

char a[13]={64,82,97,105,108,103,117,110,66,111,111,109,126};
char *a_p=a;

总结

以上就是今天要讲的内容,本文仅仅简单介绍了本题目该如何解决,大家可以举一反三运用到其他地方。

欢迎大家关注我
微信公众号:小白写编程
交流群:1033131250

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值