一.运行截图
二.拓展功能
检测进制数是否错误,若输错后无需返回菜单重新进行选择进制转换选项,可直接重新输入所需要转换的进制数
三.函数&功能
1.menu函数
void menu() //菜单 { printf(" \\ 我是菜单 / \n"); printf(" (?ì _ í?) \n"); printf(" ——————十进制转换二进制 [1]—————— \n"); printf(" \\ 十进制转换八进制 [2] / \n"); printf(" \\ 十进制转换十六进制[3] / \n"); printf(" \\ 二进制转换十进制 [4]/ \n"); printf(" /八进制转换十进制 [5]\\ \n"); printf(" 十六进制转换十进制[6] \n"); printf(" 退 出 [0] \n"); printf(" | | \n"); printf(" | | \n"); printf(" _| |_ \n"); printf("\n"); printf("\n"); }
2.zio函数(十进制转二进制)
void zio() //10->2 { int n,m, c = 1, i = 0; int a[100]; printf("您的选择是十进制转二进制\n"); printf("输入一个整数:"); scanf("%d", &n); while(n > 0){ m = n; a[i] = (m % 2);// 求模放进数组 n = n / 2; //用2辗转相除直至结果为1 i++; c = 1; } while(n < 0){ m = -n; a[i] = (m % 2);// 求模放进数组 n = n / 2; //用2辗转相除直至结果为1 i++; c = 0; } printf("它的二进制数为 "); if(c == 1){ for (i = i-1; i >= 0; i--) //将数组倒序输出 printf("%d", a[i]); } if(c == 0){ printf("-"); for (i = i-1; i >= 0; i--) //将数组倒序输出 printf("%d", a[i]); } if(m == 0) printf("0"); printf("\n"); }
3.zeroone函数(十进制转八进制)
void zeroone() //10->8 { int n,m, c = 1, i = 0; int a[100]; printf("您的选择是十进制转八进制\n"); printf("输入一个整数:"); scanf("%d", &n); while(n > 0){ m = n; a[i] = (m % 8);// 求模放进数组 n = n / 8; //用8辗转相除直至结果为1 i++; c = 1; } while(n < 0){ m = -n; a[i] = (m % 8);// 求模放进数组 n = n / 8; //用8辗转相除直至结果为1 i++; c = 0; } printf("它的八进制数为 "); if(c == 1){ for (i = i-1; i >= 0; i--) //将数组倒序输出 printf("%d", a[i]); } if(c == 0){ printf("-"); for (i = i-1; i >= 0; i--) //将数组倒序输出 printf("%d", a[i]); } if(m == 0) printf("0"); printf("\n"); }
4.build函数(十进制转十六进制)
void build() //10->16 { char arr[] = "0123456789ABCDEF"; char hex[16]; int i = 0; int j = 0; int n = 0,a = 0,b; printf("您的选择是十进制转十六进制\n"); printf("请输入一个整数:"); scanf("%d", &n); b = n; if(n < 0) n = -n; a = n; while (n) { hex[i++] = arr[n % 16]; //将模放进hex数组中 n = n / 16; } printf("它的十六进制数为:"); if(b == 0) printf("0"); if(b<0) printf("-"); for (j = i - 1; j >= 0; --j) printf("%c", hex[j]); printf("\n"); }
5.geiz函数(二进制转十进制)
void geiz() //2->10 { int n,a; int sum = 0, i = 0, m; printf("您的选择是二进制转十进制\n"); printf("请输入一个二进制数: "); scanf("%d", &n); if(n%10 >= 2){ //判断输入的是否为二进制数 printf("请检查输入的二进制数=(\n"); return geiz(); //返回该函数进行重新输入 } a = n; while (n != 0) { m = n % 10; n /= 10; sum += m*pow(2, i); ++i; } printf("该二进制的十进制为 %d\n",sum); }
6.woz函数(八进制转十进制)
void woz() //8->10 { int n, a; int sum = 0, i = 0, m; printf("您的选择是八进制转十进制\n"); printf("请输入一个八进制数: "); scanf("%d", &n); if(n%10 >= 8){ printf("请检查输入的八进制数=(\n"); return woz(); } a = n; while (n != 0) { m = n % 10; n /= 10; sum += m*pow(8, i); ++i; } printf("该八进制数转换为十进制为 %d\n",sum); }
7.decade函数(十六进制转十进制)
void decade() //16—>10 { char s[50]; char a[50]; printf("您的选择是十六进制转十进制\n"); printf("请输入一个十六进制数:"); scanf("%s", s); int t, i, count = 0, j = 0; long sum = 0; if (s[0] == ‘-‘) { for (i = 0;s[i];i++) { a[i] = s[i + 1]; } for (i = 0;s[i];i++) { s[i] = a[i]; } j = 1; } for (i = 0;s[i];i++) { if (s[i] > ‘F‘) count++; } if (count == 0) { for (i = 0;s[i];i++) { if (s[i] <= ‘9‘) t = s[i] - ‘0‘; else t = s[i] - ‘A‘ + 10; sum = sum * 16 + t; } printf("该十六进制数转换为十进制为:"); if (j == 1) { printf("-"); } printf("%ld\n",sum); } else { printf("请检查输入的十六进制数=("); return decade(); } printf("\n"); }
四.main函数
int main() { int x = 0; while(1) { menu(); printf(" ————————————————————————————————————\n"); printf(" 请选择 [1] [2] [3] [4] [5] [6] [0]\n"); printf(" ————————————————————————————————————\n"); scanf("%d", &x); switch(x) { case 1:zio(); //10—>2 break; case 2:zeroone();//10->8 break; case 3:build();//10->16 break; case 4:geiz();//2->10 break; case 5:woz();//8—>10 break; case 6:decade();//16->10 break; case 0: printf("正在退出...\n"); return 0; break; default: printf("请检查你的选项:(\n"); break; } } return 0; }
五.函数关系
六.问题解决
1.10->2数组倒序输出问题,需从i-1输出才能得到正确答案
2.10->2正负数判断问题,引入一个标记数更容易在后面的输出判断正负数
3.main程序中做到输出结果后不会立即退出程序,用while(1)循环控制程序进行可保证不会立即退出
4.字符串应为%s而不是%d输入
七.总结
加深对函数的理解与循环语句的应用。
善用数组来满足需求。
分离的函数部分使主程序不会过于繁杂,更容易确定问题所在。
原文地址:https://www.cnblogs.com/bob3000/p/11808704.html
时间: 2024-11-11 06:45:08