杨辉三角实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
杨辉三角
(一)需求分析
1.逐行打印二项展开式(a + b)i 的系数
2.要求:输入杨辉三角的阶数n,在屏幕上显示数杨辉三角形。
3.输入的值n以小于12为宜(图形漂亮)。
(二)概要设计
1. 首先初始化一个队列,元素为1,然后根据这个队列迭代生成任意行的二项式系数。
2. 判断用户输入的行数,然后决定循环次数。这些循环中,程序根据杨辉三角的实际
构造函数模拟构造过程。每次形成一个新的二项式系数序列,并将这个序列保持在一个新的队列中。本次循环结束后,这个心构造的序列将作为下次循环来构造另一个二项式序列的参照序列。
(三)详细设计
1.定义队列结点
typedef struct QNode{
int data;
struct QNode *next;
}QNode ,*QueuePtr;
typedef struct {
QueuePtr front;
QueuePtr rear;
}LinkQueue;
2.基本操作函数原型
●队列初始化
void InitQueue(LinkQueue *Q)
{
Q->front =Q->rear = (QueuePtr)malloc(sizeof(QNode));
if(!Q->front) printf("OVERFLOW");
Q->front->next= NULL;
}
●插入元素e为新的队尾元素
void EnQueue(LinkQueue *Q,int e)
{
QNode *p;
p = (QueuePtr)malloc(sizeof(QNode));
if(!p) printf("OVERFLOW");
p->data = e;
p->next = NULL;
Q->rear->next = p;
Q->rear = p;
}
●void DeQueue(LinkQueue *Q)
{ QNode *p;
if(Q->front == Q->rear) printf("ERROR");
Q->front->next = Q->front->next->next;
}
●美化形状
for(i = 1;i <= n; i++)
{
printf("\n");
c=i;
for(b=1;b<=n-c;c++)
{
printf(" ");
}
}
●根据上行系数求下行系数
for (j=1;j<=i+2;j++)
{
t = q->front->next->data;
DeQueue (q);
EnQueue (q,s+t);
s = t;
if (j!=i+2) printf("%3d ",s);
}
(四)调试分析
1.美化形状时,第一次的输出空格的个数和位置考虑的有瑕疵,导致图像歪歪曲曲的。
2.当输入数字较大时(比如19),阶数太大导致“杨辉三角”的图像没有出来。
(五)用户手册
1.本程序的运行环境是win7操作系统,执行文件为:task.exe。
2.进入时界面如下:
(六)测试结果
1.
2.
(七)实验总结
1. 本次实验历时4个小时(课外时间另算),主要练习线性表中的队列的应用,涉
及队列的删除,插入,搜索操作,基本涵盖了队列的应用范围。
2.“%3d”对图形的美化起到了关键作用。(想同学请教学得)
3.实验中还是有些内容需要翻书才能解决,这反映了对书本内容的生疏。需要加强。
(八)附录
程序源代码:
#include
#include
#include
#include
typedef struct QNode{
int data;
struct QNode *next;
}QNode ,*QueuePtr;
typedef struct {
QueuePtr front;
QueuePtr rear;
}LinkQueue; //基本操作函数原型
void InitQueue(LinkQueue *Q)
{ //队列初始化
Q->front =Q->rear = (QueuePtr)malloc(sizeof(QNode));
if(!Q->front) printf("OVERFLOW");
Q->front->next= NULL;
} void EnQueue(LinkQueue *Q,int e)
{
QNode *p;
p = (QueuePtr)malloc(sizeof(QNode));
if(!p) printf("OVERFLOW");
p->data = e;
p->next = NULL;
Q->rear->next = p;
Q->rear = p; }
void DeQueue(LinkQueue *Q){
QNode *p;
if(Q->front == Q->rear) printf("ERROR");
Q->front->next = Q->front->next->next;
} void YangHui( int n ) // n为需要输出的杨辉三角形的行数
{ int i,j,t,c,b,s = 0;
LinkQueue *q;
q = (LinkQueue *)malloc(sizeof(LinkQueue));
InitQueue(q);
EnQueue(q,1);
EnQueue(q,1);
for(i = 1;i <= n; i++) // 逐行计算
{
printf("\n");
c=i;
for(b=1;b<=n-c;c++)
{
printf(" ");
}
EnQueue(q,0);
for (j=1;j<=i+2;j++)