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

📄 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);	/*用ndegr覆盖当前记录*/
		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);
	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);
	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);
	if (stud.mno==cour.mno)				/*++++++++++++++*/
		return 1;
	else
		return 0;
}

⌨️ 快捷键说明

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