鱼C论坛

 找回密码
 立即注册
查看: 2803|回复: 11

[已解决]这要怎么输出

[复制链接]
发表于 2022-11-6 19:55:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
从键盘输入某班学生某门课程的成绩(每班人数最多不超过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;
    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[i]);
    }while (score[i] >= 0);
    return i;
}

void PrintScore(int score[], int n)
{
    int i;
    for (i=0; i<n; i++)
    {  if (i!=0)  printf(" ");
       printf("%d", score[i]);
    }
    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[j]>score[i])
            {
                temp=score[j];
                score[j]=score[i];
                score[i]=temp;
            }
        }
    }
   
}
最佳答案
2022-11-6 21:47:40
本帖最后由 zhangjinxuan 于 2022-11-6 21:54 编辑

我*,突然好了
  1. void DataSort(int score[],int n)
  2. {
  3.     int i,j,temp;
  4.     for(i=0;i<n-1;i++)
  5.     {   
  6.         int swap = 0;
  7.         //关键代码之一,若一轮下来无交换,swap为0(假),该处先假设swap为0,后面如果发生交换则输出,否则退出
  8.         for(j=0;j<n-i;j++) //这里也要改
  9.         {
  10.             if(score[j] > score[j - 1])
  11.                 //我觉得你用的好像是选择排序,原本的判断条件是score[j]>score[i]
  12.                 //此处应该是score[j] > score[j - 1],这才是冒泡排序
  13.             {
  14.                 temp=score[j]; //这三行也要改动
  15.                 score[j]=score[j - 1];
  16.                 score[j - 1]=temp;
  17.                 swap = 1; //发现了交换,swap = 1(真)
  18.             }
  19.         }
  20.         if (swap) { //关键
  21.                 printf("第 %d 趟 :", i + 1); //输出这一趟是第 i + 1 趟
  22.             int k = 0;
  23.             for (; k < n; ++k) {
  24.                                 printf("%d", score[k]); //输出本趟结果
  25.                                 if (k != n - 1) printf(" ");
  26.             }
  27.             puts(""); //记得换行
  28.         } else return; //否则未发生交换,返回退出
  29.     }
  30.    
  31. }
复制代码

@giegie666
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-11-6 20:13:22 | 显示全部楼层
  1. void DataSort(int score[],int n)
  2. {
  3.     int i,j,temp;
  4.     for(i=0;i<n-1;i++)
  5.     {
  6.         for(j=i+1;j<n;j++)
  7.         {
  8.             if(score[j]>score[i])
  9.             {
  10.                 temp=score[j];
  11.                 score[j]=score[i];
  12.                 score[i]=temp;
  13.             }
  14.             
  15.         }
  16.         if(i) // 在这里做改动
  17.         {
  18.             printf("第%d趟: ", i);
  19.             PrintScore(score, n);
  20.         } // 在这里
  21.     }
  22. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-6 20:20:52 | 显示全部楼层
就是DataSort函数,有较大的问题,代码注释中已经指出,求给最佳
  1. void DataSort(int score[],int n)
  2. {
  3.     int i,j,temp;
  4.     for(i=0;i<n-1;i++)
  5.     {   
  6.                 bool swap = false;
  7.                 //关键代码之一,若一轮下来无交换,swap为false,该处先假设swap为false,后面如果发生交换则输出,否则退出
  8.         for(j=0;j<n-i;j++) //这里也要改
  9.         {
  10.             if(score[j] > score[j - 1])
  11.                                 //我觉得你用的好像是选择排序,原本的判断条件是score[j]>score[i]
  12.                                 //此处应该是score[j] > score[j - 1],这才是冒泡排序
  13.             {
  14.                 temp=score[j]; //这三行也要改动
  15.                 score[j]=score[j - 1];
  16.                 score[j - 1]=temp;
  17.                 swap = true; //发现了交换,swap = true
  18.             }
  19.         }
  20.         if (swap) { //关键
  21.                         printf("第 %d 趟 :", i + 1); //输出这一趟是第 i + 1 趟
  22.                         int k = 0;
  23.                         for (; k < n; ++k) printf("%d ", score[k]); //输出本趟结果
  24.                         puts(""); //记得换行
  25.                 } else return; //否则未发生交换,返回退出
  26.     }
  27.    
  28. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-6 20:31:50 From FishC Mobile | 显示全部楼层
柿子饼同学 发表于 2022-11-6 20:13

输出还是不对啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-6 20:41:52 | 显示全部楼层

嗯 .. 看三楼
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-6 20:55:21 From FishC Mobile | 显示全部楼层
zhangjinxuan 发表于 2022-11-6 20:20
就是DataSort函数,有较大的问题,代码注释中已经指出,求给最佳

运行都是错的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-6 20:56:55 From FishC Mobile | 显示全部楼层
柿子饼同学 发表于 2022-11-6 20:41
嗯 .. 看三楼

你这个输出第几趟的结果全是一样的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-6 21:13:42 | 显示全部楼层

你告诉我这哪儿错了 ,我windows,C90都没错误,你怎么出错的,让我看看
捕获.PNG
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-6 21:22:35 | 显示全部楼层
zhangjinxuan 发表于 2022-11-6 21:13
你告诉我这哪儿错了 ,我windows,C90都没错误,你怎么出错的,让我看看

好像不能用bool
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-6 21:24:26 | 显示全部楼层
本帖最后由 zhangjinxuan 于 2022-11-6 21:27 编辑


改了一下:

  1. void DataSort(int score[],int n)
  2. {
  3.     int i,j,temp;
  4.     for(i=0;i<n-1;i++)
  5.     {   
  6.         int swap = 0;
  7.         //关键代码之一,若一轮下来无交换,swap为0(假),该处先假设swap为0,后面如果一趟结束后发生交换则输出,否则退出
  8.         for(j=0;j<n-i;j++) //这里也要改
  9.         {
  10.             if(score[j] > score[j - 1])
  11.                 //我觉得你用的好像是选择排序,原本的判断条件是score[j]>score[i]
  12.                 //此处应该是score[j] > score[j - 1],这才是冒泡排序
  13.             {
  14.                 temp=score[j]; //这三行也要改动
  15.                 score[j]=score[j - 1];
  16.                 score[j - 1]=temp;
  17.                 swap = 1; //发现了交换,swap = 1(真)
  18.             }
  19.         }
  20.         if (swap) { //关键
  21.                 printf("第 %d 趟 :", i + 1); //输出这一趟是第 i + 1 趟
  22.             int k = 0;
  23.             for (; k < n; ++k) printf("%d ", score[k]); //输出本趟结果
  24.             puts(""); //记得换行
  25.         } else return; //否则未发生交换,返回退出
  26.     }
  27.    
  28. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-6 21:34:49 | 显示全部楼层

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


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

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
zhangjinxuan + 2 + 2 鱼C有你更精彩^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2022-11-6 21:47:40 | 显示全部楼层    本楼为最佳答案   
本帖最后由 zhangjinxuan 于 2022-11-6 21:54 编辑

我*,突然好了
  1. void DataSort(int score[],int n)
  2. {
  3.     int i,j,temp;
  4.     for(i=0;i<n-1;i++)
  5.     {   
  6.         int swap = 0;
  7.         //关键代码之一,若一轮下来无交换,swap为0(假),该处先假设swap为0,后面如果发生交换则输出,否则退出
  8.         for(j=0;j<n-i;j++) //这里也要改
  9.         {
  10.             if(score[j] > score[j - 1])
  11.                 //我觉得你用的好像是选择排序,原本的判断条件是score[j]>score[i]
  12.                 //此处应该是score[j] > score[j - 1],这才是冒泡排序
  13.             {
  14.                 temp=score[j]; //这三行也要改动
  15.                 score[j]=score[j - 1];
  16.                 score[j - 1]=temp;
  17.                 swap = 1; //发现了交换,swap = 1(真)
  18.             }
  19.         }
  20.         if (swap) { //关键
  21.                 printf("第 %d 趟 :", i + 1); //输出这一趟是第 i + 1 趟
  22.             int k = 0;
  23.             for (; k < n; ++k) {
  24.                                 printf("%d", score[k]); //输出本趟结果
  25.                                 if (k != n - 1) printf(" ");
  26.             }
  27.             puts(""); //记得换行
  28.         } else return; //否则未发生交换,返回退出
  29.     }
  30.    
  31. }
复制代码

@giegie666
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-14 19:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表