结对编程之感

结对编程——四则运算

题目:某公司程序员二柱的小孩上了小学二年级,老师让家长每天出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.小组成员共同完成需求分析文档。

原文地址:https://www.cnblogs.com/wangzuying/p/5384608.html