标题:用冒泡排序把几位学生的某一门课程成绩按升序输出,编译的没问题,为什么排 ...
只看楼主
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
结帖率:95.37%
已结贴  问题点数:20 回复次数:5 
用冒泡排序把几位学生的某一门课程成绩按升序输出,编译的没问题,为什么排序不了?请各位指教
#include<stdio.h>
#define n 2  //定义人数
#define c 3   //定义课程门数
void course_ascending(struct student *p);
struct student
{
    char name[10];
    int stu_id;        
    int score[c];
    char sex;
    int age;
}a[n];

int main()
{
    struct student *p;
    p=a;
    for(int i=0;i<n;i++)
    {
        printf("第%d个学生的信息为\n",i+1);
        
        printf("请输入姓名:");
        scanf("%s",&(*p).name);
      
        printf("请输入学号:");
        scanf("%d",&(*p).stu_id);
        
        printf("请输入成绩:");
        for(int j=0;j<c;j++)
            scanf("%d",&(*p).score[j]);
        getchar();
      
        printf("请输入性别:");
        scanf("%c",&(*p).sex);
        getchar();
        
        printf("请输入年龄:");
        scanf("%d",&(*p).age);   
        p++;   
    }
int xuanze;
    printf("菜单:\n\
            0 退出 :\n\
            9 把某门课的成绩按升序排列:\n");
    printf("请输入你的选择:0-1:");
    scanf("%d",&xuanze);
    switch(xuanze)
    {
      case 0:return 0;
      case  1:course_ascending(p);break;
      default:printf("enter date error!:\n");   
    }
    return 0;
}

void course_ascending(struct student *p)
{
    int course;
    int max;
    printf("请输入你要按升序排列的课程号:\n");
    scanf("%d",&course);
    for(int j=0;j<n-1;j++)
    {
        for(int i=0;i<n-1-j;i++)
        {
            if((*(p+i)).score[course]>(*(p+i+1)).score[course])
            {
                max=(*(p+i)).score[course];
                (*(p+i)).score[course]=(*(p+i+1)).score[course];
                (*(p+i+1)).score[course]=max;
               
            }
        }
    }
    printf("第%d门课程排序后的成绩为:\n",course);
    for(int i=0;i<n;i++)
       printf("%d",(*(p+i)).score[course]);
}
搜索更多相关主题的帖子: include 课程 信息 姓名 
2017-05-17 21:04
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
得分:0 
  就是这种情况 正确的应该是  2  5
2017-05-17 21:21
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
得分:10 
我直接给修改部分代码,注释里说的很清楚了,自己查看消化。

....
int xuanze;
    printf("菜单:\n\
            0 退出 :\n\
            9 把某门课的成绩按升序排列:\n");
    printf("请输入你的选择:0-1:");
    scanf("%d",&xuanze);
    switch(xuanze)
    {
      case 0:return 0;
      case  1:course_ascending(a);break;   //这里必须使用数组a,不能用p,你前面输入时让p++了,不再是数组首地址
      default:printf("enter date error!:\n");   
    }
    return 0;
}

void course_ascending(struct student *p)
{
    int course;
    int max;
    printf("请输入你要按升序排列的课程号:\n");
    scanf("%d",&course);
    course--;  //这里让课程号减1,因为数组是从0开始计数的
    for(int j=0;j<n-1;j++)
    {
        for(int i=0;i<n-1-j;i++)
        {
            if((*(p+i)).score[course]>(*(p+i+1)).score[course])
            {
                max=(*(p+i)).score[course];
                (*(p+i)).score[course]=(*(p+i+1)).score[course];
                (*(p+i+1)).score[course]=max;
               
            }
        }
    }
    printf("第%d门课程排序后的成绩为:\n",course);
    for(int i=0;i<n;i++)
       printf("%d  ",(*(p+i)).score[course]);
}
2017-05-17 22:13
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
得分:0 
回复 3楼 xzlxzlxzl
恩 理解了 谢了
2017-05-17 22:27
Emotiona
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:311
专家分:581
注 册:2017-3-7
得分:10 
p地址变了再复制一下,又可以用
2017-05-18 01:20
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
得分:0 
回复 5楼 Emotiona
???
2017-05-18 14:40



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-477076-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.069533 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved