当前位置:文档之家› 杨辉三角实验报告

杨辉三角实验报告

杨辉三角(一)需求分析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<stdio.h>#include<malloc.h>#include <stdlib.h>#include <iostream.h>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++){t = q->front->next->data;DeQueue (q);EnQueue (q,s+t);s = t;if (j!=i+2) printf("%3d ",s);}}}void main(){ int n;printf("请输入杨辉三角的行数n=");scanf("%d",&n);YangHui(n);printf("\n");}约瑟夫环(一)需求分析1.设有n个人围坐在一个圆桌周围,现从第s个人开始报数,数到第m的人出列,然后从出列的下一个人重新开始报数,数到第m的人又出列,…,如此反复直到所有的人全部出列为止。

2.程序运行后,首先要求用户指定初始报数上限值,然后读取个人的密码。

(以n=8,s=1,m=4为例,若初始的顺序为1,2,3,4,5,6,7,8。

则问题的解为4,8,5,2,1,3,7,6。

)(二)概要设计1.利用单循环链表存储结构模拟此过程,按照出列顺序打印出各人的编号。

2.设计一个单循环链表保存个人的编号。

(三)详细设计1.链表结点设计typedef int Status;typedef struct Lnode{int data;struct Lnode *next;}Lnode;2.创建链表并编号for(i = k - 1; i >= 1; i--){s = (Lnode*)malloc(sizeof(Lnode));//创建新节点s->data = i;s->next = L->next;L->next = s;}for(i = n; i > k; i--){s = (Lnode*)malloc(sizeof(Lnode));s->data = i;s->next = L->next;L->next = s;}3.用循环模拟报数的过程if (m == 1){printf("%d ", L->data);L = L->next;while (!(L->data == k)){printf("%d ", L->data );L = L->next;}getchar();getchar();return 0;}while(1){if (L->next == L){printf("%d " , L->data);break;}if (i == m -1){i = 0;p = L->next;L->next = p->next;printf("%d ", p->data);free(p);}L = L->next;i++;}4.i是用来控制循环次数的变量,值为总人数n,每完成一次删除操作,即每有一个人出列,I减1.5.循环中设置了中间变量p用来存储要删除的节点的指针,以保证删除操作不会导致链表指针无法找到下一节点。

结束后free掉p。

6.删除节点,即找到出列对象的同时输出这个节点的数据域:编号。

(四)调试分析1.第一次调试时出现了一些语法错误。

最主要的是在头文件中定义节点的struct后没有加分号。

这提醒了我在书写代码时要注意这些细节,struct定义的结尾应当是有分号的。

同样的,定义的函数,类,或者全局变量都应当在后面加上分号。

2.第二次调试的错误比较严重。

由于对流程控制的错误设计,开始以m作为控制循环的变量,而在循环中变量m的值是变化的,这导致循环次数并非预期的人数数,从而循环失去控制,出现了死循环或者输出错误。

(五)用户手册1.本程序的运行环境是win7操作系统,执行文件为:谭鑫.exe。

2.进入时界面如下:3.依次输入游戏总人数m:报数间隔n;和起始人位置s。

(六)测试结果1.2.(七)实验总结1. 本次实验历时4个小时(课外时间另算),主要练习线性表中的链表的应用,涉及链表的删除,插入,搜索操作,基本涵盖了链表的应用范围。

2. 试验中的问题不出在链表的操作上,而主要出现在链表的应用和问题的结合上。

3. 实验中还是有些内容需要翻书才能解决,这反映了对书本内容的生疏。

需要加强。

(八)附录程序源代码:#include"stdio.h"#include"stdlib.h"#define ERROR -1#define OK 1typedef int Status;typedef struct Lnode{int data;struct Lnode *next;}Lnode;void createList(Lnode* L, int k, int n){Lnode* s;//l是头结点,s临时变量,储存新节点int i;L->data = k;L->next = L;for(i = k - 1; i >= 1; i--){s = (Lnode*)malloc(sizeof(Lnode));//创建新节点s->data = i;s->next = L->next;L->next = s;}for(i = n; i > k; i--){s = (Lnode*)malloc(sizeof(Lnode));s->data = i;s->next = L->next;L->next = s;}}int main(){struct Lnode *L, *p;int m,n,k;int i = 1;printf("请输入参与游戏的总人数n:\n");scanf("%d", &n);printf("请输入报数间隔m:\n");scanf("%d", &m);printf("请输入起始人编号's'(s<n)\n");scanf("%d", &k);L = (Lnode*)malloc(sizeof(Lnode));createList(L, k, n);if (m == 1){printf("%d ", L->data);L = L->next;while (!(L->data == k)){printf("%d ", L->data );L = L->next;}getchar();getchar();return 0;}while(1){if (L->next == L){printf("%d " , L->data);break;}if (i == m -1){i = 0;p = L->next;//p:应删除的元素L->next = p->next;printf("%d ", p->data);free(p);}L = L->next;i++;}getchar();getchar();return 0;}数据结构实验报告自动化05谭鑫100541222011/12/27。

相关主题