学生成绩管理系统

学生成绩管理系统,通过两个链表,分别代表学生和班级的链表
班级的链表作为学生链表的头
可以输入成绩,学生成绩有数学,语文,和英语,找出学生成绩总分的最高分和最低分,并求出平均成绩

首先定义两个结构体,一个表示班级的结构体,一个表示为学生的结构体

//学生结构体
typedef struct Student                  
{
    int xueHao;
    int yuWen;
    int shuXue;
    int yingYu;
    int zongFen;
    float average;
    struct Student *next;
}STU,*PSTU;
//班级结构体
typedef struct Class                 
{
  int banJiZongShu;
  int xueShengShu;
  struct Student *stu;//指向学生结构体
  struct Class *next;
}CLA,*PCLA;

在班级结构体定义一个指针,指向学生结构体,这样就可以通过班级结构体进行学生的信息输入,改变

int panDuanFenShu(int fenShu)//判断输入成绩是否输入错误
{
   while(1){
   if(fenShu<0 || fenShu>150){
      printf("输入错误,请重新输入\n");
      scanf("%d",&fenShu);
   }else{
    return fenShu;
     }
   }
}

PSTU chuangJianStudent(PSTU stuHead,int banJiShu,int i)
{
      PSTU p=NULL;
      PSTU newNode;
      
      //初始化学生结构体的内容
      newNode=(PSTU)malloc(sizeof(STU));
      newNode->next=NULL;
      newNode->xueHao=i;
      
      printf("请输入%d班学号%d的学生信息:\n",banJiShu,i);
      printf("请输入学号%d学生的语文成绩\n",i);
      scanf("%d",&newNode->yuWen);
      newNode->yuWen=panDuanFenShu(newNode->yuWen);
      
      printf("请输入学号%d学生的数学成绩\n",i);
      scanf("%d",&newNode->shuXue); 
      newNode->shuXue=panDuanFenShu(newNode->shuXue);
      
      printf("请输入学号%d学生的英语成绩\n",i);
      scanf("%d",&newNode->yingYu);
      newNode->yingYu=panDuanFenShu(newNode->yingYu);
      
	  newNode->zongFen=(newNode->yuWen)+(newNode->shuXue)+(newNode->yingYu);
      
      newNode->average=(float)newNode->zongFen/3;
      //使用尾插法创建新的学生节点
	  if(stuHead==NULL){
        stuHead=newNode;
        return stuHead;
      }else{
       p=stuHead;
       while(p->next!=NULL){
          p=p->next;
          }
      p->next=newNode;
       return stuHead;
      }
}
      
PSTU inItStudentNode(int banJiShu,int renShu)
{
    
    int i;
    PSTU stuHead=NULL;
    

    for(i=1;i<=renShu;i++){
        stuHead=chuangJianStudent(stuHead,banJiShu,i);
    }
    return stuHead;
}

第一个函数去判断学生的成绩是否输入错误,如果输入错误就重新输入,直到输入正确为止
第二个函数是录入学生的信息,并通过尾插法的方式把一个班的学生连起来,数学,语文,英语的成绩,
第三个函数是生成几个学生,把学生通过第二个函数用尾插法连接起来。

PCLA chuangJianClass(PCLA claHead,int banJiShu,int banJiZongShu)
{
      PCLA p1;
      PCLA newNode1;
      int renShu;//定义一个人的个数的变量
      printf("请输入%d班学生的人数:",banJiShu);
      scanf("%d",&renShu);
      //初始化班级结构体的内容
      newNode1=(PCLA)malloc(sizeof(CLA));
      newNode1->next=NULL;
      newNode1->xueShengShu=renShu;
      newNode1->stu=inItStudentNode(banJiShu,renShu);
      newNode1->banJiZongShu=banJiZongShu;
      
	  //使用尾插法创建班级
	  if(claHead==NULL){
        claHead=newNode1;
        return claHead;
      }else{
       p1=claHead;
       while(p1->next!=NULL){
          p1=p1->next;
          }
      p1->next=newNode1;
       return claHead;
      }


}

PCLA inItClassNode()
{
       
       int i;
       int banJiZongShu;
       printf("请输入班级的数量:");
       scanf("%d",&banJiZongShu);
       PCLA claHead=NULL;
       for(i=1;i<=banJiZongShu;i++){
             claHead=chuangJianClass(claHead,i,banJiZongShu);//把当前班级数和班级的总数传过去 
       }
      return claHead;
}

创建班级结构体,通过套娃的方式把这些东西套起来,在对班级结构体进行初始化的时候,使用创建学生的函数

newNode1->stu=inItStudentNode(banJiShu,renShu);

把班和学生联系起来。

打印函数和主函数

void xianShi1(PCLA claHead)
{
   PSTU p1=NULL;
   PCLA p2=NULL;
   p2=claHead;
   int i=0;
   float average1=0;
   int zongJi=0;
   PSTU max=NULL;
   PSTU min=NULL;
   int banJiMax=1; 
   int banJiMin=1; 
   int xueShengZongShu=0;
   max=p2->stu;//给最高分的学生结构体赋初值
   min=max;
   while(p2!=NULL){
       p1=p2->stu;
       ++i;
       xueShengZongShu+=p2->xueShengShu;
       while(p1!=NULL){
           printf("%d班第%d位同学成绩:",i,p1->xueHao);
		   printf("语文%d  数学%d  英语%d  总分%d  平均分%f\n",p1->yuWen,p1->shuXue,p1->yingYu,p1->zongFen,p1->average);
           
           if(max->zongFen < p1->zongFen){
              max=p1;
              banJiMax=i;
           }
           
           if(min->zongFen > p1->zongFen){
              min=p1;
              banJiMin=i;
           }
           zongJi+=p1->zongFen;//对全年级的总分进行取总
           p1=p1->next;
           
           
       }
       p2=p2->next; 
       average1=(float)zongJi/xueShengZongShu;//算出全年级学生的平均总成绩
  }
  printf("最高分%d,是%d班学号%d的学生\n",max->zongFen,banJiMax,max->xueHao);
  printf("最低分%d,是%d班学号%d的学生\n",min->zongFen,banJiMin,min->xueHao);
  printf("全年级的平均总分是%f\n",average1);
}

int main()
{
    
    PCLA claHead=NULL;
	claHead=inItClassNode();
    
    xianShi1(claHead);
    
	system("pause");
	return 0;
}

同时还可以去创建学校的结构体,进行操作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值