C语言程序设计实训(数组实现学生信息管理系统)

  1. 事先存入的数据:

 

  1. 菜单:

 

  1. 系统帮助及说明:

  1. 写入学生信息:

  

该写入仅写入数组并不存入文件。

  1. 读出学生信息

  

  1. 将学生信息存入文件中

此时文件中数据为:

  1. 输出每门课程最高分:

 

  1. 随机读取信息:

 

  1. 专业平均成绩升序(简单选择排序):

 

  1. 班级平均成绩降序(冒泡)::

  1. 班级单科成绩升序(插排):

  1. 综合查找:

  1. 输出所有信息:

  1. 删除学生信息:

 

 源码如下(原创,如用请点赞):

  1. #include<iostream>
    #include<string.h>
    #include<stdlib.h>
    #include<iomanip>
    #include<fstream>
    #include<time.h>
    #include<typeinfo>
    #include<conio.h>
    #define M 1000
    int length;
    int l=5;
    char a[10],b[10],c[10],d[10],e[10],f[10],g[10];//标题 
    struct student
    {
    	char num[10];//学号
    	char name[10];//姓名
    	char spec[10];//专业
    	char stu_class[10];//班级 
    	int score1; 
    	int score2;
    	int score3;
    }stu[30];
    
    int Init()//初始化 
    { 	
    
    	int i = 0;
    	FILE *p = fopen("1.txt", "r");      //打开文件       
    	if(p==NULL)
    		return 0;
    	fscanf(p,"%s%s%s%s%s%s%s",&a,&b,&c,&d,&e,&f,&g);//读取标题		
    	while (!feof(p)) //检测流上的文件结束符,如果文件结束,则返回非0值
    	{	//将文件中数据读取到结构体数组
    		fscanf(p,"%s%s%s%s%d%d%d",&stu[i].num,&stu[i].name,&stu[i].spec,&stu[i].stu_class,&stu[i].score1,&stu[i].score2,&stu[i].score3);
    		i++;
    	}
    	length = i;
    	fclose(p);
    	return 1;
    } 
    
    void Input()//从键盘输入一个学生信息存入文件和结构体数组。 
    {
    	loop1:;  
    	printf("请输入学生信息:\n");
    	printf(" 学号 姓名 专业 班级 成绩1 成绩2 成绩3\n");
    	int i = length; 
    	char num_stu[10];
    	scanf("%s%s%s%s%d%d%d",&stu[i].num,&stu[i].name,&stu[i].spec,&stu[i].stu_class,&stu[i].score1,&stu[i].score2,&stu[i].score3); 
    	int n;
    	for(n=0;n<99;n++)
    	{
    		if(stu[i].num==num_stu)
    		{
    			printf("学号冲突,请重新输入");
    			goto loop1; 	
    		}
    	}
    	FILE *p = fopen("1.txt", "c");      //打开文件                  
    	fclose(p);
    	l=l+1;
    	printf("写入信息成功!\n"); 
    	length++;
    } 
    
    			  			
    void Output1()//输入学号,将对应的学生信息格式化输出。
    {	
    	char *num;
    	printf("请输入查询的学号:");
    	scanf("%d",num);
    	printf("学号 姓名 专业 班级 成绩1 成绩2 成绩3\n");
    	for(int i=0;i<length;i++)
    		if(strcmp(stu[i].num,num)==0) 
    			printf("%s %s %s %s %d    %d   %d \n",stu[i].num,stu[i].name,stu[i].spec,stu[i].stu_class,stu[i].score1,stu[i].score2,stu[i].score3);
    }
    
    void Output(struct student stu[M])//查询函数
    {
    	int i=0;
    	char xh[25];
    	if(l==0)
    	{
    		printf("目前没有学生信息\n");
    		return;
    	}
    	else
    	{
    		printf("请输入查看学生的学号\n");
    		scanf("%s",&xh);
    		for(i=0;i<l;i++)
    		{
    			if(strcmp(stu[i].num,xh)==0)
       			{
       				printf("%s %s %s %s %d    %d   %d \n",stu[i].num,stu[i].name,stu[i].spec,stu[i].stu_class,stu[i].score1,stu[i].score2,stu[i].score3);
        		} 
        	}
        }
    }
    
    void all()//输出所有信息 
    {
    	printf("学号 姓名 专业 班级 成绩1 成绩2 成绩3 总成绩 平均成绩 \n");
    	for(int i=0;i<length;i++)
    	{
    		int sum=stu[i].score1+stu[i].score2+stu[i].score3;
    		int ave=sum/3;
    		printf("%s %s %s %s %d %d %d %d %d \n",stu[i].num,stu[i].name,stu[i].spec,stu[i].stu_class,stu[i].score1,stu[i].score2,stu[i].score3,sum,ave);
    	}
    }
    
    void help()/*帮助界面*/
    { 
    	 printf("\n\t\t\t0.欢迎使用系统帮助!\n");
    	 printf("\n\t\t\t1.初次进入系统后,请先选择增加学生信息;\n");
    	 printf("\n\t\t\t2.按照菜单提示键入数字代号;\n");
    	 printf("\n\t\t\t3.增加学生信息后,切记保存;\n");
    	 printf("\n\t\t\t4.谢谢您的使用!\n");
    }
    
    void Save()//将某个学生信息存入一个文件。 
    {
    	printf("请输入学生信息:\n");
    	printf(" 学号 姓名 专业 班级 成绩1 成绩2 成绩3\n");
    	int i = length; 
    	scanf("%s%s%s%s%d%d%d",&stu[i].num,&stu[i].name,&stu[i].spec,&stu[i].stu_class,&stu[i].score1,&stu[i].score2,&stu[i].score3); 
    	FILE *p = fopen("1.txt", "a");      //打开文件    
    	fprintf(p,"\n%s %s  %s  %s %d  %d  %d\n",stu[i].num,stu[i].name,stu[i].spec,stu[i].stu_class,stu[i].score1,stu[i].score2,stu[i].score3);
    	printf("%s %s  %s  %s %d  %d  %d",stu[i].num,stu[i].name,stu[i].spec,stu[i].stu_class,stu[i].score1,stu[i].score2,stu[i].score3);
    	l=l+1;
    	fclose(p);
    	printf("写入文件成功!\n"); 
    } 
    
    
    void del(struct student stu[M])//删除函数 
    {
     	int j,index=0,k=l;
     	char xh[25];
     	printf("所要删除的学生学号为:\n");
     	scanf("%s",xh); 
     	do{
    	 for(j=0;j<l;j++)
     	{
     		if(strcmp(stu[j].num,xh)==0)
    	{
     	for(j=index;j<l;j++)
     	stu[j]=stu[j+1];
     	l--;
     	if(l<k)
     	printf("删除成功\n");
        }
        index++;
        }
    	}
        while(j==l); 
        printf("没有你要删除的学生信息\n");
        FILE *p = fopen("1.txt", "w");      //打开文件    
        for(int i=0;i<length;i++)
    	{
    		fprintf(p,"%s %s %s %s %d %d %d \n",stu[i].num,stu[i].name,stu[i].spec,stu[i].stu_class,stu[i].score1,stu[i].score2,stu[i].score3);
    		printf("%s %s %s %s %d %d %d \n",stu[i].num,stu[i].name,stu[i].spec,stu[i].stu_class,stu[i].score1,stu[i].score2,stu[i].score3);
    	}
    	fclose(p);
    	printf("写入文件成功!\n"); 
    }
     
    
    void Max()//求所有学生某门课程的最高分及对应的学生的姓名。 
    {
    	int i;
    	int max[3]={0,0,0};
    	for(i=0;i<length;i++)
    		if(max[0]<stu[i].score1)
    		max[0]=stu[i].score1;
    		printf("课程1最高分:%d分----",max[0]);
    		for(i=0;i<length;i++)
    		if(stu[i].score1 == max[0])
    		printf("%s ",stu[i].name);
    		printf("\n");
    	for(i=0;i<length;i++)
    	if(max[1]<stu[i].score2) 
    	max[1]=stu[i].score2; 
    	printf("课程2最高分:%d分----",max[1]);		
    	for(i=0;i<length;i++)
    	if(stu[i].score2 == max[1])
    	printf("%s ",stu[i].name);
    	printf("\n");	
    	for(i=0;i<length;i++)
    	if(max[2]<stu[i].score3)
    	max[2]=stu[i].score3;
    	printf("课程3最高分:%d分----",max[2],stu[i].name);		
    	for(i=0;i<length;i++)
    	if(stu[i].score3 == max[2])
    	printf("%s ",stu[i].name);
    	printf("\n");
    }
    	
    
    void Fetch()//从文件中随机读取某个学生的信息。 
    {
    	int i = time(NULL) % length;
    	printf("第%d名学生\n",i+1);
    	printf(" 学号 姓名 专业 班级 成绩1 成绩2 成绩3\n");
    	printf("%s  %s  %s  %s  %d  %d  %d \n",stu[i].num,stu[i].name,stu[i].spec,stu[i].stu_class,stu[i].score1,stu[i].score2,stu[i].score3);
    }
    
    void Sort_select()//按专业总平均成绩由低到高进行简单选择排序。 
    {
    	struct student tmp;
    	char str[6];
    	int i,j,t,n,k;
    	float avg[length],avg_temp;
    	printf("请输入专业:\n");
    	scanf("%s",str);
    	for(i=0;i<length;i++)
    		avg[i] = float(stu[i].score1 + stu[i].score2 + stu[i].score3) / 3;
    	//简单选择排序
        for(i=0; i<length; i++)  //做n-1趟选取
        {
            k = i;
            for(j=i+1;j<=length;j++)
                if(avg[j] < avg[k] && strcmp(stu[i].spec,str)==0 && strcmp(stu[j].spec,str)==0)
                    k = j;    //k为最小值
            if(i!=k)//交换
            {
            	tmp=stu[k];      
    			avg_temp = avg[k];
    			stu[k]=stu[i];   
    			avg[k] = avg[i];
    			stu[i]=tmp;	    
    			avg[i] = avg_temp;
            }
        }
    	printf(" 学号 姓名 专业 班级 成绩1 成绩2 成绩3 平均分\n");
        for(i=0;i<length;i++)
    		if(strcmp(stu[i].spec,str)==0) 
    			printf("%5s %-6s %3s %s %3d %3d %3d %-6.2f\n",stu[i].num,stu[i].name,stu[i].spec,stu[i].stu_class,stu[i].score1,stu[i].score2,stu[i].score3,avg[i]);
    }
    
    void Sort_buble()//按班级总平均成绩由高到低进行冒泡排序。 
    {
    	struct student tmp;
    	char str[6];
    	float avg[length],avg_temp;
    	int i,j;
    	printf("请输入班级:\n");
    	scanf("%s",str);
    	for(i=0;i<length;i++)
    		avg[i] = float(stu[i].score1 + stu[i].score2 + stu[i].score3) / 3;
    	//冒泡排序
    	for(i=0;i<length;i++)
    		for(j=0;j<length;j++)
    			if(avg[i]>avg[j] && strcmp(stu[i].stu_class,str)==0 && strcmp(stu[j].stu_class,str)==0) 
    			{
    				tmp = stu[i];     
    				avg_temp = avg[i];
    				stu[i] = stu[j];   
    				avg[i] = avg[j];
    				stu[j] = tmp;	     
    				avg[j] = avg_temp;
    			}
    	printf(" 学号 姓名 专业 班级 成绩1 成绩2 成绩3 平均分\n");
    	for(i=0;i<length;i++)
    		if(strcmp(stu[i].stu_class,str)==0) 
    			printf("%5s %-6s %3s %s %3d %3d %3d %-6.2f\n",stu[i].num,stu[i].name,stu[i].spec,stu[i].stu_class,stu[i].score1,stu[i].score2,stu[i].score3,avg[i]);
    }
    
    void Sort_insert()//按课程成绩由低到高进行直接插入排序。 
    {
    	int i,j,len=0;
    	char str[6];
    	int m;
    	struct student tmp;
    	struct student insert[100];
    	printf("请输入班级:\n");
    	scanf("%s",str);
    	printf("请输入科目 :\n");
    	scanf("%s",m);
    	if(m==1)
    	{
    		for(i=0;i<length;i++)
    	    if(strcmp(stu[i].stu_class,str)==0) //筛选出某个班上的学生进行插入排序 
    	    {
    	    	insert[len] = stu[i];
    	    	len++;
    		}
    	for(i=1;i<len;i++)//循环从第2个元素开始
        {
            if(insert[i].score1 < insert[i-1].score1)
            {
                tmp = insert[i];
                for(j = i-1; j >= 0 && insert[j].score1 > tmp.score1; j--)
                    insert[j+1] = insert[j];
                insert[j+1] = tmp;
            }
        }
    	printf(" 学号 姓名 专业 班级 成绩1 成绩2 成绩3\n");
        for(i=0;i<len;i++)
    		printf("%5s  %-6s   %3s  %s  %3d  %3d  %3d\n",insert[i].num,insert[i].name,insert[i].spec,insert[i].stu_class,insert[i].score1,insert[i].score2,insert[i].score3);
    	}
        if(m==2)
        {for(i=0;i<length;i++)
    	    if(strcmp(stu[i].stu_class,str)==0) //筛选出某个班上的学生进行插入排序 
    	    {
    	    	insert[len] = stu[i];
    	    	len++;
    		}
    	for(i=1;i<len;i++)//循环从第2个元素开始
        {
            if(insert[i].score2 < insert[i-1].score2)
            {
                tmp = insert[i];
                for(j = i-1; j >= 0 && insert[j].score1 > tmp.score1; j--)
                    insert[j+1] = insert[j];
                insert[j+1] = tmp;
            }
        }
    	printf(" 学号 姓名 专业 班级 成绩1 成绩2 成绩3\n");
        for(i=0;i<len;i++)
    		printf("%5s  %-6s   %3s  %s  %3d  %3d  %3d\n",insert[i].num,insert[i].name,insert[i].spec,insert[i].stu_class,insert[i].score1,insert[i].score2,insert[i].score3);
    	}
    	if(m=3) 
    	{
    		for(i=0;i<length;i++)
    	    if(strcmp(stu[i].stu_class,str)==0) //筛选出某个班上的学生进行插入排序 
    	    {
    	    	insert[len] = stu[i];
    	    	len++;
    		}
    	for(i=1;i<len;i++)//循环从第2个元素开始
        {
            if(insert[i].score3 < insert[i-1].score3)
            {
                tmp = insert[i];
                for(j = i-1; j >= 0 && insert[j].score1 > tmp.score1; j--)
                    insert[j+1] = insert[j];
                insert[j+1] = tmp;
            }
        }
    	printf(" 学号 姓名 专业 班级 成绩1 成绩2 成绩3\n");
        for(i=0;i<len;i++)
    		printf("%5s  %-6s   %3s  %s  %3d  %3d  %3d\n",insert[i].num,insert[i].name,insert[i].spec,insert[i].stu_class,insert[i].score1,insert[i].score2,insert[i].score3);
    	}
    }
    
    void Search()//查找某班总分在某分数段以上的学生 
    {
    	int i,k=0,score;
    	int sum=stu[i].score1+stu[i].score2+stu[i].score3;
    	char str[6];
    	printf("请输入班级和分数:\n");
    	scanf("%s%d",str,&score);
    	printf(" 学号 姓名 专业 班级 成绩1 成绩2 成绩3 总分\n");
    	for(i=0;i<length;i++)
    		if(strcmp(stu[i].stu_class,str)==0 && stu[i].score1+stu[i].score2+stu[i].score3 > score)
    			{
    				printf("%5s  %-6s   %3s  %s  %3d  %3d  %3d  %3d\n",stu[i].num,stu[i].name,stu[i].spec,stu[i].stu_class,stu[i].score1,stu[i].score2,stu[i].score3,sum);
    				k++; 
    			}
    	printf("%s班总分%d以上的一共有%d人。\n",str,score,k);
    }
    
    void Deletedatd()//删除信息
    {
    	int i, j, flag = 0;
    	char m;
    	printf("请输入想删除的信息:\n");
    	scanf("%lld", m);
    	for (i = 0; i < l; i++)
    	{
    		if (stu[i].num==&m)
    		{
    			for (j = i; j < l + 1; j++)
    			{
    				stu[j] = stu[j + 1];
    			}
    
    		}
    	}
    	getch();
    }
    
    
    int main()
    {	
    	int i,j;
    	if(Init()==0)
    	{
    		printf("文件不存在!");
    		return 0;
    	}
    		system("color 0f");//变色
       		int choice;
    		int num;		//num为每次输入的人数
        	static int  k; // k为总人数 且会变化
    		int label_of_save=0;//存盘判据
    		while(1)//死循环 支持多次不同操作
    		{
    			printf("\t\t\t  ******************************************************\n\n");
    	 		printf("\t\t\t  *                学生信息管理系统                   * \n\n");
    	 		printf("\t\t\t  ******************************************************\n\n"); 
    	 		printf("\t\t\t*********************系统功能菜单*************************\n");
    	 		printf("\t\t\t     ----------------------   ----------------------  \n");
    	 		printf("\t\t\t     *********************************************  \n");
    			printf("\t\t\t     * 0.系统帮助及说明     * *  1.写入学生信息         *   \n");
    	 		printf("\t\t\t     *********************************************  \n"); 
    	 		printf("\t\t\t     * 2.查询学生信息       * *  3.保存学生信息         *   \n");
    	 		printf("\t\t\t     *********************************************  \n");
    	 		printf("\t\t\t     * 4.课程最高分         * *  5.随机读取信息         *   \n");
    	 		printf("\t\t\t     *********************************************  \n");
    	 		printf("\t\t\t     * 6.专业平均成绩升序   * *  7.班级平均成绩降序     *   \n");
    	 		printf("\t\t\t     *********************************************  \n");
    	 		printf("\t\t\t     * 8.班级单科成绩升序   * *  9.综合查找             *   \n");
    	 		printf("\t\t\t     *********************************************  \n");
    	 		printf("\t\t\t     * 10.输出所有信息      * *  11.删除学生信息        * \n");
    	 		printf("\t\t\t     *********************************************  \n");
    	 		printf("\t\t\t     * 12.退出系统          * \n");
    	 		printf("\t\t\t     **********************        \n");
    	 		printf("\t\t\t     ----------------------   ----------------------  \n");
    			scanf("%d",&choice);//功能选择	
    			int j;//支持增补的变量保障 
    			if(choice>=0&&choice<=13) {
    			switch(choice) {
    				case 0:
    					help();
    					break;
    				case 1: 
    					Input(); 
    					break;
    				case 2:	
    					Output(stu);
    					break;
    				case 3: 
    					Save(); 
    					break;
    				case 4: 
    					Max();
    					break;
    				case 5: 
    					Fetch();
    					break;
    				case 6: 
    					Sort_select();
    					break;
    				case 7: 
    					Sort_buble();
    					break;
    				case 8: 
    					Sort_insert();
    					//my_Sort_insert();
    					break;
    				case 9: 
    					Search();
    					break;
    				case 11:
    	  				del(stu);//删除
    	  				break;
    				case 10:
    					all();
    					break;
    				case 12:		 
    					printf("\n    ~~~~~~~~~~~~~~~~~~~~~~~~~~\n");     //退出提示
    					printf("             Goodbye!         \n");
    					printf("    ~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
    						exit(0);//将程序退出 
    			}
    		} else //没有按规范选择功能,要进行错误提示     //错误提示
    		{
    		printf("\n    ~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
    		printf("           error input!       \n");
    		printf("    ~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
    		}
    	}
    	return 0;
    }
    
    
    void write()
    {
    	int i = length; 
    	FILE *p = fopen("1.txt", "w");      //打开文件    
    	fprintf(p,"%s %s %s %s %s %s %s\n",a,b,c,d,e,f,g);
    	for(i=0;i<length;i++)
    		fprintf(p,"%s %s      %s   %s  %d      %d         %d",stu[i].num,stu[i].name,stu[i].spec,stu[i].stu_class,stu[i].score1,stu[i].score2,stu[i].score3);
    	fclose(p);
    } 

  • 9
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

起剑倒悬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值