c中绘制三角形

时间:2015-10-14 15:23:02

标签: c loops

我正在进行练习,从C程序中绘制一个三角形。用户在命令行中输入三角形的高度,三角形用“*”s打印。

例如,输入3将输出:

  *
 ***
*****

这是我到目前为止所做的:

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

int main(int argc, const char *argv[]) {

    //initialize height variable and bottom variable
    int height, limit;
    //take command line argument and save it as an int. This ensures
    height = atoi(argv[1]);

    printf("You have chosen to draw a triangle of height: %d\n", height);

    if (height<1) {
        printf("ERROR: Height too small.\n");
        exit(1);
    }
    else if (height>100) {
        printf("ERROR: Height too large.\n");
        exit(1);
    }
    for (int i = 1; i <= height; i++)
    {
            limit=0;

        // this 'for' loop will take care of printing the blank spaces
        for (int j = 1; j <= height; j++)
        {
            printf(" ");
        }
        //This while loop actually prints the "*"s of the triangle.
        while(limit!=2*i-1) {
            printf("*");
            limit++;
        }
        limit=0;
        //We print a new line and start the loop again
        printf("\n");
    }

return 0;
}

我有两个问题:

  1. 程序生成的三角形具有正确的*的数量,并且偏移正确的空格数,但只生成一个半角三角形。
  2. 这是我程序的当前输出:

      *
      ***
      *****
    
    1. 我不知道如果用户输入的内容不是整数,如何形成if语句。使用atoi()将输入转换为整数,但如果用户输入,例如“是”,则将抛出高度太小的错误。我该如何解决这个问题?

3 个答案:

答案 0 :(得分:2)

打印前导空格的循环始终每次打印相同数量的空格。您需要在每个后续行上打印1个更少的空间。您可以通过使用j=i而不是j=1启动循环来完成此操作。

不使用atoi(),而是使用strtol(),如下所示:

char *p;
errno = 0 ;
height = strtol(argv[1], &p, 10);
if (errno != 0 || p == argv[1]) {
    printf("invalid input");
    exit(1);
}

如果解析时出错,errno将设置为非零值。返回时的p参数将指向不是数字的第一个字符。因此,如果它指向字符串的开头,则它不是数字。

另外,请务必检查argv[1]是否确实存在:

if (argc < 2) {
    printf("not enough arguments\n");
    exit(1);
}

答案 1 :(得分:0)

我发现,虽然没有必要,但最好还是给你的初始值。当程序变大时,可能会导致非常烦人的错误。同时在开头定义你的i和j。

int height = 0;
int limit = 0;
int i = 0;
int j = 0;

每次j应该是不同的值。例如:

for(j = i; j <= height; j++)
{
  printf(" ");
}

至于字母或数字部分,您可能需要查看isdigit函数:http://www.tutorialspoint.com/c_standard_library/c_function_isdigit.htm

答案 2 :(得分:0)

可能有20种方法可以做到这一点。关键是要意识到当你将间距减少1时你必须将'*'的数量增加2:

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

#define SLIMIT 120

int main (int argc, char **argv) {

    size_t height = argc > 1 ? atoi (argv[1]) * 2: 12;
    size_t space;
    size_t i;

    if (height < 1) {
        fprintf (stderr, "error: invalid height '%zu'\n", height);
        return 1;
    }

    space = (height + 1)/2;

    for (i = 1; i < height+1; i+=2,space--) {
        char tstring[SLIMIT+1] = {0};
        memset (tstring, '*', i);
        printf ("%*s%s\n", space, " ", tstring);
    }

    return 0;
}

示例输出

$ ./bin/triangle 12
            *
           ***
          *****
         *******
        *********
       ***********
      *************
     ***************
    *****************
   *******************
  *********************
 ***********************

注意:目前仅限于宽度60(1/2 SLIMIT)。