数字金字塔
三、详细设计(1)
主要功能模块1源程序
#include <stdio.h>
#include <stdlib.h>
struct MyNode
{
int num ; //表示数据值
int lay ; //表示该数据在金字塔中的层数
int sort ; //表示该数据在金字塔中的序号
struct MyNode *pNext ; //指向下一个结点
(3)每个数应尽可能放在更下方,即如果可以放在第i层,就不能放在i-1层;
(4)相同层上的数从左向右从小到大排列。每个数按照它在塔中的位置从上到下从左到右从1开始编号,例如数5的序号为4。
设计要求
1.定义一个链表存放数据值及后续结点信息。
2.编写一个函数建立链表。
3.编写一个函数,由用户输入正整数n和3个不大于n的正整数,程序按要求构造的金字塔,并输出3个正整数在数字金字塔中的序号。图8.1中,用户输入6,3,4,5表示有6个数据组成金字塔,要求输出3,4和5在金字塔中的序号。
1.谭浩强著C程序设计(第三版)
2.刘光蓉著.C程序设计实验与教程
3.游浩跃主编C语言程序设计与教程
4.(美)Peter Van Der Linden著.徐波译。《C编程经典之作》
}
ptemp = pHead ; //输出排名
int d,e,f;
while (ptemp != NULL)
{
if (ptemp->num==a ) //将序号赋给其他变量
d=ptemp->sort ;
if (ptemp->num==b )
e=ptemp->sort;
if (ptemp->num==c )
int i;
for ( i=0; i<n; i++) //初始化
{
pNode[i].num = i +1 ;
pNode[i].lay = 0 ;
pNode[i].sort = 0 ;
pNode[i].pNext = NULL ;
}
for ( i=0; i<n; i++) //确定每个数在哪一层
{
int j = i ;
3.编写一个函数,由用户输入正整数n和3个不大于n的正整数,程序按要求构造的金字塔,并输出3个正整数在数字金字塔中的序号。图8.1中,用户输入6,3,4,5表示有6个数据组成金字塔,要求输出3,4和5在金字塔中的序号。
图8.1程序运行结果
4.编写一个函数实现数字金字塔的分层输出。
二、总体设计(2)
系统总体设计框架
printf("%5d", ptemp->num) ;
ptemp = ptemp->pNext ;
}
printf("\n") ;
}
struct MyNode *pHead = play[0] ; //将层与层相接
for ( i=0; i<lay; i++)
{
while (play[i]->pNext != NULL)
四、调试分析过程(2)
测试数据
输入25,12,15,24
测试结果
五、总结
设计用到的知识点
1.数组的使用
2.结构体的基本知识及其运用
3.链表的应用
4.数据的输入和输出
收获与体会
经过这几天的学习和思索,对以前学习的知识有了一个较为全面的认识。比如,数组的巧妙运用可以使程序更为简洁易懂,还有,运用函数模块可以使问题的复杂性更为简单明确。另外,这次学习让我对指针变量的运用有了较深的认识
4.编写一个函数实现数字金字塔的分层输出。
设计目的
1.数组的使用;
2.结构体的基本知识;
3.链表的应用;
4.数据的输入和输出。
开发环境
操作系统:Windows7
软件环境:Microsoft Visual C++ 6.0
二、总体设计(1)
系统功能需求分析
1.定义一个链表存放数据值及后续结点信息。
2.编写一个函数建立链表。
{
pTemp->pNext = &pNode[i] ;
pTemp = pTemp->pNext ;
}
}
}
struct MyNode *ptemp = NULL ;//输出信息
for ( i=0; i<=lay; i++)
{
ptemp = play[i] ;
while (ptemp != NULL)
{
int k = 0 ;
for (int i=0; i<n; i++)
{
if (k == 0)
{
if (pNode[i].lay == j)
{
play[j] = &pNode[i] ; //第j层的头结点
pTemp = play[j] ;
k = 1 ;
}
}
else
if (pNode[i].lay == j)
f=ptemp->sort;
ptemp = ptemp->pNext ;
}
printf("输出排名:%d,%d,%d\n",d,e,f);
return 0;
}
三、详细设计(2)
主要功能模块2的算法设计
1.确定每个数在哪一层
2.确定有多少层
3.寻找最大层数
4.把所有的元素做成链表
5.输出信息
6.将层与层相接
while (j)
{
if (pNode[i].num % j == 0)
{
pNode[i].lay = pNode[j-1].lay + 1 ;
break ;
}
j-- ;
}
}
int lay = 0 ; //确定有多少层
for ( i=0; i<n; i++)
{
if (pNode[i].lay > lay)
lay = pNode[i].lay ; //寻找最大层数
}
struct MyNode **play = (struct MyNode**)malloc(lay*sizeof(MyNode*)); //把所有的元素做成链表
for (int j=0; j<=lay; j++)
{
struct MyNode *pTemp = NULL ;
不足与努力方向
设计程序前没有严谨的逻辑思路和明确的函数模块运用意识。程序设计中,常常出现简单的符号错误,以及函数的逻辑设计不够严谨,常常有漏洞。调试时,一旦有较多的错误提示,就很难静下来问题的解决方法。
因此,对于以上的不足之处,以后,以后还得继续理解基本的编程原理,学习一些简便易懂的设计思路和方法
六、参考文献
{
play[i] = play[i]->pNext ;
}
play[i]->pNext = play[i+1] ;
}
int num = 1 ; //给元素排名
ptemp = pHead ;
while (ptemp != NULL)
{
ptemp->sort = num++ ;
ptemp = ptemp->pNext ;
};
int main()
{
printf("输入信息\n") ;
int n ,a,b,c;
scanf("%d,%d,%d,%d",&n,&a,&b,&c); //输入初始值
struct MyNode *pNode = (struct MyNode *)malloc(n*sizeof(MyNode)); //分配内存空间
7.将所有元素进行排名
8.输出所得排名
四、调试分析过程(1)
调试过程出现的问题
调试的过程中,出现的问题比较多。
1.编译的时候漏写了分号,或者将分号写错成逗号。
2.有些变量没有先定义
3.程序子函数,出现的逻辑性错误较多
4.主函数调用时出现错误
问题的解决方法
根据错误提示一一进行探讨和查阅相关资料,然后进行更正,在不断的查询资料和更改后,整个程序出现的错误越来越少,最终运行成功
《C程序设计》
课程设计报告
(2014 — 20 15学年第学期)
题目:数字金Biblioteka 塔一、课程设计概述课程设计问题描述
编写程序,输入一个正整数n,构造一个正整数的数字金字塔。例如对n=6,数字金字塔如下:
1
2 3 5
4 6
数字金字塔构造规则如下:(1)1在最上方第0层;
(2)如果x大于y并且x除以y的余数为0(即x>y && x%y = = 0),x要放在y下方一层(即若y在第i层,x应在i+1层);