一、运行截图
二进制和八进制

二进制和十进制

八进制和十进制

二、函数介绍
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通过请教同学和网络查询,解决了很多问题,补充了自己的不足。