C语言学生信息管理系统(结构体数组,文件)

C语言学生信息管理系统(结构体数组,文件)

	这是初学时写的一个程序,比较菜,不喜勿喷。
	在一个结构体里定义结构体内所有的信息(如果信息也需要分类则可以再定义一个结构体并在当前结构体内声明,我的这个代码在科目那里就是这么干的),在当前学生结构体最后定义一个数组,数组的容量要不小于学生数目,之后就可以利用ch[1],ch[2].表示学生1,学生2.
	在获取文件信息时用fscanf进行对文件的扫描,在修改文件时用fpintf对文件进行书写。

班级 学号 姓名 学科1 学科1平时分 实验分 考试分 学科2平时分 实验分 考试分
以下为文件内容
101 10101 AAA Math 97 98 94 Chinese 82 73 96 99
101 10102 BBB Math 92 93 91 Chinese 95 94 97 59
102 10201 CCC Math 83 72 62 Chinese 93 89 95 94

在允许代码的时候记得改文件地址,否则无法正常运行(注意C语言的文件地址是\而不是,用Windows+R得到的地址是\的,在代码里在加一个\就没有警告了)。

#include 
#include 
#include 
void sort(int a[],int i)//排序函数
{
	printf("%d %d %d\n",a[0],a[1],a[2]);
	int j,l,temp;
	for(j=0;j<i-1;j++)
	{
		for(l=j+1;l<i;l++)
		{
			if(a[j]>a[l])
			{
				temp=a[l];
				a[l]=a[j];
				a[j]=temp;
			}
		}
	}
	for(l=0;l<i;l++)
	{
		printf("%d\n",a[l]);
	}
}
int main()
{
    int i,j;
    char b[3][10];
    FILE *fp,*fp1;//文件输入输出指针 
    struct Subject//科目结构体 
    {
    	char classname[40];//学科名 
	    float normal_s;//平时成绩 
	    float experiment_s;//实验成绩 
	    float exam_s;//考试成绩 
	    
	}; 
    struct student//学生信息 
	{
	    int num;//学号 
	    char name[30];//名字 
	    int cla;//班级 
	    struct Subject subject[2]; //科目 
	    float general_s;//总评成绩 
	}Cha[6];
	//
    int a;
    //界面模块代码
    printf("1.输入学生信息\n");
    printf("2.修改学生信息\n");
    printf("3.删除学生信息\n");
    printf("4.按姓名查询\n");
    printf("5.按班级查询\n");
    printf("6.按学号查询\n");
    printf("7.按课程名称查询\n");
    printf("8.按总分高低排序\n");
    printf("9.单科成绩排序\n");
    printf("10.查询班级优秀率\n");
    printf("11.退出系统\n");
    //选择操作代码
    printf("请输入操作序号:");
    scanf("%d",&a);
    if((a<1)||(a>11))//判断输入数值是否有效
    {
        printf("Error! The number is out of range!");
        exit(0);
    }
    while(a!=11)//输入为11时为退出系统的编号 
    {
    //操作甄别语句代码
    switch(a)
    {
    	
    ///////////////////////////////////////////读取数据  
		case 1:
		{
            if((fp=fopen("F:\\data.txt","r"))==NULL)//判断是否可以从文件中读取
	{
		printf("can not open file\n");
		return 0;
	}
	i = 0;
	while(!feof(fp))//文件读取不为空时进行 
	{
        fscanf(fp,"%d  %d  %s  %s  %f  %f  %f  %s  %f  %f  %f  %f\n",&Cha[i].cla,&Cha[i].num, Cha[i].name,Cha[i].subject[0].classname,&Cha[i].subject[0].normal_s,&Cha[i].subject[0].experiment_s,&Cha[i].subject[0].exam_s,Cha[i].subject[1].classname,&Cha[i].subject[1].normal_s,&Cha[i].subject[1].experiment_s,&Cha[i].subject[1].exam_s,&Cha[i].general_s);
		printf("%d  %d  %s  %s  %.2f  %.2f  %.2f  %s  %.2f  %.2f  %.2f  %.2f\n",Cha[i].cla,Cha[i].num, Cha[i].name,Cha[i].subject[0].classname,Cha[i].subject[0].normal_s,Cha[i].subject[0].experiment_s,Cha[i].subject[0].exam_s,Cha[i].subject[1].classname,Cha[i].subject[1].normal_s,Cha[i].subject[1].experiment_s,Cha[i].subject[1].exam_s,Cha[i].general_s);
		i++;
	}
	fclose(fp);
    }break;
    ///////////////////////////////////////////读取完毕
	 
	///////////////////////////////////////////修改学生名字 
	case 2:
	{
		if((fp1=fopen("D:\\data.txt","w"))==NULL)//判断是否可以从文件中读取 
	{
		printf("can not open file\n");
		return 0;
	}
		printf("请输入想要修改学生的姓名:  ");
		char name1[20]="\0";
		scanf("%s",name1);
		getchar();//吸收回车
		for(int k=0;k<i;k++)
	        {
	        	if(strcmp(name1,Cha[k].name)==0)
	        	{
	        		printf("请输入想要修改成什么:  ");
	        		char namec[20]="\0";
	        		scanf("%s",namec);
	        	    getchar();//吸收回车
	        	    strcpy(Cha[k].name,namec);
	        	    printf("%s	%s\n",Cha[k].name,namec);
				}
				
			}
			for(int k=0;k<i;k++) 
				{
					fprintf(fp1,"%d  %d  %s  %s  %f  %f  %f  %s  %f  %f  %f  %f\n",Cha[k].cla,Cha[k].num, Cha[k].name,Cha[k].subject[0].classname,Cha[k].subject[0].normal_s,Cha[k].subject[0].experiment_s,Cha[k].subject[0].exam_s,Cha[k].subject[1].classname,Cha[k].subject[1].normal_s,Cha[k].subject[1].experiment_s,Cha[k].subject[1].exam_s,Cha[k].general_s);
				}
				printf("修改成功\n");
			fclose(fp1);
	}break; 
	///////////////////////////////////////////修改完毕 
	
	///////////////////////////////////////////删除学生信息
	case 3:
		{
			if((fp1=fopen("D:\\data.txt","w"))==NULL)//判断是否可以从文件中读取 
	{
		printf("can not open file\n");
		return 0;
	}
		printf("请输入想要删除学生的姓名:  ");
		char name1[20]="\0";
		scanf("%s",name1);
		getchar();//吸收回车
		for(int k=0;k<i;k++)
	        {
	        	if(strcmp(name1,Cha[k].name)==0)
	        	{
	        	continue; 
				}
				else 
					fprintf(fp1,"%d  %d  %s  %s  %f  %f  %f  %s  %f  %f  %f  %f\n",Cha[k].cla,Cha[k].num, Cha[k].name,Cha[k].subject[0].classname,Cha[k].subject[0].normal_s,Cha[k].subject[0].experiment_s,Cha[k].subject[0].exam_s,Cha[k].subject[1].classname,Cha[k].subject[1].normal_s,Cha[k].subject[1].experiment_s,Cha[k].subject[1].exam_s,Cha[k].general_s);
				printf("%d  %d  %s  %s  %f  %f  %f  %s  %f  %f  %f  %f\n",Cha[k].cla,Cha[k].num, Cha[k].name,Cha[k].subject[0].classname,Cha[k].subject[0].normal_s,Cha[k].subject[0].experiment_s,Cha[k].subject[0].exam_s,Cha[k].subject[1].classname,Cha[k].subject[1].normal_s,Cha[k].subject[1].experiment_s,Cha[k].subject[1].exam_s,Cha[k].general_s);
			}
			printf("删除成功\n");
			fclose(fp1);
		}break;
	///////////////////////////////////////////删除完毕 
	 
    ///////////////////////////////////////////按照姓名查询 
    case 4 :
    	{
			char name1[20]="\0";
	        printf("请输入需要查询的姓名:");
	        scanf("%s",name1);
	        getchar();//吸收回车 
	        printf("%s\n",name1);
	        for(int k=0;k<i;k++)
	        {
	        	if(strcmp(name1,Cha[k].name)==0)
	        	{
	        		printf("%d  %d  %s  %s  %f  %f  %f  %s  %f  %f  %f\n",Cha[k].cla,Cha[k].num, Cha[k].name,Cha[k].subject[0].classname,Cha[k].subject[0].normal_s,Cha[k].subject[0].experiment_s,Cha[k].subject[0].exam_s,Cha[k].subject[1].classname,Cha[k].subject[1].normal_s,Cha[k].subject[1].experiment_s,Cha[k].subject[1].exam_s,Cha[i].general_s);
				}
			}
		}break;
	///////////////////////////////////////////查询完毕
		
	///////////////////////////////////////////按照班级查询
		case 5:
    	{
			int clas;
	        printf("请输入需要查询的班级:");
	        scanf("%d",&clas);
	        getchar();//吸收回车 
	        printf("%d\n",clas);
	        for(int k=0;k<i;k++)
	        {
	        	if(clas == Cha[k].cla)
	        	{
	        		printf("%d  %d  %s  %s  %f  %f  %f  %s  %f  %f  %f\n",Cha[k].cla,Cha[k].num, Cha[k].name,Cha[k].subject[0].classname,Cha[k].subject[0].normal_s,Cha[k].subject[0].experiment_s,Cha[k].subject[0].exam_s,Cha[k].subject[1].classname,Cha[k].subject[1].normal_s,Cha[k].subject[1].experiment_s,Cha[k].subject[1].exam_s,Cha[i].general_s);
				}
			}

		}break; 
	///////////////////////////////////////////查询完毕
	
	///////////////////////////////////////////按照学号查询
	case 6:
    	{
			int number;
	        printf("请输入需要查询的学号:");
	        scanf("%d",&number);
	        getchar();//吸收回车 
	        printf("%d\n",number);
	        for(int k=0;k<i;k++)
	        {
	        	if(number==Cha[k].num)
	        	{
	        		printf("%d  %d  %s  %s  %f  %f  %f  %s  %f  %f  %f\n",Cha[k].cla,Cha[k].num, Cha[k].name,Cha[k].subject[0].classname,Cha[k].subject[0].normal_s,Cha[k].subject[0].experiment_s,Cha[k].subject[0].exam_s,Cha[k].subject[1].classname,Cha[k].subject[1].normal_s,Cha[k].subject[1].experiment_s,Cha[k].subject[1].exam_s,Cha[i].general_s);
				}
			}
		}break; 
	///////////////////////////////////////////查询完毕	
	
	///////////////////////////////////////////按照课程名查询 
	case 7 :
    	{
			char kecheng[20]="\0";
	        printf("请输入需要查询的课程名:");
	        scanf("%s",kecheng);
	        getchar();//吸收回车 
	        printf("%s\n",kecheng);
	        for(int k=0;k<i;k++)
	        {
	        	if(strcmp(kecheng,Cha[k].subject[0].classname)==0)
	        	{
	        		printf("%d  %d  %s  %s  %f  %f  %f\n",Cha[k].cla,Cha[k].num, Cha[k].name,Cha[k].subject[0].classname,Cha[k].subject[0].normal_s,Cha[k].subject[0].experiment_s,Cha[k].subject[0].exam_s);
				}
				if(strcmp(kecheng,Cha[k].subject[1].classname)==0)
	        	{
	        		printf("%d  %d  %s  %s  %f  %f  %f\n",Cha[k].cla,Cha[k].num, Cha[k].name,Cha[k].subject[1].classname,Cha[k].subject[1].normal_s,Cha[k].subject[1].experiment_s,Cha[k].subject[1].exam_s);
	        	}
			}
		}break;
	///////////////////////////////////////////查询完毕
	
	///////////////////////////////////////////按照总分高低排序 
	case 8:
		{
			int stu_c[i];
			int k;
			for(k=0;k<i;k++)
			{
				stu_c[k]=Cha[k].general_s;
			}
			sort(stu_c,i);//调用排序函数 
		}break;
	///////////////////////////////////////////排序完毕
	
	///////////////////////////////////////////按照总分高低排序 
	case 9:
		{
			int stu_c[i];
			int k;
			printf("请你输入所要查询的科目:  ");
			char sub[20];
			scanf("%s",sub);
	        getchar();//吸收回车 
			if(strcmp(sub,Cha[k].subject[0].classname)==0)//数学 
			{
				for(k=0;k<i;k++)
			{
				stu_c[k]=Cha[k].subject[0].exam_s;
			}
			sort(stu_c,i);//调用排序函数 
			}
			else if(strcmp(sub,Cha[k].subject[1].classname)==0)//语文 
			{
				for(k=0;k<i;k++)
			{
				stu_c[k]=Cha[k].subject[1].exam_s;
			}
			sort(stu_c,i);//调用排序函数 
			}
			else
			{
				printf("输入错误\n");
				exit(0);
			}
		}break;
	///////////////////////////////////////////排序完毕
	
	///////////////////////////////////////////班级优秀率查询 
	case 10:
		{
			int flag1=0;
			int flag2=0;
			int flag3=0;
			int cl;
	        printf("请输入需要查询的班级:");
	        scanf("%d",&cl);
	        getchar();//吸收回车 
	        printf("%d\n",cl);
	        for(int k=0;k<i;k++)
	        {
	        	if(cl == Cha[k].cla)
	        	{
	        		flag1++;
	        		if(Cha[k].general_s>=90)//优秀 
					{
						flag2++;
					} 
	        		
	        		if(Cha[k].general_s<60)//不及格 
	        		{
	        			flag3++;
					}
	        		
				}
			}
			printf("%d\n",flag1);
			printf("优秀率为:  ");
			float t1=0;
			t1=(float)flag2/flag1;
			printf("%.2f\n",t1);
			printf("不及格率为:  ");
			float t2=0;
			t2=(float)flag3/flag1;
			printf("%.2f\n",t2);
		}break;
	///////////////////////////////////////////查询完毕
	}
	printf("请输入操作序号:");
    scanf("%d",&a);
    if((a<1)||(a>11))//判断输入数值是否有效
    {
        printf("Error! The number is out of range!");
        exit(0);
    }
	}
 
    return 0;
}
  


你可能感兴趣的:(C语言学生信息管理系统(结构体数组,文件))