C语言编写学生管理系统

项目介绍

   学生信息管理系统是一个基于C语言开发的系统,其中有用到冒泡排序、指针、结构体、二位数组等知识。通过模块化的方法编写各个函数,其中在主界面函数调用各个模块的函数的实现以下具体功能:

  1. 学生信息的增删改查
  2. 学生成绩的排序
  3. 统计学生人数
  4. 显示所有学生的信息。
  5. 对学生信息存档

总体设计

  本实验通过在main函数打开保存数据结果的文档和调用主界面函数;在主界面函数welcom()中实现边框的绘制,以及显示各个功能及各个功能对应的函数实现方法。

    录入信息函数addInfo():此函数通过结构体student来保存录入的信息,其中为了确保数据的后续操作的准确性,通过学号的唯一性来标识每个学生的信息,通过编写及调用一个isIdSame()函数,该函数通过遍历所有学号确认学号来保障学号的唯一性,学号重复会提示用户需要重新输入函数。

    查找学生信息函数:通过学号查找学生的信息,编写并调用一个findIndex()函数,该函数会遍历结构体的学号信息,查询到会返回该学号的坐标,没有找到该学号则返回-1;通过变量target来保存返回的结果。如果target不等于-1,则程序找到了该学号,通过编写并调用一个showInfo()函数来输出所有该学生的信息;否则输出查询此人,因为下标不可能为负数。

    更新学生信息函数update():通过学号来找到该学生,调用findIndex()函数来确定该学生的位置,如果返回结果是小于0则函数结束,查无此人;若大于0则找到该学生,通过do…while函数switch选择语句的嵌套来进行用户需要求改某一项的内容。

    删除函数del():查找学生的步骤跟更新学生信息函数的流程一样,如果findIndex()函数小于0则函数结束,否则通过一个for循环把结构体的数组从光标开始往前覆盖从而达到删除效果。

    插入学生信息函数inserInfo():通过要求用户输入位置来定位插入到位置,输入用户输入的大于结构体数组的总数则插入到最后一个数组。否则通过一个for循环,把数组从最后开始往后移一位,把用户输入的位置的结果移到后一数组就编写并调用插入函数inserCurrentInfo()对当前位置数组进行覆盖插入。inserCurrentInfo()函数只负责对接收到的该位置的元素所有信息的写入。

    排序函数sortTotal():创建一个临时变量提供元素与元素之间交换信息。通过双循环嵌套结构进行结构体的分数进行大小对比、交换位置来进行冒泡排序。最后排序完成之后输出分数由高到低排序的所有学生的信息。

    显示学生信息函数showAllInfo():该函数通过全局变量count(该变量记录了所有添加、插入或删除过的学生信息,能准确记录学生的总人数)通过for循环去遍历student结构体,从而输出所有的所生信息。

    学生数据存档函数writeData():该函数定义一个指针,以写入方式打开”stu.txt文本”,并把该文本的地址赋给指针fp。通过一个for循环遍历结构体里的元素,把结构体里的元素的属性输入到”stu.txt文本”。

 详细代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <windows.h>
void addInfo();// 添加
void welcom(); //主界面 
void showAllInfo();//展示所有信息 
void showInfo(struct Student student);//展示学生信息 
int findIndex(struct Student student[],int id);// 根据学号 返回对应下标 
void del(); //删除 
void search();// 查找学生信息 
void updata();//更新 
void sortTotal();//按总分排序 
void writeData();//数据写入文件中 
void initData();//初始化数据 从文件中读取数据,初始化数组
void showCount(); // 展示存储学生个数 
void inserInfo();//插入学生信息 
void inserCurrentInfo(int site); //当前位置插入 
void con();//按任意键继续 
int find1(struct Student student[],int id); //判断学号是否有重复 重复返回1 不重复返回0 
void isIdSame(int x); //校验所输入学号是否重复 
void gotoxy(int x,int y);//光标定位
int color(int c); //设置颜色输出 
struct Student{
	int id;
	char name[20];
	int _math;
	int _chinese;
	int _english;
	int total;// 总分 
} student[500]; 
int count=0;// 记录当前数组中存储学生个数 
//主函数 
int main(){
	initData(); 
	welcom(); 
	return 0;
}
// 光标定位 
void gotoxy(int x, int y)
{
	COORD pos;
 	pos.X = x;  	//横坐标
 	pos.Y = y;  	//纵坐标
 	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}
//设置颜色输出 
int color(int c)
{
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), c);        //更改文字颜色
	return 0;
}; 
// 主界面 
void welcom()
{
	while(1){
		system("cls");
			int n;
			int i,j = 1;
			color(10);          								//淡绿色边框
			for (i = 5; i <= 35; i++)   							//循环y轴坐标,打印输出上下边框===
			{
				for (j = 10; j <= 57; j++)  					//循环x轴坐标,打印输出左右边框||
				{
					gotoxy(j, i);
					if (i == 5 || i == 35) printf("=");			//输出上下边框===
					else if (j == 10 || j == 56) printf("||");	//输出左右边框||
				}
			}
		 	color(15);//白色 
		 	gotoxy(25,8);
		 	printf("学生信息管理系统");
			color(14);				//设置字体颜色为黄色
			gotoxy(15, 12);
			printf("1:录入学生信息");
			gotoxy(35, 12);
			printf("2.查找学生信息");
			gotoxy(15, 16);
			printf("3.删除学生信息");
			gotoxy(35,16);
			printf("4.修改学生信息");
			gotoxy(15, 20);
			printf("5.插入学生信息");
			gotoxy(35,20);
			printf("6.按照学生成绩排序");	 
			gotoxy(15, 24);
			printf("7.统计学生总数");
			gotoxy(35,24);
			printf("8.显示所有学生信息");
			gotoxy(15, 28);
			printf("9.学生数据存档并退出");
			gotoxy(25,32); 
			int choose;
			printf("请选择:[ ]\b\b"); //\b 光标回退一格  
			color(15); //  颜色变回白色 
		 	scanf("%d", &choose);
		 		switch (choose){
		 	 		case 1:addInfo(); break;
		 	 		case 2:search(); break;
		 	 		case 3:del(); break;
		 	 		case 4:updata(); break;
		 	 		case 5:inserInfo();break; 
		 	 		case 6:sortTotal(); break;
		 	 		case 7:showCount(); break;
		 	 		case 8:showAllInfo(); break;
		 	 		case 9:writeData();exit(0);
		 	 		} 
	}				
}
// 添加 
void addInfo(){
	system("cls");
	printf("\t添加学生信息\n");
	printf("请输入学号\n");
	isIdSame(count);
	printf("请输入姓名\n");
	scanf("%s",&student[count].name);
	printf("请输入语文成绩\n");
	scanf("%d",&student[count]._chinese);
	printf("请输入数学成绩\n");
	scanf("%d",&student[count]._math);
	printf("请输入英语成绩\n");
	scanf("%d",&student[count]._english);
	student[count].total=student[count]._chinese+student[count]._english+student[count]._math;
	printf("%s的信息录入成功\n\n",student[count].name);
	int choose;
	printf("1继续 2返回主界面\n"); 
	count++;  
	scanf("%d",&choose);
	if(choose==1){
		addInfo();
	} 
	system("cls"); 

} 

// 查找 展示结果 
void search(){
	system("cls");
	int id;
	printf("请输入你想查找学生的学号\n");
	scanf("%d",&id);
	int target = findIndex(student,id);  //目标下表
	int flag=1;//是否存在要查询的学号 
	
	//for循环对比 
	if(target != -1) 
	{
		printf("\n\t查询结果\n\n");
		showInfo(student[target]);
		con();  
		
	}

	else{ // 输出查询结果 
			printf("\n查无此人\n"); 
				con();
	} 
}


// 更新 
void updata(){
	system("cls");
	int id;
	printf("请输入你要修改学生的学号\n");
	scanf("%d",&id);
	int	target = findIndex(student,id);
 
	if(target<0){
		printf("查无此人");
		con(); 
	}else{
		int flag=1;	
	do{
		int choose=0;
		printf("请输入需要修改的选项\t(1.学号\t2.姓名\t3.语文\t4.数学\t5.英语):\n");
		scanf("%d",&choose); 
			switch (choose) {
				case 1:
					printf("请输入学号\n");
//					scanf("%d",&student[target].id);
					isIdSame(target);			
					break;
				case 2:
					printf("请输入姓名\n");
					scanf("%s",&student[target].name);
					break;
				case 3:
					printf("请输入语文成绩\n");
					scanf("%d",&student[target]._chinese);
					break; 
				case 4:
					printf("请输入数学成绩\n");
					scanf("%d",&student[target]._math);
					break;	
				case 5:
					printf("请输入英语成绩\n");
					scanf("%d",&student[target]._english);
					break;		

			} 
			student[target].total=student[target]._chinese+student[target]._english+student[target]._math;
			printf("%s的信息修改成功\n",student[target].name);
			printf("\n按1继续 按2退出修改\n");
			int choose2; 
			scanf("%d",&choose2);
			if(choose2==1){
				flag=1;
			}else{
				flag=0;
			} 
			
	}while(flag);

	}	
} 
//删除
void del(){
	system("cls");	
	int id;
	int target;//目标元素的下标 
	printf("\n请输入你想删除学生的学号\n");
	scanf("%d",&id);
	target=findIndex(student, id);
	if(target<0){
		printf("\n查无此人\n");
		con();
		
	} else{
		 for(int i=target;i<count;i++){
		 	student[i]=student[i+1]; //删除操作 后一位元素覆盖前一位元素 
		 }
		printf("删除成功\n");
		con();
	count--; 
	} 
}

//插入学生信息
void inserInfo(){
	system("cls");
	int site; //位置 
	printf("请输入你要插入学生信息的位置(从0开始):\n");
	scanf("%d",&site);
	//插入位置大于总数,则插入在数组最后一位
	if ( site > count){
		inserCurrentInfo(count); 
		printf("%s的信息插入成功\n", student[count].name);
		
	}else{
		//不是最后一位 从当前位置 数组全部后移一位 
		for (int i = count; i >= site; i--){
				student[i + 1] = student[i];
			}
		//在当前位置添加学员
		inserCurrentInfo(site);
		printf("%s同学的信息插入成功\n", student[site].name);
		con(); 
		}

} 
//当前位置插入
void inserCurrentInfo(int site){
 	printf("请输入学号\n");
 	isIdSame(site);
 	printf("请输入姓名\n");
 	scanf("%s", student[site].name);
 	printf("请输入语文成绩\n");
 	scanf("%d", &student[site]._chinese);
 	printf("请输入数学成绩\n");
 	scanf("%d", &student[site]._math);
 	printf("请输入英语成绩\n");
 	scanf("%d", &student[site]._english);
	student[site].total= student[site]._chinese+student[site]._english+student[site]._math;
 	count++;
 	con();
 }
// 判断学号是否重复 重复返回1 否则返回0 
int find1(struct Student student[],int id)
{
 int temp = 0;
 for(int i=0;i<count;i++)
  {
   if(student[i].id==id)
    {
     temp=1;
     break;
    }
  } 
 return temp;
} 
//校验所添加学号是否重复
void isIdSame(int x){

	int inputId;	
	scanf("%d",&inputId);
	 do{
	   if(find1(student,inputId)){
	     printf("学号有重复,请重新输入\n");
	     scanf("%d",&inputId);
	    }
	   else
	    {
	     student[x].id=inputId;
	     break;
	    }
	  }while(1);
}

// 根据学号 返回下标 
int findIndex (struct Student student[],int id){
	int temp;
	for(int i=0;i<count;i++){
		if(student[i].id==id){
			temp=i;
			break; 
		} else {
			temp = -1; 
		} 
	}
	
	return temp;
}
//按总分排序
 void sortTotal(){
 	//冒泡排序 
	struct Student temp;// 元素与元素交换的临时容器 
	for (int i = 0; i < count - 1; i++){
		for (int j = 0; j < count - 1 - i; j++){
			if (student[j].total<student[j+1].total){
				temp = student[j + 1];
				student[j + 1] = student[j];
				student[j]= temp;
			}
		}
	}
	printf("排序完成");
	showAllInfo();	 
 }
 //按任意键继续 
 void con(){
 	printf("\n按任意键继续\n"); 
 	getch();
 }; 
 //展示学生总个数 
 void showCount(){
 	system("cls"); 
 	printf("\n\t学生总个数为:%d个\n",count); 
	con(); 
 } 
 //初始化数据 
 void initData(){
 	FILE * fp = NULL;
 	fp = fopen("stu.txt", "r");
 	if (!fp){
 		printf("文件打开失败\n");
 		exit(0);// 退出程序 
 	}
 	while (1){    //读取数据 赋值给数组 
 		fscanf(fp, "%d%s%d%d%d%d", &student[count].id, student[count].name, &student[count]._chinese, &student[count]._math, &student[count]._english, &student[count].total);
 		if (feof(fp)){ //文件末尾 跳出循环 
 			break;
 		}
 		count++;
 	}
 }
 //数据写入文件中 
 void writeData(){
	FILE * fp = NULL;
	fp = fopen("stu.txt", "w");
	for (int i = 0; i < count; i++){
		fprintf(fp, "%d\t%s\t%d\t%d\t%d\t%d\n", student[i].id, student[i].name, student[i]._chinese, student[i]._math, student[i]._english,student[i].total);
	}
	printf("数据保存成功\n"); 	
 }


// 展示所有信息
void showAllInfo(){
	system("cls");//清屏 
	for(int i=0;i<count;i++){
		showInfo(student[i]);	 
	} 
	con(); 
} 
// 展示学生信息
void showInfo(struct Student stu){//传入数组里的元素 
	printf("学号:%d\t姓名:%s\t语文:%d\t数学:%d\t英语:%d\t总分:%d",stu.id,stu.name,stu._chinese,stu._math,stu._english,stu.total);
	printf("\n-----------------分割线-----------------------\n"); 
} 

主界面

 

 

  • 24
    点赞
  • 218
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值