成绩管理系统改进

前段时间写的成绩管理系统进入查看》》.功能和健壮性不好.

这次改写了一些地方:

1:加入文件读写;

2:异常处理(效果是!但不是C标准库的异常处理函数setjmp,longjmp);

3:其他一些小地方改写;

看代码:


#include<stdio.h>
#include<malloc.h>
#include<string.h>
#include<stdlib.h>
#include<conio.h>
typedef struct L
{
	char Name[30];
	long long Num;
	float English;
	float C_language;
	struct L *Next;
}*Node;
void Menu();                    //功能菜单 
void Search(Node p);            //查找 
void Name_Search(Node p);        //按姓名查找 
void Num_Search(Node p);          //按学号查找 
void Initialization(Node p);      //初始化表 
void Add(Node p);              // 添加 
void Insert(Node p);             //插入 
void Delet(Node p);               //删除 
void Show(Node p);                 //显示 
void Sort(Node p);            //排序 
void C_Sort(Node p);           //c成绩排序 
void En_Sort(Node p);           //英语成绩排序 
void Num_Sort(Node p);       // 学号排序 
void All_Sort(Node p);          //总成绩排序 
void Most(Node p);                  //最大值 
void DelName(Node p);         //按姓名删除 
void DelNum(Node p);       //按学号删除 
void Modify(Node p);            //修改 
void Num_Modify(Node p);         //按学号修改 
void Name_Modify(Node p);       //按姓名修改 
void Menu1();                  //菜单
void Explanation();              //说明
void Import(Node p);           //从文件导入数据
void Export(Node p);           //将数据导入到外部文件中
int main()
{
	Node p=new struct L;
	system("color 1a");
	Initialization(p);
	Menu();
	printf("\t选择:\n");
	printf("\t");
	int m;
	while(true)
	{
		if(scanf("%d",&m)!=0)
		{
			if(m==11)
			{
				Explanation();
				getch();
				system("cls");
				break;
			}
			else
			{
				printf("\t请先看说明!\n");
				printf("\t");
			}	
		}
		else 
		{
			printf("\t输入有误!!结束!!\n");
			getch();
			exit(0);
		}
	}
	Menu1();
	printf("\t选择:\n");
	printf("\t");
	int n;
	while(scanf("%d",&n)!=EOF)
	{
		switch(n)
		{
			case 1:
				Add(p);fflush(stdin);break;
			case 2:
				Show(p);fflush(stdin);break;
			case 3:
				Insert(p);fflush(stdin);break;
			case 4:
				Sort(p);fflush(stdin);break;
			case 5:
				Delet(p);fflush(stdin);break;
			case 6:
				Search(p);fflush(stdin);break;
			case 7:
				Modify(p);fflush(stdin);break;
			case 8:
				fflush(stdin);return 0;
			case 9:
				Export(p);fflush(stdin);break;
			case 10:
				Import(p);fflush(stdin);break;
			case 11:
				Explanation();fflush(stdin);break;
			default :
				fflush(stdin);printf("\t没有该选项:\n");break;
		}
		
		getch();
		printf("\t");
		system("cls");
		Menu1();
		printf("\t选择:\n");
		printf("\t");
	}
	return 0;
}
void Menu()
{
	printf("\n");
	printf("\t             成绩管理系统 \3\n");
	printf("        --------------------------------------\n");
	printf("\t|\t1:添加\t   |\t2:输出\t     |\n");
	printf("        --------------------------------------\n");
	printf("\t|\t3:插入\t   |\t4:排序\t     |\n");
	printf("        --------------------------------------\n");
	printf("\t|\t5:删除\t   |\t6:查询\t     |\n");
	printf("        --------------------------------------\n");
	printf("\t|\t7:修改\t   |\t8:退出\t     |\n");
	printf("        --------------------------------------\n");
	printf("\t|\t9:写出到文件\t             |\n");
	printf("        --------------------------------------\n");
	printf("\t|\t10:导入从文件\t             |\n");
	printf("        --------------------------------------\n");
	printf("\t|\t11:说明(必看!)\t     |\n");
	printf("        --------------------------------------\n");
	printf("\t");
	printf("\n");
}
void Initialization(Node p)
{
	p->Next=NULL;
	p->Num=0;
}
void Add(Node p)
{
	Node io=p;
	long long a;
	float b,c;
	char na[30];
	int len=p->Num;
	for(int i=0;i<len;++i)
	{
		p=p->Next;
	}
	Node j=(Node)malloc(sizeof(struct L));
	printf("\t输入姓名:\n");
	printf("\t");
	scanf("%s",&na);
	printf("\t输入学号:\n");
	printf("\t");
	if(scanf("%lld",&a)==0)
	{
		printf("\t输入类型与要求不符合,添加失败!!\n");
		getch();
		return ;
	}
	printf("\t输入英语成绩:\n");
	printf("\t");
	if(scanf("%f",&b)==0)
	{
		printf("\t输入类型与要求不符合,添加失败!!\n");
		getch();
		return ;
	}
	printf("\t输入C语言成绩:\n");
	printf("\t");
	if(scanf("%f",&c)==0)
	{
		printf("\t输入类型与要求不符合,添加失败!!\n");
		getch();
		return ;
	}
	strcpy(j->Name,na);
	j->Num=a;
	j->English=b;
	j->C_language=c;
	p->Next=j;
	j->Next=NULL;
	printf("\t添加成功!\n");
	io->Num++;
	getch();
}
void Insert(Node p)
{
	p->Num++;
	printf("\t输入插入位置:\n");
	int n;
	printf("\t");
	scanf("%d",&n);
	if(n<=0)
	{
		printf("位置错误!\n");
		return;
	}
	n-=1;
	while(n--)
	{
		p=p->Next;
	}
	Node q=(Node)malloc(sizeof(struct L));
	printf("\t输入姓名:\n");
	scanf("%s",&q->Name);
	printf("\t输入学号:\n");
	scanf("%lld",&q->Num);
	printf("\t输入英语成绩:\n");
	scanf("%f",&q->English);
	printf("\t输入C语言成绩:\n");
	scanf("%f",&q->C_language);
	q->Next=p->Next;
	p->Next=q;
	printf("\t插入成功!\n");
	getch();
}
void Delet(Node p)
{
	if(p->Num==0)
	{
		printf("\t没有可删除的数据!\n");
		return;
	}
	p->Num--;
	printf("\t选择:\n");
	printf("\t1:按姓名删除:\n");
	printf("\t2:按学号删除:\n");
	int n;
	printf("\t");
	scanf("%d",&n);
	switch(n)
	{
		case 1:DelName(p);break;
		case 2:DelNum(p);break;
		default:printf("\t无此选择!\n");break;
	}
	printf("\t删除成功!\n");
	getch();
}
void DelName(Node p)
{
	char s[30];
	printf("\t输入姓名:\n");
	printf("\t");
	scanf("%s",&s);
	Node q=p;
	for(q=q->Next;q->Next!=NULL;q=q->Next,p=p->Next)
	{
		if(!strcmp(q->Name,s))
		{
			p->Next=p->Next->Next;
		}
	}
	getch();
}
void DelNum(Node p)
{
	long long n;
	printf("\t输入学号:\n");
	printf("\t");
	scanf("%lld",&n);
	Node q=p;
	for(q=q->Next;q->Next!=NULL;q=q->Next,p=p->Next)
	{
		if(q->Num==n)
		{
			p->Next=p->Next->Next;
		}
	}
	getch();
}
void Show(Node p)
{
	if(p->Num==0)
	{
		printf("\t没有可显示的数据!\n");
		return;
	}
	int len=p->Num;
	p=p->Next;
	for(int i=0;i<len;++i)
	{
		printf("        -------------------------------------------------\n");
		printf("\t|\t姓名:\t\t|\t%s\n",p->Name);
		printf("        -------------------------------------------------\n");
		printf("\t|\t学号:\t\t|\t%lld\n",p->Num);
		printf("        -------------------------------------------------\n");
		printf("\t|\t英语:\t\t|\t%.2f\n",p->English);
		printf("        -------------------------------------------------\n");
		printf("\t|\tC语言:\t\t|\t%.2f\n",p->C_language);
		printf("        -------------------------------------------------\n");
		printf("\t|\t总分:\t\t|\t%.2f\n",p->English+p->C_language);
		printf("        -------------------------------------------------\n");
		printf("\n");
		p=p->Next;
	}
	printf("\t总人数为:%d\n",len);
	printf("\t显示完!\n");
	getch();
}
void C_Sort(Node p)
{
	Node x,y;
	int len=p->Num;
	for(int i=0;i<len;++i)
	{
		p=p->Next;
		x=p;
		y=p->Next;
		for(int j=i+1;j<len;++j)
		{
			if(x->C_language>y->C_language)
			{
				x=y;
			}
			y=y->Next;
		}
			float a,b;
			long long w;
			char s[30];
			w=x->Num;
			x->Num=p->Num;
			p->Num=w;
			strcpy(s,x->Name);
			strcpy(x->Name,p->Name);
			strcpy(p->Name,s);
			a=x->C_language;
			x->C_language=p->C_language;
			p->C_language=a;
			b=x->English;
			x->English=p->English;
			p->English=b;
	}
	printf("\t排序成功!\n");
	getch();
}
void Sort(Node p)
{
	if(p->Num==0)
	{
		printf("\t没有可排序的数据!\n");
		return;
	}
	printf(" \t选择:\n");
	printf(" \t1:C语言成绩从小到大排序:\n");
	printf(" \t2:英语成绩从小到大排序:\n");
	printf(" \t3:总成绩从小到大排序:\n");
	printf(" \t4:学号从小到大排序:\n");
	int n;
	printf("\t");
	scanf("%d",&n);
	switch(n)
	{
		case 1:C_Sort(p);break;
		case 2:En_Sort(p);break;
		case 3:All_Sort(p);break;
		case 4:Num_Sort(p);break;
		default:printf("\t无此选择!\n");break;
	}
	getch();
}
void En_Sort(Node p)
{
	Node x,y;
	int len=p->Num;
	for(int i=0;i<len;++i)
	{
		p=p->Next;
		x=p;
		y=p->Next;
		for(int j=i+1;j<len;++j)
		{
			if(x->English>y->English)
			{
				x=y;
			}
			y=y->Next;
		}
			float a,b;
			char s[30];
			long long w;
			w=x->Num;
			x->Num=p->Num;
			p->Num=w;
			strcpy(s,x->Name);
			strcpy(x->Name,p->Name);
			strcpy(p->Name,s);
			a=x->C_language;
			x->C_language=p->C_language;
			p->C_language=a;
			b=x->English;
			x->English=p->English;
			p->English=b;
	}
	printf("\t排序成功!\n");
	getch();
}
void Search(Node p)
{
	if(p->Num==0)
	{
		printf("\t没有可查找的数据!\n");
		return;
	}
	printf(" \t选择:\n");
	printf(" \t1:按姓名查询:\n");
	printf(" \t2:按学号查询:\n");
	int n;
	printf("\t");
	scanf("%d",&n);
	switch(n)
	{
		case 1:Name_Search(p);break;
		case 2:Num_Search(p);break;
		default:printf("\t无此选择!\n");break;
	}
	getch();
}
void Name_Search(Node p)
{
	char ap[30];
	printf("\t输入姓名:\n");
	printf("\t");
	scanf("%s",&ap);
	int len=p->Num;
	p=p->Next;
	int i;
	for(i=0;i<len;++i)
	{
		if(!strcmp(ap,p->Name))
		{
			printf("        -------------------------------------------------\n");
			printf("\t|\t姓名:\t\t|\t%s\n",p->Name);
			printf("        -------------------------------------------------\n");
			printf("\t|\t学号:\t\t|\t%lld\n",p->Num);
			printf("        -------------------------------------------------\n");
			printf("\t|\t英语:\t\t|\t%.2f\n",p->English);
			printf("        -------------------------------------------------\n");
			printf("\t|\tC语言:\t\t|\t%.2f\n",p->C_language);
			printf("        -------------------------------------------------\n");
			printf("\t|\t总分:\t\t|\t%.2f\n",p->English+p->C_language);
			printf("        -------------------------------------------------\n");
			break;
		}
		p=p->Next;
	}
	if(i>=len)
	{
		printf("\t没有找到该学生!\n");
	}
	getch();
}
void Num_Search(Node p)
{
	long long sd;
	printf("\t输入学号:\n");
	printf("\t");
	scanf("%lld",&sd);
	int len=p->Num;
	p=p->Next;
	int i;
	for(i=0;i<len;++i)
	{
		if(sd==p->Num)
		{
			printf("        -------------------------------------------------\n");
			printf("\t|\t姓名:\t\t|\t%s\n",p->Name);
			printf("        -------------------------------------------------\n");
			printf("\t|\t学号:\t\t|\t%lld\n",p->Num);
			printf("        -------------------------------------------------\n");
			printf("\t|\t英语:\t\t|\t%.2f\n",p->English);
			printf("        -------------------------------------------------\n");
			printf("\t|\tC语言:\t\t|\t%.2f\n",p->C_language);
			printf("        -------------------------------------------------\n");
			printf("\t|\t总分:\t\t|\t%.2f\n",p->English+p->C_language);
			printf("        -------------------------------------------------\n");
			break;
		}
			p=p->Next;
	}
	if(i>=len)
	{
		printf("\t没有找到该学生!\n");
	}
	getch();
}
void Modify(Node p)
{
	if(p->Num==0)
	{
		printf("\t没有可修改的数据!\n");
		return;
	}
	printf(" \t选择:\n");
	printf(" \t1:输入姓名修改:\n");
	printf(" \t2:输入学号修改:\n");
	int n;
	printf("\t");
	scanf("%d",&n);
	switch(n)
	{
		case 1:Name_Modify(p);break;
		case 2:Num_Modify(p);break;
		default:printf("\t无此选择!\n");break;
	}
	getch();
}
void Num_Modify(Node p)
{
	long long sd;
	printf("\t输入学号:\n");
	printf("\t");
	scanf("%lld",&sd);
	int len=p->Num;
	p=p->Next;
	int i;
	for(i=0;i<len;++i)
	{
		if(sd==p->Num)
		{
			printf("        -------------------------------------------------\n");
			printf("\t|\t姓名:\t\t|\t%s\n",p->Name);
			printf("        -------------------------------------------------\n");
			printf("\t|\t学号:\t\t|\t%lld\n",p->Num);
			printf("        -------------------------------------------------\n");
			printf("\t|\t英语:\t\t|\t%.2f\n",p->English);
			printf("        -------------------------------------------------\n");
			printf("\t|\tC语言:\t\t|\t%.2f\n",p->C_language);
			printf("        -------------------------------------------------\n");
			printf("\t这是之前的数据!\n");
			printf("\t现在请更改!\n");
			printf("\t输入姓名:\n");
			printf("\t");
			scanf("%s",&p->Name);
			printf("\t输入学号:\n");
			printf("\t");
			scanf("%lld",&p->Num);
			printf("\t输入英语成绩:\n");
			printf("\t");
			scanf("%f",&p->English);
			printf("\t输入C语言成绩:\n");
			printf("\t");
			scanf("%f",&p->C_language);
			printf("\t修改成功!\n");
			getch();
			break;
		}
		p=p->Next;
	}
	if(i>=len)
	{
		printf("\t没有找到该学生!\n");
	}
	getch();

}
void Name_Modify(Node p)
{
	char ap[30];
	printf("\t输入姓名:\n");
	printf("\t");
	scanf("%s",&ap);
	int len=p->Num;
	p=p->Next;
	int i;
	for(i=0;i<len;++i)
	{
		if(!strcmp(ap,p->Name))
		{
			printf("        -------------------------------------------------\n");
			printf("\t|\t姓名:\t\t|\t%s\n",p->Name);
			printf("        -------------------------------------------------\n");
			printf("\t|\t学号:\t\t|\t%lld\n",p->Num);
			printf("        -------------------------------------------------\n");
			printf("\t|\t英语:\t\t|\t%.2f\n",p->English);
			printf("        -------------------------------------------------\n");
			printf("\t|\tC语言:\t\t|\t%.2f\n",p->C_language);
			printf("        -------------------------------------------------\n");
			printf("\t这是之前的数据!\n");
			printf("\t现在请更改!\n");
			printf("\t输入姓名:\n");
			printf("\t");
			scanf("%s",&p->Name);
			printf("\t输入学号:\n");
			printf("\t");
			scanf("%lld",&p->Num);
			printf("\t输入英语成绩:\n");
			printf("\t");
			scanf("%f",&p->English);
			printf("\t输入C语言成绩:\n");
			printf("\t");
			scanf("%f",&p->C_language);
			printf("\t修改成功!\n");
			getch();
			break;
		}
		p=p->Next;
	}
	if(i>=len)
	{
		printf("\t没有找到该学生!\n");
	}
	getch();

}
void All_Sort(Node p)
{
	Node x,y;
	int len=p->Num;
	for(int i=0;i<len;++i)
	{
		p=p->Next;
		x=p;
		y=p->Next;
		for(int j=i+1;j<len;++j)
		{
			if((x->English+x->C_language)>(y->English+y->C_language))
			{
				x=y;
			}
			y=y->Next;
		}
		float a,b;
		char s[30];
		long long w;
		w=x->Num;
		x->Num=p->Num;
		p->Num=w;
		strcpy(s,x->Name);
		strcpy(x->Name,p->Name);
		strcpy(p->Name,s);
		a=x->C_language;
		x->C_language=p->C_language;
		p->C_language=a;
		b=x->English;
		x->English=p->English;
		p->English=b;
	}
	printf("\t排序成功!\n");
	getch();
}
void Num_Sort(Node p)
{
	Node x,y;
	int len=p->Num;
	for(int i=0;i<len;++i)
	{
		p=p->Next;
		x=p;
		y=p->Next;
		for(int j=i+1;j<len;++j)
		{
			if(x->Num>y->Num)
			{
				x=y;
			}
			y=y->Next;
		}
			float a,b;
			char s[30];
			long long w;
			w=x->Num;
			x->Num=p->Num;
			p->Num=w;
			strcpy(s,x->Name);
			strcpy(x->Name,p->Name);
			strcpy(p->Name,s);
			a=x->C_language;
			x->C_language=p->C_language;
			p->C_language=a;
			b=x->English;
			x->English=p->English;
			p->English=b;
	}
	printf("\t排序成功!\n");
	getch();
}
void Menu1()
{
	system("color 1a");
	printf("\n");
	printf("\t             成绩管理系统 \3\n");
	printf("        --------------------------------------\n");
	printf("\t|\t1:添加\t   |\t2:输出\t     |\n");
	printf("        --------------------------------------\n");
	printf("\t|\t3:插入\t   |\t4:排序\t     |\n");
	printf("        --------------------------------------\n");
	printf("\t|\t5:删除\t   |\t6:查询\t     |\n");
	printf("        --------------------------------------\n");
	printf("\t|\t7:修改\t   |\t8:退出\t     |\n");
	printf("        --------------------------------------\n");
	printf("\t|\t9:写出到文件\t             |\n");
	printf("        --------------------------------------\n");
	printf("\t|\t10:导入从文件\t             |\n");
	printf("        --------------------------------------\n");
	printf("\t");
	printf("\n");
}
void Explanation()
{
	system("cls");
	system("color 07");
	printf("------------------------------------------------------------------\n");
	printf("\t在编写过程中有很多地方使用了getch停顿\n");
	printf("------------------------------------------------------------------\n");
	printf("\t所以经常回车要按两次!也要看情况,有些地方一次就行了\n");
	printf("------------------------------------------------------------------\n");
	printf("\t如果按了一次回车没有反应,那就在按一次,\n");
	printf("------------------------------------------------------------------\n");
	printf("\t在输入文件地址的时候要输入绝对地址\n");	
	printf("------------------------------------------------------------------\n");
	printf("\t请保证文件中的格式为 姓名 学号 英语成绩 C语言成绩\n");
	printf("------------------------------------------------------------------\n");
	printf("\t下一组数据换行,否则导入会出错的!\n");
	printf("------------------------------------------------------------------\n");	
	printf("\t在win7下要在C盘写文件需要用管理员权限.\n");
	printf("------------------------------------------------------------------\n");
	printf("\t");
	getch();
}
void Import(Node p)
{
	printf("\t提示:此操作将使用文件中的数据衔接到此时内存中的缓存数据后面\n");
	char ch;
	printf("\n");
	printf("\t\t\t同意吗!(y/n)\n");
	fflush(stdin);
	printf("\t");
	scanf("%c",&ch);
	if(ch=='y'||ch=='Y')
	{
		//p->Num=0;
		FILE * a1;
		char lujing[100];
		printf("\t输入要导入文件的路径!\n");
		fflush(stdin);
		printf("\t");
		gets(lujing);
		a1=fopen(lujing,"rb");
		if(a1==NULL)
		{
			printf("\t打开文件失败,操作失败!\n");
			return ;
		}
		Node JP=p,am=p;
		while(am->Next!=NULL)
			am=am->Next;
		Node w=am;
		int cnt=0;
		while(!feof(a1))
		{
			JP->Num++;
			Node NEW =new struct L;
			fscanf(a1,"%s%lld%f%f",NEW->Name,&NEW->Num,&NEW->English,&NEW->C_language);
			am->Next=NEW;
			NEW->Next=NULL;
			cnt++;
			am=am->Next;
		}
		for(int i=0;i<cnt-1;++i)
			w=w->Next;
		Node qw=w->Next;
		delete qw;
		w->Next=NULL;
		JP->Num--;
		printf("\t操作成功!\n");
		fclose(a1);
		getch();
		return ;
	}
	else if(ch=='n'||ch=='N')
	{
		printf("\t操作被取消!\n");
		getch();
		return ;
	}
	else
	{
		printf("\t输入有误!\n");
		getch();
		return ;
	}	
}
void Export(Node p)
{
	printf("\t警告:此操作将覆盖源文件中的数据!!\n");
	char ch;
	printf("\n");
	printf("\t\t\t同意吗?(y/n)\n");
	fflush(stdin);
	printf("\t");
	scanf("%c",&ch);
	if(ch=='y'||ch=='Y')
	{
		FILE * a1;
		char lujing[100];
		printf("\t输入要导出文件的路径!\n");
		fflush(stdin);
		printf("\t");
		gets(lujing);
		a1=fopen(lujing,"wb");
		if(a1==NULL)
		{
			printf("\t打开文件失败,导出数据失败!\n");
			return ;
		}
		int len=p->Num;
		for(int i=0;i<len;++i)
		{
			p=p->Next;
			fprintf(a1,"%s %lld %.2f %.2f\n",p->Name,p->Num,p->English,p->C_language);
		}
		printf("\t操作成功!\n");
		fclose(a1);
		getch();
		return ;
	}
	else if(ch=='n'||ch=='N')
	{
		printf("\t操作被取消!\n");
		getch();
		return ;
	}
	else
	{
		printf("\t输入有误!\n");
		getch();
		return ;
	}
}


原先为了解决那个输入错误问题,想了很多方法,近期看一个C函数手册发现scanf函数。。。。。。解决了!!其实scanf函数是有返回值的,

函数原型:int scanf(char *format[,argument,...]); 

如果输入有误则返回0;否则返回输入数据的个数,利用这点就可以解决IO异常;

以前听一个老师讲java异常的时候他说这类异常是C语言力所不能及的!!

现在才发现C语言的博大精深,很多很多不知道的C语言秘密,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值