c语言程序实习计划书
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
程序实习报告书
学号:2011272086
班级:通信113 ________________
姓名:李成元____________________
指导教师:赵金胜刑延超
通信与电子工程学院
2012年6月30日
1设计时间
2012.06.18-2012.06.29
2设计目的
1、实习目的
⑴熟练掌握和系统理解C语言的基本知识点:数据类型、程序结构、函数、数组、结构体、文件等。
⑵学会用C语言解决实际问题的方法
⑶掌握较大型程序设计及调试的一般步骤和方法。
3设计任务
综合运用C语言程序设计课程的主要知识设计一个计算器程序,利用算符优先关系,实现对算术四则
混合运算表达式的求值。
⑴输入的形式:算术表达式,以井号“#”结束。
例如2*(3+4)# ;
包含的运算符只能有’+'、’-'、'*'、’/'、’('、')';
⑵输出的形式:运算结果,例如An swer is:14 ;
⑶程序所能达到的功能:对算术表达式求值并输出结果。
4.1需求分析
1、程序所能达到的功能:能够处理以字符序列的形式输入的不含变量的实数表达式,正确处理负数与小数,判断表达式是还语法正确(包含分母不能为零的情况),正确实现对算术四则混合运算表达式的求值,能够将计算中遇到的问题和结果以文件的形式予以存储。
2、输入的形式和输入值的范围:以字符串的形式输入表达式,以“#”结束。
3、输出的形式:在计算过程中遇到的问题或最终的答案将显示在屏幕上,同时所计算的表达式的最终的结果也将保存在文件中。
4、测试数据:输入“ 3*(7-2)# ”时,输出“ 15.000000”,测试正确;输入“ !(9-2)# 时,输出“输入错误!”,测试正确。
4.2总体设计
421抽象数据类型定义
ADT Stack{
数据对象:D={ a
i|a i€ ElemSet,i=1,2,,…n, n三0} 数据对象:R1={< 玄起/心二耳亡D ,i=2, •;• n}
约定a n端为栈顶,a i端为栈底。
基本操作:
In itStack(&S)
操作结果:构造一个空栈S o
GetTop(S)
初始条件:栈S已存在。
操作结果:用P返回S的栈顶元素
Push(&S, ch)
初始条件:栈S已存在。
操作结果:插入元素ch为新的栈顶元素。
Pop(&S)
初始条件:栈S已存在。
操作结果:删除S的栈顶元素。
In(ch)
操作结果:判断子符是否是运算符,运算符即返回1o Precede(c1, c2)
初始条件:c1,c2为运算符
423主函数流程图
424函数模块调用关系
I主程序模块
栈的建立及初始化模块
O
「—
判断输入是否结束模块
丿
厂▽’
匕、,V
运算数进栈模块运算符优先级比较模块
Q3
运算符进栈模块运算符运算数出栈模块
I 丿P ■
~TJ~
运算模块
425运算符间的优先关系
4.3详细设计
I
431数据类型的定义及基本操作
Status Push(SqStack& S,SEIemType e){
if (S.top-S.base>=S.stacksize){
S.base=(SEIemType*realloc(S.base
,(S.StackSize+STACKINCREMENT)*sizeof (SElemType)); if (!S.base)exit(OVERFLOW);
S.top=S.base+S.stacksize;
S.stacksize += STACKINCREMENT;
}
*S.top++ =e;
return OK;
}
Status Pop(SqStack& S,SElemType & e){
if (S.top == S.base)return ERROR;
e = * --S.top;
return OK;
}
Opera ndType EvaluateExpessi on(){
InitStack(OPTR); Push(OPTR, ' #');
In itStack(OPND); c = getchar();
while(c! ' #' ||GetTop(OPTR)!= ' #' ){
if (!I n( c,OP)){Push((OPND,c); c = getchar();) else
switch(Precede(GetTop(OPTR),c)){
case <' :Push(OPTR,c); c = getcha bfeak;
case =' :Pop(OPTR,x); c = getcha break;
case >' :Pop(OPTR,theta); Pop(OPND,b); Pop(OPND,a);
Push(OPND,Operate(a,theta,b))b reak;
}
}
}
432函数调用关系
433主要模块的算法描述
void mai n(){
SqStack_T OPTR;SqStack_N OPND;
float a,b,i; char theta,c,x;
InitStack_T(&OPTR);Push_T(&OPTR' #');
In itStack」N(&OPND);
printf(请输入表达式关以’#'结尾:n”);
c=getchar();
if (c==35||(c>=4 0&&c<=43)||c==45||(c>=47&&c<=57))
4.4测试与分析
441测试
加法测试,输入正确,输出正确,测试正确:
■3 C:\J M SO FT\CYuYa n\bi n\wwtem p,exe 请输入裘达式并以■'结尾: 3+2# 结果是 5. 000000
乘法测试,输入正确,输出正确,测试正确:
Ci\JM SOFT\C¥u¥an\bin\wwtemp .exe
请输入軽式并以'岸结尾: 3*2# 结果是6. 000000
输入表达式正确,输出正确,测试正确:
C:\JMSO FT\CVuYan\bin L>vwt&mp.exe 请输入表达式并応览尾: 3* (7-2)# 结果是15. 000000
char e;
if ((* S).top== (* S).base) return ERROR; e=* ((*S).top-1);
return e;
}
float GetTop_N(SqStack_N*S){
float e;
if ((* S).top== (* S).base) return ERROR;
e=* ((*S).top-1);
return e;
}
char Push_T(SqStack_T*S,char eX
if ((* S).top-(* S).base>=(* S). stacksizeX
(*S).base=(char
*)realloc((*S).base,(*S).stacksize+STACKINCREMENT) *sizeof(char)); if(!(*S).base) exit(OVERFLOW);
(* S).top= (* S).base^ (* S).stacksize;
(*S).stacksiz(+=STACKINCREMENT;
}
*((*S).top)++=e;
return OK;
}
float Push N(SqStack N*S,float eX
if ((* S).top-(* S).base>=(* S). stacksizeX
(*S).base=(float
*)realloc((*S).base,(*S).stacksize+STACKINCREMENT) *sizeof(float)); if(!(*S).base) exit(OVERFLOW);
(* S).top= (* S).base^ (* S).stacksize;
(*S).stacksiz(+=STACKINCREMENT;
}
*((*S).top)++=e;
return OK;
}
char Pop_T(SqStack_T* S){
char e;
if ((* S).top== (* S).base) return ERROR;
e=* (--(*S).top);
return e;
}
float Pop_N(SqStack_N*S){
float e;
if ((* S).top== (* S).base) return ERROR;
e=* (--(*S).top);
return e;
}
char m[7] ="+-*/()#";
char n [71[71 ={ ">><<<>>" ,">><<<>>" ,">>>><>>" ,">>>><>>" ,"<<<<<= ,">>>> >>","<<<<< ="};
char PrecedeChar a,char b){
int i=O,j=O;
while(m[i] !=a)
i++;
while(m[j] !=b)
j++;
return( n[i][j]);
}
float Operatefloat a,char thetafloat b){
float r;
switch(theta){
case+':r=a+b;break; cas^':r=a-b;break; case*' :r=a*b;break; case/':if(b!=O)r=a/b;
else printf("输入错误!"); break;
}
return r;
}
void mai n(){
SqStack_T OPTR;
SqStack N OPND;
float a,b,i;
Push_N(&OPND,Operate(a,theta,b))breaK
} printf("结果是%f\n" ,GetTop_N(&OPND));
}
else printf("输入错误! \n");
5总结与展望
通过这段时间的课程设计,本人对计算机的应用、数据结构的作用以及C语言的使用都有了更深的了解。
当然也遇到不少问题,也正是国为这些问题引发的思考给我带来了收获。
从当初不喜欢上机写程序到现在能主动写程序,从当初拿着程序不知从何下手到现在知道如何分析问题,如何用专业知识解决实际问题的转变。
我发现无论是专业知识还是动手能力,自己都有很大程度的提高。
在实际上机操作过程中,不仅是让我们了解数据结构的理论知识,更重要的是培养解决实际问题的能力,为后续课程的学习及实践打下良好的基础。
这次课程设计让我更加了解大一学到的C和这个学期学到的数据结构的紧密联系。
设计题目不仅要求设计者对课本知识有较深刻的了解,同时要有较强的思维动手能力。
这次的课程设计让我有一个深刻的体会:严谨!编程最需要的就是严谨,往往检查到的错误是在某个括号、分号、引号等不应该犯错的地方上。
程序设计时难免遇到错误,但这不是坏事情,它可以让我发现自己的薄弱环节,在具体操作中还可以巩固所学的C及数据结构。
更加体会到了C的语句简洁、使用灵活、执行效率高等特点。