成绩管理(链表+文件)

#include <stdio.h> 
#include <string.h>  
#include <math.h>  
#include <stdlib.h>  
#include <ctype.h>    
#define num 3  

int max[num]={0},min[num]={100,100,100},sum[num]={0};  
int count=0;                 //成绩记录条数(计数器) 
double average[num]={0};
char filename[20]; 
  
typedef struct student   
{  
    char name[20]; 
	char xue[20]; 
    int chinese;  
    int math;  
    int english;  
    struct student *next;  
}student;   
student *head=NULL;

void Print()             //打印函数 
{	char name[20]; 
	char xue[20]; 
    int chinese;   
    int math;  
    int english; 
	FILE *fpp;
	if((fpp=fopen(filename,"r+"))==NULL)
	{
		printf("打开文件失败!\n");
		exit(0);
	}
	printf("\t姓名\t学号\t语文\t数学\t英语\n");
 	printf("--------------------------------------------------\n");
 	while(fscanf(fpp,"%s %s %d %d %d",name,xue,&chinese,&math,&english)==5)
 	{	 	
 		printf("\t%s\t%s\t%d\t%d\t%d\n",name,xue,chinese,math,english);
 	}
	 	
 	fclose(fpp);
}  

void Sum()             //各科目总分求和函数 
{
	sum[0]=sum[1]=sum[2]=0;
	char name[20]; 
	char xue[20];  
    int chinese;  
    int math;  
    int english; 
	FILE *fpp;
	if((fpp=fopen(filename,"r"))==NULL)
	{
		printf("打开文件失败!\n");
		exit(0);
	}	
 	while(fscanf(fpp,"%s %s %d %d %d",name,xue,&chinese,&math,&english)==5)
 	{	 	
 		sum[0]+=chinese;  
        sum[1]+=math;  
        sum[2]+=english; 
 	} 
	 	
 	fclose(fpp);
}

void Average()   //各科目求平均函数 
{  
    average[0]=sum[0]*1./count;  
    average[1]=sum[1]*1./count;  
    average[2]=sum[2]*1./count;   
    printf("\t   各科平均分\n");
    printf("\t语\t数\t英\n");
    printf("----------------------------------------\n");
    printf("\t%.2lf\t%.2lf\t%.2lf\n",average[0],average[1],average[2]);  
}  

void Fcount()		//统计文件中的记录条数 
{
	FILE *fpp;
    char name[20];  
    char xue[20];
	int chinese;  
    int math;  
    int english; 
    if((fpp=fopen(filename,"r"))==NULL)
	{
		printf("打开文件失败!\n");
		exit(0);
	}
	while(fscanf(fpp,"%s %s %d %d %d",name,xue,&chinese,&math,&english)==5)
	{
		count++;
	}	
		      
    fclose(fpp);
}

void Add()       //添加一个节点 
{  
	student *p,*pp; 
	student *p5;  
    FILE *fpp;
    char name[20];  
    char xue[20];	
    int i,n;
	    
	printf("请输入您要添加第N条记录:\n");
	scanf("%d",&n);
	
	p=head;
	i=1;	
	
	if(n>count+1)              //所要添加的位置大于文件数据的总长 
	printf("找不到该节点!\n");
	
	else
	{		
		if(n==1)          //添加到第一个节点(作为头结点) 
		{
			pp=(student *)malloc(sizeof(student));
			printf("请输入该学生的名字与学号:\n");  
		   	getchar();
		    scanf("%s %s",name,xue); 
	
	        printf("请分别输入语数英成绩:\n");  
	        scanf("%d %d %d",&pp->chinese,&pp->math,&pp->english);
	        strcpy(pp->name,name);
		 	strcpy(pp->xue,xue); 
		 	
 			pp->next=p; 
		 	head=pp;
		 	
		 	count++;
		}		
		else 
		{
			while(i<n-1)
			{
				i++;
				p=p->next;	
			}
			pp=(student *)malloc(sizeof(student));
			printf("请输入该学生的名字与学号:\n");  
		   	getchar();
		    scanf("%s %s",name,xue); 
	
	        printf("请分别输入语数英成绩:\n");  
	        scanf("%d %d %d",&pp->chinese,&pp->math,&pp->english);
	        strcpy(pp->name,name);
		 	strcpy(pp->xue,xue); 
		 	
		 	pp->next=p->next;
		 	p->next=pp;
		 	
		 	count++;
		}		   
	}
	if((fpp=fopen(filename,"w"))==NULL)
	{
		printf("打开文件失败!\n");
		exit(0);
	}
	p5=head;
	while(p5->next!=NULL)
	{
		fputs(p5->name,fpp);
        fputc(' ',fpp);
        fputs(p5->xue,fpp);
		fputc(' ',fpp);
        fprintf(fpp,"%d %d %d",p5->chinese,p5->math,p5->english);
        fputc('\n',fpp);		
		p5=p5->next;
	} 
	
	fclose(fpp);
		
}    

void Delect() 	//删除一个节点 
{  
    struct student *p,*pp; 
	struct student *p5;  
    FILE *fpp;
    int i,n;
	    
	printf("请输入您要删除第N条记录:\n");
	scanf("%d",&n);
	
	p=head;
	i=0;	
	
	if(n>count)  		//所要删除的位置大于文件数据的总长 
	printf("找不到该节点!\n");
	
	else
	{		
		if(n==1)  		//删除第一个节点(头结点后移)
		{
			head=p->next;
			free(p);
			printf("删除成功!\n"); 
		}
		else
		{
			while(i<n-2 && p->next!=NULL)
			{
				i++;
				p=p->next;	
			}
			pp=p->next;
			p->next=pp->next;
			free(pp);
			printf("删除成功!\n"); 
		}
		count--;		
	}
	if((fpp=fopen(filename,"w"))==NULL)
	{
		printf("打开文件失败!\n");
		exit(0);
	}
	p5=head;
	while(p5->next!=NULL)
	{
		fputs(p5->name,fpp);
        fputc(' ',fpp);
        fputs(p5->xue,fpp);
		fputc(' ',fpp);
        fprintf(fpp,"%d %d %d",p5->chinese,p5->math,p5->english);
        fputc('\n',fpp);		
		p5=p5->next;
	} 
	
	fclose(fpp);
	
}   
void Collect(int a,int b)   //成绩筛选函数 
{
	char name[20];
	char xue[20];  
    int chinese;  
    int math;  
    int english; 
	FILE *fpp;
	if((fpp=fopen(filename,"r"))==NULL)
	{
		printf("打开文件失败!\n");
		exit(0);
	}	
 	while(fscanf(fpp,"%s %s %d %d %d",name,xue,&chinese,&math,&english)==5)
 	{	 		
        if((chinese+math+english)>=a && (chinese+math+english)<=b)  
        printf("%s:%d\n",name,(chinese+math+english));             
 	} 	
 	
 	fclose(fpp);	
}
int Find(char s[])         //成绩查改函数 
{
	student *p5;
	char name[20];
	char xue[20];  
    int chinese;  
    int math;  
    int english; 
	FILE *fpp;
	
	int flag=0,fen; 
	char course,col,pan;
	
	count=0;
										
	if((fpp=fopen(filename,"r"))==NULL)
	{
		printf("打开文件失败!\n");
		exit(0);
	}
	while(fscanf(fpp,"%s %s %d %d %d",name,xue,&chinese,&math,&english)==5)
	{
		if(strcmp(name,s)==0)  
        {  
            printf("语:%d\n数:%d\n英:%d\n",chinese,math,english);  
            flag=1;  
            break;  
        }  	        
	}  
	if(flag==1)  
    {
		printf("已找到该同学\n");		
	}  
    else  
    {
    	printf("该同学不存在\n");
    	return 0;
    }   
	
	printf("请输入是否要修改成绩:(y/n)\n");
	getchar();
	scanf("%c",&pan);     //是否要修改成绩的标志 
	
	if(pan=='n')
	return 0;
	else if(pan=='y')
	{
		p5=head;
		if((fpp=fopen(filename,"w"))==NULL)
		{
			printf("打开文件失败!\n");
			exit(0);
		}		
		printf("请输入要改的科目的首字母:(c,m,e)\n");  
     	getchar();  
     	scanf("%c",&course);  
  		printf("请输入该科目的正确数据:\n");  
   	  	scanf("%d",&fen);
   	  
	   	
   		while(p5->next!=NULL)    
	    {    
	        if(strcmp(p5->name,s)==0)    
	        {    		               
	             if(course=='c')  
	             {  
	                p5->chinese=fen;  
	             }  
	             else if(course=='m')  
	             {  
	                p5->math=fen;  
	             }  
	             else if(course=='e')  
	             {  
	                p5->english=fen;  
	             }                 
	            break;    
	        }    
	        p5=p5->next;    
	    }  
	   
		p5=head;
		while(p5->next!=NULL)
		{
			fputs(p5->name,fpp);
	        fputc(' ',fpp);
	        fputs(p5->xue,fpp);
			fputc(' ',fpp);
	        fprintf(fpp,"%d %d %d",p5->chinese,p5->math,p5->english);
	        fputc('\n',fpp);
			
			p5=p5->next;
		}		   	
	   			
	}	
	else
	{
		printf("你输入的指令无效!\n");		
		return 0;
	}
		
 	fclose(fpp);
 	
}  
void Comp()       //成绩排序函数 
{  	
    struct student *p5,*p6,*p1,*p2,*p3,*temp; 
	FILE *fpp; 
    int c,i;  
    
    if(count==1)
    return 1;
    else 
    {  		
		for(i=1;i<count;i++) 
    	{
	    	p3=head;
	   		p2=p3->next;
	   		p1=p2->next;
	   		if((p3->chinese+p3->math+p3->english)>(p2->chinese+p2->math+p2->english))  
	   	 	{  
				head=p2;
				p2->next=p3;
				p3->next=p1;	  
	        } 
	    	 
			c=count-2;
			p3=head;
	   		p2=p3->next;
	   		p1=p2->next;
			while(c--)
			{
				if((p2->chinese+p2->math+p2->english)>(p1->chinese+p1->math+p1->english))  
		   	 	{  
					p2->next=p1->next;
					p1->next=p2;
					p3->next=p1;	  
		        }    
		        p3=p3->next;
		        p2=p3->next;
		        p1=p2->next;
		        
			}   	
	    }  
    }
    
    /*for(i=1;i<count;i++)  
    {  
        p5=head;  
        
        while(p5->next!=NULL)  
        {  
        	p6=p5;  
            p5=p5->next;           
            if(p5->name[0]=='0' && p5->xue[0]=='0')
			break;  
            if((p6->chinese+p6->math+p6->english)>(p5->chinese+p5->math+p5->english))  
            {  
                strcpy(_name,p6->name);  
                strcpy(p6->name,p5->name);  
                strcpy(p5->name,_name);  
                strcpy(_xue,p6->xue);  
                strcpy(p6->xue,p5->xue);  
                strcpy(p5->xue,_xue); 
                c=p6->chinese;  
                p6->chinese=p5->chinese;  
                p5->chinese=c;  
                c=p6->math;  
                p6->math=p5->math;  
                p5->math=c;  
                c=p6->english;  
                p6->english=p5->english;  
                p5->english=c;  
            }          
        }  
    } */ 
    
	if((fpp=fopen(filename,"w"))==NULL)
	{
		printf("打开文件失败!\n");
		exit(0);
	}
	
	p5=head;
	while(p5->next!=NULL)
	{
		fputs(p5->name,fpp);
        fputc(' ',fpp);
        fputs(p5->xue,fpp);
		fputc(' ',fpp);
        fprintf(fpp,"%d %d %d",p5->chinese,p5->math,p5->english);
        fputc('\n',fpp);		
		p5=p5->next;
	} 
    
    fclose(fpp);
	
}  
  
int menu_select()     //菜单打印函数 
{  
    char s;  
    int cn;  
    system("cls");  
   	printf("\t*********************************\n");  
    printf("\t*\t 2B成绩系统\t\t*\n");  
    printf("\t*\t           \t\t*\n");  
    printf("\t*\t1. 录入所有成绩\t\t*\n");     //Creat 
    printf("\t*\t2. 打印所有成绩\t\t*\n");     //Print 
    printf("\t*\t3. 排序输出成绩\t\t*\n");     //Comp 
    printf("\t*\t4. 添加一条记录\t\t*\n"); 	   //Add 
    printf("\t*\t5. 删除一条成绩\t\t*\n"); 	   //Delect 
    printf("\t*\t6. 查改单人成绩\t\t*\n"); 	   //Find 
    printf("\t*\t7. 各科平均成绩\t\t*\n"); 	   //Average 
    printf("\t*\t8. 总分区间筛选\t\t*\n");     //Collect 
    printf("\t*\t9. 退出\t\t\t*\n");    
    printf("\t*********************************\n");   
    printf("请输入数字1-9进入相应功能:");  
    
    do  
    {  
        s=getchar();  
        cn=(int)s-'0';  
    }while(cn<0 || cn>9);  
    return cn;    
} 
  
void Creat()           //建立链表函数 
{
	char name[20],xue[20];
	int n=0;
	FILE *fp;
	student *p1,*p2,*p,*temp;
	head=NULL; 
	
	p=head;
	if(p!=NULL)
	{
		for(p=head;p!=NULL;p=temp)
		{
		   temp=p->next;
		   free(p);
		} 
		if(p==NULL)  
		{  
		    printf("内存释放成功!\n");  
		} 
	}
	 
  	count=0;  
	if((fp=fopen(filename,"w"))==NULL)
	{
		printf("打开文件失败!\n");
		exit(0);
	}     
	
    printf("请输入该学生的名字与学号(以0 0结束):\n");  
   	getchar();
    while(scanf("%s %s",name,xue)!=EOF)          //尾插法建立链表 
    {   		 
		p1=(student *)malloc(sizeof(student)); 
		 
        n++;  
        if(n==1)  
        head=p1;  
        else  
        {  
            p2->next=p1;  
        }  
        if(name[0]=='0' && xue[0]=='0')  
        {   
         	strcpy(p1->name,name);
         	strcpy(p1->xue,xue);
		    break;  
        }
        
        printf("请分别输入语数英成绩:\n");  
        strcpy(p1->name,name);
	 	strcpy(p1->xue,xue); 
        fputs(name,fp);
        fputc(' ',fp);
        fputs(xue,fp);
		scanf("%d %d %d",&p1->chinese,&p1->math,&p1->english);  
		fputc(' ',fp);
        fprintf(fp,"%d %d %d",p1->chinese,p1->math,p1->english);
        fputc('\n',fp);
        count++;  
        while(getchar()!='\n')  
        continue;  
        p2=p1;  
          
        printf("请输入该学生的名字与学号(以0 0结束):\n");  
    }  
    p1->next=NULL;  
    printf("总记录数:%d\n",count);  
    
	fclose(fp);

}
void Recreat()           //重建立链表函数 
{
	student *p1,*p2;
	char name[20];
	char xue[20];  
    int chinese;  
    int math;  
    int english; 
	FILE *fpp;
	int n1=0;	
		
	count=0;
	if((fpp=fopen(filename,"r"))==NULL)
	{
		printf("打开文件失败!\n");
		exit(0);
	}
	while(fscanf(fpp,"%s %s %d %d %d",name,xue,&chinese,&math,&english)==5)
    {   
 		count++;
		p1=(student *)malloc(sizeof(student)); 
		 
        n1++;  
        if(n1==1)  
        head=p1;  
        else  
        p2->next=p1;  
         
       	strcpy(p1->name,name);
       	strcpy(p1->xue,xue);
       	p1->chinese=chinese;
       	p1->math=math;
       	p1->english=english;
       	          
        p2=p1;            
    }  
    
    p1=(student *)malloc(sizeof(student)); 
    p1->name[0]='0',p1->xue[0]='0';
    p2->next=p1;
    p1->next=NULL; 
	 
	fclose(fpp);
}
void menu_pri()          //菜单功能调用函数 
{	 
	int a,b; 
 	char mou[20];
 	student *p5,*temp;
 	Recreat();
	for(;;)  
    {  
        switch(menu_select())  
        {     
            case 1:     
						count=0; 
                        Creat(); 
						system("pause");  
                        break;  
              
            case 2:     
                        Print();  
                        system("pause");  
                        break;
              
            case 3:     
						Comp();  
                        Print();  
                        system("pause");  
                        break;
              
            case 4:     
        				count=0;
        				Fcount(); 
						Add();  
                        Print();   
                        system("pause");  
                        break;  
              
            case 5:       
                       	count=0;
						Fcount(); 
                        Delect();
                        Print(); 
                        system("pause");  
                        break;  
              
            case 6:    						
						printf("请输入该同学的名字:\n");  
                        scanf("%s",mou);  
                        Find(mou);  
                        system("pause");   
                        break; 
              
            case 7:      
                      	count=0;
						Fcount();
                        Sum();  
                        Average();  
                        system("pause");  
                        break;    
                          
            case 8:      
                        printf("请输入要选择成绩的区间:\n");  
                        scanf("%d %d",&a,&b);  
                        Collect(a,b);  
                        system("pause");  
                        break;  
                          
            case 9:     
            			p5=head;
						for(p5=head;p5!=NULL;p5=temp)
						{
						   temp=p5->next;
						   free(p5);
						} 
						if(p5==NULL)  
						{  
						    printf("内存释放成功!\n");  
						}
						printf("Goodbye!\n");  
                        exit(0);              
        }  
    }  
} 
int main()  
{    	
   	printf("请输入保存成绩的文件名:\n");
    scanf("%s",filename);   
    
    menu_pri();
      
    return 0;     
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值