尝试从 getchar() 获取变量以将其值保留在简单的计算程序中

Posted

技术标签:

【中文标题】尝试从 getchar() 获取变量以将其值保留在简单的计算程序中【英文标题】:Trying to get a variable from getchar() to keep it's value in a simple calculation program 【发布时间】:2012-11-12 17:44:45 【问题描述】:

我正在学习 C,我正在尝试创建这个程序,它要求依次输入一个运算符(+、-、*、%)、一个数字,然后是另一个数字,使用 scanf、printf 和 getchar( )。当我最后询问操作员时,它可以工作,但我必须先与操作员联系。

这是我想出的有效代码(但不按顺序排列):

char operator;
int numbers[2];
int result;

printf("Enter the first number:");
scanf("%9d", &numbers[0]);
printf("Enter the second number:");
scanf("%9d", &numbers[1]);
printf("Enter operation:");
getchar();
operator = getchar();
if (operator == '+') 
result = numbers[0] + numbers[1];
 
else if (operator == '-') 
result = numbers[0] - numbers[1];

else if (operator == '*') 
result = numbers[0] * numbers[1];

else if (operator == '/') 
result = numbers[0] / numbers[1];

else 
result = 0;


printf("%d", result);

这是没有的代码:

printf("Enter operation:");
getchar();
char operator = getchar();
if (operator == '+') 
result = numbers[0] + numbers[1];
 
else if (operator == '-') 
result = numbers[0] - numbers[1];

else if (operator == '*') 
result = numbers[0] * numbers[1];

else if (operator == '/') 
result = numbers[0] / numbers[1];

else 
result = 0;

printf("Enter the first number:");
scanf("%9d", &numbers[0]);
printf("Enter the second number:");
scanf("%9d", &numbers[1]);

printf("%d", result);

这个给出一个随机变量。

如果代码不在块中,请原谅我,我已尽我所能按照说明进行操作。

【问题讨论】:

【参考方案1】:

赋值运算符的结果是“立即”计算的:表达式...

result = a + b;

...当ab 更改其值时,不会使result 更改其值。

这就是为什么你的第一个 sn-p 按计划工作,而你的第二个 sn-p 显示垃圾,因为你首先尝试计算一些垃圾值的一些二进制操作的结果(numbers 数组元素存储的内容 之前他们被分配了一些有用的东西),然后才尝试从用户那里获得一些输入。

关键是result 到目前为止已经有一些价值,而且这个价值不会改变 - 当然,除非你进行第二次分配。 )

修复这个程序很容易:只需将实际计算与输入部分分开即可。所以……

if (operator == '+') 
  result = numbers[0] + numbers[1];
 
else if (operator == '-') 
  result = numbers[0] - numbers[1];

else if (operator == '*') 
  result = numbers[0] * numbers[1];

else if (operator == '/') 
  result = numbers[0] / numbers[1];

else 
  result = 0;

... 将跟随所有printf/scanf 部分(显然打印结果的部分除外)。顺便说一句,您可以将switch 用于相同目的:

switch(operator) 
  case '+':
    result = numbers[0] + numbers[1]; break;
  case '-':
    result = numbers[0] - numbers[1]; break;
  case '*':
    result = numbers[0] * numbers[1]; break;
  case '/':
    result = numbers[0] / numbers[1]; break;
  default:
    result = 0;

【讨论】:

谢谢,这是有道理的。我只是想知道,什么是关于 c 的基本书籍,它会告诉我在变量具有值之后必须执行这样的操作? C 编程语言足够基础吗?我已经阅读了其中的一些内容,但我想知道我需要知道的所有内容都会被教授,因为它在一开始就说明它假设了一些知识。 嗯,K&R 书本身就是一个非常坚实的学习基础——不仅是 C 语言,还有一般的 CS。你只需要给自己一些时间……完全消化它,我可以说。 ) 关键是,像往常一样,练习和实验——修改你的代码,改变它的一小部分,看看它会有什么不同,在我看来,这是学习 CS 的最佳方式。 至于变量存储关系而不是值的整个想法 - 好吧,你绝对不是一个人:事实上,名为reactive programming 的整个范式都是围绕它构建的。 )【参考方案2】:

在第二部分中,您还没有读取 2 个数字的值,但您正在对它们进行操作。

顺便说一句:

而不是全部

if (operation == '+') 
// etc

你可以查看 switch 语句。

switch(operator) 
   case '+'
       number[0] + number[1];
       break;
   // etc

【讨论】:

【参考方案3】:

你好像有一个额外的电话给getchar()

printf("Enter operation:");
getchar();
char operator = getchar();

应该是

printf("Enter operation:");
char operator = getchar();

否则您可能会错过运算符,并且您需要在进行数学运算之前先阅读数字。

【讨论】:

以上是关于尝试从 getchar() 获取变量以将其值保留在简单的计算程序中的主要内容,如果未能解决你的问题,请参考以下文章

如何从具有特定值的变量和数据库中获取数据以将其计入laravel上的图表

PHP GD - 水平居中对齐文本并减小字体大小以将其保留在图像内

VB.net 获取标量以将值保存到变量

Angular - JSX 和模板文字中的转义变量以将其用作参数

Laravel - 从 JSON 数组创建对象以将其保存在 SQL 数据库中

从 WebForms 中的 Query 获取指定值