两个任意长的整数的求和运算.docx
- 文档编号:28160338
- 上传时间:2023-07-08
- 格式:DOCX
- 页数:22
- 大小:73.89KB
两个任意长的整数的求和运算.docx
《两个任意长的整数的求和运算.docx》由会员分享,可在线阅读,更多相关《两个任意长的整数的求和运算.docx(22页珍藏版)》请在冰豆网上搜索。
两个任意长的整数的求和运算
软件综合课程设计
两个任意长的整数的求和运算
进制的转换
2014年6月
1、问题陈述
二、需求分析
3、概要设计
4、详细设计
5、程序代码
6、运行结果与测试
七、设计体会与总结
两个任意长的整数的求和运算
1、问题陈述
设计一个程序实现两个任意长的整数的求和运算。
利用双向循环链表,设计一个实现任意长的整数进行加法运算的演示程序。
要求输入和输出每四位一组,组间用逗号隔开。
如:
1,0000,0000,0000,0000。
二、需求分析
1、本程序实现计算任意长的整数的加法运算.以用户和计算机对话的方式,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运算命令,然后程序就计算并显示出这两个数的运算。
2、本演示程序中,集合的元素限定为数字字符[‘0’~’9’],输入字符可以任意长,输入形式以“#”为结束标志,串中字符顺序不限,且允许出现重复字符。
3、利用双向循环链表现实长整数的存储,每个结点含一个整形变量。
输入的形式以#结束,每四位一组。
三、概要设计
在此说明数据结构设计和关键的算法设计思想
Add()函数是实现该问题的主要函数即相加。
typedefstructet定义双循环链表的存储结构.
voidsetin(dtp*a)读入数据存储在双链表中的函数;
voidprint1(dtp*w,intlen)原样输出输入的数,略去结束符"#";
voidprint2(dtpa,intlen)输出运算结果,以每四位一个","样式;
四、详细设计
程序流程图
开始
如果4位间没有“,”隔开
如果4位间没有“,”隔开
转换成4位一个逗号的格式
输出结果
五、程序代码
#include
usingnamespacestd;
#definenull0
typedefstructet//自定义双循环链表的存储结构.
{
intdata;
structet*pr,*next;
}dtp;
voidsetin(dtp*a)//读入数据存储在双链表中的函数;
{
chark;
intw,len=0;
dtp*p;
a->next=null;
a->data=null;
a->pr=null;
cout<<"inputthenumber:
";
while(cin>>k)//一次读入数字或一个字符",";
{
if(k=='\n')
continue;
if(k=='#')
break;//以"#"表示该数也讲读完;
if(k==44)
continue;//读到字符','继续读下一个数;
p=newdtp;//读入一个四位数为它开辟一个存储空间
w=k-'0';
p->data=w;
len++;
if(a->next)
a->next->pr=p;
p->next=a->next;
a->next=p;
p->pr=a;
k=0;
}
}
voidadd(dtpa,dtpb,dtp*c,int*len)//两个数相加的函数;
{
dtp*s,*r,*t;
inti,j,sum,k=0,w=0;
c->next=null;
c->data=null;
c->pr=null;
s=a.next;
r=b.next;
while(s&&r)//从最后一位开始加,若多于10,进到下一个存储空间;
{//直到一个数被加完为止;
i=s->data;
j=r->data;
sum=i+j+k;
k=sum/10;
sum=sum%10;
t=newdtp;
t->data=sum;
w=w+1;
if(c->next)
c->next->pr=t;
t->next=c->next;
c->next=t;
t->pr=c;
s=s->next;
r=r->next;
}
if(s||r)//如果有一个数还有更高位,则继续加上去;
{
if(s)
while(s)
{
t=newdtp;
sum=s->data+k;
k=sum/10;
sum=sum%10;
t->data=sum;
w=w+1;
if(c->next)
c->next->pr=t;
t->next=c->next;
c->next=t;
t->pr=c;
s=s->next;
}
if(r)
while(r)
{
t=newdtp;
sum=r->data+k;
k=sum/10;
sum=sum%10;
t->data=sum;
w=w+1;
if(c->next)
c->next->pr=t;
t->next=c->next;
c->next=t;
t->pr=c;
r=r->next;
}
}
if(k!
=0)//如果最后还有就要多开辟一个空间来存储.
{
t=newdtp;
t->data=k;
w=w+1;
if(c->next)
c->next->pr=t;
t->next=c->next;
c->next=t;
t->pr=c;
}
*len=w;
}
voidprint1(dtp*w,intlen)//原样输出输入的数,略去结束符"#";
{
dtp*q;
inti=len;
q=w->next;
while(q->next)
{
q=q->next;
}
while(q->pr)
{
cout<
q=q->pr;
i--;
if(i%4==0&&i)
cout<<",";
}
cout< } voidprint2(dtpa,intlen)//输出运算结果,以每四位一个","样式; { inti=len; dtp*q; q=a.next; while(q) { cout< q=q->next; i--; if(i%4==0&&i) cout<<","; } cout< } voidmain() { intlength; charma; dtpla,lb,lc; { cout<<"输入方式,按从后面每四位之间一个字符','的形式.以'#'表示输入结束: "< cout<<"请输入第一个数a: "< setin(&la); cout<<"请输入第二个数b: "< setin(&lb); add(la,lb,&lc,&length); cout<<"你输入的两个数的和为: "; cout< print1(&la,length); cout<<"+"; print1(&lb,length); cout<<"---------------"; cout< print2(lc,length); for(;2;) { cin>>ma; if(ma=='\n') continue; elsebreak; } } } 六、运行结果与测试 进制的转换 一、问题陈述 任意给定一个M进制的数x,请实现如下要求 1)求出此数x的10进制值(用MD表示) 2)实现对x向任意的一个非M进制的数的转换。 3)至少用两种或两种以上的方法实现上述要求(用栈解决,用数组解决,其它方法解决)。 二、需求分析 1、应用环境设定: 生活中我们需要将M进制的数转换为我们所需要的进制,从键盘任意输入一个M进制的数,对其进行转换成其他三种进制的数,然后再从电脑中显示出来,最终得到我们的结果。 2、用户界面: 命令行界面,根据自己的要求,对界面的提示进行操作,正确输入我们需要的数据。 3、输入方式: 首先输入将转换的进制数,回车确认;然后输入确定的数据,回车确认;接着选择要转换为的进制数,回车确认。 输出方式: 界面直接输出,启动程序后,按照界面提示,输入数据,直接回车确认,显示屏即输出我们的数据结果。 数据储存方式: 全部在内存存放,不使用硬盘上的文件或其他数据源,程序执行过程中和结束后不保存数据。 程序功能: (1)、根据界面提示输入M进制数据。 (2)、对任意M进制数据实行非M进制的转换。 三、概要设计 在此说明数据结构设计和关键的算法设计思想 1、用数组实现该问题 D2M()函数和M2D()函数是实现该问题的主要函数。 D2M()函数是实现十进制转换为其它进制的函数,它是将输入的十进制数x取首先对需要转换的进制M取余,然后再对其取整,接着通过递归调用D2M()函数依次将得到的整数部分依次先取余后取整,并将所得的余数依次存入一个数组中,然后逆向取出数组中的元素,即得到转换后的结果。 而M2D()函数则是实现其他进制M转换为十进制,并将其转换为非M进制的数。 M进制转十进制则是从该M进制数的最后一位开始算,依次列为第0、1、2…n位并分别乘以M的0、1、2…n次方,将得到的次方相加便得到对应的十进制数,再调用D2M()函数将其转换为非M进制的数。 2、用栈实现该问题 同样是利用D2M()和M2D()两个函数实现。 两个函数的思想同利用数组实现时相同。 只是栈具有后进先出的性质,故其用Pop()取数较数组的逆向取数方便些。 (1)、SqStack定义栈,说明base为栈底指针,top为栈顶指针,stacksize为栈容量; (2)、intInitStack(SqStack&S)到intDestroyStack(SqStack&S)六大模块分别表示构造一个空栈、用e表示栈元素、插入元素、删除元素、判断栈是否为空以及摧毁栈; (3)、SqStackS是指定义栈S; (4)、D2M(inta,intb)的功能是将十进制数转换成M进制的函数; (5)、M2D()的功能是M进制转换为十进制的函数; (6)、voidmain()是主函数。 其功能是输入需要测试的数据以及需要转换的进制,并在特定情形下调用D2M()函数和M2D()函数,而且实现M进制数向任意非M进制数的转换。 四、详细设计 程序流程图 开始 若N! =10 若N=10 五、程序代码 A.用数组实现(文件名shuzu.cpp) #include #include #defineN1000 inti,j,y,n,s; intm,r,reminder; intx;//全局变量默认初始化为0,不必再赋0了 D2M(intg,inth)//十进制数转换为其他进制数 { intc[N]; i=0; reminder=g%h; g=g/h; if(reminder>9){ c[i]=reminder+55; i++; }else{ c[i]=reminder; i++; } if(g>0) D2M(g,h); for(j=i-1;j>=0;j--) if(c[j]>=65) printf("%c",c[j]); else printf("%d",c[j]); return0; } M2D(inte)//二进制和八进制数转换为十进制数,并这转换为其他进制数 { inta[N]; printf("请输入%d进制位数: \n",m); scanf("%d",&n); printf("请输入%d进制的每位并使每位用空格隔开: \n",m); for(i=0;i scanf("%d",&a[i]); for(i=n-1;i>=0;i--){ y+=(int)pow(e,j)*a[i];//强制类型转换,以免造成数据丢失 j++; } printf("需要转换的进制M: \n"); scanf("%d",&s); printf("请输出转换成%d进制的结果: \n",s); D2M(y,s); return0; } H2D(intf)//十六进制数转换为十进制数,并转换为其他进制数 { intb[N]; printf("请输入%d进制位数: \n",m); scanf("%d",&n); printf("请输入%d进制的每位并使每位用空格隔开: \n",m); for(i=0;i scanf("%x",&b[i]); for(i=n-1;i>=0;i--){ y+=(int)pow(f,j)*b[i];//强制类型转换,以免造成数据丢失 j++; } printf("需要转换的进制M: \n"); scanf("%d",&s); printf("请输出转换成%d进制的结果: \n",s); D2M(y,s); return0; } intmain() { printf("请给定一个需转换的进制M(2or8or10or16): \n"); scanf("%d",&m); if(m==2||m==8)//二进制和八进制转换成十进制 M2D(m); elseif(m==16)//十六进制转换成十进制 H2D(m); elseif(m==10)//十进制转换成其它进制 { printf("请输入一个%d进制数: \n",m); scanf("%d",&x); printf("请输入需要转换成的进制M(2or8or16): \n"); scanf("%d",&r); printf("请输出转换成%d进制的结果: \n",r); D2M(x,r); } return0; } B.用栈实现(文件名zhan.cpp) #include #include #include #include #defineSTACK_INIT_SIZE100//存储空间初始分配量 #defineSTACKINCREMENT10//存储空间分配增量 inte,m,x,s,t;//x为要转换的十进制数,e为临时用的的int型变量 intr,y,i,n; typedefstruct { int*base;//栈底 int*top;//栈顶 intstacksize;//栈容量 }SqStack; intInitStack(SqStack&S) {//构造一个空栈 S.base=(int*)malloc(STACK_INIT_SIZE*sizeof(int)); if(! S.base)exit(0);//存储空间失败 S.top=S.base; S.stacksize=STACK_INIT_SIZE; return0; } intGetTop(SqStackS,int&e) {//若栈不为空,则用e返回S的栈顶元素,并返回0,否则返回1 if(S.top==S.base)return1; e=*(S.top-1); return0; } intPush(SqStack&S,inte) {//插入元素e为新的栈顶元素 if(S.top-S.base>=S.stacksize) {//栈满,追加存储空间 S.base=(int*)realloc(S.base, (S.stacksize+STACKINCREMENT)*sizeof(int)); if(! S.base)return1;//存储分配失败 S.top=S.base+S.stacksize; S.stacksize+=STACKINCREMENT; } *S.top++=e; return0; } intPop(SqStack&S,int&e) {//若栈不空,则删除S的栈顶元素,用e返回其值,并返回0,否则返回1 if(S.top==S.base)return1; e=*--S.top; return0; } intStackEmpty(SqStackS) {//若栈空,则返回1,否则返回0 if(S.top==S.base) return1; return0; } intDestroyStack(SqStack&S) {//销毁栈S,栈S不再存在 free(S.base); S.top=NULL;//防止程序后面不小心使用了它 S.base=S.top; return0; } SqStackS;//定义栈S intD2M(inta,intb)//十进制转换成其他进制的函数D2M() { while(a) { r=a%b; if(r>9) r=r+55; Push(S,r);//压入栈 a/=b;//转换成M进制 } printf("该数转换成%d进制的结果: ",b); while(! StackEmpty(S)) { Pop(S,e);//弹出栈 if(e>=65) printf("%c",e); else printf("%d",e); } return0; } voidM2D()//其他进制转换为十进制的函数M2D() { charc[1000]; printf("请输入需要转换的数的位数: "); scanf("%d",&n); printf("请输入需要转换的数的每位并用空格隔开: "); for(i=0;i { scanf("%x",&c[i]); Push(S,c[i]); } i=0; while(! StackEmpty(S)) { Pop(S,e); y+=(int)pow(m,i)*e; i++; } } intmain() { InitStack(S);//构造一个空栈 printf("请输入需要转换的进制M(2or8or10or16): "); scanf("%d",&m); if(m==10)//十进制转换成其他进制 { printf("请给定一个需要转换的10进制数: "); scanf("%d",&x); printf("请输入需要转换成的进制数: "); scanf("%d",&t); D2M(x,t); } if(m==2||m==8||m==16)//其他进制转换成十进制,且其他任意进制的相互转换 { M2D(); printf("给定要转换成的进制M: "); scanf("%d",&s); D2M(y,s); } printf("\n"); DestroyStack(S);//销毁栈S,栈S不再存在 } 六、运行结果与测试 1.十六进制数1A2B3C转换十进制数测试结果如下: 2.二进制数转换八进制数测试结果如下: 3.八进制数1234转换为十六进制数测试结果如下: 7、设计体会与总结 这次的软件综合设计,刚开始设计的第一个我是根据老师说的要求,用了C++,这个是在大学的时候学的,但是学的不是特别好,后来又说可以用C语言,我就把第二个程序用了C语言,因为我对C了解的比较多,因为高中学过三年。 这次的软件综合设计使我收获颇丰,它结合了我们大学期间学习的C++语言、C语言和数据结构的相关知识,C是高中的时候学的,C++语言是大一学习的,而数据结构是大二学习的,因此这次的课程设计可谓是对以前学习的知识的一个复习和巩固,也正是这样,让我们更加熟悉和巩固已有的计算机知识,为我们今后计算机的学习奠定了坚实的道路。 本次的课程设计,我选的题目是两个任意长的整数的求和运算和进制的转换。 以前也写过类似的,不过一般都是基于顺序表的,这次是用链表来作为我系统的数据存储结构。 经过这两周的辛苦和努力,总算是实现了系统的大概的功能。 对于数据的链式存储,动态的申请内存空间是必不可少的功能。 因此在实验中我的最大的问题就是内存释放不干净,产生了一些野指针,使得程序的运行不稳定。 后来通过反复的单步调试,我总算找到了相应的解决办法。 最后,感谢大学三年来为我们辛勤付出的老师们,感谢你们孜孜不倦的教诲。 正是有了你们的教导,才有我们在计算机道路上的前行。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 两个 任意 整数 求和 运算