Вывод, который выглядит как треугольник в C

#c #loops #for-loop

#c #циклы #для цикла

Вопрос:

Я написал эту программу,

 include <stdio.h>

int main(){
int size = 5;

int row;
int col;

  for (col=0; col<size; col  ){
    for (row=0; row<col;row  ){
      printf(" ");
    }

    for (row=0; row <(size-col) ; row  ){
      printf("*");
    if(col<=size){
      printf("*");
      }
    }
    printf("n");
  }
  return 0;
}
  

Это должно сделать треугольник как

 *********
 *******
  *****
   ***
    *
  

Но вместо этого в каждой строке есть один дополнительный *. В чем проблема?

Большое спасибо!

Комментарии:

1. Вы используете переменные col and row в обратном порядке. Я просто указываю на это, поскольку вы, похоже, учитесь C .

2. черт возьми, правда? Я полностью согласен, что кажется глупым называть их чем-то, что относится конкретно к строке или столбцу, когда на самом деле это просто переменные, которые помогают вам изменять количество пробелов и звездочек. если вы можете уточнить, я был бы очень благодарен. черт, я действительно потрясен, хотя я отправил его, и мне интересно, получу ли я за это очки стиля. Спасибо

3. @colle: я бы больше боялся разозлить Древних Богов Непоследовательным отступом от их Сна.

4. Привет, missingno, мне так и не удалось поймать тебя на синем. Однажды… Со всей серьезностью, я надеюсь, что вы не имеете в виду эту программу! Отступы кажутся мне правильными, по крайней мере, если это неправильно, я оставался неверно согласованным на протяжении всей программы. Если есть проблема, скажите мне, как я мог бы улучшить. Спасибо

5. @colle: Да, отступ вашей программы … извините… ужасно. В любом случае, что я имел в виду под col и row , так это то, что вы перебираете строки во внешнем цикле, но вы вызываете переменную итератора col . Затем во внутреннем цикле, где вы перебираете столбцы одной конкретной строки, вы вызываете переменную итератора row .

Ответ №1:

У Mystical есть решение для способа печати двух звездочек за итерацию. Использование идентификаторов row и col в вашем примере также делает вещи более запутанными, чем просто i и j , тем более, что внешний цикл на самом деле является вашей текущей строкой.

Альтернативой вашему беспорядку является (я надеюсь, что это не домашнее задание, поскольку оно не помечено как таковое):

 int main(void)
{
   int size = 5;
   int i, j;

   for (i = size; i > 0; i--) {

      for (j = i; j < size; j  )
         putchar(' ');

      for (j = 0; j < i*2 - 1; j  )
         putchar('*');

      putchar('n');
   }

   return 0;
}
  

Вы также можете ввести i*2 - 1 переменную, чтобы она не вычислялась на каждой итерации цикла (если только компилятор не видит, что вы не изменяете i ).

Комментарии:

1. 1 за реструктуризацию программы в гораздо более понятный формат!

Ответ №2:

Изменение

 if(col<=size){
  

Для

 if((row % size) > 0){
  

также будет иметь тот же эффект.

Ответ №3:

Как насчет печати * вот так

 for (row=0; row<(9-2*col); row  )
  printf("*");
printf("n");
  

Это выведет девять из первой строки, семь во второй и т.д.

Ответ №4:

Разложите вашу проблему на соответствующие переменные и дайте им значимые имена. Это улучшит читаемость кода и упростит исправление ошибок, например:

 #include <stdio.h>

void triangle(int height)
{
    int row, col;
    int width = (2 * height) - 1;

    for (row = 0 ; row < height ; row  )
    {
        for (col = 0 ; col < width ; col  )
        {
            if (row > col)
            {
                putchar(' ');
            }
            else if (col < width - row)
            {
                putchar('*');
            }
        }
        puts("r");
    }
}

int main(void)
{
    triangle(5);
    return 0;
}
  

Ответ №5:

Никто не упоминал о рекурсии? Это не совсем чисто, потому что вам нужно отслеживать глубину. Я назвал это пирамидой (pyr_) вместо треугольника:

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

static void pyr_line(int depth, int nrows) {
    int i;

    if (nrows == 0) return;

    for (i=0; i<depth; i  )
            printf(" ");

    for(i=0; i<(2*(nrows-1) 1); i  )
            printf("*");

    printf("n");
    pyr_line(depth 1, nrows-1);
}

int main(int argc, char ** argv)
{
    pyr_line(0, atoi(argv[1]));
    return 0;
}