C语言实现——学生管理系统

程序员的必经之路吧,学生管理系统。在制作过程中体会到了编写一个具体可用的软件而要做的工作,无论是编写前的准备,还是编写过程中每个细节的处理,都让我理解了这份工作是个什么样子。程序并不是抬手就来,一个软件要完整,同时还要将每个功能部分区分开,所以在编写之前一定要先规划清楚,这是一项工程。逻辑要严密,编程完全就是对逻辑思维的考验,大大小小的函数、语句都是靠逻辑连接起来的。基础知识要扎实,在我现在这个阶段,经常会遇到为干掉bug而苦思半天,在逻辑上寻觅没有出口,其实只是对用法不了解,上课时认为那种不太常考的东西不用太费心,只要把主要的知识记住就行,但事实上每个知识点都是有用的。

#include<stdio.h>
#include<windows.h>
//#include<conio.h>
//#include<string.h>

struct STUDENT {
	char name[10];
	int num;
	int sex;
	double score;
	struct STUDENT* next;
}*ListHead;

void menu();
void Import();
void Show();
void Add();
void Search();
void Rank();
void Delete();
void Export();
void Exit();

struct STUDENT* CreatListHead();
void ListInsert(char *name,int num,int sex,double score);
void IfListBlank();
void ExchangeNope(struct STUDENT *p,struct STUDENT *q);
void DeleteNode(struct STUDENT *d);
void WriteList(char *path);
void IfHeadEmpty();

int main(){
//	Load();
//	clrscr();
//	printf("en");
//	system("cls");
/*	if(ListHead==NULL)
		printf("!!!");
	else
		printf("???");
*/
	menu();

	

	return 0;
}

void menu() {
	int i;
	system("cls");
	
	printf("-----------------------------------------------\n");
	printf("                 学生管理系统\n");
	printf("-----------------------------------------------\n");
	printf("       1.导入 | 2.显示 | 3.增添 | 4.查找\n");
	printf("       5.排序 | 6.删除 | 7.导出 | 8.退出\n");
	printf("-----------------------------------------------\n");
	printf("请选择一个选项:");
	scanf("%d", &i);
	switch(i) {
		case 1:Import();break;
		case 2:Show();break;
		case 3:Add();break;
		case 4:Search();break;
		case 5:Rank();break;
		case 6:Delete();break;
		case 7:Export();break;
		case 8:Exit();break;
		case 9:IfListBlank();break;
		default:menu();
	}
}

//导入文件---------------------------------------------------------------------------------
void Import(){
	ListHead = CreatListHead();
	FILE *fp;
	char buf[30];
	char *iname;
	int inum=0;
	int isex=0;
	double iscore=0;
	int i = 0;
	char *line;
	fp=fopen("students.txt","r");
	if(fp==NULL)
	{
		printf("import failed!&& creat a new file,any key return\n");
		ListHead = CreatListHead();
		fflush(stdin);
		getchar();
		menu();
	}else{
		while(!feof(fp))
		{
			fgets(buf,30,fp);
			line = strtok(buf," \t\r\n");
			while(line != NULL)
			{
				switch(i){
				case 0: iname=line; break;
				case 1: inum=atoi(line); break;
				case 2: isex=atoi(line); break;
				case 3: iscore=atof(line); break;
				default: break;
				}
				i++;
				//	printf("%s  %d  %d  %f\n",iname,inum,isex,iscore);
				//	ListInsert(iname,inum,isex,iscore);
				line = strtok(NULL," \t\r\n");	
			}
			i=0;
			//	printf("%-10s%-5d %d %4.1f\n",iname,inum,isex,iscore);
			ListInsert(iname,inum,isex,iscore);
		}
		fclose(fp); 
	}
	
	printf("import successful! anykey to return\n");
	fflush(stdin);
	getchar();
	menu();
}

//显示功能---------------------------------------------------------------------------------
void Show(){
	IfHeadEmpty();
	struct STUDENT *prep,*p;
	prep = ListHead;
	p = ListHead->next;
	while(p)
	{
		prep = p;
		p =p->next;
		if(prep->sex)
		{
			printf("%-10s%-5d 男 %4.1f\n",prep->name,prep->num,prep->score);
		}else{
			printf("%-10s%-5d 女 %4.1f\n",prep->name,prep->num,prep->score);
		}
	}
	printf("show successful! anykey to return\n");
	fflush(stdin);
	getchar();
	menu();
}


//添加数据---------------------------------------------------------------------------------
void Add(){
	IfHeadEmpty();
	char aname[10];
	int anum=0;
	int asex=0;
	double ascore=0;
	printf("enter data:");
	fflush(stdin);
	scanf("%s%d%d%lf",aname,&anum,&asex,&ascore);
//	printf("%s%-5d %d %4.1f\n",aname,anum,asex,ascore);
	ListInsert(aname,anum,asex,ascore);
	
	printf("add successful! anykey to return\n");
	fflush(stdin);
	getchar();
	menu();
}


//查询功能---------------------------------------------------------------------------------
void Search(){
	IfHeadEmpty();
	struct STUDENT *prep,*p;
	prep = ListHead;
	p=ListHead->next;

	int i;
	char sname[10];
	int snumsex;
	double sscore;
	int isfind=0;
	//printf("%-10s%-5d %d %4.1f\n",name,num,sex,score);
	printf("which methed you choose:1.name 2.num 3.sex 4.score 0.exit\n");
	scanf("%d",&i);
	switch(i){
	case 0:menu();
	case 1: 
		printf("enter the name you are looking for:");
		scanf("%s",sname);
		while(p)
		{
			prep = p;
			p = p->next;
			if(strcmp(prep->name,sname)==0)
			{
				printf("%-10s%-5d %d %4.1f\n",prep->name,prep->num,prep->sex,prep->score);
				isfind = 1;
			}
		}
		break;
	case 2:	
		printf("enter the num you are looking for:");
		scanf("%d",&snumsex);
		while(p)
		{
			prep = p;
			p =p->next;
			if(prep->num==snumsex)
			{
				printf("%-10s%-5d %d %4.1f\n",prep->name,prep->num,prep->sex,prep->score);
				isfind = 2;
			}
		}
		break;
	case 3:
		printf("enter the sex you are looking for:");
		scanf("%d",&snumsex);
		while(p)
		{
			prep = p;
			p =p->next;
			if(prep->sex==snumsex)
			{
				printf("%-10s%-5d %d %4.1f\n",prep->name,prep->num,prep->sex,prep->score);
				isfind = 3;
			}
		}
		break;
	case 4:
		printf("enter the score you are looking for:");
		scanf("%lf",&sscore);
		while(p)
		{
			prep = p;
			p =p->next;
			if(prep->score==sscore)
			{
				printf("%-10s%-5d %d %4.1f\n",prep->name,prep->num,prep->sex,prep->score);
				isfind = 4;
			}
		}
		break;
	default:
		printf("error number,re-enter:\n");
		Search();
	}

	if(isfind!=0)
		printf("Search successful! press any ket to return\n");
	else
		printf("Search failed! press any ket to return\n");
	fflush(stdin);
	getchar();
//	setbuf(stdin,"4\r");
//	ungetc('4',stdin);
//	sscanf("4","%d",stdin);
//	menu();
	Search();

}


//排序功能---------------------------------------------------------------------------------
void Rank(){
	IfHeadEmpty();
	struct STUDENT *prep,*p,*key;
	int i=0,j=1;
//	double isequal;
//	printf("%-10s%-5d %d %4.1f\n",name,num,sex,score);
	printf("sort by: 1.name 2.num 3.sex 4.score 0.exit\n");
	scanf("%d",&i);
	if(i<1 || i>4)
	{
		printf("wrong choose,re-enter:\n");
		Rank();
	}
	printf("order: 1.positive 0.reverse\n");
	scanf("%d",&j);
	if(j<0 || j>1)
	{
		printf("wrong choose,re-enter:\n");
		Rank();
	}
	switch(i){
	case 0:menu();              //选择排序法:将第一个数的备份与后排比较,小于它的就将他赋值给备份交换(指针代表原数),一行循环接收进行,再将第二个数进行如此循环
	case 1:	
		prep = ListHead;
		p=ListHead->next;
		while(prep->next)
		{
			prep = prep->next;
			p = prep->next;
			key = prep;
			while(p)
			{
				if(j)
				{
					if(strcmp(key->name,p->name) > 0)
						key = p;
				}else{
					if(strcmp(key->name,p->name) < 0)
						key = p;
				}
				p = p->next;
			}
			ExchangeNope(prep, key);
		}
		break;
 	case 2:
		prep = ListHead;
		p=ListHead->next;
		while(prep->next)
		{
			prep = prep->next;
			p = prep->next;
			key = prep;
			while(p)
			{
				if(j)
				{
					if((key->num-p->num) > 0)
						key = p;
				}else{
					if((key->num-p->num) < 0)
						key = p;
				}
				p = p->next;
			}
			ExchangeNope(prep, key);
		}
		break;
	case 3:
		prep = ListHead;
		p=ListHead->next;
		while(prep->next)
		{
			prep = prep->next;
			p = prep->next;
			key = prep;
			while(p)
			{
				if(j)
				{
					if((key->sex-p->sex) > 0)
						key = p;
				}else{
					if((key->sex-p->sex) < 0)
						key = p;
				}
				p = p->next;
			}
			ExchangeNope(prep, key);
		}
		break;
	case 4:
		prep = ListHead;
		p=ListHead->next;
		while(prep->next)
		{
			prep = prep->next;
			p = prep->next;
			key = prep;
			while(p)
			{
				if(j)
				{
					if((key->score-p->score) > 0)
						key = p;
				}else{
					if((key->score-p->score) < 0)
						key = p;
				}
				p = p->next;
			}
			ExchangeNope(prep, key);
		}
		break;
	default:printf("wrong choose,re-enter:");
		Rank();
	}
	Show();
	printf("Rank successful!any key to return;\n");
	fflush(stdin);
	getchar();
	menu();
	
}


//删除---------------------------------------------------------------------------------
void Delete(){
	IfHeadEmpty();
	struct STUDENT *prep,*p,*del;
	prep = ListHead;
	p=ListHead->next;

	int i;
	int isfind=0;
	char *dname;
	int dnumsex;
	double dscore;

	printf("select a method: 1.name 2.num 3.sex 4.score 0.exit\n");
	scanf("%d",&i);
	switch(i){
	case 0:menu();
	case 1:
		printf("enter the name:\n");
		scanf("%s",dname);
		while(p)
		{
			
			if(!strcmp(p->name,dname))
			{
				prep->next = p->next;
				del = p;
				printf("%-10s%-5d %d %4.1f(已删除)\n",del->name,del->num,del->sex,del->score);
				free(p);
				p = prep->next;
				isfind = 1;
			}else{
				prep = p;
				p =p->next;
			//	isfind = 0;
			}
		}
		break;
	case 2:
		printf("enter the num:\n");
		scanf("%d",&dnumsex);
		while(p)
		{
			
			if(!(p->num-dnumsex))
			{
				prep->next = p->next;
				del = p;
				printf("%-10s%-5d %d %4.1f(已删除)\n",del->name,del->num,del->sex,del->score);
				free(p);
				p = prep->next;
				isfind = 1;
			}else{
				prep = p;
				p =p->next;
			//	isfind = 0;
			}
		}
		break;
	case 3:
		printf("enter the sex:\n");
		scanf("%d",&dnumsex);
		while(p)
		{
			
			if(!(p->sex-dnumsex))
			{
				prep->next = p->next;
				del = p;
				printf("%-10s%-5d %d %4.1f(已删除)\n",del->name,del->num,del->sex,del->score);
				free(p);
				p = prep->next;
				isfind = 1;
			}else{
				prep = p;
				p =p->next;
			//	isfind = 0;
			}
		}
		break;
	case 4:
		printf("enter the score:\n");
		scanf("%lf",&dscore);
		while(p)
		{
			
			if(!(p->score-dscore))
			{
				prep->next = p->next;
				del = p;
				printf("%-10s%-5d %d %4.1f(已删除)\n",del->name,del->num,del->sex,del->score);
				free(p);
				p = prep->next;
				isfind = 1;
			}else{
				prep = p;
				p =p->next;
			//	isfind = 0;
			}
		}
		break;
	default:
		printf("wrong choose,re-enter:");
		Delete();
	}
	if(isfind)
		printf("Delete successful!\n");
	else
		printf("Delete failed!\n");
	printf("there is the current list:\n");
	Show();
	fflush(stdin);
	printf("press any key to continue");
	getchar();
	menu();
}


//导出档案---------------------------------------------------------------------------------
void Export(){
	IfHeadEmpty();
	FILE *fp;
	char save[15];
	int i;
	printf("enter the save name:\n");
	fflush(stdin);
///	printf("if wrong????????????????????\n");
	scanf("%s",save);                        //字符串键入只能用字符串数组接收不能用指针变量
//	printf("if wrong????????????????????\n");
	fp = fopen(save,"r");
//	printf("if wrong????????????????????\n");
	if(fp!=NULL)
	{
		printf("Whether covered: 1.Yse 0.No:\n");
		fflush(stdin);
		scanf("%d",&i);
		if(i)
			WriteList(save);
		else
			Export();
		fclose(fp);
	}else{
		WriteList(save);
		
	}
	

	
	printf("Export successful! press any key to continue");
	fflush(stdin);
	getchar();
	menu();
	
}

//退出-----------------------------------------------------------------------------------------
void Exit(){
	exit(0);
}


//链表相关函数---------------------------------------------------------------------------------
struct STUDENT* CreatListHead(){
	struct STUDENT* p;
	p = (struct STUDENT*)malloc(sizeof(struct STUDENT));//结构体指针创建后一定要初始化!!!
	p->next = NULL;
	return p;
}

void ListInsert(char *name,int num,int sex,double score){
	//printf("%-10s%-5d %d %4.1f\n",name,num,sex,score);
	struct STUDENT *prep,*p;
	prep = ListHead;
	p=ListHead->next;
	printf("%-10s%-5d %d %4.1f\n",name,num,sex,score);
	while(p)
	{
		prep = p;
		p =p->next;
	}
	p = (struct STUDENT*)malloc(sizeof(struct STUDENT));	
	strcpy(p->name,name);
	p->num = num;
	p->sex = sex;
	p->score = score;
	p->next = NULL;
	prep->next = p;
}

void IfListBlank(){
	struct STUDENT *prep,*p;
	int i=0;
	prep = ListHead;
	p=ListHead->next;
	while(p)
	{
		prep = p;
		p =p->next;
		i++;
	}
	printf("%d",i);
}

void ExchangeNope(struct STUDENT *p,struct STUDENT *q){
	char exchar[10];
	int exint;
	double exdouble;

	strcpy(exchar , p->name);
	strcpy(p->name , q->name);
	strcpy(q->name , exchar);
	exint = p->num;
	p->num = q->num;
	q->num = exint;
	exint = p->sex;
	p->sex = q->sex;
	q->sex = exint;
	exdouble = p->score;
	p->score = q->score;
	q->score = exdouble;
}

void DeleteNode(struct STUDENT *d){
	struct STUDENT *prep,*p,*del;
	prep = ListHead;
	p=ListHead->next;

	while(p)
	{
		if(prep==d)
		{
			prep->next = p->next;
			del = p;
			printf("%-10s%-5d %d %4.1f(已删除)\n",del->name,del->num,del->sex,del->score);
			prep = p->next;
			p = prep->next;
			free(del);
			break;
		}else{
			prep = p;
			p =p->next;
		}
	}
}

void WriteList(char *path){
	struct STUDENT *p;
//	prep = ListHead;
	p = ListHead->next;

	FILE *fpin;
	fpin = fopen(path,"w");

	while(p)
	{
	//	fwrite(p,sizeof(p),1,fpin);
		fprintf(fpin,"%-10s%-5d %d %4.1f\n",p->name,p->num,p->sex,p->score);
		printf("%-10s%-5d %d %4.1f(已写入)\n",p->name,p->num,p->sex,p->score);
		p = p->next;
	}
	fclose(fpin);
}

void IfHeadEmpty(){
	if(ListHead==NULL){
		printf("please import!\n");
		getchar();
		menu();
	}
}


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值