计算机基础算法实验.docx

上传人:b****5 文档编号:7473187 上传时间:2023-01-24 格式:DOCX 页数:12 大小:97.90KB
下载 相关 举报
计算机基础算法实验.docx_第1页
第1页 / 共12页
计算机基础算法实验.docx_第2页
第2页 / 共12页
计算机基础算法实验.docx_第3页
第3页 / 共12页
计算机基础算法实验.docx_第4页
第4页 / 共12页
计算机基础算法实验.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

计算机基础算法实验.docx

《计算机基础算法实验.docx》由会员分享,可在线阅读,更多相关《计算机基础算法实验.docx(12页珍藏版)》请在冰豆网上搜索。

计算机基础算法实验.docx

计算机基础算法实验

计算机基础算法实验

班级:

学号:

姓名:

 

完成日期:

 

算法1实现两个整数相加

1.需求分析

课程设计任务是用链表(单链表或双向链表)实现任意位数的整数相加。

输入的形式和输入值的范围:

长度不超过一百位的整数。

输出的形式:

有中文提示,分三行输出。

2.概要设计

LNode*CreatList()操作结果:

构造一个链表.

LNodeAdd(LNode*t1,LNode*t2)初始条件:

存在两个结点t1,t2;操作结果:

实现两个结点的相加。

voidprint(LNode*L)初始条件:

L存在;操作结果:

打印链表L。

3.详细设计

(1)

主过程

(2)

打印求和链表过程

4.调试分析

输入的数必须为长度不超过一百位的整数,否则出现错误;如:

输入6.4和3.2,输出结果为9-46。

根据实际情况的需要,可以将整数的长度定义为1000位,甚至更长。

5.总结

(1)熟悉掌握链表的建立及调用,同时对数组的理解进一步加深;

(2)认识到自己的不足,以后多加练习,争取写出更好的算法。

实验内容:

源程序:

#include

#include

#include

#defineMAX100

typedefstructLNode

{

intdata;

structLNode*pre,*next;

}LNode,List;

LNode*CreatList()

{

LNode*p,*q,*r;

chars[MAX];

inti=0;

printf("输入一个整数:

");

gets(s);

p=(LNode*)malloc(sizeof(List)*MAX);

q=r=p;

p->data=-1;

while(s[i]!

=NULL)

{

q=(LNode*)malloc(sizeof(List));

q->data=s[i++]-'0';

q->pre=r;

r->next=q;

r=q;

}

r->next=NULL;

returnp;

}

LNodeAdd(LNode*t1,LNode*t2)

{

while(t1->data!

=-1&&t2->data!

=-1)

{

t1->data=t1->data+t2->data;

if(t1->data>9)

{

t1->data-=10;

t1->pre->data+=1;

}

t1=t1->pre;

t2=t2->pre;

}

if(t1->next->data>9)

t1->next->data-=10;

return*t1;

}

LNode*Compare(LNode*p1,LNode*p2)

{

LNode*s1=p1->next,*s2=p2->next,*t1,*t2;

inti=0,j=0;

while(s1!

=NULL)

{t1=s1;s1=s1->next;i++;}

while(s2!

=NULL)

{t2=s2;s2=s2->next;j++;}

if(i>=j)Add(t1,t2);

elseAdd(t2,t1);

returni>=j?

p1:

p2;

}

voidprint(LNode*L)

{

LNode*p;

printf("两整数的和为:

");

if(L->data!

=-1)printf("%d",1);

p=L->next;

do

{

printf("%d",p->data);

p=p->next;

}

while(p!

=NULL);

printf("\n");

}

intmain()

{

LNode*p1,*p2,*p3;

p1=CreatList();

p2=CreatList();

p3=Compare(p1,p2);

print(p3);

getch();

return0;

}

运行结果:

示例

输入一个整数:

6541

输入一个整数:

212354

两整数的和为:

218895

运行效果图为:

算法2算术表达式求值

1.需求分析

课程设计任务是以字符序列的形式从终端输入语法正确的、不含变量的整数表达式,利用给定的算符优先关系,实现对算术四则混合运算表达式的求值,并演示在求值过程中运算符栈、操作数栈、操作数栈和主要操作的变化过程。

输入的形式和输入值的范围:

不含变量的整数表达式,算术四则混合运算表达式。

输出的形式:

表达式。

2.概要设计

StatusInitStack(SqStack&S)操作结果:

构造一个空栈S。

StatusGetTop(SqStackS)初始条件:

栈S存在且非空。

操作结果:

用e返回S的栈顶元素.

StatusPush(SqStack&S,ElemTypee)初始条件:

栈S已存在。

操作结果:

插入元素e为新的栈顶元素.

StatusPop(SqStack&S,ElemType&e)初始条件:

栈S存在且非空.操作结果:

删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR.

3.详细设计

4.调试分析

设计算法时,应考虑到运算符的优先关系,依此思想进行设计;该算法的时间复杂度为O(n),n为栈的长度;

5.总结

(1)通过该算法了解到自己对栈的理解不是很到位,因此以后要加强这方面的练习,遇到类似问题时,不会束手无策;

(2)该算法是参考资料加上自己的理解所得,学到了不少的东西,收获也不小。

实验内容:

源程序:

#include

#include

#include

#include

#defineOVERFLOW-1

#defineOK0

#defineERROR1

typedefintStatus;

#defineSTACK_INIT_SIZE100//初始分配量

#defineSTACKINCREMENT10//存储空间的分配增量

typedefcharElemType;

typedefElemTypeOperandType;//操作数

typedefcharOperatorType;

typedefstruct

{

ElemType*base;

ElemType*top;

intstacksize;

}SqStack;

StatusInitStack(SqStack&S)

{

//构造一个空栈S

S.base=(ElemType*)malloc(STACK_INIT_SIZE*sizeof(ElemType));

if(!

S.base)exit(OVERFLOW);

S.top=S.base;

S.stacksize=STACK_INIT_SIZE;

returnOK;

}

StatusGetTop(SqStackS){

ElemTypee;

if(S.top==S.base)returnERROR;

e=*(S.top-1);

returne;

}

StatusPush(SqStack&S,ElemTypee)

{

//插入元素e为新的栈顶元素

if(S.top-S.base>=S.stacksize){

S.base=(ElemType*)realloc(S.base,

(S.stacksize+STACKINCREMENT)*sizeof(ElemType));

if(!

S.base)exit(OVERFLOW);

S.top=S.base+S.stacksize;

S.stacksize+=STACKINCREMENT;

}

*S.top++=e;

returnOK;

}

StatusPop(SqStack&S,ElemType&e){

//若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR

if(S.top==S.base)returnERROR;

e=*--S.top;

returnOK;

}

charIn(charc,charOP[])

{

if(c>=35&&c<=47)

return1;

elsereturn0;

}

charOP[8]={'+','-','*','/','(',')','#','\0'};

intm[7][7]=

{1,1,2,2,2,1,1,

1,1,2,2,2,1,1,

1,1,1,1,2,1,1,

1,1,1,1,2,1,1,

2,2,2,2,2,0,-1,

1,1,1,1,-1,1,1,

2,2,2,2,2,-1,0};

charPrecede(chari,charj)

{

inta,b;char*p;

for(p=OP,a=0;*p!

='\0';p++,a++)

if(*p==i)break;

for(p=OP,b=0;*p!

='\0';p++,b++)

if(*p==j)break;

if(m[a][b]==1)return'>';

elseif(m[a][b]==2)return'<';

elseif(m[a][b]==0)return'=';

elsereturn'O';

}

charOperate(chara,chartheta,charb)

{

if(a>47)a=atoi(&a);

if(b>47)b=atoi(&b);

switch(theta)

{

case'+':

returna+b;

break;

case'-':

returna-b;

break;

case'*':

returna*b;

break;

case'/':

returna/b;

break;

}

}

OperandTypeEvaluateExpression()

{

SqStackOPTR,OPND;

OperandTypea,b,c;OperatorTypetheta;

InitStack(OPTR);Push(OPTR,'#');

InitStack(OPND);c=getchar();

while(c!

='#'||GetTop(OPTR)!

='#')

{

if(!

In(c,OP)){Push(OPND,c);c=getchar();}

else

switch(Precede(GetTop(OPTR),c))

{

case'<':

Push(OPTR,c);c=getchar();

break;

case'=':

Pop(OPTR,c);c=getchar();

break;

case'>':

Pop(OPTR,theta);

Pop(OPND,b);Pop(OPND,a);

Push(OPND,Operate(a,theta,b));

break;

}

}

returnGetTop(OPND);

}

voidmain()

{

printf("(以#为结束符)\n");

printf("请输入:

\n");

inta;

a=(int)EvaluateExpression();

printf("%d",a);

getch();

}

运行结果:

示例

(以#为结束符)

请输入:

4*(2+3)-4#

16

运行效果图为:

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

当前位置:首页 > 农林牧渔 > 林学

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

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