C++,构造一个读取两个实数和一个字符的程序
Posted
技术标签:
【中文标题】C++,构造一个读取两个实数和一个字符的程序【英文标题】:C++, constructing a program that reads two real numbers and a character 【发布时间】:2016-09-27 17:27:22 【问题描述】:我正在尝试编写一个程序,该程序能够读取两个实数后跟用户输入的字符。然后程序将按字符评估这两个数字。该角色可以是我在下面列出的任何角色: 1. +(加法) 2.-(减法) 3. *(乘法) 4./(除法) 5. %(余数)
下面我发布了我编写的代码,只是为了检查打印出来的值是否正确:
#include<stdio.h>
int main()
float a,b,add,subtract,division,multiply,remainder;
char op;
printf("Enter two real numbers followed by one these characters:+, -, *, /, or % : ");
scanf("%f%f %c",&a,&b,&op);
printf("%.1f %c %.1f\n",a,op,b);
if (op=='+')
add = a + b;
printf("%f",add);
else if (op=='-')
subtract=a-b;
printf("%f",subtract);
else if (op=='/')
division=a/b;
printf("%f",division);
else if (op=='*')
multiply =a*b;
printf("%f",multiply);
else if (op=='%')
remainder=a%b;
printf("%f",remainder);
else
printf("invalid symbol");
return 0;
谁能告诉我为什么会出现运行时错误?
【问题讨论】:
请注意,如果可能,您应该将程序的输出作为文本而不是图片发布。图片中的字体很小,不那么容易阅读。 另外,您说您想读取 real 数字,但您使用的是int
类型的变量而不是 float
printf("%d %c %d",a,b,op);
-- 行为未定义,因为变量与格式字符串中描述的类型不匹配。下一次,使用std::cin
和std::cout
,而不是scanf
和printf
。
您的编辑基本上将您原来的问题变成了完全不同的东西。请发布一个单独的问题,而不是首先使解决原始问题的答案无效。另外,在后续问题中,请记住添加有关您如何使用该程序、它产生的错误以及它的输出等信息。我们无法猜测。
【参考方案1】:
问题在于您打印它的方式。您正在尝试将数字打印为 char 并将 char 打印为数字:
printf("%d %c %d",a,b,op);
我想你的意思是:
printf("%d %d %c",a,b,op);
所以它只是打印 b 的 ASCII 值,这会给你一个有趣的字符。
【讨论】:
这可能还不够。 OP 声称需要实数,但用于保存它们的变量是int
类型,这是不正确的。代码应该为此使用float
类型并相应地打印它们(即%f
)。
有办法解决吗?我想把它打印出来,因为稍后我想评估那条线。示例:用户输入“2 2 +”然后将其评估为“2+2”并打印总计
@Drew:你应该从更简单的开始。如果你想使用后缀符号来评估表达式,你需要使用堆栈和其他数据结构,我觉得你不熟悉。
@Drew,你可以在调用printf
时切换op
和b
。使用printf("%d %c %d",a, op, b);
@ray 是的,如果您可以指导我找到任何很棒的资源,我正在尝试自己学习这一点。【参考方案2】:
注意: OP 在最初的问题得到回答后显着改变了它,这正是本文所关注的内容,因此现在下面的答案可能看起来完全偏离目标。
如果有人能解释为什么我会看到不同的价值观,那将不胜感激。
您的代码存在多个问题。
-
程序的命令行输入必须正确转换为
float
类型,但它会将它们转换为int
s。您的scanf
应该使用"%f %f %c"
代替实数 数字而不是整数 数字;
IIRC 从您之前的图片来看,您对程序的实际输入如下所示:2 2 +
,但您的 scanf
表示 "%d%d %c"
(请注意格式字符串中缺少的空格与输入中的额外空格)
您的printf
函数调用需要将参数交换为printf("%f %c %f",a, op, b);
(注意使用"%f"
的格式字符串以及op
和b
变量的反转)
第 1 点基于为用户打印的文本,请求“真实”数字。
第 2 和第 3 点是罪魁祸首,因为当你在提示符下输入2 2 +
时,你的变量看起来是a = 2
、b = 2
和op = 43
,这是'+'
的数值字符。
当您打印它时,您最终会将 '+'
字符解释为一个整数,而您却得到了 43
。
您的程序的固定版本如下:
#include<stdio.h>
int main()
float a, b, result;
char op;
printf("%s", "Enter two real numbers followed an operator (+, -, *, /, %): ");
scanf("%f %f %c", &a, &b, &op);
switch(op)
case '+':
result = a + b;
break;
case '-':
result = a - b;
break;
case '*':
result = a * b;
break;
case '/':
/* make sure b != 0 */
result = a / b;
break;
case '%':
/* make sure b != 0 */
/* we type-cast to int because modulus is not defined for floats */
result = (float)((int)a % (int)b);
break;
default:
printf("%s\n", "Unknown operation");
break;
printf("%f %c %f = %f",a, op, b, result);
return 0;
它的用法和输出:
➜ /tmp ./test
Enter two real numbers followed an operator (+, -, *, /, %): 5 5 +
5.000000 + 5.000000 = 10.000000
➜ /tmp ./test
Enter two real numbers followed an operator (+, -, *, /, %): 5 5 *
5.000000 * 5.000000 = 25.000000%
➜ /tmp ./test
Enter two real numbers followed an operator (+, -, *, /, %): 5 5 /
5.000000 / 5.000000 = 1.000000%
➜ /tmp ./test
Enter two real numbers followed an operator (+, -, *, /, %): 10 5 %
10.000000 % 5.000000 = 0.000000%
➜ /tmp ./test
Enter two real numbers followed an operator (+, -, *, /, %): 5 10 %
5.000000 % 10.000000 = 5.000000%
➜ /tmp ./test
Enter two real numbers followed an operator (+, -, *, /, %): 8 5 -
8.000000 - 5.000000 = 3.000000
【讨论】:
@Drew:请注意,如果您正在尝试创建一个可以评估 any 后缀表达式的程序(例如2 2 + 8 * 6 + /
),那么您真的需要查看使用堆栈或更复杂的东西。
找余数怎么样?
@Drew:余数只适用于整数除法。如果要添加,请将所有类型和文本更改为 int
类型。见this answer
@Drew:我稍微更新了代码以涵盖其余部分,而无需您将所有内容都变成int
。正在使用的方法(您会看到(int)a
)称为类型转换。请注意,由于铸造忽略了小数部分,结果将更加近似。以上是关于C++,构造一个读取两个实数和一个字符的程序的主要内容,如果未能解决你的问题,请参考以下文章