gpt4 book ai didi

c - 使用有限的工具、没有数组和库函数评估简单的数学表达式

转载 作者:行者123 更新时间:2023-12-03 15:47:59 24 4
gpt4 key购买 nike

这是我大学去年第一次“编程入门”考试中的一个问题:

Using the getchar() function read an input sequence consisting ofnumbers, + and - signs. The output should be the result of thosearithmetical operations.


例如,如果输入是 10+13-12+25-5+100 ,输出应该是 131 .
现在,鉴于我在参加大学之前有一点 C 经验,使用指针、数组等似乎很容易解决这个问题。
但这里有一个问题: 在考试中,您只能使用学生目前学到的东西。 鉴于此考试仅在学年开始后一个月,您的选择相当有限。
您只能使用变量、基本输入/输出内容、运算符(逻辑和按位)、条件语句和循环、函数。
这意味着不:数组、字符串、指针、递归、结构或基本上任何其他使这变得容易的东西。
我他妈的怎么做?今天是我第二次花了 3 个小时试图解决这个问题。我已经成功解决了它,但只有在“作弊”并使用数组、字符串函数( strtol )和指针之后。知道如何通过规则解决它对我来说很重要,因为我将在即将到来的考试中遇到类似的问题。
编辑:到目前为止,我的尝试是将 while 循环与 getchar() 结合使用。用于输入,之后我就卡住了。如果不使用更多“工具”,我对我应该做什么没有丝毫的想法。

最佳答案

解决方案非常简单,但对于初学者来说可能并不明显。我不会提供一个完整的程序,而是仅用几个变量来概述实现它所需的步骤。
首先,重要的是要注意两件事:

  • 您的输入只能包含 -+ 或任何数字 ( 0123456789 ) 之一。
  • getchar() 函数一次读取输入的一个字符,并在输入结束或发生错误时返回 EOF

  • 现在,进入解决方案:
  • 从循环中一次读取一个字符开始。只有在输入结束或发生错误时才会停止:
    int c;

    while ((c = getchar()) != EOF) {
    // logic here
    }
  • 从设置为 0 的累加器开始,并在每次遇到数字时“添加”数字。
    // outside the loop
    int acc = 0;

    // inside the loop
    if (/* c is a digit */)
    acc = acc * 10 + (c = '0');
    提示: /* c is a digit */ 条件可能并不简单,您可以将其放入 else- 检查的 + 中。
  • 每次遇到 -+ 时,记住操作,每次遇到操作符时,先执行上一个操作并重置累加器。
    // outside the loop
    int op = 0;
    int result = 0;

    // inside the loop
    if (c == '+' || c == '-') {
    if (op) {
    // there already is a previous operation to complete, do it
    if (op == '+')
    result += acc;
    else
    result -= acc;
    } else {
    // first operation encountered, don't do anything yet
    result = acc;
    }

    acc = 0; // reset
    op = c; // remember the current operation for the future
    }
  • 当您到达输入的末尾(即退出循环)时,执行最后一个操作(与第 3 点的 if 内的逻辑相同)。
  • 输出结果:
    你通常会写这样的东西:
    printf("%d\n", result);
    但是,如果您不能使用字符串文字 ( "%d\n" ) 或 printf() 函数,则必须使用 putchar() 手动执行此操作。这基本上与我们之前将数字扫描到累加器中所做的相反。
  • 如果需要,先打印符号,并将值设为正:
    if (result < 0) {
    putchar('-');
    result = -result;
    }
  • 找出小于您的数字的 10 的最大幂:
    int div = 1;

    while (result / div / 10)
    div *= 10;
  • 使用幂来提取和打印每个数字的除法和模以 10:
    while (div) {
    putchar('0' + ((result / div) % 10));
    div /= 10;
    }
    注意:开头的 '0' + 用于将数字(从 0 到 10)转换为相关的 ASCII 字符。
  • 以换行符结尾:
    putchar('\n');

  • 关于c - 使用有限的工具、没有数组和库函数评估简单的数学表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64596361/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com