结对编程——四则运算
结对编程对象:吴雪琴 博客网址: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.小组成员共同完成需求分析文档。 |