自顶向下(top-down)
将复杂的大问题分解为相对简单的小问题,找出每个问题的关键、重点所在,然后用精确的思维定性、定量地去描述问题。其核心本质是”分解”。
对要完成的任务进行分解,先对最高层次中的问题进行定义、设计、编程和测试,而将其中未解决的问题作为一个子任务放到下一层次中去解决。这样逐层、逐个地进行定义、设计、编程和测试,直到所有层次上的问题均由实用程序来解决,就能设计出具有层次结构的程序。 按自顶向下的方法设计时,设计师首先对所设计的系统要有一个全面的理解.然后从顶层开始,连续地逐层向下分解,起到系统的所有模块都小到便于掌握为止
逐步求精
将现实问题经过几次抽象(细化)处理,最后到求解域中只是一些简单的算法描述和算法实现问题。即将系统功能按层次进行分解,每一层不断将功能细化,到最后一层都是功能单一、简单易实现的模块。求解过程可以划分为若干个阶段,在不同阶段采用不同的工具来描述问题。在每个阶段有不同的规则和标准,产生出不同阶段的文档资料。
举个简单的例子:蛇形矩阵
Description
蛇形矩阵是由 1 开始的自然数依次排列成的一个矩阵上三角形。
Input
本题有多组数据,
每组数据由一个正整数 N 组成。(N不大于 100)
Output
对于每一组数据,输出一个 N 行的蛇形矩阵。两组输出之间不要额外的空行。
矩阵三角中同一行的数字用数域控制符“%4d”分开。行尾不要多余的空格。
Sample Input
5
Sample Output
1 3 6 10 15
2 5 9 14
4 8 13
7 12
11
首先把蛇形矩阵问题分解成若干个小问题:
1.使用一个二维数组储存数字,方便表格形式打印
2.使用嵌套循环结构赋值,大循环有n次,小循环起点为第一列,终点为第一行,每次小循环结束后行数+1,列数初始化为0
3.按照行列打印数组
代码如下:
#include<stdio.h>
int main()
{
int n,a[100][100]={0},row=1,col,coun,x,m=1;
//赋值,大循环嵌套小循环,终点在第一行
scanf("%d",&n);
for(coun=1;coun<=n;coun++){
col=1;
for(x=row;x>=1;x--){
a[x][col++]=m++;
}
row++;
}
//打印数组
for(coun=1;coun<=n;coun++){
for(x=1;x<=n-coun+1;x++){
printf("%4d",a[coun][x]);
}
printf("\n");
}
return 0;
}
另附其他版本的蛇形矩阵:
#include<stdio.h>
int main()
{
int i,j,a[100][100],n,k;
printf("请输入列数n= ");
scanf("%d",&n);
k=1;
//输出上三角
for(i=0; i<n; i++)
for(j=0; j<=i; j++)
{
if(i%2==0) a[i-j][j]=k;
else a[j][i-j]=k;
k++;
}
//输出下三角
for(i=n; i<2*n; i++)
for(j=1; j<2*n-i; j++)
{
if(i%2==0) a[n-j][i-n+j]=k; //n+1在这里是定值了
else a[i-n+j][n-j]=k;
k++;
}
for(i=0; i<n; i++)
{
printf("\n");
for(j=0; j<n; j++)
printf("%4d",a[i][j]);
}
printf("\n");
return 0;
}
洗衣机程序设计:
-
进水,洗涤(漂洗)、排水、脱水 Waterinswitch open getwatervolume(V) IF V==20 Waterinswitch close WHILE time<=0.5h motorrun(direction) direction%=2
direction++ //dirction=0 left
左转, //dirction=1right 右转, wateroutswitch open if V==0 wateroutswitch close motorrun(direction) direction%=2 direction++快速洗衣跳过了浸泡过程 改进:加大电机运转速率
Wait(time) Motorrun(time) Warning(time) 注水(vol,time)