里程碑1
什么是程序的高层逻辑?
void getInutAndDrawDiamond()
int getTriangleHeight();
void drawDiamond(int height);
int main()
{
getInutAndDrawDiamond();
return 0;
}
void getInutAndDrawDiamond()
{
int height = getTriangleHeight();
drawDiamond(height);
}
与getTriangleHeight
和drawDiamond
虚设实现。
int getTriangleHeight()
{
return 0;
}
void drawDiamond(int height)
{
}
里程碑2
添加的getTriangleHeight
一个正确实施。
int getTriangleHeight()
{
int height;
int c;
char const* prompt = "Enter the height of the triangle: ";
printf("%s", prompt);
while (scanf("%d", &height) != 1)
{
// Error reading the input.
// Ignore rest of the line
while ((c = fgetc(stdin)) != '\n' && c != EOF);
// If EOF is reached, exit.
if (c == EOF)
{
exit(EXIT_FAILURE);
}
// Try reading again.
printf("%s", prompt);
}
return height;
}
里程碑3
添加的drawDiamond
下一级实现,采用的情侣有虚拟实现辅助功能。
void drawUpperHalfOfDiamond(int height);
void drawLowerHalfOfDiamond(int height);
void drawDiamond(int height)
{
drawUpperHalfOfDiamond(height);
drawLowerHalfOfDiamond(height);
}
void drawUpperHalfOfDiamond(int height)
{
}
void drawLowerHalfOfDiamond(int height)
{
}
里程碑4
添加的drawUpperHalfOfDiamond
和drawLowerHalfOfDiamond
一个新的水平执行,使用几个辅助功能的虚拟实现。
void drawUpperHalfRowOfDiamond(int row);
void drawLowerHalfRowOfDiamond(int row);
void drawUpperHalfOfDiamond(int height)
{
for (int row = 0; row < height; ++row)
{
drawUpperHalfRowOfDiamond(row);
}
}
void drawLowerHalfOfDiamond(int height)
{
for (int row = 0; row < height; ++row)
{
drawLowerHalfRowOfDiamond(row);
}
}
void drawUpperHalfRowOfDiamond(int row)
{
}
void drawLowerHalfRowOfDiamond(int row);
{
}
里程碑5
添加的drawUpperHalfRowOfDiamond
和drawLowerHalfRowOfDiamond
一个新的水平实现,采用的一些辅助功能的虚拟实现。
int getNumberOfColumsForUpperHalfRow(int row);
void drawUpperHalfCell(int row, int col);
int getNumberOfColumsForLowerHalfRow(int row);
void drawLowerHalfCell(int row, int col);
void drawUpperHalfRowOfDiamond(int row)
{
int cols = getNumberOfColumsForUpperHalfRow(row);
for (int col = 0; col < cols; ++col)
{
drawUpperHalfCell(row, col);
}
}
void drawLowerHalfRowOfDiamond(int row)
{
int cols = getNumberOfColumsForLowerHalfRow(row);
for (int col = 0; col < cols; ++col)
{
drawLowerHalfCell(row, col);
}
}
int getNumberOfColumsForUpperHalfRow(int row)
{
return 0;
}
void drawUpperHalfCell(int row, int col)
{
}
int getNumberOfColumsForLowerHalfRow(int row)
{
return 0;
}
void drawLowerHalfCell(int row, int col)
{
}
里程碑5
添加的最后四个功能正确实现 - 作为练习留给读者。
完整的程序
#include <stdio.h>
#include <stdlib.h>
void getInutAndDrawDiamond();
int getTriangleHeight();
void drawDiamond(int height);
void drawUpperHalfOfDiamond(int height);
void drawLowerHalfOfDiamond(int height);
void drawUpperHalfRowOfDiamond(int row);
void drawLowerHalfRowOfDiamond(int row);
int getNumberOfColumsForUpperHalfRow(int row);
void drawUpperHalfCell(int row, int col);
int getNumberOfColumsForLowerHalfRow(int row);
void drawLowerHalfCell(int row, int col);
int main()
{
getInutAndDrawDiamond();
return 0;
}
void getInutAndDrawDiamond()
{
int height = getTriangleHeight();
drawDiamond(height);
}
int getTriangleHeight()
{
int height;
int c;
char const* prompt = "Enter the height of the triangle: ";
printf("%s", prompt);
while (scanf("%d", &height) != 1)
{
// Error reading the input.
// Ignore rest of the line
while ((c = fgetc(stdin)) != '\n' && c != EOF);
// If EOF is reached, exit.
if (c == EOF)
{
exit(EXIT_FAILURE);
}
// Try reading again.
printf("%s", prompt);
}
return height;
}
void drawDiamond(int height)
{
drawUpperHalfOfDiamond(height);
drawLowerHalfOfDiamond(height);
}
void drawUpperHalfOfDiamond(int height)
{
for (int row = 0; row < height; ++row)
{
drawUpperHalfRowOfDiamond(row);
}
}
void drawLowerHalfOfDiamond(int height)
{
for (int row = 0; row < height; ++row)
{
drawLowerHalfRowOfDiamond(row);
}
}
void drawUpperHalfRowOfDiamond(int row)
{
int cols = getNumberOfColumsForUpperHalfRow(row);
for (int col = 0; col < cols; ++col)
{
drawUpperHalfCell(row, col);
}
}
void drawLowerHalfRowOfDiamond(int row)
{
int cols = getNumberOfColumsForLowerHalfRow(row);
for (int col = 0; col < cols; ++col)
{
drawLowerHalfCell(row, col);
}
}
int getNumberOfColumsForUpperHalfRow(int row)
{
// TODO a proper implementation
return 0;
}
void drawUpperHalfCell(int row, int col)
{
// TODO a proper implementation
}
int getNumberOfColumsForLowerHalfRow(int row)
{
// TODO a proper implementation
return 0;
}
void drawLowerHalfCell(int row, int col)
{
// TODO a proper implementation
}
结语
正确实施的最后四个功能之后,该程序是很好的结构,能够通过改变什么会从所谓的容易地诊断问题main
。
使用调试器到步骤通过线这个代码行。 – shuttle87
是的,它应该是'hastag1 = n-j-1',因为你想减少你输出的#的数量 –
如果这是一个练习,考虑模块化这一点。将工作分成一个函数,该函数绘制给定长度的单行,并重复调用该行。 当您想要打印没有格式化的单个字符串时,习惯使用'puts(s)'或'printf(“%s”,s)''。这里你正在处理字符串常量,所以没问题,但是使用'printf'没有format参数是一个安全问题。 我认为你的意思是_losange_,但它可能是一个三角形或洛杉矶的双关语,不确定。 –