C语言实现简易计算器功能

 更新时间:2022年01月28日 10:55:38   作者:owen-li  
这篇文章主要为大家详细介绍了C语言实现简易计算器功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了C语言实现简易计算器功能的具体代码,供大家参考,具体内容如下

表达式求值项目(多功能计算器)。该项目主要包含了10个模块,10项功能:

1:加法运算:主要进行两个数的加法运算,可进行计算整数和浮点数;

2:减法运算:主要进行两个数的减法运算,可进行计算整数和浮点数;

3:乘法运算:主要进行两个数的乘法运算,可进行计算整数和浮点数;

4:除法运算:主要进行两个数的除法运算,可进行计算整数和浮点数;增加了报错功能,由于除数不可以为0,当用户输入的除数为0的时候,该项目会出提示红色字体提示语句,提醒用户输入有误重新输入。

5:开平方根:主要进行某个数的开方,选择该功能时,计算器会提示输入需开方的数,然后打印出开方后的结果;

6:求某数的N次幂:选择该功能时,计算器会提示请输入需要计算的数x以及N的值,然后打印出N次幂后的结果;

7:进位制的转换:任意输入某个数字,可以将该数字分别转换为二进制,八进制,和十六进制。

8:表达式求值:

9:一元二次方程求解:

10:中缀表达式转换为后缀表达式:输入表达式后,计算器会对表达式进行判断。判断括号是否匹配,括号匹配完成后进行下一步表达式运算符匹配,匹配成功后输出其后缀表达式。如果匹配出现错误,出现红色字体警告,发出哔哔的声音,提示重新输入。

0:退出功能:选择退出时,出现一个退出界面。并退出程序。

小功能介绍:计算器包含了3个界面,开始界面,菜单界面,退出界面。采用多级变色提示音,红,绿,紫,黄。方便用户操作和查看。

开始界面如图:

功能界面如图:

#include<stdio.h>
#include<windows.h>
#include<stdlib.h>
#include<math.h>
#define MaxSize 10000
void print2();
void print1();
struct Stackop
{
    char op[MaxSize];
    int top;
} stackop;
struct StackNum
{
    double num[MaxSize];
    int top;
} stacknum;
int GetLevel(char op)//得到运算符的优先等级
{
    if(op=='+'||op=='-')
        return 1;
    if(op=='*'||op=='/')
        return 2;
    return 0;
}
double Add(double a,double b)//加法运算
{
    return a+b;
}
double Sub(double a,double b)//减法运算
{
    return a-b;
}
double Multi(double a,double b)//乘法运算
{
    return a*b;
}
double Div(double a,double b,double *result)//除法运算
{
 
    if(b==0)
        printf("除数不能为0\n");
    return 0;
    *result=a/b;
    return 1;
}
int Calculate(double a,double b,char op,double *result)
//用于对两个数进行运算
{
    switch(op)
    {
    case '+':
        *result=Add(a,b);
        return 1;
    case '-':
        *result=Sub(a,b);
        return 1;
    case '*':
        *result=Multi(a,b);
        return 1;
    case '/':
        return Div(a,b,result);
    default:
        return 0;
    }
}
void GetRpn(char *str,char *rpn)
{
    int len=strlen(str),cnt=0,i;
    int isnum=0;
    stackop.top=-1;
    if(str[len-1]=='=')
        len--;
    if(str[0]=='-')
    {
        rpn[cnt++]='0';
        rpn[cnt++]='#';
    }
    for(i=0; i<len; i++)
    {
        if(str[i]>='0'&&str[i]<='9'||str[i]=='.')
        {
            rpn[cnt++]=str[i];
            isnum=1;
            continue;
        }
        if(isnum)
        {
            rpn[cnt++]='#';
            isnum=0;
        }
        if(str[i]=='('&&str[i+1]=='-')
        {
            rpn[cnt++]='0';
            rpn[cnt++]='#';
        }
 
 
        if(str[i]=='(')
            stackop.op[++stackop.top]=str[i];
        else if(str[i]==')')
        {
            while(stackop.op[stackop.top]!='(')
            {
                rpn[cnt++]=stackop.op[stackop.top];
                stackop.top--;
            }
            stackop.top--;
        }
        else if(stackop.top!=-1&&GetLevel(str[i])<=
                GetLevel(stackop.op[stackop.top]))
        {
            while(stackop.top!=-1&&GetLevel(str[i])<=
                    GetLevel(stackop.op[stackop.top]))
            {
                rpn[cnt++]=stackop.op[stackop.top];
                stackop.top--;
            }
            stackop.op[++stackop.top]=str[i];
        }
        else
        {
            stackop.op[++stackop.top]=str[i];
        }
    }
    if(isnum)
        rpn[cnt++]='#';
    while(stackop.top!=-1)
    {
        rpn[cnt++]=stackop.op[stackop.top];
        stackop.top--;
    }
    rpn[cnt]='\0';
}
int GetAns(char *rpn,double *result)
{
    int len=strlen(rpn),i;
    double fnum;
    int num,cnt;
    stacknum.top=-1;
    for(i=0; i<len; i++)
    {
        if(rpn[i]>='0'&&rpn[i]<='9')
        {
            num=cnt=0;
            fnum=0;
            while(rpn[i]!='#'&&rpn[i]!='.')
            {
                num=num*10+rpn[i]-'0';
                i++;
            }
 
            if(rpn[i]=='.')
            {
                i++;
                while(rpn[i]!='#')
                {
                    fnum=fnum+(rpn[i]-'0')*1.0/pow(10,++cnt);
                    i++;
                }
            }
            fnum+=num;
            stacknum.num[++stacknum.top]=fnum;
        }
        else
        {
            double a,b,c;
            b=stacknum.num[stacknum.top];
            stacknum.top--;
            a=stacknum.num[stacknum.top];
            stacknum.top--;
            if(Calculate(a,b,rpn[i],&c)==0)
            {
                //计算失败
                return 0;
            }
            else
            {
                stacknum.num[++stacknum.top]=c;
            }
        }
    }
    *result=stacknum.num[stacknum.top];
    return 1;
}
int kuohao(char *str)//判断圆括号输入是否正确
{
    int i,len=strlen(str);
    int count=0;
    for(i=0;i<len;i++)
    {
        if(str[i]=='(')
        count++;
        if(str[i]==')')
        count--;
    }
    if(count!=0)
    {
        Beep(5000, 300);
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED);
        printf("\n括号输入有错误\n");
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN);
        return 0;
    }
    else
    printf("\n括号匹配正确\n");
    return 1;
}
int yunsunfu(char *str)
{
    int i,len=strlen(str),k;
    printf("\n判断括号匹配输入是否正确:\n");
    k=kuohao(str);
    if(k==0)
    return 0;
    printf("\n判断多项式运算符输入是否正确:\n");
    for(i=0;i<len;i++)
    {
        if(str[i]=='+'||str[i]=='-'||str[i]=='*'||str[i]=='/')
        {
            if(str[i+1]=='('||(str[i+1]>='0'&&str[i+1]<='9'))
            continue;
            else
            {
                Beep(5000, 300);
                SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED);
                printf("\n多项式输入有错误\n");
                SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN);
                return 0;
            }
        }
    }
    printf("\n多项式输入正确\n");
    return 1;
}
 
 
int main()
{
    HANDLE hOut;
    //  获取输出流的句柄
    hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(hOut,
                            FOREGROUND_RED |  // 前景色_红色
                            FOREGROUND_BLUE | // 前景色_蓝色
                            FOREGROUND_INTENSITY);// 加强
    print1();
    system("pause");
    system("cls");
    char str[MaxSize],rpn[MaxSize],ch;
    double bNumber, Number, Result,result; //给加减乘除定义的变量
    double a, b, c,x, x1, x2, Rad;  //一元二次方程定义变量
    int Ary_10,n;                                        //定义进制的变量
    char string[32];                //二进制变量定义
    while(1)
    {
        switch(menu())
        {
        case 1:
            printf ("请输入被加数:");
            scanf ("%lf",&bNumber);
            printf("请输入加数:");
            scanf("%lf",&Number);
            Result = bNumber + Number;
            printf (" 结果是: %.2lf\n\n",Result);
            if(scanf("%c*%c",&ch)=='\0');
            system("cls");
            break;
 
        case 2:
            printf ("        请输入被减数:");
            scanf ("%lf",&bNumber);
            printf ("        请输入减数:");
            scanf ("%lf",&Number);
            Result = bNumber - Number;
            printf (" 结果是: %.2lf\n\n",Result);
            if(scanf("%c*%c",&ch)=='\0');
            system("cls");
            break;
 
        case 3:
            printf ("        请输入被乘数:");
            scanf ("%lf",&bNumber);
            printf ("        请输入乘数:");
            scanf ("%lf",&Number);
            Result = bNumber * Number;
            printf (" 结果是: %.2lf\n",Result);
            if(scanf("%c*%c",&ch)=='\0');
            system("cls");
            break;
        case 4:
            printf ("        请输入被除数:");
            scanf ("%lf",&bNumber);
            printf ("        请输入除数:");
            scanf ("%lf",&Number);
            if(Number==0)
            {
                HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);  // 获取控制台句柄
    SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_RED); // 红色提示
                printf("除数不可以为零\n");
                 if(scanf("%c*%c",&ch)=='\0');
            system("cls");
            break;
            }
            else
            {
            Result = bNumber / Number;
            printf (" 结果是: %.2lf\n\n",Result);
            if(scanf("%c*%c",&ch)=='\0');
            system("cls");
            break;}
        case 8:
        {
            int k;
            printf("输入所要经计算的表达式(如:a*b/(c-d))\n");
            gets(str);
            if(gets(str)!=NULL)
            {
            k=yunsunfu(str);
            if(k!=0)
            {
                GetRpn(str,rpn);
                printf("其后缀表达式:%s\n",rpn);
                GetAns(rpn,&result);
                printf("表达式结果:%.2f\n",result);
                if(scanf("%c",&ch)=='\0');
                system("cls");
                break;
            }
            }
        }
        case 10:
            {
                int k;
            printf("请输入需要转换的表达式并以回车结束:\n");
            gets(str);
            if(gets(str)!=NULL)
            {
            k=yunsunfu(str);
            if(k!=0)
            {
                GetRpn(str,rpn);
                printf("其后缀表达式:%s\n",rpn);
                if(scanf("%c",&ch)=='\0');
                system("cls");
                break;
            }
            else
             if(scanf("%c",&ch)=='\0');
                system("cls");
                break;
            }
            else
                printf("表达式为空,请核证后在输入.\n");
            }
        case 9:
        {
            printf("请输入一元一次方程的a,b,c三个数:");
            scanf("%lf%lf%lf",&a,&b,&c);
            getchar();
            Rad = b*b - 4*a*c;
            if (Rad > 0)
            {
                x1 = -b + sqrt(Rad) / (2*a);
                x2 = -b - sqrt(Rad) / (2*a);
                printf("有两个解 x1 = %.2lf, x2 = %.2lf\n",x1,x2);
            }
            else if (Rad == 0)
            {
                x1 = -b / (2*a);
                printf("只有一个解 x1 = %.2lf\n",x1);
            }
            else
            {
                printf("无解\n");
            }
            if(scanf("%c",&ch)=='\0');
            system("cls");
            break;
        }
        case 7:
            printf("请输入需要转换的十进制数:");
            scanf("%d", &Ary_10);
            getchar();
            itoa (Ary_10, string ,2);
            printf("二进制: %s\n",string);
            printf("八进制: %o\n",Ary_10);
            printf("十六进制: %x\n",Ary_10);
            if(scanf("%c",&ch)=='\0');
            system("cls");
            break;
        case 5:
            printf("请输入要开平方根的数X:\n");
            scanf("%lf",&x);
            getchar();
            result=sqrt(x);
            printf("%.2lf开根后的结果:%.2lf",x,result);
            if(scanf("%c",&ch)=='\0');
            system("cls");
            break;
        case 6:
            printf("请输入你要求幂的数X和指数n:");
            scanf("%lf%d",&x,&n);
                       getchar();
            result=pow(x,n);
            printf("%.2lf的%d次幂为%.2lf",x,n,result);
            if(scanf("%c",&ch)=='\0');
            system("cls");
            break;
        case 0:
            print2();
            return 0;
        }
    }
    return 0;
}
int menu()
{
    int v;
    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);  // 获取控制台句柄
    SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN);// 设置为黄色
    printf("\n");
    printf ("┏ ┅ ┅ ┅ ┅ ┅ ┅ ┅ ┅ ┅ ┅ ┅ ┅ ┅ ┅ ┅ ┓\n");
    printf ("┇请选择你要计算的方法:                         ┇\n");
    printf ("┣ ┅ ┅ ┅ ┅ ┅ ┅ ┅ ┅ ┅ ┅ ┅ ┅ ┅ ┅ ┅ ┫\n");
    printf ("┇  加法请按_1    进制转换_7                    ┇\n");
    printf ("┇  减法请按_2    表达式求值请按_8              ┇\n");
    printf ("┇  乘法请按_3    求一元二次方程_9              ┇\n");
    printf ("┇  除法请按_4    中缀表达式转化为后缀表达式_ 10┇\n");
    printf ("┇  求平方根_ 5                                 ┇\n");
    printf ("┇  求数的N次幂_6            退出_0             ┇\n");
    printf ("┗ ┅ ┅ ┅ ┅ ┅ ┅ ┅ ┅ ┅ ┅ ┅ ┅ ┅ ┅ ┅ ┛\n");
    printf ("Please write down the number:");
 
    do
    {
        printf("请选择(0-10)\n");
        scanf("%d",&v);
    }
    while(v<0||v>10);
    return v;
}
void print1()
{
 
    printf("|_______________________________________ |                            \n");
    printf("||                                     | |                            \n");
    printf("||        欢迎使用功能计算器           | |         本计算器能够进行   \n");
    printf("||_____________________________________| |      +,-,×,÷,\n");
    printf("||                    图案仅供参考     | |       ()等等             \n");
    printf("||_____________________________________| |              \n");
    printf("|                                        |                         \n");
    printf("|___  ___  ___  ___  ___  ___  ___  ___  |                            \n");
    printf("|________  ________  ________  ________  |                            \n");
    printf("||  ⑨  |  |  ⑧  |  |  ⑦  |  |  ×  |  |                            \n");
    printf("||______|  |______|  |______|  |______|  |                            \n");
    printf("|________  ________  ________  ________  |                            \n");
    printf("||  ⑥  |  |  ⑤  |  |  ④  |  |  -  |  |                            \n");
    printf("||______|  |______|  |______|  |______|  |                            \n");
    printf("| _______  ________  ________  ________  |                            \n");
    printf("||  ③  |  |  ②  |  |  ①  |  |  +  |  |                            \n");
    printf("||______|  |______|  |______|  |______|  |                            \n");
    printf("|________  ________  ________  ________  |                            \n");
    printf("||  〇  |  |  =  |  |  AC  |  |  ÷  |  |                            \n");
    printf("||______|  |______|  |______|  |______|  |                            \n");
    printf("||      版权所有,翻版必究                |                            \n");
 
 
}
void print2()
{
    system("cls");
    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);  // 获取控制台句柄
    SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_BLUE); // 设置为蓝色
    printf("\n\n\n\n\n\n\n\n\t\t\t ##############################\n");
    printf("\t\t\t #                            #\n");
    printf("\t\t\t #----------谢谢使用----------#\n");
    printf("\t\t\t #                            #\n");
    printf("\t\t\t ##############################\n");
    printf("\t\t\t                      --小李子制作\n                                 ");
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • C语言数组应用实现三子棋游戏

    C语言数组应用实现三子棋游戏

    这篇文章主要为大家详细介绍了C语言数组应用实现三子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • C++中 静态局部变量实例详解

    C++中 静态局部变量实例详解

    这篇文章主要介绍了C++中 静态局部变量实例详解的相关资料,需要的朋友可以参考下
    2017-03-03
  • 一文带你掌握C++中的继承

    一文带你掌握C++中的继承

    继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,本文详解介绍了C++中的继承,感兴趣的同学可以借鉴一下
    2023-05-05
  • c语言 数据结构实现之字符串

    c语言 数据结构实现之字符串

    这篇文章主要介绍了c语言 数据结构实现之字符串的相关资料,需要的朋友可以参考下
    2017-05-05
  • C++如何实现定长内存池详解

    C++如何实现定长内存池详解

    内存池根据存储的元素的长度是否可变,分为变长,与定长两种内存池,这篇文章主要给大家介绍了关于C++如何实现定长内存池的相关资料,需要的朋友可以参考下
    2021-09-09
  • OpenCV实现鼠标框选并显示框选区域

    OpenCV实现鼠标框选并显示框选区域

    这篇文章主要为大家详细介绍了OpenCV实现鼠标框选并显示框选区域,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • 浅谈C++模板元编程

    浅谈C++模板元编程

    本篇文章主要介绍了浅谈C++模板元编程,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • C语言指针详解

    C语言指针详解

    这篇文章非常详细的讲解了C语言中指针的概念,包含多种方法,多种定义,全面的说明了C语言的特性
    2021-06-06
  • c语言stack(栈)和heap(堆)的使用详解

    c语言stack(栈)和heap(堆)的使用详解

    这篇文章主要介绍了c语言stack(栈)和heap(堆)的使用详解,需要的朋友可以参考下
    2014-04-04
  • C++20中的span容器及用法小结

    C++20中的span容器及用法小结

    std::span 是一个非常实用的工具,可以方便地对数据进行访问和处理,同时也可以提高代码的可读性、可维护性和安全性,这篇文章主要介绍了C++20中的span容器,需要的朋友可以参考下
    2023-03-03

最新评论