四则运算程序报告
四则运算实验报告

实验3四则运算表达式求值背景在工资管理软件中,不可避免的要用到公式的定义及求值等问题。
对于数学表达式的计算,虽然可以直接对表达式进行扫描并按照优先级逐步计算,但也可以将中缀表达式转换为逆波兰表达式,这样更容易处理。
问题描述四则运算表达式求值,将四则运算表达式用中缀表达式,然后转换为后缀表达式,并计算结果。
基本要求使用二叉树来实现。
实现提示利用二叉树后序遍历来实现表达式的转换,同时可以使用实验2的结果来求解后缀表达式的值。
输入输出格式:输入:在字符界面上输入一个中缀表达式,回车表示结束。
输出:如果该中缀表达式正确,那么在字符界面上输出其后缀表达式,其中后缀表达式中两相邻操作数之间利用空格隔开;如果不正确,在字符界面上输出表达式错误提示。
选作内容(1)在输入输出方式上要求使用:输入:将中缀表达式存于文本文件中,程序从该文本文件中读出表达式。
输出:如果该中缀表达式正确,则将后缀表达式输出到该文件中原表达式的后面,它们之间用“---”后相连;如果不正确,请在输出表达式错误提示到该文件原表达式的后面,它们之间用“---”相连。
(2) 利用堆栈来实现中缀表达式转换为后缀表达式。
测试用例输入:21+23*(12-6)输出:21 23 12 6 -*+程序代码:#include <iostream>#include <string.h>using namespace std;#define SIZE 100#define STACKINCREMENT 10template<class T>//栈class stack{public:void InitStack() {S.base = (T *)malloc(SIZE * sizeof(T));if(!S.base) exit(0);S.top = S.base;S.stacksize = SIZE;}void DestroyStack(){free(S.base);}void ClearStack(){S.top = S.base;}bool StackEmpty(){if(S.top == S.base) return true;else return false;}int StackLength(){return (S.top - S.base);}bool GetTop(T &t){if(S.top != S.base){t = *(S.top - 1);return true;}else return false;}void Push(T t){if(S.top - S.base >= S.stacksize){S.base = (T *)realloc(S.base,(S.stacksize + STACKINCREMENT) * sizeof(T));if(!S.base) exit(0);S.top = S.base + S.stacksize;S.stacksize += STACKINCREMENT;}*S.top = t;S.top++ ;}bool Pop(T &t){if(S.top == S.base) return false;else S.top-- ;t = *S.top ;return true;}private:struct SqStack{T *base;T *top;int stacksize;}S;};class BiTree{private:struct BiTreeNode{char OPT[10];BiTreeNode *lchild,*rchild;};BiTreeNode *T; //T是根结点int index; //index是后缀表达式转换二叉树时的索引int number_of_point ;//销毁一颗树void DestroyTree(BiTreeNode *T){if(T){DestroyTree(T->lchild);DestroyTree(T->rchild);free(T);}}void DestroyTree(){DestroyTree(T);}//1表示栈顶优先级高于待入栈的元素int compare(char a,char b){ //定义了任意两个运算符的优先级if(a == '(' && b == ')') return 0;else if((a == '+' && b == '*') || (a == '+' && b == '/') || (a == '-' && b == '*') || (a == '-' && b == '/')|| (a != ')' && b == '(') || (a == '(' && b != ')'))return -1;else return 1;}//递归构造start,end分别是一个式子开始值和结束值的索引/*递归构造中缀表达式转化为的二叉树(利用栈) */void InorderCreate(BiTreeNode *&T,char str[30][10],int start,int end){ if(start == end) { //递归终止if(!(T = (BiTreeNode *)malloc(sizeof(BiTreeNode)))) exit(0);strcpy(T->OPT,str[start]);T->lchild = NULL;T->rchild = NULL;}else{stack<char> opt;stack<int> num;num.InitStack();opt.InitStack();char last;int index;int a;bool jump = false;for(int i = start;i <= end;i++) { //begin求解优先级最小的一个运算符if(jump) break;number_of_point = 0 ;if(IsNumber(str[i][0]) || str[i][0] == '-' &&IsNumber(str[i][1]) )continue;else{char c = str[i][0];char b;if(i == start && c == '(') {start += 1;continue;}else if(opt.StackEmpty() || (opt.GetTop(b) && compare(b,c) == -1)){opt.Push(c);num.Push(i);}else{if(c != ')'){opt.Pop(b);num.Pop(a);if(!opt.StackEmpty()){opt.GetTop(b);if(compare(b,c) == 1){opt.Pop(b);num.Pop(a);opt.Push(c);num.Push(i);}else{opt.Push(c);num.Push(i);}}else{opt.Push(c);num.Push(i);}}else{for(opt.GetTop(b);compare(b,c) != 0;opt.GetTop(b)){opt.Pop(b);num.Pop(a);if(opt.StackEmpty()){opt.Push(b);num.Push(a);end -= 1;jump =true;break;}}if(compare(b,c) == 0) {opt.Pop(b);num.Pop(a);}}}}} //end,得到的是该步中的根结点字符last及其索引indexopt.Pop(last);num.Pop(index);if(!opt.StackEmpty()){opt.Pop(last);num.Pop(index);}opt.DestroyStack();num.DestroyStack();if(!(T = (BiTreeNode *)malloc(sizeof(BiTreeNode)))) exit(0);T->OPT[0] = last;T->OPT[1] = '\0';InorderCreate(T->rchild,str,start,index-1);InorderCreate(T->lchild,str,index+1,end);}}bool IsNumber(char a){ //判断一个字符是否为数值形式的if( a == '.' && number_of_point == 0 ) {number_of_point ++ ;return true;}else if('0' <= a && a <= '9') return true ;else return false;}//递归求解树表示的表达式的值double Operate(BiTreeNode *T){if(T->lchild==NULL && T->rchild==NULL){double num = atof(T->OPT); //调用系统函数atof()将字符串转换为浮点数return num;}double ld,rd;ld = Operate(T->lchild);rd = Operate(T->rchild);char c = T->OPT[0];switch(c){case '+': return ld+rd;break;case '-': return rd-ld;break;case '*': return ld*rd;break;case '/': return rd/ld;break;default:cout << " you have entered wrong data ! "<< endl ;return 0;break ;}}void display(BiTreeNode *T){if(T == NULL ) return ;display(T->rchild);display(T->lchild);cout << T->OPT << " " ;public:BiTree() {T = NULL ;index = 0 ;number_of_point = 0 ;}/*以下两个函数重载私有成员函数方便计算*/void InorderCreate(){char OPT[30][10];cout << "输入中缀表达式: " << endl;char c = getchar();bool flag = true;int i = 0,j = 0 ;while(c != 10) { //输入的是空格j = 0;if(c == '-' && flag == true) { //flag判断是否是一个负数的值OPT[i][j++] = c;for(c = getchar() ; IsNumber(c) ; c = getchar() )OPT[i][j++] = c;OPT[i++][j] = '\0';flag = false;}else if(IsNumber(c)){OPT[i][j++] = c;for(c = getchar();IsNumber(c);c = getchar())OPT[i][j++] = c;OPT[i++][j] = '\0';flag = false;}else //运算符时的处理{flag = true;OPT[i][j++] = c;OPT[i++][j] = '\0';c = getchar();}}InorderCreate(T,OPT,0,i-1);}double Operate(){return Operate(T);}void display(){display(T) ;}~BiTree() {DestroyTree();};int main(){BiTree tree;tree.InorderCreate();cout << endl << tree.Operate() << endl;tree.display() ;cout << endl ;return 0;}测试结果:。
【7A版】四则运算表达式求值实验报告

HUNANUNIVERSITY课程实习报告题目:四则运算表达式求值学生姓名:学生学号:专业班级:指导老师:完成日期:一、需求分析四则运算表达式求值,将四则运算表达式用中缀表达式表示,然后转换为后缀表达式,并计算结果。
本程序要求利用二叉树后序遍历来实现表达式的转换,同时可以使用实验2的结果来求解后缀表达式的值。
在字符界面上输入一个中缀表达式,回车表示结束。
如果该中缀表达式正确,那么在字符界面上输出其后缀表达式,其中后缀表达式中两相邻操作数之间利用空格隔开;如果不正确,在字符界面上输出表达式错误提示。
测试数据输入:21+23G(12-6)输出:2123126-G+二、详细设计输入和输出的格式输入本程序可以将输入的四则运算表达式(中缀表达式)转换为后缀表达式输出后缀表达式为://输出结果的位置表达式的值为://输出结果的位置三、调试分析本次实验的难点主要是在建立二叉树的问题上。
关于如何把中缀表达式存入二叉树中,我参考了网上的一些方法,成功实现了目标,但是却遇到了一个问题,那就是不能处理小数,甚至两位或两位以上的整数。
因为如果采用字符数组来存储操作数,运算符合一位整数还可以处理,但对于两位数就就会出问题,最后我改进采用字符串数组来存储操作数,成功解决了问题。
另外在处理输入的非法表达式问题中,我也费了很大功夫,但总体问题不大。
四、测试结果五、用户使用说明(可选)1、运行程序时提示输入四则运算表达式本程序可以将中缀表达式转化为后缀表达式,并计算结果请输入四则运算表达式:输出后缀表达式为:表达式的值为:程序源代码(c++)#include<iostream>#include<string>#include<stack>#include<iomanip>constintMaG=100;usingnamespacestd;classNode{public:charch[MaG];//考虑到数值有时会是两位数,所以使用字符串数组NodeGlChild;NodeGrChild;Node(){strcpy(ch,"");lChild=rChild=NULL;}~Node(){if(lChild!=NULL)deletelChild;if(rChild!=NULL)deleterChild;}};staticintcount=0;staticchararray[MaG];//保存原始的中缀表达式staticcharstr[2GMaG];//保存后序遍历出来的字符串,为表达式求值提供方便staticintk=0;chargetOp(NodeGtemp);//temp指针保存每个结点,返回的是运算符NodeGcrtTree(NodeGroot);//传入根结点指针,返回根结点指针voidoutput(NodeGroot);//获得处理后的字符串boolisError(char);//判断字符是否有问题voiddeal();//对字符数组进行处理doublevalue(string);//计算后缀表达式,得到其结果。
实验报告长整数四则运算

实验报告:长整数四则运算实验者:唐怡04120082 题目:设计一个实现任意长的整数进行加法运算的演示程序一.需求分析1.本演示程序中,长整数为任意长的带符号的长整数的输入及求加法后输出的长整数形式为每四位一组,组间用逗号隔开,输入以“回车符”为结束标志。
2.程度执行的命令包括:1)构造整数1,2)构造整数2,3)做加法运算,4)结束3.测试数据(1)0;0;应输出“0”(2)-2345,6789;-7654,3211;应输出“-1,0000,0000”(3)-9999,9999;1,0000,0000,0000;应输出“9999,0000,0001”(4)1,0001,0001;-1,0001,0001;应输出“0”(5)1,0001,0001;-1,0001,0000;应输出“1”(6)-9999,9999,9999;-9999,9999,9999;应输出“-1,9999,9999,9998”(7)1,0000,9999,9999;1;应输出“1,0001,0000,0000”。
二.概要设计为实现上述程序功能,应以有序表实现长整数的存储,为此,需要抽象数据类型:有序表1.有序表的抽象数据类型定义为:ADT Dulinklist{数据对象:D={ai|ai为带符号整数,1,2,…,n,n>=0}数据关系:R1={<ai-1,ai>|ai-1,ai属于集合D,ai-1<ai,i=2,…..,n}基本操作:InitDulinklist(&)操作结果:构造一个空的有序表LDestroyDulinklist(&)初始条件:有序表L已存在操作结果:销毁有序表LDulinklistLength(L)初始条件:有序表L已存在操作结果:返回有序表L的长度DulinklistEmpty(L)初始条件:有序表L已存在操作结果:若有序表L为空表,则返回TUER,否则返回FALSEGetElem(L,pos)初始条件:有序表L已存在操作结果:若干1〈=POS〈=LENGTH(L),则返回有序表L中第POS个数据元素。
c语言四则运算实验报告

深圳大学实验报告课程名称: ________ C 语言实验 ________________实验名称: 100以内的四则运算游戏 _________学 院: ___________ 信息工程学院 ______________指导教师 ______________ 张金凤 __________________报告人: 王文杰 组号:]7 ________学号 2013130073 实验地点 教学楼D506实验时间: 2014 年 4 月 16 日提交时间: ___________ 2014.5.9 ____________________课程编号 1300050027一、实验目的一、学习和掌握c语言函数的泄义与调用:二、进一步掌握随机数、选择结构、循环控制、交互式输入输出等程序设计方法:三、进一步掌握c语言中的数组左义和引用方法:四、学习和掌握根据流程图进行模块化程序设计的思想*二、实验要求产生1到4之间的随机数,决定4则运算的符号,再产生两个0到99的随机数进行运算,并记录下做的题数以及正确的数目,当做题者输入n或N时退出程序并显示出完成题数及正确率。
int num2); int五、对流程图的简要说明:#include <std io. h> #include <stdlib. h> #include Htime. h" #include <conio. h> void max_min(int a, int b); randN1N2(int rN1f int rN2 ); rand0per4(); randL/ntlOO ();addLmt100(int num1vsubLmt100(int num1fmulLmt100(int num1fdivLmt100(int num1f/*主函数的功能如下:在主函数中调用上面定义的五个函数,在屏幕上随机循环出一道 100以内的四则运算题。
小学四则运算实验报告

石家庄经济学院“高级语言程序设计”课程实习报告班级:试点2班姓名:贺迎春学号:410109030221日期:2011-10-19目录1.实习目的 (3)2.实习题目与程序功能 (3)3.算法设计 (3)4. 主要数据结构和标识符及其说明 (4)5. 程序运行实例 (5)6. 源程序清单 (6)7. 实习体会 (9)1.实习目的(1)掌握分支语句、循环语句的基本语法、语义。
(2)熟练使用if语句、case语句进行分支结构的程序设计、熟练使用for语句、repeat语句、while语句进行循环结构的程序设计。
(3)掌握嵌套的分支、循环结构。
(4)掌握基本的程序调试技能。
能够使用Trace Into、step over步进追踪,断点等控制程序的运行步骤,能够使用Watch监视表达式的值,并且点击project点击options点击compiler点击optimization把代码优化去掉,这样件事变量的之就能显示出来、添加条件断点等等。
(5)能够合理的设计程序的测试用例并验证程序的有效性能。
2.实习题目与程序功能实习题目:小学生的加减乘除以及混合运算的自动出题及评分系统。
功能描述:系统首先会给出提示信息,根据提示信息,当n=1时,系统会自动出10道十以内的加法练习题目并自动评分;当n=2时,系统会自动出10道十以内的减法练习题目并自动评分;当n=3时,系统会自动出10道十以内的乘法练习题目并自动评分;当n=4时,系统会自动出10道十以内的除法练习题目并自动评分;当n=5时,系统会自动出10道十以内的混合运算题目并自动评分;当n=6时,结束练习,退出系统;性能要求:要保证程序有足够的健壮性。
3.算法设计(1)分析①此系统的使用对象使小学生,所以加法、减法、乘法以及除法都是10以内的整数,并没有涉及到小数的问题。
小学生并未学习负数,所以当减法自动出题时,把答案为负数的情况删掉;而除法,则是利用10以内的整数相乘采用逆思维的方法来生成的。
C语言四则运算测试程序设计报告

昆明理工大学《计算机程序设计基础》课程综合实践型教学课题报告课题名称:100以内的整数四则运算测试程序设计组长:学号 040401067 姓名周绍平组员:学号 040401070 姓名邓磊学号 040401106 姓名刘云路学号姓名学号姓名学号姓名学号姓名学院:信自学院专业班级:自动化0421 指导教师:耿植林昆明理工大学计算中心2005 年 6月18日昆明理工大学计算中心《计算机程序设计基础》课程综合实践型教学课题报告课程名称:100以内的整数四则运算测试程序设计正文内容:一、问题描述这是一个进行数学计算的程序,且要求拥有多种功能,包括(1)选项菜单集成各功能函数模块(2)出题(每次出10道题目)(3)答题并评分(4)答错的题给出正确答案(5)显示答卷。
总体看来,大多数功能要求调用错题,所以面临的两个难题便是出题和保存答题者做错的题以便其它函数调用。
另外,由于除法的特殊性——其除数不能为0。
又因为这是一个用于100以内整数的四则运算的程序,又对除法这个特殊成员提出了新的要求——要使得到的结果为整数。
所以有必要把除法单独拿出来作为一个函数处理。
二、问题分析这是一个任务很明确的程序设计—用于100以内的整数的四则运算。
这个程序要求拥有选项菜单、出题、答题评分、显示答卷、错题再解、重复练习的功能。
既然是一个用于计算的程序那它的主要作用就是给练习者答题,并验证答题的正确与否。
当然,还要有一些附加功能,比如:把答卷显示出来,错题给出正解,错题再抽出来再做。
这个程序只要求100以内的四则运算,所以随机出现的数字只能是100以内的,并且要求其为整数。
不论是数据的输入与输出,都要求其为整数。
鉴于这个程序所要求达到的功能,我们小组决定把它分为计算、菜单、答卷、重做、正解、评价、除法七个函数模块。
对各成员的分工如下:计算、正解和菜单(周绍平)评价和除法(邓磊)答卷和重做(刘云路)主函数及各函数的连接则由小组成员共同完成。
C语言实验报告四则运算

《C语言》课内实验报告学生姓名:及学号:学院:班级:课程名称:C语言实验题目:实验二选择结构程序设计指导教师姓名及职称:年月日一、实验目的1.掌握逻辑表达式和if语句、嵌套的if语句、switch语句和break语句的格式、语义。
2.掌握选择结构程序设计方法。
二、实验内容编写程序实现两个数的四则运算,要求从键盘输入进行运算的两个数字以及相应的运算符('+'、'-'、'*'、'/'),程序给出算数表达式及运算结果。
(如下图所示,要求使用if语句和switch语句两种方法实现)三、实验结果1、流程图2、源程序(1)使用if语句#include <stdio.h>void main(){float a,b;char c;printf("please input two numbers:");scanf("%f%f",&a,&b);getchar();printf("\nplease input the operator:");//fflush(stdin);scanf("%c",&c);printf("\n");if(c=='+')printf("%10.2f+%10.2f=%10.2f\n",a,b,a+b);else if (c=='-')printf("%10.2f-%10.2f=%10.2f\n",a,b,a-b);else if (c=='*')printf("%10.2f*%10.2f=%10.2f\n",a,b,a*b);else if (c=='/')printf("%10.2f/%10.2f=%10.2f\n",a,b,a/b);elseprintf("Input error!\n");}(2)使用switch语句#include <stdio.h>void main(){float a,b;char c;printf("please input two numbers:");scanf("%f%f",&a,&b); //输入a,b的值getchar();printf("\nplease input the operator:"); //输入操作符scanf("%c",&c);printf("\n");switch(c) //判断输入操作符{case '+': //若操作符为'+',输出a+b printf("%10.2f+%10.2f=%10.2f\n",a,b,a+b);break;case '-': //若操作符为'-',输出a-b printf("%10.2f-%10.2f=%10.2f\n",a,b,a-b);break;case '*': //若操作符为'*',输出a*b printf("%10.2f*%10.2f=%10.2f\n",a,b,a*b);break;case '/': //若操作符为'/',输出a/b printf("%10.2f/%10.2f=%10.2f\n",a,b,a/b);break;default:printf("Input error!\n");}}2、运行结果输入12、13以及+,得到结果如下:输入12、13以及-,得到结果如下:输入12、13以及*,得到结果如下:输入12、13以及/,得到结果如下:输入12、13以及a,得到结果如下:3、结果分析题目要求编程实现两个数的四则运算,因此只需判断输入的操作符为四则运算中的哪一个,编程时可以使用if语句或者switch语句实现判断过程。
课程设计 长整数四则运算

课程设计实验报告:1.4长整数四则运算题目:长整数四则运算一、实验内容【问题描述】设计一个实现任意长的整数进行加法运算的演示程序【基本要求】利用双向循环链表实现长整数的存储,每个结点含一个整形变量。
任何整形变量的范围是-(2八15-1)〜(2八15-1)。
输入和输出形式:按中国对于长整数的表示习惯,每四位一组,组间用逗号隔开。
【实现基本功能】⑴是想长整数的四则运算;(ii)实现长整数的乘方和阶乘运算;(iii)整形量范围是-(2沏-1)~(2八n-1),其中n是由程序读入的参量。
输入数据的分组方法另行规定;【实现加强版本的功能】⑴四则运算在原来版本的基础上支持小数运算,除法还可以通过输入整数后加小数点与相应要求取的精确位数求出精确值,如:求取3666除以7的后三位精确值,可以在输入时将除数输入为3666.000或3666.0000,就能得出相应的精确位数,当然求取后,没有余数的输出;(ii)乘方的功能也进行了强化,支持小数操作;(iii)添加了多个出错处理(即输入重操作)对相应数据输入与输出进行提示;【加强版的实现原理】⑴加减法运算加强:在原来版本的基础上依照基本的加减法操作将数据用小数点进行分隔,记录下连个输入数的小数位长度,并将小数位较短的一个数据后补0直至小数位数相同,然后用函数处理输出的数据;(ii)乘除法、乘方:其处理方法较为简单,主要是记录数据中小数位数的长度,然后通过每种运算方式不同的运算原理截取小数位,再按照输出格式将数据处理进行输出;(iii)根据定义,阶乘保持不变;【特色分析】⑴加强版程序加上了简单的声音提示,无论是输入与输出均会有八个音符的其中之一对输入与输出与否进行提示,同时在输入输出数据出错时,还会用三个音符对重输入进行提示,增强了人性化操作;【测试数据】(1)0;0;应输出“0”。
(2)-2345,6789;-7654,3211;应输出“-1,0000,0000”。
(3)-9999,9999;1,0000,0000,0000;应输出“9999,0000,0001”。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
四则运算
程序功能简介:
该程序用字符串的形式接收一个带括号的四则运算的表达式,然后按照四则运算优先级的算法先括号,后乘方、乘除、加减这样的顺序将这个算式解出。
该程序的设计比较巧妙,是在主程序中反复查找最后一对括号,将其中的结果计算出来,去掉括号,这样的过程持续下去,最后导致所有的括号都去除,解出算式。
课程设计要求:
(1)用类的形式改写程序,将数据和函数封装到类中。
(2)修改主程序结构,使程序可以反复运算,直到选择退出为止。
(3)扩充程序功能,使程序适合浮点运算。
(4)增加程序的判断功能,当有非法输入(如字母等),给出提示信息并退出运算,当输入带有空格使,能将空格滤除。
评定难易等级:A级。
程序设计思想:
类的封装:
class CStr // 定义一个字符串类
{
private:
int nLen; //字符串长度
char *pStr; //字符串首地址
public:
CStr(){nLen=0;pStr=NULL;} //构造函数
CStr(CStr &str); //拷贝的构造函数
~CStr(){if(pStr) delete[]pStr;} //析构函数
int GetLen(){return nLen;} //返回字符串长度
CStr & Midstr(CStr &str,int nStart,int nLength); /*返回字符串类中从nStart序号开始nLength长度的字符串*/
CStr & Left(CStr &str,int nLength); //返回制定字符串类中从左边开始nLength 个字符
CStr & Right(CStr &str,int nLength); //返回制定字符串类中从右边开始nLength个字符
CStr & Calculate(); //计算该字符串所代表的四则运算的值(内无括号)
int CharInStr(char chChar); //判断字符chChar是否在字符串中
double V al(); //求字符串代表的数字字符的数值
char GetChar(int i){return *(pStr+i);} //返回字符串中第i个字符
CStr & Str(double val); //将数值表示成字符串的形式
CStr & operator=(CStr &); //重载赋值运算符
friend CStr operator+(CStr &,CStr &); //友元,实现字符串类的加法
operator char *(){return(char *)pStr;} //将字符串类转换成字符数组
friend istream &operator>>(istream &,CStr &); //重载输入运算符
int Judge(); //判断输入法是否合法,滤除空格
};
对程序设计要求的解答所遇到的问题及解决方案:
(1)用类的形式改写程序,将数据和函数封装到类中。
程序一开始定义了一个字符串类CStr如上,包含十七个公有成员函数,并已经在类内定义函数原型。
课本中给出了十个成员函数的源代码,而且构造函数,拷贝构造函数及析构函数已经给出。
但left,right,midstr,str,calculate五个函数均有返回值,将return语句删掉。
同时val函数的返回值类型也需要修改。
再在类外,补充定义为类的成员函数即可。
(具体程序代码见课本)
还缺少一些重载运算符函数,友元函数和Judge函数,补充在后。
(2)修改主程序结构,使程序可以反复运算,直到选择退出为止。
课本中将主函数的源程序代码基本设计好,不过界面提示语是英文,运用起来有些不太方便。
我先将其翻译成中文,便于阅读和使用。
关于反复运算的要求,在学长的指点下,使用了while循环语句,具体的还是不怎么理解。
但是运行是正确的,好像是用到了第八部分的二叉数有关程序。
(3)扩充程序功能,使程序适合浮点运算。
除了在运算符中增加小数点“.”之外,还需要更改部分函数的返回值类型(如val函数)与部分变量的类型。
(4)增加程序的判断功能,当有非法输入(如字母等),给出提示信息并退出运算,当输入带有空格使,能将空格滤除。
关于Judge函数的源程序代码,设计如下:
int Judge()
{
char *p,*s,*r,*source=pstr;
p=source;s=p+1;
while(*p!=0) //滤去空格
{r=p;
if(*p==' '){
while(*s!=0){*p=*s;p++;s++;}
*p=0;p=r;s=p+1;
continue;
}
p=r+1;s=p+1;
}
cout<<"去除空格后的算式:"<<pstr<<endl;
char *destination=source;
while(*destination!=0) //判断是否有非法字符的输入
{if('('<=*destination&&*destination<='+'||'-'<=*destination&&*destination<='/'||'0'<= *destination&&*destination<='9'||*destination=='^'||*destination==' ')
{destination++;}
else{return 0;}
}
destination=pstr;
if(*destination=='^'||*destination=='*'||*destination=='/'||*destination=='+'||*destinatio n=='-') //检查语法错误(检查运算符左右的操作数是否正确){ return 0;}
int pos_in_opstr;
int pos;int z;
char opstr[6]="^/*+-";
for(pos_in_opstr=0;pos_in_opstr<=4;pos_in_opstr++)
{
while(charinstr(source,opstr[pos_in_opstr]))
{
pos=charinstr(source,opstr[pos_in_opstr]);z=pos;
if(*(source+z)=='^'||*(source+z)=='*'||*(source+z)=='/'||*(source+z)=='+'||*(source+z) =='-'||*(source+z)==0)
{return 0;}
z-=2;
if(*(source+z)=='^'||*(source+z)=='*'||*(source+z)=='/'||*(source+z)=='+'||*(source+z) =='-'||*(source+z)==0)
{return 0;}
else{source+=pos;}
}
}
return 1;
}
程序设计完成之后的思考:
在程序设计之前,我仔细地阅读了课本,发现其实大部分函数的源代码已经编译好,我只需要修改,再添加一些缺少的程序代码。
可是后来发现自己是眼高手低,像如何将返回值正确地修改好以及Judge函数的设计都犯了很多错误,再如主函数的反复设计也是一筹莫展。
幸好有学长和一些C++高手的指点,这才勉强完成。
完成之后,我把自己的程序和前年的学长的作了一些比较,改了一些语句,发现更加简洁明了了,高手不愧是高手。
不过,他在主函数开始时设计了一个的欢迎语句,但是我不是很能理解’\2’等的具体含义,不禁开始佩服他们的强大。
Visual C++支持面向对象的程序设计方法,支持MFC类库编程,有强大的集成开发环境Developer Studio。
可用来开发各种类型,不同规模和复杂程序的
应用程序,开发效能很高,生成的应用软件代码品质优良。
C++是Windows环境下最强大,最流行的程序设计语言之一。
老师将C++程序设计的任务交给我们,一方面是提高我们C++程序设计的能力,另一方面是培养我们对C++的兴趣,让我们以后成为专业软件设计人才提供了可能,可谓是良苦用心,在这里表示最衷心的感谢。
指导老师:刘永
设计人:戴淑君
时间:2010-3-20。