学生信息管理系统

目录

 准备过程

一、任务需求

二、实施过程

part1:按照学号进行排序

part2:按照分数进行排序

part3: 在排序分数的基础上输出前三名

part4: 查询分数排名


 准备过程

        本次任务用到的编辑器是Dev-C++

一、任务需求

        这是一个学生管理系统的基础结构图

        本次作业需要在原有代码基础上增加了四个功能:对学号进行排序、对分数进行排序、在排序分数的基础上输出前三名、在排序分数的基础上查询排名,这里使用了选择排序法实现要求,代码如下:

二、实施过程

part1:按照学号进行排序

//对学号进行排序
int sortnum(student stu[])
{
	int i,j;
	student ad;				//定义一个空数组 
	for(i=0;i<N-1;i++)				//选择排序 
	{
		for(j=i+1;j<N;j++)
		{
			if(stu[j].num<stu[i].num)		//从小到大排序 
			{
				ad=stu[i];			//先将stu[i]数组赋值给空数组ad 
				stu[i]=stu[j];		//将stu[j]数组赋值给stu[i]数组,进行位置交换 
				stu[j]=ad;			//暂存在ad的值给到stu[j],完成交换 
			}
		}
	}
	 printf("该班学生按学号信息排序如下:\n\n");
  	printf("学号             姓名     性别   课程成绩\n");
  	for(i=0;i<N;i++){       //循环N次 
  		if(stu[i].num>0)     //当人数不足N时,其余会以0输出,所以增加判断,只输出大于0的结果 
  			printf("%4d %20s %3s %9.2f\n", stu[i].num, stu[i].name, stu[i].sex=='M'?"男":"女", stu[i].score);		//输出排序后的结果 
	  }
  return 0;
} 

运行结果如下图:

part2:按照分数进行排序

//对分数进行排序
int sortscore(student stu[])
{
	int i,j;
	student ad;			//定义一个空数组 
	for(i=0;i<N-1;i++)			//同样是选择排序这里就不过多赘述 
	{
		for(j=i+1;j<N;j++)
		{
			if(stu[j].score > stu[i].score)		//需要注意的是分数是由大到小进行排序,所以是“> ” 
			{
				ad=stu[i];
				stu[i]=stu[j];
				stu[j]=ad;
			}
		}
	}
	printf("该班全部学生信息如下:\n\n");
  	printf("学号             姓名     性别   课程成绩\n");
  	for(i=0;i<N;i++){
  		if(stu[i].num>0)		
  			printf("%4d %20s %3s %9.2f\n", stu[i].num, stu[i].name, stu[i].sex=='M'?"男":"女", stu[i].score);
	  }
  return 0;
} 

运行结果如下图:

part3: 在排序分数的基础上输出前三名

//输出成绩排名前三名的同学
int Topthree(student stu[])
{
	int i,j;
	int k=0;			//定义一个整数k 
	student ad;
	for(i=0;i<N-1;i++)        //选择排序
	{
		for(j=i+1;j<N;j++)
		{
			if(stu[j].score>stu[i].score)
			{
				ad=stu[i];
				stu[i]=stu[j];
				stu[j]=ad;
			}
		}
	}
	printf("该班成绩排名前三名的学生信息如下:\n\n");
  	printf("排名    学号            姓名     性别   课程成绩\n");
  	for(i=0;i<N&&stu[i].num>0;i++){				//“stu[i].num>0 ”加这个判断同样是为了输出大于0的结果 
  		//printf("i=%d,k=%d\n", i,k);
  		
	  	if(stu[i].score == stu[i-1].score)			//当成绩相同时,排名相同,所以直接输出k
		  {printf("%4d %6d %17s %6s %9.2f\n", k, stu[i].num, stu[i].name, stu[i].sex=='M'?"男":"女", stu[i].score);}		 
	  	else{
		  	if(k>=2) break;       	//增加此判断语句使程序只输出排名前三的同学 
			printf("%4d %6d %17s %6s %9.2f\n", i+1, stu[i].num, stu[i].name, stu[i].sex=='M'?"男":"女", stu[i].score);
			k=i+1;}		//当成绩不相同时,输出的排名就是i+1,i为循环的次数 
		
  		}
}

运行结果如下图:

part4: 查询分数排名

//查询排名
int scorerank(student stu[])
{
	int i,j;
	int k=0;
	student ad;
	for(i=0;i<N-1;i++)			//选择排序 
	{
		for(j=i+1;j<N;j++)
		{
			if(stu[j].score>stu[i].score)
			{
				ad=stu[i];
				stu[i]=stu[j];
				stu[j]=ad;
			}
		}
	}
	float soc=-1;			//定义浮点数soc 
	while(soc){					//进入循环 
	 printf("请输入你要查找的成绩(输入0退出查询):");			
     scanf("%f",&soc);		//读取键盘数据
	 if (soc>0) {
       for(i=0;i<N;i++)
       {
        	if(stu[i].score==soc)			//当输入的成绩存在时,执行以下判断 
			{
				if(stu[i].score == stu[i-1].score){printf("成绩为%.2f的排名是:%d\n",soc,k);}		//当成绩相同时,输出相同排名 
	  			else{printf("成绩为%.2f的排名是:%d\n",soc,i+1);k=i+1;break;}}				//当成绩不同时,输出排名为i+1 
//	  		else{printf("成绩为%.2f的排名是:%d\n",soc,i+1);k=i+1;}break;
       }
       if (i==N) printf("没有找到成绩:%.2f 的学生,请再试。\n",soc);			//输入成绩不存在时的判断语句 
     }
  }
  return 0;
}

执行结果如下图:

        以上就是本次任务的全部要求示例了,感谢观看!

最后,附上完整代码:

#include <stdio.h>
#include <stdlib.h>

#include <string.h>
#define N 30
//自定义一种数据类型
typedef struct __student
{
  int num;        //学号
  char name[20];  //名字
  char sex;       //性别
  float score;    //分数
}student;
//定义1个结构体数组
student stu[N]={
{107,"Liping",'M',45},{103,"lihua",'F',87},{101,"wangpin",'M',87}, 
{108,"Zhangping",'M',62.5},{106,"Hefang",'F',92.5},
    {104,"Chengling",'F',87},{105,"Wangming",'M',58}};

//统计人数以及平均分
int totalscore(student stu[])
{
  int i,failed_number=0,totle_number=0; float average,score_sum=0;
  for(i=0;i<N &&stu[i].num;i++)
  {
	score_sum +=stu[i].score;				//将学生分数求和
    if(stu[i].score<60) failed_number+=1;	//记录不及格人数
    totle_number++;							//学生人数求和
  }
  average= score_sum / totle_number;		//计算平均分
  printf("该班有 %d 位学生,该课平均成绩为:%.2f,课程不及格学生有:%d 位。\n", totle_number, average, failed_number);
  return 0;
}
//增加学生信息
int addstudents(student stu[])
{
  int i,j,num=-1; char name[20],sex[3]; float score;
  while(num){
    printf("请输入你要添加的学生信息(学号输入0退出添加过程):\n");
    printf("学号(输入0退出):");
    scanf("%d",&num); 		//读取键盘数据
    if (num==0) break;		//如果键盘输入0则退出while循环
    printf("姓名:"); fflush(stdin);  //fflush(stdin) 清空输入缓冲区
    scanf("%s",name);		//读取键盘数据
    printf("性别(男或女):"); fflush(stdin);
    scanf("%s",sex);		//读取键盘数据
    printf("成绩:");
    scanf("%f",&score);		//读取键盘数据
    // 判断键盘输入的学号,选择插入数据的位置
    if (num>0) {
       if (stu[N-1].num!=0 && stu[N-1].num<num){ // 输入比所有学生学号大的新学生,约定替换放置在最后
          stu[N-1].num=num; strcpy(stu[N-1].name,name); stu[N-1].sex=(strcmp(sex,"男")==0?'M':'F'); stu[N-1].score=score; continue;
       }
       for(i=0;i<N;i++)
       {
    	  if (stu[i].num==0){ // 找到可放置位置
             stu[i].num=num; strcpy(stu[i].name,name); stu[i].sex=(strcmp(sex,"男")==0?'M':'F'); stu[i].score=score;
             if (i+1<N) stu[i+1].num=0; // stu[i+1].num有可能为非0
             break;
          }
          if(stu[i].num==num){ // 修改的功效
             strcpy(stu[i].name,name); stu[i].sex=(strcmp(sex,"男")==0?'M':'F'); stu[i].score=score;break;
          }
          if(stu[i].num>num){  // 找到可放置位置i
             if (stu[N-1].num>0) printf("班级学生人数超过 %d 位,新增后会移除最后一位学生。\n",N);
             for (j=N-1;j>=i+1;j--) stu[j]=stu[j-1]; // stu[i]后逐个后移
             stu[i].num=num; strcpy(stu[i].name,name); stu[i].sex=(strcmp(sex,"男")==0?'M':'F'); stu[i].score=score;break;
          }
       }
    }
  }
  printf("添加后,现在该班全部学生信息如下:\n\n");
  printf("学号             姓名     性别   课程成绩\n");
  for(i=0;i<N &&stu[i].num;i++)
    printf("%4d %20s %3s %9.2f\n", stu[i].num, stu[i].name, stu[i].sex=='M'?"男":"女", stu[i].score);
  return 0;
}
//删除学生信息
int deletestudents(student stu[])
{
  int i,j,num=-1;
  while(num){
    printf("请输入你要删除的学生学号(学号输入0退出删除过程):\n");
    printf("学号(输入0退出):");fflush(stdin);
    scanf("%d",&num);		//读取键盘数据
    if (num==0) break;		//如果键盘输入0则退出while循环
    if (num>0) {
      for(i=0;i<N;i++)
      {
    	if(stu[i].num==num){
          for (j=i;j<N-1;j++) stu[j]=stu[j+1];// 删除stu[i],后面逐个前移一位
          if (stu[N-1].num!=0) stu[N-1].num=0;// 前移后最后一个学号置0,表示是空了
          break;
        }
      }
      if (i==N) printf("没有找到学号:%d 的学生,请再试。\n",num);
    }
  }
  printf("删除后,现在该班全部学生信息如下:\n\n");
  printf("学号             姓名     性别   课程成绩\n");
  for(i=0;i<N &&stu[i].num;i++)
    printf("%4d %20s %3s %9.2f\n", stu[i].num, stu[i].name, stu[i].sex=='M'?"男":"女", stu[i].score);
  return 0;
}
//修改学号对应的学生信息
int modifystudents(student stu[])
{
  int i,num=-1; char name[20],sex[3]; float score;
  while(num){
    printf("请输入你要修改的学生信息(学号输入0退出修改过程):\n");
    printf("学号(输入0退出):");
    scanf("%d",&num); 		//读取键盘数据
    if (num==0) break;		//如果键盘输入0则退出while循环
    printf("姓名:"); fflush(stdin);
    scanf("%s",name);		//读取键盘数据
    printf("性别(男或女):"); fflush(stdin);
    scanf("%s",sex);		//读取键盘数据
    printf("成绩:");
    scanf("%f",&score);		//读取键盘数据
    if (num>0) {
      for(i=0;i<N;i++)
      {
        if(stu[i].num==num){ // 找到后逐个成员修改
          strcpy(stu[i].name,name); stu[i].sex=(strcmp(sex,"男")==0?'M':'F'); stu[i].score=score;break;
        }
      }
      if (i==N) { printf("没有你要修改的学号:%d 的学生,请再试。\n",num); break; }
    }
  }
  printf("修改后,现在该班全部学生信息如下:\n\n");
  printf("学号             姓名     性别   课程成绩\n");
  for(i=0;i<N &&stu[i].num;i++)
    printf("%4d %20s %3s %9.2f\n", stu[i].num, stu[i].name, stu[i].sex=='M'?"男":"女", stu[i].score);
  return 0;
}
//列出所有学生信息
int listall(student stu[])
{
  int i;
  printf("该班全部学生信息如下:\n\n");
  printf("学号             姓名     性别   课程成绩\n");
  for(i=0;i<N;i++){
  	if(stu[i].num>0)
  		printf("%4d %20s %3s %9.2f\n", stu[i].num, stu[i].name, stu[i].sex=='M'?"男":"女", stu[i].score);
	  }
  return 0;
}
//寻找指定的学生数据
int findastudent(student stu[])
{
  int i,xh=-1;
  while(xh){
     printf("请输入你要查找的学生学号(输入0退出查询):");
     scanf("%d",&xh);		//读取键盘数据
     if (xh) {
       for(i=0;i<N;i++)
       {
         if(stu[i].num==xh){
           printf("该学生学号为:%d 的学生,姓名为:%s,性别为:%s,课程成绩为:%f\n",stu[i].num, stu[i].name, stu[i].sex=='M'?"男":"女", stu[i].score);
           break;
         }
       }
       if (i==N) printf("没有找到学号:%d 的学生,请再试。\n",xh);
     }
  }
  return 0;
}
//保存数据到文件
int savetofile(student stu[])
{
  FILE *fp; int i;
  if((fp=fopen("students","wb+"))==NULL)
  { printf("Cannot open file strike any key return!\n"); getchar(); return 1; }
  for(i=0;i<N;i++){
    fprintf(fp,"%d %s %c %f\n",stu[i].num, stu[i].name, stu[i].sex, stu[i].score);
    // fwrite(&stu[i],sizeof(struct student),1,fp); //上句改本句,改为数据块写方式
    if(stu[i].num==0) break;  // 后面学号为0,可退出循环
  }
  fclose(fp); return 0;
}
//从文件中读取数据
int readfromfile(student stu[])
{
  FILE *fp; int i;
  if((fp=fopen("students","rb+"))==NULL)
  { printf("Cannot open file strike any key return!\n"); getchar(); return 1; }
  printf("学号             姓名     性别   课程成绩\n");
  for(i=0;!feof(fp)&&i<N;i++){
    fscanf(fp,"%d%s %c%f", &stu[i].num, stu[i].name, &stu[i].sex, &stu[i].score);
    // fread(&stu[i],sizeof(student),1,fp); //上句改本句,改为数据块读方式
    if (stu[i].num!=0) printf("%4d %20s %3s %9.2f\n", stu[i].num, stu[i].name, stu[i].sex=='M'?"男":"女", stu[i].score);
    else break; // 若读到学号为0,后面不读了
  }
  fclose(fp); return 0;
}
//对学号进行排序
int sortnum(student stu[])
{
	int i,j;
	student ad;
	for(i=0;i<N-1;i++)
	{
		for(j=i+1;j<N;j++)
		{
			if(stu[j].num<stu[i].num)
			{
				ad=stu[i];
				stu[i]=stu[j];
				stu[j]=ad;
			}
		}
	}
	 printf("该班学生按学号信息排序如下:\n\n");
  	printf("学号             姓名     性别   课程成绩\n");
  	for(i=0;i<N;i++){
  		if(stu[i].num>0)
  			printf("%4d %20s %3s %9.2f\n", stu[i].num, stu[i].name, stu[i].sex=='M'?"男":"女", stu[i].score);
	  }
  return 0;
} 
//对分数进行排序
int sortscore(student stu[])
{
	int i,j;
	student ad;
	for(i=0;i<N-1;i++)
	{
		for(j=i+1;j<N;j++)
		{
			if(stu[j].score>stu[i].score)
			{
				ad=stu[i];
				stu[i]=stu[j];
				stu[j]=ad;
			}
		}
	}
	printf("该班全部学生信息如下:\n\n");
  	printf("学号             姓名     性别   课程成绩\n");
  	for(i=0;i<N;i++){
  		if(stu[i].num>0)
  			printf("%4d %20s %3s %9.2f\n", stu[i].num, stu[i].name, stu[i].sex=='M'?"男":"女", stu[i].score);
	  }
  return 0;
} 
//

//输出成绩排名前三名的同学
int Topthree(student stu[])
{
	int i,j;
	int k=0;
	student ad;
	for(i=0;i<N-1;i++)
	{
		for(j=i+1;j<N;j++)
		{
			if(stu[j].score>stu[i].score)
			{
				ad=stu[i];
				stu[i]=stu[j];
				stu[j]=ad;
			}
		}
	}
	printf("该班成绩排名前三名的学生信息如下:\n\n");
  	printf("排名    学号            姓名     性别   课程成绩\n");
  	for(i=0;i<N&&stu[i].num;i++){
  		//printf("i=%d,k=%d\n", i,k);
  		
	  	if(stu[i].score == stu[i-1].score){printf("%4d %6d %17s %6s %9.2f\n", k, stu[i].num, stu[i].name, stu[i].sex=='M'?"男":"女", stu[i].score);}
	  	else{
		  	if(k>=2) break;
			printf("%4d %6d %17s %6s %9.2f\n", i+1, stu[i].num, stu[i].name, stu[i].sex=='M'?"男":"女", stu[i].score);
			k=i+1;}
		
  		}
}
//查询排名
int scorerank(student stu[])
{
	int i,j;
	int k=0;
	student ad;
	for(i=0;i<N-1;i++)
	{
		for(j=i+1;j<N;j++)
		{
			if(stu[j].score>stu[i].score)
			{
				ad=stu[i];
				stu[i]=stu[j];
				stu[j]=ad;
			}
		}
	}
	float soc=-1;
	while(soc){
	 printf("请输入你要查找的成绩(输入0退出查询):");
     scanf("%f",&soc);		//读取键盘数据
	 if (soc>0) {
       for(i=0;i<N;i++)
       {
        	if(stu[i].score==soc){if(stu[i].score == stu[i-1].score){printf("成绩为%.2f的排名是:%d\n",soc,k);}
	  		else{printf("成绩为%.2f的排名是:%d\n",soc,i+1);k=i+1;break;}}
//	  		else{printf("成绩为%.2f的排名是:%d\n",soc,i+1);k=i+1;}break;
       }
       if (i==N) printf("没有找到成绩:%.2f 的学生,请再试。\n",soc);
     }
  }
  return 0;
}

//程序入口:main函数
int main(void)
{
  char cmd,buffer[80];
  readfromfile(stu); // 进入系统先从文件中读
  for(;;){
     printf("\n         简易学生信息管理子系统\n");
     printf("Please select one function to execute:\n");
     printf("  0--exit.\n");
     printf("  1--显示学生信息    5--按学号查找学生 \n");
     printf("  2--添加学生信息    6--学生成绩统计   \n");
     printf("  3--删除学生信息    7--从文件读取信息 \n");
     printf("  4--修改学生信息    8--保存信息到文件 \n");
     printf("  a--根据学号排序    b--根据分数排序   \n");
	 printf("  c--输出成绩排名    d--查询成绩排名   \n"); 
     cmd='0';
     scanf("%c",&cmd);		//读取键盘数据
     if (cmd=='0') {savetofile(stu); printf("程序结束!"); exit(0);} // 退出系统前保存到文件
     if (cmd=='1') listall(stu);
     if (cmd=='2') addstudents(stu);
     if (cmd=='3') deletestudents(stu);
     if (cmd=='4') modifystudents(stu);
     if (cmd=='5') findastudent(stu);
     if (cmd=='6') totalscore(stu);
     if (cmd=='7') readfromfile(stu);
     if (cmd=='8') savetofile(stu);
     if (cmd=='a') sortnum(stu); 
     if (cmd=='b') sortscore(stu);
	 if (cmd=='c') Topthree(stu); 
	 if (cmd=='d') scorerank(stu); 
     printf("Press any key to continue!");
     getchar();				//让程序处于等待输入状态
     fgets(buffer,80,stdin);	//80为size
  }
  printf("程序结束!");
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值