第二次博客作业
一、运行截图
二进制和八进制
二进制和十进制
八进制和十进制
二、函数介绍
int main() { int first, sum; printf("请选择当前要被转换的进制\n"); printf("二进制【1】\n"); printf("八进制【2】\n"); printf("十进制【3】\n"); printf("你的选择:"); scanf_s("%d", &first); switch (first) { case 1: { sum = two_to_others(number_2(), choose()); if (sum != 0) printf("%d", sum); } break; case 2: { sum = eight_to_others(number_8(), choose()); if (sum != 0) printf("%d", sum); } break; case 3: { sum = ten_to_others(number_10(), choose()); if (sum != 0) printf("%d", sum); } break; } }
int number_2()//输入一个二进制函数 { int result; part1:printf("请输入二进制数:"); scanf_s("%d", &result); for (int i = result; i > 0; i = i / 10) { if (i % 10 > 1) { printf("这是无效的二进制,请重新输入\n"); goto part1; } } return result; } int number_8()//输入一个八进制函数 { int result; printf("请输入八进制数:"); scanf_s("%d", &result); return result; } int number_10()//输入一个十进制函数 { int result; printf("请输入十进制数:"); scanf_s("%d", &result); return result; } int choose()//选择要二进制被转换的进制 { int result; printf("请选择当前要转换的进制\n"); printf("二进制【1】\n"); printf("八进制【2】\n"); printf("十进制【3】\n"); printf("你的选择: "); scanf_s("%d", &result); return result; }
int two_to_others(int number_2, int choose)//二进制!!!!!! { int sum = 0, t = 0; if (choose == 1) //二进制:输入1(二进制),则仍然是二进制输出; { if (number_2 == 0) printf("%04d", number_2); return number_2; } if (choose == 2)//二进制:输入2(八进制),则取三合一,每三位按权相加,如:110=0*1+1*2+1*4=6,按权相加的方式可以将那三位转为十进制, { //可以理解为那三位二进制转为十进制 if (number_2 == 0) printf("%d", number_2); while (number_2 > 0) { sum = sum + two_to_others((number_2 % 1000), 3) * pow(10, t); number_2 = number_2 / 1000; t++; } return sum; } if (choose == 3)//二进制转十进制,按权相加。 { if (number_2 == 0) printf("%d", number_2); while (number_2 > 0) { sum += (number_2 % 10) * pow(2, t); number_2 /= 10; t++; } return sum; } } int eight_to_others(int number_8, int choose)//八进制!!! { int sum = 0; if (choose == 1) { int a[10], i = 0; for (int j = number_8; j > 0; j = j / 10) { int b = j % 10, t = 0; while (b > 0) { sum += (b % 2) * pow(10, t); b = b / 2; t++; } a[i] = sum; sum = 0, i++; } for (int j = i - 1; j >= 0; j--) { if (j == i - 1) printf("%d", a[j]); else printf("%03d", a[j]); } return 0; } if (choose == 2) { if (number_8 == 0) { printf("%d", number_8); return number_8; } else { return number_8; } } if (choose == 3) { int t = 0; if (number_8 == 0) printf("%d", number_8); while (number_8 > 0) { sum += (number_8 % 10) * pow(8, t); number_8 /= 10; t++; } return sum; } } int ten_to_others(int number_10, int choose)//十进制!!!! { if (choose == 1) { int b = number_10, sum = 0, t = 0; do { sum += (b % 2) * pow(10, t); b = b / 2; t++; } while (b > 0); return sum; } if (choose == 2) { int b = number_10, sum = 0, t = 0; do { sum += (b % 8) * pow(10, t); b = b / 8; t++; } while (b > 0); return sum; } if (choose == 3) { int b = number_10, sum = 0, t = 0; do { sum += (b % 10) * pow(10, t); b = b / 10; t++; } while (b > 0); return sum; } }
三、main函数
int main()
{
int first, sum;
printf("请选择当前要被转换的进制\n");
printf("二进制【1】\n");
printf("八进制【2】\n");
printf("十进制【3】\n");
printf("你的选择:");
scanf_s("%d", &first);
switch (first)
四、思维导图
代码互评
#include<stdio.h> #include<math.h> #include<string.h> int step_1(char m[],int n); void step_2(int m,int n); int change10(char m[],int n); void unchange10(int m,int n); int main(){ int n=100; char a[n]; int b,c,d; printf("请输入所转换数的进制数:\n"); printf("二进制 八进制 十进制 十六进制\n"); scanf("%d",&b); printf("请输入所要转换的数:\n"); scanf("%s",&a); if(step_1(a,b)==1){ printf("输入了错误的数\n"); }else{ printf("数经过转换后为:\n"); c=change10(a,b); step_2(c,b); } return 0; } int step_1(char m[],int n){ int a,b=0,c,i; c=n+48; a=strlen(m); for(i=0;i<a;i++){ if(n<=10){ if(m[i]<0||m[i]>=c){ b=1; break; } }else{ if(m[i]<'0'||m[i]>'9'&&m[i]<'A'||m[i]>'F'){ b=1; break; } } } return b; } void step_2(int m,int n){ int a,b; if(n==2){ printf("八进制:"); unchange10(m,8); printf("十进制:"); printf("%d\n",m); printf("十六进制:"); unchange10(m,16); }else if(n==8){ printf("二进制:"); unchange10(m,2); printf("十进制:"); printf("%d\n",m); printf("十六进制:"); unchange10(m,16); }else if(n==10){ printf("二进制:"); unchange10(m,2); printf("八进制:"); unchange10(m,8); printf("十六进制:"); unchange10(m,16); }else if(n==16){ printf("二进制:"); unchange10(m,2); printf("八进制:"); unchange10(m,8); printf("十进制:"); printf("%d\n",m); } } int change10(char m[],int n){ int a,i,b=0; a=strlen(m); if(n!=16){ for(i=a-1;i>=0;i--){ b += (m[i]-'0')*pow(n,i); } }else if(n==16){ for(i=a-1;i>=0;i--){ if(m[i]<10){ b += m[i]*pow(n,i); }else{ m[i]=m[i]-'A'+10; b += m[i]*pow(n,i); } } } return b; } void unchange10(int m,int n){ int b=100; int a[b],sum=0,i; for(i=0;m>0;m/=n){ a[i]=m%n; i++; } i--; for(;i>=0;i--){ if(a[i]<10){ printf("%d",a[i]); }else{ printf("%c",a[i]+55); } } printf("\n"); }
他的代码进行了16进制的转换,这个我做不到,值得学习。
格式方面也比我更好一些。
五、遇到的问题
1、switch中,我遇到了一个代号C2360的error,说明变量尽量不要在switch内定义,尽量在switch外部定义变量
2.在八进制转二进制时,取三位,不足三位则补零。于是采用%03d来写,但是第一项不需要补0;
解决:第一项单独输出,其余按%03d输出。
3、
1、例如:switch中,我遇到了一个代号C2360的error,说明变量尽量不要在switch内定义,尽量在switch外部定义变量
2.在八进制转二进制时,取三位,不足三位则补零。于是采用%03d来写,但是第一项不需要补0;
解决:第一项单独输出,其余按%03d输出。
3通过请教同学和网络查询,解决了很多问题,补充了自己的不足。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步