giegie666 发表于 2022-11-6 19:55:48

这要怎么输出

从键盘输入某班学生某门课程的成绩(每班人数最多不超过40人),当输入为负值时,表示输入结束。本题要求实现用冒泡排序法将分数从高到低排序(并输出每趟排序结果)的函数。

输入样例:
64 85 73 99 92 -1
输出样例:
n=5
第1趟:85 73 99 92 64
第2趟:85 99 92 73 64
第3趟:99 92 85 73 64
After sort: 99 92 85 73 64

#include <stdio.h>
#define N 40
int ReadScore(int score[]);
void DataSort(int score[], int n);
void PrintScore(int score[], int n);
int main()
{
    int score, n;
    n = ReadScore(score);
    printf("n=%d\n", n);
    if(n)
    { DataSort(score, n);
      printf("After sort: ");
      PrintScore(score, n);
    }
    return 0;
}

/* 请在这里填写答案 */

int ReadScore(int score[])
{
    int i = -1;
    do{
      i++;
      scanf("%d", &score);
    }while (score >= 0);
    return i;
}

void PrintScore(int score[], int n)
{
    int i;
    for (i=0; i<n; i++)
    {if (i!=0)printf(" ");
       printf("%d", score);
    }
    printf("\n");
}



void DataSort(int score[],int n)
{
    int i,j,temp;
    for(i=0;i<n-1;i++)
    {
      for(j=i+1;j<n;j++)
      {
            if(score>score)
            {
                temp=score;
                score=score;
                score=temp;
            }
      }
    }
   
}

柿子饼同学 发表于 2022-11-6 20:13:22

void DataSort(int score[],int n)
{
    int i,j,temp;
    for(i=0;i<n-1;i++)
    {
      for(j=i+1;j<n;j++)
      {
            if(score>score)
            {
                temp=score;
                score=score;
                score=temp;
            }
            
      }
      if(i) // 在这里做改动
      {
            printf("第%d趟: ", i);
            PrintScore(score, n);
      } // 在这里
    }
}

zhangjinxuan 发表于 2022-11-6 20:20:52

就是DataSort函数,有较大的问题,代码注释中已经指出,求给最佳{:10_254:}
void DataSort(int score[],int n)
{
    int i,j,temp;
    for(i=0;i<n-1;i++)
    {   
                bool swap = false;
                //关键代码之一,若一轮下来无交换,swap为false,该处先假设swap为false,后面如果发生交换则输出,否则退出
      for(j=0;j<n-i;j++) //这里也要改
      {
            if(score > score)
                                //我觉得你用的好像是选择排序,原本的判断条件是score>score
                                //此处应该是score > score,这才是冒泡排序
            {
                temp=score; //这三行也要改动
                score=score;
                score=temp;
                swap = true; //发现了交换,swap = true
            }
      }
      if (swap) { //关键
                        printf("第 %d 趟 :", i + 1); //输出这一趟是第 i + 1 趟
                        int k = 0;
                        for (; k < n; ++k) printf("%d ", score); //输出本趟结果
                        puts(""); //记得换行
                } else return; //否则未发生交换,返回退出
    }
   
}

giegie666 发表于 2022-11-6 20:31:50

柿子饼同学 发表于 2022-11-6 20:13


输出还是不对啊

柿子饼同学 发表于 2022-11-6 20:41:52

giegie666 发表于 2022-11-6 20:31
输出还是不对啊

嗯 .. 看三楼

giegie666 发表于 2022-11-6 20:55:21

zhangjinxuan 发表于 2022-11-6 20:20
就是DataSort函数,有较大的问题,代码注释中已经指出,求给最佳

运行都是错的{:10_266:}

giegie666 发表于 2022-11-6 20:56:55

柿子饼同学 发表于 2022-11-6 20:41
嗯 .. 看三楼

你这个输出第几趟的结果全是一样的

zhangjinxuan 发表于 2022-11-6 21:13:42

giegie666 发表于 2022-11-6 20:55
运行都是错的

你告诉我这哪儿错了{:10_277:} ,我windows,C90都没错误,你怎么出错的,让我看看{:10_277:}

giegie666 发表于 2022-11-6 21:22:35

zhangjinxuan 发表于 2022-11-6 21:13
你告诉我这哪儿错了 ,我windows,C90都没错误,你怎么出错的,让我看看

好像不能用bool

zhangjinxuan 发表于 2022-11-6 21:24:26

本帖最后由 zhangjinxuan 于 2022-11-6 21:27 编辑

giegie666 发表于 2022-11-6 21:22
好像不能用bool

改了一下:
void DataSort(int score[],int n)
{
    int i,j,temp;
    for(i=0;i<n-1;i++)
    {   
      int swap = 0;
      //关键代码之一,若一轮下来无交换,swap为0(假),该处先假设swap为0,后面如果一趟结束后发生交换则输出,否则退出
      for(j=0;j<n-i;j++) //这里也要改
      {
            if(score > score)
                //我觉得你用的好像是选择排序,原本的判断条件是score>score
                //此处应该是score > score,这才是冒泡排序
            {
                temp=score; //这三行也要改动
                score=score;
                score=temp;
                swap = 1; //发现了交换,swap = 1(真)
            }
      }
      if (swap) { //关键
              printf("第 %d 趟 :", i + 1); //输出这一趟是第 i + 1 趟
            int k = 0;
            for (; k < n; ++k) printf("%d ", score); //输出本趟结果
            puts(""); //记得换行
      } else return; //否则未发生交换,返回退出
    }
   
}

giegie666 发表于 2022-11-6 21:34:49

zhangjinxuan 发表于 2022-11-6 21:24
改了一下:

if (swap) { //关键
                printf("第%d趟:", i + 1); //输出这一趟是第 i + 1 趟
            int k = 0;
            for (; k < n; ++k)
                printf("%d ", score); //输出本趟结果
            printf("\n"); //记得换行
      } else return;


第1趟:85 73 99 92 64 __这里有个空格{:10_250:}

zhangjinxuan 发表于 2022-11-6 21:47:40

本帖最后由 zhangjinxuan 于 2022-11-6 21:54 编辑

我*,突然好了{:10_250:}
void DataSort(int score[],int n)
{
    int i,j,temp;
    for(i=0;i<n-1;i++)
    {   
      int swap = 0;
      //关键代码之一,若一轮下来无交换,swap为0(假),该处先假设swap为0,后面如果发生交换则输出,否则退出
      for(j=0;j<n-i;j++) //这里也要改
      {
            if(score > score)
                //我觉得你用的好像是选择排序,原本的判断条件是score>score
                //此处应该是score > score,这才是冒泡排序
            {
                temp=score; //这三行也要改动
                score=score;
                score=temp;
                swap = 1; //发现了交换,swap = 1(真)
            }
      }
      if (swap) { //关键
                printf("第 %d 趟 :", i + 1); //输出这一趟是第 i + 1 趟
            int k = 0;
            for (; k < n; ++k) {
                              printf("%d", score); //输出本趟结果
                              if (k != n - 1) printf(" ");
            }
            puts(""); //记得换行
      } else return; //否则未发生交换,返回退出
    }
   
}
@giegie666
页: [1]
查看完整版本: 这要怎么输出