首页 > 其他分享 >C语言:进制转换器,实现二进制、八进制、十进制、十六进制之间的相互转化

C语言:进制转换器,实现二进制、八进制、十进制、十六进制之间的相互转化

时间:2023-06-13 14:57:43浏览次数:34  
标签:十六进制 return temp int C语言 ans 八进制 十进制

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <string.h>
  4 #include <ctype.h>
  5 
  6 int dec2bin(int n) { // 十进制转二进制
  7     if (n == 0) {
  8         return 0;
  9     } else {
 10         return (n % 2 + 10 * dec2bin(n / 2));
 11     }
 12 }
 13 
 14 int bin2dec(char* s) { // 二进制转十进制
 15     int len = strlen(s);
 16     int ans = 0;
 17     for (int i = 0; i < len; i++) {
 18         if (!isdigit(s[i]) || s[i] < '0' || s[i] > '1') { // 判断是否为二进制数
 19             printf("输入不合法,请输入二进制数\n");
 20             return -1;
 21         }
 22         ans = ans * 2 + s[i] - '0';
 23     }
 24     return ans;
 25 }
 26 
 27 int dec2oct(int n) { // 十进制转八进制
 28     if (n == 0) {
 29         return 0;
 30     } else {
 31         return (n % 8 + 10 * dec2oct(n / 8));
 32     }
 33 }
 34 
 35 int oct2dec(char* s) { // 八进制转十进制
 36     int len = strlen(s);
 37     int ans = 0;
 38     for (int i = 0; i < len; i++) {
 39         if (!isdigit(s[i]) || s[i] < '0' || s[i] > '7') { // 判断是否为八进制数
 40             printf("输入不合法,请输入八进制数\n");
 41             return -1;
 42         }
 43         ans = ans * 8 + s[i] - '0';
 44     }
 45     return ans;
 46 }
 47 
 48 char* dec2hex(int n) { // 十进制转十六进制
 49     char* hex = (char*)malloc(100);
 50     int temp, i = 1, j;
 51     while (n != 0) {
 52         temp = n % 16;
 53         if (temp < 10) {
 54             temp = temp + 48;
 55         } else {
 56             temp = temp + 55;
 57         }
 58         hex[i++] = temp;
 59         n = n / 16;
 60     }
 61     hex[0] = '0';
 62     hex[i] = '\0';
 63     for (j = 1; j <= i / 2; j++) { // 倒序输出十六进制数
 64         temp = hex[j];
 65         hex[j] = hex[i - j];
 66         hex[i - j] = temp;
 67     }
 68     return hex;
 69 }
 70 
 71 int hex2dec(char* s) { // 十六进制转十进制
 72     int len = strlen(s);
 73     int ans = 0;
 74     for (int i = 0; i < len; i++) {
 75         if (!isalnum(s[i])) { // 判断是否为十六进制数
 76             printf("输入不合法,请输入十六进制数\n");
 77             return -1;
 78         }
 79         if (isdigit(s[i])) {
 80             ans = ans * 16 + s[i] - '0';
 81         } else {
 82             ans = ans * 16 + s[i] - 'A' + 10;
 83         }
 84     }
 85     return ans;
 86 }
 87 
 88 int bin2oct(char* s) { // 二进制转八进制
 89     int n = bin2dec(s);
 90     if (n == -1) {
 91         return -1;
 92     } else {
 93         return dec2oct(n);
 94     }
 95 }
 96 
 97 char* oct2bin(char* s) { // 八进制转二进制
 98     int n = oct2dec(s);
 99     if (n == -1) {
100         return "输入不合法,请输入八进制数\n";
101     } else {
102         return dec2bin(n);
103     }
104 }
105 
106 char* hex2bin(char* s) { // 十六进制转二进制
107     int n = hex2dec(s);
108     if (n == -1) {
109         return "输入不合法,请输入十六进制数\n";
110     } else {
111         return dec2bin(n);
112     }
113 }
114 
115 int main() {
116     while (1) {
117         printf("请输入需要进行的操作:\n");
118         printf("1、十进制转换为二进制\n");
119         printf("2、二进制转换为十进制\n");
120         printf("3、十进制转换为八进制\n");
121         printf("4、八进制转换为十进制\n");
122         printf("5、十进制转换为十六进制\n");
123         printf("6、十六进制转换为十进制\n");
124         printf("7、二进制转换为八进制\n");
125         printf("8、八进制转换为二进制\n");
126         printf("9、十六进制转换为二进制\n");
127         printf("10、退出\n");
128 
129         int opt;
130         scanf("%d", &opt);
131         char num[100];
132         switch (opt) {
133             case 1: // 十进制转二进制
134                 printf("请输入十进制数:\n");
135                 int n1;
136                 scanf("%d", &n1);
137                 printf("%d的二进制表示为:%d\n", n1, dec2bin(n1));
138                 break;
139             case 2: // 二进制转十进制
140                 printf("请输入二进制数(只能包含0和1):\n");
141                 scanf("%s", num);
142                 printf("%s的十进制表示为:%d\n", num, bin2dec(num));
143                 break;
144             case 3: // 十进制转八进制
145                 printf("请输入十进制数:\n");
146                 int n3;
147                 scanf("%d", &n3);
148                 printf("%d的八进制表示为:%d\n", n3, dec2oct(n3));
149                 break;
150             case 4: // 八进制转十进制
151                 printf("请输入八进制数(只能包含0~7):\n");
152                 scanf("%s", num);
153                 printf("%s的十进制表示为:%d\n", num, oct2dec(num));
154                 break;
155             case 5: // 十进制转十六进制
156                 printf("请输入十进制数:\n");
157                 int n5;
158                 scanf("%d", &n5);
159                 printf("%d的十六进制表示为:%s\n", n5, dec2hex(n5));
160                 break;
161             case 6: // 十六进制转十进制
162                 printf("请输入十六进制数:\n");
163                 scanf("%s", num);
164                 printf("%s的十进制表示为:%d\n", num, hex2dec(num));
165                 break;
166             case 7: // 二进制转八进制
167                 printf("请输入二进制数(只能包含0和1):\n");
168                 scanf("%s", num);
169                 printf("%s的八进制表示为:%d\n", num, bin2oct(num));
170                 break;
171             case 8: // 八进制转二进制
172                 printf("请输入八进制数(只能包含0~7):\n");
173                 scanf("%s", num);
174                 printf("%s的二进制表示为:%s\n", num, oct2bin(num));
175                 break;
176             case 9: // 十六进制转二进制
177                 printf("请输入十六进制数:\n");
178                 scanf("%s", num);
179                 printf("%s的二进制表示为:%s\n", num, hex2bin(num));
180                 break;
181             case 10: // 退出
182                 return 0;
183             default:
184                 printf("输入不合法,请重新输入\n");
185         }
186 
187         while (1) {
188             printf("是否继续进行转换(Y/N)?\n");
189             char c;
190             scanf(" %c", &c);
191             if (c == 'Y' || c == 'y') {
192                 break;
193             } else if (c == 'N' || c == 'n') {
194                 return 0;
195             } else {
196                 printf("输入不合法,请重新输入\n");
197             }
198         }
199     }
200     return 0;
201 }

  该程序首先输出菜单供用户选择需要进行的转换类型,并提示用户输入相应的数字。接着,根据用户输入的数字,程序进入相应的功能函数中。对于输入的数值,在进行相应转换之前,都会进行有效性验证,判断其是否为合法的二进制数、八进制数或十六进制数。最后,程序会询问用户是否继续转换,如果用户输入的是Y,则返回到选择菜单部分;否则,退出整个程序。

标签:十六进制,return,temp,int,C语言,ans,八进制,十进制
From: https://www.cnblogs.com/cloud-sword/p/17477483.html

相关文章

  • c语言:计数器实验
    要求:P1口接2只LED灯,定时器T1采用计数模式,方式1中断,外接按钮开关作为计数输入,当按2次按钮开关,P1口第一只LED点亮,再按2次按钮开关,P1口第二只LED点亮,再按2次按钮,所有LED灯熄灭。 1#include<reg52.h>23//定义LED灯的控制端口和对应的控制位4sbitLED1=P1^0;5......
  • C语言-策略模式
    1.假设我们需要实现一个排序程序,可以对一个整型数组进行排序。我们需要使用策略模式来封装不同的排序算法,例如冒泡排序、插入排序和快速排序。2.Code点击查看代码#include<stdio.h>#include<stdlib.h>#include<string.h>//策略接口typedefvoid(*Strategy)(int*,in......
  • C语言,函数包含失败问题
    1.头文件包含顺序出错导致头文件中的函数无法使用eg:在主函数中调用support.h中的strcat()函数失败,但是明明已经包含了strcat()函数的头文件进来;编译器还是提示“Undefinedsysbolsupport(refreedfromxxx.o)”.以下函数只是简单举例,请不要直接拿来编译main中,先调用了includ......
  • 初识C语言--训练题
    我们通过前面的学习,对C语言的基础知识有了一定的了解,那么我们来练一练,对知识进行巩固一、选择题1.下面哪个不是C语言内置的数据类型()A.charB.doubleC.structStuD.short2.局部变量的作用域是()A.main函数内部B.整个程序C.main函数之前D.局部变量所在的局部范围3.字符串的结束标志是......
  • 初阶C语言:分支与循环(1)--分支语句
    前言:我们了解完初识C语言的知识点之后,对C语言有了一定的基本概念,也有了最基础的写代码能力,在初识C语言中我们只是对知识点的大体概括,没有进行细致的讲解,那么在初阶C语言中就是对C语言知识进行庖丁解牛,给大家进行详细的介绍今天我们来学习分支语句和循环语句,在初识C语言中我们了解到......
  • C语言基础知识梳理
    C语言基础知识梳理目录一、C语言程序的组成二、函数定义格式2.1主函数定义的格式2.2其它函数定义的格式三、如何调用执行定义好的函数四、注释的使用4.1什么是注释?4.2注释的分类4.3注释的注意点4.4使用注释的好处五、关键字5.1什么是关键字5.2关键字的分类六、标识符6.1......
  • C语言-内存管理
    简介 C语言的内存管理,分成两部分。一部分是系统管理的,另一部分是用户手动管理的。系统管理的内存,主要是函数内部的变量(局部变量)。这部分变量在函数运行时进入内存,函数运行结束后自动从内存卸载。这些变量存放的区域称为”栈“(stack),”栈“所在的内存是系统自动管理的。用户手动管......
  • C语言编程—递归
    递归指的是在函数的定义中使用函数自身的方法。举个例子:从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?"从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?'从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?……'"语......
  • C语言编程—错误处理
    C语言不提供对错误处理的直接支持,但是作为一种系统编程语言,它以返回值的形式允许您访问底层数据。在发生错误时,大多数的C或UNIX函数调用返回1或NULL,同时会设置一个错误代码errno,该错误代码是全局变量,表示在函数调用期间发生了错误。您可以在errno.h头文件中找到各种各样......
  • C语言宏(macro)小技巧
    目录字符串化运算符(stringizingoperator)记号粘贴运算符(token-pastingoperator)二选一选择器宏(mux)字符串化运算符(stringizingoperator)运算符#在宏中会将实参直接转化为字符串literal,也就是字符串常量,举个简单的例子:#definearg2str(p)#pputs(arg2str(666));//宏展开后变......