小试牛刀|利用C语言编程学生成绩管理系统

目录

一、概要分析

1、需求分析

2、系统功能

二、模型设计

三、模块设计

1、ScoreManageMain.cpp文件

2、Menu.cpp文件

3、Menu.h文件

4、ScoreManager.cpp文件

5、ScoreManager.h文件

四、数据预测

五、总结思考

1、结果分析

2、思路梳理

3、深入研究


一、概要分析

1、需求分析

由于进入了信息化时代,如何更有效地对学生的成绩进行管理显得越来越重要。为了更好地对学生成绩进行管理,编写了本次系统,利用c语言完成输入录入、数据显示、数据删除、数据排序、数据保存、数据调入功能,极大地便利了教师对学生成绩的管理。

2、系统功能

可实现数据录入、数据显示、数据删除、数据排序、数据保存、数据调入。

二、模型设计

 

三、模块设计

1、ScoreManageMain.cpp文件

#define _CRT_SECURE_NO_WARNINGS 1

#include<stdlib.h>
#include<stdio.h>
#include"Menu.h"
#include"Score.h"
#include"ScoreManager.h"

#define N 40

主模块main()

①模块功能:通过调用菜单模块选择对应的程序执行。

②输入输出:

 

形式:int main()

归属:ScoreManageMain

③解决思路:先调用菜单模块输出菜单,然后输入数据选择对应程序,最后调用程序所对应的自定义模块。

④算法步骤:

⑤模块代码:

int main()
{
	Score s[N];
	int num = 0;

	while (1)
	{
		switch (createMenu())
		{
		case 1:inputScore(s, N, &num); break;
		case 2:displayScore(s, N, num); break;
		case 3:delScore(s, N, &num); break;
		case 4:sortScore(s, N, num); break;
		case 5:saveScore(s, N, num); break;
		case 6:loadScore(s, N,&num); break;
		case 7:exit(0);
		default:printf("输入错误\n");
		}
	}

	return 0;
}

2、Menu.cpp文件

#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>

自定义模块createMenu

①模块功能:显示菜单界面,并返回所选择的功能编号。

②输入输出:

③解决思路:首先利用printf显示出对应界面,输入序号后返回输入的序号。

④算法步骤:

第一步:显示出程序界面。

第二步:输入选择程序的序号。

第三步:返回所选择的序号值。

⑤模块代码:

int createMenu()
{
	int input;

	printf("     欢迎进入学生成绩管理系统\n");
	printf("1数据输入              2数据显示\n");
	printf("3数据删除              4数据排序\n");
	printf("5数据保存              6数据调入\n");
	printf("7退出系统\n");
	printf("请选择功能号(1,2,3,4,5,6,7)\n");
	scanf("%d", &input);

	return input;
}

3、Menu.h文件

#ifndef Menu_h
#define Menu_h

int createMenu();

#endif

4、ScoreManager.cpp文件

#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>
#include<string.h>
#include<errno.h>
#include"Score.h"

(1)自定义模块inputScore

①模块功能:录入成绩。

②输入输出:

 

形式:void inputScore(Score *psc, int n,int *pnum)

归属:ScoreManager

③解决思路:利用死循环不断输入数据,当输入-1或数组存放满时停止。

④算法步骤:

⑤模块代码:

void inputScore(Score *psc, int n,int *pnum)
{
	if (*pnum == n)
	{
		printf("对不起,人数已满");
	}
	else
	{
		while (1)
		{
			int input;
			printf("请输入第%d个学号、成绩、姓名(-1停止输入):", *pnum + 1);
			scanf("%d", &input);
			if (input == -1)
			{
				break;
			}
			else
			{
				scanf("%f%s", &psc[*pnum].score, &psc[*pnum].name);
				psc[*pnum].no = input;
			}
			(*pnum)++;
		}
	}
}

(2)自定义模块 displayScore

①模块功能:显示成绩。

②输入输出:

③解决思路:利用for循环,有显示所有已存入的数据,即需要循环n次,循环次数小于n为循环条件。每次都显示次数所对应的数据值。

④算法步骤:

⑤模块代码:

void displayScore(Score* psc, int n, int num)
{
	printf("\t学生的分数显示结果如下:\n");
	printf("\t***********************\n");
	printf("\t学号\t分数\t姓名\n");

	for (int i = 0; i < num; i++)
	{
		printf("\t%d\t%.2f\t%s\n", psc[i].no, psc[i].score, psc[i].name);
	}

	float sum = 0;

	for (int i = 0; i < num; i++)
	{
		sum = sum + psc[i].score;
	}

	printf("\t班级平均分:%.2f\n", sum / num);
	printf("\t学生分数显示结束\n");
}

(3)自定义模块 delScore

①模块功能:删除所选序号的数据。

②输入输出:

③解决思路:通过利用循环,将目标数据之后的数据前移完成。

④算法步骤:

⑤模块代码:

void delScore(Score* psc, int n, int* pnum)
{
	int No;
	char choice;
	int k;
	
	while (getchar(),printf("还要删除数据吗?(y/n)\n"),scanf("%c", &choice), choice == 'y')
	{
		printf("请输入要删除信息的学号>");
		scanf("%d", &No);
		for (k = 1; k <= *pnum; k++)
		{
			if (psc->no == No);
			{
				break;
			}
		}
		for (int i = k; i <= *pnum; i++)
		{
			psc[i] = psc[i+1];
		}
		
		(*pnum)--;
	}
}

(4)自定义模块sortScore

①模块功能:对输入数据进行排序。

②输入输出:

③解决思路:比较相邻数字的大小,大的沉下去,小的浮上来,每轮都保证最大数在最后。

④算法步骤:

⑤模块代码:

void sortScore(Score* psc, int n,int num)
{
	for (int i = 1; i < num; i++)
	{
		for (int j = 0; j < num - i; j++)
		{
			if (psc[j].score > psc[j + 1].score)
			{
				Score tmp;
				tmp = psc[j];
				psc[j] = psc[j + 1];
				psc[j + 1] = tmp;
			}
		}
	}
	printf("排序成功\n");
}

(5)自定义模块saveScore

①模块功能:输入数据到文件中。

②输入输出:

③解决思路:使用文件操作函数。

④算法步骤:

第一步:定义文件指针;

第二步:打开文件,关联文件指针;

第三步:输入数据;

第四步:关闭文件

⑤模块代码:

void saveScore(Score* psc, int n, int num)
{
	FILE* pWrite = fopen("score.txt","wb");
	if (pWrite == NULL)//打开失败
	{
		printf("%s\n", strerror(errno));
	}
	else//打开成功
	{
		int i = 0;
		fwrite((void*)psc, sizeof(struct Score), num, pWrite);
		fclose(pWrite);//关闭文件
		pWrite = NULL;
	}
}

(6)自定义模块loadScore

①模块功能:读取数据到结构体数组中。

②输入输出:

③解决思路:使用文件操作函数。

④算法步骤:

第一步:定义文件指针;

第二步:打开文件,关联文件指针;

第三步:利用循环读取数据;

第四步:关闭文件

⑤模块代码:

void loadScore(Score* psc, int n, int* pnum)
{
	FILE* pRead = fopen("score.txt", "rb");
	if (pRead == NULL)//打开失败
	{
		printf("%s\n", strerror(errno));
	}
	else//打开成功
	{
		int i = 0;
		while (1)
		{
			if (fread((void*)&psc[i], sizeof(struct Score), 1, pRead) != 1)
			{
				break;
			}
			i++;
		}
		*pnum = i;
		fclose(pRead);//关闭文件
		pRead = NULL;
	}
}

5、ScoreManager.h文件

#pragma once
#ifndef ScoreManager_h
#define ScoreManager_h

void inputScore(Score* psc, int n, int* pnum);
void displayScore(Score* psc, int n, int num);
void delScore(Score* psc, int n, int* pnum);
void sortScore(Score* psc, int n, int num);
void saveScore(Score* psc, int n, int num);
void loadScore(Score* psc, int n, int* pnum);

#endif

四、数据预测

输入学号、成绩和姓名1024 88 zhangshan1025 54 lisi1026 66 wanwu

显示学号、成绩和姓名1024 88 zhangshan1025 54 lisi1026 66 wanwu

排序后显示学号、成绩和姓名1025 54 lisi1026 66 wanwu1024 88 zhangshan

再删除1025后显示数据 1026 66 wanwu1024 88 zhangshan

保存数据、读取数据后显示1026 66 wanwu1024 88 zhangshan

五、总结思考

1、结果分析

结果与预测相符合,达到预期效果,程序正确。

2、思路梳理

一:启动菜单界面。

二:输入一个整数选择功能

三:通过switch进入所选择的功能模块,调用对应的自定义模块。

3、深入研究

每次录入完数据都需要而外选择数据保存,这样的操作步骤有些繁琐,可以将数据保存添加进数据录入模块,使得操作变得便捷。

直接在输入模块的最后调用数据保存模块即可,代码如下:

void inputScore(Score *psc, int n,int *pnum)
{
	if (*pnum == n)
	{
		printf("对不起,人数已满");
	}
	else
	{
		while (1)
		{
			int input;
			printf("请输入第%d个学号、成绩、姓名(-1停止输入):", *pnum + 1);
			scanf("%d", &input);
			if (input == -1)
			{
				break;
			}
			else
			{
				scanf("%f%s", &psc[*pnum].score, &psc[*pnum].name);
				psc[*pnum].no = input;
			}
			(*pnum)++;
		}
		saveScore(psc, n, *pnum);
	}
}

 

  • 9
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

树獭想吃饭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值