格式化某些字符,但对其他字符没问题

时间:2019-10-15 16:24:08

标签: c

我要写的这个计算器有几个问题。不能100%确定这是格式化还是其他格式。第一个问题是,在使用+和-,C(表示清除)和T(将累加器设置为以下数字)后,它将不会打印结果。在*和/上工作正常。 另一个问题是将所有输入保存到的数组打印。 对于某些输入来说,它工作得很好,但是格式却很奇怪。有些字符不会显示,而某些浮动则是错误的,而另一些则是正确的。我希望有人能为我清除它。

我尝试进行一些小的调整,但这已经达到我的目标。

int main(){
    float tall[STRLEN], input,
    akkumulator = 0.0;   
    char tegn[STRLEN], operator;
    int i = 0; 

    printf("Kalkulator\n");
    printf("= %f", akkumulator);
    do{ 

        i += 1; 
        printf("\n: ");
        scanf("%c", &operator); char check = toupper(operator); 
        scanf("%f", &input);

            switch (check){
                case '*':
                    akkumulator *= input;
                    tegn[i] = '*';
                    tall[i] = input;
                    printf("\n= %f", akkumulator);
                    break;
                case '+':
                    akkumulator += input;
                    tegn[i] = '+';
                    tall[i] = input;
                    printf("\n= %f", akkumulator);
                    break;
                case '-':
                    akkumulator -= input;
                    tegn[i] = '-';
                    tall[i] = input;
                    printf("\n= %f", akkumulator);
                    break;
                case '/':
                    akkumulator /= input;
                    tegn[i] = '/';
                    tall[i] = input;
                    printf("\n= %f", akkumulator);
                    break;
                case 'C':
                    akkumulator = 0.0;
                    tegn[i] = 'C';
                    tall[i] = input;
                    printf("\n= %f", akkumulator);
                    break;
                case 'T':
                    akkumulator = input;
                    tegn[i] = 'T';
                    tall[i] = input;
                    printf("\n= %f", akkumulator);
                    break;
                default:
                    break; 
            }

        if(tegn[i] == '/' && tall == 0)
            printf("\n You can not do that");  
        else if(operator == 'S')
            for(int y = 0; y<i; y++){
                printf("\n%2c %5f", tegn[y], tall[y]);
            }

    }while(operator != 'S');


    return 0;
}

1 个答案:

答案 0 :(得分:0)

在开始之前,在这种情况下,for循环比do while()循环有用得多。对于零除,您已经有case '/':,因此,最好将printf("\n You can not do that");放在switch中。

  1. 循环的开头有两个scanf(),这意味着您需要像这样输入
C
13.45

继续循环。而且,即使您输入了两个输入

C
45.23

,由于您的输入缓冲区,下一个用于运算符的scanf将获得\n。在getchar()之后添加scanf("%f", &input);将解决此问题。 最后,您的do while()循环的终止条件为operator != 'S',但operator仍为's',因为大写字母的变化是check,而不是operator。这就是即使您输入s计算器也不会结束的原因。

  1. 您将从i = 1开始将运算符和输入值保存在数组中,而从零开始打印数组。改变
for(int y = 0; y<i; y++){
    printf("\n%2c %5f", tegn[y], tall[y]);
}

进入

for(int y = 1; y <= i; y++){
    printf("\n%2c %5f", tegn[y], tall[y]);
}

将解决您的问题