第二次作业
一、程序运行截图###
1、
2、
3、
4、
5、
二、函数介绍###
1、main:在此函数中,选择输入的进制数并输入该数,若输入的进制数不是二进制、八进制、十进制中的一个,直接输出error,若是,先判断该数是否合法,不合法,直接输出error,合法则选择要转化的进制数,调用相应函数
2、two(int x):将十进制转化为二进制
int two(int x)
{
int i,count;
for(i=0;x!=0;i++){
a[i]=x%2;
x=x/2;
count=i;
}
for(i=count;i>=0;i--)
printf("%d",a[i]);
}
3、eight(int x):将十进制转化为八进制
int eight(int x)
{
int i,count,digit;
for(i=0;x!=0;i++){
a[i]=x%8;
x=x/8;
count=i;
}
for(i=count;i>=0;i--)
printf("%d",a[i]);
}
4、to_ten(int x):将二进制或八进制转为十进制
int to_ten(int x)
{
int i,z,sum;
sum=0;
if(choice==2){
for(i=0;x!=0;i++){
z=x%2;
sum=sum+z*pow(2,i);
x=x/10;
}
return sum;
}//二进制转十进制
if(choice==8){
for(i=0;x!=0;i++){
z=x%8;
sum=sum+z*pow(8,i);
x=x/8;
}
return sum;
}//八进制转十进制
}
5、pow函数:在转十进制中发挥作用,与for循环配合,将每位的数字转为十进制的表达形式,逐步相加,得到它的十进制数;将数字字符型转化为整型
三、全局变量###
1、int choice:使输入的进制在所有函数中都起作用,在调用to_ten(int x)函数转十进制时可直接判断执行哪个操作
2、int a[1000]:使数组在two(int x)函数和eight(int x)函数中都可以用,无需定义两次,让代码更简洁,且利于逆序输出
四、main函数###
int main()
{
int j,x,y,t,flag;
flag=1;
printf("输入的进制数:");
scanf("%d",&choice);
switch(choice){
case 2:{
scanf("%d",&x);
y=x;
do{
j=y%10;
if(j==0||j==1) y=y/10;
else {
flag=0;
break;
}
}while(y!=0);//判断输入是否合法
if(flag==0){
printf("ERROR\n");
break;
}else{
printf("要转化成的进制数:");
scanf("%d",&t);
x=to_ten(x);
if(t==10) printf("%d",x);
if(t==8) eight(x);
break;
}
}
case 8:{
scanf("%d",&x);
y=x;
do{
j=y%10;
if(j>=0&&j<=7) y=y/10;
else {
flag=0;
break;
}
}while(y!=0);
if(flag==0){
printf("ERROR\n");
break;
}else{
printf("要转化成的进制数:");
scanf("%d",&t);
x=to_ten(x);
if(t==10) printf("%d",x);
if(t==2) two(x);
break;
}
}
case 10:{
int i,c,sum,a[1000];
c=sum=0;
i=0;
char s[1000];
scanf("%s",s);
for(i=0;s[i]!='\0';i++){
if(s[i]>='0'&&s[i]<='9'){
c++;
}
else {
flag=0;
break;
}
}//判断输入是否合法
if(flag==0){
printf("ERROR\n");
break;
}else{
for(i=0;i<c;i++){
a[i]=s[i]-'0';
sum=sum+a[i]*pow(10,c-1-i);
}//将数字字符型转化为整型
printf("要转化成的进制数:");
scanf("%d",&t);
if(t==8) eight(sum);
if(t==2) two(sum);
break;
}
}
default:printf("ERROR");break;//输入的进制数不属于二进制、八进制、十进制中的任意一个
}
return 0;
}
五、思维导图###
六、问题和解决方法###
1、输入八进制时用了%o,使判断输入的八进制是否合法时出错
解决方法:将%o改为%d
2、判断输入的十进制是否合法时出错,无法正确判断有字母出现的情况
解决方法:将数以字符串数组的形式输入,判断它们是否范围都在‘0’~‘9’之间,合法再将数字字符转为整型
七、代码互评(网络1913杨涛)###
int Tennum(char a[],int b)//将输入的数字转换为10进制数
{
int len, i, num;
int sum = 0;
len = strlen(a);//求字符长度
for (i = 0; i < len; i++)
{
if (a[i] >= '0' && a[i] <= '9')
{
num = a[i] - '0';
}
else if (a[i] >= 'A' && a[i] <= 'F')
{
num = a[i] - 'A' + 10;
}
sum = sum * b + num;
}
return sum;
}
1、杨同学直接调用库函数中的strlen求字符长度,代码更简洁;而我用for语句算出最后一个字符的下标
2、杨同学用字符串输入,用了一个函数就可以完成任意进制转为十进制;而我在这里没用字符串,而是对输入的数进行取余、相加、除法计算,且无法进行十六进制的转化
八、总结###
1、收获:熟悉了进制的转化;在需要逆序输出数字时,选择数组会方便一些;了解了字符型和整型之间的转化
2、函数理解:函数可提高代码的可读性;可在一个函数中调用其他的函数;若是两个函数之间有共同的变量,可以将该变量定义为全局变量,更方便简洁