成绩管理系统(C语言)完整代码,纯C的练手程序-创新互联

纯C语言的练习程序,完全不涉及其它方面的知识
  • 注释详细,代码完整,编译执行环境为vs2017社区版
  1. 源代码 main.c
#define _CRT_SECURE_NO_DEPRECATE//WARNINGS,为了使用经典输入输出函数所需的声明
#include#include//为了使用自己定义的头文件,如果没有自定义头文件,可以不写这一句
#include"ownfunctions.h"//导入自己的头文件
#define length 30//班级的学生数量,当实际需要时随时更改

typedef struct student//学生节点定义
{char num[10];//以字符串的形式存储学号
	char name[10];//存储学生的姓名
	int math;//数学成绩
	int pro;//专业课成绩
	int tag;//tag=0表示该学生信息无效,=1表示有效 
}Stu;//用Stu 代替 struct student

void addStu(Stu *class);
void delStu(Stu *class, int j);
void changeStu(Stu *class, int j);
void showStu(Stu *class, int j);
int findStu(Stu *class ,int k);//返回class中第k个有效的学生下标
int length_of_class(Stu *class);//返回class的有效学生数

int main(void)
{welcome();//打印出欢迎页面
	showmenu();//展示菜单选项
	Stu class[length];//创建班级数组
	int i;
	for (i = 0; i< length; i++)//置学生位为“无效” 
	{class[i].tag = 0;//tag = 0表示无效,tag =1 表示有效
	}

	int key;
	key = menu();//调用菜单功能选择函数
	int j;//用来标记需要删除或展示的学生是班级排位中的第几个学生
	while (key)//在key不为0时,一直循环执行菜单功能
	{switch (key)
		{case 1:printf("its menu1 :增加一个学生的信息\n");
			addStu(class);//班级未满时,向第一个tag=0的位置增加一个学生
			break;
		case 2:printf("its menu2 :删除一个学生的信息\n");
			j = getstu(); //选择第j个学生
			delStu(class, j); //当选择的j合理时,令该位置的学生信息无效
			break;
		case 3:printf("its menu3 :修改一个学生的信息\n");
			j = getstu();
			changeStu(class, j);//当选择的j合理时,修改该学生的信息
			break;
		case 4:printf("its menu4 :展示学生信息\n");
			j = choosemenu();//从函数获得菜单选项,1或者2
			showStu(class, j);//j=1时展示全部学生信息,j=2选择展示某一个学生的信息
			break;
		default:break;
		}
		showmenu();//再次显示菜单
		key = menu();
	}
	_exit();
	return 0;
}

//以下为自定义函数部分
void addStu(Stu *class)
{int i = 0;
	while (class[i].tag == 1 && i< length)
		i++;//寻找第一个tag 不为1 的i
	if (i == length)
	{printf("班级已满,添加失败\n");
		return;
	}

	//以下为输入学生信息功能
	class[i].tag = 1;

	printf("输入第%d个学生的名字\n", i + 1);
	scanf("%s", class[i].name);
	printf("输入第%d个学生的学号\n", i + 1);
	scanf("%s", class[i].num);
	printf("输入第%d个学生的数学成绩\n", i + 1);
	scanf("%d", &class[i].math);
	printf("输入第%d个学生的专业成绩\n", i + 1);
	scanf("%d", &class[i].pro);
	//展示刚输入的学生信息
	printf("\n第%d个学生的名字是%s\n", i + 1, class[i].name);
	printf("第%d个学生的学号是%s\n", i + 1, class[i].num);
	printf("第%d个学生的数学成绩是%d\n", i + 1, class[i].math);
	printf("第%d个学生的专业成绩是%d\n\n", i + 1, class[i].pro);
	printf("第%d个学生的信息已录入\n", i + 1);
}

void delStu(Stu *class, int j)
{int a;
	a = length_of_class(class);
	if (j >a || j< 1)//在此处判断j是否合理
	{printf("您选择的学生不合理,返回上一级菜单\n");
		return;
	}
	int i = findStu(class,j);//找到第j个tag=1的学生
	//先展示第j个学生的信息
	if (i == -1)
	{printf("查找学生失败,返回上一级菜单\n");
		return;
	}
	printf("第%d个学生的名字:%s\n", j, class[i].name);
	printf("第%d个学生的学号:%s\n", j, class[i].num);
	printf("第%d个学生的数学成绩:%d\n", j, class[i].math);
	printf("第%d个学生的专业成绩:%d\n", j, class[i].pro);
	//令该学生的信息无效
	class[i].tag = 0;
	printf("第%d个学生的信息已删除\n", j);
}

void changeStu(Stu *class, int j)
{int a;
	a = length_of_class(class);
	if (j >a || j< 1)//在此处判断j是否合理
	{printf("您选择的学生不合理,返回上一级菜单\n");
		return;
	}
	int i = findStu(class, j);//找到第j个tag=1的学生
	if (i == -1)
	{printf("查找学生失败,返回上一级菜单\n");
		return;
	}
	//先展示第j个学生的信息
	printf("第%d个学生的名字:%s\n", j, class[i].name);
	printf("第%d个学生的学号:%s\n", j, class[i].num);
	printf("第%d个学生的数学成绩:%d\n", j, class[i].math);
	printf("第%d个学生的专业成绩:%d\n", j, class[i].pro);

	//修改第j个学生的信息
	printf("输入第%d个学生的名字\n", j);
	scanf("%s", class[i].name);

	printf("输入第%d个学生的学号\n", j);
	scanf("%s", class[i].num);

	printf("输入第%d个学生的数学成绩\n", j);
	scanf("%d", &class[i].math);

	printf("输入第%d个学生的专业成绩\n", j);
	scanf("%d", &class[i].pro);
	//展示修改后的学生信息
	printf("第%d个学生的名字是%s\n", j, class[i].name);
	printf("第%d个学生的学号是%s\n", j, class[i].num);
	printf("第%d个学生的数学成绩是%d\n", j, class[i].math);
	printf("第%d个学生的专业成绩是%d\n", j, class[i].pro);
	printf("第%d个学生的信息已重新录入\n\n", j);
}

void showStu(Stu *class, int j)
{if (j != 1 && j != 2)
	{printf("选择菜单项有误,返回上一级功能\n");
		return;
	}
	int i;
	int k = 0;
	if (j == 1)//展示全部学生的信息
	{for (i = 0; i< length; i++)//遍历整个班级
		{	if (class[i].tag == 1)//打印出所有有效的学生信息
			{		k++;
				printf("第%d个学生的信息如下:\n",k);
				printf("第%d个学生的姓名:%s\n", k,class[i].name);
				printf("第%d个学生的学号:%s\n", k, class[i].num);
				printf("第%d个学生的数学成绩:%d\n", k, class[i].math);
				printf("第%d个学生的专业成绩:%d\n", k, class[i].pro);
			}
		}
		printf("全部学生的信息已打印完毕\n");
	}
	else//选择展示一个学生的信息
	{printf("您希望展示第几位学生的信息:\n");
		scanf("%d", &k);
		while (k< 1 || k >length)
		{	printf("您选择的学生不合理,请重新选择:\n");
			scanf("%d", &k);
			getchar();
		}
		//在此处寻找第k个tag=1的学生
		i = findStu(class,k);
		if (i == -1)
		{	printf("查找学生失败,返回上一级菜单\n");
			return;
		}
		//打印学生信息
		printf("第%d个学生的信息如下:\n", k);
		printf("第%d个学生的姓名:%s\n", k, class[i].name);
		printf("第%d个学生的学号:%s\n", k, class[i].num);
		printf("第%d个学生的数学成绩:%d\n", k, class[i].math);
		printf("第%d个学生的专业成绩:%d\n", k, class[i].pro);
	}
}

int findStu(Stu *class ,int k)//找到class中第k个tag=1的下标值,并返回
{int i=0, j=0;
	//先求出class中有几个tag=1的学生,当k不合理时返回上一级菜单
	for (i = 0; i< length; i++)
	{if (class[i].tag == 1)j++;
	}
	if (k >j || k< 1)
	{printf("选择的学生不合理,返回上一级菜单\n");
		return -1;
	}
	i = -1; j = 0;
	//求出第k个tag=1的i
	while (j< k)
	{i++;
		if (class[i].tag == 1)
		{	j++;
		}
	}
	return i;
}

int length_of_class(Stu *class)
{int i ,j;
	j = 0;
	for (i = 0; i< length; i++)
	{if (class[i].tag == 1)
		{	j++;
		}
	}
	return j;
}
  1. 自定义函数的分文件编写 ownfunctions.h
#pragma once//IDE自动添加的语句
#includeextern length;//令main代码处定义的变量的使用范围扩展至此处
int menu(void);
void _exit(void);
void welcome(void);
void printstar(void);
void showmenu(void);
int getstu(void);
int choosemenu(void);

int menu()//可以限制用户输入只能是0~4的整数,提高程序的健壮性。
//个人认为所有程序的用户输入部分都应该做到这点,但是为了更简洁的展示程序功能,本程序没有这样做
{int key;
	scanf("%d", &key);
	while (key< 0 || key>4)//判断key是否是属于0~4的整数
	{printf("请输入合法的菜单选项");
		scanf("%d", &key);
		getchar();//当输入字母时,吸收回车键
	}
	return key;
}

void printstar(void)
{printf("************************************\n");
}
void _exit(void)
{printstar();
	printf("\n\t感谢使用本系统\t再见\n\n");
	printstar();
}
void welcome(void)
{printstar();
	printf("\t欢迎使用成绩管理系统\n");
	printstar();
	
}

void showmenu(void)
{printf("\t请输入数字0~4执行相应功能\n");
	printf("\t0  退出系统\n\t1  增加一个学生的信息\n");
	printf("\t2  删除一个学生的信息\n\t3  修改一个学生的信息 \n");
	printf("\t4  查看一个学生的信息\n\t请勿输入其他内容\n\n\n");
}

int getstu(void)
{int j;
	printf("您想处理第几个学生的信息?\n");
	scanf("%d", &j);
	return j;
}

int choosemenu(void)
{printf("输入数字1或2来选择功能\n");
	printf("1:显示整个班级的学生信息\n");
	printf("2:显示某个学生的信息\n");
	int key;
	scanf("%d", &key);
	while (key< 1 || key>2)//判断key是否是属于1~2的整数
	{printf("请输入合法的菜单选项");
		scanf("%d", &key);
		getchar();//当输入字母时,吸收回车键
	}
	return key;
}

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧

创新互联公司专注于企业成都营销网站建设、网站重做改版、镇平网站定制设计、自适应品牌网站建设、H5响应式网站商城网站定制开发、集团公司官网建设、成都外贸网站制作、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为镇平等各大城市提供网站开发制作服务。
文章名称:成绩管理系统(C语言)完整代码,纯C的练手程序-创新互联
文章链接:http://scyanting.com/article/cccscd.html