第二次博客园作业
一、进制转换器
1、
3、函数介绍:
a.主函数:
int main()
{
int c,k;
int sign=0;
printf("请输入你要转换的进制与转换后的进制(用十进制数字表示,中间用空格隔开):\n");
scanf("%d%d",&M,&N);
/*判断输入的进制是否能进行转换*/
do{
c=(M==2&&N==8)||(M==2&&N==10)||(M==8&&N==2)||(M==8&&N==10)||(M==10&&N==2)||(M==10&&N==8);
if(c!=1){
printf("输入的进制暂时无法实现转换,请重新输入2、8或10:\n");
scanf("%d%d",&M,&N);
}
}while(c!=1);
printf("请输入你要转换的值:\n");
scanf("%d",&X);
if(M==2){
if(N==8){
printf("转换值为0%d",change2to8(X)); /*输出八进制格式*/
}else if(N==10){
printf("转换值为%d",change2to10(X)); /*输出十进制格式*/
}
}else if(M==8){
intermediate=change8to10(X);
if(N==10){
printf("转换值为%d",intermediate);
/*输出十进制格式*/
}else printf("转换值为%d",change10to2(intermediate));
/*输出二进制格式*/
}else if(M==10){
intermediate=change10to2(X);
if(N==8){
printf("转换值为0%d",change2to8(intermediate));
/*输出八进制格式*/
}else printf("转换值为%d",intermediate);
/*输出二进制格式*/
}
}
函数功能:将输入的十进制、二进制或八进制转换为确定的任意其他两种进制格式。
b.二进制转八进制函数:
int change2to8(int a)
{
int i=0,sum=0;
int b[3]; /*定义一个数组存放转换为一位八进制的二进制的三位数*/
int n=0; /*定义n用于循环,i用于统计位数,sum用于算总和*/
int d;
/*以下do-while循环运用去掉位数的方法进行循环*/
do{
for(n=0;n<3;n++){
b[n]=a%10;
a=a/10;
}
d=b[0]*1+b[1]*2+b[2]*4; /*用三位二进制数转换为一位八进制*/
sum=sum+d*pow(10,i); /*因为该算法是从右往左算,所以若要正确输出,则需加大循环后面的数的位数*/
i++;
}while(a!=0);
return sum;
}
函数功能:将输入值转换为八进制格式。
c.二进制转十进制函数:
int change2to10(int a)
{
int b;
int i=0,sum=0;
do{
b=a%10;
sum=sum+b*pow(2,i);/*按二进制定义来转换为十进制*/
i++;
a=a/10;
}while(a!=0);
return sum;
}
函数功能:将输入值转换为十进制格式。
d.八进制转十进制函数:
int change8to10(int a)
{
int b;
int i=0,sum=0;
do{
b=a%10;
sum=sum+b*pow(8,i);/*根据定义进行转换*/
i++;
a=a/10;
}while(a!=0);
return sum;
}
函数功能:将输入值转换为十进制格式。
e.十进制转换为二进制函数:
int change10to2(int a)
{
int b;
int i=0,sum=0;
do{
b=a%2;/*根据除二相余法来转换*/
sum=sum+b*pow(10,i);
i++;
a=a/2;
}while(a!=0);
return sum;
}
h.全局变量:
int M,N,X,intermediate; /*定义M,N来确定要转换的两种进制,定义X来存放输入值,定义intermediate来存放中间值*/
char s[1000]; /*定义字符数组来存放每位数*/
4、该进制转换器的main函数:
int main()
{
int c,k;
int sign=0;
printf("请输入你要转换的进制与转换后的进制(用十进制数字表示,中间用空格隔开):\n");
scanf("%d%d",&M,&N);
do{
c=(M==2&&N==8)||(M==2&&N==10)||(M==8&&N==2)||(M==8&&N==10)||(M==10&&N==2)||(M==10&&N==8);
if(c!=1){
printf("输入的进制暂时无法实现转换,请重新输入2、8或10:\n");
scanf("%d%d",&M,&N);
}
}while(c!=1);
printf("请输入数值:\n");
scanf("%d",&X);
if(M==2){
if(N==8){
printf("转换值为0%d",change2to8(X));
}else printf("转换值为%d",change2to10(X));
}else if(M==8){
intermediate=change8to10(X);
if(N==10){
printf("转换值为%d",intermediate);
}else printf("转换值为%d",change10to2(intermediate));
}else if(M==10){
intermediate=change10to2(X);
if(N==8){
printf("转换值为0%d",change2to8(intermediate));
}else printf("转换值为%d",intermediate);
}
}
5、
6、遇到的问题:
a.不知如何将三位二进制转换为一位八进制并输出:
解决方法:利用数组存放数据进行三位三位循环存为一位数;
联想输出逆序数的方法利用循环与数学函数与乘10的方法依次扩大已求数的位数。
b.不知如何从八进制转换为二进制:
原先代码:
int change8to2(int a)
{
int b[3];
int c;
int n=2,sum=0,d=0,i=0;
do{
c=a%10;
for(n=2;n>=0;n--){
b[n]=c/pow(2,n);
c=c-pow(2,n);
d=d+b[n]*pow(10,n);
}
a=a/10;
sum=sum+d*pow(10,3i);
i++;
}while(a!=0);
return sum;
}
若按照此代码,若c为2或1等小的数,则输出的为负数,而若用递增数列,又不知道该如何扩大位数。
解决方法:将该函数功能改为由八进制转换为十进制,再根据其他函数进行转换。
c.输入输出符号转换:
原本函数:
#include<stdio.h>
#include<math.h>
int change2to8(int a);
int change2to10(int a);
int change8to2(int a);
int change10to2(int a);
int judge8(char a);
int judge10(char a);
int M,N,X,intermediate;
char s[1000];
int i=0,k;
int main()
{
printf("请输入你要转换的进制与转换后的进制(用十进制数字表示,中间用空格隔开):\n");
scanf("%d%d",&M,&N);
while(M!=2||M!=8||M!=16||M!=10||N!=2||N!=8||N!=16||N!=10){
printf("输入的进制暂时无法实现转换,请重新输入2、8或10:\n");
scanf("%d%d",&M,&N);
}
printf("请输入你要转换的值:");
while((s[i]=getchar())!='\n'){
i++;
}
s[i]='\0';
k=i;
if(M==2){
for(i=0;i<k;i++){
while(s[i]<0||s[i]>1){
printf("输入的数值进制错误,请重新输入:\n");
while((s[i]=getchar())!='\n'){
i++;
}
s[i]='\0';
}
}
printf("请再输入一遍数值:\n");
scanf("%d",&X);
if(N==8){
printf("0%o",change2to8(X)); /*输出八进制格式*/
}else if(N==10){
printf("%d",change2to10(X)); /*输出十进制格式*/
}
}else if(M==8){
for(i=0;i<k;i++){
while(judge8(s[0])==0||s[i]<0||s[i]>7){
printf("输入的数值进制错误,请重新输入:\n");
while((s[i]=getchar())!='\n'){
i++;
}
s[i]='\0';
}
}
printf("请再输入一遍数值:\n");
scanf("%o",&X);
intermediate=change8to2(X);
if(N==10){
printf("%d",change2to10(intermediate));
}else printf("%d",intermediate);
}else if(M==10){
for(i=0;i<k;i++){
while(judge10(s[0])==0||s[i]<0||s[i]>9){
printf("输入的数值进制错误,请重新输入:\n");
while((s[i]=getchar())!='\n'){
i++;
}
s[i]='\0';
}
}
printf("请再输入一遍数值:\n");
scanf("%d",&X);
intermediate=change10to2(X);
if(N==8){
printf("0%o",change2to8(intermediate));
}else printf("%d",intermediate);
}
}
因为若用符号,则编译器会自动准换为该对应进制,与所编程序输出不同。
解决方法:均用%d输入输出。
二、代码互评
int char_to_num(char a)
{
if (a >= '0' && a <= '9')
return a - '0';
else
return a - 'A' + 10;
}//该函数用于将字符转换成相应的数字
char num_to_char(int num)
{
if (num >= 0 && num <= 9)
return (char)('0' + num - 0);
else
return (char)('A' + num - 10);
}//该函数用于将数字转成相应的字符
int decimal(char n[], int before)
{
int Decimal = 0;
int length;
int i;
for (i = 0; n[i] != '\0'; i++);
length = i;
for (i = 0; i <= length - 1; i++)
Decimal = (Decimal * before) + char_to_num(n[i]);
return Decimal;
}//该函数用于将其他进制数统一转换成十进制数
int Toafter(char n[], int Decimal, int after)
{
int i = 0;
while (Decimal)
{
n[i] = num_to_char(Decimal % after);
Decimal /= after;
i++;
}
n[i] = '\0';
return i;
}//该函数用于将转化后的十进制数转化换成所需要的进制数
代码来源:李欣欣
评论:
这位同学写的自定义函数,可直接一次性实现任意进制转换,更适用于任意所有进制的进制转换。
三、总结
1.收获:
a.关于写代码:
体验到了直接设计一个程序的困难,直观体会到了未来可能所从事工作的一些点内容,直观感受到了自己的不足,例如考虑问题不全面,在写程序前不思考,不仔细看清楚要求等问题。
b.关于代码:
·有时循环条件可以一起用,可以减炼代码。
·需要判断的条件的输出值与代入下方程序的值需要分辨清楚。
2.函数:
实现某个设定功能的工具,只要有设定,可以在程序任何可执行地方使用。