2016-08-14 2 views
1

Я пытаюсь напечатать следующую картину:Как напечатать следующий рисунок, используя 3 для циклов вместо 4?

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

Теперь я знаю, как сделать это с помощью 4 для петель:

for(i=1;i<=n;i++) 
{ 
    for(j=1;j<=i;j++) 
    { 
     cout<<"*"; 
    } 
    cout<<"\n"; 
} 

напечатать первую половину и распечатать вторую половину :

for(i=1;i<=n;i++) 
{ 
    for(j=n;j>i;j--) 
    { 
     cout<<"*"; 
    } 
    cout<<"\n"; 
} 

Оглядываясь, как внешние, так и для петель одинаковы. то есть для (i = 1; i < = n; i ++). Нужно ли встраивать как циклы «j» внутри цикла i-for?

+0

Добавить, если заявление первого контура с двумя внутренними петлями, первая из которых используется для увеличения части второй для уменьшения. – phil13131

+0

Вы заинтересованы в написании лучшего кода или недопустимый код, который использует 3 цикла, является хорошим ответом? – nwp

+0

@nwp: Если есть способ получить результат, уменьшив количество циклов, это будет оценено. – TheEvilGuardian

ответ

0

Вам не нужны даже три петли, но только две петли?

int n=5, i, j, k; 

for (i=0; i<n*2-1; i++) 
{ 
    j=i; 
    if (j >= n) 
     j=n*2-2-j; 

    for (k=0; k<=j; k++) 
     std::cout << '*'; 
    std::cout << std::endl; 
} 
0

с использованием 2 петли:

int g=1; 
for(int i=0;i<=5;i++){ 
for (int y=0;y<=i;y+=g){ 
cout<<"*"; 
} 

cout<<endl; 

if (i==4 && g==1){ 
cout<<"*****"; 
i=3; 
g=-1; 
}} 
0

Вместо печати 5 строк, а затем еще 5, можно напечатать 10, и подсчитать количество звезд в каждой строке.

for(i = 1; i <= 2*n - 1; i++) 
{ 
    for(j = 1; j <= n - abs(i - n); j++) 
     { 
      cout<<"*"; 
     } 
    cout<<"\n"; 
} 

Выражение n-abs(i-n) принимает значение I для значений I от 1 до п и 2п-I для значений I выше п.

1

Просто для удовольствия, как об одном цикле:

for (int i=1, j=0, dir=1; i!=0;) { 
     cout << '*'; 
     ++j; 

     if (j==i) { 
      cout << '\n'; 
      j = 0; 
      i += dir; 

      if (i==6) { 
       dir = -1; 
       i -= 2; 
      } 
     }  
    } 
+0

Мне это нравится! это весело! –

+0

@ Eliyahu-Shmuel По-моему, это всего лишь плохой код. :) –

3

Используя только одну петлю:

#include <iostream> 
#include <string> 

int main() { 
    for (unsigned i = 0; i < 10; ++i) 
     std::cout << std::string(i < 5 ? (i+1) : 10 - (i+1), '*') << std::endl; 

    return 0; 
} 
0

Вы можете сделать это в одном цикле (возможно, обманывая немного):

size_t max = 5; 
size_t rows = max * 2 - 1; 
std::string line(std::string(max, '*') + '\n'); 

for (size_t j = 0, k = max; j < rows; ++j) { 
    std::cout << line.c_str() + (j < max ? --k : ++k); 
} 
0

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

#include <iostream> 

void print_stars(int count) 
{ 
    if (count > 0) 
    { 
     std::cout << '*'; 
     print_stars(count - 1); 
    } 
} 

void print_line(int lines, int stars) 
{ 
    if (lines == 1) 
     print_stars(stars); 
    else 
    { 
     if (stars > 0) 
     { 
      print_stars(stars); 
      std::cout << std::endl; 
     } 

     print_line(lines - 1, stars + 1); 
     std::cout << std::endl; 

     if (stars > 0) 
      print_stars(stars); 
    } 
} 

int main() 
{ 
    int star_count = 5; 
    print_line(star_count + 1, 0); 
    return 0; 
} 
+0

Возможно, он будет реорганизован/оптимизирован. – Steve

0

Образец может быть выведен с использованием только одного цикла.

Вот демонстративная программа.

#include <iostream> 
#include <iomanip> 

int main() 
{ 
    while (true) 
    { 
     const char c = '*'; 

     std::cout << "Enter non-negative number (0 - exit): "; 

     unsigned int n; 

     if (!(std::cin >> n) || n == 0) break; 

     std::cout << '\n'; 

     for (unsigned int i = 1; i < 2 * n; i++) 
     { 
      unsigned int w = i <= n ? i : 2 * n - i; 

      std::cout << std::setfill(c) << std::setw(w + 1) << '\n'; 
     } 

     std::cout << std::endl; 
    } 

    return 0; 
} 

Если ввести последовательно

5 4 3 2 1 0 

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

Enter non-negative number (0 - exit): 5 

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

Enter non-negative number (0 - exit): 4 

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

Enter non-negative number (0 - exit): 3 

* 
** 
*** 
** 
* 

Enter non-negative number (0 - exit): 2 

* 
** 
* 

Enter non-negative number (0 - exit): 1 

* 

Enter non-negative number (0 - exit): 0 

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

Здесь вы находитесь.

#include <iostream> 
#include <iomanip> 

std::ostream & pattern(unsigned int n, char c = '*', std::ostream &os = std::cout) 
{ 
    for (unsigned int i = 1; i < 2 * n; i++) 
    { 
     unsigned int w = i <= n ? i : 2 * n - i; 

     os << std::setfill(c) << std::setw(w + 1) << '\n'; 
    } 

    return os; 
} 

int main() 
{ 
    while (true) 
    { 
     std::cout << "Enter non-negative number (0 - exit): "; 

     unsigned int n; 

     if (!(std::cin >> n) || n == 0) break; 

     std::cout << '\n'; 

     pattern(n);  

     std::cout << std::endl; 
    } 

    return 0; 
} 

Примите во внимание, что, например, это плохая идея использовать стандартный класс std::string для вывода шаблона, так как программа будет неэффективной из-за распределения и перераспределения динамической памяти для объекта класса.

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

Например

#include <iostream> 
#include <algorithm> 
#include <iterator> 

int main() 
{ 
    while (true) 
    { 
     const char c = '*'; 

     std::cout << "Enter non-negative number (0 - exit): "; 

     unsigned int n; 

     if (!(std::cin >> n) || n == 0) break; 

     std::cout << '\n'; 

     for (unsigned int i = 1; i < 2 * n; i++) 
     { 
      unsigned int w = i <= n ? i : 2 * n - i; 

      *std::fill_n(std::ostream_iterator<char>(std::cout), w, c) = '\n'; 
     } 

     std::cout << std::endl; 
    } 

    return 0; 
} 
0
#include <iostream> 
using namespace std; 
int main() { 
    int i; 
    int j; 
    int count = 1; 
    for(i= 0;i<10;i++) { 
     if(i < 5) { 
      for(j=0;j<=i;j++) { 
       cout<<"*"; 
      } 
     } else { 
      for(j=i-count;j>0;j--) { 
       cout<<"*"; 
      } 
      count +=2; 
    } 
     cout<< "\n"; 
    } 
    return 0; 
} 
Смежные вопросы