do...while 循环中的 Switch 语句(值堆叠)
Switch statement within a do...while loop(values stacking)
我是一名学生,刚开始编程 4 周,我希望我能在这里 huehue 得到帮助。所以我正在制作一个程序,您可以在其中将十进制数转换为八进制数和二进制数,反之亦然。程序继续要求用户选择,直到他们选择字母 d 退出程序。该程序一开始似乎 运行 很好,但是当我尝试再次使用相同的字母和输入值时,输出似乎是从上次的输出堆叠而来,我猜没有覆盖(抱歉,如果我的术语或语法错了,我的英语不是很好)我需要改变什么?想不通呼呼呼
#include<stdio.h>
#include<math.h>
int main(){
int c, k, r=0, e=0, dec=0, o=0, place=1;
long n;
char choice, new, d;
do{
printf("Choices:\na. Decimal to binary and octal\nb. Octal to decimal and binary\nd. Exit.\n\n");
printf("enter your choice:\t");
printf("\n");
scanf(" %c", &choice);
switch(choice){
case 'A':
case 'a':
printf("Conversion: Decimal to binary and octal.\n");
printf("Enter number:\n");
scanf("%ld", &n);
printf("%ld is ", n);
for (c =28; c >= 0; c--){
k = n >> c;
if (k & 1)
printf("1");
else
printf("0");
}
printf(" in Binary Form. \n");
printf("%ld is ", n);
while (n != 0)
{
o=o+(n%8)*place;
n=n/8;
place=place*10;
}
printf("%ld in Octal Form.\n\n", o);
break;
case 'b':
case 'B':
printf("Conversion: Octal to decimal and binary.\n");
printf("Enter number:\n");
scanf("%ld", &n);
printf("%ld is ", n);
for (c =28; c >= 0; c--)
{
k = n >> c;
if (k & 1)
printf("1");
else
printf("0");
}
printf(" in Binary Form.\n", n, k);
printf("%ld is ", n);
while(n!=0)
{
r=n%10;
dec=dec+r*(pow (8, e));
n=n/10;
e++;
}
printf("%ld in Decimal Form.\n", dec);
default:
printf("Exit.\n\n");
break;
}
}while(choice == 'a'|| choice =='A'|| choice == 'b'|| choice =='B');
return 0;
}
如果我 运行 选择 'a' 的程序并输入 12,它 returns:
12 is 00000000000000000000000001100 in Binary Form.
12 is 14 in Octal Form.
如果我再做一次:
12 is 00000000000000000000000001100 in Binary Form.
12 is 1414 in Octal Form.
作为问题的一部分,您应该告诉我们这种详细程度。
最小(大概)修复是将您初始化的变量移动到循环中:
int main() {
char choice;
do {
int c, k, r=0, e=0, dec=0, o=0, place=1;
long n;
char new, d;
...
我移动了所有的声明,即使只需要移动已初始化的声明。这减少了变量的范围,这通常是一个好习惯。
这里有一些其他的建议:
你的开关和最后一个 while 循环检查同样的事情。如果改用 if-else if 循环,则可以使用 break 退出循环。另一个选项是设置一个 done
指标变量并在循环中检查它。
我还会规范化 choice
变量,即 choice = tolower(choice)
这样您就不必检查大小写了。
考虑在主循环中驱动i/o,然后调用一个函数returns主循环打印出的数据。
使用函数消除重复(即二进制算法应该是一个单独的函数)。
二进制算法看起来不对,btw,为什么要循环29次?你传递一个 long 可能是 64 位(至少它在我的系统上)。
您阅读(签名)很长时间但不处理负值。 @WeatherVane.
您读取的值 n 似乎未经过验证。应该能够键入 'a' 作为十进制或八进制值?或者 9 表示八进制值?与此相关,scanf()
可能会失败,因此请检查它 returns.
你说 'd' 退出但程序逻辑不是 'a' 或 'b'(小写或大写)退出。
格式对阅读您的代码的人很重要,因此请修复 for (c =28; c >= 0; c--){
的错误缩进。我还建议您使用制表符(或 8 个空格)。这将鼓励您尽量减少代码缩进的级别。
我是一名学生,刚开始编程 4 周,我希望我能在这里 huehue 得到帮助。所以我正在制作一个程序,您可以在其中将十进制数转换为八进制数和二进制数,反之亦然。程序继续要求用户选择,直到他们选择字母 d 退出程序。该程序一开始似乎 运行 很好,但是当我尝试再次使用相同的字母和输入值时,输出似乎是从上次的输出堆叠而来,我猜没有覆盖(抱歉,如果我的术语或语法错了,我的英语不是很好)我需要改变什么?想不通呼呼呼
#include<stdio.h>
#include<math.h>
int main(){
int c, k, r=0, e=0, dec=0, o=0, place=1;
long n;
char choice, new, d;
do{
printf("Choices:\na. Decimal to binary and octal\nb. Octal to decimal and binary\nd. Exit.\n\n");
printf("enter your choice:\t");
printf("\n");
scanf(" %c", &choice);
switch(choice){
case 'A':
case 'a':
printf("Conversion: Decimal to binary and octal.\n");
printf("Enter number:\n");
scanf("%ld", &n);
printf("%ld is ", n);
for (c =28; c >= 0; c--){
k = n >> c;
if (k & 1)
printf("1");
else
printf("0");
}
printf(" in Binary Form. \n");
printf("%ld is ", n);
while (n != 0)
{
o=o+(n%8)*place;
n=n/8;
place=place*10;
}
printf("%ld in Octal Form.\n\n", o);
break;
case 'b':
case 'B':
printf("Conversion: Octal to decimal and binary.\n");
printf("Enter number:\n");
scanf("%ld", &n);
printf("%ld is ", n);
for (c =28; c >= 0; c--)
{
k = n >> c;
if (k & 1)
printf("1");
else
printf("0");
}
printf(" in Binary Form.\n", n, k);
printf("%ld is ", n);
while(n!=0)
{
r=n%10;
dec=dec+r*(pow (8, e));
n=n/10;
e++;
}
printf("%ld in Decimal Form.\n", dec);
default:
printf("Exit.\n\n");
break;
}
}while(choice == 'a'|| choice =='A'|| choice == 'b'|| choice =='B');
return 0;
}
如果我 运行 选择 'a' 的程序并输入 12,它 returns:
12 is 00000000000000000000000001100 in Binary Form.
12 is 14 in Octal Form.
如果我再做一次:
12 is 00000000000000000000000001100 in Binary Form.
12 is 1414 in Octal Form.
作为问题的一部分,您应该告诉我们这种详细程度。
最小(大概)修复是将您初始化的变量移动到循环中:
int main() {
char choice;
do {
int c, k, r=0, e=0, dec=0, o=0, place=1;
long n;
char new, d;
...
我移动了所有的声明,即使只需要移动已初始化的声明。这减少了变量的范围,这通常是一个好习惯。
这里有一些其他的建议:
你的开关和最后一个 while 循环检查同样的事情。如果改用 if-else if 循环,则可以使用 break 退出循环。另一个选项是设置一个
done
指标变量并在循环中检查它。我还会规范化
choice
变量,即choice = tolower(choice)
这样您就不必检查大小写了。考虑在主循环中驱动i/o,然后调用一个函数returns主循环打印出的数据。
使用函数消除重复(即二进制算法应该是一个单独的函数)。
二进制算法看起来不对,btw,为什么要循环29次?你传递一个 long 可能是 64 位(至少它在我的系统上)。
您阅读(签名)很长时间但不处理负值。 @WeatherVane.
您读取的值 n 似乎未经过验证。应该能够键入 'a' 作为十进制或八进制值?或者 9 表示八进制值?与此相关,
scanf()
可能会失败,因此请检查它 returns.你说 'd' 退出但程序逻辑不是 'a' 或 'b'(小写或大写)退出。
格式对阅读您的代码的人很重要,因此请修复
for (c =28; c >= 0; c--){
的错误缩进。我还建议您使用制表符(或 8 个空格)。这将鼓励您尽量减少代码缩进的级别。