HUNANUNIVERSITY程序设计训练报告学生姓名学生学号专业班级指导老师助教年月日目录第2页题1:杨辉三角(ID:)..........................................................................3一、问题描述...............................................................................3二、问题分析...............................................................................3三、算法分析...............................................................................4四、详细设计(从算法到程序)................................................4五、调试与测试............................................................................6六、分析与总结............................................................................6第3页题1:杨辉三角(ID:)一、问题描述输入层数n(n=13),打印n层杨辉三角。二、问题分析杨辉三角是一个等腰三角形的形状,为了保证打印形状,需要逐行打印前导空格和数字。前导空格和数字的个数按照行号进行变化,数字之间需要用一定的空格分隔,特别是当行数较多时,数字格式需要进行对齐,才能保证形状美观。杨辉三角中的每个数字可以是上一行相邻两个数之和,或者每一行数字也是一个二项式系数之和。111121133114641……第4页三、算法分析1.假定行号为row(1≤row≤n),则每行需要打印的前导空格数为n-row。2.每行的数字的个数与行号数相等。如行号为row,则数字为二项式(a+b)m的系数,其中m=row-1,其系数为C(m,j),j=0,..,m,C(m,j)=m!/(j!(m-j)!)。四、详细设计(从算法到程序)1.主模块设计a)本程序可以用循环结构实现,以行号为循环变量,逐行打印;b)每行打印前导空格和数字,由于每行前导空格的数量可以使用通项公式表示,因此可以编写一个独立打印空格的函数,其具体规格为voidprnBlank(intm),而每行的数字同样具有规律性,同理可以使用一个函数来打印每行数字,其具体规格为voidprnDigit(intm);c)每行打印完成之后应打印换行符’\n’。d)根据上述设计,程序主体框架如下:#includestdio.hintmain(){…第5页for(row=1;row=n;row++){prnBlank(n-row);prnBlank(row-1);printf(“\n”);}return0;}2.空格打印函数voidprnBlank(intm)根据调用时参数m,循环打印m个空格,由于只是打印,无须返回任何值。3.数字打印函数voidprnDigit(intm)该函数打印(a+b)m的系数,需要用到三个阶乘,编写阶乘函数longfac(intm),考虑到阶乘值尽可能地大,其返回值应该是long类型。在逐个打印c(m,j),j=0,…,m时,为了对齐,使用printf(“%ld”,…)的格式,即每个数之后最好空一格。第6页五、调试与测试1.在调试过程中,需要验证前导空格的个数是否正确,需要验证各个数字的计算是否正确2.输入的层数,设计以下测试数据,并观察打印的结果。a)较小的数,如5b)较大的数,如13c)更大的数,如14、20六、分析与总结1.从测试结果看,当输入较小的层数为5时,能得到漂亮的杨辉三角,且一切正常2.而当输入层数为10时,杨辉的数据是正确的,但格式不整齐,这是由于输出的数据位数不一致所导致3.而当输入层数为14或20时,数据不正确,格式也不能对齐,导致数据不正确的原因是当求阶乘时,当参数较大时,其结果超出了长整型数据所能表示的范围导致溢出。