计算计算法实验报告.docx
- 文档编号:23563128
- 上传时间:2023-05-18
- 格式:DOCX
- 页数:14
- 大小:90.70KB
计算计算法实验报告.docx
《计算计算法实验报告.docx》由会员分享,可在线阅读,更多相关《计算计算法实验报告.docx(14页珍藏版)》请在冰豆网上搜索。
计算计算法实验报告
计算机基础算法实验报告
班级:
09级计算机8班
学号:
0913********
姓名:
余亚锋
完成日期:
2010/12/22
实验一:
实现两个长整数相加
一、需求分析:
1.输入两个任意长整数。
2.要求用链表(单链表或双向链表)实现任意位数的整数相加。
3.输出两个长整数之和。
2、概要设计:
1.程序设计中用到线性表结构。
2.本实验主程序中调用两次创建链表函数,创建两个单链表,并把输入的两个长整数分别存储在两个链表中,再创建第三个链表,把求和之后的结果放入第三个链表中。
3、详细设计:
程序代码:
#include
#include
#defineNULL0
#defineLENsizeof(structnum)
structnum//定义一个简单的结构体
{
intnumber;
structnum*next;
};
intn;
structnum*creat()//创建链表,并把数据放入表中
{
structnum*head;
structnum*p1,*p2;
intn=0;
charb=getchar();
p1=p2=(structnum*)malloc(LEN);
head=NULL;
while(b!
='\n')
{
p1->number=b-48;
n=n+1;
if(n==1)p1->next=NULL;
else
{p1->next=p2;
p2=p1;
}
p1=(structnum*)malloc(LEN);
b=getchar();
}
head=p2;
return(head);
}
structnum*add(structnum*h1,structnum*h2)//创建一个链表,并把前两个链表h1、h2处理结果放在此链表中
{
intn,n1,n2,a,b=0;//n1为表1中的数,n2为表2中的数,a为处理后的余数,b为进位
structnum*p1,*head;
p1=(structnum*)malloc(LEN);
intj=0;
while(h1!
=NULL||h2!
=NULL||b!
=0)
{
if(h1==NULL)
n1=0;
else
{
n1=h1->number;
h1=h1->next;
}
if(h2==NULL)
n2=0;
else
{
n2=h2->number;
h2=h2->next;
}
n=n1+n2+b;//求和
a=n%10;//取余
b=n/10;//取商(进位)
p1->number=a;
j=j+1;
if(j==1)p1->next=NULL;
elsep1->next=head;
head=p1;
p1=(structnum*)malloc(LEN);
}
return(head);
}
voidprint(structnum*h)//定义一个函数,用来输出链表3最终结果
{
while(h!
=NULL)
{
printf("%d",h->number);
h=h->next;
}
}
voidmain()
{
structnum*head1,*head2,*head3;
printf("利用链表实现两个长整数相加\n");
printf("pleaseputthefirstnumberintothelinklist:
");
head1=creat();
printf("pleaseputthesecondnumberintothelinklist:
");
head2=creat();
printf("theresultis:
");
head3=add(head1,head2);
print(head3);
printf("\n");
}
4、调试分析:
程序运行结果截图:
5、实验总结:
1.通过本实验,学会了构建单链表以及关于单链表的一些简单处理,并用链表处理数据。
2.学会了在程序调试过程中对出现的问题进行处理。
3.通过学习,各方面水平有一定的提高,对今后进一步的学习相关知识和程序设计与调试很有帮助。
实验二:
算术表达式求值
一、需求分析:
1.以字符序列的形式从终端输入语法正确的、不含变量的整数表达式。
2.利用给定的算符优先关系,实现对算术四则混合运算表达式的求值。
3演示在求值过程中运算符栈、操作数栈、操作数栈和主要操作的变化过程。
2、概要设计:
1.程序设计中用到栈结构。
2.本实验主程序中直接调用一个实现结果的函数来输出结果,整个函数通过构造两个栈、判断运算关系优先级、运算、过程等部分构成。
3、详细设计:
实现程序代码:
#include
#include
#definestack_init_size140
#definestack_init_size220
#definestackincrement140
#definestackincrement220
inti=0,j=0,k=0;
staticcharyouxian[7][7]=
{
{'>','>','<','<','<','>','>'},
{'>','>','<','<','<','>','>'},
{'>','>','>','>','<','>','>'},
{'>','>','>','>','<','>','>'},
{'<','<','<','<','<','=','>'},
{'>','>','>','>','>','>','>'},
{'<','<','<','<','<','>','='}
};
typedefstruct{
int*base;
int*top;
intstacksize;
}s_stack;
typedefstruct{
char*base;
char*top;
intstacksize;
}f_stack;
voids_push(s_stack*s,inte)
{
if(s->top-s->base>=s->stacksize)
{
s->base=(int*)realloc(s->base,(s->stacksize+stackincrement1)*sizeof(int));
if(!
s->base)exit(0);
s->top=s->base+s->stacksize;
s->stacksize+=stackincrement1;
}
*s->top=e;s->top++;
}
voidf_push(f_stack*f,chare)
{
if(f->top-f->base>=f->stacksize)
{
f->base=(char*)realloc(f->base,(f->stacksize+stackincrement2)*sizeof(char));
if(!
f->base)exit(0);
f->top=f->base+f->stacksize;
f->stacksize+=stackincrement2;
}
*f->top=e;f->top++;
}
ints_gettop(s_stack*s)
{
s->top--;
return*s->top;
}
charf_gettop(f_stack*f)
{
f->top--;
return*f->top;
}
intin(charc)
{
switch(c)
{
case'+':
return0;
case'-':
return1;
case'*':
return2;
case'/':
return3;
case'(':
return4;
case')':
return5;
case'#':
return6;
default:
return9;
}
}
charpanduan(f_stack*f,charc)
{
intm,n;
charw;
m=in(c);
w=*(f->top-1);
n=in(w);
returnyouxian[n][m];
}
intyunsuan(intp,charr,intq)
{
switch(r)
{
case'+':
returnq+p;
case'-':
returnq-p;
case'*':
returnq*p;
case'/':
returnq/p;
}
}
intgoucheng()
{
s_stacks;
f_stackf;
s.base=(int*)malloc(stack_init_size1*sizeof(int));
if(!
s.base)return0;
s.top=s.base;
s.stacksize=stack_init_size1;
f.base=(char*)malloc(stack_init_size2*sizeof(char));
if(!
f.base)return0;
f.top=f.base;
f.stacksize=stack_init_size2;
*f.top='#';f.top++;
inth=0,jieguo,wrong;
charc;
c=getchar();
if(i==0&&c=='-'&&(*(f.top-1)=='#')&&(s.top==s.base))i=1;
if(k==0&&c=='-'&&(*(f.top-1)=='('))k=1;
while(c!
='\n')
{intt;
intp,q;
charr;
if(in(c)==9)
{
if(h>0)
{
t=s_gettop(&s);
s_push(&s,t*10+c-48);
}
else
if(i==1||j>0||k==1)
{
s_push(&s,0);
s_push(&s,c-48);
i++;k=0;
}
else
s_push(&s,c-48);
h++;
c=getchar();
}
else
switch(panduan(&f,c))
{
case'<':
f_push(&f,c);c=getchar();h=0;break;
case'=':
if(k=1)
{
f.top=f.top-2;
f.stacksize=f.stacksize-2;
c=getchar();h=0;break;
}
else
{
f.top--;
f.stacksize--;
c=getchar();h=0;break;
}
case'>':
p=s_gettop(&s);
q=s_gettop(&s);
r=f_gettop(&f);
if(r=='/'&&p==0)
{wrong=1;break;}
else
{
jieguo=yunsuan(p,r,q);
s_push(&s,jieguo);h=0;break;
}
}
}
while((c=='\n')&&(*(f.top-1)!
='#'))
{
intp,q;
charr;
p=s_gettop(&s);
q=s_gettop(&s);
r=f_gettop(&f);
if(r=='/'&&p==0)
{wrong=1;break;}
else
jieguo=yunsuan(p,r,q);
s_push(&s,jieguo);
}
if(wrong==1)
printf("Itiswrong!
\n");
else
printf("theansweris%d\n",s_gettop(&s));
}
intmain()
{
printf("请输入待求表达式:
");
goucheng();
}
4、调试结果:
程序运行结果截图:
五:
实验总结:
1.学会了构建栈结构以及关于栈的一些简单操作。
2.通过学习,会用栈结构对表达式进行求值。
3.在对本程序的调试过程中花了很多时间,开始也出现了很多问题,但最终还是被克服,学会了更高效的调试和运行程序的方法。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算 算法 实验 报告