杨辉三角.docx
- 文档编号:23649575
- 上传时间:2023-05-19
- 格式:DOCX
- 页数:9
- 大小:30.67KB
杨辉三角.docx
《杨辉三角.docx》由会员分享,可在线阅读,更多相关《杨辉三角.docx(9页珍藏版)》请在冰豆网上搜索。
杨辉三角
问题背景
中国古代数学史曾经有代写论文自己光辉灿烂的篇章,而杨辉三角的发现就是十分精彩的一页。
杨辉三角是中国古代数学家贾宪在公元11世纪发现,并被南宋数学家杨辉在他的书中所引述,才使我们今天得以了解贾宪在数学上的重大贡献。
杨辉三角是一个由数字排列成的三角形数表.一般形式如右图:
问题描述:
请编程实现杨辉三角的显示,根据输入的行数,在屏幕上显示杨辉三角
一、需求分析
1、程序的功能:
由用户从键盘输入杨辉三角的规模n,计算并输出杨辉三角(输出到屏幕上)
2、输入的形式和输出值的范围:
用户的输入为一整型数值,理论上没有限制问题规模的大小,且题目要求为小于20,但当问题规模大于16的时候鉴于输出框的大小,无法正常显示杨辉三角的形式,所以输入值最好小于16。
不对非法输入做处理,即假定所有输入都是合法的。
3、输出的形式:
输出杨辉三角每一行的数据,并在行后面表明行数
4、测试数据:
样例:
输入杨辉三角的规模(小于20的整数)8
输出:
生成的杨辉三角如下
1n=0
11n=1
121n=2
1331n=3
14641n=4
15101051n=5
1615201561n=6
172135352171n=7
18285670562881n=8
二、概要设计
1、抽象数据类型:
为实现上述程序的功能,根据题目要求,应以整数存储用户的输入;为实现杨辉三角的不断生成和输出,利用基于顺序队列的操作来生成和输出杨辉三角。
顺序队列的定义如下:
ADTQuene
Quene(ints);//构造一个大小为s+2的队列
~Quene();//队列的析构函数释放队列所占的内存
intdequene();//队首元素出栈,并返回队首元素
voidenquene(intm);//数据m进队
intgetValue(){returnp[front];}//获取队首元素的值,队首元素不出队
voidPrintTri();//计算并输出杨辉三角
2、算法的基本思想:
队列的构造函数首先申请一块大小为n+2的内存空间,建立环形队列,在输出杨辉三角的上一行的时候同时利用杨辉三角的数字特征把其下一行的元素计算出来并插入队列中,利用for循环把整个杨辉三角输出。
3、程序的流程
程序由三个模块组成
(1)输入模块:
完成正整数的输入,存入变量n中。
(2)建队模块:
建立大小为n+2的环形队列q
(3)计算输出模块:
计算并输出杨辉三角的每一行
三、详细设计
1、物理数据类型:
题目要求输入的正整数的取值范围小于20,所以采用int定义变量,队列所存储的最多元素个数与用户的输入有关,所以用动态分配内存的方法实现其物理数据结构杨辉三角中的数据都为正整数,所以队列中的元素类型定义为整型
voidQuene:
:
enquene(intm){
rear=(rear+1)%size;
p[rear]=m;//元素m入队
}
intQuene:
:
dequene(){
inttos=p[front];
front=(front+1)%size;
cout< returntos;//返回队首元素 } voidQuene: : PrintTri(){ cout<<"生成的杨辉三角如下"< inti,j,tos; for(i=0;i enquene (1); for(j=0;j<=i;j++){ tos=dequene(); if(j>=0&&j enquene(tos+getValue()); } enquene (1); cout<<"n="< 2、算法的时空分析和改进设想: 算法的执行主要是在PrintTri()函数中循环计算入队和输出杨辉三角,由于采用顺序队列来实现,所以入队和出对的时间代价为O (1),PrintTri()函数中的双层for循环的时间代价为O( )所以整个算法的时间代价为O(n ),n为杨辉三角的规模,即用户输入的行数。 3、函数之间的调用关系 输入杨辉三角的规模n Queneq(n)构建队列q enquene (1)将元素1插入队尾 main() dequene(m)队首元素出队 getValue()返回队首元素 的值 enquene(tos+getValue())入队操作 PrintTri() enquene (1)将元素1插入队尾 4、输入输出格式: 输入: 输入杨辉三角的规模(小于20的整数)//提示 等待输入 输出: 生成的杨辉三角如下//提示 …………..(杨辉三角) 四、调试分析 本程序在调试过程中主要出现了以下问题: 在动态分配内存的时候,正常情况的书写应为int*p=newint[n],为方括号但在程序中写成了圆括号int*p=newint(n),从而导致在程序运行完以后不能正常终止,在此问题上花费了好长时间才找到问题所在;还有在计算杨辉三角的值的时候也出现了问题,程序不能正确的计算出结果,其原因是一开始分配的内存不够,由于建立的是环形队列。 此外还有一些小的逻辑上的错误。 五、五测试结果 样例1: 输入杨辉三角的规模(小于20的整数)6 输出: 生成的杨辉三角如下 1n=0 11n=1 121n=2 1331n=3 14641n=4 15101051n=5 1615201561n=6 样例2: 输入杨辉三角的规模(小于20的整数)9 输出: 生成的杨辉三角如下 1n=0 11n=1 121n=2 1331n=3 14641n=4 15101051n=5 1615201561n=6 172135352171n=7 18285670562881n=8 193684126126843691n=9 六、使用说明 1、本程序的执行环境为visualc++ 2、运行程序时提示输入杨辉三角的规模及杨辉三角的行数,请输入小于20的整数,输入完毕按enter键,就会在桌面上输出所生成的杨辉三角 七、实验心得 在本次试验中被一些很小的错误所困扰,大大影响了实验的效率 而且这些小问题又极不易被发现,以后再学习的过程当中一定要仔细小心,不能犯细节上的错误了。 八、附件 TRI3.txt实现本功能的主程序 #include classQuene{ public: Quene(ints){ size=s+2; rear=0;//初始化队尾指针 front=0;//初始化对首指针 p=newint[size]; p[front]=1;//队首元素初始化为1 } ~Quene(){ delete[]p; } intdequene();//出队操作 voidenquene(intm);//元素m进队 intgetValue(){returnp[front];}//取出队首元素的值,队首元素不出队 voidPrintTri();//计算并输出杨辉三角 private: intsize; intfront; intrear; int*p; }; voidQuene: : enquene(intm){ rear=(rear+1)%size; p[rear]=m; } intQuene: : dequene(){ inttos=p[front]; front=(front+1)%size; cout< returntos; } voidQuene: : PrintTri(){ cout<<"生成的杨辉三角如下"< inti,j,tos; for(i=0;i enquene (1); for(j=0;j<=i;j++){ tos=dequene(); if(j>=0&&j enquene(tos+getValue()); } enquene (1); cout<<"n="< } } voidmain(){ intn; cout<<"输入杨辉三角的规模(小于20的整数)"; cin>>n; Queneq(n); q.PrintTri(); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 三角