用c语言构建计算器可以使用以前的结果

ercv8c1e  于 2022-12-17  发布在  其他
关注(0)|答案(1)|浏览(130)

我得到了这个计算器的问题,我需要使用以前的运算结果(如果我想),但当我这样做,它给出正确的,如果只给它相同的以前的运算
下面是代码:

#include<stdio.h>
#include<math.h>

double addition (double a, double b)
{ 
    double add;
    add=a+b;
    return add;
    
}
double soustraction (double a, double b)
{
    double sous;
    sous=a-b;
    return sous;
}
double multiplication (double a,double b)
{
    double multi;
    multi=a*b;
    return multi;
}
double division (double a, double b)
{
    double div;
    div=a/b;
    return div;
}
double reste_de_division (int a,int b)
{
    double rest;
    rest=a%b;
    return rest;    
}
double puissance( double a,double b)
{
     int i;
     double r;
 
    i = 0;
    r = 1;
 
    while (i < b){
        r = r * a;
        i ++;
    }
 
    return r;
}
double factorielle (double a)
{
    int i;
    double facto;
    facto=1;
    for(i=0;i<a;i++)
    {facto=(a-i)*facto;
    }
    return facto;
}
double PGCD (int a,int b)
{
    int i;
    double pgcd;
    for(i=1; i <= a && i <= b; ++i)
    {
        if(a%i==0 && b%i==0)
            pgcd = i;
    }
    return pgcd;
}
double PPCM (int a,int b)
{
    int ppcm;
    ppcm = (a > b) ? a : b;
    while(ppcm%a !=0 || ppcm%b !=0)
    ppcm=ppcm+1;
    return ppcm;
}
double inverse (double a)
{
    double inv;
    inv=1/a;
    return inv;
}

int main(){
    
    double a,b,r;
    char ch;
    printf("\n***************************************\n");
    printf (" \n + Addition  \t \t - Subtraction \n * Multiplication \t / Division \n  Reste de division \t  c Puissance \n ! Factorielle \t \t g PGCD \n p PPCM \t \t i Inverse \n q Quitter \n");
    printf("\n***************************************\n");
    printf("Donner les deux nombres et l'operation:\n");
    do
    {b=r;   
    scanf("%lf %lf %c",&a,&b,&ch);
    switch (ch)
    {case '+':
        r=addition(a,b);
        printf("%lf\n",r);
        break;
    case '-':
        r=soustraction(a,b);
        printf("%lf\n",r);
        break;
    case '*':
        r=multiplication(a,b);
        printf("%lf\n",r);
        break;
    case '/':
        r=division(a,b);
        printf("%lf\n",r);
        break;
    case '%':
        printf("%lf\n",reste_de_division(a,b));
        break;
    case 'c':
        printf("%lf\n",puissance(a,b));
        break;
    case '!':
        printf("%lf\n",factorielle(a));
        break;
    case 'g':
        printf("%lf\n",PGCD(a,b));
        break;
    case 'p':
        printf("%lf\n",PPCM(a,b));
        break;
    case 'i':
        printf("%lf\n",inverse(a));
        break;
    }
    }while(ch !='q');
    return 0;
}

抱歉我英语不好
示例:5 6 +
11 6 + 17 3 - 20 //这是错误,应该给予14而不是20

6ie5vjzr

6ie5vjzr1#

你的问题就在这里:

scanf("%lf %lf %c",&a,&b,&ch);

你希望用户总是输入两个双精度型和一个字符,如果用户只输入一个双精度型和一个字符,ch(和b)的值不变,程序将执行与上次相同的操作。
示例:
第一次输入:

5 6 +

这将使a等于6,b等于5,ch等于+,因此程序将把5和6相加,并产生结果11,该结果存储在b中。
下一次输入:
这将使a等于1,但bch保持不变,即b仍然等于11,ch仍然等于+,因此程序将把两个数1和11相加,并产生结果12,该结果存储在b中。
这只是执行scanf("%lf %lf %c",&a,&b,&ch);时可能出错的一个示例。还有其他输入序列会导致(甚至更多)bizar输出。
你需要对用户输入进行更严格的解析。scanf函数并不适用于此。考虑使用fgets读取整行,然后解析它。使用sscanf可以小心地完成这一点。

相关问题