广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言实现简易计算器功能
  • 822
分享到

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

2024-04-02 19:04:59 822人浏览 独家记忆
摘要

本文实例为大家分享了C语言实现简易计算器功能的具体代码,供大家参考,具体内容如下 表达式求值项目(多功能计算器)。该项目主要包含了10个模块,10项功能: 1:加法运算:主要进行两个

本文实例为大家分享了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                                 ");
}

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

--结束END--

本文标题: C语言实现简易计算器功能

本文链接: https://www.lsjlt.com/news/164120.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C语言实现简易计算器功能
    本文实例为大家分享了C语言实现简易计算器功能的具体代码,供大家参考,具体内容如下 表达式求值项目(多功能计算器)。该项目主要包含了10个模块,10项功能: 1:加法运算:主要进行两个...
    99+
    2022-11-13
  • C++实现简易计算器功能
    本文实例为大家分享了C++实现简易计算器功能的具体代码,供大家参考,具体内容如下 介绍 介绍:仅支持自然数间的+ - * /操作,并没有括号。 实现:利用栈实现存储运算数以及运算符。...
    99+
    2022-11-13
  • C#实现简易计算器小功能
    本文实例为大家分享了C#实现简易计算器小功能的具体代码,供大家参考,具体内容如下 简易的登陆界面。 具有幻灯片效果。(picturebox time控件)计算器支持多位数,小数,括...
    99+
    2022-11-13
  • 用C语言实现简单的计算器功能
    本文实例为大家分享了C语言实现简单的计算器功能的具体代码,供大家参考,具体内容如下 简单计算器,实现简单的加减乘除功能,选择对应的运算符输出运算符对应的编号,然后输入我们要计算的两个...
    99+
    2022-11-13
  • C#实现简易计算器功能(附源码)
    本文实例为大家分享了C#实现简易计算器功能的具体代码,供大家参考,具体内容如下 剖析: 1、先设计界面(按钮、文本框(一个显示算式,一个显示结果))布局 2、单击按钮将其对应内容显示...
    99+
    2022-11-12
  • C#如何实现简易计算器小功能
    这篇文章主要介绍C#如何实现简易计算器小功能,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!具体内容如下简易的登陆界面。具有幻灯片效果。(picturebox time控件)计算器支持多位数,小数,括号的运算。音乐是一...
    99+
    2023-06-29
  • jQuery实现简易计算器功能
    jQuery制作一个简易计算器,供大家参考,具体内容如下 页面效果: 源码: <!DOCTYPE html> <html> <head>    ...
    99+
    2022-11-13
  • SpringMvc实现简易计算器功能
    用SpringMvc做一个简易计算器,供大家参考,具体内容如下 一 .domain类 package ssm1.domain; public class JiSuan {     ...
    99+
    2022-11-13
  • Pyqt实现简易计算器功能
    本文实例为大家分享了Pyqt实现简易计算器的具体代码,供大家参考,具体内容如下 环境:pycharm、python3.7 首先用qtDesigner设计出如下界面。 再用pyUIC...
    99+
    2022-11-10
  • python实现简易计算器功能
    本文实例为大家分享了python实现简易计算器功能的具体代码,供大家参考,具体内容如下 一、功能目标 用户输入一个类似  1-2*((60-30+(-40/5)*(9-2*...
    99+
    2022-11-13
  • Android实现简易计算器功能
    本项目为大家分享了Android实现计算器功能的具体代码,供大家参考,具体内容如下 项目介绍 练手项目。能实现加减乘除及括号运算。 开发思路 界面布局  1.界面布...
    99+
    2022-11-12
  • Swift实现简易计算器功能
    用Swift写一个简单计算器的Demo,供大家参考,具体内容如下 实验环境: Xcode v6.4   & OS X Yosemite 10.10 功能描述: 1、...
    99+
    2022-11-13
  • 用C语言实现计算器功能
    本文实例为大家分享了用C语言实现计算器功能的具体代码,供大家参考,具体内容如下 代码如下: #include<stdio.h> //C语言编写计算器程序 ^_^ v...
    99+
    2022-11-12
  • 怎么用C语言实现简单的计算器功能
    这篇文章主要讲解了“怎么用C语言实现简单的计算器功能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用C语言实现简单的计算器功能”吧!简单计算器,实现简单的加减乘除功能,选择对应的运算符输...
    99+
    2023-06-29
  • Android实现简易计算功能
    本文实例为大家分享了Android实现简易计算功能的具体代码,供大家参考,具体内容如下 效果如图: activity_main.xml <?xml version...
    99+
    2022-11-12
  • C#实现简易计算器功能(1)(窗体应用)
    本文实例为大家分享了C#实现简易计算器功能的具体代码,供大家参考,具体内容如下 实现页面布局和数值初始化 using System; using System.Collections...
    99+
    2022-11-13
  • C#实现简易计算器功能(2)(窗体应用)
    本文实例为大家分享了C#实现简易计算器功能第二部分的具体代码,供大家参考,具体内容如下 初始化,实现四则运算 using System; using System.Collecti...
    99+
    2022-11-13
  • Androidstudio实现简易计算器App功能
    在Android studio实现简易计算器App并实现加减乘除功能,供大家参考,具体内容如下 结果 activity_main.xml <xml version="1.0...
    99+
    2022-11-13
  • vue实现简易的计算器功能
    本文实例为大家分享了vue实现简易计算器功能的具体代码,供大家参考,具体内容如下 实现功能:将两个输入框中的值进行加减乘除计算 用到的知识点: 1.v-model数据双向绑定 2. ...
    99+
    2022-11-12
  • javascript实现简易的计算器功能
    本文实例为大家分享了javascript实现简易的计算器的具体代码,供大家参考,具体内容如下 javascript实现简易计算器,只有两个input输入框,简单实现加减乘除: <...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作