c语言课程设计

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
#include<conio.h>
#define H "--------------------------------------------------------------------------\n"
#define H0 "------------------------------------------------------------------------------\n"
#define H1 "|   学号    |  姓名  |  系别 |   班级   |语文   |数学   | 英语  | 总成绩 |\n"
#define H2 "|-----------|--------|-------|----------|-------|-------|-------|--------|\n"
#define H3 "|------------------|------------------|-------------------|-----------------|\n"
#define H4 "|   学号    |  姓名  |  系别 |   班级   |语文   |数学   | 英语  | 总成绩 |名次\n"
#define H5 "|-----------|--------|-------|----------|-------|-------|-------|--------|----\n"
struct subject
{
	double math;
	double english;
	double chinese;
};
struct student
{
	char name[20];//姓名
	char num[20]; //学号
	char cla[20]; //班级
	char dept[20]; //系别
	struct subject sub; //课程
	double sum; //总成绩
}students[500];
bool cmp1(student s1,student s2) //语文成绩比较
{
	return s1.sub.chinese>s2.sub.chinese;
}
bool cmp2(student s1,student s2)//数学成绩比较
{
	return s1.sub.math>s2.sub.math;
}
bool cmp3(student s1,student s2) //英语成绩比较
{
	return s1.sub.english>s2.sub.english;
}
bool cmp4(student s1,student s2)  //总成绩比较
{
	return s1.sum>s2.sum;
}
int Sort(int cmd)  //成绩比较函数
{
	student stu;
	FILE *fp=fopen("D:\\inform.txt","ab+");
	int n,cnt=0;
	while((n=fread(&stu,sizeof(stu),1,fp)>0))
	{
		students[cnt++]=stu;
	}
	fclose(fp);
	switch(cmd)
	{
	case 1:
	std::sort(students,students+cnt,cmp1);
		break;
	case 2:
	std::sort(students,students+cnt,cmp2);
		break;
	case 3:
	std::sort(students,students+cnt,cmp3);
		break;
	case 4:
	std::sort(students,students+cnt,cmp4);
		break;
	default:
		exit(0);
	}
	return cnt;
}
char menu()//菜单选择函数
{
	char n;
	system("CLS");//清屏
	puts("\n");
	puts("\t\t    O(∩_∩)O~~ 欢迎来到学生成绩管理分析系统\n");
    puts("\t\t╔*☆***◎***◇***☆*** 菜单 ***☆***◇***◎***☆*╗\n");
	puts("\t\t|☆|\t\t 1.学生信息录入\t\t\t|☆|\n");
	puts("\t\t|★|\t\t 2.学生信息显示\t\t\t|★|\n");
    puts("\t\t|☆|\t\t 3.学生信息查询\t\t\t|☆|\n");
	puts("\t\t|★|\t\t 4.学生信息修改\t\t\t|★|\n");
	puts("\t\t|☆|\t\t 5.学生信息删除\t\t\t|☆|\n");
	puts("\t\t|★|\t\t 6.学生成绩分析\t\t\t|★|\n");
	puts("\t\t|☆|\t\t 7.退出\t\t\t\t|☆|\n");
	puts("\t\t╚*☆***◎***◇****☆****★****☆****◇***◎***☆*╝\n");
    printf("\t请选择您要实现的功能选项 (1-7): [ ]\b\b");
	while(1)
	{
		n=getchar();getchar();
		if(n<'1'||n>'7')
			printf("输入错误,请您重新输入选项(1-7):[ ]\b\b");
		else
			break;
	}
	return n;
}
void Append()//信息输入函数
{
	struct student stu;
	FILE * fp;
	char ch; 
	if((fp=fopen("D:\\inform.txt","ab"))==NULL)
	{
		printf("\tCan not open the inform file!");
		getch();
		exit(1);
	}
	do
	{
	 printf("\t请输入学号:");gets(stu.num);
	 printf("\t请输入姓名:");gets(stu.name);
	 printf("\t请输入系院:");gets(stu.dept);
	 printf("\t请输入班级:");gets(stu.cla);
	 printf("\t请按顺序输入学生的语文成绩,数学成绩和英语成绩:");
	 scanf("%lf%lf%lf",&stu.sub.chinese,&stu.sub.math,&stu.sub.english);
	 stu.sum=stu.sub.chinese+stu.sub.math+stu.sub.english;
	 fwrite(&stu,sizeof(stu),1,fp);
	 printf("\t是否继续添加?(Y/N):[ ]\b\b");
	 getchar();
	 ch=getchar();
	 getchar();
	}while(ch=='Y'||ch=='y');
	fclose(fp);
}
void print1() //输出函数
{
	printf(H);
   printf(H1);
   printf(H2);
}
void print2(struct student stu) //输出函数
{
	printf("|%-11s|%-8s|%-7s|%-10s|%-7.2lf|%-7.2lf|%-7.2lf|%-8.2lf|\n",stu.num,stu.name,stu.dept,stu.cla,stu.sub.chinese,stu.sub.math,stu.sub.english,stu.sum);
	printf(H2);
}
void Display() //信息显示函数
{
 struct student stu;
 FILE *fp;
 int total=0;
 if((fp=fopen("D:\\inform.txt","rb"))==NULL)
 {
	 printf("\tCan not open the inform file!");
	 getch();
	 exit(1);

 }
 while(fread(&stu,sizeof(stu),1,fp)==1)
	{
		total++;
		if(total==1)print1();
		print2(stu);
	}
	fclose(fp);
	printf("\n\n\tThere are %d record in all!",total);
	printf("\n\n\tPress any key to continue......");
	getch();
}
void Search() //信息查询函数
{
	struct student stu;
	FILE *fp;
	int flag;
    int total=0;
	char ch[10];
	char f;
	if((fp=fopen("D:\\inform.txt","rb"))==NULL)
{
    printf("\tCan not open the inform file!");
    getch();
    exit(1);
}
do
{
rewind(fp);
printf("\n\n\t1:按学号查询\n\t2:按姓名查询\n\t3:按系院查询\n\t4:按班级查询\n\t\t\t[ ]\b\b");
while(1)
{
scanf("%d",&flag);getchar();
if(flag<1||flag>4)
{
	printf("输入错误,请您重新输入\n");
	printf("\n1:按学号查询\n 2:按姓名查询\n 3:按系院查询\n 4:按班级查询\n):[ ]\b\b");
}
else
  break;
}
if(flag==1)    
{	printf("请输入您想要查询的学号:");
    gets(ch);
	total=0;
	while(fread(&stu,sizeof(stu),1,fp)==1)
		if(strcmp(ch,stu.num)==0)
		{
		total++;
		if(total==1)print1();
		print2(stu);
		}
}
if(flag==2)     
{
printf("请输入您想要查询的姓名:");
gets(ch);
total=0;      
while(fread(&stu,sizeof(stu),1,fp)==1)
if(strcmp(ch,stu.name)==0)
{
total++;
if(total==1)print1();
print2(stu);
}
}
if(flag==3)     
{
printf("请输入您想要查询的系院:");
gets(ch);
total=0;      
while(fread(&stu,sizeof(stu),1,fp)==1)
if(strcmp(ch,stu.dept)==0)
{
total++;
if(total==1)print1();
print2(stu);
}
}
if(flag==4)     
{
printf("请输入您想要查询的班级:");
gets(ch);
total=0;      
while(fread(&stu,sizeof(stu),1,fp)==1)
if(strcmp(ch,stu.cla)==0)
{
total++;
if(total==1)print1();
print2(stu);
}
}
printf("\n\n\tThere are %d record include!\n",total);
printf("Search any more?(Y/N):[ ]\b\b");
f=getchar();getchar();
}while(f=='Y'||f=='y');
fclose(fp);
}
void Modify()     //信息修改函数 
{
struct student stu;
FILE *fp1,*fp2;
int flag;
char ch[15];
char f;
do
{
 if((fp1=fopen("D://inform.txt","rb"))==NULL)
 {
  printf("\tCan not open the inform file!");
  getch();
  exit(1);
 }
 if((fp2=fopen("D://temp.txt","wb"))==NULL)
 {
       printf("\tCan not creat the temp file!");
  getch();
  exit(1);
 }
 printf("请输入您想要修改信息的学号:");
 gets(ch);
 flag=0;
 while(fread(&stu,sizeof(stu),1,fp1)==1)
 {
  if(strcmp(ch,stu.num)==0)
  {
   print1();
   print2(stu);
   printf("\n\n请输入新的信息:\n");
   printf("\t学号:");gets(stu.num);
            printf("\t姓名:");gets(stu.name);
            printf("\t系别:");gets(stu.dept);
			printf("\t班级:");gets(stu.cla);
   printf("\t请按顺序输入语文成绩、数学成绩、英语成绩:");
   scanf("%lf%lf%lf",&stu.sub.chinese,&stu.sub.math,&stu.sub.english);
   stu.sum=stu.sub.chinese+stu.sub.math+stu.sub.english;
   getchar();
   flag=1;
}
 fwrite(&stu,sizeof(stu),1,fp2);
}
fclose(fp1);
fclose(fp2);
if(flag==1)
{
printf("修改成功!\n");
remove("D://inform.txt");
rename("D://temp.txt","D://inform.txt");
}
else
printf("对不起 %>_<%,找不到这项纪录!\n");
printf("是否要修改更多的信息?(Y/N):[ ]\b\b");
f=getchar();     getchar();
}while(f=='Y'||f=='y');
}
void Delete()         //信息删除函数
{
 struct student stu;
 FILE *fp1,*fp2;
 int flag;
 char ch[10];
 char f;
 do
 {
 if((fp1=fopen("D://inform.txt","rb"))==NULL)
 {
 printf("\tCan not open the inform file!");
 getchar();
 exit(1);
 }
 if((fp2=fopen("D://temp.txt","wb"))==NULL)
 {
  printf("\tCan not creat the temp file!");
 getch();
 exit(1);
 }
 printf("请输入您想要删除信息的学号:");
 gets(ch);
 flag=0;
 while(fread(&stu,sizeof(stu),1,fp1)==1)
 {
 if(strcmp(ch,stu.num)==0)
 {
 print1();
 print2(stu);
 flag=1;
 }
 else
 fwrite(&stu,sizeof(stu),1,fp2);
 }
 fclose(fp1);
fclose(fp2);
   if(flag==1)
   {
    printf("删除成功!\n");
    remove("D://inform.txt");
    rename("D://temp.txt","D://inform.txt");
   }
   else 
    printf("Can not find this record!\n");
   printf("Delete any more?(Y/N):[ ]\b\b");
   f=getchar();
   getchar();
  }while(f=='Y'||f=='y');
 }
void Analyse()  //信息分析函数
{
	struct student stu;
	FILE *fp;
	int flag,flag1;
    int total=0;
	int pass=0,fail=0,better=0;
	char ch[10];
	char f;
	if((fp=fopen("D://inform.txt","rb"))==NULL)
		{
			printf("\tCan not open the inform file!");
			getch();
			exit(1);
		}
do
{
	rewind(fp);
	printf("\n\n\t1:课程成绩分析\n\t2:班级成绩分析\n\t3:院系成绩分析\n\t\t请选择:[ ]\b\b");
	while(1)
		{
			scanf("%d",&flag);getchar();
			if(flag<1||flag>3)
			{
				printf("输入错误,请您重新输入\n");
				printf("\n\n\t1:课程成绩分析\n\t2:班级成绩分析\n\t3:院系成绩分析\n\t\t请选择:[ ]\b\b");
			}
			else
		    	break;
		}
	if(flag==1)    
	{
		printf("\n\n\t1:语文成绩分析\n\t2:数学成绩分析\n\t3:英语成绩分析\n\t4:总成绩排名\n");
		printf("\t\t请选择:[ ]\b\b");
		scanf("%d",&flag1);getchar();
			if(flag1<1||flag1>4)
			{
			printf("\n\t\t输入错误,请您重新输入\n");
			printf("\n\n\t1:语文成绩分析\n\t2:数学成绩分析\n\t3:英语成绩分析\n\t4:总成绩排名\n\t\t\t[ ]\b\b");
			}
	if(flag1==1)
	{
	total=0;           //总人数
	pass=0;            //及格人数
	fail=0;            //不及格人数
	better=0;          //优秀人数
	int cnt=Sort(1);
	while(fread(&stu,sizeof(stu),1,fp)==1)
	{
		total+=stu.sub.chinese;
			if(stu.sub.chinese>=60)
			{
				pass++;
				if(stu.sub.chinese>=80)
					better++;
			}
		else
			fail++;
	}
	double ave=total/cnt;
    puts("语文成绩成绩分析:");
	printf("共有%d学生\n优秀:%d人\n及格:%d人\n不及格:%d人\n及格率:%.2lf%%\n",cnt,better,pass,fail,pass*100.0/cnt);
	printf(H3);
	printf("      %s                %s                %s             %s\n","名次","姓名","学号","语文成绩");
	printf(H3);
	for(int i=0;i<cnt;i++)
	{
		printf("     第%2d名\t\t %-17s%-23s%-8.2lf\n",i+1,students[i].name,students[i].num,students[i].sub.chinese);
	    printf(H3);
	}
	printf("平均分:%.2lf\n",ave);
	}
	if(flag1==2)
	{
	total=0;pass=0;fail=0;better=0;
	int cnt=Sort(2);
	while(fread(&stu,sizeof(stu),1,fp)==1)
	{
		total+=stu.sub.math;
			if(stu.sub.math>=60)
			{
				pass++;
				if(stu.sub.math>=80)
					better++;
			}
		else
			fail++;
	}
	double ave=total/cnt;
    puts("数学成绩成绩分析:");
	printf("共有%d学生\n优秀:%d人\n及格:%d人\n不及格:%d人\n及格率:%.2lf%%\n",cnt,better,pass,fail,pass*100.0/cnt);
	printf(H3);	
	printf("      %s                %s                %s             %s\n","名次","姓名","学号","数学成绩");
	printf(H3);	
	for(int i=0;i<cnt;i++)
	{
		printf("     第%2d名\t\t %-17s%-23s%-8.2lf\n",i+1,students[i].name,students[i].num,students[i].sub.math);
	    printf(H3);	
	}
	printf("平均分:%.2lf\n",ave);

	}
	if(flag1==3)
	{
    total=0;pass=0;fail=0;better=0;
	int cnt=Sort(3);
	while(fread(&stu,sizeof(stu),1,fp)==1)
		{
			total+=stu.sub.english;
				if(stu.sub.english>=60)
				{
					pass++;
					if(stu.sub.english>=80)
						better++;
				}
			else
				fail++;
		}
	double ave=total/cnt;
    puts("英语成绩成绩分析:");
	printf("共有%d学生\n优秀:%d人\n及格:%d人\n不及格:%d人\n及格率:%.2lf%%\n",cnt,better,pass,fail,pass*100.0/cnt);
	printf(H3);	
	printf("      %s                %s                %s             %s\n","名次","姓名","学号","英语成绩");
	printf(H3);	
	for(int i=0;i<cnt;i++)
		{
			printf("     第%2d名\t\t %-17s%-23s%-8.2lf\n",i+1,students[i].name,students[i].num,students[i].sub.english);	
		    printf(H3);
		}
	printf("平均分:%.2lf\n",ave);
	}
	if(flag1==4)
	{
		total=0;int cnt=Sort(4);	
		puts("总成绩排名:");
       printf(H0);printf(H4);printf(H5);
		for(int i=0;i<cnt;i++)
			{
                printf("|%-11s|%-8s|%-7s|%-10s|%-7.2lf|%-7.2lf|%-7.2lf|%-8.2lf| %d\n",students[i].num,students[i].name,students[i].dept,students[1].cla,students[i].sub.chinese,students[i].sub.math,students[i].sub.english,students[i].sum,i+1);
			printf(H5);
			}
	}
	}
if(flag==2)     
{
	int yu1,sh1,yi1,yu2,sh2,yi2;
printf("请输入您想要查询的班级:");
gets(ch);//printf("%s\n",ch);system("pause");
int count=0;yu1=0;yu2=0;sh1=0;sh2=0;yi1=0;yi2=0;  
double yu=0,sh=0,yi=0;
while(fread(&stu,sizeof(stu),1,fp)==1)
if(strcmp(ch,stu.cla)==0)
{
    count++;
	yu+=stu.sub.chinese;
	if(stu.sub.chinese>=60)
	{
		yu1++;
		if(stu.sub.chinese>=80)
			yu2++;
	}
	sh+=stu.sub.math;
	if(stu.sub.math>=60)
	{
		sh1++;
		if(stu.sub.math>=80)
			sh2++;
	}
	yi+=stu.sub.english;
	if(stu.sub.english>=60)
	{
		yi1++;
		if(stu.sub.english>=80)
			yi2++;
	}
}
printf(H3);
printf(" %s班的语文   平均分: %.2lf     及格率: %.2lf%%     优秀率:%.2lf%%\n",ch,yu/count,yu1*100.0/count,yu2*100.0/count);
printf(H3);
printf(" %s班的高数   平均分: %.2lf     及格率: %.2lf%%     优秀率:%.2lf%%\n",ch,sh/count,sh1*100.0/count,sh2*100.0/count);
printf(H3);
printf(" %s班的英语   平均分: %.2lf     及格率: %.2lf%%     优秀率:%.2lf%%\n",ch,yi/count,yi1*100.0/count,yi2*100.0/count);
printf(H3);
}
if(flag==3)     
{int yu1,sh1,yi1,yu2,sh2,yi2;
printf("请输入您想要查询的系别:");
gets(ch);
int count=0;yu1=0;yu2=0;sh1=0;sh2=0;yi1=0;yi2=0; 
double  yu=0,sh=0,yi=0;         
while(fread(&stu,sizeof(stu),1,fp)==1)
if(strcmp(ch,stu.dept)==0)
{
    count++;
	yu+=stu.sub.chinese;
	if(stu.sub.chinese>=60)
	{
		yu1++;
		if(stu.sub.chinese>=80)
			yu2++;
	}
	sh+=stu.sub.math;
	if(stu.sub.math>=60)
	{
		sh1++;
		if(stu.sub.math>=80)
			sh2++;
	}
	yi+=stu.sub.english;
	if(stu.sub.english>=60)
	{
		yi1++;
		if(stu.sub.english>=80)
			yi2++;
	}
}
printf(H3);
printf("   %s系的语文      平均分: %.2lf      及格率: %.2lf%%      优秀率:%.2lf%%\n",ch,yu/count,yu1*100.0/count,yu2*100.0/count);
printf(H3);
printf("   %s系的高数      平均分: %.2lf      及格率: %.2lf%%      优秀率:%.2lf%%\n",ch,sh/count,sh1*100.0/count,sh2*100.0/count);
printf(H3);
printf("   %s系的英语      平均分: %.2lf      及格率: %.2lf%%      优秀率:%.2lf%%\n",ch,yi/count,yi1*100.0/count,yi2*100.0/count);
printf(H3);
}
printf("\nSearch any more?(Y/N):[ ]\b\b");
f=getchar();getchar();
}while(f=='Y'||f=='y');
fclose(fp);
}
int main()
{
	system("color 0b");
	while(1)
	{
    switch(menu())
	{
    case '1':Append();break;
	case '2':Display();break;
	case '3':Search();break;
	case '4':Modify();break;
	case '5':Delete();break;
    case '6':Analyse();break;
    case '7':exit(0);break;
	}
	}
	return 0;
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值