| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 648 人关注过本帖
标题:简易计算器的算法
只看楼主 加入收藏
w20110231130
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2013-1-11
结帖率:0
收藏
已结贴  问题点数:20 回复次数:7 
简易计算器的算法
求编写简易计算器的算法,
要求可以计算小数,而且任输入一个计算式,都能得出结果
搜索更多相关主题的帖子: 计算 计算器 
2013-01-12 12:58
青春无限
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江苏
等 级:贵宾
威 望:24
帖 子:3451
专家分:19340
注 册:2012-3-31
收藏
得分:7 
用switch
case语句!

学 会看代码…学习写程序…学会搞开发…我的目标!呵呵是不是说大话啊!!一切皆可能
2013-01-12 13:22
神龙赖了
Rank: 10Rank: 10Rank: 10
来 自:萨塔星
等 级:青峰侠
威 望:2
帖 子:711
专家分:1788
注 册:2012-10-13
收藏
得分:7 
程序代码:
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>

#define N 100

double getvalue(int *i, char *str, double val1);
double yunsuan(double result, double val2, char ch);

int main(void)
{
    char str[N];    //储存计算表达式
    char ch = 0;
    char isch = 0;
    int i = 0;
    int j = 0;

    double val1 = 0.0;
    double val2 = 0.0;
    size_t length = 0;

    printf("请输入计算表达式:\n");
    fgets(str, N, stdin);
    length = strlen(str);

    //如果超过内存则结束程序,否则将换行符替换
    if(str[length-1] != '\n')
    {
        printf("表达式过长,程序异常退出!\n");
        return 1;
    }
       
    str[--length] = '\0';
   
    //获得第一个数字的值
    for(i=0;i<(int)length;i++)
    {
        if(isspace(str[i]))                  //跳过空格
            continue;

        //如果为数字
        if(isdigit(str[i]) || str[i] == '.')
        val1 = getvalue(&i,str,val1);

        while(isspace(str[i]) && str[i] != '\0')                  //跳过空格
        i++;

        //如果不是数字和空格,则做为运算符处理
        if(!isspace(str[i]) && str[i] != '\0')
        {
            isch = 1;
            ch = str[i++];
        }

       
        while(isspace(str[i]) && str[i] != '\0')                  //跳过空格
        i++;

        if(isdigit(str[i]) || str[i] == '.')
        val2 = getvalue(&i,str,val2);

        //如果已储存了运算符
        if(isch)
        {
          isch = 0;
          val1 = yunsuan(val1, val2, ch);
          val2 = 0;             //归零
        }
    }

    printf("\n结果为:%2g\n\n",val1);
    return 0;
}

double getvalue(int *i, char *str, double val1)
{
    int j = 0;
    char buffer[N];

    while(isdigit(str[*i]) || str[*i] == '.')
        {
          //如果是浮数点
          if(str[*i] == '.')
          {
            //得到小数点后的数字
            do
            {
                buffer[j++] = str[(*i)++];
            }while(isdigit(str[*i]));

            buffer[j] = '\0';
            val1 += atof(buffer);
            break;
          }
          val1 += str[(*i)++] - '0';
        }
    return val1;
}
double yunsuan(double result, double val2, char ch)
{
    for(;;)
    switch(ch)
    {
    case '+':
        return result + val2;
    case '-':
        return result - val2;
    case '*':
        return result * val2;
    case '/':
        if(val2 == 0.0)
        {
            printf("除数不能为0,请重新输入除数:");
            scanf("%lf",&val2);
            break;
        }
        else
            return result / val2;

    default:
        printf("无法定义的运算符%2c,请重新输入运算符号:",ch);
        scanf(" %c",&ch);
        break;
    }
    return -1;     //如果冲出循环,说明程序出错,返回-1
}

I have not failed completely
2013-01-12 15:25
w20110231130
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2013-1-11
收藏
得分:0 
好像错了,我只要算法,计算式里还有括号的
2013-01-12 16:44
peach5460
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:武汉
等 级:贵宾
威 望:30
帖 子:2780
专家分:6060
注 册:2008-1-28
收藏
得分:7 
http://rogerlee.tk/c-arithmetic-resolve-class/
为什么最近这么多人求四则运算?年底了老师布置作业了?
这是C++的

我总觉得授人以鱼不如授人以渔...
可是总有些SB叫嚣着:要么给代码给答案,要么滚蛋...
虽然我知道不要跟SB一般见识,但是我真的没修炼到宠辱不惊...
2013-01-12 18:15
神龙赖了
Rank: 10Rank: 10Rank: 10
来 自:萨塔星
等 级:青峰侠
威 望:2
帖 子:711
专家分:1788
注 册:2012-10-13
收藏
得分:0 
程序代码:
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#include <math.h>

#define N 100

double getvalue(int *i, char *str);
double yunsuan(double result, double val2, char ch);

int main(void)
{
    char str[N];    //储存计算表达式
    char ch = 0;
    char isch = 1;
    int i = 0;
    int isfirst = 1;

    int val2can = 0;
    double val2 = 0.0;
    double result = 0.0;
    size_t length = 0;

    printf("请输入计算表达式:\n");
   
    for(;;)
    {
        val2 = 0;
    fgets(str, N, stdin);

    if(strcmp(str,"退出\n") == 0)
        break;

    length = strlen(str);

    //如果超过内存则结束程序,否则将换行符替换
    if(str[length-1] != '\n')
    {
        printf("表达式过长,程序异常退出!\n");
        return 1;
    }
       
    str[--length] = '\0';

        //如果输入'='
    if(str[0] == '=')
    {
        i = 1;
        while(isspace(str[i]) && str[i] != '\0')                  //跳过空格
        i++;

        //如果不是数字和空格,则做为运算符处理
        if(!isspace(str[i]) && str[i] != '\0')
        {
            isch = 1;
            ch = str[i++];
        }

        while(isspace(str[i]) && str[i] != '\0')                  //跳过空格
        i++;

        if(isdigit(str[i]) || str[i] == '.')
        val2 = getvalue(&i,str);

        result = yunsuan(result , val2 , ch);
    }

    else
    {
        isch = 1;
        i = 0;
        isfirst = 1;
        result = 0.0;
    //获得第一个数字的值
    while(str[i] != '\0')
    {
        while(isspace(str[i]) && str[i] != '\0')                  //跳过空格
        i++;

        //如果为数字
        if(isdigit(str[i]) || str[i] == '.')
        if(isfirst)
            result = getvalue(&i,str);
        else
        {
            val2can = 1;
            val2 = getvalue(&i,str);
        }
        while(isspace(str[i]) && str[i] != '\0')                  //跳过空格
        i++;

        //如果不是数字和空格,则做为运算符处理
        if(!isspace(str[i]) && str[i] != '\0' && isch)
        {
            isch = 1;
            ch = str[i++];
        }

        //如果储存了运算符
        if(val2can)
        {
          isch = 1;
          result = yunsuan(result, val2, ch);
          val2 = 0;             //归零
        }
        else
            isch = 0;

        isfirst = 0;
        val2can = 0;
    }
    }
    printf("=%2g\n",result);
    }
    return 0;
}

double getvalue(int *i, char *str)
{
    int j = 0;
    int j2 = 0;
    int z = 0;
    double val1 = 0.0;
    char buffer[N];
    char buffer2[N];

    while(isdigit(str[*i]) || str[*i] == '.')
        {
          //如果是浮数点
          if(str[*i] == '.')
          {
            //得到小数点后的数字
            do
            {
                buffer2[j2++] = str[(*i)++];
            }while(isdigit(str[*i]));

            buffer[j2] = '\0';
            val1 += atof(buffer2);
            break;
          }
          buffer[j++] = str[(*i)++];
        }
              for(z=0;z<j;z++)
              val1 += (buffer[z] - '0')*pow(10,j-z-1);
        printf("val1 = %lf\n",val1);
    return val1;
}
double yunsuan(double result, double val2, char ch)
{
    for(;;)
    switch(ch)
    {
    case '+':
        return result + val2;
    case '-':
        return result - val2;
    case '*':
        return result * val2;
    case '/':
        if(val2 == 0.0)
        {
            printf("除数不能为0,请重新输入除数:");
            scanf("%lf",&val2);
            break;
        }
        else
            return result / val2;

    default:
        printf("无法定义的运算符%2c,请重新输入运算符号:",ch);
        scanf(" %c",&ch);
        break;
    }
    return -1;     //如果冲出循环,说明程序出错,返回-1
}
不好意思整数忘记进位了...对了,优先级我没有去注意,楼主需要的话可以自己动手改一改,不然我就成苦工了...
图片附件: 游客没有浏览图片的权限,请 登录注册

I have not failed completely
2013-01-12 22:22
神龙赖了
Rank: 10Rank: 10Rank: 10
来 自:萨塔星
等 级:青峰侠
威 望:2
帖 子:711
专家分:1788
注 册:2012-10-13
收藏
得分:0 
上面的输出是这个代码...:
程序代码:
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#include <math.h>

#define N 100

double getvalue(int *i, char *str);
double yunsuan(double result, double val2, char ch);

int main(void)
{
    char str[N];    //储存计算表达式
    char ch = 0;
    char isch = 1;
    int i = 0;
    int isfirst = 1;

    int val2can = 0;
    double val2 = 0.0;
    double result = 0.0;
    size_t length = 0;

    printf("请输入计算表达式:\n");
   
    for(;;)
    {
        val2 = 0;
    fgets(str, N, stdin);

    if(strcmp(str,"退出\n") == 0)
        break;

    length = strlen(str);

    //如果超过内存则结束程序,否则将换行符替换
    if(str[length-1] != '\n')
    {
        printf("表达式过长,程序异常退出!\n");
        return 1;
    }
       
    str[--length] = '\0';

        //如果输入'='
    if(str[0] == '=')
    {
        i = 1;
        while(isspace(str[i]) && str[i] != '\0')                  //跳过空格
        i++;

        //如果不是数字和空格,则做为运算符处理
        if(!isspace(str[i]) && str[i] != '\0')
        {
            isch = 1;
            ch = str[i++];
        }

        while(isspace(str[i]) && str[i] != '\0')                  //跳过空格
        i++;

        if(isdigit(str[i]) || str[i] == '.')
        val2 = getvalue(&i,str);

        result = yunsuan(result , val2 , ch);
    }

    else
    {
        isch = 1;
        i = 0;
        isfirst = 1;
        result = 0.0;
    //获得第一个数字的值
    while(str[i] != '\0')
    {
        while(isspace(str[i]) && str[i] != '\0')                  //跳过空格
        i++;

        //如果为数字
        if(isdigit(str[i]) || str[i] == '.')
        if(isfirst)
            result = getvalue(&i,str);
        else
        {
            val2can = 1;
            val2 = getvalue(&i,str);
        }
        while(isspace(str[i]) && str[i] != '\0')                  //跳过空格
        i++;

        //如果不是数字和空格,则做为运算符处理
        if(!isspace(str[i]) && str[i] != '\0' && isch)
        {
            isch = 1;
            ch = str[i++];
        }

        //如果储存了运算符
        if(val2can)
        {
          isch = 1;
          result = yunsuan(result, val2, ch);
          val2 = 0;             //归零
        }
        else
            isch = 0;

        isfirst = 0;
        val2can = 0;
    }
    }
    printf("=  %g\n",result);
    }
    return 0;
}

double getvalue(int *i, char *str)
{
    int j = 0;
    int j2 = 0;
    int z = 0;
    double val1 = 0.0;
    char buffer[N];
    char buffer2[N];

    while(isdigit(str[*i]) || str[*i] == '.')
        {
          //如果是浮数点
          if(str[*i] == '.')
          {
            //得到小数点后的数字
            do
            {
                buffer2[j2++] = str[(*i)++];
            }while(isdigit(str[*i]));

            buffer[j2] = '\0';
            val1 += atof(buffer2);
            break;
          }
          buffer[j++] = str[(*i)++];
        }
              for(z=0;z<j;z++)
              val1 += (buffer[z] - '0')*pow(10,j-z-1);
  
    return val1;
}
double yunsuan(double result, double val2, char ch)
{
    for(;;)
    switch(ch)
    {
    case '+':
        return result + val2;
    case '-':
        return result - val2;
    case '*':
        return result * val2;
    case '/':
        if(val2 == 0.0)
        {
            printf("除数不能为0,请重新输入除数:");
            scanf("%lf",&val2);
            break;
        }
        else
            return result / val2;

    default:
        printf("无法定义的运算符%2c,请重新输入运算符号:",ch);
        scanf(" %c",&ch);
        break;
    }
    return -1;     //如果冲出循环,说明程序出错,返回-1
}


I have not failed completely
2013-01-12 22:23
w20110231130
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2013-1-11
收藏
得分:0 
谢谢了
2013-01-13 07:14
快速回复:简易计算器的算法
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024162 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved