编程计算器程序时,我遇到了两个绊脚石。虽然我从计算器中得到了正确的结果并且正确地打印了加法,减法和乘法,但我只是打印?
符号来得到除法的结果。请参考下面的代码。
static void calculate(int *val1, int *val2, char *op){
float a = *val1;
float b = *val2;
float c = a/b;
/*
A stands for addition, B for sub, C for mul, D for div
I have already verified that the right operation is being
performed
*/
if(strcmp(op,"A")==0)
{
printf("%i \n\r", *val1+*val2);
}else if(strcmp(op,"B")==0)
{
printf("%i \n\r", *val1-*val2);
}else if(strcmp(op,"C")==0)
{
printf("%i \n\r", *val1 * *val2);
}else if(strcmp(op,"D")==0)
{
printf("%f \n\r", c);
}
}
我使用真实术语来打印我的atmega 32微控制器的结果。
在调试器中,我确认当用户选择的操作是分区“D”时浮点c具有正确的值,但它似乎没有与之关联的小数点,尽管它是浮点数。
第二个问题:
我想知道我是否可以使用这样的字符数组(字符串):
//please note that below I am just simulating user keystrokes on a keypad attached to a
//microcontroller just for simplifying the problem.
char a[20] = {1,2,3,4,5,\n};
FILE keypad_str = FDEV_SETUP_STREAM(NULL, a, _FDEV_SETUP_READ);
我上面尝试的是尝试制定一项策略,让我能够立即打印出每个用户键,而不是keypad_str
stdin
然后打印出整个字符串用户在屏幕上输入的命令。
答案 0 :(得分:2)
在进行除法之前,您不会检查除以零。
即使操作是加法或减法或乘法,也不清楚为什么总是进行除法。你应该只在必要时进行分工:
else if (strcmp(op, "D")==0)
{
float a = *val1;
float b = *val2;
if (*val2 == 0)
printf("Divide by zero error\n");
else
{
float c = a / b;
printf("%f\n", c);
}
}
我已将变量c
保留到位,因为它可以更轻松地调试值。
这些都不能解释问号输出。
(你是否必须告诉Atmega 32微控制器上的C编译器是否包含对库中浮点的支持?这可能是问号所在。)
我会选择字符串"+"
,"-"
,"*"
和"/"
作为操作的助记符;我不打算用评论来解释这些操作意味着什么。
通常,您不会在格式中包含回车符。当你这样做时,它通常在换行符之前,而不是在换行符之前。还不清楚为什么要在输出行的末尾留空。
关于FDEV_SETUP_STREAM()的一些问题需要我没有的知识。
但是,C编译器应该告诉你:
char a[20] = {1,2,3,4,5,\n};
无效。你可能意味着其中任何一个;它们都是有效的,但却有所不同:
char a[20] = { 1, 2, 3, 4, 5, '\n' };
char a[20] = { '1', '2', '3', '4', '5', '\n' };
上面的初始化程序可以缩写为:
char a[20] = "\001\002\003\004\005\n";
char a[20] = "12345\n";
这强调了差异(并且不,双重零并非严格必要,但有助于说明这一点。)
答案 1 :(得分:1)
对于您的问题-1,存在多个问题,因此我将您的程序重新编写到以下
中#include <stdio.h>
static void calculate(int val1, int val2, char op)
{
switch(op) {
case 'A':
printf("%d+%d = %d \n", val1, val2, val1 + val2);
break;
case 'B':
printf("%d-%d = %d \n", val1, val2, val1 - val2);
break;
case 'C':
printf("%d*%d = %d \n", val1, val2, val1 * val2);
break;
case 'D':
if (val2 == 0) {
printf("can't divide by 0\n");
break;
}
printf("%d/%d = %.2f \n", val1, val2, (float)val1/(float)val2);
break;
default:
break;
}
return;
}
int main(void)
{
int a = 10, b = 20;
char op = 'D';
calculate(a, b, op);
op = 'A';
calculate(a, b, op);
return 0;
}
输出:
$ ./a.out
10/20 = 0.50
10+20 = 30
$
W.r.t question-2:
char a[20] = {1,2,3,4,5,\n};
无效,实际上应该如下
char a[20] = {'1', '2', '3', '4', '5', '\n'};