Switch语句的实现机制(2)

补充第三种,虽然我还是不很明白。。。=,=!

3)树型结构

int main() { int i=1; switch(i) { case 1001:printf("%s","no1");break; case 22:printf("%s","no2");break; case 388:printf("%s","no3");break; case 777:printf("%s","no4");break; case 48:printf("%s","no5");break; case 998:printf("%s","no6");break; case 148:printf("%s","no6");break; case 598:printf("%s","no6");break; default:printf("%s","default"); } return 0; }

每个case的常量表达式没有规律

int main() { 001413A0 push ebp 001413A1 mov ebp,esp 001413A3 sub esp,0D0h 001413A9 push ebx 001413AA push esi 001413AB push edi 001413AC lea edi,[ebp-0D0h] 001413B2 mov ecx,34h 001413B7 mov eax,0CCCCCCCCh 001413BC rep stos dword ptr es:[edi] int i=148; 001413BE mov dword ptr [i],94h switch(i) 001413C5 mov eax,dword ptr [i] 001413C8 mov dword ptr [ebp-0D0h],eax 001413CE cmp dword ptr [ebp-0D0h],250h 001413D8 jg main+92h (141432h) 001413DA cmp dword ptr [ebp-0D0h],250h 001413E4 je main+1A1h (141541h) 001413EA cmp dword ptr [ebp-0D0h],94h 001413F4 jg main+81h (141421h) 001413F6 cmp dword ptr [ebp-0D0h],94h 00141400 je main+183h (141523h) 00141406 cmp dword ptr [ebp-0D0h],16h 0014140D je main+0E4h (141484h) 0014140F cmp dword ptr [ebp-0D0h],30h 00141416 je main+147h (1414E7h) 0014141C jmp main+1BFh (14155Fh) 00141421 cmp dword ptr [ebp-0D0h],184h 0014142B je main+105h (1414A5h) 0014142D jmp main+1BFh (14155Fh) 00141432 cmp dword ptr [ebp-0D0h],309h 0014143C je main+126h (1414C6h) 00141442 cmp dword ptr [ebp-0D0h],3E6h 0014144C je main+165h (141505h) 00141452 cmp dword ptr [ebp-0D0h],3E9h 0014145C je main+0C3h (141463h) 0014145E jmp main+1BFh (14155Fh) { case 1001:printf("%s","no1");break; 00141463 mov esi,esp 00141465 push offset string "no1" (145768h) 0014146A push offset string "%s" (145764h) 0014146F call dword ptr [__imp__printf (1482BCh)] 00141475 add esp,8 00141478 cmp esi,esp 0014147A call @ILT+310(__RTC_CheckEsp) (14113Bh) 0014147F jmp main+1DBh (14157Bh) case 22:printf("%s","no2");break; 00141484 mov esi,esp 00141486 push offset string "no2" (145760h) 0014148B push offset string "%s" (145764h) 00141490 call dword ptr [__imp__printf (1482BCh)] 00141496 add esp,8 00141499 cmp esi,esp 0014149B call @ILT+310(__RTC_CheckEsp) (14113Bh) 001414A0 jmp main+1DBh (14157Bh) case 388:printf("%s","no3");break; 001414A5 mov esi,esp 001414A7 push offset string "no3" (14575Ch) 001414AC push offset string "%s" (145764h) 001414B1 call dword ptr [__imp__printf (1482BCh)] 001414B7 add esp,8 001414BA cmp esi,esp 001414BC call @ILT+310(__RTC_CheckEsp) (14113Bh) 001414C1 jmp main+1DBh (14157Bh) case 777:printf("%s","no4");break; 001414C6 mov esi,esp 001414C8 push offset string "no4" (145758h) 001414CD push offset string "%s" (145764h) 001414D2 call dword ptr [__imp__printf (1482BCh)] 001414D8 add esp,8 001414DB cmp esi,esp 001414DD call @ILT+310(__RTC_CheckEsp) (14113Bh) 001414E2 jmp main+1DBh (14157Bh) case 48:printf("%s","no5");break; 001414E7 mov esi,esp 001414E9 push offset string "no5" (145754h) 001414EE push offset string "%s" (145764h) 001414F3 call dword ptr [__imp__printf (1482BCh)] 001414F9 add esp,8 001414FC cmp esi,esp 001414FE call @ILT+310(__RTC_CheckEsp) (14113Bh) 00141503 jmp main+1DBh (14157Bh) case 998:printf("%s","no6");break; 00141505 mov esi,esp 00141507 push offset string "no6" (145750h) 0014150C push offset string "%s" (145764h) 00141511 call dword ptr [__imp__printf (1482BCh)] 00141517 add esp,8 0014151A cmp esi,esp 0014151C call @ILT+310(__RTC_CheckEsp) (14113Bh) 00141521 jmp main+1DBh (14157Bh) case 148:printf("%s","no7");break; 00141523 mov esi,esp 00141525 push offset string "no7" (14574Ch) 0014152A push offset string "%s" (145764h) 0014152F call dword ptr [__imp__printf (1482BCh)] 00141535 add esp,8 00141538 cmp esi,esp 0014153A call @ILT+310(__RTC_CheckEsp) (14113Bh) 0014153F jmp main+1DBh (14157Bh) case 592:printf("%s","no8");break; 00141541 mov esi,esp 00141543 push offset string "no8" (145748h) 00141548 push offset string "%s" (145764h) 0014154D call dword ptr [__imp__printf (1482BCh)] 00141553 add esp,8 00141556 cmp esi,esp 00141558 call @ILT+310(__RTC_CheckEsp) (14113Bh) 0014155D jmp main+1DBh (14157Bh) default:printf("%s","default"); 0014155F mov esi,esp 00141561 push offset string "default" (14573Ch) 00141566 push offset string "%s" (145764h) 0014156B call dword ptr [__imp__printf (1482BCh)] 00141571 add esp,8 00141574 cmp esi,esp 00141576 call @ILT+310(__RTC_CheckEsp) (14113Bh) } return 0; 0014157B xor eax,eax } 0014157D pop edi 0014157E pop esi 0014157F pop ebx 00141580 add esp,0D0h 00141586 cmp ebp,esp 00141588 call @ILT+310(__RTC_CheckEsp) (14113Bh) 0014158D mov esp,ebp 0014158F pop ebp 00141590 ret

这是二叉树

001413C50014145E是实现过程(我是看花了,没学过数据结构)

树的图片:没做出来,只有草图

程序按照如下顺序遍历搜索这颗二叉树:

1.搜索根节点

2.对左子树结点进行先序遍历搜索

3.对右子树结点进行先序遍历搜索

二叉树搜索是一个递归的过程,因为从一棵二叉树搜索中查找一个元素时,其时间复杂度大致为O(log2n),查找的效率非常高,可见使用二叉树查找比较的机制实现switch是另一种高效的方法。

<think>我们参考引用内容,用户需要查找使用switch语句实现进制转换的方法。引用中提供了一个十进制转十六进制的C语言示例,其中使用switch语句将余数转换为对应的十六进制字符。 我们将按照以下步骤回答: 1. 解释进制转换的基本原理(十进制转其他进制,通过除基取余法)。 2. 说明switch语句在转换中的作用:将余数(0-15)转换为对应的字符(0-9和A-F)。 3. 提供一个完整的C语言程序示例,展示如何使用switch语句实现十进制到十六进制的转换。 4. 如果需要扩展到其他进制(如八进制),可以简要说明修改方法。 注意:由于用户指定使用switch语句,我们将重点放在switch语句的应用上。 另外,根据系统级指令,我们需要: - 行内数学表达式使用$...$,例如:$n$ 进制转换 - 独立公式使用$$...$$ - 使用中文 - 生成相关问题 - 引用的段落末尾添加引用标识(这里引用内容来自用户提供的[^1]) 由于用户的问题是关于“使用switch语句实现进制转换的方法”,我们将提供具体的方法和代码。 开始回答: </think>### 使用 switch 语句实现进制转换的方法 在进制转换中,**switch 语句主要用于处理余数到目标进制字符的映射**,特别适用于包含字母字符的进制(如十六进制)。以下是详细实现方法: #### 1. 核心原理:除基取余法 对于十进制数 $n$ 转换为 $base$ 进制: 1. 循环执行 $n \div base$,记录余数 $r$ 2. 将余数 $r$ 转换为目标进制对应的字符 3. 逆序输出所有字符 数学表达: $$n = (c_k c_{k-1} \cdots c_1 c_0)_{base} = \sum_{i=0}^{k} c_i \times base^i$$ #### 2. switch 语句的关键作用 当余数 $r \geq 10$ 时(如十六进制): - 将数字映射为字母: $10 \rightarrow 'A'$,$11 \rightarrow 'B'$,...,$15 \rightarrow 'F'$ - switch 语句实现: ```c switch(r) { case 0: ch = '0'; break; ... case 10: ch = 'A'; break; // 关键映射 ... case 15: ch = 'F'; break; } ``` #### 3. 完整实现(十进制→十六进制) ```c #include <stdio.h> int main() { char hex[32]; // 存储结果字符 int num, i = 0; printf("输入十进制数: "); scanf("%d", &num); // 处理0的特殊情况 if (num == 0) { printf("十六进制: 0"); return 0; } // 除基取余循环 while (num > 0) { int r = num % 16; // 求余 switch(r) { case 0 ... 9: hex[i] = '0' + r; // 数字字符转换 break; case 10: hex[i] = 'A'; break; case 11: hex[i] = 'B'; break; case 12: hex[i] = 'C'; break; case 13: hex[i] = 'D'; break; case 14: hex[i] = 'E'; break; case 15: hex[i] = 'F'; break; } num /= 16; // 更新商 i++; } // 逆序输出 printf("十六进制: "); for (int j = i - 1; j >= 0; j--) { putchar(hex[j]); } return 0; } ``` #### 4. 关键技巧说明 1. **switch 映射机制** - 直接匹配余数值,避免多层 if-else 嵌套 - 通过 `case 0 ... 9:` 语法简化数字处理(GCC扩展) 2. **逆序输出原理** 首次余数对应最低位,故需从数组末尾向前输出 3. **扩展其他进制** - 八进制:删除字母映射(仅需 case 0-7) - 自定义进制:在 switch 中添加更多字符映射 > 注:此方法比直接使用 `printf("%X", num)` 的优势在于**可自定义转换规则**,适用于嵌入式系统等无标准库的场景[^1]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值