第二次博客作业
一.运行截图
二.所有函数
int twoToten(int a)//定义求二进制转十进制
{
int c;
int sum = 0;
int i = 0;;
while (a != 0) {
c = a % 10;
sum = sum + pow(2, i) * c;//
a /= 10;
i++;
}
return sum;
}
这是一个二进制转换为十进制的函数,此函数用到了库pow,每一次循环时进行取余,然后在在除去个位,转换为十进制时从2的0次方开始相加,每一位数乘以它的对应次方直到i=0;
int eightTotwo(int a)//定义求八进制转二进制
{
int c;
int sum = 0;
int i = 0;
while (a != 0) {
c = a % 10;
sum = sum + pow(8, i) * c;
a /= 10;
i++;
}
return tenToeight(sum);//八进制转十进制在转二进制,引用十进制转二进制函数
}
这是求八进制转为二进制的函数。但直接从八进制转为二进制有点困难所以,我先用此函数求出十进制的的数,在调用int tenTotwo(int n)
就可以将八进制转为二进制了,
int tenTotwo(int a)//定义十进制转二进制
{
int item, ret;
int sum, count, result;
sum = count = result = 0;
while (a > 0)
{
item = a % 2;
a = a / 2;
sum = sum * 10 + item;//求二进制
count++;//计算位数
}
do {
ret = sum % 10;
result = result * 10 + ret;//逆序输出
sum = sum / 10;;
count--;
} while (count != 0);
return result;
}
这是一个十进制求二进制函数,第一个while循环求二进制的正序,第二个循环将正序逆序输出,从而得到真正的二进制数;
三,main函数
int main()
{
int n, a;
int w = 1;//进入循环的条件
printf("----------------------------------\n");//菜单
printf(" 进制转换器\n");
printf("注意:(1)本进制只支持二,八,十进制转换\n");
printf(" (2)本进制只支持正整数转换\n");
printf("----------------------------------\n");
printf("\n====请选择你的进制<===============\n");
printf(" 请选择相应的序号:\n");
printf("[2]二进制\n[8]八进制\n[10]十进制\n[0]退出 \n");
printf("==================================\n");
while(w)
{
printf("你的选择是:");
scanf("%d", &n);//输入序号
if (n == 2)
{
printf("你的二进制数:");
scanf("%d", &a);
printf("十进制:%d\n", twoToten(a));
printf("八进制:%o\n", twoToten(a));//十进制转成八进制
}
else if (n == 8)
{
printf("你的八进制数:");
scanf("%o", &a);
printf("二进制:%d\n", eightTotwo(a));
printf("十进制:%d\n", a);//用"%d"输出十进制
}
else if (n == 10)
{
printf("你的十进制数:");
scanf("%d", &a);
printf("二进制:%d\n", tenToeight(a));
printf("八进制:%o\n", a);//直接用"%o"就可以让十进制转成八进制
}
else if (n == 0)
{
printf("你已退出进制转换器...........");
break;
}
else
{
printf("亲,要输入正确的序号哦");//错误提示
}
}
return 0;
}
四,思维导图
五,问题
1:在函数调用时,出现了一些问题,就是形参和实参应用有些模糊,形参和实参一定要跟主函数相关联,尽量要一样.这样才能保证不错,
2,再编译程序时一定要先分别写使用的函数,这样出错就可以很快改善,
3,一定要先弄清楚进制转换,在编写程序,这样才能高效率的写代码,不然会很累
4,一定要写程序注释,这样才会使程序更加清楚明了,
六,代码互评
这是王昕同学的代码
void eightturn(int choice)
{
int n, i = 0, item, x, flag, result = 0;
do {
flag = 0;
printf("输入你要转换的数:\n");
scanf("%d", &n);
item = n;
while (item) {//判断输入进制
x = item % 10;
if (x > 9) {
printf("输入错误!!!请重新输入。\n");
flag = 1;
break;
}
item /= 10;
}
} while (flag == 1);
while (n != 0) {//转换成十进制
item = n % 10;
result = result + item * mypow(8, i);
i++;
n /= 10;
}
printf("转换的数:\n");
if (choice == 4) turntwo(result);//输出二进制
else if (choice == 5) printf("%d\n", result);
else printf("%x\n", result);
printf("感谢你的使用!");
}
点评:王昕同学的代码写的非常好,他先判定输入是不是八进制数,这个我一直都没想到,他用到了递归的方法,这个一直是我的弱项
我要向王昕同学学习,多请教;
七,总结
1,大作业不像平常的pta作业,一定要用心的去做,要多花时间,不要等快到结束之后在做,这样是不好,不但会让你心疲力竭,也不好
2,一定一定要向别人请教,不要害羞,不然会浪费大量的时间
3,对于函数,一直是一个难点,我认为最难的点在与函数的调用问题,因为稍不小心就会弄错,特别是和数组一起使用的时候;调用函数要进行必要的注释
不要弄错,不然很难改,最后一定要会设置断点,这会省大量的时间,我的总结结束,,