1、一元稀疏多项式简单计算器浏水浮芸QQ632069015数据结构课程设计报告一元稀疏多项式计算器、迷宫问题、成绩分析问题、图的基本操作与实现以及背包问题的求解 学院(系): 计算机 班 级: 软件工程 4班 学生姓名: 江志伟 学号 10803080409 指导教师: 时间: 从 2010年 01 月 11日到 2010 年01 月 15 日一、课程设计概述:本次数据结构课程设计共完成五个题:一元稀疏多项式计算器、迷宫问题、成绩分析问题、图的基本操作与实现以及背包问题的求解使用语言:C 编译环境:TC3.0二、课程设计题目一实验内容 一元稀疏多项式计算器问题描述设计一个一元稀疏多项式简单计算器。
2、基本要求一元稀疏多项式简单计算器的基本功能是:(1) 输入并建立多项式;(2) 输出多项式,输出形式为整数序列:n,c1,e1, c2,e2, cn,en,其中n是多项式的项数,ci,ei,分别是第i项的系数和指数,序列按指数降序排序;(3) 多项式a和b相加,建立多项式a+b;(4) 多项式a和b相减,建立多项式a-b;(5) 计算多项式在x处的值。(6) 计算器的仿真界面。(选做) 概要设计-=ADT=- Test1:主类,程序的启动 Item :项,表示多项式中的某一项 Ploynomial:多项式类 存储结构 Item属性: private double c;/系数 private i
3、nt e;/指数Item方法: public void setC(double c)/设置系数 public void setE(int e) /设置指数 public double getC()/获取系数 public int getE()/获取指数 public double resultItem(double x)/在x处 Item的值 private double fac(double x,int e)/求x的e次方,当e为整数时 Polynomial属性: private LinList list;/单链表Polynomial方法: public Polynomial() publi
4、c Polynomial(Item item)throws Exception /构造函数 private void initItem(Item item)/初始化Item数组,使其是按降序排序 public int getItemNum()/获取项数 public void print()throws Exception/打印多项式 不空行 public void println()throws Exception/打印多项式 空行 public LinList getLinList()/获取单链表 public void printPolynomial()throws Exception/
5、只打印项数、系数和指数 public Polynomial add(Polynomial other)throws Exception/多项式相加 public Polynomial subtraction(Polynomial other)throws Exception/多项式相减 public double result(double x)throws Exception 详细设计 Item类: public class Item private double c;/系数 private int e;/指数 public Item() public Item(double c,int e
6、) this.c=c; this.e=e; public void setC(double c) this.c=c; public void setE(int e) this.e=e; public double getC() return c; public int getE() return e; public double resultItem(double x) return getC()*fac(x,getE(); private double fac(double x,int e)/求x的e次方,当e为整数时 if(e=0) return 1; return x*fac(x,e-1
7、); Polynomial类: import java.util.*;public class Polynomial/多项式类 private LinList list;/单链表 public Polynomial() list=new LinList(0,null); public Polynomial(Item item)throws Exception /构造函数 int n=item.length; list=new LinList(n,null); if(n=0) return; initItem(item); try for(int i=0;in;i+) list.insert(i
8、,itemi); catch(Exception e) private void initItem(Item item)/初始化Item数组,使其是按降序排序 int n=item.length; int max; for(int i=0;in;i+) max=i; for(int j=i+1;jitemmax.getE() max=j; if(max!=i) Item temp=itemi; itemi=itemmax; itemmax=temp; public int getItemNum()/获取项数 Object temp=list.head.getElement(); int n=-
9、1; if(temp instanceof Integer) Integer i=(Integer)temp; n=i.intValue(); return n; public void print()throws Exception/打印多项式 不空行 int n=getItemNum(); / System.out.println(n); if(n=-1) return ; if(n=0) System.out.print(0); return; boolean flag=true;/是不是输出第一项的标志 for(int i=0;i0) System.out.print(+c+x+tem
10、p.getE(); else if(c0) System.out.print(c+x+temp.getE(); flag=false; public void println()throws Exception/打印多项式 空行 print(); System.out.println(); public LinList getLinList()/获取单链表 return list; public void printPolynomial()throws Exception/只打印项数、系数和指数 int n=getItemNum(); if(n=0) return ; System.out.p
11、rint(n+,); for(int i=0;in;i+) Item item=(Item)this.getLinList().getData(i); if(i!=n-1) System.out.print(c+i+=+item.getC()+, +e+i+=+item.getE()+, ); else System.out.print(c+i+=+item.getC()+, +e+i+=+item.getE(); System.out.println(); public Polynomial add(Polynomial other)throws Exception/多项式相加 LinLis
12、t otherList=other.getLinList(); int n1=getItemNum();/该多项式的项数 int n2=other.getItemNum();/另一个多项式的项数 if(n2=0) return this; if(n1=0) return other; Polynomial temp=new Polynomial(); int i=0,j=0; while (+in1 & jn2) Item item=new Item(); Item item1=(Item)list.getData(i); Item item2=(Item)otherList.getData(
13、j); double c1=item1.getC();/获得系数 double c2=item2.getC(); int e1=item1.getE();/获得指数 int e2=item2.getE(); if(e1=e2)/相等时 double c=c1+c2; item.setC(c); item.setE(e1); i+; j+; else if(e1e2)/不相等时 指数的大的增加 item=item2; j+; else item=item1; i+; try if(item.getC()=0)/当得到项的系数为0时就没有必要加入 continue; temp.getLinList
14、().insert(temp.getLinList().size(),item); catch(Exception e) /将没有参加比较的项加进去,注意比较之后 有且只有一个有多余的项 while(in1) Item item1=(Item)list.getData(i); try temp.getLinList().insert(temp.getLinList().size(),item1); catch(Exception e) i+; while(jn2) Item item1=(Item)otherList.getData(j); try temp.getLinList().inse
15、rt(temp.getLinList().size(),item1); catch(Exception e) j+; temp.getLinList().head.setElement(temp.getLinList().size();/设置项数 return temp; public Polynomial subtraction(Polynomial other)throws Exception/多项式相减 int n=other.getItemNum(); if(n=0) return this; Polynomial temp=new Polynomial(); LinList l=te
16、mp.getLinList(); for(int i=0;in;i+) Item item =(Item)other.getLinList().getData(i); double c=-1*item.getC();/取反 l.insert(i,new Item(c,item.getE(); l.head.setElement(n);/设置项数 return add(temp); public double result(double x)throws Exception double sum=0; int n=getItemNum();/该多项式的项数 if(n=0) return 0; f
17、or(int i=0;in;i+) Item item=(Item)list.getData(i); sum+=item.resultItem(x); return sum; Test1类: import java.io.*;import java.util.Scanner;public class Test1 Scanner scanner =new Scanner(System.in); public static void main(String args)throws Exception Test1 test1=new Test1(); Scanner scanner1 =new Sc
18、anner(System.in); while(true) System.out.println(请输入你要操作的系号:n+ 1)输出多项式n+ 2)多项式相加n+ 3)多项式相减n+ 4)计算多项式在x处的值n+ 5)退出); String s=scanner1.next(); int t=-1; try t=Integer.parseInt(s); catch(Exception e) switch(t) case 1:test1.printPolynomial();break; case 2:test1.add();break; case 3:test1.subtraction();br
19、eak; case 4:test1.resultOfPolynomia();break; case 5:System.exit(0);break; default:System.out.println(你输入的操作有误,请重试n);continue; private void printPolynomial()throws Exception/选择1时 System.out.println(请输入要输出的多项式的信息:); Item item=creatItemShuZu(); Polynomial p=new Polynomial(item); p.printPolynomial(); pr
20、ivate void add()throws Exception/选择2时 System.out.println(请输入第一个多项式的信息:); Item item1=creatItemShuZu(); Polynomial p1=new Polynomial(item1); System.out.println(请输入第二个多项式的信息:); Item item2=creatItemShuZu(); Polynomial p2=new Polynomial(item2); Polynomial p=p1.add(p2); System.out.print(); p1.print(); Sys
21、tem.out.print()+(); p2.print(); System.out.print()=); p.print(); System.out.println(); private void subtraction()throws Exception/选择3时 System.out.println(请输入第一个多项式的信息:); Item item1=creatItemShuZu(); Polynomial p1=new Polynomial(item1); System.out.println(请输入第二个多项式的信息:); Item item2=creatItemShuZu();
22、Polynomial p2=new Polynomial(item2); Polynomial p=p1.subtraction(p2); System.out.print(); p1.print(); System.out.print()-(); p2.print(); System.out.print()=); p.print(); System.out.println(); private void resultOfPolynomia()throws Exception/选择4时 System.out.println(请输入要输出的多项式的信息:); Item item=creatIte
23、mShuZu(); Polynomial p=new Polynomial(item); System.out.println(请输入x=); double x=scanner.nextDouble(); System.out.println(p.result(x); private Item creatItemShuZu()throws Exception/构造多项式数组 System.out.print(项数n=); int n=scanner.nextInt(); double c=new doublen; int e=new intn; Item item=new Itemn; Sys
24、tem.out.print(请输入各项的系数:); for(int i=0;in;i+) ci=scanner.nextDouble(); System.out.print(请输入各项的指数:); for(int i=0;in;i+) ei=scanner.nextInt(); for(int i=0;in;i+) itemi=new Item(ci,ei); return item; 调试分析 本程序主要的操作对象是记录数组,使用的存储结构是结构体数组。另外还有对C语言中关于文件的操作,这是本程序中的一个重点也是难点,是此程序出现问题的主要原因之一:问题一: 现象:输出的成绩不是正确的数字,
25、而是一些类似于地址值的数字。 原因:程序中对各数组的下标操作不统一。因为程序要分别对三个科目的成绩进行统计,所以程序中就要有一个临时数组来存放成绩值,然而在将学科成绩存放在临时数组的过程中如果出现了下标不统一的情况,即在原记录数组中是1n号元素存放数据,在临时数组中却是0n-1号元素存放数据。就会引起程序的错误。解决的方法是将整个程序中相互有关的数组使用统一的下标存放数据,就可以避免这种问题。问题二: 现象:这是一个关于文件操作的问题。在将记录存入文件以后再从文件中读取时就出现错误。 原因:在使用fwrite和fread命令的时候函数的参数没有写正确。fwrite和fread 命令的第一个参数
26、是存储数据的首地址,如果没有地址没有正确,那么就不能正常地将数据存到文件中也不能正常地读取。运行结果及分析1. 初始界面:2. 输出多项式测试:输入数据: 输出结果:3、多项式相加测试:输入2后:输入第一个多项式后:输入第二个多项式后:结果:4、多项式相减与相加类似,这里就不举例。5、计算多项式在x处的值测试: 输入4后:输完多项式和x的值后结果: 三、课程设计题目二 2 迷宫问题问题描述以一个m*n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。基本要求(1) 实现一个以链表作存储结构的栈类型,然后编写一个求解迷宫的非递归程序。求得的通路以三元组(i,j,d)的形式输出,其中:(i,j)指示迷宫中的一个坐标,d表示走到下一坐标的方向。(2) 编写递归形式的算法,求得迷宫中所有可能的通路;(3) 以方阵形式输出迷宫及其通路。(选做)
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1