Вывод, который выглядит как треугольник в C - PullRequest
0 голосов
/ 02 ноября 2011

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

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;
}

Треугольник должен быть похож на

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

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

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

Ответы [ 5 ]

2 голосов
/ 02 ноября 2011

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 голос
/ 02 ноября 2011

Изменение

if(col<=size){

на

if((row % size) > 0){

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

0 голосов
/ 08 ноября 2011

Никто не воспитывал рекурсию? Это не совсем чисто, потому что вы должны отслеживать глубину. Я назвал это пирамидой (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;
}
0 голосов
/ 02 ноября 2011

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

#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;
}
0 голосов
/ 02 ноября 2011

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

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

Это напечатает девять из первого ряда, семь во втором и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...