Печатный треугольник в C

Я новичок в C, и у меня есть эта программа, где я пытаюсь напечатать треугольник на основе его высоты как таковой:

 /\
/__\

Таким образом, если высота равна 2, то есть 2 из '/', '\' и '_'.

Итак, я написал эти куски кодов:

#include <stdio.h>
int main(void)
{
    int noOfRows; 
    printf("Enter height: ");
    scanf("%d", &noOfRows);

    int counter, rowNumber;
    for (rowNumber = 0 ; rowNumber < noOfRows; rowNumber++)
    {
        // For each row, insert numberOfRows - N spaces before printing
        for (counter = 0 ; counter < noOfRows- rowNumber ; counter++)
            printf(" ");

        // For each row, print N times the character
            printf("/");

        for (counter = 0; counter < noOfRows; counter++)
            printf("\\");

        printf(" ");

        printf("\n");
    }

    return 0;
}

Тем не менее, это дает мне вывод, когда я ввожу 3 в качестве высоты.

  /\\\
 /\\\
/\\\

Я хочу получить символ '\' с большим количеством пробелов по мере появления каждой новой строки, но я не уверен, как следует изменить цикл for таким образом, чтобы треугольник был сформирован правильно. Пожалуйста, дайте мне знать, если я должен добавить еще вопрос, чтобы прояснить его.

Я внес изменения в код и в настоящее время имею это:

#include <stdio.h>
int main(void)
{
    int noOfRows; 
    printf("Enter height: ");
    scanf("%d", &noOfRows);

    int counter, rowNumber;
    for (rowNumber = 0 ; rowNumber < noOfRows; rowNumber++)
    {
        // For each row, insert numberOfRows - N spaces before printing
        for (counter = 0 ; counter < noOfRows- rowNumber ; counter++)
            printf(" ");

        // For each row, print N times the character
            printf("/");

        for (counter = 0 ; counter < rowNumber ; counter++)
            if(rowNumber >= 1)  
                for(int j=0; j<counter +1; j++)
                    printf(" ");

        if(rowNumber != 0)
            printf(" ");

            printf("\\");

        printf("\n");
    }

    return 0;
}

и теперь мой текущий вывод таков:

Height: 3
  /\
 /  \
/    \

Height: 5

    /\
   /  \
  /    \
 /       \
/           \

Что я сделал не так в коде, который заставляет некоторые '\' идти еще дальше?

4 ответа

Решение

Вы можете использовать только два цикла для печати этого шаблона, используя if else. если вы можете использовать несколько условий для пробела, обратной косой черты, прямой косой черты и подчеркивания.

1 #include<stdio.h>
  2 
  3 int main()
  4 {
  5         int n;
  6         int i,j,k;
  7         printf("Enter hight of trangle\n");
  8         scanf("%d",&n);
  9         for(i=0;i<n;i++,printf("\n"))
 10         {
 11                 for(j=-n;j<=n;j++)
 12                 {
 13                         if(j<0) k=-j;
 14                         else    k=j;
 15 
 16                         if(j==0);
 17                         else if((j<0)&&(k==(i+1)))
 18                                 printf("/");
 19                         else if((j>0)&&(k==(i+1)))
 20                                 printf("\\");
 21                         else if((i+1)==n)
 22                                 printf("_");
 23                         else
 24                                 printf(" ");
 25                 }
 26         }
 27 }

Идея @ Бармара верна и больше не нужна if(rowNumber != 0) printf(" ");

Fullcode:

#include <stdio.h>
int main(void)
{
    int noOfRows; 
    printf("Enter height: ");
    scanf("%d", &noOfRows);
    int counter, rowNumber;
    for (rowNumber = 0 ; rowNumber < noOfRows; rowNumber++)    {

        for (counter = 0 ; counter < noOfRows- rowNumber ; counter++)
            printf(" ");        
            printf("/");
        for (counter = 0 ; counter < rowNumber ; counter++)
            if(rowNumber >= 1)  
                for (counter = 0; counter < rowNumber*2; counter++) {
        if (rowNumber == noOfRows-1) {
        printf("_");
        } else {
        printf(" ");
        }
        }
        printf("\\");
        printf("\n");
    }

}

Вам не нужны две вложенные циклы для печати пробелов между / а также \\, Следует просто напечатать rowNumber*2 пространства.

for (counter = 0; counter < rowNumber*2; counter++) {
    printf(" ");
}

Вам не нужно тестировать if (rowNumber >= 1)потому что когда это 0 цикл заканчивается немедленно.

Тем не менее, вам нужно проверить последнюю строку, потому что вы должны напечатать _ вместо места. Так и должно быть:

for (counter = 0; counter < rowNumber*2; counter++) {
    if (rowNumber == noOfRows-1) {
        printf("_");
    } else {
        printf(" ");
    }
}

Кроме того, вы можете абстрагировать повторяющуюся печать символов в виде:

// print_char(n,c) prints c n-times.
void print_char(int n, char c) {
  for (int i = 0; i < n; ++i) {
    printf("%c", c);
  }
}

так что вам нужно отслеживать только один цикл for при построении треугольника как:

void print_triangle(int height) {
  for (int i = 1; i <= height; ++i) {
    print_char(height-i, ' ');               // print leading empty spaces
    printf("/");                             // print forward slash
    if (i == height) {                       // print middle dashes/spaces
      print_char((height-1)*2, '_');         //             <--|      |
    } else {                                 //                       |
      print_char((i-1)*2, ' ');              //             <---------|
    }
    printf("\\\n");                          // print backslash
  }
}

Например,

int main(void) {
  int height;
  printf("Enter height: ");
  if (scanf("%d", &height) != 1) {
    // handle error if scanf fails
  }
  print_triangle(height);
  return 0;
}

а потом,

$ Enter height: 1
/\
$ Enter height: 5
    /\
   /  \
  /    \
 /      \
/________\
Другие вопросы по тегам