Java表达式求值、杨辉三角实验报告
一.实验目的
实现杨辉三角和表达式的封装
二.实验软件环境
本实验是在MyEclipse 9.01M1编写和运行的
三.实验内容
(一)实验要求
1. 输出杨辉三角前N项,N为参数
2. 表达式求值:输入一个表达式,输出它的值,其中要用到java.util.Stack (二)实验代码
程序代码:
1)杨辉三角:
/**
*功能:用二维数组实现杨辉三角
*时间:2011-05-01
**/
package https://www.360docs.net/doc/758690075.html,b1;
import java.io.*;
public class Pascal{
public Pascal(){
play();
}
public void play(){
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.print("请输入n值:");
int n = 0;
try {
n = Integer.parseInt(br.readLine());
} catch (NumberFormatException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
int array[][] = new int[n][2*n-1];
//判断是否为奇数
if( n%2 == 1 ){
for(int i=1; i<=n; i++){
for(int j=1; j<=2*n-1 ;j++){
//首先给前5-i个元素赋值0
if(j<=n-i)
array[i-1][j-1] = 0;
//输出第一个“1”和最后一个“1”
else if((j==(n-i+1))||(j==n+i-1))
array[i-1][j-1] = 1;
else if((j < n+i-1)&&(j > n-i+1)){
if((j-i)%2 == 1)
array[i-1][j-1] = 0;
else
array[i-1][j-1] = array[i-2][j-2] + array[i-2][j];
}
}
}
}
//为偶数所进行的操作
else{
for(int i=1; i<=n; i++){
for(int j=1; j<=2*n-1; j++){
//首先给前5-i个元素赋值0
if(j<=n-i)
array[i-1][j-1] = 0;
//输出第一个“1”和最后一个“1”
else if((j==(n-i+1))||(j==n+i-1))
array[i-1][j-1] = 1;
else if((j < n+i-1)&&(j > n-i+1)){
if((j-i)%2 == 0)
array[i-1][j-1] = 0;
else
array[i-1][j-1] = array[i-2][j-2] + array[i-2][j];
}
}
}
}
/*输出数组*/
for(int i=1; i<=n; i++){
for(int j=1; j<=2*n-1; j++){
if(array[i-1][j-1] == 0){
System.out.print(" ");
}
else
System.out.print(array[i-1][j-1]);
System.out.print(" ");
}
System.out.println();
}
}
public static void main(String argc[]){
Pascal p = new Pascal();
}
}
2)表达式求值,代码如下:
1)Stack类:用来存储表达式子元素的类,代码如下:
package https://www.360docs.net/doc/758690075.html,btwo;
public class Stack {
private int maxLen;
private int size;
private char c[];
public Stack(int maxLen) {
this.maxLen = maxLen;
c = new char[maxLen];
size = 0;
}
public void push(char v){
c[size++] = v;
}
public char pop(){
return c[--size];
}
public boolean isEmpty(){
return size == 0;
}
}
2)ExplainPostfix类:实现将输入的表达式转成后缀表达式,代码如下:
package https://www.360docs.net/doc/758690075.html,btwo; public class ExplainPostfix {
String in; String out = "";
Stack s;
public ExplainPostfix(String in){
System.out.println("计算表达式
为:"+in);
this.in = in;
}
public void display(){
System.out.println("后缀表达式
为:"+out);
}
//转换成后缀表达式
public void toPraser(){
s = new Stack(in.length());
for(int i=0;i char c = in.charAt(i); switch(c){ case'+': case'-': getOpter(c,1); break; case'*': case'/': getOpter(c,2); break; case'(': s.push(c); break; case')': getParen(); break; default: out = out + c; } } while(!s.isEmpty()){ out = out + s.pop(); } } public void getOpter(char c,int prec1){ out = out + 'a'; while(!s.isEmpty()){ char optop = s.pop(); if(optop == '('){ s.push(optop); break; } else{ int prec2 = 0; if(optop == '+' || optop == '-'){ prec2 = 1; } else{ prec2 = 2; } if(prec1>prec2){ s.push(optop); break; } else{ System.out.println("o p:"+optop); out = out + optop; } } } s.push(c); } public void getParen(){ while(!s.isEmpty()){ char c = s.pop(); if(c == '(') break; else out = out + c; } } public static void main(String[] args) { ExplainPostfix p = new ExplainPostfix("(11+2)*5"); p.toPraser(); p.display(); } } 3)CalculateExpression类:功能实现将后缀表达式进行计算,代码如下: package https://www.360docs.net/doc/758690075.html,btwo; public class CalculateExpression { String in; Stack s; public CalculateExpression(String in) { this.in = in; } public CalculateExpression(){ play(); } public static void main(String args[]){ ExplainPostfix p1 = new ExplainPostfix("(21+4)*(1+3*2)"); p1.toPraser(); p1.display(); CalculateExpression p = new CalculateExpression(p1.out); p.doPraser(); p.display(); } //开始计算后缀表达式 public void doPraser(){ while(true){ int a,b,c,d; a = in.indexOf("+"); b = in.indexOf("-"); c = in.indexOf("*"); d = in.indexOf("/"); int n = Math.max(a, b); n = Math.max(n, c); n = Math.max(n, d); if(a != -1){ n = a; } if(b n = b; } if(c n = c; } if(d n =d; } if(a == -1 && b == -1 && c == -1 && d == -1){ break; } String s1 = charAt(n-1); String s2 = charAt(n-2-s1.length()); int v = 0; if(n == a){ v = Integer.parseInt(s1) + Integer.parseInt(s2); } else if(n == b){ v = Integer.parseInt(s2) - Integer.parseInt(s1); } else if(n == c){ v = Integer.parseInt(s2) * Integer.parseInt(s1); } else{ v = Integer.parseInt(s2) / Integer.parseInt(s1); } String s = ""+v; if(s.equals("0")){ s = ""; } else{ s = s +"a"; } in = in.substring(0,https://www.360docs.net/doc/758690075.html,stIndexOf(s2)) +v+ in.substring(n+1,in.length()); } } public void display(){ System.out.println("结果为:"+in); } public String charAt(int i){ String str = ""; char c = in.charAt(i); if(c == '+' || c == '-' || c == '*' || c == '/'){ str = str + c; return str; } else{ while(c != 'a'){ str = c + str ; if(i == 0){ break; } c = in.charAt(--i); if(c == '+' || c == '-' || c == '*' || c == '/'){ break; } } } return str; } } 四.实验的结果及分析 1. 杨辉三角结果: 2. 算术表达式结果: 五.实验心得体会 试验后熟悉封装思想,使用基本Java算法。 竭诚为您提供优质文档/双击可除数据结构表达式求值实验报告 篇一:数据结构实验二——算术表达式求值实验报告 《数据结构与数据库》 实验报告 实验题目算术表达式求值 学院:化学与材料科学学院 专业班级:09级材料科学与工程系pb0920603 姓学 邮名:李维谷号:pb09206285箱: liwg@https://www.360docs.net/doc/758690075.html,指导教师:贾伯琪 实验时间:20XX年10月10日 一、需要分析 问题描述: 表达式计算是实现程序设计语言的基本问题之一,它的实现是栈的应用的一个典型例子。设计一个程序,演示通过将数学表达式字符串转化为后缀表达式,并通过后缀表达式结合栈的应用实现对算术表达式进行四则混合运算。 问题分析: 在计算机中,算术表达式由常量、变量、运算符和括号组成。由于不同的运算符具有不同的优先级,又要考虑括号,因此,算术表达式的求值不可能严格地从左到右进行。因而在程序设计时,借助栈实现。 设置运算符栈(字符型)和运算数栈(浮点型)辅助分析算符优先关系。在读入表达式的字符序列的同时完成运算符和运算数的识别处理,然后进行运算数的数值转换在进行四则运算。 在运算之后输出正确运算结果,输入表达式后演示在求值中运算数栈内的栈顶数据变化过程,最后得到运算结果。 算法规定: 输入形式:一个(:数据结构表达式求值实验报告)算术表达式,由常量、变量、运算符和括号组成(以字符串形式输入)。为使实验更完善,允许操作数为实数,操作符为(、)、.(表示小数点)、+、-、*、/、^(表示乘方),用#表示结束。 输出形式:演示表达式运算的中间结果和整个表达式的最终结果,以浮点型输出。 程序功能:对实数内的加减乘除乘方运算能正确的运算出结果,并能正确对错误输入和无定义的运算报错,能连续测试多组数据。 测试数据:正确输入:12*(3.6/3+4^2-1)# 杨辉三角的规律以及定理 李博洋 摘要杨辉三角中的一些规律 关键词杨辉三角幂二项式 引言 杨辉是我国南宋末年的一位杰出的数学家。在他所着的《详解九章算法》一书 中,画了一张表示二项式展开后的系数构成的三角图形,称做“开方做法本源”,现 在简称为“杨辉三角”,它是世界的一大重要研究成果。我们则来对“杨辉三角”的 规律进行探讨和研究。 内容 1二项式定理与杨辉三角 与杨辉三角联系最紧密的是二项式乘方展开式的系数规律,即。 杨辉三角我们首先从一个二次多项式(a+b)2的展开式来探讨。 由上式得出:(a+b)2=a2+2ab+b2此代数式的系数为:121 则(a+b)3的展开式是什么呢?答案为:a3+3a2b+3ab2+b3由此可发现,此代数式的系数 为:1331但似乎没有什么规律,所以让我们再来看看(a+b)4的展开式。 展开式为:a4+4a3b+6a2b2+4ab3+b4由此又可发现,代数式的系数为: 14641似乎发现了一些规律,就可以发现以下呈三角形的数列: 1(110) 11(111) 121(112) 1331(113) 14641(114) 15101051(115) 1615201561(116) 因此可得出二项式定理的公式为: (a+b)n=C(n,0)a^n*b^0+C(n,1)a^(n-1)*b^1+...+C(n,r)a^(n-r)*b^r...+C(n,n)a^0*b^n 因此,二项式定理与杨辉三角形是一对天然的数形趣遇,它把带进了。求二项式展开式系数的问题,实际上是一种组合数的计算问题。用系数来计算,称为“式算”;用杨辉三角形来计算,称作“图算”。 2杨辉三角的幂的关系 首先我们把杨辉三角的每一行分别相加,如下: 1(1) 11(1+1=2) 121(1+2+1=4) 1331(1+3+3+1=8) 14641(1+4+6+4+1=16) 15101051(1+5+10+10+5+1=32) 1615201561(1+6+15+20+15+6+1=64) …… 相加得到的数是1,2,4,8,16,32,64,…刚好是2的0,1,2,3,4,5,6,…次幂,即杨辉三角第n行中n个数之和等于2的n-1次幂 3杨辉三角中斜行和水平行之间的关系 (1) 1(2)n=1 11(3)n=2 121(4)n=3 1331(5)n=4 显示杨辉三角实验报告 姓名:许严班级:计122 学号:1213023050 1.问题描述 杨辉三角如图2.4.3所示,其特点是两个腰上数值是1,其他位置上的每一个整数都是它的上一行相邻两个整数之和。问题是:对于指定的最大行数rmax,要求从第一行到第rmax逐行显示杨辉三角形的所有元素。 2.基本要求 ⑴设计输出形式,尽量反映杨辉三角的特点。 ⑵设计计算杨辉三角形各行数值的方法。 ⑶输入:rmax从键盘输入。 ⑷输出:屏幕输出杨辉三角形. 3.实现提示 ⑴存储设计 计算杨辉三角形第i行时,如果在第i-1行两侧各添加一个0,则第i行的第j个元素等于第i-1行的第j-1个元素与第j个元素的和。计算如图2.4.4所示。第i行计算完,第i-1行的数据就没有用了,依据第i行数据可计算第i+1行的数据。 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 … 图2.4.3 杨辉三角形 从上述计算中不难看出,第i行的元素从左往右依次可被求得,求解过程中也是从左往右依次使用地i-1行的数据,显然,具有先入先出的特点。所以,可借助一个队列存放计算过程中所需的数据,如图2.4.5所示。 但随着航数的增加,队列会很长。所以,可以设置一循环队列,队长不少于rmax+2,边计算边出队。 (2)算法设计 计算各行元素的算法步骤如下。 Step1:队列初始化,0、1入队。队头ftont指向0处,队尾指向1后。 Step2:i从1到rmax,循环执行下列操作,求第i行数据。 2.1 0入队。 2.2 从队首起直到队尾,每出队两元素,求和后入队。 输出时注意0不输出。 《数据结构与数据库》 实验报告 实验题目 算术表达式求值 学院:化学与材料科学学院 专业班级:09级材料科学与工程系PB0920603 姓名:李维谷 学号:PB09206285 邮箱:liwg@https://www.360docs.net/doc/758690075.html, 指导教师:贾伯琪 实验时间:2010年10月10日 一、需要分析 问题描述: 表达式计算是实现程序设计语言的基本问题之一,它的实现是栈的应用的一个典型例子。设计一个程序,演示通过将数学表达式字符串转化为后缀表达式,并通过后缀表达式结合栈的应用实现对算术表达式进行四则混合运算。 问题分析: 在计算机中,算术表达式由常量、变量、运算符和括号组成。由于不同的运算符具有不同的优先级,又要考虑括号,因此,算术表达式的求值不可能严格地从左到右进行。因而在程序设计时,借助栈实现。 设置运算符栈(字符型)和运算数栈(浮点型)辅助分析算符优先关系。在读入表达式的字符序列的同时完成运算符和运算数的识别处理,然后进行运算数的数值转换在进行四则运算。 在运算之后输出正确运算结果,输入表达式后演示在求值中运算数栈内的栈顶数据变化过程,最后得到运算结果。 算法规定: 输入形式:一个算术表达式,由常量、变量、运算符和括号组成(以字符串形式输入)。为使实验更完善,允许操作数为实数,操作符为(、)、.(表示小数点)、+、-、*、/、^(表示乘方),用#表示结束。 输出形式:演示表达式运算的中间结果和整个表达式的最终结果,以浮点型输出。 程序功能:对实数内的加减乘除乘方运算能正确的运算出结果,并能正确对错误输入和无定义的运算报错,能连续测试多组数据。 测试数据:正确输入:12*(3.6/3+4^2-1)# 输出结果:194.4 2013-2014年度C++实验报告 学院:机械学院 专业:机械设计制造及其自动化学号:1240202414 姓名:陆响明数据结构表达式求值实验报告
杨辉三角的规律以及推导公式
显示杨辉三角实验报告
数据结构实验二——算术表达式求值实验报告
C++实验报告 (1)