免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 10776 | 回复: 28
打印 上一主题 下一主题

说说看我是什么水平的编程人员。(c++ 四则运算) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-04-18 21:07 |只看该作者 |倒序浏览
通过baidu等搜索到本帖的请往后看,代码在后面

我有一些c++基础,不过不牢。为了验证我的编程水平,并练习一下,应付某公司的c++语言考试。我大约花了12个小时,连自学带编程完成了一个120行的c++语言程序。这个程序的功能很简单,你输入一个正确的带括号、带小数点的四则运算算式,然后我的程序将他的结果计算出来。

大家说说我的水平大约怎么样,可以到公司去应聘软件工程师吗???
我不是学计算机的,也没过二级,但是自己觉得水平还可以。这个程序是用递归函数编写的,我知道用其他方法相对简单,但是递归比较考验一个人的推理能力。

大家先说说吧。

通过baidu等搜索到本帖的请往后看,代码在后面

new add:

麻烦大家给看看是个什么水平,给出月薪,设北京的软件工程师的平均工资是5000,那我能拿多少?

如果用c语言的话,我觉得自己写的程序执行效率已经不低了。真想不出还有什么办法。至于有人用递归函数编写,个人认为,函数的进入和返回都要消耗资源。我这个还是比较简便的。在此基础上当然可以更加提高代码执行效率,但是再编写又要大费周章。估计调试又得一两天,所以只能到这里吧。

俗话说,行家一出手便知有没有,那请大家给赐教一下。“一出手”——所以也没必要全看,那太费时间,我写完第二天再看自己的程序的时候就已经不太顺当了。看别人的程序是很痛苦的,特别是我这样的新人写的程序。变量起名、程序排版等都存在问题,整体风格杂乱——没有任何良好的代码习惯。所以辛苦大家了。

谢谢。

[ 本帖最后由 acc98596 于 2007-4-21 23:52 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2007-04-19 15:40 |只看该作者

回复 #1 acc98596 的帖子

这样你也敢去面度软件工程师,不是我打击你。等你回来就知道了。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
3 [报告]
发表于 2007-04-19 15:50 |只看该作者
原帖由 acc98596 于 2007-4-18 21:07 发表于 1楼  
我有一些c++基础,不过不牢。为了验证我的编程水平,并练习一下,应付某公司的c++语言考试。我大约花了12个小时,连自学带编程完成了一个120行的c++语言程序。这个程序的功能很简单,你输入一个正确的带括号、带 ...

如果方便的话把你的代码贴上来,通过代码判断比较准确。

论坛徽章:
0
4 [报告]
发表于 2007-04-19 16:38 |只看该作者
代码,,,,,反应真实水平

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
5 [报告]
发表于 2007-04-19 16:46 |只看该作者
原帖由 luanqibazao 于 2007-4-19 16:38 发表于 4楼  
代码,,,,,反应真实水平

判断一个人,有”听其言观其行“之说,搜索楼主的帖子浏览一下也可以作为一个判断的参考。

论坛徽章:
0
6 [报告]
发表于 2007-04-21 17:04 |只看该作者
/*麻烦大家给看看是个什么水平,给出月薪,设北京的软件工程师的平均工资是5000,那我能拿多少?

如果用c语言的话,我觉得自己写的程序执行效率已经不低了。真想不出还有什么办法。至于有人用递归函数编写,个人认为,函数的进入和返回都要消耗资源。我这个还是比较简便的。在此基础上当然可以更加提高代码执行效率,但是再编写又要大费周章。估计调试又得一两天,所以只能到这里吧。

俗话说,行家一出手便知有没有,那请大家给赐教一下。“一出手”——所以也没必要全看,那太费时间,我写完第二天再看自己的程序的时候就已经不太顺当了。看别人的程序是很痛苦的,特别是我这样的新人写的程序。变量起名、程序排版等都存在问题,整体风格杂乱——没有任何良好的代码习惯。所以辛苦大家了。

谢谢。*/


//以下是我的程序的第一部分,很多注释都被涂成白色的了,需要的话自己看。
//如果输入错误是得不到正确答案的,正确的输入为 (1+3)*2.11


#include <iostream>
using namespace std;

#define _L_INIT()     L->type=4;L->num=0;L->fh=(char)'/0';//对L初始化的宏

struct Link {
    int type;/*1 代表存储的是一个数字;3 代表存储的是 ')';
                4 代表算式的结尾;2 代表其他符号+、-、*、/、(.*/
    double num;   
    char fh;
    Link *next;   
};

struct Stact{ /*堆栈,用来存放L中指向'('的指针。*/
    Link *L;
    Stact *last;
    Stact *next;
};

void simplify(Link *L); /*去括号程序,去掉算式中的括号。*/
Link *transform(char *cTmp); /*格式转化程序,将cTmp数组中的字符,转化到链表Link中,改变存储形式后,便于以后操作*/
Link *calculate(Link *L);/*运算程序,计算一串不含括号的L链表的值。*/

//待续

[ 本帖最后由 acc98596 于 2007-4-21 23:38 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2007-04-21 17:05 |只看该作者
//程序的第二部分

int main(){
        char cTmp[64];        /*实在不想用数组,但是这里不是本程序的重点,虽然可以改成链表,但实在没什么意思,故先用数组凑合下,其他数据都是链表。*/
        cout<<"enter here:";
        cin>>cTmp;        /*将屏幕数据读入cTmp,这里设输入的是(11.1+2)*3,则cTmp中存储的是:'(','1','1','.','1','+','2',')','*','3','\0'*/
                                                                                       
        Link *L;
        L=transform(cTmp);        /*格式转化程序,如果数组cTmp为'(','1','1','.','1','+','2',')','*',3,'\0'则返回的L链表为
                                        L->fh                 L->num                L->type
        链表头                        '('                        0                        2
        L=L->next                '\0'                11.1                1
        L=L->next                '+'                        0                        2
        L=L->next                '\0'                2                        1
        L=L->next                ')'                        0                        3
        L=L->next                '+'                        0                        2
        L=L->next                '\0'                3                        1
        L=L->next                '\0'                0                        4
        这时我们将L的存储情况称为:L存储的内容为(1+2)*3;
        */
        simplify(L);//对L进行去括号,去括号后L存储的内容变为 3*3
        
        Link *Lres;//用于存放calculate的运算结果。
        Lres=calculate(L);        //此时L链表中已经不含括号,从L链表的头部再进行一次calculate,就有结果。
        cout<<"="<<Lres->num<<endl;
        return 0;
}

//待续

[ 本帖最后由 acc98596 于 2007-4-21 23:39 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2007-04-21 17:09 |只看该作者
//程序第三部分
void simplify(Link *L){
        Link *Lres;//用来存放擦了calculate的结果。
        Link *L1;
        L1=L;
        Stact *pS;//ps是堆栈,用来存放L中指向'('的指针。
        pS=new Stact;
        while(L->type<4){//type=4 代表算式的结尾,在遇到type=4以前进行循环。
                if (L->fh=='(') {//当遇找到'('的时候,便将指向'('的L的地址压入堆栈。
                        pS->next=new Stact;        
                        pS->next->last=pS;
                        pS=pS->next;
                        pS->L=L;
                }
                else if (L->fh==')') {//当遇到')'的时候便从堆栈中提取最近一个指向'('的L的地址pS->L
                        Lres=calculate(pS->L->next);       /*则pS->L->next存储的必是一个数,calculate从pS->L->next开始对一串不含括号的算式计算,直到遇到')'或者'\0',其结果为res。将结果返回到指针Lres,并保证Lres->num=res且Lres->next指向')'后面的L链表,calculate具体过程见它的描述。*/                                                                  
                        /*下面几句将原本的存放指向'('的L,除其本身地址以外,全部替换为calculate的结果。其实质就是将存放1+(2+3)+4的L链表的内容变为1+5+4*/
                        pS->L->type=Lres->type;                                
                        pS->L->num=Lres->num;//(11.1+2)的值放到(1+2)中'('的位置。                                                
                        pS->L->next=Lres->next;        /*(11.1+2)中')'后面的部分,也就是"+3",提前到现在存放11.1+2结果的L的后面,此时L的一系列链表中存放的值变为'13.1','+','3'。*/
                        pS=pS->last;//当前pS->L出栈,存放着上一个指向'('的ps->L做好准备。
                }
                L=L->next;//配合while语句循环。
        }
}
//待续

[ 本帖最后由 acc98596 于 2007-4-21 23:43 编辑 ]

论坛徽章:
0
9 [报告]
发表于 2007-04-21 17:15 |只看该作者
//程序第四部分

Link *calculate(Link *L){/*计算一串不含括号的L链表的值。当主程序while的第一次循环时,需要运算的L链表为'1','+','2'。下面的算法说明就建立在这一串链表上。*/
        /*为了实现先乘除后加减的功能,希望将加减运算变为"上一次运算",也就是当第二次遇到+-号的时候才进行上一次的加减法运算。而两次加减期间只进行乘除运算。这就需要不断修改、保存上次运算的+-号,以及+-号左边的数。*/
        double fans,ans,res;//ans存放上次运算+-号右边的值;fans存放上次运算+-号左边的值。res为最终结果。
        char ffh;/*ffh,为former fuhao,是上一次加减法的符号,其实也就是fans与ans之间的符号。*/
        /*此时本次运算并未开始,故也不存在上次运算,但为了下面的程序,需初始化一个虚拟的上次运算。*/
        ffh='+';//上次运算设的加减号设为+,在算式前面加上0+,比如第一次要计算的一串链表为1+2,此时变为0+1+2。
        fans=0;//上次运算的左项为0
        ans=L->num;//上次运算的右项为L链表中的第一个数
        
        L=L->next;/*L后移,从'+'开始循环,因下面的循环程序中,为了简化if判断,编程时假定每一次判断的对象都是对存放符号的L,而具体数字被放到ans与fans中。*/
        while (L->type<3) {/*当遇到'\0'或者')'的时候结束循环。存储'\0'的L,中L->type=4;存储')'的L,中L->type=3。*/
                if (L->fh=='+'||L->fh=='-') {/*遇到加减法(如遇到1+2*3+4中的第二个加号)则说明需要进行乘除法(2*3)已经结束。可以进行上次的加减运算了,即1+6。*/
                        fans=ffh=='+'?(fans+ans)fans-ans);/*具体进行上次运算,计算结果将存储fans中,作为在下一次遇到+-号时,需要进行相对于下次运算的上次运算的时候的左项。这要等到本次加减法后面的乘除法结束以后进行,所以先保存好。*/
                        ffh=L->fh;//将符号保存好。
                        L=L->next;//上次加减法处理完毕,先进行+-号后面的乘除运算
                        ans=L->num;/*将本次加减号右边数字存放到ans中等待后面的乘除法。若后面又是+-号,则它可以直接作为加减法的右项。*/
                }
                else{
                        ans=(L->fh=='*')?(ans*(L->next->num))ans/(L->next->num));        /*遇到乘除法,则直接用ans与*、/号后面的数字乘除。这就是先乘除。*/
                        L=L->next;//乘除完毕,将L移往*/号后面的数字上。
                }
                L=L->next;/*将L移往数字后面的+ - * /号上。因一下循环程序中,为了简化if判断,编程时假定每一次判断的对象都是对存放符号的L*/
        }
        res=ffh=='+'?(fans+ans)fans-ans);//最后进行一次上一次运算       
        Link *Lres;        //为了返回结果,申请一个存储空间。
        Lres=new Link;
        
        Lres->type=1;//返回结果必为数字
        Lres->num=res;//返回结果为以上对不含括号的L链表的运算结果。
        Lres->next=L->next;        /*运算结束的时候,L应指向')'或者'\0',此时'('与')'之间的运算已经完毕,应将')'后面的L,作为next返回*/
        
        return Lres;
}

//待续

[ 本帖最后由 acc98596 于 2007-4-21 23:47 编辑 ]

论坛徽章:
0
10 [报告]
发表于 2007-04-21 17:16 |只看该作者
//第五部分

/*如果数组cTmp为的字符串,为'(','1','1','.','1','+','2',')','*',3,则希望返回的L链表为
                                                L->type L->num
L=L1                                '('                        0
L=L->next                '\0'                11.1
L=L->next                '+'                        0
L=L->next                '\0'                2
L=L->next                ')'                        0
L=L->next                '+'                        0
L=L->next                '\0'                3

*/
Link *transform(char *cTmp){
        Link *L,*L1;
        L=new Link;
        _L_INIT();
        L1=L;
        
        int i=0,t;
        double tmp;
        
        while (cTmp!='\0') {
                if(cTmp=='.'){
                        i++;                        
                        t=10;
                        while(cTmp<='9'&&cTmp>='0'){
                                tmp=cTmp-48;
                                tmp=tmp/t;
                                L->num=L->num+tmp;
                                t=t*10;
                                i++;
                        }
                }
                else if(cTmp<='9'&&cTmp>='0'){
                        L->type=1;
                        L->num=L->num*10;
                        L->num=L->num+cTmp-48;
                        i++;
                }
                else {
                        if (cTmp[i-1]<='9'&&cTmp[i-1]>='0') {
                                L->next=new Link;
                                L=L->next;
                                _L_INIT();
                        }
                        if (cTmp==')') {
                                L->type=3;
                        }
                        else{
                                L->type=2;
                        }
                        L->fh=cTmp;
                        L->next=new Link;
                        L=L->next;
                        _L_INIT();
                        i++;
                }
        }
        if (cTmp[i-1]<='9'&&cTmp[i-1]>='0') {
                L->next=new Link;
                L=L->next;
                _L_INIT();
        }
        return L1;
}

//over


[ 本帖最后由 acc98596 于 2007-4-21 23:48 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP