1.题目与要求

1.1问题提出

设计学生成绩管理系统,有N个学生,每个学生的数据包含学号(不重复)、姓名、三门课的成绩及平均成绩,试设计一学生成绩管理系统

1.2本系统涉及的知识点

结构体数组、结构体指针、数组、循环、函数、分支、指针

1.3 功能要求

1、成绩录入:输入学生的学号、姓名及三门课的成绩;

2、成绩查询:(至少一种查询方式)。按学号查询学生记录,或查询不及格学生的记录;

3、成绩统计:计算学生的平均分;根据学生的平均分高低,对学生的数据进行排序后输出;对学生单科成绩排序,输出学生姓名与该科成绩;

4、退出系统:退出整个系统(即主菜单);

1.4 根据所选菜单编写相应代码:

1)输入学生的信息,利用循环赋值的方式,给结构体数组赋值。

2)输出平均分函数ave:首先定义double型数组,利用循环赋值的方式,计算出三门课的成绩的平均值放入数组中,利用循环的方式,输出相关值及平均值。

3)按学号查询成绩函数search:首先输入要查询的学号,与结构体中的学号进行比较,如果相等输出这个学生的信息,另外输出没有查到相关结果。

4)按平均分排序后输出函数average:首先另外一个定义结构体数组、结构体指针变量,计算三门课程的平均值存到结构体成员aver中,利用循环的方式,进行平均分排序,输出相应的学生信息。

5)对学生单科成绩排序后输出函数grade:首先另外一个定义结构体数组、结构体指针变量,通过选择k的值来选择按分数几排序,利用循环的方式,进行单科成绩排序(从大到小),输出学生姓名及该课的成绩。

6)退出程序。




java输入学生姓名和成绩进行排序 java学生成绩按姓名排序_赋值


2、附录:程序清单

#include <stdio.h>
 #include<stdlib.h>
 typedef struct student
 {
 int num;
 char name[13];
 int score[3];
 double aver;
 }STU;
 void ave(STU s[],int n)
 { double a[1000];
 int i;
 for(i=0;i<n;i++)
 a[i]=(s[i].score[0]+s[i].score[1]+s[i].score[2])/3.0;
 printf("学号t姓名tt分数1t分数2t分数3t平均分n"); 
 for(i=0;i<n;i++)
 printf("%dt%stt%dt%dt%dt%.1fn",s[i].num,s[i].name,s[i].score[0],s[i].score[1],s[i].score[2],a[i]);
 }
 void search(STU s[],int n, int a) 
 {
 int i,k=0;
 for(i=0;i<n;i++)
 {
 if(s[i].num==a)
 { printf("学号t姓名t分数1t分数2t分数3tn");
 printf("%dt%st%dt%dt%dn",s[i].num,s[i].name,s[i].score[0],s[i].score[1],s[i].score[2]);
 k=k+1;
 break;
 }
 }
 if(k==0)
 printf("t没有查询到相关信息"); 
 }
 void average(STU s[],int n)
 { int i,j;
 STU ss[10000];
 STU *p=ss;
 for(i=0;i<n;i++)
 s[i].aver=(s[i].score[0]+s[i].score[1]+s[i].score[2])/3.0;
 for(i=0;i<n;i++)
 ss[i]=s[i];
 for(i=0;i<n-1;i++)
 {
 for(j=i+1;j<n;j++)
 {
 if(ss[i].aver<ss[j].aver)
 {
 STU temp=*(p+i);
 *(p+i)=*(p+j);
 *(p+j)=temp;
 }
 }
 }
 printf("学号t姓名t平均分n");
 for(i=0;i<n;i++)
 printf("%dt%st%.1fn",(p+i)->num,(p+i)->name,(p+i)->aver);
 }
 void grade(STU s[],int n)
 {int i,j,k;
 STU ss[10000];
 STU *p=ss;
 for(i=0;i<n;i++)
 ss[i]=s[i];
 printf("请输入k的值查询,k=0时按分数1,k=1时按分数2,k=2时按分数3:");
 scanf("%d",&k);
 for(i=0;i<n-1;i++)
 {
 for(j=i+1;j<n;j++)
 {
 if(ss[i].score[k]<ss[j].score[k])
 {
 STU temp=*(p+i);
 *(p+i)=*(p+j);
 *(p+j)=temp;
 }
 }
 }
 printf("姓名t分数n"); 
 for(i=0;i<n;i++)
 printf("%st%dn",(p+i)->name,(p+i)->score[k]);
 }
 main()
 { int N,i;
 STU s[10000];
 int num1; 
 int menu;
 printf("请输入学生个数:");
 scanf("%d",&N);
 for(i=0;i<N;i++)
 {
 printf("请输入学号 姓名 分数1 分数2 分数3n");
 scanf("%d%s%d%d%d",&s[i].num,s[i].name,&s[i].score[0],&s[i].score[1],&s[i].score[2]); 
 }
 printf("nn");
 printf("*************学生成绩管理系统*************nn");
 printf("1--------输出平均分n");
 printf("2--------按学号查询成绩n");
 printf("3--------按平均分排序后输出n");
 printf("4--------对学生单科成绩排序后输出n");
 printf("5--------退出程序n");
 printf("nn");
 while(1)
 {
 printf("n请输入菜单号:");
 scanf("%d",&menu);
 switch(menu)
 {
 case 1: ave(s,N);break;
 case 2: printf("请输入要查询的学号:");
 scanf("%d",&num1);
 search(s,N,num1);
 break;
 case 3: average(s,N);break;
 case 4: grade(s,N);break;
 case 5: exit(0);
 default:
 printf("菜单号输入错误n");
 break;
 }
 }
 }

3、运行过程


java输入学生姓名和成绩进行排序 java学生成绩按姓名排序_赋值_02


java输入学生姓名和成绩进行排序 java学生成绩按姓名排序_结构体数组_03


java输入学生姓名和成绩进行排序 java学生成绩按姓名排序_结构体数组_04


java输入学生姓名和成绩进行排序 java学生成绩按姓名排序_赋值_05


java输入学生姓名和成绩进行排序 java学生成绩按姓名排序_赋值_06


java输入学生姓名和成绩进行排序 java学生成绩按姓名排序_结构体数组_07