| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1652 人关注过本帖
标题:[求助]1个有问题的程序..百思不得其解问题出在哪,老师也不清楚- -
只看楼主 加入收藏
qdsqdsqds
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2007-1-23
收藏
 问题点数:0 回复次数:15 
[求助]1个有问题的程序..百思不得其解问题出在哪,老师也不清楚- -

问题1.单链表的应用求多项式和.
说明:输入两个多项式的数目(结点数),每项系数和指数(结点内容),输出第3个多项式(结果多项式)
思路:书上用重载加法,我不想照书上的所以只用链表来完成.鉴于指数比较时的困难,我的程序规定只能降冥输入
运行结果:通过编译,但运行时有错,而且仅一个函数出错
求改内容:如何能完成要实现的功能- -
程序代码如下:
头文件
#ifndef LINKLIST_H
#define LINKLIST_H
#include<iostream.h>
struct Node
{
int core;
int exp;
Node *next;
Node():core(NULL),exp(NULL),next(NULL){}
Node(const int& c, const int& e,Node *n=NULL):core(c),exp(e),next(n){}
};
class Linklist
{
public:
friend void add(Linklist a,Linklist b);

Linklist()
{
head=new Node();
}
Linklist(int kind)
{
kind=1;
head=NULL;
Node *p;
cout<<"please enter the amounts of the polys"<<endl;
int nodes;
cin>>nodes;
int *a=new int[nodes];
int *b=new int[nodes];
cout<<"plese enter "<<nodes<<"cores and exps"<<endl;
for(int i=0;i<nodes;i++)
{
cin>>a;
cin>>b;
}
for(int k=0;k<nodes;k++)
{
if (b[k]<b[k+1])
{
cerr<<"your poly isn't on rule"<<endl;
break;
}
else
head=p=new Node(a[k],b[k],head);
}
}

void showList()
{
Node *p=head;
for(;p;p=p->next)
{
if(p!=NULL)
cout<<p->core<<'x'<<'^'<<p->exp<<'+';
else
cout<<p->core<<'x'<<'^'<<p->exp<<endl;
}
}
protected:
Node *head;
int currentsize;
};
#endif
说明:单链表类定义,包括结点,类中的构造函数(空表的和有值表的),输出表元素的函数.

主函数:
#include<iostream.h>
#include"poly.h"
void add(Linklist a,Linklist b)
{
Linklist c;
Node *p=a.head;
Node *q=b.head;
Node *r=c.head;
while(p->next!=NULL||q->next!=NULL)
{
if(p->next==NULL)
{
for(;q;q=q->next)
{
r->next=q;
r=r->next;
}
}
else if(q->next==NULL)
{
for(;p;p=p->next)
{
r->next=p;
r=r->next;
}
}
else if(p->exp<q->exp)
{
r->next=p;
r=r->next;
p=p->next;
}
else if(p->exp>q->exp)
{
r->next=q;
r=r->next;
q=q->next;
}
else if(p->core+q->core==0)
{
p=p->next;
q=q->next;
}
else
{
Node *s=new Node(p->core+q->core,p->exp,NULL);
r=s;
r=r->next;
p=p->next;
q=q->next;
}

}
c.showList();
}

void main()
{
cout<<"please enter the first poly"<<endl;
Linklist polya(1);
cout<<"please enter the second poly"<<endl;
Linklist polyb(2);
cout<<"the first poly is"<<endl;
polya.showList();
cout<<"the second poly is"<<endl;
polyb.showList();
cout<<"now adding..."<<endl;
add(polya,polyb);
}
说明:第1个函数定义求多项式和.

拜一下各位大虾看看

[此贴子已经被作者于2007-1-23 22:54:03编辑过]

搜索更多相关主题的帖子: 百思不得其解 多项式 Node 老师 
2007-01-23 19:07
qdsqdsqds
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2007-1-23
收藏
得分:0 

问题2.数制转换--10进制换2进制
说明:输入一个10进制数,输出相应的2进制数.
思路:整数部分除2取余,用栈操作,小数部分乘2取整,用队列操作
运行结果:通过编译,且运行无错,但想完善一下程序
求改内容:小数部分只能精确到N位(我的程序中是10位),如何在小数部分已取完后只输出相应的小数位?
(例如,0.5转换后应为0.1,而我的程序转换后是0.1000000)
程序代码如下:
头文件:
#include <iostream.h>
#include <stdlib.h>

template<class type> class seqstack
{
private:
int top;
type* stacka;
int maxsize;
public:
int data1[100];
int l;
seqstack(int size);
~seqstack(){delete[]stacka;}
void push(const type& item);
type pop(void);
int empty(void) const {return top == -1;}
int full () const {return top == maxsize-1;}
void clear(void) {top=-1;}
void change(int a);
void display();
};

template <class type> seqstack<type>::seqstack (int size):top(-1),maxsize(size){
stacka=new type[maxsize];
if (stacka==NULL)
{cerr<<"动态存储分配失败!"<<endl;
exit(1);}
l=0;
}


template <class type>void seqstack<type>::push(const type& item)
{
if(full())
{
cerr<<"栈已满,不能入栈!"<<endl;
exit(1);
}
top++;

stacka[top]=item;
}

template <class type>type seqstack<type>::pop()
{
if(empty())
{
cout<<"栈已空!"<<endl;
exit(1);
}
type data=stacka[top];
top--;
return data;
}

template <class type>void seqstack<type>::change(int a)
{
int b=a;
while(a!=0)
{
a=a/2;
l++;
}
for(int i=0;i<l;i++)
{
if(b%2==0)
push(0);
else
push(1);
b=b/2;
}
for(int j=0;j<l;j++)
{
data1[j]=pop();
}
}

template <class type>void seqstack<type>::display()
{
for(int i=0;i<l;i++)
{
cout<<data1;
}
}

/////////////////////////////////////////////////////////////////////////////


template <class type> class cirqueue
{
private:
int rear,front;
type * queue;
int maxsize;
int x;
public:
cirqueue(int size=10);
~cirqueue() {delete[]queue;}
int Isfull() const {return(rear+1)%maxsize==front;}
void EnQueue(const type item);
type DeQueue();
int IsEmpty ()const {return front==rear;}
void change2(double b);
double data2[100];
void display2();
};

template <class type> cirqueue<type>::cirqueue(int size):front(0),rear(0),maxsize(size)
{
queue=new type[maxsize];
if(queue==NULL)
{
cerr<<"动态存储分配失败"<<endl;
exit(1);
}
}

template <class type> void cirqueue<type>::EnQueue(const type item)
{
if(Isfull())
{
cerr<<"队列已满,不能入列!"<<endl;
exit(1);
}
rear=(rear+1)%maxsize;
queue[rear]=item;
}

template <class type> type cirqueue<type>::DeQueue()
{
int x;
if(IsEmpty())return NULL;
front=(front+1)%maxsize;
x=queue[front];
return x;
}


template <class type> void cirqueue<type>::change2(double c)
{
int d=c;
double b=c-d;
for(int i=0;i<10;i++)
{
b=b*2;
if(b==1)
{
EnQueue(1);
break;
}
if(b>1)
{
EnQueue(1);
b=b-1;
}
else
EnQueue(0);
}
for(int j=0;j<10;j++)
{
data2[j]=DeQueue();
}
}


template <class type>void cirqueue<type>::display2()
{
for(int i=0;i<10;i++)
{
cout<<data2;
}
}

说明:栈和队列相应定义,其中change和change2分别是整数和小数部分转换的函数

主函数
#include <iostream.h>
#include "pp.h"

void main()
{
double t;
seqstack<int> a(100);
cirqueue<double> b(11);

cout<<"请输入10进制数:";
cin>>t;
a.change(t);
b.change2(t);
cout<<"转换后的2进制数:";
a.display();
cout<<".";b.display2();
}
说明:在运行时由于强类型转换会出现2个警告,但没问题- -

再拜一下~

2007-01-23 19:08
qdsqdsqds
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2007-1-23
收藏
得分:0 

问题3.求矩阵鞍点(所谓鞍点即元素在该行上最大,该列上最小)
说明:输入一个矩阵,输出这个矩阵的鞍点个数,鞍点所在位置,鞍点值
思路:扫描矩阵行,临时变量MAX,每取到比现有MAX大的值存入MAX,记下当前位置,并从当前位置向后扫描,看是否有=MAX的元素存在,有再记下位置.最后比较被记下的位置所在列,是列上最小即输出
运行结果:通过编译,能够运行,但需要功能未完好实现
求改内容:当矩阵有多个鞍点时我的程序仍然无法输出多个鞍点,如何能输出多个鞍点?
程序代码:
#include <iostream.h>
void main()
{
int m,n;
int max=0;
int i,j;
cout<<"输入行:";
cin>>m;
cout<<"输入列:";
cin>>n;
int a[10][10];
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
cout<<"a["<<i<<"]["<<j<<"]:";
cin>>a[j];
}
}
int i1,j1,temp;
int j2;
for(i1=0;i1<m;i1++)
{
for(j1=0;j1<n;j1++)
{
if(a[i1][j1]>max)
{
max=a[i1][j1];
temp=j1;
}
}
for(j1=temp;j1<n;j1++)
{
if(a[i1][j1]==max)
{
j2=0;
while(j2<m&&a[j2][j1]>=max)
{
j2++;
}
if(j2==m)
cout<<"鞍点:a["<<i1<<"]["<<j1<<"]:"<<a[i1][j1]<<endl;
}
}
}
}

此问题已解决~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
方法为加上一变量列最小值liemin,判断当liemin==hangmax时输出鞍点

[此贴子已经被作者于2007-1-23 21:55:44编辑过]

2007-01-23 19:08
qdsqdsqds
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2007-1-23
收藏
得分:0 
就是这3个问题了~困扰了我好几个星期,大学里老师一下课就像逃一样,难得抓住问问临时也解决不了,考试在即只好麻烦大家看看了

另外,因为书上像用到头文件都是用.h,用到主函数都是VOID MAIN,但论坛上都说这形式被屏弃的,在网上找的区别都是我看不懂的- -
2007-01-23 19:10
maxlea
Rank: 1
等 级:新手上路
帖 子:62
专家分:0
注 册:2006-12-7
收藏
得分:0 


#include <iostream.h>
void main()
{
int m,n;
int max=0;//max 赋值为0?难道矩阵里面不能有负数么??
int i,j;
cout<<\"输入行:\";
cin>>m;
cout<<\"输入列:\";
cin>>n;
int a[10][10];
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
cout<<\"a[\"<<i<<\"][\"<<j<<\"]:\";
cin>>a[i][j];
}
}//循环输入

int i1,j1,temp;
int j2;
for(i1=0;i1<m;i1++)
{
max=a[i1][0];temp=0;//纠正你上面的
for(j1=0;j1<n;j1++)//判断出该行最大的
{
if(a[i1][j1]>max)
{
max=a[i1][j1];
temp=j1;
}
}
// 再比较列,你干嘛比较行? for(j1=temp;j1<n;j1++)
int f;
for(f=0;f<m;f++)
{
if(a[f][temp]<max)
break;
else if(f==m-1)
cout << a[f][temp] <<endl;
/* {
j2=0;
while(j2<m&&a[j2][j1]>=max)
{
j2++;
}
if(j2==m)
cout<<\"鞍点:a[\"<<i1<<\"][\"<<j1<<\"]:\"<<a[i1][j1]<<endl;
}
*/
}
}
}


矩阵鞍点


work~work
2007-01-23 19:45
maxlea
Rank: 1
等 级:新手上路
帖 子:62
专家分:0
注 册:2006-12-7
收藏
得分:0 
由于我刚大一一学期,。。只能改的这样了,但是相等情况很复杂,估计你那个没办法修的

work~work
2007-01-23 19:46
qdsqdsqds
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2007-1-23
收藏
得分:0 

谢谢楼上的指出MAX的问题- -确实矩阵未必没有小于0的元素,另个问题我可能没描述清楚,鞍点所谓的行最大可能存在多个相等的最大值,所以一行上能出现多个鞍点,我在程序里加入了新的变量 列最小值 后成功的解决了
看看前两道吧..哎

2007-01-23 21:53
qdsqdsqds
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2007-1-23
收藏
得分:0 

maxlea好象是我学弟哦~我现在大2的说~等学到数据结构就要碰上我前面两道题啦

2007-01-23 21:57
qdsqdsqds
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2007-1-23
收藏
得分:0 
问题2在追加变量控制输出数后解决- -只剩一个问题了..不过那才是最难的.....因为是报错而不是改小错~
2007-01-23 22:53
maxlea
Rank: 1
等 级:新手上路
帖 子:62
专家分:0
注 册:2006-12-7
收藏
得分:0 
汗。。一个学校的?

work~work
2007-01-23 22:58
快速回复:[求助]1个有问题的程序..百思不得其解问题出在哪,老师也不清楚- -
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.035385 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved