一元稀疏多项式简单计算器.docx
《一元稀疏多项式简单计算器.docx》由会员分享,可在线阅读,更多相关《一元稀疏多项式简单计算器.docx(82页珍藏版)》请在冰点文库上搜索。
一元稀疏多项式简单计算器
~浏水浮芸QQ632069015
《数据结构》课程设计报告
一元稀疏多项式计算器、迷宫问题、成绩分析问题、图的基本操作与实现以及背包问题的求解
学院(系):
计算机
班级:
软件工程4班
学生姓名:
江志伟学号10803080409
指导教师:
时间:
从2010年01月11日到2010年01月15日
一、课程设计概述:
本次数据结构课程设计共完成五个题:
一元稀疏多项式计算器、迷宫问题、成绩分析问题、图的基本操作与实现以及背包问题的求解
使用语言:
C
编译环境:
TC3.0
二、课程设计题目一
[实验内容]
一元稀疏多项式计算器
[问题描述]
设计一个一元稀疏多项式简单计算器。
[基本要求]
一元稀疏多项式简单计算器的基本功能是:
(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属性:
privatedoublec;//系数
privateinte;//指数
Item方法:
publicvoidsetC(doublec){//设置系数
}
publicvoidsetE(inte){//设置指数
}
publicdoublegetC(){//获取系数
}
publicintgetE(){//获取指数
}
publicdoubleresultItem(doublex){//在x处Item的值
}
privatedoublefac(doublex,inte){//求x的e次方,当e为整数时
}
Polynomial属性:
privateLinListlist;//单链表
Polynomial方法:
publicPolynomial(){
}
publicPolynomial(Item[]item)throwsException{//构造函数
}
privatevoidinitItem(Item[]item){//初始化Item数组,使其是按降序排序
}
publicintgetItemNum(){//获取项数
}
publicvoidprint()throwsException{//打印多项式不空行
}
publicvoidprintln()throwsException{//打印多项式空行
}
publicLinListgetLinList(){//获取单链表
}
publicvoidprintPolynomial()throwsException{//只打印项数、系数和指数
}
publicPolynomialadd(Polynomialother)throwsException{//多项式相加
}
}
publicPolynomialsubtraction(Polynomialother)throwsException{//多项式相减
}
publicdoubleresult(doublex)throwsException{
}
[详细设计]
Item类:
publicclassItem{
privatedoublec;//系数
privateinte;//指数
publicItem(){}
publicItem(doublec,inte){
this.c=c;
this.e=e;
}
publicvoidsetC(doublec){
this.c=c;
}
publicvoidsetE(inte){
this.e=e;
}
publicdoublegetC(){
returnc;
}
publicintgetE(){
returne;
}
publicdoubleresultItem(doublex){
returngetC()*fac(x,getE());
}
privatedoublefac(doublex,inte){//求x的e次方,当e为整数时
if(e==0)return1;
returnx*fac(x,e-1);
}
}
Polynomial类:
importjava.util.*;
publicclassPolynomial{//多项式类
privateLinListlist;//单链表
publicPolynomial(){
list=newLinList(0,null);
}
publicPolynomial(Item[]item)throwsException{//构造函数
intn=item.length;
list=newLinList(n,null);
if(n==0){
return;
}
initItem(item);
try{
for(inti=0;ilist.insert(i,item[i]);
}catch(Exceptione){}
}
privatevoidinitItem(Item[]item){//初始化Item数组,使其是按降序排序
intn=item.length;
intmax;
for(inti=0;imax=i;
for(intj=i+1;jif(item[j].getE()>item[max].getE())max=j;
if(max!
=i){
Itemtemp=item[i];
item[i]=item[max];
item[max]=temp;
}
}
}
publicintgetItemNum(){//获取项数
Objecttemp=list.head.getElement();
intn=-1;
if(tempinstanceofInteger){
Integeri=(Integer)temp;
n=i.intValue();
}
returnn;
}
publicvoidprint()throwsException{//打印多项式不空行
intn=getItemNum();
//System.out.println(n);
if(n==-1)return;
if(n==0){
System.out.print("0");
return;
}
booleanflag=true;//是不是输出第一项的标志
for(inti=0;iItemtemp=(Item)list.getData(i);
doublec=temp.getC();
if(c==0)continue;//系数为0时不输出
if(flag&&temp.getE()!
=0){
System.out.print(c+"x^"+temp.getE());
}
elseif(flag&&temp.getE()==0)
System.out.print(temp.getC());
else{
if(c>0)
System.out.print("+"+c+"x^"+temp.getE());
elseif(c<0)
System.out.print(c+"x^"+temp.getE());
}
flag=false;
}
}
publicvoidprintln()throwsException{//打印多项式空行
print();
System.out.println();
}
publicLinListgetLinList(){//获取单链表
returnlist;
}
publicvoidprintPolynomial()throwsException{//只打印项数、系数和指数
intn=getItemNum();
if(n==0)return;
System.out.print(n+",");
for(inti=0;iItemitem=(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();
}
publicPolynomialadd(Polynomialother)throwsException{//多项式相加
LinListotherList=other.getLinList();
intn1=getItemNum();//该多项式的项数
intn2=other.getItemNum();//另一个多项式的项数
if(n2==0)returnthis;
if(n1==0)returnother;
Polynomialtemp=newPolynomial();
inti=0,j=0;
while(+iItemitem=newItem();
Itemitem1=(Item)list.getData(i);
Itemitem2=(Item)otherList.getData(j);
doublec1=item1.getC();//获得系数
doublec2=item2.getC();
inte1=item1.getE();//获得指数
inte2=item2.getE();
if(e1==e2){//相等时
doublec=c1+c2;
item.setC(c);
item.setE(e1);
i++;
j++;
}
elseif(e1item=item2;
j++;
}
else{
item=item1;
i++;
}
try{
if(item.getC()==0)//当得到项的系数为0时就没有必要加入
continue;
temp.getLinList().insert(temp.getLinList().size(),item);
}catch(Exceptione){}
}
//将没有参加比较的项加进去,注意比较之后有且只有一个有多余的项
while(iItemitem1=(Item)list.getData(i);
try{
temp.getLinList().insert(temp.getLinList().size(),item1);
}catch(Exceptione){}
i++;
}
while(jItemitem1=(Item)otherList.getData(j);
try{
temp.getLinList().insert(temp.getLinList().size(),item1);
}catch(Exceptione){}
j++;
}
temp.getLinList().head.setElement(temp.getLinList().size());//设置项数
returntemp;
}
publicPolynomialsubtraction(Polynomialother)throwsException{//多项式相减
intn=other.getItemNum();
if(n==0)returnthis;
Polynomialtemp=newPolynomial();
LinListl=temp.getLinList();
for(inti=0;iItemitem=(Item)other.getLinList().getData(i);
doublec=-1*item.getC();//取反
l.insert(i,newItem(c,item.getE()));
}
l.head.setElement(n);//设置项数
returnadd(temp);
}
publicdoubleresult(doublex)throwsException{
doublesum=0;
intn=getItemNum();//该多项式的项数
if(n==0)return0;
for(inti=0;iItemitem=(Item)list.getData(i);
sum+=item.resultItem(x);
}
returnsum;
}
}
Test1类:
importjava.io.*;
importjava.util.Scanner;
publicclassTest1{
Scannerscanner=newScanner(System.in);
publicstaticvoidmain(String[]args)throwsException{
Test1test1=newTest1();
Scannerscanner1=newScanner(System.in);
while(true){
System.out.println("请输入你要操作的系号:
\n"+
"1)输出多项式\n"+
"2)多项式相加\n"+
"3)多项式相减\n"+
"4)计算多项式在x处的值\n"+
"5)退出");
Strings=scanner1.next();
intt=-1;
try{
t=Integer.parseInt(s);
}catch(Exceptione){}
switch(t){
case1:
test1.printPolynomial();break;
case2:
test1.add();break;
case3:
test1.subtraction();break;
case4:
test1.resultOfPolynomia();break;
case5:
System.exit(0);break;
default:
System.out.println("你输入的操作有误,请重试\n");continue;
}
}
}
privatevoidprintPolynomial()throwsException{//选择1时
System.out.println("请输入要输出的多项式的信息:
");
Item[]item=creatItemShuZu();
Polynomialp=newPolynomial(item);
p.printPolynomial();
}
privatevoidadd()throwsException{//选择2时
System.out.println("请输入第一个多项式的信息:
");
Item[]item1=creatItemShuZu();
Polynomialp1=newPolynomial(item1);
System.out.println("请输入第二个多项式的信息:
");
Item[]item2=creatItemShuZu();
Polynomialp2=newPolynomial(item2);
Polynomialp=p1.add(p2);
System.out.print("(");
p1.print();
System.out.print(")+(");
p2.print();
System.out.print(")=");
p.print();
System.out.println();
}
privatevoidsubtraction()throwsException{//选择3时
System.out.println("请输入第一个多项式的信息:
");
Item[]item1=creatItemShuZu();
Polynomialp1=newPolynomial(item1);
System.out.println("请输入第二个多项式的信息:
");
Item[]item2=creatItemShuZu();
Polynomialp2=newPolynomial(item2);
Polynomialp=p1.subtraction(p2);
System.out.print("(");
p1.print();
System.out.print(")-(");
p2.print();
System.out.print(")=");
p.print();
System.out.println();
}
privatevoidresultOfPolynomia()throwsException{//选择4时
System.out.println("请输入要输出的多项式的信息:
");
Item[]item=creatItemShuZu();
Polynomialp=newPolynomial(item);
System.out.println("请输入x=");
doublex=scanner.nextDouble();
System.out.println(p.result(x));
}
privateItem[]creatItemShuZu()throwsException{//构造多项式数组
System.out.print("项数n=");
intn=scanner.nextInt();
double[]c=newdouble[n];
int[]e=newint[n];
Item[]item=newItem[n];
System.out.print("请输入各项的系数:
");
for(inti=0;ic[i]=scanner.nextDouble();
System.out.print("请输入各项的指数:
");
for(inti=0;ie[i]=scanner.nextInt();
for(inti=0;iitem[i]=newItem(c[i],e[i]);
}
returnitem;
}
}
[调试分析]
本程序主要的操作对象是记录数组,使用的存储结构是结构体数组。
另外还有对C语言中关于文件的操作,这是本程序中的一个重点也是难点,是此程序出现问题的主要原因之一:
问题一:
现象:
输出的成绩不是正确的数字,而是一些类似于地址值的数字。
原因:
程序中对各数组的下标操作不统一。
因为程序要分别对三个科目的成绩进行统计,所以程序中就要有一个临时数组来存放成绩值,然而在将学科成绩存放在临时数组的过程中如果出现了下标不统一的情况,即在原记录数组中是1…n号元素存放数据,在临时数组中却是0…n-1号元素存放数据。
就会引起程序的错误。
解决的方法是将整个程序中相互有关的数组使用统一的下标存放数据,就可以避免这种问题。
问题二:
现象:
这是一个关于文件操作的问题。
在将记录存入文件以后再从文件中读取时就出现错误。
原因:
在使用fwrite和fread命令的时候函数的参数没有写正确。
fwrite和fread命令的第一个参数是存储数据的首地址,如果没有地址没有正确,那么就不能正常地将数据存到文件中也不能正常地读取。
[运行结果及分析]
1.初始界面:
2.输出多项式测试:
输入数据:
输出结果:
3、多项式相加测试:
输入2后:
输入第一个多项式后:
输入第二个多项式后:
结果:
4、多项式相减与相加类似,这里就不举例。
5、计算多项式在x处的值测试:
输入4后:
输完多项式和x的值后
结果:
三、课程设计题目二
2迷宫问题
[问题描述]
以一个m*n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。
设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。
[基本要求]
(1)实现一个以链表作存储结构的栈类型,然后编写一个求解迷宫的非递归程序。
求得的通路以三元组(i,j,d)的形式输出,其中:
(i,j)指示迷宫中的一个坐标,d表示走到下一坐标的方向。
(2)编写递归形式的算法,求得迷宫中所有可能的通路;
(3)以方阵形式输出迷宫及其通路。
(选做)