zoukankan      html  css  js  c++  java
  • 结对编程之感

    结对编程——四则运算

    题目:某公司程序员二柱的小孩上了小学二年级,老师让家长每天出30道(100以内)四则运算题目给小学生做。

    结对编程对象:吴雪琴  博客网址:http://www.cnblogs.com/snowing0119/p/5373739.html

    代码共计:326行

    编程照片:

    编程代码:

    #include <stdio.h> //计算器
    #include <malloc.h>
    #include <stdlib.h>

    #define STACK_SIZE 100 //max size of the stack
    #define STACK_INCREMENT 10 //realloc size

    typedef struct FStack //stack of int
    {
    float* base;
    float* top;
    int stacksize;
    }FStack;

    void Init(FStack* s)
    {
    s->base = (float*)malloc(STACK_SIZE * sizeof(FStack));
    if (!s->base)
    {
    printf("overflow! ");
    return;
    }
    s->top = s->base;
    s->stacksize = STACK_SIZE;
    }

    bool isEmpty(FStack* s)
    {
    if (s->top == s->base)
    {
    return true;
    }
    else
    {
    return false;
    }
    }

    void Push(FStack* s, float e)
    {
    if (s->top - s->base >= s->stacksize)
    {
    printf("stack is full! realloc %d ", STACK_INCREMENT);
    s->base = (float*)realloc(s->base, (s->stacksize + sizeof(FStack)));
    if (!s->base)
    {
    printf("overflow! ");
    return;
    }
    s->top = s->base + s->stacksize;
    s->stacksize += STACK_INCREMENT;
    }
    *(s->top) = e;
    (s->top)++;
    }

    float GetTop(FStack* s)
    {
    if (s->top == s->base)
    {
    printf("stack is empty! ");
    return 0;
    }
    float e = *(s->top - 1);
    return e;
    }

    void Pop(FStack* s)
    {
    if (s->top == s->base)
    {
    printf("stack is empty! ");
    return;
    }
    s->top--;
    }

    typedef struct CStack //stack of char
    {
    char* base;
    char* top;
    int stacksize;
    }CStack;

    void Init(CStack* s)
    {
    s->base = (char*)malloc(STACK_SIZE * sizeof(CStack));
    if (!s->base)
    {
    printf("overflow! ");
    return;
    }
    s->top = s->base;
    s->stacksize = STACK_SIZE;
    }

    bool isEmpty(CStack* s)
    {
    if (s->top == s->base)
    {
    return true;
    }
    else
    {
    return false;
    }
    }

    void Push(CStack* s, int e)
    {
    if (s->top - s->base >= s->stacksize)
    {
    printf("stack is full! realloc %d ", STACK_INCREMENT);
    s->base = (char*)realloc(s->base, (s->stacksize + sizeof(CStack)));
    if (!s->base)
    {
    printf("overflow! ");
    return;
    }
    s->top = s->base + s->stacksize;
    s->stacksize += STACK_INCREMENT;
    }
    *(s->top) = e;
    (s->top)++;
    }

    char GetTop(CStack* s)
    {
    if (s->top == s->base)
    {
    printf("stack is empty! ");
    return 0;
    }
    char e = *(s->top - 1);
    return e;
    }

    void Pop(CStack* s)
    {
    if (s->top == s->base)
    {
    printf("stack is empty! ");
    return;
    }
    s->top--;
    }

    bool isOper(char ch)
    {
    if (ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '%')
    {
    return true;
    }
    else
    {
    return false;
    }
    }

    int Priority(char ch)
    {
    int p;
    switch (ch)
    {
    case '(':
    p = 0;
    break;
    case '+':
    case '-':
    p = 1;
    break;
    case '*':
    case '/':
    case '%':
    p = 2;
    break;
    }
    return p;
    }

    float Calculate(float f1, float f2, char oper)
    {
    float f3;
    switch (oper)
    {
    case '+':
    f3 = f1 + f2;
    break;
    case '-':
    f3 = f1 - f2;
    break;
    case '*':
    f3 = f1 * f2;
    break;
    case '%':
    f3 = (float)((int)f1 % (int)f2);
    break;
    case '/':
    if (f2 == 0)
    {
    printf(" Devided by zero!");
    exit(1);
    }
    else
    {
    f3 = f1 / f2;
    }
    break;
    }
    return f3;
    }

    float StrtoFloat(char* str, int* pos)
    {
    float fRes;
    int i = *pos;
    int k;
    char n[50];
    for (k = 0; str[i] >= '0' && str[i] <= '9' || str[i] == '.'; i++, k++)
    {
    n[k] = str[i];
    }
    n[k] = '';
    *pos = i;
    fRes = atof(n);
    return fRes;
    }

    bool Check(char* str)
    {
    int i = 0;
    while (str[i] != '')
    {
    if (str[i] != '+' && str[i] != '-' && str[i] != '*' && str[i] != '/' && str[i] != '%' && str[i] != '.' && str[i] != '(' && str[i] != ')' && (str[i] < '0' || str[i] > '9'))
    {
    return false;
    }
    i++;
    }
    return true;
    }

    void main()
    {
    char exp[100];
    int i;
    float f, f1, f2;
    char oper;
    FStack fstack;
    CStack cstack;
    Init(&fstack);
    Init(&cstack);
    printf("The expression is:");
    gets(exp);
    if (!Check(exp))
    {
    printf("input error! exit now! ");
    exit(1);
    }
    for (i = 0; exp[i] != '' && exp[i] != -52; i++)
    {
    if (!isOper(exp[i]))
    {
    f = StrtoFloat(exp, &i);
    Push(&fstack, f);
    }
    if (isOper(exp[i]))
    {
    if (!isEmpty(&cstack))
    {
    while (!isEmpty(&cstack) && Priority(exp[i]) <= Priority(GetTop(&cstack)))
    {
    oper = GetTop(&cstack);
    Pop(&cstack);
    f2 = GetTop(&fstack);
    Pop(&fstack);
    f1 = GetTop(&fstack);
    Pop(&fstack);
    f = Calculate(f1, f2, oper);
    Push(&fstack, f);
    }
    Push(&cstack, exp[i]);
    }
    else
    {
    Push(&cstack, exp[i]);
    }
    }
    else if (exp[i] == '(')
    {
    Push(&cstack, exp[i]);
    }
    else if (exp[i] == ')')
    {
    while (GetTop(&cstack) != '(' && !isEmpty(&cstack))
    {
    oper = GetTop(&cstack);
    Pop(&cstack);
    f2 = GetTop(&fstack);
    Pop(&fstack);
    f1 = GetTop(&fstack);
    Pop(&fstack);
    f = Calculate(f1, f2, oper);
    Push(&fstack, f);
    }
    Pop(&cstack);
    }
    }
    while (!isEmpty(&cstack))
    {
    oper = GetTop(&cstack);
    Pop(&cstack);
    f2 = GetTop(&fstack);
    Pop(&fstack);
    f1 = GetTop(&fstack);
    Pop(&fstack);
    f = Calculate(f1, f2, oper);
    Push(&fstack, f);
    }
    printf(" The result is:%f ", GetTop(&fstack));
    Pop(&fstack);

    getchar();
    getchar();
    getchar();
    }

    运行结果:

    结对编程的感想:

         我觉得每人在各自独立设计、实现软件的过程中不免要犯这样那样的错误。在结对编程中,因为有随时的复审和交流,

    程序各方面的质量取决于一对程序员中各方面水平较高的那一位。这样,程序中的错误就会少得多,程序的初始质量会高

    很多,这样会省下很多以后修改、测试的时间。

          经过这次结对编程后,收获良多。不仅认识了另一种编程方式,还深刻的体会到了,自己是很难意识到自己的错误的。

    所以,可以把队友当成一面镜子,完善程序,也完善自己。

    点滴成就学习时间新编写代码行数博客量(篇)学到知识点
           
    第一周 8h 0 0 重新审视了软件工程,真正的体会到软件不是代码是工程。需要团队协作,不是一个人闭门造车。
    第二周 8h 0 1 学到了另一种学习方式——写博文,博文可以总结我们所学的知识,从而使我们对知识点的印象更加深刻,记录我们的学习过程,更重要的是,能把所学与别人分享。
    第三周 12h 0 1 1.进行了“头脑风暴”  2.学会了制作调查问卷。
    第四周 14h 500 1 1.实行了结对编程 2.小组成员共同完成需求分析文档。
    点滴成就学习时间新编写代码行数博客量(篇)学到知识点
           
    第一周 8h 0 0 重新审视了软件工程,真正的体会到软件不是代码是工程。需要团队协作,不是一个人闭门造车。
    第二周 8h 0 1 学到了另一种学习方式——写博文,博文可以总结我们所学的知识,从而使我们对知识点的印象更加深刻,记录我们的学习过程,更重要的是,能把所学与别人分享。
    第三周 12h 0 1 1.进行了“头脑风暴”  2.学会了制作调查问卷。
    第四周 14h 500 1 1.实行了结对编程 2.小组成员共同完成需求分析文档。

  • 相关阅读:
    Android Studio代码自己主动检測错误提示
    uva 1567
    UWP 新手教程2——怎样实现自适应用户界面
    远程服务的使用场景
    本地服务和远程服务
    本地应用调用远程服务中的方法
    混合方式开启服务
    绑定服务抽取接口
    绑定服务调用服务里的方法
    bind绑定服务的生命周期
  • 原文地址:https://www.cnblogs.com/wangzuying/p/5384608.html
Copyright © 2011-2022 走看看