航电oj水题2000:记录ascll码排序,用冒泡算法实现,并且记录一些小细节错误

1、我应该认为定义好数组的下标就是整个数组的长度,比如a[1]就代表他就只有一个元素,而不是两个   char name[3];这意味着3个元素

2、用整个直接除以数组的首地址位置就能够得到所有元素个数,当然如果你自己输入的就得不到

strlen(name)/name[0]==》这个得到的是整个数组中所有字符的个数

3、冒泡排序第二个循环是在相邻元素之间进行交换,而不是跟第一个循环牵扯到什么关系

错误示范: store = name[i];
                name[k] = name[i];
                name[i] = store;
                flag =true;

4、这篇文章非常详细的讲述了冒泡排序的推理方法,以及优化方案:【排序算法】史上最通俗易懂的【冒泡排序】详解-CSDN博客

下面这一整块都是错误代码

#include<stdio.h>
#include<string.h>
int main()
{
    char name[100];
    scanf("%c%c%c",&name[0],&name[1],&name[2]);
    for(int i =0;i<strlen(name)/name[0] - 1;i++)
    {
        bool flag = false;
        for(int k = 0;k<strlen(name)/name[0] - i;k++)
        {
            if(name[i]>name[k])
            {
                char store;
                store = name[i];
                name[k] = name[i];
                name[i] = store;
                flag =true;
            }
        }

        if(flag != true)
        {
            break;
        }


    }
   for(int i =0;i<strlen(name)/name[0] - 1;i++)
   {
        printf("%c",name[i]);
   }


    return 0;
}
还是会输出一堆乱码

正确代码:

#include<stdio.h>
#include<string.h>
int main()
{
    char name[3];
    scanf("%c%c%c",&name[0],&name[1],&name[2]);
    for(int i =0;i<3;i++)
    {
        bool flag = false;
        for(int k = 0;k<3 - i;k++)
        {
            if(name[k]>name[k+1])
            {
                char store;
                store = name[k];
                name[k] = name[k+1];
                name[k+1] = store;
                flag =true;
            }
        }

        if(flag != true)
        {
            break;
        }


    }
   for(int i =0;i<3;i++)
   {
        printf("%c",name[i]);
   }


    return 0;
}

下面补充我为什么不能通过OJ测试的错误代码和错误原因:

错误原因:

有一些问题会导致在OJ系统中无法通过:

  1. 数组越界name 数组是一个长度为 3 的字符数组,但是在 scanf() 中却尝试将整个数组作为参数传递,这会导致数组越界。正确的做法是使用数组的索引,比如 &name[0]&name[1]&name[2]

  2. 错误处理:在使用 scanf() 读取字符后调用了 getchar() 来清除输入缓冲区中的换行符。这在大多数情况下是一个合理的做法,但是如果输入中包含多个换行符,则会导致额外的空格输出。

  3. 循环逻辑问题:代码尝试在一个循环中读取和处理多个输入,但是在循环内部也进行了排序和输出。这会导致在输入完一个单词后就会尝试对其进行排序和输出,而不是等待输入完整的三个单词。《说白了就是我的第二个冒泡排序循环for(int k = 0;k<3 - i;k++)写错了》

  4. 另外还有一个最后输出结果的换行问题,最好进行一次换行操作

 for(int i =0;i<3;i++)
   {
        printf("%c",name[i]);
        if(i != 2)
        {
            printf(" ");
        }
   }
printf("\n"); // 输出换行符
}

错误代码:

#include<stdio.h>
#include<stdbool.h>
int main()
{
    char name[3];
    while(scanf("%c",&name) != EOF)
{
    getchar();

    for(int i =0;i<3;i++)
    {
        bool flag = false;
        for(int k = 0;k<3 - i;k++)
        {
            if(name[k]>name[k+1])
            {
                char store;
                store = name[k];
                name[k] = name[k+1];
                name[k+1] = store;
                flag =true;
            }
        }

        if(flag != true)
        {
            break;
        }


    }

   for(int i =0;i<3;i++)
   {
        printf("%c",name[i]);
        if(i != 2)
        {
            printf(" ");
        }
   }

}
    return 0;
}

正确的OJ代码:

#include<stdio.h>
#include<stdbool.h>
int main()
{
    char name[3];
    while(scanf("%c%c%c", &name[0], &name[1], &name[2]) != EOF)
{
    getchar();

    for(int i =0;i<3;i++)
    {
        bool flag = false;
        for(int k = 0;k<3 - i-1;k++)
        {
            if(name[k]>name[k+1])
            {
                char store;
                store = name[k];
                name[k] = name[k+1];
                name[k+1] = store;
                flag =true;
            }
        }

        if(flag != true)
        {
            break;
        }


    }

   for(int i =0;i<3;i++)
   {
        printf("%c",name[i]);
        if(i != 2)
        {
            printf(" ");
        }
   }
printf("\n"); // 输出换行符
}

    return 0;
}

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值