c-关于C++四则运算器制作的问题,求各位大神支招.......

问题描述

关于C++四则运算器制作的问题,求各位大神支招.......

题目要求是:编写计算加减乘除四则程序,计算输入的表达式结果(表达式不带运算符号),例如:
1+2*3-10/2
=1+6-10/2
=7-10/5
=7-5
=2
以下是我的源码(我只做到乘除的加减的,还没加进去就好像死循环还是咋的了....):
#include
#include
using namespace std;
int k(char p)
{
int k,n=strlen(p);
for(int i=0;i<n;i++)
{
k=0;
if(
(p+i)=='/'||*(p+i)=='*')
{
k=1;
break;
}
}
return k;
}
int Jack(int a,int *c,int n,char *o)
{
int t;
for(t=0;t<n;t++)
if(
(o+t)=='*'&&*(o+t)=='/')break;
for(int i=t-1;i>=0;i--)
{
if(*(o+i)=='*'&&*(o+i)=='/')
{
a=i;
break;
}
}
for(int i=t+1;i<n;i++)
{
if(
(o+i)=='*'&&*(o+i)=='/')
{
c=i;
break;
}
}
return t;
}
int j(int r,int b)
{
int j=1;
for(int t=r;t<b-1;t++)
j=j*10;
return j;
}
int main()
{
char array[30];
cin.getline(array,30);
int m,a,b,c,x=0,y=0,z,n=strlen(array);
do{
m=k(array);
b=Jack(&a,&c,n,array);
for(int r=a+1;r<b;r++)
x=x+array[r]*j(r,b);
for(int r=b+1;r<c;r++)
y=y+array[r]*j(r,c);
if(array[b]=='
')z=x*y;
else z=x/y;
array[b+1]=z;
for(int h=1;h<n-a;h++)array[b+1+h]=array[c-1+h];
cout<<"="<<array<<endl;
}while(m);
}
这个运行不了啊,应该有个地方死循环了,可是找不到,顺便问一下codeblocks的单步调试框框和步骤是怎么样的~谢谢了哈

解决方案

其他没看清楚,

if(*(o+i)=='*'&&*(o+i)=='/') 是不是写错了.

解决方案二:

https://code.csdn.net/snippets/535409
以前修改答复的一个例子可以参考

解决方案三:

#include <iostream>
#include <string>
using namespace std;
inline int compare(string str1,string str2) {//相等返回0,大于返回1,小于返回-1
         if (str1.size()>str2.size()) return 1; //长度长的整数大于长度小的整数
    else if (str1.size()<str2.size()) return -1;
    else                              return str1.compare(str2); //若长度相等,则头到尾按位比较
}
string SUB_INT(string str1,string str2);
string ADD_INT(string str1,string str2) {//高精度加法
    int sign=1; //sign 为符号位
    string str;
    if (str1[0]=='-') {
        if (str2[0]=='-') {
            sign=-1;
            str=ADD_INT(str1.erase(0,1),str2.erase(0,1));
        } else {
            str=SUB_INT(str2,str1.erase(0,1));
        }
    } else {
        if (str2[0]=='-') {
            str=SUB_INT(str1,str2.erase(0,1));
        } else { //把两个整数对齐,短整数前面加0补齐
            string::size_type L1,L2;
            int i;
            L1=str1.size();
            L2=str2.size();
            if (L1<L2) {
                for (i=1;i<=L2-L1;i++) str1="0"+str1;
            } else {
                for (i=1;i<=L1-L2;i++) str2="0"+str2;
            }
            int int1=0,int2=0; //int2 记录进位
            for (i=str1.size()-1;i>=0;i--) {
                int1=(int(str1[i])-'0'+int(str2[i])-'0'+int2)%10;
                int2=(int(str1[i])-'0'+int(str2[i])-'0'+int2)/10;
                str=char(int1+'0')+str;
            }
            if (int2!=0) str=char(int2+'0')+str;
        }
    }
    //运算后处理符号位
    if ((sign==-1)&&(str[0]!='0')) str="-"+str;
    return str;
}
string SUB_INT(string str1,string str2) {//高精度减法
    int sign=1; //sign 为符号位
    string str;
    int i,j;
    if (str2[0]=='-') {
        str=ADD_INT(str1,str2.erase(0,1));
    } else {
        int res=compare(str1,str2);
        if (res==0) return "0";
        if (res<0) {
            sign=-1;
            string temp =str1;
            str1=str2;
            str2=temp;
        }
        string::size_type tempint;
        tempint=str1.size()-str2.size();
        for (i=str2.size()-1;i>=0;i--) {
            if (str1[i+tempint]<str2[i]) {
                j=1;
                while (1) {//zhao4zhong1添加
                    if (str1[i+tempint-j]=='0') {
                        str1[i+tempint-j]='9';
                        j++;
                    } else {
                        str1[i+tempint-j]=char(int(str1[i+tempint-j])-1);
                        break;
                    }
                }
                str=char(str1[i+tempint]-str2[i]+':')+str;
            } else {
                str=char(str1[i+tempint]-str2[i]+'0')+str;
            }
        }
        for (i=tempint-1;i>=0;i--) str=str1[i]+str;
    }
    //去除结果中多余的前导0
    str.erase(0,str.find_first_not_of('0'));
    if (str.empty()) str="0";
    if ((sign==-1) && (str[0]!='0')) str ="-"+str;
    return str;
}
string MUL_INT(string str1,string str2) {//高精度乘法
    int sign=1; //sign 为符号位
    string str;
    if (str1[0]=='-') {
        sign*=-1;
        str1 =str1.erase(0,1);
    }
    if (str2[0]=='-') {
        sign*=-1;
        str2 =str2.erase(0,1);
    }
    int i,j;
    string::size_type L1,L2;
    L1=str1.size();
    L2=str2.size();
    for (i=L2-1;i>=0;i--) { //模拟手工乘法竖式
        string tempstr;
        int int1=0,int2=0,int3=int(str2[i])-'0';
        if (int3!=0) {
            for (j=1;j<=(int)(L2-1-i);j++) tempstr="0"+tempstr;
            for (j=L1-1;j>=0;j--) {
                int1=(int3*(int(str1[j])-'0')+int2)%10;
                int2=(int3*(int(str1[j])-'0')+int2)/10;
                tempstr=char(int1+'0')+tempstr;
            }
            if (int2!=0) tempstr=char(int2+'0')+tempstr;
        }
        str=ADD_INT(str,tempstr);
    }
    //去除结果中的前导0
    str.erase(0,str.find_first_not_of('0'));
    if (str.empty()) str="0";
    if ((sign==-1) && (str[0]!='0')) str="-"+str;
    return str;
}
string DIVIDE_INT(string str1,string str2,int flag) {//高精度除法。flag==1时,返回商; flag==0时,返回余数
    string quotient,residue; //定义商和余数
    int sign1=1,sign2=1;
    if (str2 == "0") {  //判断除数是否为0
        quotient= "ERROR!";
        residue = "ERROR!";
        if (flag==1) return quotient;
        else         return residue ;
    }
    if (str1=="0") { //判断被除数是否为0
        quotient="0";
        residue ="0";
    }
    if (str1[0]=='-') {
        str1   = str1.erase(0,1);
        sign1 *= -1;
        sign2  = -1;
    }
    if (str2[0]=='-') {
        str2   = str2.erase(0,1);
        sign1 *= -1;
    }
    int res=compare(str1,str2);
    if (res<0) {
        quotient="0";
        residue =str1;
    } else if (res == 0) {
        quotient="1";
        residue ="0";
    } else {
        string::size_type L1,L2;
        L1=str1.size();
        L2=str2.size();
        string tempstr;
        tempstr.append(str1,0,L2-1);
        for (int i=L2-1;i<L1;i++) { //模拟手工除法竖式
            tempstr=tempstr+str1[i];
            tempstr.erase(0,tempstr.find_first_not_of('0'));//zhao4zhong1添加
            if (tempstr.empty()) tempstr="0";//zhao4zhong1添加
            for (char ch='9';ch>='0';ch--) { //试商
                string str;
                str=str+ch;
                if (compare(MUL_INT(str2,str),tempstr)<=0) {
                    quotient=quotient+ch;
                    tempstr =SUB_INT(tempstr,MUL_INT(str2,str));
                    break;
                }
            }
        }
        residue=tempstr;
    }
    //去除结果中的前导0
    quotient.erase(0,quotient.find_first_not_of('0'));
    if (quotient.empty()) quotient="0";
    if ((sign1==-1)&&(quotient[0]!='0')) quotient="-"+quotient;
    if ((sign2==-1)&&(residue [0]!='0')) residue ="-"+residue ;
    if (flag==1) return quotient;
    else         return residue ;
}
string DIV_INT(string str1,string str2) {//高精度除法,返回商
    return DIVIDE_INT(str1,str2,1);
}
string MOD_INT(string str1,string str2) {//高精度除法,返回余数
    return DIVIDE_INT(str1,str2,0);
}
int main() {
    char ch;
    string s1,s2,res;

    while (cin>>s1>>ch>>s2) {
        switch (ch) {
            case '+':res=ADD_INT(s1,s2);break;
            case '-':res=SUB_INT(s1,s2);break;
            case '*':res=MUL_INT(s1,s2);break;
            case '/':res=DIV_INT(s1,s2);break;
            case '%':res=MOD_INT(s1,s2);break;
            default :                   break;
        }
        cout<<res<<endl;
    }
    return(0);
}

解决方案四:

兄弟,代码要写规范点啊,这种太难读懂了。命名最好有意义,不会英文的话汉语拼音也行。

解决方案五:

首先把你的表达式转成后缀表达式,然后根据后缀表达式正常执行就可以了,因为这个没有优先级那么乱七八糟的东西。

解决方案六:

我认为你应该用cout设置断点查看。

时间: 2024-09-02 17:12:57

c-关于C++四则运算器制作的问题,求各位大神支招.......的相关文章

我想自己开发一个制作微请柬的软件,可是没有思路,请各位大神支招

问题描述 如题.本人婚期将至,想自己开发一个这样的软件(就是可以自己编辑,然后可以上传照片之类的,最后生成一个请柬,类似于打开共微信里的公众号推送的消息那样).可是之前一直没有接触过这类开发,所以感觉丈二和尚摸不着头脑..请各位有经验的大神提供一下思路.本人是从事.net开发开发的. 解决方案 解决方案二:遇到一个对我来说老难的问题真心不知道该怎么解决首先有一张表A字段有编号,名称,卡号是两位的char类型有一个页面B在进入时显示主要这么几部分:1学号输入栏2查询按纽3各种个人信息4很多个多选框

写软件-如何制作抽奖软件,各位大神

问题描述 如何制作抽奖软件,各位大神 想 自己 做一个滚动抽奖软件 如何制作抽奖软件,各位大神,谢谢 解决方案 看用什么语言,设计好界面.比如js.swing.mfc.wpf等不同的技术可以做界面.然后用随机数去抽奖,涉及你的抽奖方式,比如根据电话号码摇号,转盘.彩票号等.建议你提出具体的需求,或者google对应的代码. 解决方案二: 用Excel制作抽奖软件 解决方案三: 制作一个界面,随机产生数字不是好了吗?有什么需求吗或者说你说详细点 解决方案四: 页面一个转盘,数据库一个奖池.....

c#窗体应用程序-用C#的winform制作KTV点歌系统 求各路大神点拨

问题描述 用C#的winform制作KTV点歌系统 求各路大神点拨 怎么样改变窗体的外观,一直想制作扁平化的界面.怎么做呢? 解决方案 你对中窗体右击属性嘛,对应有窗体外观属性的 解决方案二: 这个得找专业UI公司做图片吧,然后修改控件的backgroundimage等属性才能实现

table-java web开发,ssh框架,我想询问下载jsp里,下面的表格怎么制作?求大神指导

问题描述 java web开发,ssh框架,我想询问下载jsp里,下面的表格怎么制作?求大神指导 下边是形成的效果,行是固定的就是1到4:列也是固定的就是第一年到第六年. 跪求大神指导 解决方案 http://blog.csdn.net/cuishijin/article/details/1577009 这里面总结了一些资料,你可以去看下 解决方案二: table tr td

图标设计-大神请进,关于图标制作的问题

问题描述 大神请进,关于图标制作的问题 在百度搜了许久,没有得到答案,我就是想知道像qq这样的超大精致图标到底怎么制作,有会的吗? 解决方案 这个应该是 PS 高手设计的吧,专业的设计软件 解决方案二: 绘图软件 用不着ps

制作u-boot的logo但是不加载lcd驱动的办法,求站内大神帮助!!

问题描述 制作u-boot的logo但是不加载lcd驱动的办法,求站内大神帮助!! 如题,仿照hawk的方式设置好了相关地址,hawk的logo能正常打印但是现在想换成自己的图片,由于hawk的logo是白色背景加指针的形式,小的刚开始研究u-boot,不知道怎么改,试过直接打印数组形式的图片但是打印出来的图片扭曲加变形色彩也不对但是打印全屏一个颜色却可以,搞得我头昏脑涨,所以希望各位大神能多多指点,小的在这里谢过了 解决方案 http://wenku.baidu.com/link?url=UZ

discuz论坛-如何用xmapp制作论坛,求大神指导

问题描述 如何用xmapp制作论坛,求大神指导 如何用xmapp然后利用discuz制作论坛,需要有详细过程,谢谢各位大神帮忙 解决方案 http://www.xampp.org.cn/forum.php?mod=forumdisplay&fid=2 解决方案二: 给你一个压缩包...1步搞定...so easy,装好记得回来采纳哦~http://www.discuz.net/thread-3266172-1-1.html

游戏-求大神~帮忙改一下。把这串代码改成函数的方式(问题是:用C语言函数制作石头剪刀布)

问题描述 求大神~帮忙改一下.把这串代码改成函数的方式(问题是:用C语言函数制作石头剪刀布) #include #include #include #include void printMenu(void) { printf("tt -------------------------------------------n"); printf("tt| 石头剪刀布游戏 |n"); printf("tt| ---------------------------

单片机-想做一个小制作,想像舞台上追光灯自动跟着信号发射器转这个原理,求大神帮忙

问题描述 想做一个小制作,想像舞台上追光灯自动跟着信号发射器转这个原理,求大神帮忙 想做一个小制作,想像舞台上追光灯自动跟着信号发射器转这个原理,求大神帮忙 解决方案 如果用js的话-可以考虑用three.js这个Webgl框架-网上有教程--很好用--实现3d或者平面效果都不错--楼主可以去搜搜 解决方案二: http://wenku.baidu.com/link?url=-4hQzyvforI53ZkhVYFfo7AlWhqX5cO738akk_DxxMTDeYXns5sLx4cInO7w7