如何在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
相关产品推荐
相关产品推荐

