2015-11-19 32 views
0

我正在做一个c练习,使用函数做'#'钻石形状。 我的代码:不能在C中获得钻石形状

#include <stdio.h> 
//Declare function 
void losangle(int n); 
//main 
int main(void){ 
    int n; 
    do { 
    printf("Altura do triangulo: "); 
    scanf("%d", &n); 
    } while(n % 2 == 0); 
    losangle(n);} 
//function 
void losangle(int n){ 
    int i, hashtag, spaces, j, spaces1, hashtag1; 
//triangle 
    for(i = 0; i < n; i++){ 
    for(spaces = 0; spaces < (n-i); spaces++){ 
     printf(" ");} 
    for(hashtag = 0; hashtag < (i+1);hashtag++){ 
     printf("# ");} 
    printf("\n");} 
//inverted triangle 
    for(j = 0; j < (n - 1); j++){ 
    for(spaces1 = 0; spaces1 < (j+2); spaces1++){ 
     printf(" ");} 
//not working !!! 
    for(hashtag1 = (n-1); hashtag1 > 0; hashtag1--){ 
     printf("# ");} 
    printf("\n"); 
    }} 

输出是这样的:

Losangle: 5 
    # 
    # # 
    # # # 
    # # # # 
# # # # # 
    # # # # 
    # # # # 
    # # # # 
    # # # # 

是什么使得 '#' 在底部不递减?这行是错误的(对于(hashtag1 =(n-1); hashtag1> 0; hashtag1--))??顺便说一句,我也接受提示,以提高代码效率。

+0

使用调试器到步骤通过线这个代码行。 – shuttle87

+2

是的,它应该是'hastag1 = n-j-1',因为你想减少你输出的#的数量 –

+0

如果这是一个练习,考虑模块化这一点。将工作分成一个函数,该函数绘制给定长度的单行,并重复调用该行。 当您想要打印没有格式化的单个字符串时,习惯使用'puts(s)'或'printf(“%s”,s)''。这里你正在处理字符串常量,所以没问题,但是使用'printf'没有format参数是一个安全问题。 我认为你的意思是_losange_,但它可能是一个三角形或洛杉矶的双关语,不确定。 –

回答

6

问题:

的倒三角形for循环每次迭代从n-10,无论j的价值的。

解决方案:

之间n-1j迭代将导致散列符号的数目以减小每次迭代。

改变这一行:

for(hashtag1 = (n-1); hashtag1 > 0; hashtag1--){ 

for(hashtag1 = (n-1); hashtag1 > j; hashtag1--){ 
+0

谢谢!现在它已经在工作了,我现在试着改进一下代码。 – m3k3r1

+0

@ m3k3r1乐意帮忙!如果此答案或任何其他人解决了您的问题,请将其标记为已接受。 – AlexPogue

0

里程碑1

什么是程序的高层逻辑?

void getInutAndDrawDiamond() 

int getTriangleHeight(); 
void drawDiamond(int height); 

int main() 
{ 
    getInutAndDrawDiamond(); 
    return 0; 
} 

void getInutAndDrawDiamond() 
{ 
    int height = getTriangleHeight(); 
    drawDiamond(height); 
} 

getTriangleHeightdrawDiamond虚设实现。

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

添加的drawUpperHalfOfDiamonddrawLowerHalfOfDiamond一个新的水平执行,使用几个辅助功能的虚拟实现。

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

添加的drawUpperHalfRowOfDiamonddrawLowerHalfRowOfDiamond一个新的水平实现,采用的一些辅助功能的虚拟实现。

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

+0

该死的我真的很了解这样的代码*。*谢谢。 – m3k3r1

+0

@ m3k3r1,它有助于退后一步并花时间理解抽象 - 您正在处理的功能和数据。 –

+0

@R Sahu我仍然在C语言基础知识,但我会尝试你的方法来进行其他练习。除了清晰性,抽象性和更多理解代码之外,具备所有这些功能还有什么好处?它改进了引擎盖下的东西? – m3k3r1

0

已经发布了一些疯狂复杂的答案。
这里是一个循环,一个printf和一个变量(宽度输入除外)。

#include <stdio.h> 
#include <stdlib.h> 

int main(void) { 
    int w = 9; 
    int l; 

    for(l=0; l < w; ++l) 
    { 
     printf("%*.*s\n", 
      abs(w/2 - l)+abs((2*l+1)-(2*l+1>w)*2*w), 
      abs((2*l+1)-(2*l+1>w)*2*w), 
      "# # # # # # # # # # # # # # # # # # "); 
    } 

    return 0; 
} 

Link to IDEOne Code