中二病重度

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

问题描述:建立一个简单的学生成绩表,要求能够完成学生成绩的录入,总成绩的计算,学生成绩的查询,学生成绩表的排序

算法分析:

  创建一个线性表来储存学生成绩,每个学生成绩信息作为一个数据元素

  确立线性表的长度,录入学生信息

  通过学号对学生信息进行查询,遍历学号,如果没有找到提示输入信息出错

  排时,先确立对那个科目进行排序,基本方法:冒泡排序法,通过交换相邻元素的位置将较低成绩的数据元素前移

具体代码如下:

STEP1:完成数据元素和线性表的定义

注意:对学号用的是字符串的数组的定义,方便之后的字符串的比较(查找算法时)

//定义结构体类型
typedef struct {
    char no[10];        //学号
    char name[10];
    int score[5];
    int totol;      //总成绩
}student;

typedef struct{
    student stu[MAXSIZE];
    int len;    //线性表的实际长度
}SqList;

STEP2:完成数据的输入

用到了结构体数组中,及数据元素中的数组(score[])输入使用两重for循环完成

void creat(SqList &L,int &n){
    printf("请输入学生的人数:\n");
    scanf("%d",&n);
    L.len=n;
    printf("输入学生的学号,姓名,数学,英语,政治,专业课1,专业课2成绩\n");
    for(int i=0;i<n;i++){
        scanf("%s",&L.stu[i].no);
        scanf("%s",&L.stu[i].name);
        L.stu[i].totol=0;
        for(int j =0;j<5;j++){
            scanf("%d",&L.stu[i].score[j]);
            L.stu[i].totol +=L.stu[i].score[j];
        }
    }
}

STEP3:完成查询算法

注意:用到字符串比较函数strcmp()还有return;的位置,就是找到之后直接结束,如果不加这一句话,在找到元素打印完毕之后,会多出来一句“输入学号有误”

void search_Sq(SqList &L){
    char tno[10];
    int i;
    printf("请输入学生学号\n");
    scanf("%s",&tno);
    for( i = 0; i < L.len; i++){
        if(strcmp(tno,L.stu[i].no)==0){
            printf("查询结果如下:\n");
            printf("%s,%s\n",L.stu[i].name,L.stu[i].no);
            for(int j=0;j<5;j++){
                printf("%d ",L.stu[i].score[j]);
            }
            printf("%d\n",L.stu[i].totol);
            return ;
        }

    }
    if(i = L.len)
        printf("输入学号有误!\n");
}

STEP4:完成排序算法

void sort_Sq(SqList &L,int k){
    int i,j;
    student p;
    if(k>=0 && k <6){
        printf("按照score[%d]进行排序",k);
        for(i=0; j<L.len-1;j++){
            for(j=i;j<L.len-1;j++)
            if(L.stu[i].score[k]>=L.stu[j].score[k]){
                p = L.stu[i];
                L.stu[i]=L.stu[j];
                L.stu[j]= p;
            }
        }
    }
        else{
            printf("按照TOTOL进行升序排列\n");
             for(i=0; j<L.len-1;j++){
            for(j=i;j<L.len-1;j++)
            if(L.stu[i].totol>=L.stu[j].totol){
                p = L.stu[i];
                L.stu[i]=L.stu[j];
                L.stu[j]= p;
            }
        }
    }
    printf("排序后的成绩表如下:\n");
    for(int i=0;i<L.len; i++){
        printf("%s,%s\n",L.stu[i].name,L.stu[i].no);
        for(int j=0; j<5; j++)
            printf("%d ",L.stu[i].score[j]);
        printf("%d\n",L.stu[i].totol);
    }
}

冒泡排序的变量控制i,j还没有完全明白,存疑!!

主函数

int main(){
    SqList l;
    int n,k;
    creat(l,n);
    search_Sq( l);
    printf("将学生成绩按照第几门排序\n");
    scanf("%d",&k);
    sort_Sq(l,k);
}

测试成功 

posted on 2017-10-22 20:57  中二病重度  阅读(1000)  评论(0编辑  收藏  举报