精华内容
下载资源
问答
  • C语言课程设计设计报告制作人:学号:指导老师:时间:一、设计内容和设计要求1、设计内容题目:学生成绩管理系统设计该系统包含20个学生姓名和成绩信息,可对成绩进行排序,并实现由姓名查找成绩及由成绩查找姓名。...

    ????????????????????????????????????????????????????????????????????????????????????????????????C语言课程设计

    制作人:

    学号:

    指导老师:

    时间:

    一、设计内容和设计要求

    1、设计内容

    题目:学生成绩管理系统设计

    该系统包含20个学生姓名和成绩信息,可对成绩进行排序,

    并实现由姓名查找成绩及由成绩查找姓名。

    2、设计要求

    1)由键盘输入20个学生(姓名)的某门课程的学习成 绩60~99分。

    2)将分数由低到高排序(用直接排序法和冒泡法),并显示学生姓名和对应的分数。

    3) 用线性搜索法检索某个学生的成绩(输入姓名,显示成绩)。

    4 )*对分搜索法检索某个学生的成绩(输入成绩,显示姓名)。

    设计思路

    首先是要建立20个学生信息,即学生姓名和学生成绩,使用子函数input输入,学生成绩使用一维数组,学生姓名使用二维数组。然后分别定义四个子函数,即直接排序法、冒泡排序法和线性查找法、对分查找法。在两个排序法中,用字符串拷贝函数来实现姓名的交换,另外,在用成绩查找姓名时,可以用直接查找,也可以用对分查找法,在这里我两种方法都使用了。最后在主函数中来设计人机界面,用switch函数来实现操作选择,对应的情况中就调用之前定义的子函数来完成排序或查找。

    程序设计流程图

    1、程序总体流程

    开始

    输入学生姓名和成绩

    主菜单

    排序 退出 查找

    直接排序 冒泡排序 查找成绩 查找姓名

    展开全文
  • 学习C语言后的一次设计与总结,程序设计与问题求解基础...它是一个简单的学生成绩管理信息系统,学生成绩信息包括:学号,姓名,课程名,平时成绩,实验成绩,考试成绩,总评成绩,可对信息进行增删查改,排序,评优等
  • 很好的C语言毕业论文,很适合在写毕业论文的学生,目 录 第一章 概述 1 1.1项目背景 1 1.2工作环境 1 第二章 系统分析 2 2.1系统需求分析 2 2.2 系统功能分析 2 2.2.1模块实现算法 2 2.2.2进入主菜单。 3 2.2.3 建立...
  • c语言学生成绩管理系统总结

    千次阅读 2020-12-27 11:09:03
    7.按c语言成绩排序 8.保存到文件 2.结构体 typedef struct student { char num[20]; //学号 char name[10]; //姓名 char sex[10]; //性别 char duty[10]; //专业 int eng; //英语成绩 int math;

    c语言的大作业,主要功能是录入、修改、删除、插入、排序等,可能有些地方仍然有点bug。

    一、系统功能
    1.基本功能

    1.录入信息
    2.按照学号查找信息
    3.按照学号修改信息
    4.按照学号删除信息
    5.插入信息
    6.浏览全部信息
    7.按c语言成绩排序
    8.保存到文件
    

    2.结构体
    只写了几个基础的,学号刚开始写的int型的,但后来不知道怎么去查重等,改成了char型。

    typedef struct student
    {
    	char num[20];     //学号
    	char name[10];    //姓名
    	char sex[10];     //性别
    	char duty[10];    //专业
    	int eng;          //英语成绩
    	int math;         //数学成绩
    	int c;            //c语言成绩
    	struct student *next;next是指针变量,指向结构体变量 
    }stu;
    

    3.main函数

    int main()
    {
    	system("color 3F");//背景颜色
    	stu *head=(stu *)malloc(sizeof(stu));
    	head->next=NULL;//使head中的next部分为空
    	while(1)
    	{
    	printf("\t\t\t\t**********新生管理系统************\n");
        printf("\t\t\t\t请选择你的操作\n");
        printf("\t\t\t\t1.录入信息\n");
        printf("\t\t\t\t2.按照学号查找信息\n");
    	printf("\t\t\t\t3.按照学号修改信息\n");
    	printf("\t\t\t\t4.按照学号删除信息\n");
    	printf("\t\t\t\t5.插入信息\n");
    	printf("\t\t\t\t6.浏览全部信息\n");
    	printf("\t\t\t\t7.按c语言成绩排序\n");
    	printf("\t\t\t\t8.保存到文件\n");
    	printf("\t\t\t\t0.退出\n");
        printf("\t\t\t\t**********************************\n");
        printf("\t\t\t\t请按键选择操作:\n");
        fflush(stdin);//清除多余的未被保存的数据,防止乱码
        int c;
        scanf("%d",&c);
        switch(c)//用switch语句进行选择和调用函数
        {
        	case 1:
        		input(head);
    			break;
        	case 2:
        		seek(head);
    			break; 
        	case 3:
        		revise(head);
    			break;
    		case 4:
    			del(head);
    			break; 
    		case 5:
    			add(head); 
    			break;
    		case 6:
    		    traver(head);
    			break; 
    		case 7:
    		    sort(head); 
    			break;
    		case 8:
    		    save(head);
    		    break;
    		case 0:
    		     return 0; 
        	default:
        		printf("输入错误!\n"); 
    	}
    	} 
    } 
    

    while循环在外,系统程序能够持续运行,switch判断语句进行功能选择与函数切换。

    color[attr]
    attr        指定控制台输出的颜色属性。
    颜色属性由两个十六进制数字指定
    第一个对应于背景,第二个对应于前景:
        0 = 黑色              8 = 灰色
        1 = 蓝色              9 = 淡蓝色
        2 = 绿色              A = 淡绿色
        3 = 浅绿色            B = 淡浅绿色
        4 = 红色              C = 淡红色
        5 = 紫色              D = 淡紫色
        6 = 黄色              E = 淡黄色
        7 = 白色              F = 亮白色
    

    二、录入学生信息
    在第一次验课设的时候,只简单地写了录入,没有写查重以及格式等的限制。在最后一次验的时候,学号查重依然有问题,遍历时应注意不能直接动头指针p,使q2=p,用q2实现遍历。

    void input(stu *p)//录入 
    {
    	int n,x;
    	system("cls");   //清屏函数
    	stu *q1,*q2;     //定义该结构体类型q1,q2指针
    	q1=p;
    	
    	printf("请输入要录入的学生人数:");
    	scanf("%d",&n); 
    	while(n--)  //while循环n次,n个要录入的学生
    	{
    	stu *q=(stu *)malloc(sizeof(stu)); //给q分配内存
    	
    	int i=1; //定义i循环三次使学号只能输入数字
    	int flag=1,flag1=1,flag2=1,flag3=1,flag4=1; 
    		loop1:while(flag)
    		{
    		printf("请输入学号(三位):");
    		scanf("%s",q->num);
    	    if(strlen(q->num)!=3)//用strlen函数计算字符串长度使学号为三位数
    	    {
    		  printf("学号格式输入错误!\n");
    		  fflush(stdin);//清除多余的未被保存的数据,防止乱码
    		  continue;
    		}
    		q2=p; //头指针赋给q2
    		while(q2)
        {
        	if(strcmp(q->num,q2->num)==0)//用strcmp函数,q2遍历查重
        	{
        		printf("输入的学号重复,请重新输入!\n");
        		goto loop1;//重复重新跳到上一个while循环
    		}
    		q2=q2->next;
    	}
    		while(i<3)
    		{
    			if(q->num[i]-'0'<0 || q->num[i]-'0'>9)//让学号只能输入数字
    			{
    				printf("学号格式输入错误!\n"); 
    				break;
    			}
    			else{
    			   i++;
    				if (i==3)
    				flag=0;
    		}
    		}
    		}
    		printf("请输入学生姓名:");
    		scanf("%s",q->name);
    			
    		while(flag1)
    	{	
    		printf("请输入性别(w/m):");
    	    scanf("%s",q->sex);
    	    if(strcmp(q->sex,"w")==0)//用strcmp函数限制输入的字符,只能输入w/m
    		  flag1=0;//跳出循环
    		else if(strcmp(q->sex,"m")==0)
    		  flag1=0;//跳出循环
    		else
    		{
    		  printf("性别格式输入错误!(请输入w/m)\n");
    		}
    	}
    		printf("请输入专业:");
    		scanf("%s",q->duty);
    		
    	while (flag2)
    		{
    		  printf("请输入英语成绩(0<=eng<=150):");
    		  x=scanf("%d",&q->eng); //如果输入数字x=1
    		  if(q->eng >= 0 && q->eng <= 150 && x==1 )//限制成绩范围
    		  flag2=0;//跳出循环
    		  else{
    		  	 printf("成绩格式输入错误!\n");
    		  	 fflush(stdin);//清理未被保存的数据
    		  }
    		}
    	
    	while(flag3)
    	{
    		printf("请输入数学成绩(0<=math<=150):");
    		x=scanf("%d",&q->math);
    		if(q->math>=0 && q->math<=150 && x==1)
    		flag3=0;
    		else{
    			printf("成绩格式输入错误!\n");
    			fflush(stdin);
    			flag3=1;
    		}
    	} 
    	
    	while(flag4){
    		printf("请输入c语言成绩(0<=c<=150):");
    		x=scanf("%d",&q->c);
    		if(q->c>=0 && q->c<=150 && x==1)
    		flag4=0;
    		else{
    			printf("成绩格式输入错误!\n");
    			fflush(stdin);
    			flag4=1;
    		}
    	}
    		printf("录入成功!\n"); 
    		q->next=NULL; //使q中的next定义为空
    		q1->next=q;
    		q1=q;
    	}
    }
    

    三、查找学生信息

    void seek(stu *p)//查找 
    {
    	stu *q=p->next; 
    	char num[20];
    	int flag = 0;
    	system("cls"); 	//清屏函数
    	printf("请输入查找学生的学号:");
    	scanf("%s",num);
    	while(q!=NULL)
    	{ 
    		if(strcmp(q->num,num) == 0)//strcmp函数查找学生学号
    		{
    			printf("学生学号:%s\n",q->num);
    			printf("学生姓名:%s\n",q->name);
    			printf("学生性别:%s\n",q->sex);
    			printf("专业:%s\n",q->duty);
    			printf("英语成绩:%d\n",q->eng);
    			printf("数学成绩:%d\n",q->math);
    			printf("c语言成绩:%d\n",q->c);
    			flag = 1;
    			break;
    		}
    		q=q->next;//遍历
    	}
    	if(flag == 0)
    	{
    		printf("查无此人\n");
    	}
    }
    

    四、按照学号修改学生信息
    在录入函数源代码的基础上写了修改功能。

    void revise(stu *p)//修改
    {
    	stu *q=p->next;
    	stu *q1,*q2; 
    	int x;
    	char num[200];
    	system("cls"); 	
    	printf("请输入要修改的学号:");
    	scanf("%s",num);
    	while(q!=NULL)
    	{
    		if(strcmp(q->num,num) == 0)
    		{
    			int i=1;
    	int flag=1,flag1=1,flag2=1,flag3=1,flag4=1;
    		loop1:while(flag)
    		{
    		printf("请输入学号(三位):");
    		scanf("%s",q->num);
    	    if(strlen(q->num)!=3){
    		  printf("学号格式输入错误!\n");
    		  fflush(stdin);
    		  continue;
    		}
    	    q2=p;
    		while(q2)
        {
        	if(strcmp(q->num,q2->num)==0)
        	{
        		printf("输入的学号重复,请重新输入!\n");
        		goto loop1;
    		}
    		else{
    			break;
    		}
    		q2=q2->next; 
    	}
    		while(i<3)
    		{
    			if(q->num[i]-'0'<0 || q->num[i]-'0'>9){
    				printf("学号格式输入错误!\n"); 
    				break;
    			}
    			else{
    			   i++;
    				if (i==3)
    				flag=0;
    		}
    		}
    		}
    		printf("请输入学生姓名:");
    		scanf("%s",q->name);
    			
    		while(flag1)
    	{	
    		printf("请输入性别(w/m):");
    	    scanf("%s",q->sex);
    	    if(strcmp(q->sex,"w")==0)
    		  flag1=0;
    		else if(strcmp(q->sex,"m")==0)
    		  flag1=0;
    		else
    		{
    		  printf("性别格式输入错误!(请输入w/m)\n");
    		}
    	}
    		printf("请输入专业:");
    		scanf("%s",q->duty);
    		
    	while (flag2)
    		{
    		  printf("请输入英语成绩(0<=eng<=150):");
    		  x=scanf("%d",&q->eng);
    		  if(q->eng >= 0 && q->eng <= 150 && x==1 )
    		  flag2=0;
    		  else{
    		  	 printf("成绩格式输入错误!\n");
    		  	 fflush(stdin);
    		  }
    		}
    	
    	while(flag3)
    	{
    		printf("请输入数学成绩(0<=math<=150):");
    		x=scanf("%d",&q->math);
    		if(q->math>=0 && q->math<=150 && x==1)
    		flag3=0;
    		else{
    			printf("成绩格式输入错误!\n");
    			fflush(stdin);
    			flag3=1;
    		}
    	} 
    	
    	while(flag4){
    		printf("请输入c语言成绩(0<=c<=150):");
    		x=scanf("%d",&q->c);
    		if(q->c>=0 && q->c<=150 && x==1)
    		flag4=0;
    		else{
    			printf("成绩格式输入错误!\n");
    			fflush(stdin);
    			flag4=1;
    		}
    	}
            printf("修改成功!\n");
    		return; 
    		}
    	    q=q->next;
    		q2->next=q;
    		q2=q;
    	} 
         printf("查无此人");
    }
    

    五、按照学号删除信息
    注意while(!strcmp(q2->num,num)),刚开始写时while(strcmp(q2->num,num))一直删除不成功,当q2->num和num相等时为0,while循环无法进行。

    void del(stu *p)//删除
    {
    	stu *q1,*q2;//定义该结构体类型q1,q2指针
    	q1=p; //q1头结点,p头指针
    	q2=q1->next;
    	char num[200];
    	system("cls"); 	
    	printf("请输入想要删除的学号:");
    	scanf("%s",num);
    	while(q2!=0)
    	{
    		while(!strcmp(q2->num,num))
    		{
    			q1->next=q2->next;
    			free(q2);//释放q2
    			q2=NULL;
    			printf("删除成功\n");
    		    return;
    		}
    		q1=q2;
    		q2=q2->next;
    	}
     } 
    

    六、插入信息(头插法)
    插入部分也是结合的头插法和录入函数

    void add(stu *p) //插入 
    {
    	int n,x;
    	int i=1;
    	int flag=1,flag1=1,flag2=1,flag3=1,flag4=1;
    	stu *q,*q1,*q2;//不用像尾插法一样生成一个终端结点
    	q=(stu*)malloc(sizeof(stu));//给q分配内存
    	q1=(stu*)malloc(sizeof(stu));//给q1分配内存
    	q = p;//q为头结点
    	if(q1==NULL)
    	{
    		printf("插入失败\n");
    		exit(1);
    	}
        for(int a=0;a<n;a++);
        {
           	
    		loop1:while(flag)
    		{
    		printf("请输入学号(三位):");
    		scanf("%s",q1->num);
    	    if(strlen(q1->num)!=3){
    		  printf("学号格式输入错误!\n");
    		  fflush(stdin);
    		  continue;
    		}
    		q2=p;
    		while(q2)
        {
        	if(strcmp(q1->num,q2->num)==0)
        	{
        		printf("输入的学号重复,请重新输入!\n");
        		goto loop1;
    		}
    		q2=q2->next;
    	}
    		while(i<3)
    		{
    			if(q1->num[i]-'0'<0 || q1->num[i]-'0'>9){
    				printf("学号格式输入错误!\n"); 
    				break;
    			}
    			else{
    			   i++;
    				if (i==3)
    				flag=0;
    		}
    		}
    		}
    		printf("请输入学生姓名:");
    		scanf("%s",q1->name);
    			
    		while(flag1)
    	{	
    		printf("请输入性别(w/m):");
    	    scanf("%s",q1->sex);
    	    if(strcmp(q1->sex,"w")==0)
    		  flag1=0;
    		else if(strcmp(q1->sex,"m")==0)
    		  flag1=0;
    		else
    		{
    		  printf("性别格式输入错误!(请输入w/m)\n");
    		}
    	}
    		printf("请输入专业:");
    		scanf("%s",q1->duty);
    		
    	while (flag2)
    		{
    		  printf("请输入英语成绩(0<=eng<=150):");
    		  x=scanf("%d",&q1->eng);
    		  if(q1->eng >= 0 && q1->eng <= 150 &&x==1 )
    		  flag2=0;
    		  else{
    		  	 printf("成绩格式输入错误!\n");
    		  	 fflush(stdin);
    		  }
    		}
    	
    	while(flag3)
    	{
    		printf("请输入数学成绩(0<=math<=150):");
    		x=scanf("%d",&q1->math);
    		if(q1->math>=0 && q1->math<=150 && x==1)
    		flag3=0;
    		else{
    			printf("成绩格式输入错误!\n");
    			fflush(stdin);
    			flag3=1;
    		}
    	} 
    	
    	while(flag4){
    		printf("请输入c语言成绩(0<=c<=150):");
    		x=scanf("%d",&q1->c);
    		if(q1->c>=0 && q1->c<=150 && x==1)
    		flag4=0;
    		else{
    			printf("成绩格式输入错误!\n");
    			  fflush(stdin);
    			flag4=1;
    		}
    	}
    	q1->next=p->next;将p指向的地址赋值给q1;
    	p->next=q1;头指针的指针域next指向q1节点,使得q1成为开始节点
    	q1=q1->next;
    	printf("插入成功!\n");
    }
    } 
    

    在这里插入图片描述

    七、浏览全部信息

    void traver(stu *p) //遍历输出
    {	
    	stu *q = p->next ;//使p的next给q
    	system("cls"); 	//清屏
    	while(q!=NULL)
        {
    		printf("学号:%s\n姓名:%s\n性别:%s\n专业:%s\n英语成绩:%d\n数学成绩:%d\nc语言成绩:%d\n",q->num,q->name,q->sex,q->duty,q->eng,q->math,q->c);
    		q=q->next;
    	}
    }
    

    八、按c语言成绩排序(降序)

    void sort(stu *p)//排序 (c语言成绩) 
     {							
    	stu *q=NULL;
    	system("cls"); 							
    	while(q!=p->next) //q不等于头指针是一次循环
    	{
    		stu *pre=p;
    		stu *cur=pre->next;
    		while(cur!=q&&cur->next !=q) 
    		{
    			if(cur->c<cur->next->c )
    			 {
    				pre->next =cur->next;
    				cur->next =cur->next->next;
    				pre->next->next =cur;
    			}
    			pre=pre->next;
    			cur=pre->next;
    		}
    		q=cur;
    	}
            traver(p);//调用traver函数输出结果
    }
    

    九、保存文件

    void save(stu *p)//文件 
    {
      	FILE*fp = fopen("学生信息.txt","w");//创建文件指针
    	if(fp!=NULL)
    	{
    		
    		while(p->next!=NULL)
    		{  
       			fprintf(fp,"学号:%s\n",p->next->num);
       			fprintf(fp,"姓名:%s\n",p->next->name);
       			fprintf(fp,"性别:%s\n",p->next->sex);
       			fprintf(fp,"专业:%s\n",p->next->duty);
       			fprintf(fp,"英语成绩:%d\n",p->next->eng);
       			fprintf(fp,"数学成绩:%d\n",p->next->math);
       			fprintf(fp,"c语言成绩:%d\n",p->next->c);
       			fprintf(fp,"---------------------------\n");
      			p=p->next;
    	  	}
    	  	printf("保存成功!\n");
    	}
    	fclose(fp);
    }
    

    全部代码

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    typedef struct student
    {
    	char num[20];
    	char name[10];
    	char sex[10];
    	char duty[10];
    	int eng;
    	int math;
    	int c; 
    	struct student *next;
    }stu;
    
    void input(stu *p)//录入 
    {
    	int n,x;
    	system("cls");
    	stu *q1,*q2;
    	q1=p;
    	
    	printf("请输入要录入的学生人数:");
    	scanf("%d",&n); 
    	while(n--)
    	{
    	stu *q=(stu *)malloc(sizeof(stu));
    	
    	int i=1;
    	int flag=1,flag1=1,flag2=1,flag3=1,flag4=1;
    		loop1:while(flag)
    		{
    		printf("请输入学号(三位):");
    		scanf("%s",q->num);
    	    if(strlen(q->num)!=3){
    		  printf("学号格式输入错误!\n");
    		  fflush(stdin);
    		  continue;
    		}
    		q2=p;
    		while(q2)
        {
        	if(strcmp(q->num,q2->num)==0)
        	{
        		printf("输入的学号重复,请重新输入!\n");
        		goto loop1;
    		}
    		q2=q2->next;
    	}
    		while(i<3)
    		{
    			if(q->num[i]-'0'<0 || q->num[i]-'0'>9){
    				printf("学号格式输入错误!\n"); 
    				break;
    			}
    			else{
    			   i++;
    				if (i==3)
    				flag=0;
    		}
    		}
    		}
    		printf("请输入学生姓名:");
    		scanf("%s",q->name);
    			
    		while(flag1)
    	{	
    		printf("请输入性别(w/m):");
    	    scanf("%s",q->sex);
    	    if(strcmp(q->sex,"w")==0)
    		  flag1=0;
    		else if(strcmp(q->sex,"m")==0)
    		  flag1=0;
    		else
    		{
    		  printf("性别格式输入错误!(请输入w/m)\n");
    		}
    	}
    		printf("请输入专业:");
    		scanf("%s",q->duty);
    		
    	while (flag2)
    		{
    		  printf("请输入英语成绩(0<=eng<=150):");
    		  x=scanf("%d",&q->eng);
    		  if(q->eng >= 0 && q->eng <= 150 && x==1 )
    		  flag2=0;
    		  else{
    		  	 printf("成绩格式输入错误!\n");
    		  	 fflush(stdin);
    		  }
    		}
    	
    	while(flag3)
    	{
    		printf("请输入数学成绩(0<=math<=150):");
    		x=scanf("%d",&q->math);
    		if(q->math>=0 && q->math<=150 && x==1)
    		flag3=0;
    		else{
    			printf("成绩格式输入错误!\n");
    			fflush(stdin);
    			flag3=1;
    		}
    	} 
    	
    	while(flag4){
    		printf("请输入c语言成绩(0<=c<=150):");
    		x=scanf("%d",&q->c);
    		if(q->c>=0 && q->c<=150 && x==1)
    		flag4=0;
    		else{
    			printf("成绩格式输入错误!\n");
    			fflush(stdin);
    			flag4=1;
    		}
    	}
    		printf("录入成功!\n"); 
    		q->next=NULL;
    		q1->next=q;
    		q1=q;
    	}
    }
    
    void traver(stu *p) //遍历输出
    {	
    	stu *q = p->next ;
    	system("cls"); 	
    	while(q!=NULL)
        {
    		printf("学号:%s\n姓名:%s\n性别:%s\n专业:%s\n英语成绩:%d\n数学成绩:%d\nc语言成绩:%d\n",q->num,q->name,q->sex,q->duty,q->eng,q->math,q->c);
    		q=q->next;
    	}
    }
    
    void add(stu *p) //插入 
    {
    	int n,x;
    	int i=1;
    	int flag=1,flag1=1,flag2=1,flag3=1,flag4=1;
    	stu *q,*q1,*q2;
    	q=(stu*)malloc(sizeof(stu));
    	q1=(stu*)malloc(sizeof(stu));
    	q = p;
    	if(q1==NULL)
    	{
    		printf("插入失败\n");
    		exit(1);
    	}
        for(int a=0;a<n;a++);
        {
           	
    		loop1:while(flag)
    		{
    		printf("请输入学号(三位):");
    		scanf("%s",q1->num);
    	    if(strlen(q1->num)!=3){
    		  printf("学号格式输入错误!\n");
    		  fflush(stdin);
    		  continue;
    		}
    		q2=p;
    		while(q2)
        {
        	if(strcmp(q1->num,q2->num)==0)
        	{
        		printf("输入的学号重复,请重新输入!\n");
        		goto loop1;
    		}
    		q2=q2->next;
    	}
    		while(i<3)
    		{
    			if(q1->num[i]-'0'<0 || q1->num[i]-'0'>9){
    				printf("学号格式输入错误!\n"); 
    				break;
    			}
    			else{
    			   i++;
    				if (i==3)
    				flag=0;
    		}
    		}
    		}
    		printf("请输入学生姓名:");
    		scanf("%s",q1->name);
    			
    		while(flag1)
    	{	
    		printf("请输入性别(w/m):");
    	    scanf("%s",q1->sex);
    	    if(strcmp(q1->sex,"w")==0)
    		  flag1=0;
    		else if(strcmp(q1->sex,"m")==0)
    		  flag1=0;
    		else
    		{
    		  printf("性别格式输入错误!(请输入w/m)\n");
    		}
    	}
    		printf("请输入专业:");
    		scanf("%s",q1->duty);
    		
    	while (flag2)
    		{
    		  printf("请输入英语成绩(0<=eng<=150):");
    		  x=scanf("%d",&q1->eng);
    		  if(q1->eng >= 0 && q1->eng <= 150 &&x==1 )
    		  flag2=0;
    		  else{
    		  	 printf("成绩格式输入错误!\n");
    		  	 fflush(stdin);
    		  }
    		}
    	
    	while(flag3)
    	{
    		printf("请输入数学成绩(0<=math<=150):");
    		x=scanf("%d",&q1->math);
    		if(q1->math>=0 && q1->math<=150 && x==1)
    		flag3=0;
    		else{
    			printf("成绩格式输入错误!\n");
    			fflush(stdin);
    			flag3=1;
    		}
    	} 
    	
    	while(flag4){
    		printf("请输入c语言成绩(0<=c<=150):");
    		x=scanf("%d",&q1->c);
    		if(q1->c>=0 && q1->c<=150 && x==1)
    		flag4=0;
    		else{
    			printf("成绩格式输入错误!\n");
    			  fflush(stdin);
    			flag4=1;
    		}
    	}
    	q1->next=p->next;
    	p->next=q1;
    	q1=q1->next;
    	printf("插入成功!\n");
    }
    } 
    
    void seek(stu *p)//查找 
    {
    	stu *q=p->next;
    	char num[20];
    	int flag = 0;
    	system("cls"); 	
    	printf("请输入查找学生的学号:");
    	scanf("%s",num);
    	while(q!=NULL)
    	{ 
    		if(strcmp(q->num,num) == 0)
    		{
    			printf("学生学号:%s\n",q->num);
    			printf("学生姓名:%s\n",q->name);
    			printf("学生性别:%s\n",q->sex);
    			printf("专业:%s\n",q->duty);
    			printf("英语成绩:%d\n",q->eng);
    			printf("数学成绩:%d\n",q->math);
    			printf("c语言成绩:%d\n",q->c);
    			flag = 1;
    			break;
    		}
    		q=q->next;
    	}
    	if(flag == 0)
    	{
    		printf("查无此人\n");
    	}
    }
    
    void revise(stu *p)//修改
    {
    	stu *q=p->next;
    	stu *q1,*q2; 
    	int x;
    	char num[200];
    	system("cls"); 	
    	printf("请输入要修改的学号:");
    	scanf("%s",num);
    	while(q!=NULL)
    	{
    		if(strcmp(q->num,num) == 0)
    		{
    			int i=1;
    	int flag=1,flag1=1,flag2=1,flag3=1,flag4=1;
    		loop1:while(flag)
    		{
    		printf("请输入学号(三位):");
    		scanf("%s",q->num);
    	    if(strlen(q->num)!=3){
    		  printf("学号格式输入错误!\n");
    		  fflush(stdin);
    		  continue;
    		}
    	    q2=p;
    		while(q2)
        {
        	if(strcmp(q->num,q2->num)==0)
        	{
        		printf("输入的学号重复,请重新输入!\n");
        		goto loop1;
    		}
    		else{
    			break;
    		}
    		q2=q2->next; 
    	}
    		while(i<3)
    		{
    			if(q->num[i]-'0'<0 || q->num[i]-'0'>9){
    				printf("学号格式输入错误!\n"); 
    				break;
    			}
    			else{
    			   i++;
    				if (i==3)
    				flag=0;
    		}
    		}
    		}
    		printf("请输入学生姓名:");
    		scanf("%s",q->name);
    			
    		while(flag1)
    	{	
    		printf("请输入性别(w/m):");
    	    scanf("%s",q->sex);
    	    if(strcmp(q->sex,"w")==0)
    		  flag1=0;
    		else if(strcmp(q->sex,"m")==0)
    		  flag1=0;
    		else
    		{
    		  printf("性别格式输入错误!(请输入w/m)\n");
    		}
    	}
    		printf("请输入专业:");
    		scanf("%s",q->duty);
    		
    	while (flag2)
    		{
    		  printf("请输入英语成绩(0<=eng<=150):");
    		  x=scanf("%d",&q->eng);
    		  if(q->eng >= 0 && q->eng <= 150 && x==1 )
    		  flag2=0;
    		  else{
    		  	 printf("成绩格式输入错误!\n");
    		  	 fflush(stdin);
    		  }
    		}
    	
    	while(flag3)
    	{
    		printf("请输入数学成绩(0<=math<=150):");
    		x=scanf("%d",&q->math);
    		if(q->math>=0 && q->math<=150 && x==1)
    		flag3=0;
    		else{
    			printf("成绩格式输入错误!\n");
    			fflush(stdin);
    			flag3=1;
    		}
    	} 
    	
    	while(flag4){
    		printf("请输入c语言成绩(0<=c<=150):");
    		x=scanf("%d",&q->c);
    		if(q->c>=0 && q->c<=150 && x==1)
    		flag4=0;
    		else{
    			printf("成绩格式输入错误!\n");
    			fflush(stdin);
    			flag4=1;
    		}
    	}
            printf("修改成功!\n");
    		return; 
    		}
    	    q=q->next;
    		q2->next=q;
    		q2=q;
    	} 
         printf("查无此人");
    }
    
    void del(stu *p)//删除
    {
    	stu *q1,*q2;
    	q1=p;
    	q2=q1->next;
    	char num[200];
    	system("cls"); 	
    	printf("请输入想要删除的学号:");
    	scanf("%s",num);
    	while(q2!=0)
    	{
    		while(!strcmp(q2->num,num))
    		{
    			q1->next=q2->next;
    			free(q2);
    			q2=NULL;
    			printf("删除成功\n");
    		    return;
    		}
    		q1=q2;
    		q2=q2->next;
    	}
     } 
     
    void sort(stu *p)//排序 (c语言成绩) 
     {							
    	stu *q=NULL;
    	system("cls"); 							
    	while(q!=p->next) 
    	{
    		stu *pre=p;
    		stu *cur=pre->next;
    		while(cur!=q&&cur->next !=q) 
    		{
    			if(cur->c<cur->next->c )
    			 {
    				pre->next =cur->next;
    				cur->next =cur->next->next;
    				pre->next->next =cur;
    			}
    			pre=pre->next;
    			cur=pre->next;
    		}
    		q=cur;
    	}
            traver(p);
    }
    
    void save(stu *p)//文件 
    {
      	FILE*fp = fopen("学生信息.txt","w");
    	if(fp!=NULL)
    	{
    		
    		while(p->next!=NULL)
    		{  
       			fprintf(fp,"学号:%s\n",p->next->num);
       			fprintf(fp,"姓名:%s\n",p->next->name);
       			fprintf(fp,"性别:%s\n",p->next->sex);
       			fprintf(fp,"专业:%s\n",p->next->duty);
       			fprintf(fp,"英语成绩:%d\n",p->next->eng);
       			fprintf(fp,"数学成绩:%d\n",p->next->math);
       			fprintf(fp,"c语言成绩:%d\n",p->next->c);
       			fprintf(fp,"---------------------------\n");
      			p=p->next;
    	  	}
    	  	printf("保存成功!\n");
    	}
    	fclose(fp);
    }
    
    int main()
    {
    	system("color 3F");
    	stu *head=(stu *)malloc(sizeof(stu));
    	head->next=NULL;
    	while(1)
    	{
    	printf("\t\t\t\t**********新生管理系统************\n");
        printf("\t\t\t\t请选择你的操作\n");
        printf("\t\t\t\t1.录入信息\n");
        printf("\t\t\t\t2.按照学号查找信息\n");
    	printf("\t\t\t\t3.按照学号修改信息\n");
    	printf("\t\t\t\t4.按照学号删除信息\n");
    	printf("\t\t\t\t5.插入信息\n");
    	printf("\t\t\t\t6.浏览全部信息\n");
    	printf("\t\t\t\t7.按c语言成绩排序\n");
    	printf("\t\t\t\t8.保存到文件\n");
    	printf("\t\t\t\t0.退出\n");
        printf("\t\t\t\t**********************************\n");
        printf("\t\t\t\t请按键选择操作:\n");
        fflush(stdin);
        int c;
        scanf("%d",&c);
        switch(c)
        {
        	case 1:
        		input(head);
    			break;
        	case 2:
        		seek(head);
    			break; 
        	case 3:
        		revise(head);
    			break;
    		case 4:
    			del(head);
    			break; 
    		case 5:
    			add(head); 
    			break;
    		case 6:
    		    traver(head);
    			break; 
    		case 7:
    		    sort(head); 
    			break;
    		case 8:
    		    save(head);
    		    break;
    		case 0:
    		     return 0; 
        	default:
        		printf("输入错误!\n"); 
    	}
    	} 
    } 
    
    展开全文
  • C 语言课程设计学生成绩管理系统 个人心得体会 徐州工程学院 14 计嵌 1 班 07 组 张凯 这一周以来的课程设计不仅让我明白了 C 语言的确是一门很有用的但是又是不容 易的一门课程 起初刚开始做课程设计时 以为这个...
  • C 语言课程设计学生成绩管理系统 个人心得体会 徐州工程学院 14 计嵌 1 班 07 组 张凯 这一周以来的课程设计不仅让我明白了 C 语言的确是一门很有用的但是又是不容易的一门课程 起初刚开始做课程设计时 以为这个课程...
  • C语言课程设计学生成绩管理系统 个人心得体会 这一周以来的课程设计不仅让我明白了C语言的确是一门很有 用的但是又是不容易的一门课程起初刚开始做课程设计时以为 这个课程设计不会有多难只不过是把多个函数组合起来...
  • C语言课程设计学生成绩管理系统 个人心得体会 这一周以来的课程设计不仅让我明白了C语言的确是一门很有用的但是又是不容易的一门课程起初刚开始做课程设计时以为这个课程设计不会有多难只不过是把多个函数组合起来就...
  • C语言 项目总结】学生成绩管理系统项目概况问题与分析主要框架的确立输入缓冲区的问题文件操作感想总结 项目概况 用C语言创建一个“学生成绩管理系统”,供学生、教师、管理员、超级管理员使用,不同身份登陆者...

    项目概况

    用C语言创建一个“学生成绩管理系统”,供学生、教师、管理员、超级管理员使用,不同身份登陆者具有不同的功能权限,逐级管理。

    问题与分析

    主要框架的确立

    由于该项目由小组成员3人合作完成,需要每个人独立完成一部分任务,因此初期的分工前应该确立main.c的主要框架及各个功能界面之间的判断与切换。

    int main()
    {
    	int id=0,i=-1;
    	char pw[10];
    	while(1)
    	{
    		while(i == -1)   //i的条件判定
    		{
    			show_menu();
    			scanf("%d",&id);
    			printf("请输入密码:");
    			scanf("%s",pw);
    			getchar();
    			i=find_i(id,pw);
    		}
    		if(3 == strlen(pw))
    		{
    			change_pw(i,id/10000000);
    			i=-1;
    		}
    		else
    		{
    			switch(id/10000000)
    			{
    				case 1:i=show_stu(i);break;
    				case 2:i=-1;show_tea();break;	
    				case 3:i=-1;show_admini();break;
    				case 4:i=-1;show_s_admini();break;
    			}
    		}
    	}
    }
    

    由于一开始没有把框架确定,导致与成员的沟通没有统一:原本是想把i作为一个连接起所有功能的参数来传递(student功能就是通过这种想法实现的),但是小组成员倾向于用无参数与返回值的函数,并通过按键进行功能切换,因此导致一部分功能函数无法共用,降低了效率。

    因此,在以后的项目中,提前确立大的框架是很有必要的,也有助于成员思路的共鸣。

    输入缓冲区的问题

    在使用scanf输入时要关注“\n”是否会对后续功能造成影响,如:

    	system("clear");
    	printf("**********解锁管理员**********\n");
    	printf("请输入要解锁的管理员账号:");
    	scanf("%d",&id);//此处操作后输入缓冲区内有一个\n
    	getchar();
    	i=find_id_adm(id);
    	if(i == -1)
    	{
    		printf("该管理员账号不存在!\n");
    	}
    	else if(adm[i].flag >= 3)
    	{
    		adm[i].flag=0;
    		printf("解锁成功!\n");
    	}
    	else
    	{
    		printf("该管理员账号不需要解锁!\n");
    	}
    	back_1();
    

    此处末尾的back_1();是一个功能为按任意键返回的函数。在这个功能函数内,若没有getchar()的操作,程序会在执行完该函数跳转back_1();后不需要按键直接返回主界面。

    因为此处会把输入缓冲区内的\n读作back1函数中的接收值,从而造成bug。

    getchar的存在会将输入缓冲区内的\n替代,从而起到一个清空输入缓冲区的功能。

    文件操作

    教师、管理员的功能中存在需要批量导入下级信息,因此设置文件读入是必须的,如:

    FILE *frp=fopen("学生信息.txt","r");
    		for(int i=0;i<6;i++)
    		{
    			char name2[20]={};
    			int id2 = 0;
    			char laji[10];
    			int la=0;
    			
    			fscanf(frp,"%d%s%s%d",&id2,name2,laji,&la);
    			int index=find_id_stu(id2);	
    			fscanf(frp,"%f%f%f",&stu[index].chinese,&stu[index].math,&stu[index].english);
    			stu[index].sum=(stu[index].chinese+stu[index].math+stu[index].english);
    			stu[index].ave=stu[index].sum/3;
    		}
    		printf("添加成绩完成!\n");
    
    

    感想总结

    在合作完成一个项目时,首先捋顺大流程,确立主要的框架,预留各个功能的接口后再进行各个部分的分工会比较合理且高效。

    同样的,类似甚至完全相同的功能可以通过共用函数来提高效率,减少部分工作量。

    由于功能完成后需要合并进行联调,对自己完成的功能中函数的命名也不能太过随意,可以与成员讨论确定各部分函数名,避免有函数重名等现象。并且添加注释也会有助于其他成员的理解,也有助于联调时查错、改正。

    ATTENTION:由于完整代码过多,已上传至我的Github,看所有点击这里

    展开全文
  • C语言学生成绩管理系统

    千次阅读 多人点赞 2019-11-07 14:49:58
    学生成绩管理系统C语言)需求代码总结 大学正式上课的第一个月10.8~11.7,学到了很多东西,收获颇多,刚入校只会用现成的,只会调用各种函数,把封装好的东西拿来用。现在可以自己不抄别人,完全按照自己的思路写...

    学生成绩管理系统(C语言)

    大学正式上课的第一个月,学到了很多东西,收获颇多,刚入校只会用现成的,只会调用各种函数,把封装好的东西拿来用。现在可以自己不抄别人,完全按照自己的思路写一个这个入门的项目了,虽然还要bug没被发现,但是总还会慢慢改好的。写个博客记录一下…

    需求

    1.用C语言实现 “学生成绩管理系统”或自拟题目。
    2. 设计“学生成绩管理系统”的用户界面,系统启动进入后,只能通过界面菜单指令才能退出。
    3. “学生成绩管理系统”具有以下功能:
    (1) 系统启动后,弹出一个用户界面,能实现人机交互的功能。而且只能通过界面菜单命令实现各种功能(包括系统退出功能),可以设计欢迎词。
    (2) 成绩录入:录入信息包括班级、姓名、学号、五门课程成绩。
    (3) 计算平均成绩:计算每门课程的平均成绩和学生五门课程的平均成绩并存档。

    下面的功能必须是第(3)项功能完成以后才能进行。
    (4) 成绩输出:输出学生的信息和对应的原始成绩以及平均成绩;
    (5) 成绩排序(按平均成绩),输出排序后的学生信息以及对应的课程成绩和平均成绩。
    (6) 成绩查找:两种查找方法,一是按学号查找,二是按姓名查找。
    (7) 成绩修改:查找后修改成绩,修改后重新排序,并输出学生信息和对应课程成绩和平均成绩。
    (8) 成绩追加:增补遗漏的学生以及对应的信息和对应的课程成绩,并计算出平均成绩,增补以后重新排序,并输出新增学生信息和对应课程成绩和平均成绩。

    附加功能:
    (9) 删除成绩:删除不需要的学生对应的记录(包括姓名、学号、成绩等)。
    (10) 成绩分段:将学生成绩分段。
    (11) 文件存储:把学生信息和对应的课程成绩和平均成绩存入到文件中。
    (12) 文件输出:输出文件中的内容。
    (13) 文件导入:从文件中导入数据到成绩管理系统中,然后进行管理。

    代码

    6天赶完的项目存在许多bug,待慢慢发现再不断更改完善!

    #include <stdio.h>
    #include <windows.h> 
    #include <stdlib.h>
    #include <string.h>
    #pragma warning(disable : 4996)//关闭编译器报错
    struct score//为了清晰地区分成绩和学生信息,定义score结构体
    {
    	char ch[5], en[5], ma[5], se[5], pe[5];//语文,英语,数学,编程,体育
    	float aver;
    };
    struct student//定义结构体
    {
    	char name[30],id[30],clas[5];
    	struct score sco;//这样就可以student.sco.xxx了,看着爽
    };
    void Paint_Start();//绘制开始菜单
    void insert_One();//成绩导入
    void insert_File();//文件导入
    void cal_aver();//计算平均分
    void list();//显示全部成绩,列出来
    void sort();//排序,起泡法
    void find();//查找成绩,根据学号或者姓名
    void add();//添加条目
    void del();//删除成绩
    void savefile();//保存到文件,假保存,真效果
    void outfile();//输出文件里的成绩
    void edit();//更改成绩,查找出来,再进行修改
    void div();//成绩分段,分三段,我随意
    void end();//结束动画
    float staver(student stu);//这个函数计算单个学生的五科一起的平均分...(⊙﹏⊙)
    int ifnum(char item[]);//用来在各模块中输入数字时,判断是不是数字
    int main()
    {
    	system("color 02");//先打印个郑州轻工业大学图标纪念一下
    	printf("\n\n\n\t\t\t\t\t                 *\n");
    	printf("\t\t\t\t\t            *  ***  ****\n");
    	printf("\t\t\t\t\t          *** **** ****\n");
    	printf("\t\t\t\t\t         **** **** **** ****\n");
    	printf("\t\t\t\t\t         **** **** **** ****\n");
    	printf("\t\t\t\t\t         **** **** **** ****\n");
    	printf("\t\t\t\t\t         **** **** **** ****\n");
    	printf("\t\t\t\t\t         **** **** **** ****\n");
    	printf("\t\t\t\t\t          **** ******* ****\n");
    	printf("\t\t\t\t\t            *************\n");
    	printf("\t\t\t\t\t                *****\n\n");
    	printf("\t\t\t\t\t      欢迎使用学生成绩管理系统\n");
    	printf("\n\n\n\n\n\n\n\n\n\n\n\n\t\t\t\t\t\t  ");
    	system("pause");
    	Paint_Start();//打印开始菜单,进入功能选择
    	return 0;
    } 
    void insert_One()
    {
    	system("cls");
    	printf("\n\n\n\n\n\n\n\n\n\n\t\t\t\t    注意:请输入对应的正确内容,否则记录将出现错误!\n\n\t\t\t\t\t\t  ");//提示一下用户
    	system("pause");
    	system("cls");
    	printf("*****************************************************成绩录入***********************************************************\n");
    	printf("依次键入班级、姓名、学号、语文成绩、数学成绩、英语成绩、体育成绩、专业课成绩,用一个空格隔开各数据,每一条输入完成后按回车键进行下一条输入。\n\t\t\t\t\t\t退出(输入'#'并回车)\n例如:\n1902 妙陈希 459113460230 99 60 87 81 93\n");
    	printf("在此输入:\n");
    	student stu;
    	char name[30],clas[5],id[30];//临时储存学生信息
    	char ch[5],ma[5],en[5],pe[5],se[5];//创建各变量临时储存成绩
    	int count = 1;
    	bool err;
    	FILE* fp;
    	fp = fopen("stu.db", "wb");
    	while (1)
    	{
    		int loc = 0,ifloc=0;
    		err = false;//看输入是不是有误的一个标志
    		memset(ch,0,5);//清空各数组所占内存的内容,都变成空,方便后续判断
    		memset(en,0,5);
    		memset(ma,0,5);
    		memset(pe,0,5);
    		memset(se,0,5);
    		memset(id,0,30);
    		memset(clas,0,5);
    		memset(name, 0, 30);//这样以后,所有元素都变成\0了
    		scanf("%s",clas);
    		if (clas[0] == '#') break;
    		scanf(" %s %s %s %s %s %s %s", name, id, ch, ma, en, pe, se);
    		fflush(stdin);
    
    		bool isclas = true;
    		for (int i = 0; clas[i] != '\0'; i++)
    			if (!(clas[i] >= '0' && clas[i] <= '9'))
    			{
    				printf("请检查班级输入是否正确,并重新输入!\n");
    				isclas = false;
    				err = true;
    				break;
    			}
    		if (isclas) strcpy(stu.clas, clas);
    
    		bool isname = true;
    		for (int i = 0; i <= 7; i++)
    		{
    			if (name[i] >= 32 && name[i] <= 127) isname = false;//仅判断是否是ASCII中的字符
    		}
    		if (name[8] == '\0' && isname == true)//一个中文字符占两个字节 
    		{
    			strcpy(stu.name, name);
    		}
    		else
    		{
    			printf("请检查姓名输入是否正确,并重新输入!\n");
    			err = true;
    		}
    
    		if (ifnum(id) && id[11] != '\0' && id[12] == '\0') strcpy(stu.id, id);
    		else
    		{
    			printf("请检查学号输入是否正确,并重新输入!\n");
    			err = true;
    		}
    		if (ifnum(ch) && ((ch[0] == '1' && ch[1] == '0' && ch[2] == '0') || (ch[2] == '\0' && ch[3] != '\0') || ch[2] == '\0')) strcpy(stu.sco.ch, ch);//成绩不能超过100,超过则执行else语句
    		else
    		{
    			printf("请检查语文成绩输入是否正确,并重新输入!\n");
    			err = true;
    		}
    		if (ifnum(ma) && ((ma[0] == '1' && ma[1] == '0' && ma[2] == '0') || (ma[2] == '\0' && ma[3] != '\0') || ma[2] == '\0')) strcpy(stu.sco.ma, ma);
    		else
    		{
    			printf("请检查数学成绩输入是否正确,并重新输入!\n");
    			err = true;
    		}
    		if (ifnum(en) && ((en[0] == '1' && en[1] == '0' && en[2] == '0') || (en[2] == '\0' && en[3] != '\0') || en[2] == '\0')) strcpy(stu.sco.en, en);
    		else
    		{
    			printf("请检查英语成绩输入是否正确,并重新输入!\n");
    			err = true;
    		}
    		if (ifnum(pe) && ((pe[0] == '1' && pe[1] == '0' && pe[2] == '0') || (pe[2] == '\0' && pe[3] != '\0') || pe[2] == '\0')) strcpy(stu.sco.pe, pe);
    		else
    		{
    			printf("请检查体育成绩输入是否正确,并重新输入!\n");
    			err = true;
    		}
    		if (ifnum(se) && ((se[0] == '1' && se[1] == '0' && se[2] == '0') || (se[2] == '\0' && se[3] != '\0') || se[2] == '\0')) strcpy(stu.sco.se, se);
    		else
    		{
    			printf("请检查专业课成绩输入是否正确,并重新输入!\n");
    			err = true;
    		}
    		if (err == false)
    		{
    			//此处写入磁盘文件
    			if (fp == NULL)
    			{
    				printf("文件打开失败!\n");
    				break;
    			}
    			if (fwrite(&stu,100, 1, fp) != 1)
    			{
    				printf("文件写入失败!\n");
    				break;
    			}
    		}
    
    	}
    	fclose(fp);
    	cal_aver();
    	Paint_Start();
    }
    void Paint_Start()
    {
    	system("cls");
    	printf("***********************************************************************************************************************\n");
    	printf("*\t\t\t\t\t\t 学生成绩管理系统\t\t\t\t\t\t      *\n");
    	printf("*\t\t1.录入成绩\t\t2.查看成绩\t\t3.成绩查找\t\t4.成绩修改\t\t      *\n");
    	printf("*\t\t5.成绩追加\t\t6.删除成绩\t\t7.成绩分段\t\t8.文件储存\t\t      *\n");
    	printf("*\t\t9.文件输出\t\t10.文件导入\t\t11.退出程序\t\t\t\t\t      *\n");
    	printf("***********************************************************************************************************************\n\t\t\t\t\t   若输入多个编号,则以第一个为准\n");
    	printf("执行编号:");
    	int num;//储存功能编号
    	int i=0;
    	scanf("%d",&num);//接收编号,准备判断需求
    	while (getchar() != '\n')continue;
    	switch (num)
    	{
    	case 1:insert_One();break;//成绩录入
    	case 2:list(); break;//列出全部成绩
    	case 3:find(); break;//查成绩
    	case 4:edit(); break;//更改成绩
    	case 5:add(); break;//数据库末尾添加成绩
    	case 6:del(); break;//删除条目
    	case 7:div(); break;//成绩分段0-59,60-79,80-100三段
    	case 8:savefile(); break;//保存文件,假的,但是没毛病啊
    	case 9:outfile(); break;//输出文件内容
    	case 10:insert_File(); break;//把文件内容导入数据库
    	case 11:end(); break;//啥都不干,退出
    	default:printf("请选择对应的序号!"); system("pause");Paint_Start();
    	}
    }
    void insert_File()//文件导入
    {
    	char dir[50] = "\0";//存放 导入的文件的绝对路径的 字符串变量
    	FILE* fp,*fpp;
    	student stu;
    	printf("输入文件的绝对路径(例如C:\\abc123.db):\n");
    	scanf("%s", dir);//输入绝对路径
    	while (getchar() != '\n')continue;//清空输入缓冲区,免得万一有东西没输完搞得被后面的读到了
    	if ((fpp = fopen("stu.db", "ab")) == NULL)//以二进制追加方式打开数据库文件
    	{
    		printf("数据库打开失败!\n");
    		system("pause");
    		Paint_Start();
    		return;
    	}
    	if ((fp = fopen(dir, "rb"))==NULL)//以二进制只读方式打开要导入的文件
    	{
    		printf("所选文件打开失败!");
    		system("pause");
    		Paint_Start();
    		return;
    	}
    	for (; fgetc(fp) != EOF;)//fp的文件位置往后读一字节看是不是读到EOF了,不是就再退一字节
    	{
    		fseek(fp,-1L,1);//fp位置退一字节
    		fread(&stu, 100, 1, fp);
    		fwrite(&stu, 100, 1, fpp);
    	}
    	printf("导入完成!");
    	system("pause");
    	fclose(fpp);//关闭fp和fpp
    	fclose(fp);
    	Paint_Start();
    }
    void cal_aver()//计算平均分
    {
    	student stu;
    	float total;//单科所有学生总分
    	FILE* fp;
    	FILE* fpp;
    	if ((fpp = fopen("stuavr.db", "w")) == NULL)//stuavr.db储存各科平均分,以文本模式打开(创建/覆盖),保证每一次计算平均成绩都是新得到的结果
    	{
    		printf("平均成绩文件写入失败!\n");
    		system("pause");
    		Paint_Start();
    		return;
    	}
    
    	if ((fp = fopen("stu.db", "rb+")) == NULL)//二进制方式可读可写地打开本地的数据库文件
    	{
    		printf("文件打开失败\n!");
    		system("pause");
    		Paint_Start();
    		return;
    	}
    
    	total = 0;
    	int i = 0;//一共i个人,也就是i条数据
    	for (;fgetc(fp)!=EOF;i++)//一个一个读计算语文总平均分
    	{
    		fseek(fp, -1L, 1);
    		if (fread(&stu, 100, 1, fp) != 1)
    		{
    			printf("文件读取失败!\n");
    			Paint_Start(); fclose(fp); fclose(fpp); return;
    		}
    		if (stu.sco.ch[2] == '0') total = total + 100;//判断输入的成绩是100分?还是两位数的?还是个位数的?再分别作出结果的计算
    		else if (stu.sco.ch[1] != '\0')
    			total = total + (float)((int)stu.sco.ch[0] - 48) * 10 + (int)stu.sco.ch[1] - 48;//因为读取是以字符串形式读的,所以还得用ASCII码转整型再来计算
    		else total = total + (float)((int)stu.sco.ch[0] - 48);
    	}
    	fprintf(fpp,"%f ",total/i);//结果写入到的stuavr.db里
    	
    	i = 0;
    	total = 0;
    	rewind(fp);//fp文件位置移到开头,清除错误信息
    	for (; fgetc(fp) != EOF;i++)//数学总平均分
    	{
    		fseek(fp, -1L, 1);
    		if (fread(&stu, sizeof(student), 1, fp) != 1)
    		{
    			printf("文件读取失败!\n");
    			Paint_Start(); fclose(fp); fclose(fpp); return;
    		}
    		if (stu.sco.ma[2] == '0') total = total + 100;
    		else if (stu.sco.ma[1] != '\0')
    			total = total + (float)((int)stu.sco.ma[0] - 48) * 10 + (int)stu.sco.ma[1] - 48;
    		else total = total + (float)((int)stu.sco.ma[0] - 48);
    	}
    	fprintf(fpp, "%f ", total / i);
    
    	i = 0;
    	total = 0;
    	rewind(fp);
    	for (; fgetc(fp) != EOF;i++)//英语总平均分
    	{
    		fseek(fp, -1L, 1);
    		if (fread(&stu, sizeof(student), 1, fp) != 1)
    		{
    			printf("文件读取失败!\n");
    			Paint_Start(); fclose(fp); fclose(fpp); return;
    		}
    		if (stu.sco.en[2] == '0') total = total + 100;
    		else if (stu.sco.en[1] != '\0')
    			total = total + (float)((int)stu.sco.en[0] - 48) * 10 + (int)stu.sco.en[1] - 48;
    		else total = total + (float)((int)stu.sco.en[0] - 48);
    	}
    	fprintf(fpp, "%f ", total / i);
    
    	i = 0;
    	rewind(fp);
    	total = 0;
    	for (; fgetc(fp) != EOF;i++)//体育总平均分
    	{
    		fseek(fp, -1L, 1);
    		if (fread(&stu, sizeof(student), 1, fp) != 1)
    		{
    			printf("文件读取失败!\n");
    			Paint_Start(); fclose(fp); fclose(fpp); return;
    		}
    		if (stu.sco.pe[2] == '0') total = total + 100;
    		else if (stu.sco.pe[1] != '\0')
    			total = total + (float)((int)stu.sco.pe[0] - 48) * 10 + (int)stu.sco.pe[1] - 48;
    		else total = total + (float)((int)stu.sco.pe[0] - 48);
    	}
    	fprintf(fpp, "%f ", total / i);
    
    	i = 0;
    	rewind(fp);
    	total = 0;
    	for (; fgetc(fp) != EOF;i++)//编程总平均分
    	{
    		fseek(fp, -1L, 1);
    		if (fread(&stu, sizeof(student), 1, fp) != 1)
    		{
    			printf("文件读取失败!\n");
    			Paint_Start(); fclose(fp); fclose(fpp); return;
    		}
    		if (stu.sco.se[2] == '0') total = total + 100;
    		else if (stu.sco.se[1] != '\0')
    			total = total + (float)((int)stu.sco.se[0] - 48) * 10 + (int)stu.sco.se[1] - 48;
    		else total = total + (float)((int)stu.sco.se[0] - 48);
    	}
    	fprintf(fpp, "%f", total / i);
    	fclose(fpp);//各总平均分写入完成,关闭fpp
    
    	rewind(fp);//文件位置移到开头,计算有多少条数据
    	int j;
    	for (j = 0; fgetc(fp) != EOF; j++)
    	{
    		fseek(fp,-1L,1);
    		fseek(fp, 100L, 1);
    	}
    	rewind(fp);//文件位置移到开头,准备逐个学生写入平均分
    	for (int i=0;i<j;i++)//逐个写入每个学生的平均分
    	{
    		fseek(fp,i*100,0);//参考随机读写那一章节,文件位置移到要写的地方开头,再进行读写
    		if (fread(&stu,100,1,fp) != 1)
    		{
    			printf("读取失败!\n");
    			Paint_Start();
    			fclose(fp);
    			return;
    		}
    		float ch,ma,en,pe,se;
    		if (stu.sco.ch[2] == '0') ch = 100;
    		else if (stu.sco.ch[1] !='\0')
    			ch = ((int)stu.sco.ch[0] - 48) * 10 + (int)stu.sco.ch[1] - 48;
    		else ch = (int)stu.sco.ch[0] - 48;
    		if (stu.sco.ma[2] == '0') ma = 100;
    		else if (stu.sco.ma[1] != '\0')
    			ma = ((int)stu.sco.ma[0] - 48) * 10 + (int)stu.sco.ma[1] - 48;
    		else ma = (int)stu.sco.ma[0] - 48;
    		if (stu.sco.en[2] == '0') en = 100;
    		else if (stu.sco.en[1] != '\0')
    			en = ((int)stu.sco.en[0] - 48) * 10 + (int)stu.sco.en[1] - 48;
    		else en = (int)stu.sco.en[0] - 48;
    		if (stu.sco.pe[2] == '0') pe = 100;
    		else if (stu.sco.pe[1] != '\0')
    			pe = ((int)stu.sco.pe[0] - 48) * 10 + (int)stu.sco.pe[1] - 48;
    		else pe = (int)stu.sco.pe[0] - 48;
    		if (stu.sco.se[2] == '0') se = 100;
    		else if (stu.sco.ch[1] != '\0')
    			se = ((int)stu.sco.se[0] - 48) * 10 + (int)stu.sco.se[1] - 48;
    		else se = (int)stu.sco.se[0] - 48;
    		stu.sco.aver = (ch + ma + en + pe + se) / 5;
    		fseek(fp, i * 100, 0);
    		if (fwrite(&stu,100, 1, fp) != 1)
    		{
    			printf("文件写入错误!\n");
    			Paint_Start();break;
    		}
    	}
    	fclose(fp);
    }
    void list()//列出全部成绩
    {
    	cal_aver();
    	sort();
    	FILE* fp,* fpp;
    	student stu;
    	fp = fopen("stu.db", "rb");
    	fpp = fopen("stuavr.db","r");//总平均成绩储存的文件
    	system("cls");
    	printf("*****************************************************查看成绩***********************************************************\n");
    	printf("%-5s%-10s%-15s%-5s%-5s%-5s%-5s%-8s%-5s\n","班级","姓名","学号","语文","数学","英语","体育","专业","平均分");
    	if (fp == NULL)//懒得判断fpp是不是NULL了
    	{
    		printf("数据文件打开失败!\n");
    		system("pause");
    		Paint_Start();
    		return;
    	}
    	else
    	{
    		for (;fgetc(fp)!=EOF;)//还是那方法,读一个退一个
    		{
    			fseek(fp,-1L,SEEK_CUR);
    			fread(&stu, sizeof(student), 1, fp);
    			printf("%-5s%-10s%-15s%-5s%-5s%-5s%-5s%-8s%-5.1f\n", stu.clas, stu.name, stu.id, stu.sco.ch, stu.sco.ma, stu.sco.en, stu.sco.pe, stu.sco.se,stu.sco.aver);
    		}
    		fclose(fp);
    	}
    	float ch, ma, en, pe, se;
    	fscanf(fpp,"%f%f%f%f%f",&ch,&ma,&en,&pe,&se);//把平均成绩都从文件里读出来
    	printf("\n语文平均分:%.1f\t\t数学平均分:%.1f\t\t英语平均分:%.1f\n体育平均分:%.1f\t\t专业平均分:%.1f\n",ch,ma,en,pe,se);
    	fclose(fpp);
    	system("pause");
    	Paint_Start();
    }
    void sort()//起泡法? 
    {
    	student temp;
    	student* stu = (student*)malloc(100*200);//暂时只能容纳200人,直接student stu[200]会栈溢出,所以这样放到堆里,就欧了
    	FILE* fp;
    	int i;//起泡法排序用的
    	fp = fopen("stu.db","rb+");
    	if (fp == NULL)
    	{
    		printf("文件打开失败!\n");
    		system("pause");
    		return;
    	}
    	for (i=0; fgetc(fp)!=EOF;i++)
    	{
    		fseek(fp,-1L,1);
    		if (fread(&stu[i], 100, 1, fp) != 1)
    		{
    			printf("数据读取失败!\n");
    			fclose(fp);
    			Paint_Start();
    			return;
    		}
    	}
    	for (int j = 0; j < i - 1; j++)//起泡法排序
    	{
    		for (int k = 0; k < i - 1 - j; k++)
    		{
    			if (stu[k].sco.aver < stu[k + 1].sco.aver)
    			{
    				temp = stu[k + 1];
    				stu[k + 1] = stu[k];
    				stu[k] = temp;
    			}
    		}
    	}
    	rewind(fp);
    	for (int j = 0; j < i; j++)
    	{
    		if (fwrite(&stu[j], 100, 1, fp)!=1)
    		{
    			printf("排序失败!\n");
    			system("pause");
    			fclose(fp);
    			Paint_Start();
    			return;
    		}
    	}
    	free(stu);//记得要释放刚刚申请的内存
    	fclose(fp);
    }
    void find()//查找成绩
    {
    	cal_aver();
    	student stu;
    	int num;
    	char item[30]="\0";//用于储存姓名或者学号 跟数据库条目对比
    	FILE* fp;
    	printf("请选择查找方式,通过学号(输入1并回车),通过姓名(输入2并回车):\n");
    	scanf("%d",&num);//选择查找方式
    	if (num == 1)
    	{
    		printf("\t\t\t\t\t\t<键入'#'并回车退出>\n");
    		fp = fopen("stu.db","rb+");
    		if(fp==NULL)
    		{
    			printf("数据库打开失败!\n");
    			system("pause");
    			Paint_Start();
    			return;
    		}
    		int exist;
    		while (1)
    		{
    			exist = 0;
    			printf("学号:");
    			scanf("%s",item);
    			while (getchar() != '\n')continue;
    			if (item[0] == '#')//#则退出
    			{
    				fclose(fp);
    				Paint_Start();
    				return;
    			}
    			while (fgetc(fp)!=EOF)//遍历
    			{
    				fseek(fp,-1L,1);
    				fread(&stu,100,1,fp);
    				if (strcmp(stu.id, item) == 0)//找到相同项就打印出来
    				{
    					exist = 1;
    					printf("%-5s%-10s%-15s%-5s%-5s%-5s%-5s%-8s%-5s\n", "班级", "姓名", "学号", "语文", "数学", "英语", "体育", "专业", "平均分");
    					printf("%-5s%-10s%-15s%-5s%-5s%-5s%-5s%-8s%-5.1f\n", stu.clas, stu.name, stu.id, stu.sco.ch, stu.sco.ma, stu.sco.en, stu.sco.pe, stu.sco.se, stu.sco.aver);
    					//break;
    				}
    			}
    			if (exist == 0) printf("查无此人!\n");
    			rewind(fp);//关键!!
    		}
    		
    	}
    	else
    	{
    		if (num == 2)
    		{
    			fp = fopen("stu.db", "rb");
    			if (fp == NULL)
    			{
    				printf("数据库打开失败!\n");
    				system("pause");
    				Paint_Start();
    				return;
    			}
    			int exist;
    			printf("\t\t\t\t\t\t<键入'#'并回车退出>\n");
    			while (1)
    			{
    				exist = 0;
    				printf("姓名:");
    				scanf("%s",item);
    				while (getchar() != '\n')continue;
    				if (item[0] == '#')//#则退出
    				{
    					fclose(fp);
    					Paint_Start();
    					return;
    				}
    				while (fgetc(fp)!=EOF)
    				{
    					fseek(fp,-1L,1);
    					fread(&stu,100,1,fp);
    					if (strcmp(stu.name, item) == 0)
    					{
    						exist = 1;
    						printf("%-5s%-10s%-15s%-5s%-5s%-5s%-5s%-8s%-5s\n", "班级", "姓名", "学号", "语文", "数学", "英语", "体育", "专业", "平均分");
    						printf("%-5s%-10s%-15s%-5s%-5s%-5s%-5s%-8s%-5.1f\n", stu.clas, stu.name, stu.id, stu.sco.ch, stu.sco.ma, stu.sco.en, stu.sco.pe, stu.sco.se, stu.sco.aver);
    						//break;
    					}
    				}
    				if (exist == 0) printf("查无此人!\n");
    				rewind(fp);//这个很关键!!
    			}
    		}
    		else
    		{
    			printf("二选一噢~\n");//如果既没输1也没输2就打印它
    			system("pause");
    			Paint_Start();
    		}
    	}
    	
    }
    void del()//删除成绩 
    {
    	FILE* fp,*fpp;
    	student stu;
    	char id[30]="\0";
    	int i;
    	printf("**********************************************输入'#'并回车可退出此功能************************************************\n");
    	while (1)
    	{
    		fpp = fopen("stutemp.db", "wb");//临时新建的文件,用于储存删除一个人后所以人的数据,然后把他变成stu.db,把原来的stu.db删除,起到删除一个人数据而不留空的目的
    		fclose(fpp);
    		if ((fp = fopen("stu.db", "rb+")) == NULL)
    		{
    			printf("文件打开失败!\n");
    			system("pause");
    			Paint_Start();
    			return;
    		}
    		if ((fpp = fopen("stutemp.db", "rb+"))==NULL)
    		{
    			printf("临时文件创建失败!\n");
    			system("pause");
    			return;
    		}
    		printf("输入学号:");//姓名会重,学号不会重		//先查找再删除
    		scanf("%s", id);
    		while (getchar() != '\n')continue;
    		if (id[0] == '#')break;
    		int done=0;
    		for (i=1;fgetc(fp)!=EOF;i++)//与id相同的第i个数据
    		{
    			fseek(fp,-1L,1);
    			fread(&stu,100,1,fp);
    			if (strcmp(id, stu.id) == 0)
    			{
    				done = 1;
    				break;
    			}
    		}
    		rewind(fp);
    		rewind(fpp);
    		for (int j=1;fgetc(fp)!=EOF;j++)//把stu里的每一条数据,除了i标记的那条(也就是要删除的那条),都写入临时文件
    		{
    			fseek(fp, -1L, 1);
    			if (j == i)
    			{
    				fseek(fp, 100L, 1);
    				if (fgetc(fp) == EOF)break;
    				else fseek(fp,-1L,1);
    			}
    			fread(&stu,100,1,fp);
    			if (fwrite(&stu, 100, 1, fpp) != 1)
    			{
    				printf("写入临时文件失败!\n");
    				done = 0;
    			}
    		}
    		if (done == 1)printf("已删除!\n");
    		else printf("删除失败!\n");
    		fclose(fpp);
    		fclose(fp);
    		system("del stu.db");//命令提示符多方便
    		system("rename stutemp.db stu.db");//删了stu.db拿stutemp.db充当stu.db
    	}
    	fclose(fpp);
    	fclose(fp);
    	Paint_Start();
    } 
    void div()//成绩分段
    {
    	system("cls");
    	printf("******************************************************成绩分段**********************************************************\n");
    	printf("根据平均成绩可将学生分为A,B,C三个档次:\n");
    	printf("\t\t\t\t\t\t      ***A***\n\n");
    	FILE* fp;
    	student stu;
    	if ((fp = fopen("stu.db", "rb")) == NULL)
    	{
    		printf("文件打开失败!\n");
    		return;
    	}
    	printf("\t\t\t   %-5s%-10s%-15s%-5s%-5s%-5s%-5s%-8s%-5s\n", "班级", "姓名", "学号", "语文", "数学", "英语", "体育", "专业", "平均分");
    	for (;fgetc(fp)!=EOF;)//一条条判断是不是在某范围内,在,则打印
    	{
    		fseek(fp,-1L,1);
    		fread(&stu,100,1,fp);
    		if (stu.sco.aver >= 80)
    			printf("\t\t\t   %-5s%-10s%-15s%-5s%-5s%-5s%-5s%-8s%-5.1f\n", stu.clas, stu.name, stu.id, stu.sco.ch, stu.sco.ma, stu.sco.en, stu.sco.pe, stu.sco.se, stu.sco.aver);
    	}
    	rewind(fp);
    	printf("\n\n\t\t\t\t\t\t       **B**\n\n");
    	printf("\t\t\t   %-5s%-10s%-15s%-5s%-5s%-5s%-5s%-8s%-5s\n", "班级", "姓名", "学号", "语文", "数学", "英语", "体育", "专业", "平均分");
    	for (; fgetc(fp) != EOF;)
    	{
    		fseek(fp, -1L, 1);
    		fread(&stu, 100, 1, fp);
    		if (stu.sco.aver < 80&&stu.sco.aver>=60)
    			printf("\t\t\t   %-5s%-10s%-15s%-5s%-5s%-5s%-5s%-8s%-5.1f\n", stu.clas, stu.name, stu.id, stu.sco.ch, stu.sco.ma, stu.sco.en, stu.sco.pe, stu.sco.se, stu.sco.aver);
    	}
    	rewind(fp);
    	printf("\n\n\t\t\t\t\t\t        *C*\n\n");
    	printf("\t\t\t   %-5s%-10s%-15s%-5s%-5s%-5s%-5s%-8s%-5s\n", "班级", "姓名", "学号", "语文", "数学", "英语", "体育", "专业", "平均分");
    	for (; fgetc(fp) != EOF;)
    	{
    		fseek(fp, -1L, 1);
    		fread(&stu, 100, 1, fp);
    		if (stu.sco.aver < 60)
    			printf("\t\t\t   %-5s%-10s%-15s%-5s%-5s%-5s%-5s%-8s%-5.1f\n", stu.clas, stu.name, stu.id, stu.sco.ch, stu.sco.ma, stu.sco.en, stu.sco.pe, stu.sco.se, stu.sco.aver);
    	}
    	fclose(fp);
    	system("pause");
    	Paint_Start();
    	return;
    }
    void outfile()//输出文件内容 
    {
    	char dir[50]="\0";
    	float total;
    	FILE* fp, * fpp;
    	student stu;
    	printf("输入文件的绝对路径(例如C:\\aaa.db):\n");
    	scanf("%s", dir);
    	while (getchar() != '\n')continue;
    
    	if ((fpp = fopen("avrtemp.db", "w")) == NULL)
    	{
    		printf("平均成绩文件打开失败!\n");
    		system("pause");
    		Paint_Start();
    		return;
    	}
    
    	if ((fp = fopen(dir, "rb")) == NULL)
    	{
    		printf("文件打开失败!");
    		system("pause");
    		Paint_Start();
    		return;
    	}
    
    	total = 0;
    	int i = 0;
    	for (; fgetc(fp) != EOF; i++)//一个一个读计算语文总平均分
    	{
    		fseek(fp, -1L, 1);
    		if (fread(&stu, 100, 1, fp) != 1)
    		{
    			printf("文件读取失败!\n");
    			break;
    		}
    		if (stu.sco.ch[2] == '0') total = total + 100;
    		else if (stu.sco.ch[1] != '\0')
    			total = total + (float)((int)stu.sco.ch[0] - 48) * 10 + (int)stu.sco.ch[1] - 48;
    		else total = total + (float)((int)stu.sco.ch[0] - 48);
    	}
    	fprintf(fpp, "%f ", total / i);
    
    	i = 0;
    	total = 0;
    	rewind(fp);
    	for (; fgetc(fp) != EOF; i++)//数学总平均分
    	{
    		fseek(fp, -1L, 1);
    		if (fread(&stu, sizeof(student), 1, fp) != 1)
    		{
    			printf("文件读取失败!\n");
    			break;
    		}
    		if (stu.sco.ma[2] == '0') total = total + 100;
    		else if (stu.sco.ma[1] != '\0')
    			total = total + (float)((int)stu.sco.ma[0] - 48) * 10 + (int)stu.sco.ma[1] - 48;
    		else total = total + (float)((int)stu.sco.ma[0] - 48);
    	}
    	fprintf(fpp, "%f ", total / i);
    
    	i = 0;
    	total = 0;
    	rewind(fp);
    	for (; fgetc(fp) != EOF; i++)//英语总平均分
    	{
    		fseek(fp, -1L, 1);
    		if (fread(&stu, sizeof(student), 1, fp) != 1)
    		{
    			printf("文件读取失败!\n");
    			break;
    		}
    		if (stu.sco.en[2] == '0') total = total + 100;
    		else if (stu.sco.en[1] != '\0')
    			total = total + (float)((int)stu.sco.en[0] - 48) * 10 + (int)stu.sco.en[1] - 48;
    		else total = total + (float)((int)stu.sco.en[0] - 48);
    	}
    	fprintf(fpp, "%f ", total / i);
    
    	i = 0;
    	rewind(fp);
    	total = 0;
    	for (; fgetc(fp) != EOF; i++)//体育总平均分
    	{
    		fseek(fp, -1L, 1);
    		if (fread(&stu, sizeof(student), 1, fp) != 1)
    		{
    			printf("文件读取失败!\n");
    			break;
    		}
    		if (stu.sco.pe[2] == '0') total = total + 100;
    		else if (stu.sco.pe[1] != '\0')
    			total = total + (float)((int)stu.sco.pe[0] - 48) * 10 + (int)stu.sco.pe[1] - 48;
    		else total = total + (float)((int)stu.sco.pe[0] - 48);
    	}
    	fprintf(fpp, "%f ", total / i);
    
    	i = 0;
    	rewind(fp);
    	total = 0;
    	for (; fgetc(fp) != EOF; i++)//编程总平均分
    	{
    		fseek(fp, -1L, 1);
    		if (fread(&stu, sizeof(student), 1, fp) != 1)
    		{
    			printf("文件读取失败!\n");
    			break;
    		}
    		if (stu.sco.se[2] == '0') total = total + 100;
    		else if (stu.sco.se[1] != '\0')
    			total = total + (float)((int)stu.sco.se[0] - 48) * 10 + (int)stu.sco.se[1] - 48;
    		else total = total + (float)((int)stu.sco.se[0] - 48);
    	}
    	fprintf(fpp, "%f", total / i);
    
    	system("cls");
    	printf("*****************************************************文件输出***********************************************************\n");
    	printf("%-5s%-10s%-15s%-5s%-5s%-5s%-5s%-8s%-5s\n", "班级", "姓名", "学号", "语文", "数学", "英语", "体育", "专业", "平均分");
    	rewind(fp);
    	rewind(fpp);
    	for (; fgetc(fp) != EOF;)
    	{
    		fseek(fp, -1L, SEEK_CUR);
    		fread(&stu, sizeof(student), 1, fp);
    		printf("%-5s%-10s%-15s%-5s%-5s%-5s%-5s%-8s%-5.1f\n", stu.clas, stu.name, stu.id, stu.sco.ch, stu.sco.ma, stu.sco.en, stu.sco.pe, stu.sco.se, stu.sco.aver);
    	}
    	fclose(fp);
    	float ch, ma, en, pe, se;
    	fclose(fpp);
    	fpp = fopen("avrtemp.db","r");
    	fscanf(fpp,"%f%f%f%f%f", &ch, &ma, &en, &pe, &se);
    	printf("\n语文平均分:%.1f\t\t数学平均分:%.1f\t\t英语平均分:%.1f\n体育平均分:%.1f\t\t专业平均分:%.1f\n", ch, ma, en, pe, se);
    	fclose(fpp);
    	system("pause");
    	Paint_Start();
    }
    void savefile()//文件储存
    {
    	printf("文件stu.db已储存到源程序根目录!");
    	system("pause");
    	Paint_Start();
    }
    void add()//追加,在文件末尾
    {
    	system("cls");
    	printf("*****************************************************成绩追加***********************************************************\n");
    	printf("依次键入班级、姓名、学号、语文成绩、数学成绩、英语成绩、体育成绩、专业课成绩,用一个空格隔开各数据,每一条输入完成后按回车键进行下一条输入。\n\t\t\t\t\t\t退出(输入'#'并回车)\n例如:\n1902 苗陈茜 459113460230 99 60 87 81 93\n");
    	student stu;
    	char name[30], clas[5], id[30];
    	char ch[5], ma[5], en[5], pe[5], se[5];
    	int count = 1;
    	bool err;
    	FILE* fp;
    	fp = fopen("stu.db", "ab");
    	if (fp == NULL)
    	{
    		printf("文件打开失败!\n");
    		return;
    	}
    	int c = 0;//这里的c其实就是count,用于计数,写了几条
    	while (1)
    	{
    		err = false;
    		memset(ch, 0, 5);
    		memset(en, 0, 5);
    		memset(ma, 0, 5);
    		memset(pe, 0, 5);
    		memset(se, 0, 5);
    		memset(id, 0, 30);
    		memset(clas, 0, 5);
    		memset(name, 0, 30);//这样以后,所有元素都变成\0了
    		printf("输入:\n");
    		scanf("%s", clas);
    		if (clas[0] == '#') break;
    		scanf(" %s %s %s %s %s %s %s", name, id, ch, ma, en, pe, se);
    		fflush(stdin);
    
    		bool isclas = true;
    		for (int i = 0; clas[i] != '\0'; i++)
    			if (!(clas[i] >= '0' && clas[i] <= '9'))
    			{
    				printf("请检查班级输入是否正确!\n");
    				isclas = false;
    				err = true;
    				break;
    			}
    		if (isclas) strcpy(stu.clas, clas);
    
    		bool isname = true;
    		for (int i = 0; i <= 7; i++)
    		{
    			if (name[i] >= 32 && name[i] <= 127) isname = false;//仅判断是否是ASCII中的字符
    		}
    		if (name[8] == '\0' && isname == true)//一个中文字符占两个字节 
    		{
    			strcpy(stu.name, name);
    		}
    		else
    		{
    			printf("请检查姓名输入是否正确!\n");
    			err = true;
    		}
    
    		if (ifnum(id) && id[11] != '\0' && id[12] == '\0') strcpy(stu.id, id);
    		else
    		{
    			printf("请检查学号输入是否正确,并重新输入!\n");
    			err = true;
    		}
    		if (ifnum(ch) && ((ch[0] == '1' && ch[1] == '0' && ch[2] == '0') || (ch[2] == '\0' && ch[3] != '\0') || ch[2] == '\0')) strcpy(stu.sco.ch, ch);//成绩不能超过100,超过则执行else语句
    		else
    		{
    			printf("请检查语文成绩输入是否正确,并重新输入!\n");
    			err = true;
    		}
    		if (ifnum(ma) && ((ma[0] == '1' && ma[1] == '0' && ma[2] == '0') || (ma[2] == '\0' && ma[3] != '\0') || ma[2] == '\0')) strcpy(stu.sco.ma, ma);
    		else
    		{
    			printf("请检查数学成绩输入是否正确,并重新输入!\n");
    			err = true;
    		}
    		if (ifnum(en) && ((en[0] == '1' && en[1] == '0' && en[2] == '0') || (en[2] == '\0' && en[3] != '\0') || en[2] == '\0')) strcpy(stu.sco.en, en);
    		else
    		{
    			printf("请检查英语成绩输入是否正确,并重新输入!\n");
    			err = true;
    		}
    		if (ifnum(pe) && ((pe[0] == '1' && pe[1] == '0' && pe[2] == '0') || (pe[2] == '\0' && pe[3] != '\0') || pe[2] == '\0')) strcpy(stu.sco.pe, pe);
    		else
    		{
    			printf("请检查体育成绩输入是否正确,并重新输入!\n");
    			err = true;
    		}
    		if (ifnum(se) && ((se[0] == '1' && se[1] == '0' && se[2] == '0') || (se[2] == '\0' && se[3] != '\0') || se[2] == '\0')) strcpy(stu.sco.se, se);
    		else
    		{
    			printf("请检查专业课成绩输入是否正确,并重新输入!\n");
    			err = true;
    		}
    		if (err == false)
    		{
    			//此处写入磁盘文件
    			if (fp == NULL)
    			{
    				printf("文件打开失败!\n");
    				break;
    			}
    			if (fwrite(&stu, 100, 1, fp) != 1)
    			{
    				printf("文件写入失败!\n");
    				break;
    			}
    			c++;
    		}
    	}
    	fclose(fp);
    	cal_aver();//追加写入完,计算平均成绩
    	fp=fopen("stu.db","rb");//打开
    	fseek(fp,(long)(-c*100),SEEK_END);//从末尾往前数,数count个stu字节,就是刚输入的所有学生数据的起始位置,一次读100个输出到屏幕。
    	if (err == false)
    	{
    		printf("\n新增学生信息:\n");
    		printf("%-5s%-10s%-15s%-5s%-5s%-5s%-5s%-8s%-5s\n", "班级", "姓名", "学号", "语文", "数学", "英语", "体育", "专业", "平均分");
    		for (int i = 0; i < c; i++)
    		{
    			fread(&stu,100,1,fp);
    			printf("%-5s%-10s%-15s%-5s%-5s%-5s%-5s%-8s%-5.1f\n", stu.clas, stu.name, stu.id, stu.sco.ch, stu.sco.ma, stu.sco.en, stu.sco.pe, stu.sco.se, stu.sco.aver);
    		}
    	}
    	fclose(fp);
    	printf("\n成绩已排序,请在功能2中查看!");
    	system("pause");
    	Paint_Start();
    }
    void edit()//先查找,再编辑
    {
    	student stu;
    	int num;
    	int exist;
    	char item[30] = "\0";
    	FILE* fp;
    	printf("请选择查找方式,通过学号(输入1并回车),通过姓名(输入2并回车):\n");
    	scanf("%d", &num);
    	while (getchar() != '\n')continue;
    	if (num == 1)
    	{
    		printf("\t\t\t\t\t\t<键入'#'并回车退出>\n");
    		fp = fopen("stu.db", "rb+");
    		if (fp == NULL)
    		{
    			printf("数据库打开失败!\n");
    			system("pause");
    			Paint_Start();
    			return;
    		}
    		while (1)
    		{
    			exist = 0;
    			printf("学号:");
    			scanf("%s", item);
    			while (getchar() != '\n')continue;
    			if (item[0] == '#')
    			{
    				fclose(fp);
    				Paint_Start();
    				return;
    			}
    			while (fgetc(fp) != EOF)
    			{
    				fseek(fp, -1L, 1);
    				fread(&stu, 100, 1, fp);//先读取,再一个个比较,直到读到底都没有一样的就直接结束了,或者读到一样的就输出到屏幕,然后开始读取学生信息和成绩,输入成绩,仅(替换)录入成绩
    				if (strcmp(stu.id, item) == 0)
    				{
    					exist = 1;
    					printf("%-5s%-10s%-15s%-5s%-5s%-5s%-5s%-8s%-5s\n", "班级", "姓名", "学号", "语文", "数学", "英语", "体育", "专业", "平均分");
    					printf("%-5s%-10s%-15s%-5s%-5s%-5s%-5s%-8s%-5.1f\n", stu.clas, stu.name, stu.id, stu.sco.ch, stu.sco.ma, stu.sco.en, stu.sco.pe, stu.sco.se, stu.sco.aver);
    					printf("请输入新成绩(语、数、英、体育、专业,用一个空格隔开):\n");
    					char ch[5]="\0", ma[5]="\0", en[5]="\0", pe[5]="\0", se[5]="\0";
    					scanf("%s %s %s %s %s",ch,ma,en,pe,se);
    					while (getchar() != '\n')continue;
    					if (ifnum(ch) && ((ch[0] == '1' && ch[1] == '0' && ch[2] == '0') || (ch[2] == '\0' && ch[3] != '\0') || ch[2] == '\0')) strcpy(stu.sco.ch, ch);//成绩不能超过100,超过则执行else语句
    					else
    					{
    						printf("请检查语文成绩输入是否正确,并重新输入!\n");
    					}
    					if (ifnum(ma) && ((ma[0] == '1' && ma[1] == '0' && ma[2] == '0') || (ma[2] == '\0' && ma[3] != '\0') || ma[2] == '\0')) strcpy(stu.sco.ma, ma);
    					else
    					{
    						printf("请检查数学成绩输入是否正确,并重新输入!\n");
    					}
    					if (ifnum(en) && ((en[0] == '1' && en[1] == '0' && en[2] == '0') || (en[2] == '\0' && en[3] != '\0') || en[2] == '\0')) strcpy(stu.sco.en, en);
    					else
    					{
    						printf("请检查英语成绩输入是否正确,并重新输入!\n");
    					}
    					if (ifnum(pe) && ((pe[0] == '1' && pe[1] == '0' && pe[2] == '0') || (pe[2] == '\0' && pe[3] != '\0') || pe[2] == '\0')) strcpy(stu.sco.pe, pe);
    					else
    					{
    						printf("请检查体育成绩输入是否正确,并重新输入!\n");
    					}
    					if (ifnum(se) && ((se[0] == '1' && se[1] == '0' && se[2] == '0') || (se[2] == '\0' && se[3] != '\0') || se[2] == '\0')) strcpy(stu.sco.se, se);
    					else
    					{
    						printf("请检查专业课成绩输入是否正确,并重新输入!\n");
    					}
    					fseek(fp,-100L,1);//读取完就要退回100字节再进行写入
    					fwrite(&stu,100,1,fp);
    					printf("修改结果:\n");
    					printf("%-5s%-10s%-15s%-5s%-5s%-5s%-5s%-8s%-5s\n", "班级", "姓名", "学号", "语文", "数学", "英语", "体育", "专业", "平均分");
    					printf("%-5s%-10s%-15s%-5s%-5s%-5s%-5s%-8s%-5.1f\n", stu.clas, stu.name, stu.id, stu.sco.ch, stu.sco.ma, stu.sco.en, stu.sco.pe, stu.sco.se, staver(stu));
    					break;
    				}
    				if (exist == 0) printf("查无此人!\n");
    			}
    			rewind(fp);
    		}
    	}
    	else
    	{
    		if (num == 2)
    		{
    			fp = fopen("stu.db", "rb+");
    			if (fp == NULL)
    			{
    				printf("数据库打开失败!\n");
    				system("pause");
    				Paint_Start();
    				return;
    			}
    			printf("\t\t\t\t\t\t<键入'#'并回车退出>\n");
    			while (1)
    			{
    				exist = 0;
    				printf("姓名:");
    				scanf("%s", item);
    				while (getchar() != '\n')continue;
    				if (item[0] == '#')
    				{
    					fclose(fp);
    					Paint_Start();
    					return;
    				}
    				while (fgetc(fp) != EOF)
    				{
    					fseek(fp, -1L, 1);
    					fread(&stu, 100, 1, fp);
    					if (strcmp(stu.name, item) == 0)
    					{
    						exist = 1;
    						printf("%-5s%-10s%-15s%-5s%-5s%-5s%-5s%-8s%-5s\n", "班级", "姓名", "学号", "语文", "数学", "英语", "体育", "专业", "平均分");
    						printf("%-5s%-10s%-15s%-5s%-5s%-5s%-5s%-8s%-5.1f\n", stu.clas, stu.name, stu.id, stu.sco.ch, stu.sco.ma, stu.sco.en, stu.sco.pe, stu.sco.se, stu.sco.aver);
    						printf("请输入新成绩(语、数、英、体育、专业,用一个空格隔开):\n");
    						char ch[5] = "\0", ma[5] = "\0", en[5] = "\0", pe[5] = "\0", se[5] = "\0";
    						scanf("%s %s %s %s %s", ch, ma, en, pe, se);
    						while (getchar() != '\n')continue;
    						if (ifnum(ch) && ((ch[0] == '1' && ch[1] == '0' && ch[2] == '0') || (ch[2] == '\0' && ch[3] != '\0') || ch[2] == '\0')) strcpy(stu.sco.ch, ch);//成绩不能超过100,超过则执行else语句
    						else
    						{
    							printf("请检查语文成绩输入是否正确,并重新输入!\n");
    						}
    						if (ifnum(ma) && ((ma[0] == '1' && ma[1] == '0' && ma[2] == '0') || (ma[2] == '\0' && ma[3] != '\0') || ma[2] == '\0')) strcpy(stu.sco.ma, ma);
    						else
    						{
    							printf("请检查数学成绩输入是否正确,并重新输入!\n");
    						}
    						if (ifnum(en) && ((en[0] == '1' && en[1] == '0' && en[2] == '0') || (en[2] == '\0' && en[3] != '\0') || en[2] == '\0')) strcpy(stu.sco.en, en);
    						else
    						{
    							printf("请检查英语成绩输入是否正确,并重新输入!\n");
    						}
    						if (ifnum(pe) && ((pe[0] == '1' && pe[1] == '0' && pe[2] == '0') || (pe[2] == '\0' && pe[3] != '\0') || pe[2] == '\0')) strcpy(stu.sco.pe, pe);
    						else
    						{
    							printf("请检查体育成绩输入是否正确,并重新输入!\n");
    						}
    						if (ifnum(se) && ((se[0] == '1' && se[1] == '0' && se[2] == '0') || (se[2] == '\0' && se[3] != '\0') || se[2] == '\0')) strcpy(stu.sco.se, se);
    						else
    						{
    							printf("请检查专业课成绩输入是否正确,并重新输入!\n");
    						}
    						fseek(fp, -100L, 1);
    						fwrite(&stu, 100, 1, fp);
    						printf("修改结果:\n");
    						printf("%-5s%-10s%-15s%-5s%-5s%-5s%-5s%-8s%-5s\n", "班级", "姓名", "学号", "语文", "数学", "英语", "体育", "专业", "平均分");
    						printf("%-5s%-10s%-15s%-5s%-5s%-5s%-5s%-8s%-5.1f\n", stu.clas, stu.name, stu.id, stu.sco.ch, stu.sco.ma, stu.sco.en, stu.sco.pe, stu.sco.se, staver(stu));
    						break;
    					}
    					if (exist == 0) printf("查无此人!\n");
    				}
    				rewind(fp);
    			}
    		}
    		else
    		{
    			printf("二选一噢~\n");
    			system("pause");
    			Paint_Start();
    			return;
    		}
    	}
    }
    int ifnum(char item[])//数字字符串判断,正确返回1,否则0
    {
    	bool isnum = true;
    	for (int i = 0; item[i] != '\0'; i++)
    	{
    		if (!(item[i] >= '0' && item[i] <= '9'))
    		{
    			isnum = false;
    			return 0;
    			break;
    		}
    	}
    	if(isnum) return 1;
    }
    float staver(student stu)//计算单条平均分并返回结果
    {
    	float ch, ma, en, pe, se;
    	if (stu.sco.ch[2] == '0') ch = 100;
    	else if (stu.sco.ch[1] != '\0')
    		ch = ((int)stu.sco.ch[0] - 48) * 10 + (int)stu.sco.ch[1] - 48;
    	else ch = (int)stu.sco.ch[0] - 48;
    	if (stu.sco.ma[2] == '0') ma = 100;
    	else if (stu.sco.ma[1] != '\0')
    		ma = ((int)stu.sco.ma[0] - 48) * 10 + (int)stu.sco.ma[1] - 48;
    	else ma = (int)stu.sco.ma[0] - 48;
    	if (stu.sco.en[2] == '0') en = 100;
    	else if (stu.sco.en[1] != '\0')
    		en = ((int)stu.sco.en[0] - 48) * 10 + (int)stu.sco.en[1] - 48;
    	else en = (int)stu.sco.en[0] - 48;
    	if (stu.sco.pe[2] == '0') pe = 100;
    	else if (stu.sco.pe[1] != '\0')
    		pe = ((int)stu.sco.pe[0] - 48) * 10 + (int)stu.sco.pe[1] - 48;
    	else pe = (int)stu.sco.pe[0] - 48;
    	if (stu.sco.se[2] == '0') se = 100;
    	else if (stu.sco.ch[1] != '\0')
    		se = ((int)stu.sco.se[0] - 48) * 10 + (int)stu.sco.se[1] - 48;
    	else se = (int)stu.sco.se[0] - 48;
    	stu.sco.aver = (ch + ma + en + pe + se) / 5;
    	return stu.sco.aver;
    }
    void end()
    {
    	system("cls");
    	printf("\n\n\n\t\t\t\t\t                 *\n");
    	printf("\t\t\t\t\t            *  ***  ****\n");
    	printf("\t\t\t\t\t          *** **** ****\n");
    	printf("\t\t\t\t\t         **** **** **** ****\n");
    	printf("\t\t\t\t\t         **** **** **** ****\n");
    	printf("\t\t\t\t\t         **** **** **** ****\n");
    	printf("\t\t\t\t\t         **** **** **** ****\n");
    	printf("\t\t\t\t\t         **** **** **** ****\n");
    	printf("\t\t\t\t\t          **** ******* ****\n");
    	printf("\t\t\t\t\t            *************\n");
    	printf("\t\t\t\t\t                *****\n\n");
    	Sleep(800);
    	system("cls");
    	printf("\n\n\n\t\t\t\t\t                 *\n");
    	printf("\t\t\t\t\t               ***  ****\n");
    	printf("\t\t\t\t\t            * **** ****\n");
    	printf("\t\t\t\t\t          *** **** **** \n");
    	printf("\t\t\t\t\t         **** **** **** ****\n");
    	printf("\t\t\t\t\t         **** **** **** ****\n");
    	printf("\t\t\t\t\t         **** **** **** ****\n");
    	printf("\t\t\t\t\t         **** **** **** ****\n");
    	printf("\t\t\t\t\t         ****  *******  ****   \n");
    	printf("\t\t\t\t\t          ****         ****\n");
    	printf("\t\t\t\t\t            *************\n");
    	printf("\t\t\t\t\t                *****\n\n");
    	Sleep(100);
    	system("cls");
    	printf("\n\n\n\t\t\t\t\t                 *\n");
    	printf("\t\t\t\t\t               ***  ****\n");
    	printf("\t\t\t\t\t              **** ****\n");
    	printf("\t\t\t\t\t            * **** **** \n");
    	printf("\t\t\t\t\t          *** **** **** \n");
    	printf("\t\t\t\t\t         **** **** **** ****\n");
    	printf("\t\t\t\t\t         **** **** **** ****\n");
    	printf("\t\t\t\t\t         **** **** **** ****\n");
    	printf("\t\t\t\t\t         ****  *******  ****   \n");
    	printf("\t\t\t\t\t         ****  感   谢  ****   \n");
    	printf("\t\t\t\t\t          ****         ****\n");
    	printf("\t\t\t\t\t            *************\n");
    	printf("\t\t\t\t\t                *****\n\n");
    	Sleep(100);
    	system("cls");
    	printf("\n\n\n\t\t\t\t\t                 *\n");
    	printf("\t\t\t\t\t               ***  ****\n");
    	printf("\t\t\t\t\t              **** ****\n");
    	printf("\t\t\t\t\t              **** **** \n");
    	printf("\t\t\t\t\t            * **** ****\n");
    	printf("\t\t\t\t\t          *** **** **** \n");
    	printf("\t\t\t\t\t         **** **** **** ****\n");
    	printf("\t\t\t\t\t         **** **** **** ****\n");
    	printf("\t\t\t\t\t         ****  *******  ****   \n");
    	printf("\t\t\t\t\t         ****           ****   \n");
    	printf("\t\t\t\t\t         ****  感   谢  ****   \n");
    	printf("\t\t\t\t\t          ****         ****\n");
    	printf("\t\t\t\t\t            *************\n");
    	printf("\t\t\t\t\t                *****\n\n");
    	Sleep(100);
    	system("cls");
    	printf("\n\n\n\t\t\t\t\t                 *\n");
    	printf("\t\t\t\t\t               ***  ****\n");
    	printf("\t\t\t\t\t              **** ****\n");
    	printf("\t\t\t\t\t              **** **** \n");
    	printf("\t\t\t\t\t            * **** ****\n");
    	printf("\t\t\t\t\t          *** **** **** \n");
    	printf("\t\t\t\t\t         **** **** **** ****\n");
    	printf("\t\t\t\t\t         **** **** **** ****\n");
    	printf("\t\t\t\t\t         ****  *******  ****   \n");
    	printf("\t\t\t\t\t         ****  感   谢  ****   \n");
    	printf("\t\t\t\t\t         ****           ****   \n");
    	printf("\t\t\t\t\t          **** 使   用 ****\n");
    	printf("\t\t\t\t\t            *************\n");
    	printf("\t\t\t\t\t                *****\n\n");
    	Sleep(2000);
    }
    

    总结

    15:14 2019-11-7
    1.变量命名可以参考帕斯卡命名法,驼峰式命名法。
    2.把用户当作傻瓜来设计程序。
    3.注意代码的可读性重复代码最好多用函数,不要像我一样,暂时没能力缩减更多。
    4.注意各模块之间的联系,不要起冲突,bug及时修!


    11:21 2019-12-3
    现在发现面向对象的优越性了,把一个个类封装起来,可以保护数据,不受外界干扰,隐藏对象的属性和实现细节,仅对外提供公共访问方法,提高复用性和安全性。不会像用C语言写这个程序的时候,一个模块写完,可能其他的模块就因为它出了bug。

    展开全文
  • 学生成绩管理系统C语言版)

    千次阅读 多人点赞 2020-12-06 22:49:10
    大一上学期实训项目总结(学生成绩管理系统) 大一刚接触这个计算机专业的相关知识,就觉得这个专业很有趣。最先接触的编程语言就是C语言,想必大多数人都是如此吧。我们这个学期末,也就是期末考试结束后,开始这个...
  • C语言编写的成绩管理系统,是多天学习来的一个小总结
  • 自己用c语言学生成绩管理系统c语言学习总结
  • c语言能够实现简单的学生成绩管理系统 1.进行人机界面设计,界面具有提示信息,可以选择:查询每门课程的平均成绩及最高分最低分、查询每个学生的各科成绩及总成绩、查询所有学生的平均总成绩、插入一个学生并...
  • c语言学生成绩管理系统

    热门讨论 2013-03-14 22:27:45
    一、题目: 学生成绩管理系统 二、目的与要求 1. 目的: (1)基本掌握面向过程程序设计的基本思路和方法; (2)达到熟练掌握C语言的基本知识和技能; (3)能够利用所学的基本知识和技能,解决简单的程序设计问题...

空空如也

空空如也

1 2 3 4 5
收藏数 81
精华内容 32
关键字:

成绩管理系统c语言总结

c语言 订阅