数据结构课程设计长整数四则运算.docx

上传人:b****6 文档编号:8086682 上传时间:2023-01-28 格式:DOCX 页数:11 大小:18.63KB
下载 相关 举报
数据结构课程设计长整数四则运算.docx_第1页
第1页 / 共11页
数据结构课程设计长整数四则运算.docx_第2页
第2页 / 共11页
数据结构课程设计长整数四则运算.docx_第3页
第3页 / 共11页
数据结构课程设计长整数四则运算.docx_第4页
第4页 / 共11页
数据结构课程设计长整数四则运算.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

数据结构课程设计长整数四则运算.docx

《数据结构课程设计长整数四则运算.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计长整数四则运算.docx(11页珍藏版)》请在冰豆网上搜索。

数据结构课程设计长整数四则运算.docx

数据结构课程设计长整数四则运算

1、需求分析

1.本程序实现计算任意长的整数的四则运算.以用户和计算机对话的方式,先后输入数字的最多位数,然后程序就计算并显示出这两个数的运算。

2.利用双向循环链表现实长整数的存储,每个结点含一个整形变量。

输入的形式以回车结束,可以直接输入正数或负数,程序会过滤掉无效的字符。

按中国对于长整数的表示习惯,每四位一组,除数字和位于首位置的负号外,其它一切字符都将作为分隔符,连续多个分隔符当一个处理。

但不使用分隔符也不影响结果。

3.测试数据

(1)0;0;输出“0”;

(2)-2345,6789;-7654,3211;输出“-1,000,000”;(3)-9999,9999;1,0000,0000,0000;输出“9999,0000,0001”;(4)1,0001,0001;-1,0001,0001;输出“0”;(5)1,0001,0001;-1,0001,0001;输出“1”;(6)-9999,9999,9999;-9999,9999,9999;输出“-1,9999,9999,9998”;(7)1,0000,9999,9999;1;输出"1,0001,0000,0000".

2、概要设计

为实现上述程序功能,应以双向循环链表表示长整数。

为此,需要定义一个抽象数据类型。

1.抽象数据类型定义为:

ADTOrderedList{

数据对象:

D={ai|ai∈int,i=1,2,...n,n≥0}

基本操作:

init(&a,digit4)

操作结果:

构造一个位数是digit4*4长整数。

pass(&a,&b,&c)

初始条件:

a,b,c都已存在

操作结果:

c等于a和b的和。

nep(&a)

初始条件:

a已存在。

操作结果:

a变为输入参数的相反数。

printlong(&a)

初始条件:

a已存在。

操作结果:

按四位一组,分隔符为","的格式,在屏幕上输出a。

ston(&S,&a)初始条件:

a已存在。

操作结果:

把字符串形式的长数字赋给a。

}ADTOrderedList

2.本程序包含两个模块:

1)主程序模块:

Voidmain(){

选择操作:

1:

帮助。

2:

加法。

3:

减法。

4:

乘法。

5:

除法。

6:

退出。

打印结果;

}

三、详细设计

1.元素类型,结点类型,指针类型

#defineNULL0

#include

#include

#include

typedefstructlongnode{/*每个节点的结构*/

intnum;/*数字*/

structlongnode*low1;/*指向低一位节点*/

structlongnode*high1;/*指向高一位节点*/

}longnode;

typedefstructxlong{/*每个长整数的结构*/

longnode*High;/*每个长整数的最高节点*/

longnode*Low;/*每个长整数的最低节点*/

intdigit4;/*每个长整数的总位数(不包括高位的0)/4*/

}*xlong;

intinit(xlong*a,intdigit4){

intI;/*.init.*/

longnode*j;

(*a)=(xlong)malloc(sizeof(structxlong));/*为a的头结构申请空间,并赋初始值*/

(*a)>High=NULL;(*a)->Low=NULL;

(*a)->High=NULL;(*a)->Low=NULL;

(*a)->digit4=0;

for(i=0;i

j=(longnode*)malloc(sizeof(longnode));

j->num=0;j->high1=NULL;j->low1=(*a)->High;

if((*a)->High)(*a)->High->high1=j;

else

(*a)->Low=j;(*a)->High=j;(*a)->digit4++;

}

}

intpass(xlonga,xlongb,xlongc){

intcf=0;/*两个数字的相加*/

longnode*a1=a->Low,*b1=b->Low,*c1=c->Low;

while(a1){c1->num=a1->num+b1->num+cf;

if(c1->num>9999){

cf=1;/*如果产生进位(借位)*/

c1->num-=10000;

}else{cf=0;}

a1=a1->high1;b1=b1->high1;c1=c1->high1;}

returncf;/*最高位的进位(借位)*/

}

intpassa(xlonga,xlongb,xlongc){

intcf=0;/*两个数字的相减*/

longnode*a1=a->Low,*b1=b->Low,*c1=c->Low;

while(a1){c1->num=a1->num-b1->num-cf;

if(c1->num>9999){cf=1;/*如果产生进位(借位)*/

c1->num-=10000;

}else{cf=0;}

a1=a1->high1;b1=b1->high1;c1=c1->high1;

}

returncf;/*最高位的进位(借位)*/

}

intpassb(xlonga,xlongb,xlongc){

intcf=0;/*两个数字的相乘*/

longnode

*a1=a->Low,*b1=b->Low,*c1=c->Low;

while(a1){c1->num=a1->num*b1->num*cf;

if(c1->num>9999){cf=1;/*如果产生进位(借位)*/

c1->num=10000;

}else{cf=0;}

a1=a1->high1;b1=b1->high1;c1=c1->high1;}

returncf;/*最高位的进位(借位)*/

}

intpassc(xlonga,xlongb,xlongc){

intcf=0;/*两个数字的相除*/

longnode*a1=a->Low,*b1=b->Low,*c1=c->Low;

while(a1){c1->num=a1->num/b1->num/cf;

if(c1->num>9999){cf=1;/*如果产生进位(借位)*/

c1->num-=10000;

}else{cf=0;}}

a1=a1->high1;b1=b1->high1;c1=c1->high1;}

returncf;/*最高位的进位(借位)*/

}

nep(xlonga){/*求a的相反数*/

intcf=1;/*因为求相反数是取反加一,所以这里cf=1;*/

longnode*a1=a->Low;

while(a1)

{a1->num=9999-(a1->num)+cf;

if(a1->num>9999){a1->num=10000;}

else{cf=0;}a1=a1->high1;

}

return;

}

printlong(xlonga){

longnode*i=a->High;/*打印长整数a*/

if(i->num>=5000){

printf("-");/*最高位(bit)=1表示负数,即用补码表示*/

nep(a);/*求反打印其绝对值*/

}while(i&&i->num==0)i=i->low1;/*跳过最位的0*/

if(i){printf("%d",i->num);i=i->low1;

if(i)printf(“,”);

}elseprintf(“0”);/*a=0打0*/

while(i){printf("%04d",i->num);

if(i->low1)

printf(",");

i=i->low1;}}

intston(charin[],xlongout){/*把字符串转化为数字赋给a*/

intbit,i,jishu=1,num0=0;

longnode*j=out->Low;

i=strlen(in)-1;while(i>=0&&j){/*循环每一个字节*/

bit=in[i]-‘0’;/*把字符形式的值赋给整数形式的bit*/

if(bit>=0&&bit<=9){num0+=jishu*bit;/*加进num0*/

jishu*=10;/*基数自乘10*/}

if(jishu>1&&(jishu>=10000||bit<0||bit>9)){/*数字以外的字符*/

j->num=num0;

j=j->high1;/*存入一个节点*/

num0=0;

jishu=1;

}

i--;

}

if(num0)

{j->num=num0;j=j->high1;}/*把最后一个没存入节点的数存入节点*/

for(;j;j=j->high1)j->num=0;/*最位不足补0*/

if(out->High->num>=5000)

return1;/*如果最高位是1,返回1表示出*/

if(in[0]=='-')nep(out);/*如果最后一个字符是'-'则取反*/return0;}

intadd(){char*a1,*b1;/*加*/

intdigit4,cf=0;

xlonga,b,c;

do{printf("Howmuchdigitsdoyouneed?

");/*输入最多位数*/

scanf("%d",&digit4);

}while(digit4<=0);

a1=(char*)malloc(digit4+1);

b1=(char*)malloc(digit4+1);

digit4=digit4/4+1;

init(&a,digit4);

init(&b,digit4);

init(&c,digit4);/*初始化a,b,c*/

do{cf=0;printf("Enter2number:

\n");

scanf("%s",a1);printf("+\n");

scanf("%s",b1);cf|=ston(a1,a);

cf|=ston(b1,b);

}while(cf);/*输入被加数和加数,如果转换出错,则重输*/

pass(a,b,c);/*执行相加运算*/

printlong(a);printf("+");/*打印结果*/

printlong(b);printf("=");

printlong(c);printf("\n");

printf("\n");bioskey(0);}

intsubtract()/*减*/

{

char*a1,*b1;

intdigit4,cf=0;

xlonga,b,c;

do{printf("Howmuchdigitsdoyouneed?

");/*输入最多位*/

scanf("%d",&digit4);

}while(digit4<=0);

a1=(char*)malloc(digit4+1);

b1=(char*)malloc(digit4+1);

digit4=digit4/4+1;

init(&a,digit4);

init(&b,digit4);

init(&c,digit4);/*初始化a,b,c*/

do{cf=0;printf("Enter2number:

\n");

scanf("%s",a1);

printf("\n");

scanf("%s",b1);

cf|=ston(a1,a);

cf|=ston(b1,b);

}while(cf);/*输入被减数和减数,如果转换出错,则重输*/

passa(a,b,c);/*执行相减运算*/

printlong(a);printf("-");/*打印结果*/

printlong(b);printf("=");

printlong(c);printf("\n");

printf("\n");bioskey(0);

}

intmultiply()/*乘*/

{char*a1,*b1;

intdigit4,cf=0;

xlonga,b,c;

do{printf("Howmuchdigitsdoyouneed?

");/*输入最多位数*/

scanf("%d",&digit4);

}while(digit4<=0);

a1=(char*)malloc(digit4+1);b1=(char*)malloc(digit4+1);

digit4=digit4/4+1;

init(&a,digit4);

init(&b,digit4);

init(&c,digit4);/*初始化a,b,c*/

do{cf=0;

printf("Enter2number:

\n");

scanf("%s",a1);printf("*\n");

scanf("%s",b1);

cf|=ston(a1,a);

cf|=ston(b1,b);

}while(cf);/*输入被乘数和乘数,如果转换出错,则重输*/

passb(a,b,c);/*执行相乘运算*/

printlong(a);printf(“*”);/*打印结果*/

printlong(b);printf("=");

printlong(c);printf("\n");

printf("\n");bioskey(0);}

intdivision()/*除*/

{char*a1,*b1;

intdigit4,cf=0;

xlonga,b,c;

do{printf("Howmuchdigitsdoyouneed?

");/*输入最多位数*/

scanf("%d",&digit4);

}while(digit4<=0);

a1=(char*)malloc(digit4+1);

b1=(char*)malloc(digit4+1);

digit4=digit4/4+1;

init(&a,digit4);

init(&b,digit4);

init(&c,digit4);/*初始化a,b,c*/

do{cf=0;printf("Enter2number:

\n");

scanf("%s",a1);printf("/\n");

scanf("%s",b1);

cf|=ston(a1,a);

cf|=ston(b1,b);

}while(cf);/*输入被除数和除数,如果转换出错,则重输*/

passc(a,b,c);/*执行相除运算*/

printlong(a);printf("/");/*打印结果*/

printlong(b);printf("=");

printlong(c);printf("\n");

printf("\n");bioskey(0);

}

2.主函数代码

voidmain()/*main*/

{intc;

clrscr();

textcolor(BLUE);

printf("***********************************************\n");printf("*********WelcometoThunderstudio!

************\n");

printf("***********************************************\n");

printf("*********本程序实现长整数四则运算**************\n");

one:

printf("1:

------HELP\n");

printf("2:

------ADD\n");

printf("3:

------SUBTRACT\n");

printf("4:

------MULTIPLY\n");

printf("5:

------DiVISION\n");

printf("6:

------EXIT\n");

for(;;){c=getch();

switch(atoi(&c)){

case1:

clrscr();gotoone;break;

case2:

add();break;

case3:

subtract();break;

case4:

multiply();break;

case5:

division();break;

case6:

textcolor(BLUE);printf("\n------------------------------------------------------------\n");

printf("Thankscw'swork!

!

\n");

break;

default:

textcolor(4);

printf("Sorrypleaseinputrightnumber!

\n");

break;

}

}

}

四、调试分析

1.由于对基本要求看得不仔细,一开始使用的形式是数组,并非链表,导致空间开销大.

2.本程序的模块划分比较合理,且尽可能将指针的操作封装在结构体中,对于一个长整数只需一个指针便可访问其所有信息,所以数据结构清晰.

3.算法的时空分析1)本程序的计算量不是很大,所以时间复杂度极低.

2)每个长整数的位数可能不同,考虑到根据位数调整空间比较麻烦,而且容易出错,所以对每个长整数都是用同样大小的空间储存的.

3)由于计算完毕,显示结果后程序即结束,所以无须释放空间.

五、用户手册

1.本程序的运行环境为DOS操作系统,执行文件为:

j01242_5.EXE。

2.进入程序有菜单提示,选择需要的操作进入程序。

3.进入程序后屏幕提示“Howmuchdigitsdoyouneed?

”用户输入两个数中最多的位数.如0则输1,12则输入2,依此类推.负号不必考虑在.

4.接着屏幕提示“Enter2number:

”,用户应输入一个数,按回车,再输入一个数,再按回车.

5.接着屏幕即打印出计算结果.

六、测试结果

首先进入菜单选择:

如键入2<回车>

(1)键入1<回车>0<回车>0<回车>输出“0”

(2)键入8<回车>-2345,6789<回车>-7654,3211<回车>输出“-1,000,000”

(3)键入13<回车>-9999,9999<回车>1,0000,0000,0000<回车>输出“9999,0000,0001”

(4)键入9<回车>1,0001,0001<回车>-1,0001,0001<回车>输出“0”

(5)键入9<回车>1,0001,0001<回车>-1,0001,0001<回车>输出"1"

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 幼儿读物

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1