You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C语言中不使用if-else和三元运算符实现字符冒泡排序?

无三目运算符/if-else的大小写不敏感冒泡排序实现

需求

编写C语言程序,读取5个字符输入,通过冒泡排序实现大小写不敏感的字母顺序排序,且限制不能使用?:三目运算符,同时不借助if-else完成大小写转换。

初始实现(含三目运算符)

最初的代码使用三目运算符在比较时转换字符为小写,但不符合限制要求:

#include <stdio.h>

int main() {
    char a, b, c, d, e;
    char temp;
    int cnt = 0;

    // 读取字符
    scanf(" %c %c %c %c %c", &a, &b, &c, &d, &e);

    // 使用while循环控制排序轮次
    while (cnt < 4) {
        // 在比较时转换为小写,直接使用ASCII值进行比较
        while (((a >= 'A' && a <= 'Z') ? (a + 32) : a) > ((b >= 'A' && b <= 'Z') ? (b + 32) : b)) {
            temp = a;
            a = b;
            b = temp;
        }
        while (((b >= 'A' && b <= 'Z') ? (b + 32) : b) > ((c >= 'A' && c <= 'Z') ? (c + 32) : c)) {
            temp = b;
            b = c;
            c = temp;
        }
        while (((c >= 'A' && c <= 'Z') ? (c + 32) : c) > ((d >= 'A' && d <= 'Z') ? (d + 32) : d)) {
            temp = c;
            c = d;
            d = temp;
        }
        while (((d >= 'A' && d <= 'Z') ? (d + 32) : d) > ((e >= 'A' && e <= 'Z') ? (e + 32) : e)) {
            temp = d;
            d = e;
            e = temp;
        }
        cnt++;
    }

    // 输出排序后的字符
    printf("%c %c %c %c %c\n", a, b, c, d, e);

    return 0;
}

满足限制的大小写转换方案

利用C语言中布尔表达式的求值特性:当条件为真时表达式结果为1,为假时为0。通过以下方式完成大小写转换:
char lower_c = c + (c >= 'A' && c <= 'Z') * ('a' - 'A');

  • 若c是大写字母,(c >= 'A' && c <= 'Z')结果为1,加上'a'-'A'(即32)转成小写
  • 若c是小写字母或其他字符,表达式结果为0,字符保持不变

改进后的完整代码

#include <stdio.h>

int main() {
    char a, b, c, d, e;
    char temp;
    int cnt = 0;

    // 读取字符
    scanf(" %c %c %c %c %c", &a, &b, &c, &d, &e);

    // 使用do-while循环控制排序轮次
    do {
        // 转换字符为小写用于比较
        char a_lower = a + (a >= 'A' && a <= 'Z') * ('a' - 'A');
        char b_lower = b + (b >= 'A' && b <= 'Z') * ('a' - 'A');
        char c_lower = c + (c >= 'A' && c <= 'Z') * ('a' - 'A');
        char d_lower = d + (d >= 'A' && d <= 'Z') * ('a' - 'A');
        char e_lower = e + (e >= 'A' && e <= 'Z') * ('a' - 'A');
        
        // 大小写不敏感排序
        while (a_lower > b_lower) {
            temp = a;
            a = b;
            b = temp;
            
            a_lower = a + (a >= 'A' && a <= 'Z') * ('a' - 'A');
            b_lower = b + (b >= 'A' && b <= 'Z') * ('a' - 'A');
        }
        while (b_lower > c_lower) {
            temp = b;
            b = c;
            c = temp;
            
            b_lower = b + (b >= 'A' && b <= 'Z') * ('a' - 'A');
            c_lower = c + (c >= 'A' && c <= 'Z') * ('a' - 'A');
        }
        while (c_lower > d_lower) {
            temp = c;
            c = d;
            d = temp;
            
            c_lower = c + (c >= 'A' && c <= 'Z') * ('a' - 'A');
            d_lower = d + (d >= 'A' && d <= 'Z') * ('a' - 'A');
        }
        while (d_lower > e_lower) {
            temp = d;
            d = e;
            e = temp;
            
            d_lower = d + (d >= 'A' && d <= 'Z') * ('a' - 'A');
            e_lower = e + (e >= 'A' && e <= 'Z') * ('a' - 'A');
        }
        
        // 递增轮次计数器
        cnt++;
    } while (cnt < 4); // 重复足够轮次以完成排序

    // 输出排序后的字符
    printf("%c %c %c %c %c\n", a, b, c, d, e);

    return 0;
}

内容的提问来源于stack exchange,提问作者johnny rowdy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 12:52:04