C语言课程设计——学生管理系统

学生信息管理
(1)问题描述
学生信息包括:学号,姓名,年龄,性别,出生年月,地址,电话,E-mail等。试设计一学生信息管理系统,使之能提供以下功能:
 系统以菜单方式工作
 学生信息录入功能(学生信息用文件保存)—输入
 学生信息浏览功能——输出
 查询、排序功能——算法
1、按学号查询
2、按姓名查询
 学生信息的删除与修改(可选项)
(2)功能要求
 界面简单明了;
 有一定的容错能力,比如输入的成绩不在0~100之间,就提示不合法,要求重新输入;
 最好用链表的方式实现。
(3)算法分析
首先,一个学生包括这么多的属性,应该考虑定义一个结构,其次,我们应该考虑数据的存储形式:是定义一个数组来存储,还是定义一个链表呢?在这里假如我们以数组的方式来存储,当然可以,但是我们知道,假如我们定义一个数组的话,我们首先必须知道学生人数大概是多少,以便我们确定数组的大小,但是题目中没有给出,而且题目要求中有大量的删除、插入操作,所以用链表的方式比较方便。
对于菜单的实现,其实也比较简单,首先我们用printf语句把程序的功能列出来,然后等待用户输入而执行不同的函数,执行完了一个功能后又回到菜单。文件的读写操作大家参照书中的有关文件的章节。

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<windows.h>
#define M 80



char f; 
FILE *fp;//定义指向文件的指针 


struct student 
{
	char num[13];
	char name[15];
	int age;
	char x[5];
	char year_month_day[15];
	char address[30];
	int iphone;
	char e_mail[30];
	int xx,yy,wl,cyy,pe;
};//定义结构体变量 

int jiami(); 
void input(struct student stu[M]);
void output(struct student stu[M]);
void lookfor(struct student stu[M]);
void order(struct student stu[M]);
void delete_s(struct student stu[M]);
void modify(struct student stu[M]);
void xuehao(struct student stu[M]);    
void xingming(struct student stu[M]);
void fileread(struct student stu[M]);
void filewrite(struct student stu[M]);
int count;//判断学生的数目 
struct student t;




int jiami()
{
	int s=2345,m;//s为密码,m为输入的密码 
	int i=0;//用来判断输入的密码是否正确 
	printf("请输入密码(仅有三次机会呦):");
	scanf("%d",&m);//第一次输入密码 
	if(m!=s)
	{
		printf("密码错误,还有两次机会:");
		scanf("%d",&m);//第二次输入密码 
		if(m!=s)
		{
			printf("密码错误,这是最后一次机会了呢:");
			scanf("%d",&m);//第三次输入密码 
			if(m!=s)
			{
				printf("看来您不是我的主人,程序要结束了呢!\n");
			}
			else i=1; 
		}
		else i=1;
	}
	else i=1;
	return i;
} 




int main()
{
	system("color F5");//改变运行框和文字的颜色 
	int choice,sum,i;//choice用来判断输入的命令;sum用来记录输入错误的次数;i用来判断输入的密码是否正确 
	struct student stu[M];
	sum=0;//初始化sum 
	i=jiami();
	if(i==1)//判断输入的密码是否正确 
	do 
	{ 
		printf("\t-------------------------------------------------\n"); 
		printf("\t\t+  学生信息管理系统        +\n"); 
		printf("\t-------------------------------------------------\n"); 
		printf("\t\t ***************\n"); 
		printf("\t\t 1、添加学生信息\n"); 
		printf("\t\t 2、浏览学生信息\n"); 
		printf("\t\t 3、查询学生信息\n"); 
		printf("\t\t 4、修改学生信息\n"); 
  		printf("\t\t 5、删除学生信息\n"); 
  		printf("\t\t 6、排序学生信息\n");  
  		printf("\t\t 7、读取文件学生\n");
 		printf("\t\t 8、保存到文件\n");
 		printf("\t\t 9、退出系统\n");    
  		printf("\t\t ***************\n");  
		printf("请输入你的选择\n"); //输出菜单 
		scanf("%d",&choice); //输入选择 
		fflush(stdin);   //清空缓冲区    
		if (choice>9||choice<=0) 
  		{ 
   			sum++; 
   			if (sum>=5) 
  			{ 
   				printf("输入错误次数过多,程序将重新开始\n"); 
    			system("pause");        
    			system("cls");   //清屏 
  			 } 
  		} 
  		switch (choice)      
  		{ 
  			case 1:
			  input(stu);
			  break;      //添加学生信息  
  			case 2:
			  output(stu);
			  break;//浏览学生信息 
  			case 3:
			  lookfor(stu);
			  break; //寻找学生信息 
  			case 4:
			  modify(stu);
			  break; //修改学生信息 
  			case 5:
			  delete_s(stu);
			  break; //删除学生信息 
  			case 6:
			  order(stu);
			  break; //排序学生信息 
  			case 7:
			  fileread(stu);
			  break; //从文件中读取学生信息 
  			case 8:
			  filewrite(stu);
			  break; //将学生信息写入文件 
 			case 9:
			 printf("感谢你使用学生信息管理系统,请关掉程序!\n");
			 system("pause");
			 break; 
  			default:
			  printf("无效的选择!请重新输入!\n");
			  break; 
 		 } 
 	}
 	while(choice!=9); 
 	printf("the program is over!\n");  
 	return 0;
}





void input(struct student stu[M])//自定义输入函数
{
	system("cls");//清屏 
 	printf("请添加要输入学生的信息\n");
 	printf("请输入由11位数字组成的学生的学号\n");
 	scanf("%s",stu[count].num);//输入学生学号 
 	printf("请输入学生的姓名\n");
 	scanf("%s",stu[count].name);//输入学生姓名 
 	printf("请输入学生的年龄\n");
 	scanf("%d",&stu[count].age);//输入学生姓名 
 	printf("请输入学生的性别\n");
 	scanf("%s",stu[count].x);//输入学生性别 
 	printf("请输入学生的出生年月\n");
 	scanf("%s",stu[count].year_month_day);//输入学生生日 
    printf("请输入学生的地址\n");
 	scanf("%s",stu[count].address); //输入学生地址 
 	printf("请输入学生的电话\n");
 	scanf("%d",&stu[count].iphone); //输入学生手机号 
 	printf("请输入学生的E-mail\n");
 	scanf("%s",stu[count].e_mail);//输入学生的邮箱 
 	printf("请依次输入五项不大于100的学生各科成绩\n");
 	scanf("%d%d%d%d%d",&stu[count].xx,&stu[count].yy,&stu[count].wl,&stu[count].cyy,&stu[count].pe);//输入学生的各项成绩 
    count++;//计算学生人数 
}





void output(struct student stu[M])//自定义输出函数
{
	 int j;
	 system("cls");//清屏 
	 if(count==0)//判断目前是否有学生信息 
	 {
		printf("当前已存入学生的信息为0个\n");
 		return;
	 }
 	else
 	{
  		for(j=0;j<count;j++)
  		{
        	printf("学号:%s\t\t",stu[j].num);//输出学号 
        	printf("姓名:%s\t\t",stu[j].name);//输出姓名 
        	printf("年龄:%d\t\t",stu[j].age);//输出年龄 
        	printf("性别:%s\t\t",stu[j].x);//输出性别 
        	printf("出生年月:%s\t\t",stu[j].year_month_day);//输出生日 
       		printf("地址:%s\t\t",stu[j].address);//输出地址 
        	printf("电话:%d\t\t",stu[j].iphone);//输出手机号 
        	printf("E-mail:%s\t\t",stu[j].e_mail);//输出邮箱 
        	printf("数学:%d\t\t英语:%d\t\t物理:%d\t\tC语言:%d\t\t体育:%d\n\n",stu[j].xx,stu[j].yy,stu[j].wl,stu[j].cyy,stu[j].pe);//输出各项成绩 
  		}
 	}
}



void lookfor(struct student stu[M])//自定义查询函数
{
 	int choice;//定义选择 
 	system("cls");//清屏 
 	if(count==0)//判断目前是否有学生信息 
 	{
  		printf("当前已存学生的信息为0个,无法查询!!!\n");
  		return;
 	}
 	else
 	{
  		printf("请选择你所要查询的方式: 1、学号 2、姓名 3、取消\n");
  		scanf("%d",&choice);//输入选项 
  		switch(choice)
  		{ 
  			case 3:return;break; 
  			case 2:xingming(stu);break;//按姓名查询 
  			case 1:xuehao(stu);break; //按学号查询 
  			default:printf("无效的选择!请重新输入!\n");break; 
  		} 
 	}
}




void xuehao(struct student stu[M])//自定义学号查询函数
{
 	int j,flag=0;
 	int k=0;//判断是否找到该学生信息 
 	char xh[25];
 	system("cls");
 	printf("请输入你想要查询的学生的学号");
 	scanf("%s",xh);//输入学号 
 	fflush(stdin);//清空缓冲区 
 	for(j=0;j<count;j++)
 	{
  		if(strcmp(stu[j].num,xh)==0)//找到该学号的学生信息 
  		{
   			printf("学号:%s\t",stu[j].num);
         	printf("姓名:%s\t",stu[j].name);
         	printf("年龄:%d\t",stu[j].age);
            printf("性别:%s\t",stu[j].x);
         	printf("出生年月:%s\t",stu[j].year_month_day);
           	printf("地址:%s\t",stu[j].address);
         	printf("电话:%d\t",stu[j].iphone);
         	printf("E-mail:%s\t",stu[j].e_mail);
         	printf("数学:%d\t英语:%d\t物理:%d\tC语言:%d\t体育:%d\n",stu[j].xx,stu[j].yy,stu[j].wl,stu[j].cyy,stu[j].pe);//输出该学生的信息 
         	k=1;
  		}
 	}
 	if(k==0)//没有找到该学号 
 	{
  		printf("很抱歉,没有你所需要的学生信息\n");
 	}
}



void xingming(struct student stu[M])//自定义姓名查询函数
{
	int n=0;
 	int j,flag=0;
	char xm[25];
	system("cls");
	printf("请输入你想要查询的学生的姓名");
 	scanf("%s",xm);
 	fflush(stdin);
 	for(j=0;j<count;j++)
 	{
  		if(strcmp(stu[j].name,xm)==0)
  		{
   			printf("学号:%s\t",stu[j].num);
         	printf("姓名:%s\t",stu[j].name);
         	printf("年龄:%d\t",stu[j].age);
            printf("性别:%s\t",stu[j].x);
         	printf("出生年月:%s\t",stu[j].year_month_day);
            printf("地址:%s\t",stu[j].address);
         	printf("电话:%d\t",stu[j].iphone);
         	printf("E-mail:%s\t",stu[j].e_mail);
         	printf("数学:%d\t英语:%d\t物理:%d\tC语言:%d\t体育:%d\n",stu[j].xx,stu[j].yy,stu[j].wl,stu[j].cyy,stu[j].pe);
         	n=1;
  		}
 	}
 	if(n==0)
 	{
  		printf("很抱歉,没有你所需要的学生信息\n");
 	}
}



void order(struct student stu[M])//自定义排序函数
{
 	int j,k,choice,max; 
    system("cls"); 
 	printf("请输入你想要进行排序的方式\n");
 	printf("1、数学 2、英语 3、物理 4、C语言 5、体育\n"); 
 	scanf("%d",&choice); //输入选项 
 	switch(choice) 
 	{
 		case 1:
			for(j=0;j<count;j++)    
     		{ 
      			max=j;  
      			for(k=j+1;k<count;k++)    
       				if (stu[k].xx>stu[max].xx)    
       				{
				   		t=stu[k];
				   		stu[k]=stu[max];
				   		stu[max]=t;
					}     
        	};
			break; //按数学成绩排序 
 		case 2:
			for(j=0;j<count;j++)     
     		{ 
      			max=j;  
      			for (k=j+1;k<count;k++)    
       				if (stu[k].yy>stu[max].yy)    
       				{
			   			t=stu[k];
			   			stu[k]=stu[max];
			   			stu[max]=t;
					}   
        	};
			break; //按英语成绩排序 
 		case 3:
			for(j=0;j<count;j++)     
     		{ 
      			max=j;  
         		for (k=j+1;k<count;k++)    
       				if (stu[k].wl>stu[max].wl)    
       				{
			   			t=stu[k];
			   			stu[k]=stu[max];
			   			stu[max]=t;
					}     
        	};
			break; //按物理成绩排序 
 		case 4:
	 		for(j=0;j<count;j++)     
     		{ 
      			max=j;  
      			for (k=j+1;k<count;k++)    
       			if (stu[k].cyy>stu[max].cyy)    
       			{
			   		t=stu[k];
			   		stu[k]=stu[max];
			   		stu[max]=t;
				}     
       		};
			break; //按C语言成绩排序 
 	case 5:
	 	for(j=0;j<count;j++)     
     	{ 
      		max=j;  
      		for (k=j+1;k<count;k++)    
       			if (stu[k].pe>stu[max].pe)    
       			{
				   t=stu[k];
				   stu[k]=stu[max];
				   stu[max]=t;
				}     
        };
		break;   //按体育成绩排序 
 	default:
	 	printf("无效的选择!请重新输入!\n");
		break; 
    }
    if(choice>=1&&choice<=5)
		printf("排序成功!!!"); 
}









void delete_s(struct student stu[M])//自定义删除函数(按学号删除)
{
 	int j,index=0,k=count;
 	char xh[25];
 	system("cls");
 	if(count==0)//判断学生数量是否为0 
 	{
  		printf("当前已存学生信息为0个,无法删除!!!\n");
  		return;
 	}
 	else
 	{
  		printf("请输入你想要删除的同学学号\n"); 
  		scanf("%s",xh);//输入删除学生的学号 
  		fflush(stdin); //清空缓冲区 
  		for(j=0;j<count;j++) 
  		{ 
   			if(strcmp(stu[j].num,xh)==0) //寻找该学生 
   			{ 
    			for(j=index;j<count;j++) 
     			stu[j]=stu[j+1]; 
    			count--; 
    			if(count<k) //判断是否删除成功 
     				printf("你已经删除成功\n"); 
   			} 
   			index++;
  		} 
  		if(j==count) //判断是否有该学生的信息 
   			printf("抱歉!!!没有你所需要删除的学生信息!*_*!\n");
 	}
}








void modify(struct student stu[M])//自定义修改函数
{
 	int j,flag=0,course;
	int i=0;  
 	char xh[25]; 
 	system("cls"); 
 	if (count==0) //判断是否有学生信息 
 	{ 
  		printf("当前已存学生信息为0个,无法修改!!!\n"); 
  		return; 
 	} 
 	else 
 	{ 
  		printf("请输入你想要修改的同学学号\n"); 
  		scanf("%s",&xh); //输入要修改学生的学号 
  		fflush(stdin); 
  		for(j=0;j<count;j++)
		{ 
   			if (strcmp(stu[j].num,xh)==0)       
   			{ 
   				i=1;
    			printf("你确定要修改学生的信息吗?如果不确定的话,请关掉本程序吧!\n"); 
    			printf("选择课程: 1、数学 2、英语 3、物理 4、C语言 5、体育 6、跳过\n"); 
    			scanf("%d",&course); //选择要修改的一部分学生信息 
    			switch(course) 
    			{ 
    				case 1:printf("请输入你想要修改后的学生成绩\n");scanf("%d",&stu[j].xx);break; //修改数学成绩 
    				case 2:printf("请输入你想要修改后的学生成绩\n");scanf("%d",&stu[j].yy);break;//修改英语成绩 
    				case 3:printf("请输入你想要修改后的学生成绩\n");scanf("%d",&stu[j].wl);break; //修改物理成绩 
    				case 4:printf("请输入你想要修改后的学生成绩\n");scanf("%d",&stu[j].cyy);break; //修改C语言成绩 
    				case 5:printf("请输入你想要修改后的学生成绩\n");scanf("%d",&stu[j].pe);break; //修改体育成绩 
    				case 6:break; 
    				default:printf("无效的选择!请重新输入!\n");break;
    			}
    			printf("选择信息: 1、学号 2、姓名 3、年龄 4、性别 5、出生年月 6、地址 7、电话 8、E-mail 9、跳过\n"); 
    			scanf("%d",&course); //选择要修改的一部分学生信息   
    			switch(course) 
    			{
    				case 1:scanf("%s",stu[j].num);break;//修改学号 
             		case 2:printf("请输入修改后的信息:");scanf("%s",stu[j].name);break;//修改姓名 
             		case 3:printf("请输入修改后的信息:");scanf("%d",&stu[j].age);break;//修改年龄 
             		case 4:printf("请输入修改后的信息:");scanf("%s",stu[j].x);break;//修改性别 
             		case 5:printf("请输入修改后的信息:");scanf("%s",&stu[j].year_month_day);break;//修改生日 
             		case 6:printf("请输入修改后的信息:");scanf("%s",stu[j].address);break;//修改地址 
             		case 7:printf("请输入修改后的信息:");scanf("%d",&stu[j].iphone);break;//修改电话 
             		case 8:printf("请输入修改后的信息:");scanf("%s",stu[j].e_mail);break;//修改邮箱 
             		case 9:break;
    				default:printf("无效的选择!请重新输入!\n");break;
    			}
   			}
   			 
   		}
 	}
 	if(i==0) printf("无该学生信息!!\n");
 	return; 
 	
}





void filewrite(struct student stu[M])//自定义写入文件函数
{ 
 	int j=0;  
 	printf("请选择是否要存入已输入的学生信息:'y'还是'n'???\n"); 
 	scanf("%c",&f); //判断是否写入文件 
 	fflush(stdin); //清空缓冲区 
	while(f!='y'&&f!='n')
 	{ 
  		if (f!='y'&&f!='n') 
   		printf("输入错误,请重新输入\n"); 
  		printf("以下操作将会覆盖已存储的数据,确定请输入'y'或'n'?\n"); 
  		scanf("%c",&f); 
  		fflush(stdin); 
 	} 
 	if (f=='y') 
 	{ 
  		if((fp=fopen("stu.txt","w"))==NULL) 
  		{  
   			printf("cannot open this file\n");  
   			exit(0); 
  		} 
  		for(j=0;j<count;j++)   
  		{
   			fwrite(&stu[j],sizeof(struct student),1,fp); //将学生信息写入文件 
  		} 
  		fclose(fp); 
  		if(count==0)//判断学生数目是否为0  
   			printf("没有文件,无法保存\n"); 
  		else 
   			printf("数据存储完毕\n"); 
  			system("pause"); 
 	} 
 	else  
  		return;
}





void fileread(struct student stu[M])//自定义读取文件信息函数
{ 
 	int j=0;  
 	system("cls"); 
 	printf("请选择是否要读取已输入的学生信息:'y'还是'n'?\n"); 
 	scanf("%c",&f); //判断是否从文件中读取学生信息 
 	fflush(stdin);  //清空缓冲区 
 	if (f=='y') 
 	{ 
  		if((fp=fopen("stu.txt","r"))==NULL) 
  		{  
   			printf("cannot open this file\n");  
   			exit(0); 
  		} 
  		fread(&stu[j],sizeof(struct student),1,fp);  //从文件中读取学生信息 
  		count=0; 
  		count++; 
  		j++; 
  		while(fread(&stu[j],sizeof(struct student),1,fp)) 
  		{  
   			j++;  
   			count++; 
  		} 
  		fclose(fp); 
  		printf("数据读取完毕!\n"); 
  		system("pause"); 
 	} 
 	else 
  		return;
}

记录我的学习记录,有问题欢迎指出学习交流

  • 31
    点赞
  • 141
    收藏
    觉得还不错? 一键收藏
  • 27
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值