⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 degree.cpp

📁 很好的C程序设计教程
💻 CPP
字号:
/*文件名:degree.cpp*/
#include <stdio.h>
#include <string.h>
#include "student.h"
#define MAX 100
int findrel(int sno,int cno,char sna[],char cna[]);
void degree()		/*成绩管理*/
{
	void indegr();
	void updegr();
	void dedegr();
	void didegr();
	void dadegr();
	void fidegr();
	void stdegr();
	int sel1;
	do
	{
		printf("  成绩记录操作: 1:添加 2:修改 3:显示 4:查找 5:删除 6:全删 7:统计 0:返回=>");
		scanf("%d",&sel1);
		switch(sel1)
		{
		case 1:indegr();break;
		case 2:updegr();break;
		case 3:didegr();break;
		case 4:fidegr();break;
		case 5:dedegr();break;
		case 6:dadegr();break;
		case 7:stdegr();break;
		case 0:break;
		default:printf("\t**选择错误\n");break;
		}
	} while (sel1!=0);
}
void stdegr()			/*实现成绩统计功能*/
{
	void stdegr1();
	void stdegr2();
	void stdegr3();
	void stdegr4();
	int sel2;
	do
	{
		printf("  成绩统计: 1:均分(学号) 2:均分(课程) 3:不及格(学号) 4:不及格(课程) 0:返回=>");
		scanf("%d",&sel2);
		switch(sel2)
		{
		case 1:stdegr1();break;
		case 2:stdegr2();break;
		case 3:stdegr3();break;
		case 4:stdegr4();break;
		case 0:break;
		default:printf("\t**选择错误\n");break;
		}
	} while (sel2!=0);
}
void stdegr1()		/*按学号求平均分*/
{
	int i=0,snum,total=0;
	FILE *fp;
	DEGREE degr;
    	if ((fp=fopen("degree.dat","rb"))==NULL) 
	{
		printf("\t>>不能打开degree.dat文件\n");
        	return;
}
	fseek(fp,0,2);
	if (ftell(fp)>0)	/*文件不空*/
	{
		printf("    要查找的学号:");
		scanf("%d",&snum);
		rewind(fp);
		while (1) 
		{
			if (fread(&degr,sizeof(DEGREE),1,fp)!=1)
				break;
			if (degr.sno==snum) 
			{
				i++;
				total+=degr.deg;
				printf("%8d%8d(%-10s)%8d(%-20s)%5d\n",i+1,degr.sno,
degr.sname,degr.cno,degr.cname,degr.deg);
			}
		}
		if (i>0)
			printf("\t平均分:%6.1f\n",total*1.0/i);
		else
			printf("\t>>查无此人\n");
	}
	else
		printf("\t>>无任何记录\n");
}
void stdegr2()		/*按课程号求平均分*/
{
	int i=0,cnum,total=0;
	FILE *fp;
	DEGREE degr;
    	if ((fp=fopen("degree.dat","rb"))==NULL) 
	{
		printf("\t>>不能打开degree.dat文件\n");
        	return;
	}
	fseek(fp,0,2);
	if (ftell(fp)>0)	/*文件不空*/
	{
		printf("    要查找的课程号:");
		scanf("%d",&cnum);
		rewind(fp);
		while (1) 
		{
			if (fread(&degr,sizeof(DEGREE),1,fp)!=1)
				break;
			if (degr.cno==cnum) 
			{
				i++;
				total+=degr.deg;
				printf("%8d%8d(%-10s)%8d(%-20s)%5d\n",i+1,degr.sno,
degr.sname,degr.cno,degr.cname,degr.deg);
			}
		}
		if (i>0)
			printf("\t平均分:%6.1f\n",total*1.0/i);
		else
			printf("\t>>查无此人\n");
	}
	else
		printf("\t>>无任何记录\n");
}
void stdegr3()		/*按学号统计不及格的门数*/
{
	int snum,i=0;
	FILE *fp;
	DEGREE degr;
if ((fp=fopen("degree.dat","rb"))==NULL) 
	{
		printf("\t>>不能打开degree.dat文件\n");
        	return;
}
	fseek(fp,0,2);
	if (ftell(fp)>0)	/*文件不空*/
	{
		printf("    要查找的学号:");
		scanf("%d",&snum);
		rewind(fp);
		while (1) 
		{
			if (fread(&degr,sizeof(DEGREE),1,fp)!=1)
				break;
			if (degr.sno==snum && degr.deg<60) 
			{
				i++;
				printf("%8d%8d(%-10s)%8d(%-20s)%5d\n",i+1,degr.sno,
degr.sname,degr.cno,degr.cname,degr.deg);
			}
		}
		if (i>0)
			printf("\t不及格门数:%d\n",i);
		else
			printf("\t>>无不及格课程\n");
	}
	else
		printf("\t>>无任何记录\n");
}
void stdegr4()		/*按课程号统计不及格的人数*/
{
	int cnum,i=0;
	FILE *fp;
	DEGREE degr;
    	if ((fp=fopen("degree.dat","rb"))==NULL) 
	{
		printf("\t>>不能打开degree.dat文件\n");
        	return;
}
	fseek(fp,0,2);
	if (ftell(fp)>0)	/*文件不空*/
	{
		printf("    要查找的课程号:");
		scanf("%d",&cnum);
		rewind(fp);
		while (1) 
		{
			if (fread(&degr,sizeof(DEGREE),1,fp)!=1)
				break;
			if (degr.cno==cnum && degr.deg<60) 
			{
				i++;
				printf("%8d%8d(%-10s)%8d(%-20s)%5d\n",i+1,degr.sno,
degr.sname,degr.cno,degr.cname,degr.deg);
			}
		}
		if (i>0)
			printf("\t不及格人数:%d\n",i);
		else
			printf("\t>>无不及格者\n");
	}
	else
		printf("\t>>无任何记录\n");
}
void indegr()		/*添加一个记录*/
{
	FILE *fp;
	char sn[10],cn[20];
	DEGREE degr;
	if ((fp=fopen("degree.dat","ab+"))==NULL) 
		if ((fp=fopen("degree.dat","wb+"))==NULL) 
		{
			printf("\t>>不能建立degree.dat文件\n");
			return;
		}
     printf("    输入格式:学号 课程号 分数\n");
     printf("    学生记录:");
    	scanf("%d%d%d",&degr.sno,&degr.cno,&degr.deg);
if (findrel(degr.sno,degr.cno,sn,cn)==1)
{
		strcpy(degr.sname,sn);
		strcpy(degr.cname,cn);
		fwrite(&degr,sizeof(DEGREE),1,fp);
	}
	 else
		printf("\t>>学号或课程号错误\n");
fclose(fp);
}
void updegr()		/*修改一个记录,规定只能修改分数*/
{
    	FILE *fp;
    	DEGREE degr,ndegr;
    	int i,snum,cnum;
    	if ((fp=fopen("degree.dat","rb+"))==NULL) 
	{
		printf("\t>>不能打开degree.dat文件\n");
        	return;
    	}
fseek(fp,0,2);
	if (ftell(fp)>0)	/*文件不空*/
	{
		rewind(fp);
		printf("    要修改的学号和课程号:");
		scanf("%d%d",&snum,&cnum);
		for (i=0;!feof(fp) && fread(&degr,sizeof(DEGREE),1,fp)==1;i++)
			if (degr.sno==snum && degr.cno==cnum) break;
		if (feof(fp)) 
		{
			printf("\t>>没有指定的成绩记录\n");
			return;
		}
		printf("\t>>成绩记录:%d(%s),%d(%s),%d\n",degr.sno,
degr.sname,degr.cno,degr.cname,degr.deg);
		printf("    输入格式:分数:");
		scanf("%d",&ndegr.deg);						/*获取成绩记录*/
		ndegr.sno=degr.sno;							/*不能修改学号*/
		strcpy(ndegr.sname,degr.sname);
		ndegr.cno=degr.cno;
		strcpy(ndegr.cname,degr.cname);
		fseek(fp,-(long)sizeof(DEGREE),SEEK_CUR);	/*指向修改记录开头*/
		fwrite(&ndegr,sizeof(DEGREE),1,fp);	/*用newdegr覆盖当前记录*/
		fclose(fp);
	}
	else
	{
		printf("\t>>无任何记录\n");
		fclose(fp);
	}
}
void dedegr()		/*删除一个记录*/
{
	void dadegr();
	FILE *fp;
	DEGREE degr[MAX];
	int i,j,n,snum,cnum;
    	if ((fp=fopen("degree.dat","rb"))==NULL) 
	{
		printf("\t>>不能打开degree.dat文件\n");
        	return;
}
	fseek(fp,0,2);
	if (ftell(fp)>0)		/*文件不空*/
	{
		rewind(fp);
		for (n=0;!feof(fp) && fread(&degr[n],sizeof(DEGREE),1,fp);n++);
/*n为记录个数*/
		printf("    要删除的学号和课程号:");
		scanf("%d%d",&snum,&cnum);
		for (i=0;i<n && (degr[i].sno!=snum || degr[i].cno!=cnum);i++);
		if (i>=n)
		{
			printf("\t>>没有指定的成绩学生\n");
			return;
		}
		fclose(fp);					/*关闭重新以"w+"模式打开文件*/
		if (n>1)					/*原来记录数>1时重写文件*/
		{
			for (j=i;j<n-1;j++)		/*记录移动*/
				degr[i]=degr[i+1];
			fp=fopen("degree.dat","wb");
			for (i=0;i<n-1;i++)
				fwrite(&degr[i],sizeof(DEGREE),1,fp);
			fclose(fp);
		}
		else dadegr();
	}
	else
	{
		printf("\t>>无任何记录\n");
		fclose(fp);
	}
}
void didegr()		/*显示全部记录*/
{
	FILE *fp;
	int i;
	DEGREE degr;
    	if ((fp=fopen("degree.dat","rb"))==NULL) 
	{
		printf("\t>>不能打开degree.dat文件\n");
        	return;
}
	fseek(fp,0,2);
	if (ftell(fp)>0) 	/*文件不空*/
	{
		rewind(fp);
		printf("    记录号     学号(姓名)         课程号(课程)        分数\n");
		i=0;
		while (1) 
		{
			fread(&degr,sizeof(DEGREE),1,fp);
			if (feof(fp)) break;
			printf("%8d%8d(%-10s)%8d(%-20s)%5d\n",i+1,degr.sno,
degr.sname,degr.cno,degr.cname,degr.deg);
			i++;
		}
	}
	else 
		printf("\t>>无任何记录\n");
}
void dadegr()		/*删除全部记录*/
{
	FILE *fp;
    	if ((fp=fopen("degree.dat","wb"))==NULL) 
	{
		printf("\t>>不能打开degree.dat文件\n");
        	return;
}
	printf("\t>>全部记录已删\n");
	fclose(fp);
}
void fidegr()		/*查找记录*/
{
	int i=0,snum,cnum;
	FILE *fp;
	DEGREE degr;
if ((fp=fopen("degree.dat","rb"))==NULL) 
	{
		printf("\t>>不能打开degree.dat文件\n");
        	return;
}
	fseek(fp,0,2);
	if (ftell(fp)>0)	/*文件不空*/
	{
		printf("    要查找的学号和课程号:");
		scanf("%d%d",&snum,&cnum);
		rewind(fp);
		while (1) 
		{
			fread(&degr,sizeof(DEGREE),1,fp);
			if (feof(fp) || degr.sno==snum && degr.cno==cnum) break;
			i++;
		}
		if (!feof(fp)) 
		{
			printf("    记录号    学号(姓名)         课程号(课程)      分数\n");
			printf("%8d%8d(%-10s)%8d(%-20s)%5d\n",i+1,degr.sno,
degr.sname,degr.cno,degr.cname,degr.deg);
		}
		else
			printf("\t>>查无此记录\n");
	}
	else
		printf("\t>>无任何记录\n");
}
int findrel(int sno,int cno,char sna[],char cna[])
/*由给定的sno在student.dat文件中找到对应的sname,同时由给定的cno在course.dat文件中找到对应的cname,若两者都成功,将找到的值分别赋给形参sna和cna,并返回1,否则返回0*/
{
	FILE *fstud,*fcour;
	STUDENT stud;
	COURSE cour;
	int flag;
    	if ((fstud=fopen("student.dat","rb"))==NULL) 
	{
		printf("\t>>不能打开student.dat文件\n");
        	return 0;
}
    	if ((fcour=fopen("course.dat","rb"))==NULL) 
	{
		printf("\t>>不能打开course.dat文件\n");
        	return 0;
}
	fseek(fstud,0,2); 		/*以下求sno对应的sname*/
	if (ftell(fstud)>0)		/*文件不空*/
	{
		rewind(fstud);
		flag=0;
		while (!feof(fstud)) 
		{
			fread(&stud,sizeof(STUDENT),1,fstud);
			if (stud.sno==sno) 
			{
				flag=1;
				break;
			}
		}
		if (flag==1) 
			strcpy(sna,stud.sname);
		else return 0;
	}
	else return 0;
	fclose(fstud);
	fseek(fcour,0,2);		/*以下求cno对应的cname*/
	if (ftell(fcour)>0)		/*文件不空*/
	{
		rewind(fcour);
		flag=0;
		while (!feof(fcour)) 
		{
			fread(&cour,sizeof(COURSE),1,fcour);
			if (cour.cno==cno) 
			{
				flag=1;
				break;
			}
		}
		if (flag==1)
			strcpy(cna,cour.cname);
		else return 0;
	}
	else return 0;
	fclose(fcour);
	return 1;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -