void mune()
{
printf("||----------------------------------||\n");
printf("||----------------------------------||\n");
printf("|| ||\n");
printf("|| 进制转换 ||\n");
printf("|| ||\n");
printf("|| ☆1、二进制数转换 ||\n");
printf("|| ☆2、十进制数转换 ||\n");
printf("|| ☆3、八进制数转换 ||\n");
printf("|| ||\n");
printf("||----------------------------------||\n");
printf("||----------------------------------||\n");
printf("请选择:");
scanf("%d",&n);
if(n!=1&&n!=2&&n!=3)
{
printf("输入错误!重新输入:")
scanf("%d",&n);
}
printf("请输入一个数:");
scanf("%d",&x);
}
int Octal(int cnum, int m) //将二、八进制数转换为十进制数//
{
int i=0, num[1000];
while (m)
{ //将用户数的每一位逆序存入数组,并用变量i计算位数
num[i] = m % 10;
m /= 10;
i++;
}
int j,ret=0, unit = 1;
for (j = 0; j < i; j++) //将用户数按权展开相加
{
ret += num[j] * unit;
unit *= cnum;
}
return ret;
}
void OctalTo(int cnum, int m) //将十进制数转换为二、八进制数//
{
int i = 0;
int num[1000];
while (m)
{ //整数部分除以基数取余数(取余的方向为从后向前)
num[i] = m % cnum;
m /= cnum;
i++;
}
if (cnum == 2)printf("%d的二进制数为", x);
if (cnum == 8)printf("%d的八进制数为", x);
for (i--; i >= 0; i--)
printf("%d", num[i]); //将数组逆序输出
printf("\n");
}
void check(int m)
{
if(n==1)
{
static int ch[2]={0,1};
while(m)
{
if(m%10!=ch[0]&&m%10!=ch[1])
{
printf("输入错误!请输入合法的二进制数:");
scanf("%d",&x);
check(x);
}
m/=10;
}
}
if(n==2)
{
static int ch[10]={0,1,2,3,4,5,6,7,8,9};
while(m)
{
if(m%10!=ch[0]&&m%10!=ch[1]&&m%10!=ch[2]&&m%10!=ch[3]&&m%10!=ch[4]&&m%10!=ch[5]&&m%10!=ch[6]&&m%10!=ch[6]&&m%10!=ch[7]&&m%10!=ch[8]&&m%10!=ch[9])
{
printf("输入错误!请输入合法的十进制数:");
scanf("%d",&x);
check(x);
}
m/=10;
}
}
if(n==3)
{
static int ch[8]={0,1,2,3,4,5,6,7};
while(m)
{
if(m%10!=ch[0]&&m%10!=ch[1]&&m%10!=ch[2]&&m%10!=ch[3]&&m%10!=ch[4]&&m%10!=ch[5]&&m%10!=ch[6]&&m%10!=ch[6]&&m%10!=ch[7])
{
printf("输入错误!请输入合法的八进制数:");
scanf("%d",&x);
check(x);
}
m/=10;
}
}
}
**完整的源代码中只用到两个全局变量,分别用来储存用户的选择和用户输入的数。*
int main()
{
int ret;
while(1)
{
mune();
switch(n)
{
case 1:
check(x);
ret=Octal(2,x);
printf("%d的十进制数为%d\n",x,ret);
OctalTo(8,x);
break;
case 2:
check(x);
OctalTo(2,x);
OctalTo(8,x);
break;
case 3:
check(x);
ret=Octal(8,x);
printf("%d的十进制数为%d\n",x,ret);
OctalTo(2,ret);
break;
}
}
return 0;
}
Q1:需要厘清各种进制数之间的转换关系并编写成代码来实现
S1:查询搜索资料,根据博客 https://blog.csdn.net/qq_35619188/article/details/85000632 学习了相关内容。借鉴博客 https://blog.csdn.net/qq_42820622/article/details/82024324 的相关内容,实现了以上代码。
Q2:检查输入数的合法性,并提示,同时实现正确数据的“重新输入”。
S1:本文中通过简单的if-else语句只实现“选项”这一环节一次检查(仍待改进),通过使用数组相关内容检查输入数据的“各位数字”是否正确,结合if语句进行合法性的判断。但if语句的条件不够简洁。
Q3:如何实现直接实现二、八进制数之间的转换
S3:最终还是通过十进制数作为过渡,将二、八进制数都转换成十进制数后再转换成相应的进制。
以来代码来源于廖山荣同学:
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h> //用到里面的itoa函数 将十进制的数转换为其他进制数
void Er(); //将二进制数转换为其他三种进制数
void Ba(); //将八进制数转换为其他三种进制数
void Shi(); //将十进制数转换为其他三种进制数
void Shiliu();//将十六进制数转换为其他三种进制数
int main(){
int a;
printf(" 进制转化器\n");
printf(" 请选择您要输入的进制\n");
select:
printf(" 1.二进制 2.八进制 3.十进制 4.十六进制\n");
scanf("%d",&a);
if(a==1)
{
Er();
}else if(a==2){
Ba();
}else if(a==3){
Shi();
}else if(a==4){
Shiliu();
}else{
printf("无效选项\n");
goto select;
}
return 0;
}
void Er(){//将二进制数转换为其他三种进制数
char str[128];
int b,i,j,length,sum=0;
input:
printf("请输入您需要转换的二进制数:\n");
scanf("%s",str);
length=strlen(str); //length为字符长度
for(i=length-1;i>=0;i--){
if(str[i]!='0' && str[i]!='1'){
printf("Error\n");
printf("请输入正确的二进制数\n");
goto input;
}
}
printf("请选择您要转换的进制\n");
choice :
printf("1.八进制 2.十进制 3.十六进制\n");
scanf("%d",&b);
for(i=length-1,j=0,sum=0;i>=0;i--,j++){ //将输入的数转换为十进制数
sum += (str[i]-'0') * pow(2,j);
}
if(b==1){
itoa(sum,str,8); //用到itoa将该数转换为八进制数
printf("转换结果为:%s\n",str);
}else if(b==2){
itoa(sum,str,10); //用到itoa将该数转换为十进制数
printf("转换结果为:%s\n",str);
}else if(b==3){
itoa(sum,str,16); //用到itoa将该数转换为十六进制数
printf("转换结果为:%s",str);
}else {
printf("无效选项\n");
goto choice;
}
}
void Ba(){//将八进制数转换为其他三种进制数
char str[128];
int b,i,j,length,sum;
input:
printf("请输入您需要转换的八进制数:\n");
scanf("%s",str);
length=strlen(str);
for(i=length-1;i>=0;i--){
if(str[i]<'0' || str[i]>'7'){
printf("请输入正确的八进制数\n");
goto input;
}
}
printf("请选择您要转换的进制\n");
choice:
printf("1.二进制 2.十进制 3.十六进制\n");
scanf("%d",&b);
for(i=length-1,j=0,sum=0 ; i>=0 ; i--,j++){ //将输入的数转换为十进制数
sum += (str[i]-'0') * pow(8,j);
}
if(b==1){
itoa(sum,str,2); //用到itoa将该数转换为二进制数
printf("转换结果为:%s\n",str);
}else if(b==2){
itoa(sum,str,10); //用到itoa将该数转换为十进制数
printf("转换结果为:%s\n",str);
}else if(b==3){
itoa(sum,str,16); //用到itoa将该数转换为八进制数
printf("转换结果为:%s",str);
}else {
printf("无效选项\n");
goto choice;
}
}
void Shi(){//将十进制数转换为其他三种进制数
char str[100];
int b,i,length,sum;
input:
printf("请输入您需要转换的十进制数:\n");
scanf("%s",str);
length=strlen(str);
for(i=length-1;i>=0;i--){
if(str[i]<'0'||str[i]>'9'){
printf("请输入正确的十进制数\n");
goto input;
}
}
printf("请选择您要转换的进制\n");
choice :
printf("1.二进制 2.八进制 3.十六进制\n");
scanf("%d",&b);
for(i=0,sum=0;i<length;i++){ //将输入的数转换为十进制数
sum= sum*10+(str[i]-'0');
}
if(b==1){
itoa(sum,str,2); //用到itoa将该数转换为二进制数
printf("转换结果为:%s\n",str);
}else if(b==2){
itoa(sum,str,8); //用到itoa将该数转换为八进制数
printf("转换结果为:%s\n",str);
}else if(b==3){
itoa(sum,str,16); //用到itoa将该数转换为十六进制数
printf("转换结果为:%s",str);
}else {
printf("无效选项\n");
goto choice;
}
}
void Shiliu(){//将十六进制数转换为其他三种进制数
char str[128];
int b,i,j,length,sum;
input:
printf("请输入您要转换的十六进制的数:\n");
scanf("%s",str);
length=strlen(str);
for(i=length-1;i>=0;i--){
if(str[i]<'0' || (str[i]>'9' && str[i]<'A') || (str[i]>'F' && str[i]<'a')|| (str[i]>'f')){
printf("请输入正确的十六进制数\n");
goto input;
}
}
printf("请选择您要转换的进制\n");
choice:
printf("1.二进制 2.八进制 3.十进制\n");
scanf("%d",&b);
for(i=length-1,j=0,sum=0 ; i>=0 ; i--,j++){ //将输入的数转换为十进制数
if(str[i]>='0' && str[i]<='9'){
str[i] = str[i]-'0';
}else if(str[i]>='A' && str[i]<='F'){
str[i] = str[i]-'A'+10;
}else if(str[i]>='a' && str[i]<='f'){
str[i] = str[i]-'a'+10;
}
sum += (str[i]) * pow(16,j);
}
if(b==1){
itoa(sum,str,2); //用到itoa将该数转换为二进制数
printf("转换结果为:%s\n",str);
}else if(b==2){
itoa(sum,str,8); //用到itoa将该数转换为八进制数
printf("转换结果为:%s",str);
}else if(b==3){
itoa(sum,str,10); //用到itoa将该数转换为十进制数
printf("转换结果为:%s",str);
}else {
printf("无效选项\n");
goto choice;
}
}
1)以上代码实现了本文未实现的16进制的转换。通过if-else语句,根据数组中的各个位数的相应数据,以及ascii码中的转换实现16进制向10进制的转换。
2)本文使用录各位数字进入数字,再根据各进制之间的关系,通过简单计算得到,以上代码则将各个进制数转换成十进制数后借助itoa()函数直接得出相应结果,更加简单明了。
3)于用户角度而言,本文只通过一个选项和一个数字的输入,直接输出其他进制数。以上代码则是通过二次选择,分别是:输入数的进制形式以及需输出数的进制形式。前者步骤简单,输出内容较为多样,但不够直接。后者则更加精准,简明。
4)以上代码还通过goto语句,简单明了地实现了如若输入错误后的“重新输入”的步骤,使代码更加精炼,可读性强。
收获:
1)进制之间转换的计算方法和代码实现方式;
2)认识itoa()函数;以及goto()语句;
3)进一步认识到代码可读性的重要和程序的“对象性”,要更多从使用者的角度出发,在编写程序的过程中更多地考虑使用者地使用感受,例如各种错误输入的提示;
函数:
其最直观的作用就是使代码分块,精简主函数,使代码条理清晰,可读性强。
其次,在程序编写过程中,通过函数的反复调用,可以减少代码的重复步骤,简化程序的实现。
再次,在使用函数时,应该更多地注意到变量的使用范围,注意各函数之间的变量设置,避免不必要的数据混乱。
原文:https://www.cnblogs.com/dcftx/p/11831674.html