2014-10-05 3 views
0

Я пытаюсь написать программу, которая сделает узор звезд. Последняя строка действительно меня отключает. Я должен сделать код только с помощью операторов printf("*");printf(" ");printf("\n");. Я хочу выполнить это с помощью циклов for и if.C программа для печати нерегулярного звездного рисунка

Он должен выглядеть следующим образом:

 
      * - 5 spaces before * 
      * * - 4 spaces before * 
     * * * - 3 spaces before * 
    * * * * * * - 0 spaces before * 

Это то, что я пытался до сих пор:

main() 
{ 
    int i, j, k; 
    i=1; 
    j=1; 
    for(i=4;i>=1;i--) 
    { 
     for(j=1;j<=4;j++) 
     { 
      if(j>=i || ((i+j)==5) && !(j==2) && !(j==3)) 
      { 
       printf("*"); 
      } 
      else 
      { 
       printf(" "); 
      } 
     } 
     printf("\n"); 
    } 
} 

и

main() 
{ 
    int i, j, k; 
    for(i=4;i>=1;i--) 
    { 
     for(j=1;j<i;j++) 
     { 
      printf(" "); 
     } 

     for(k=4;k>=i;k--) 
     { 
      if((k>=i) ||((k>=i) && ((i+k)==5))) 
      { 
       printf("*"); 
      } 
     } 
     printf("\n"); 
    } 
} 

Я думаю, что мой первый подход далеко. Но я думаю, что я нахожусь во втором звене. Я пытаюсь напечатать «*» и дополнительно 2 раза на четвертой строке. вторая ссылка компилятор, по-видимому, игнорирует || оператор. Как мне изменить оператор if, чтобы этот шаблон работал?

+0

должна ли программа быть статической или вы хотите изменить количество строк, которые будут напечатаны? И почему он падает с 5,4,3, а затем 0? – Rizier123

+1

Внесите код в строку, чтобы сохранить SO независимо от других веб-сайтов. – potrzebie

+0

Код должен быть статическим. Я хотел, чтобы первые 3 строки следовали шаблону, а четвертая строка - исключение из шаблона. Я думал, что смогу выполнить это с помощью инструкции if. – EbuCode

ответ

0

Прежде чем начинать что-либо, взгляните на алгоритм, который вам потребуется реализовать. Предположим, мы хотим создать треугольник с размером 4.
Там будет 3 пробела перед первым *. Затем на следующей строке будет 2 пробела и т. Д. уменьшает количество пробелов в каждой строке и с этим приращением число * s каждой строки.

Наш первый цикл, внешний цикл, будет петлей, которая должна перейти к следующей строке.

for(i = 0; i < size; i++) 
printf("\n"); 

Нет, нам нужно сделать так, чтобы оно печатало правильное количество пробелов в каждой строке. Зная, что первая строка имеет размер - 1 # пространств, мы получаем это

spaces = size - 1; 
for(x = 0; x < spaces; x++) 
printf(" "); 

Теперь мы размещаем, что в рамках внешнего цикла, так как мы хотим, чтобы это сделать, что для каждой строки. Нам также нужно изменить значение пробелов после каждой строки, так как оно уменьшает каждую строку.

int x, i; 
spaces = size - 1; 
for(i = 0; i < size; i++){ 
for(x = 0; x < spaces; x++) 
    printf(" "); 
spaces--; 
printf("\n"); 
} 

И, наконец, нам необходимо распечатать * s. Как вы заметили, число * s начинается с 1 и увеличивает каждую строку. Таким образом, мы делаем еще один цикл

int stars = 1; 
for(a = 0; a < stars; a++) 
    printf("*"); 

После того, как это закончено, мы должны положить, что в рамках нашего внешнего цикла, после того пространства.

int x, i, a; 
spaces = size - 1; 
stars = 1; 
for(i = 0; i < size; i++){ 
for(x = 0; x < spaces; x++) 
    printf(" "); 
for(a = 0; a < stars; a++) 
    printf("*"); 
spaces--; 
stars++; 
printf("\n"); 
} 

И у вас оно есть. Я набрал все это в окне форума, чтобы могли быть некоторые опечатки синтаксиса, но этого должно быть более чем достаточно. Это основной метод рисования. Теперь все, что вам нужно сделать, это неправильная часть. Я позволю вам справиться с этим, но так же просто, как инициализировать переменную пробелов, чтобы компенсировать длину последней строки. После того как вы компенсируете пробелы, верните свою последнюю строку кода во все звезды

0

Вы пытаетесь сделать слишком много за раз в функции (main()), вот почему вы терпите неудачу в логике. Разделите проблему на меньшую, независимых штук.

#include <stdio.h> 
void printNSpaces(int count); 
void printNStars(int count); 

int main(void) { 
    int n; 

    for (n = 1; n <= 6; ++n) { 
     printNSpaces(6 - n); 
     printNStars(n); 
     (void) printf("\n"); 
    } 
    return 0; 
} 

void printNSpaces(int count) { 
    while (count--) { 
     (void) printf(" "); 
    } 
} 

void printNStars(int count) { 
    while (count--) { 
     (void) printf("*"); 
    } 
} 

Исключение (и) должно быть легко добавить к этому.

printNSpaces() и printNStars() очень похожи и может быть объединен в единую родовую функцию void printN(char c, int count), но тогда вы не будете использовать необходимые printf(" ") и printf("*") заявление.

Смежные вопросы