一、博客内容
1.运行截图
正常运行的截图(其他情况与此类似,就不一一贴出了):
存在输入错误时的截图(其他格式不规范或者输入正常的情况与此类似,也不一一贴出了):
2.额外扩展的功能
十六进制与其他三种进制的互相转换:
当你要输入一个二进制(或者其他进制)的数时,你输入的却不是该进制的数或者输入错误字符,会得到一个错误提示并让你重新输入,运行情况如上面第二张图;
当你要选择需要转换的数字是几进制时,如1.二进制 2.八进制 3.十进制 4.十六进制,若输入除了1~4以外的数字就会有一个错误提示并让你重新选择,运行结果如上面第二张图;
当你要选择想把数字转换成几进制时,如二进制转其他进制 1.八进制 2.十进制 3.十六进制,若输入除了1~3以外的数字就会有一个错误提示并让你重新选择,效果如上面第二张图;
3.介绍函数
所有函数的声明:
二进制转其他进制的函数:
void erjinzhi(void);
void erjinzhi(void){
char number[128];
int t2,i,j,length,sum=0;
input:
printf("请输入想要转换的数:\n");
scanf("%s",number);
length=strlen(number);
for(i=length-1;i>=0;i--){
if(number[i]!='0' && number[i]!='1'){
printf("您输入的数并不是二进制数,请重新输入\n");
goto input;
}
}
printf("您想转换成几进制的数?\n");
choice :
printf("1.八进制 2.十进制 3.十六进制\n");
scanf("%d",&t2);
for(i=length-1,j=0,sum=0;i>=0;i--,j++){
sum += (number[i]-'0') * pow(2,j);
}
if(t2==1){
printf("%o",sum);
}else if(t2==2){
printf("%d",sum);
}else if(t2==3){
printf("%x",sum);
}else{
printf("输入错误,请重新选择想要转换的进制\n");
goto choice;
}
}
先把二进制数转换成十进制数,再用%o输出八进制数,用%d输出十进制数,用%x输出十六进制数。
八进制转其他进制的函数:
void bajinzhi(void);
void bajinzhi(void){
char number[128];
int t2,i,j,length,sum;
input:
printf("请输入想要转换的数:\n");
scanf("%s",number);
length=strlen(number);
for(i=length-1;i>=0;i--){
if(number[i]<'0' || number[i]>'7'){
printf("您输入的数并不是八进制数,请重新输入\n");
goto input;
}
}
printf("您想转换成几进制的数?\n");
choice:
printf("1.二进制 2.十进制 3.十六进制\n");
scanf("%d",&t2);
for(i=length-1,j=0,sum=0 ; i>=0 ; i--,j++){
sum += (number[i]-'0') * pow(8,j);
}
if(t2==1){
int n[100];
i=0;
while(sum>0){
n[i]=sum%2;
sum/=2;
i++;
}
for(j=i-1;j>=0;j--){
printf("%d",n[j]);
}
}else if(t2==2){
printf("%d",sum);
}else if(t2==3){
printf("%x",sum);
}else{
printf("输入错误,请重新选择想要转换的进制\n");
goto choice;
}
}
先把八进制数转换成十进制数,然后利用数组把十进制数转换成二进制数并输出,再用%d输出十进制数,用%x输出十六进制数。
十进制转其他进制的函数:
void shijinzhi(void);
void shijinzhi(void){
char number[128];
int t2,i,j,length,sum;
input:
printf("请输入想要转换的数:\n");
scanf("%s",number);
length=strlen(number);
for(i=length-1;i>=0;i--){
if(number[i]<'0' || number[i]>'9'){
printf("您输入的数并不是十进制数,请重新输入\n");
goto input;
}
}
printf("您想转换成几进制的数?\n");
choice:
printf("1.二进制 2.八进制 3.十六进制\n");
scanf("%d",&t2);
for(i=0,sum=0;i<length;i++){
sum= sum*10+(number[i]-'0');
}
if(t2==1){
int n[100];
i=0;
while(sum>0){
n[i]=sum%2;
sum/=2;
i++;
}
for(j=i-1;j>=0;j--){
printf("%d",n[j]);
}
}else if(t2==2){
printf("%o",sum);
}else if(t2==3){
printf("%x",sum);
}else{
printf("输入错误,请重新选择想要转换的进制\n");
goto choice;
}
}
利用数组把十进制数转换成二进制数并输出,再用%o输出八进制数,用%x输出十六进制数。
十六进制转其他进制的函数:
void shiliujinzhi(void);
void shiliujinzhi(void){
char number[128];
int t2,i,j,length,sum;
input:
printf("请输入想要转换的数:\n");
scanf("%s",number);
length=strlen(number);
for(i=length-1;i>=0;i--){
if(number[i]<'0' || (number[i]>'9' && number[i]<'A') || (number[i]>'F' && number[i]<'a')|| (number[i]>'f')){
printf("您输入的数并不是十六进制数,请重新输入\n");
goto input;
}
}
printf("您想转换成几进制的数?\n");
choice:
printf("1.二进制 2.八进制 3.十进制\n");
scanf("%d",&t2);
for(i=length-1,j=0,sum=0 ; i>=0 ; i--,j++){
if(number[i]>='0' && number[i]<='9'){
number[i] = number[i]-'0';
}else if(number[i]>='A' && number[i]<='F'){
number[i] = number[i]-'A'+10;
}else if(number[i]>='a' && number[i]<='f'){
number[i] = number[i]-'a'+10;
}
sum += (number[i]) * pow(16,j);
}
if(t2==1){
int n[100];
i=0;
while(sum>0){
n[i]=sum%2;
sum/=2;
i++;
}
for(j=i-1;j>=0;j--){
printf("%d",n[j]);
}
}else if(t2==2){
printf("%o",sum);
}else if(t2==3){
printf("%d",sum);
}else{
printf("输入错误,请重新选择想要转换的进制\n");
goto choice;
}
}
先把十六进制数转换成十进制数,然后利用数组把十进制数转换成二进制数并输出,再用%o输出八进制数,用%d输出十进制数。
4.main函数
#include<stdio.h>
#include<string.h>
#include<math.h>
void erjinzhi(void);
void bajinzhi(void);
void shijinzhi(void);
void shiliujinzhi(void);
int main(){
int t1;//t1,t2是用来判断用户想要是输入和输出的是几进制的数,length是输入的字符串的长度;
printf("请问您输入的是几进制的数?\n");
select:
printf("1.二进制 2.八进制 3.十进制 4.十六进制\n");
scanf("%d",&t1);
if(t1==1){
erjinzhi();
}else if(t1==2){
bajinzhi();
}else if(t1==3){
shijinzhi();
}else if(t1==4){
shiliujinzhi();
}else{
printf("输入错误,请重新选择进制\n");
goto select;
}
return 0;
}
5.用思维导图来表示程序中函数的关系
6.在完成本次作业过程中遇到的问题,如何解决的:
(1)关于如何读入数值,一开始想的是直接用scanf("%d",&number);读进来,但是十六进制不能这么读入,就都改成用scanf("%s",number)读入字符串。
(2)如何计算字符串的长度,本来想用循环计数,读到'\0'就结束,后来直接用了strlen函数得出字符串长度。
(3)怎么把字符串传递到函数中?百度了这个写法void erjinzhi(char*number) 。但是因为goto只能在同一个函数内用,所以还是改成在每个进制转换的函数里读入字符串,而不是在main函数里读入。
(4)关于错误提示,写完错误提示之后应该让用户再输入一次,本来想用循环,但是想了想还是用goto比较方便。goto虽然会使程序的可读性变得更差,但是现在看来还是蛮好用的。
二、代码互评
void Numchange(int m, int b)//将10进制数转化为任意进制数
{
int n = m;
int count = 0;
if (m == 0) printf("0");
while (n != 0)
{
n = n / b;
count++;
}
int number;
for (int i = count; i >= 1; i--)
{
number = m / (int)pow(b, i - 1);
if (number < 10) {
printf("%d", number);
}
else {
printf("%c", number + 55);
}
m = m % (int)pow(b, i - 1);
}
}