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::cinstd::cout,而不是scanfprintf 您的编辑基本上将您原来的问题变成了完全不同的东西。请发布一个单独的问题,而不是首先使解决原始问题的答案无效。另外,在后续问题中,请记住添加有关您如何使用该程序、它产生的错误以及它的输出等信息。我们无法猜测。 【参考方案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时切换opb。使用printf("%d %c %d",a, op, b); @ray 是的,如果您可以指导我找到任何很棒的资源,我正在尝试自己学习这一点。【参考方案2】:

注意: OP 在最初的问题得到回答后显着改变了它,这正是本文所关注的内容,因此现在下面的答案可能看起来完全偏离目标。


如果有人能解释为什么我会看到不同的价值观,那将不胜感激。

您的代码存在多个问题。

    程序的命令行输入必须正确转换为float 类型,但它会将它们转换为ints。您的scanf 应该使用"%f %f %c" 代替实数 数字而不是整数 数字; IIRC 从您之前的图片来看,您对程序的实际输入如下所示:2 2 +,但您的 scanf 表示 "%d%d %c"(请注意格式字符串中缺少的空格与输入中的额外空格) 您的printf 函数调用需要将参数交换为printf("%f %c %f",a, op, b);(注意使用"%f" 的格式字符串以及opb 变量的反转)

第 1 点基于为用户打印的文本,请求“真实”数字。

第 2 和第 3 点是罪魁祸首,因为当你在提示符下输入2 2 + 时,你的变量看起来是a = 2b = 2op = 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++,构造一个读取两个实数和一个字符的程序的主要内容,如果未能解决你的问题,请参考以下文章

C++定义一个复数类Complex,包括实数部分real和虚数部分imaginary两个私有数据成员

c++和c#之间的共享内存同步

无法在Fortran中读取未知长度字符串的实数

如何在 C++ 中将文件中的段落作为单个字符串读取

C++ 读取字符串分段错误

从字符串 C++ 中读取单词,同时忽略空格、数字和符号。