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                                 ");
}

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

(0)

相关推荐

  • C语言实现简单计算器功能(2)

    本文接着上一篇C语言实现简单计算器功能(1)继续学习. 之前用switch语句完成了一个简单计算器的功能,下面我给大家用if语句和while循环语句再实现一个简单计算器的编程. 要求: 实现简单的计算器,具体代码如下: #include <stdio.h> // 头文件 void main() { char a = 0; // 变量声明并初始化 int x, y; // 变量声明 int result = 0; char b = 37; while(1) // whiel循环实现反复在计算器系

  • 用C语言实现计算器功能

    本文实例为大家分享了用C语言实现计算器功能的具体代码,供大家参考,具体内容如下 代码如下: #include<stdio.h> //C语言编写计算器程序 ^_^ void Counter1(int a,int b,char op); //函数声明! void Counter2(double c,double d,char op); void Show_Sum1(int a,char op,int b,int sum); void Show_Sum2(double c,double d,char

  • C语言结课设计之计算器功能

    本文实例为大家分享了C语言实现计算器的具体代码,供大家参考,具体内容如下 /*===============================================*\ ** 设计目的:简单计算器,计算形如10*(20.2-30.6)+5.0/2的表达式值 ** 简要原理:中缀式转逆波兰式(后缀式) ** IDE:Dev-Cpp 4.9.9.2 ** 注意事项:括号必须是英文状态的 ** 时间: 2014-6-17 \*==================================

  • C语言实现简单计算器功能(1)

    本文为大家分享了C语言实现简单计算器功能的具体方法,供大家参考,具体内容如下 这几天一直上控制语句,在学完if.switch和循环语句后,为了巩固所学知识点,想给学生出一道简单的计算器程序.题目如下: 通过所学的知识(选择语句.循环语句)完成一个简单的计算器编程,要求不许抄袭,只能用自己所学的知识点,不可引用网上自己的不懂的程序. 要求的格式如下图: 要求以这样的一种格式进行输出,并能通过选择完成不同的功能. 如:选择1,完成整数相加功能,算完后又能回到该页面. 经过分析,我简单的写了一段代码,

  • C语言实现个税计算器

    最近在学C语言基础,在导师的指导下,先准备写个个税薪资计算器.这是一个简单的C语言小demo.主要用到了C语言的函数,if选择语句. 程序的主要代码如下(可运行): #include <stdio.h> float Salary; int len; float CulculateSalary (){ printf("请输入你的薪资\n"); scanf ("%f",&Salary); //getchar(); if(Salary -5000 &l

  • C语言实现简单计算器

    本文实例为大家分享了C语言实现简单计算器的具体代码,供大家参考,具体内容如下 实现效果如图: 实现代码如下: #include<stdio.h> #include<windows.h>//gotoxy #include<conio.h> #define width 80 #define height 30 void gotoxy(int x, int y); void GreateFrame() { int i = 0; for (i = 0 ; i < widt

  • C语言运用函数指针数组实现计算器功能

    本文实例为大家分享了C语言运用函数指针数组制作计算器的具体代码,供大家参考,具体内容如下 先来回顾一下概念: 指针数组 -- 存放指针的数组 函数指针 -- 存放函数地址的指针 函数指针数组 -- 存放函数指针的数组 接下来说说这次要制作的计算器的功能: 1.add -- 加法 2.sub -- 减法 3.mul -- 乘法 4.div -- 除法 0.exit -- 退出 具体来通过代码讲解: (1)首先写一个菜单程序,在运行程序时首先打印一次菜单. void menu() { printf(

  • C语言实现简单计算器程序

    这两天在看一个C语言写的计算器程序,做了不少的功夫,跟着作者一步步的进行完善,了解了许多细节性的东西,在此自己做个总结,加深自己对程序的印象,也算是梳理. 在该计算器程序,能进行加减乘除.sin.cos.exp等操作,同时能进行数值保存功能.而该计算器使用逆波兰表示法.即所有运算符都跟在操作数的后面,比如下列表达式: (1 - 2) * (4 + 5)采用逆波兰表示法表示为:1 2 - 4 5 + * 逆波兰表达法中不需要圆括号,只要知道每个运算符需要几个操作数就不会引起歧义. 计算器程序实现很

  • C语言数据结构之简易计算器

    本文实例为大家分享了C语言简易计算器的具体代码,供大家参考,具体内容如下 主要解决了处理负数.小数等的基础运算操作,无图形界面 #include <iostream> #include <stack> using namespace std; class Calculator{ private: int Priority(char fuhao); double CalSuffix(string PostfixExp); public: double Calculate(string

  • C语言实现简单的计算器

    本文实例为大家分享了C语言实现简单计算器的具体代码,供大家参考,具体内容如下 描述:简单的实现四则运算 1.switch法 #include<stdio.h> void menu()//菜单函数 { printf("************************************\n"); printf("***** 1.add 2.sub *****\n"); printf("***** 3.mul 4.div *****\n&quo

随机推荐