四则运算程序报告

合集下载

四则运算实验报告

四则运算实验报告

实验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版】四则运算表达式求值实验报告

【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语言四则运算实验报告

深圳大学实验报告课程名称: ________ 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语言四则运算测试程序设计报告

C语言四则运算测试程序设计报告

昆明理工大学《计算机程序设计基础》课程综合实践型教学课题报告课题名称:100以内的整数四则运算测试程序设计组长:学号 040401067 姓名周绍平组员:学号 040401070 姓名邓磊学号 040401106 姓名刘云路学号姓名学号姓名学号姓名学号姓名学院:信自学院专业班级:自动化0421 指导教师:耿植林昆明理工大学计算中心2005 年 6月18日昆明理工大学计算中心《计算机程序设计基础》课程综合实践型教学课题报告课程名称:100以内的整数四则运算测试程序设计正文内容:一、问题描述这是一个进行数学计算的程序,且要求拥有多种功能,包括(1)选项菜单集成各功能函数模块(2)出题(每次出10道题目)(3)答题并评分(4)答错的题给出正确答案(5)显示答卷。

总体看来,大多数功能要求调用错题,所以面临的两个难题便是出题和保存答题者做错的题以便其它函数调用。

另外,由于除法的特殊性——其除数不能为0。

又因为这是一个用于100以内整数的四则运算的程序,又对除法这个特殊成员提出了新的要求——要使得到的结果为整数。

所以有必要把除法单独拿出来作为一个函数处理。

二、问题分析这是一个任务很明确的程序设计—用于100以内的整数的四则运算。

这个程序要求拥有选项菜单、出题、答题评分、显示答卷、错题再解、重复练习的功能。

既然是一个用于计算的程序那它的主要作用就是给练习者答题,并验证答题的正确与否。

当然,还要有一些附加功能,比如:把答卷显示出来,错题给出正解,错题再抽出来再做。

这个程序只要求100以内的四则运算,所以随机出现的数字只能是100以内的,并且要求其为整数。

不论是数据的输入与输出,都要求其为整数。

鉴于这个程序所要求达到的功能,我们小组决定把它分为计算、菜单、答卷、重做、正解、评价、除法七个函数模块。

对各成员的分工如下:计算、正解和菜单(周绍平)评价和除法(邓磊)答卷和重做(刘云路)主函数及各函数的连接则由小组成员共同完成。

C语言实验报告四则运算

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”。

数据结构 四则运算表达式求值 实验四报告

数据结构 四则运算表达式求值 实验四报告

为后缀表达式。
(3) 计算模块:计算后缀表达式的值。
(4) 输出模块:输出后缀表达式及其计算结果。
三、详细设计
物理数据类型
因为表达式由用户输入,存储操作符和操作数的栈长度不能确定,所以使用链式堆栈存
储这些变量。
堆栈基本操作如下:
bool push(const Elem& item) //压栈
{
top=new link<Elem>(item,top);
表达式。
运算时,运算符栈顶弹栈,然后获取操作数栈顶和次栈顶的值进行运算,把运算结果创
建一个叶子结点保存,把结点压回操作数栈中。如果操作数栈或运算符栈不为空时,继续进
行运算操作。最后操作数栈中的值,就是运算结果。
程序的流程
(1) 输入模块:输入把原始的中缀表达式的操作数和操作字符存储为一个字符串。 (2) 处理模块:把字符串逐个分解,调整各项字符的顺序,分解的中缀表达式转换
EvalExpr(ch[i],S); //弹栈,运算部分
i++;
}
}
if(S.length()==1)
S.pop(result);
}
(2)、 转换实数
int EvalValue(char* ch,Stack<double> &S)
{
int i=0;
double result=0;
char a;
a=ch[i];
}
bool topValue(Elem& it) const //获取栈顶的值
{
if(size==0) return false;
it=top->elem;
return true;

湖南大学数据结构四则运算表达式报告

湖南大学数据结构四则运算表达式报告

实验报告部分HUNAN UNIVERSITY 课程实习报告题目:约瑟夫问题学生姓名付勇学生学号201226010603 专业班级计算机科学二班指导老师李晓红一、需求分析1.本程序要求首先输入一组数据进行四则运算,输入的数据是按照中缀表达式的结构输入的,完成初始化后,把中缀表达式转化为后缀表达式(逆波兰表达式)输出,同时输出计算结果。

2.程序的功能将输入的中缀表达式转化为后缀表达式输出,同时输出计算结果;3.程序的输出就是转化后的后缀表达式以及计算的结果,输出结果间用空格隔开;4.测试数据:输入:21+23*(12-6)//正常的中缀表达式结构输入有数据,有+ - * / %()^21+(12-6)*2325^12*1+225 7 7//数据输入中可以留空格,两个数据中间必须是符合四则运算的数据(+-*/()^)输出:接上后缀表达式为:21 23 12 6 - * + //输出结果间用一个空格隔开计算结果为:159后缀表达式为:21 12 6 - 23 * +计算结果为:159输入非法,程序结束!输入非法,程序结束!。

二、概要设计抽象数据类型中缀表达式的存入和读取是核心问题,计算只要用到两个临时的栈一个存操作数,一个存运算符。

利用二叉树,根节点存操作符,其他节点存操作数,利用二叉树的遍历可以方便的存入和读出操作数和运算符。

(后序遍历实现后缀表达式)二叉树的ADT与节点的ADT分开定义ADT BinNode数据对象:数和字符数据关系:无基本操作:int val() //返回结点的数值Void setVal(const Elem&)//设置节点的值inline BinNode* left()const //获取左结点inline BinNode* right()const //获取右结点void setLeft(Node* it) //设置左结点void setRight(Node* it) //设置右结点Bool isLeaf()//是叶子节点吗?二叉树ADT BinTree数据对象:D={d I∈BinNode |i=0,1,2….}数据关系:若D为空集,则称为空树。

(完整word版)长整数四则运算实验报告

(完整word版)长整数四则运算实验报告

一、需求分析设计一个实现任意长的整数间进行四则运算的程序,要求完成长整数的加、减运算,乘除运算可选做。

在这里长整数没有范围限制,可任意长。

运算后的进位、借位等都要进行正确处理,可实现动态的输入,实时的输出。

测试数据:0、0;输出“0”2345,6789、-7654,3211;输出“1,0000,0000”1,0000,0000,0000、9999,9999;输出“9999,0000,0001”1,0001,0001、;1,0001,0001;输出“0”自选数据:1,1111;1,1111 输出“0”二、概要设计1、数据结构利用双向循环链表来实现对长整数的存储。

选择该数据结构来完成长整数的加减运算是因为a.要对长整数进行运算,需要对长整数进行存储,选择用链表对长整数存储。

b.存储的顺序是从左到右,运算的顺序则是从右到左,为操作方便选择循环链表。

c.在运算过程中有进位和借位的操作。

2、使用算法三、详细设计typedef struct DoubleNode //定义链表元素void InitNode(DLNode **head) //初始化链表int InsertNode(DLNode *head,int n,DataType x) //向链表第N个位置插入元素Xint digit(int n) //判断整数N有几位void PrintNode(DLNode *head) //打印链表void DestroyNode(DLNode **head)//销毁链表void add(DLNode *h1,DLNode *h2) //两数相加void jian(DLNode *h1,DLNode *h2) //两数相减int main() //入口函数四、调试分析由于在程序设计时,对于指针的不了解,编程时使用双重指针,无形中给自己增添了更多麻烦。

老师在检查的过程中指出并教导了这一点。

五、测试结果1、输入0和0做加法运算,输出“0”,结果如下图:2、输入2345,6789和-7654,3211做减法运算,输出“1,0000,0000”,结果如下图:3、输入1,0000,0000,0000和9999,9999做减法运算,输出“9999,0000,0001”,结果如下图:4、输入1,0001,0001和1,0001,0001做减法运算,输出“0”,结果如下图:5、输入1,1111和1,1111做减法运算,输出“0”结果如下图:六、心得体会本次实验主要是针对双向链表的练习,通过这次试验我们大家对于双向循环链表有了更深刻的记忆。

长整数四则运算实验报告

长整数四则运算实验报告

数据结构课内实验报告书一、实验题目:长整数四则运算二、实验目的:通过本次实验,熟练掌握链表的存储结构及其各种基本运算,体会链表操作的特点。

三、实验要求:设计一个实现任意长的整数进行加法运算的演示程序。

要求:利用双向循环链表实现长整数的存储,每个结点含一个整形变量。

任何整形变量的范围是-(215 - 1)~(215 - 1)。

输入和输出形式:按中国对于长整数的表示习惯,每四位一组,组间用逗号隔开。

四、测试数据:(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)存储结构的定义typedef struct int72 {int i[4];} INT72;INT72 a,b,c;typedef struct LinkNode{int data; //记录每个节点的整数(小于10000)LinkNode *next, *pre; //记录下一个节点的地址 *pre; //记录前一个节点的地址}linklist;(2)主要算法的描述void addtwo()//节点多的作为被加数,少的作为加数,实现整数绝对值大的加小的//默认head0存的整数绝对值比head1大{int s=0,m1=head0->data,m2=head1->data;m1=(head0->pre->data/abs(head0->pre->data)); //head0的符号m2=(head1->pre->data/abs(head1->pre->data)); //head1的符号linklist *p=head0->pre->pre,*q=head1->pre->pre;result->data=head0->pre->data; //存结果的节点数和符号while(q!=head1->pre)//head0存的整数绝对值比head1大,即head0的节点数大于或等于head1 {currptr=(linklist *)malloc(sizeof(linklist));currptr->data=(p->data)*m1+(q->data)*m2+s; //两整数相加if((m1*m2)>0) //如果符号相同{if(abs(currptr->data)-10000>=0) //相加后超过10000,则进位{s=currptr->data/10000;currptr->data=abs(currptr->data)%10000;}else //abs(currptr->data)-10000<0,不进位{s=0;currptr->data=abs(currptr->data);}}else if(m1>0&&m2<0)//符号不同,在此相当于实现两个正整数相减{s=0;if(currptr->data<0) //小于0,向前一位借1{currptr->data+=10000;s=-1;}}else if(m1<0&&m2>0)//符号不同,在此相当于实现负整数加上正整数{s=0;if(currptr->data>0) //大于0,{currptr->data=10000-currptr->data;s=1;}else currptr->data=abs(currptr->data);}currptr->next=result; //存入链表currptr->pre=result->pre;result->pre->next=currptr;result->pre=currptr;result=currptr;p=p->pre;q=q->pre;}//当head0节点数比head1长时,继续建链while(p!=head0->pre){currptr=(linklist *)malloc(sizeof(linklist)); currptr->data=p->data+s;s=currptr->data/10000;if((m1*m2)>0){if(abs(currptr->data)-10000>=0){s=currptr->data/10000;currptr->data=abs(currptr->data)%10000;}else {s=0;currptr->data=abs(currptr->data);} }else if(m1>0&&m2<0){s=0;if(currptr->data<0){currptr->data+=10000;s=-1;}}else if(m1<0&&m2>0){s=0;if(currptr->data>0){currptr->data=10000-currptr->data;s=1;}else currptr->data=abs(currptr->data);}currptr->data=abs(currptr->data)%10000; currptr->next=result;currptr->pre=result->pre;result->pre->next=currptr;result->pre=currptr;result=currptr;p=p->pre;}if(s!=0) //处理相加后,进位问题{currptr=(linklist *)malloc(sizeof(linklist));currptr->data=abs(s);currptr->next=result;currptr->pre=result->pre;result->pre->next=currptr;result->pre=currptr;result=currptr;result->pre->data=m1*(abs(result->pre->data)+1);}}六、技巧与体会在编写程序中尽量做到独立完成、对于自己想要完成的问题要主动编程完成、这样自己是一个很大的提升、也能学到很多的知识、熟练编程!以后要加强动手时间能力、多与同学交流算法精髓!。

四则运算程序报告

四则运算程序报告

四则运算程序功能简介:该程序用字符串的形式接收一个带括号的四则运算的表达式,然后按照四则运算优先级的算法先括号,后乘方、乘除、加减这样的顺序将这个算式解出。

该程序的设计比较巧妙,是在主程序中反复查找最后一对括号,将其中的结果计算出来,去掉括号,这样的过程持续下去,最后导致所有的括号都去除,解出算式。

课程设计要求:(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)用类的形式改写程序,将数据和函数封装到类中。

数据结构实验报告五—四则运算表达式求值

数据结构实验报告五—四则运算表达式求值

问题描述:四则运算表达式求值,将四则运算表达式用中缀表达式,然后转换为后缀表达式,并计算结果。

一、需求分析:1、本程序是利用二叉树后序遍历来实现表达式的转换,同时可以使用实验三的结果来求解后缀表达式的值。

2、输入输出格式:输入格式:在字符界面上输入一个中缀表达式,回车表示结束。

请输入表达式:输入一个中缀表达式输出格式:如果该中缀表达式正确,那么在字符界面上输出其后缀表达式,其中后缀表达式中两相邻操作数之间利用空格隔开;如果不正确,在字符界面上输出表达式错误提示。

逆波兰表达式为:输出逆波兰表达式运算结果为:输出运算后的结果3、测试用例输入:21+23*(12-6)输出:21 23 12 6 -*+二、概要设计:抽象数据类型二叉树类BiTree算法的基本思想根据题目要求,利用栈计算,和二叉树存储,来计算表达式该算法的基本思想是:先利用栈进行计算,然后用二叉树进行存储,和实验三算法一样来计算逆波兰表达式的值程序的流程程序由三个模块组成:(1)输入模块:输入一个运算式(2)计算模块:利用栈进行表达式的计算,二叉树来存储。

(3 )输出模块:屏幕上显示出后缀表达式和运算结果。

三、详细设计物理数据类型程序含有两个类,其中栈不再赘述,另一个类为二叉树class BiTree 包含私有成员struct BiTreeNode,根节点BiTreeNode *T;索引index; int number_of_point 优先级比较函数 compare(char a,char b);生成树的函数void InorderCreate(BiTreeNode *&T,char str[30][10],int start,int end);判断数字函数bool IsNumber(char a);求值函数double Operate(BiTreeNode *T);还有显示后缀表达式的函数void display(BiTreeNode *T) ;而公有成员函数则是对私有函数的重载,为方便使用,因为函数中普遍使用了递归的算法。

汇编课程设计报告-四则运算

汇编课程设计报告-四则运算

课程设计报告一.课程设计的性质和目的性质:《汇编语言》是计算机科学与技术专业及网络工程本科学生必修的专业课程。

目的要求:进行程序设计方法和技能的基本训练,巩固在课堂上学到的有关程序设计的基本知识和基本方法,通过实际动手能力的培养,进一步熟悉汇编语言的结构和使用方法,达到能独立阅读、编制和调试一定规模的汇编语言程序的水平。

二.课程设计的要求1.遵循模块化、结构化的程序设计方法。

2.要求程序必须正确。

3.程序简明易懂,多运用输入输出提示,出错信息及必要的注释。

4.要求程序结构合理,语句使用得当。

5.适当追求编程技巧和程序运行效率。

三.主要仪器设备及软件计算机、MASM汇编软件。

四.设计题目四则运算:从键盘输入一个十进制两位数的四则运算表达式,如23*56-(8*19)/6+67-8=,编程计算表达式的值,输出十进制结果(有可能是三位或四位十进制),+-*/位置任意。

并要求程序能反复执行直道对“还要继续吗?(y/n)”之类的提示回答“n”或“N”为止。

五.题目分析根据题目的要求,可以把整个源程序大致划分为几个基本结构,程序加法、减法、乘法、除法、显示结果五个部分,首先用1号功能以输入字符的形式接收输入的算式,再判断输入字符ASCII码,如果是+、-、*、/、=或数字,则跳转到相应功能模块,并把输入的字符转为数值传入BX寄存器,在各功能模块中继续用1号功能输入字符,执行以上操作,将输入号符转为数据存入DX中,由于*、/优先级要高,加、减模块的实现中要根据输入运算符号进行将BX入栈操作,如果是相同优先级运算符,则直接将BX,DX中的数据进行相应运算,输入=则输出运算结果,这时输出字符串Continue?,用户输入y/n执行继续计算和退出操作六.运行结果输入要计算的式子,按等号输出结果,计算机提示是否继续输入,输入字符y,继续输入,键入n退出程序,如果键入字符为其他,则反回提示输入如图:七.程序流程主程序流程八.代码根据题目的要求,可以把整个源程序大致划分为几个基本结构,程序加法、减法、乘法、除法、显示结果五个部分1、源程序:ASSUME CS:CODES,DS:DATAS,SS:STACKSNEXTLINE MACRO ;显示换行宏MOV AH,2MOV DL,10INT 21HMOV AH,2MOV DL,13INT 21HENDMSTART:MOV AX,DATASMOV DS,AXMOV BX,0INPUT1:MOV AH,1 ;从键盘输入一个字符INT 21HCMP AL,'+' ;判断是否为+JZ ADDITIONCMP AL,'-' ;判断是否为-JZ SUBTRATIONCMP AL,'*' ;判断是否为*JZ MULTIPLICATIONCMP AL,'/' 判断是否为/JZ DIVISIONCMP AL,'=' 判断是否为=JZ RESULTCMP AL,58 判断输入是否为数字JS L1JMP INPUT1L1:CMP AL,47节JNS L2JMP INPUT1L2:SUB AL,48 如果输入为数字,将数值计入BX MOV CL,ALMOV AX,BXMOV CH,10MUL CHADD AL,CLMOV BX,AXJMP INPUT1MOV DX,0INPUT2:MOV AH,1 从键盘输入字符INT 21HCMP AL,'+' 判断是否为+JZ L23CMP AL,'-' 判断是否为-JZ L24CMP AL,'*' 判断是否为*JZ L25CMP AL,'/' 判断是否为/JZ L26CMP AL,'=' 判断是否为=JZ L27CMP AL,58 判断是否为数字JS L21JMP INPUT2L21:CMP AL,47JNS L22JMP INPUT2 如果不是数字,则跳转到INPUT2 L22:SUB AL,48 将输入字符转换为数值MOV CL,ALMOV AX,DXMOV CH,10MUL CHADD AL,CLMOV DX,AXJMP INPUT2L23:ADD BX,DX 执行加运算JMP ADDITIONL24:ADD BX,DXJMP SUBTRATIONL25:ADD BX,DXJMP MULTIPLICATIONL26:ADD BX,DXJMP DIVISIONL27:ADD BX,DXSUBTRATION: 如果输入-,则执行减法 MOV DX,0INPUT3:MOV AH,1INT 21HCMP AL,'+' 判断是否为+JZ L33CMP AL,'-' 判断是否为-JZ L34CMP AL,'*' 判断是否为*JZ L35CMP AL,'/' 判断是否为/JZ L36CMP AL,'=' 判断是否为=JZ L37CMP AL,58 判断是否为数字JS L31JMP INPUT3L31:CMP AL,47JNS L32JMP INPUT3L32:SUB AL,48 将字符转换为数值MOV CL,ALMOV AX,DXMOV CH,10MUL CHADD AL,CLMOV DX,AXJMP INPUT3L33:SUB BX,DX 执行减法操作JMP ADDITIONL34:SUB BX,DXJMP SUBTRATIONL35:SUB BX,DXJMP MULTIPLICATIONL36:SUB BX,DXSUB BX,DX JMP RESULTMULTIPLICATION: MOV DX,0 INPUT4: MOV AH,1 INT 21HCMP AL,'+' JZ L43 CMP AL,'-' JZ L44 CMP AL,'*' 判断是否为* JZ L45CMP AL,'/' 判断是否为/ JZ L46CMP AL,'=' 判断是否为= JZ L47CMP AL,58 判断是否为数字 JS L41 JMP INPUT4 L41:CMP AL,47 JNS L42 JMP INPUT4 L42:SUB AL,48 将字符转换为数值 MOV CL,ALMOV AX,DX 将字输入数字加入数值 MOV CH,10 MUL CH ADD AL,CL MOV DX,AX JMP INPUT4 L43:MOV AX,BX 将BX 移入AXMUL DX 与DX 中的数进行乘运算 MOV BX,AX 将AX 中的数值返回BX JMP ADDITION L44:MOV AX,BX 将BX 移入AXMUL DX 与DX 中的数进行乘运算 判断是否为+ 判断是否为-JMP SUBTRATIONL45:MOV AX,BX 将BX移入AXMUL DX 与DX中的数进行乘运算 MOV BX,AX 将AX中的数值返回BX JMP MULTIPLICATIONL46:MOV AX,BX 将BX移入AXMUL DX 与DX中的数进行乘运算 MOV BX,AX 将AX中的数值返回BX JMP DIVISIONL47:MOV AX,BX 将BX移入AXMUL DX 与DX中的数进行乘运算 MOV BX,AX 将AX中的数值返回BX JMP RESULTDIVISION:MOV DX,0INPUT5:MOV AH,1INT 21HCMP AL,'+' JZ L53CMP AL,'-' JZ L54CMP AL,'*' JZ L55CMP AL,'/' JZ L56CMP AL,'=' JZ L57CMP AL,58 JS L51JMP INPUT5 L51:CMP AL,47 JNS L52JMP INPUT5 L52:SUB AL,48 MOV CL,AL MOV AX,DX MOV CH,10 判断是否为+ 判断是否为- 判断是否为* 判断是否为/ 判断是否为= 判断是否为数字ADD AL,CLMOV DX,AXJMP INPUT5L53:MOV AX,BXDIV DXMOV AH,0MOV BX,AXJMP ADDITIONL54:MOV AX,BXDIV DLMOV AH,0MOV BX,AXJMP SUBTRATIONL55:MOV AX,BXDIV DLMOV AH,0MOV BX,AXJMP MULTIPLICATIONL56:MOV AX,BXDIV DLMOV AH,0MOV BX,AXJMP DIVISIONL57:MOV AX,BXDIV DLMOV AH,0MOV BX,AXJMP RESULTRESULT:显示结果MOV CH,10MOV CL,100R1: 将BX中的计算结果以十进制输出 MOV AX,BXDIV CLMOV DL,ALMOV DH,AHMOV AL,AHMOV AH,0MOV BX,AXADD DL,48INT 21HMOV AH,0MOV AL,CLDIV CHMOV CL,ALCMP CL,1JZ R2JMP R1R2:MOV DL,DHADD DL,48MOV AH,2INT 21HS2:NEXTLINELEA DX,STRING 询问是否继续输入MOV AH,9INT 21HMOV AH,1INT 21HCMP AL,'y' 输入y则跳转到S1JE S1CMP AL,'n' 输入n则跳转到S3,即结束程序JE S3JNE S2S3:MOV AH,4CHINT 21HCODES ENDS九.心得体会程序的主要功能是实现四则运算,整个程序中主要分为,输入算式,加法,减法,乘法,除法和以十进制显示结果这几个部分本程序基本实现了四则运算的功能,但还没能实现带有括号的四则运算,还有在除法运算中不能运算较大的数,会产生溢出现象一开始的时候自己编出来的程序有很多问题,尤其是在循环程序上,因此查阅了不少资料,也请教了好几个同学帮着修改,调试了好久才能正常运行。

广工 数据结构 设计性实验 有理数四则运算 报告

广工 数据结构  设计性实验 有理数四则运算 报告

《数据结构》设计性实验题目 _第2题有理数四则运算_ 学院计算机学院专业年级班别学号学生姓名指导教师思路理论设计难度系数代码总成绩2013 年 6 月29 日序号:一、设计任务要求问题描述:设计一个可进行有理数运算的演示程序。

基本要求:实现两个有理数相加、相减、相乘、相除以及求分子或分母的运算。

测试数据:有读者指定。

选作内容:事项两个有理数相除的运算。

二、主要算法流程图三、主要代码int MaxCommonisor(int m,int n)//*求最大公约数*// {int x,y,z; if(m<n){z=m;m=n;n=z;} x=m;y=n; while(y!=0) {z=x%y; x=y; y=z; }return(x); }Exit()//*退出*// {主程序加法 减法 乘法 除法 小数、整数加法分数加法 求分子分母小数整数减法分数减法 小数整数乘法分数乘法 小数整数除法分数除法}int fraction_Add(int numerator_1,int denominator_1,int numerator_2,int denominator_2)//*分数加法*//{int o,i,l,k,j;o=denominator_1*denominator_2;i=numerator_1*denominator_2+denominator_1*numerator_2;l=MaxCommonisor(o,i);k=o/l;j=i/l;printf("运算结果为%d/%d+%d/%d=%d/%d\n",numerator_1,denominator_1,numerator_2,denominator_2,j,k); }float Add(float a,float b)///*有理数加法*/{float sum;int numerator_1,denominator_1,numerator_2,denominator_2,j,x;char m;loop1:printf("******************************* 加法运算************************************\n");printf("\n");printf(" 1、整数、小数加法2、分数加法3、退出\n");printf("\n");printf("********************************************************************* ***********\n");printf("请选择1、2或3:");scanf("%d",&x);if(x!=1&&x!=2&&x!=3)printf("非法输入,请重新输入!");switch(x){case 1:{printf("请输入第一个数据:");scanf("%f",&a);printf("请输入第二个数据:");scanf("%f",&b);sum=a+b;printf("运算结果为%f+%f=%f",a,b,sum);getchar();getchar();break;}case 2:{printf("输入第一个数的分子: ");scanf("%d",&numerator_1);printf("输入第一个数的分母:");scanf("%d",&denominator_1);printf("输入第二个数的分子:");scanf("%d",&numerator_2);printf("输入第二个数的分母:");scanf("%d",&denominator_2);fraction_Add(numerator_1,denominator_1,numerator_2,denominator_2);break;}case 3:{Exit();break;}default :{printf("输入有误!\n");goto loop1;break;}}if(x!=3)goto loop1;}int fraction_Sub(int numerator_1,int denominator_1,int numerator_2,int denominator_2)///*分数减法*/{int o,i,l,k,j;o=denominator_1*denominator_2;i=numerator_1*denominator_2-denominator_1*numerator_2;l=MaxCommonisor(o,i);k=o/l;j=i/l;printf("运算结果为%d/%d-%d/%d=%d/%d\n",numerator_1,denominator_1,numerator_2,denominator_2,j,k); }float Sub(float a,float b)//*有理数减法*//{float result;int numerator_1,denominator_1,numerator_2,denominator_2,j,x;char m;loop1:printf("******************************* 减法运算************************************\n");printf("\n");printf(" 1、整数、小数减法2、分数减法3、退出\n");printf("\n");printf("********************************************************************* ***********\n");printf("请选择1、2或3:");scanf("%d",&x);if(x!=1&&x!=2&&x!=3)printf("非法输入,请重新输入!");switch(x){case 1:{printf("请输入第一个数据:");scanf("%f",&a);printf("请输入第二个数据:");scanf("%f",&b);result=a-b;printf("%f-%f=%f",a,b,result);getchar();getchar();break;}case 2:{printf("输入第一个数的分子: ");scanf("%d",&numerator_1);printf("输入第一个数的分母:");scanf("%d",&denominator_1);printf("输入第二个数的分子:");scanf("%d",&numerator_2);printf("输入第二个数的分母:");scanf("%d",&denominator_2);fraction_Sub(numerator_1,denominator_1,numerator_2,denominator_2);break;}case 3:{Exit();break;}default :{printf("输入有误!\n");goto loop1;break;}}if(x!=3)goto loop1;}int fraction_Mul(int numerator_1,int denominator_1,int numerator_2,int denominator_2)//*分数乘法*//{int o,i,l,k,j;o=denominator_1*denominator_2;i=numerator_1*numerator_2;l=MaxCommonisor(o,i);k=o/l;j=i/l;printf("运算结果为%d/%d * %d/%d = %d/%d\n",numerator_1,denominator_1,numerator_2,denominator_2,j,k);}float Mul(float a,float b)//*有理数乘法*//{float result;int numerator_1,denominator_1,numerator_2,denominator_2,j,x;char m;loop1:printf("******************************* 乘法运算************************************\n");printf("\n");printf(" 1、整数/小数乘法2、分数乘法3、退出\n");printf("\n");printf("********************************************************************************\n");printf("请选择1、2或3:");scanf("%d",&x);if(x!=1&&x!=2&&x!=3)printf("非法输入,请重新输入!");switch(x){case 1:{printf("请输入第一个数据:");scanf("%f",&a);printf("请输入第二个数据:");scanf("%f",&b);result=a*b;printf("%f * %f = %f",a,b,result);getchar();getchar();break;}case 2:{printf("输入第一个数的分子: ");scanf("%d",&numerator_1);printf("输入第一个数的分母:");scanf("%d",&denominator_1);printf("输入第二个数的分子:");scanf("%d",&numerator_2);printf("输入第二个数的分母:");scanf("%d",&denominator_2);fraction_Mul(numerator_1,denominator_1,numerator_2,denominator_2);break;}case 3:{Exit();break;}default :{printf("输入有误!\n");goto loop1;break;}}if(x!=3)goto loop1;}int fraction_Div(int numerator_1,int denominator_1,int numerator_2,int denominator_2)//*分数除法*//{int o,i,l,k,j;o=denominator_1*numerator_2;i=numerator_1*denominator_2;l=MaxCommonisor(o,i);k=o/l;j=i/l;printf("运算结果为%d/%d / %d/%d = %d/%d\n",numerator_1,denominator_1,numerator_2,denominator_2,j,k);}float Div(float a,float b)///*有理数除法*/{float result;int numerator_1,denominator_1,numerator_2,denominator_2,j,x;char m;loop1:printf("******************************* 除法运算************************************\n");printf("\n");printf(" 1、整数/小数除法2、分数除法3、退出\n");printf("\n");printf("********************************************************************* ***********\n");printf("请选择1、2或3:");scanf("%d",&x);if(x!=1&&x!=2&&x!=3)printf("非法输入,请重新输入!");switch(x){case 1:{printf("请输入第一个数据:");scanf("%f",&a);printf("请输入第二个数据:");scanf("%f",&b);result=a/b;printf("a/b=%f",result);getchar();getchar();break;}case 2:{printf("输入第一个数的分子: ");scanf("%d",&numerator_1);printf("输入第一个数的分母:");scanf("%d",&denominator_1);printf("输入第二个数的分子:");scanf("%d",&numerator_2);printf("输入第二个数的分母:");scanf("%d",&denominator_2);fraction_Div(numerator_1,denominator_1,numerator_2,denominator_2);break;}case 3:{Exit();break;}default :{printf("输入有误!\n");goto loop1;break;}}if(x!=3)goto loop1;}float feng(float z)//*求分子分母运算*//{int f,k,j,x;float elem=1000000;loop1:printf("***************************** 求分子分母运算*****************************\n");printf("\n");printf(" 1、输入数据2、退出\n");printf("\n");printf("********************************************************************* ***********\n");printf("请选择1或2:");scanf("%d",&x);if(x!=1&&x!=2)printf("非法输入,请重新输入!");if(x==1){printf("请输入一个有理数:");scanf("%f",&z);z=z*elem;f=MaxCommonisor(z,elem);j=elem/f;k=(int)z/f;printf("分子是%d,分母是%d\n",k,j);goto loop1;}if(x==2)Exit();}main()//*主程序*//{int x;float a,b,z;printf("\n**************************** 有理数四则运算******************************\n");printf("\n");printf(" 1、加法运算2、减法运算\n");printf(" 3、乘法运算4、除法运算\n");printf(" 5、求分子分母运算6、退出\n");printf("\n");printf("********************************************************************* ***********\n");loop3:printf("请选择运算类型:");scanf("%d",&x);printf("\n");switch(x){case 1:{Add(a,b);break;}case 2:{Sub(a,b);break;}case 3:{Mul(a,b);break;}case 4:{Div(a,b);break;}case 5:{feng(z);break;}case 6:{Exit();break;}default :{printf("输入有误!请重新选择:\n");goto loop3;break;}}}六、实验截图1. 测试用例加法:整数:1+1小数:1.2+3.4分数:1/2+2/3减法:整数:9-8,8-9小数:9.8-7.6,7.6-9.8分数:1/2-1/3,1/3-1/2 乘法:整数:2*3小数:1.2*2.3分数:1/2*1/3除法:整数:1÷2,3÷2小数:1.2÷3.4,3.4÷1.2分数:1/2÷1/3,1/3÷1/2 求分子分母运算:1.2,0.42. 程序截图主界面加法减法乘法除法求分子分母运算3. 实验结果分析运算结果全部正确七、小结其实有理数四则运算用c写的话还是很简单的,但我自己写的时候并没感觉用到了数据结构的知识。

四则运算实验报告

四则运算实验报告
a=rand()%100+1;/*在1~100随机取一个数*/
b=rand()%100+1;/*在1~100随机取一个数*/
printf("%d+%d=",a,b);
s=a+b;
scanf("%d",&ans1);//扫描用户输入答案//
if(ans1==s)
{
printf("Very Good!\n");
if(ans2==s)
{
printf("Very Good!\n");
count++;
}
else
{printf("Wrong!!!\n");}
}
}
printf("***正确率为%.0f%%***\n",100.0*count/N);
}
count,a,b,j,ans1,ans2用法与加法运算函数相同;N仍为10,作用相同;仍需srand((unsigned)time(NULL))使随机数a,b在每次运行中保持不同,用户在退出后再次进入并选择相同种类运算时,程序给出的数不会与先前给出的数相同;
整体功能:实现减法运算,并作出批改结果及正答率。
乘法运算函数
h();
void h()//乘法运算函数//
{
int count=0,j,a,b,ans1,ans2,s;
for(j=1;j<=N;j++)
{srand((unsigned)time(NULL));
a=rand()%100+1;
b=rand()%100+1;
while(a+b<201)//保证给出的是整除运算//

c++课程设计四则运算.doc

c++课程设计四则运算.doc

Vc++课程设计报告题目名称:四则运算班级:测控技术与仪器姓名:周赛学号:914101170150一、程序功能简介该程序用字符串形式接受一个带括号的四则运算表达式,然后按照四则运算优先级的算法先括号,后乘方、乘除、加减这样的顺序将这个算式解出。

该程序的设计比较巧妙,是在主程序中反复查找最后一对括号,将其中的结果计算出来,去掉括号,这样的过程持续下去,最后导致所有的括号都去除,解出算式。

二、课程设计要求(1)用类的要求改写程序,将数据和函数封装到类中。

(2)修改主程序,使程序可以反复运算,直到选择退出为止。

(3)扩充程序功能,使程序适合浮点数运算。

(4)增加程序的判断功能,当有非法的输入时(如字母等),给出提示信息并退出运算,当输入带有空格时,能将空格滤除。

三、程序设计思想(1)类的封装实际上该字符串类基本类似于c++中的string类,比string类多定义了浮点数与字符串的相互转换的函数,输入输出友元函数,可以从string类派生出CStr类,这样,类的定义就更加简单,且可以利用很多现成的成员函数。

(2)主程序结构算法的设置定义char类型的变量用来存储字符串,定义CStr类用于对字符串操作函数的引用。

先对输入字符串用Judge函数进行输入正确性的判断及取出空格内容;然后用charinstr函数在字符串中反复查找最后一对括号;用midstr函数提取出来,用calculate函数进行计算;并用left函数与right函数及addstrings函数将所找到这对括号的左边、右边及运算结果以字符串的形式合并成一个新的字符串;重复上述操作直至字符串中不再有括号;最后用calculate函数进行最后的计算返回计算结果。

紧接着进行是否退出计算的输入判断,完成程序反复运算的功能。

四、详细设计①判断功能:用类中定义的judge函数实现,返回值为1即合法,为0即不合法。

去除空格:定义p、s两个指针指向字符串,r指针指向p指针实现p、s指针在字符串中的遍历,用p指针找到第一处空格处,再用s指针找到p指向位置以后最近一个不是空格处,赋值语句*p=*s,继续向下遍历字符串直至结束。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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。

相关文档
最新文档