On-line: гостей 0. Всего: 0 [подробнее..]
Программисты всех стран, объединяйтесь!

АвторСообщение



ссылка на сообщение  Отправлено: 26.06.18 00:35. Заголовок: Вывод на консоль изображения фигуры (шаблона), состоящего из цифр и звездочек


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

Вот одна из таких задач вывода изображения фигуры, с которой мне ранее не приходилось встречаться. Эта задача сформулирована в следующем вопросе на Stackoverflow How can I solve the following pattern in c++? (Возможно, ссылка может стать недействительной в виду удаления указанного вопроса)

 
1 2 3 4 5

1 2 3 4 *

1 2 3 * * *

1 2 * * * * *

1 * * * * * * *


Данная фигура состоит из пяти строк. Возникает вопрос, как выводить числа, если число строк превышает 9, То есть в общем случае могут появиться двухзначные и даже многозначные числа. В связи с этим фигура не будет выглядеть выравненной. Поэтому для вывода фигуры лучше использовать только цифры 1-9 даже для большого числа заданных пользователем строк, либо использовать цифры 0-9, начиная вывод с 1..

Как обычно, сначала сами попробуйте написать соответствующую программу.

Ниже приведено мое решение данной задачи. В приведенной программе для вывода чисел используются цифры 1-9. Если вы хотите включить в вывод также цифру 0, то первый вложенный цикл следует заменить на более простой цикл

 
for ( unsigned int k = 0; k < n - i; ++k ) std::cout << ( k + 1 ) % Base << ' ';


Вот сама программа.

 
#include <iostream>

int main()
{
const unsigned int Base = 10;
const char c = '*';

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

if ( not ( std::cin >> n ) or ( n == 0 ) ) break;

std::cout << '\n';
for ( unsigned int i = 0, j = 0; i < n; i++, j = 2 * i - 1 )
{
for ( unsigned int k = 0, digit = 0; k < n - i; ++k )
{
if ( ++digit == Base ) digit = 1;
std::cout << digit << ' ';
}
for ( unsigned int k = 0; k < j; ++ k ) std::cout << c << ' ';
std::cout << '\n';
}
std::cout << '\n';
}
}


Вывод программы на консоль может выглядеть, к примеру, следующим образом:
 
Enter a non-negative number (0 - exit): 10

1 2 3 4 5 6 7 8 9 1
1 2 3 4 5 6 7 8 9 *
1 2 3 4 5 6 7 8 * * *
1 2 3 4 5 6 7 * * * * *
1 2 3 4 5 6 * * * * * * *
1 2 3 4 5 * * * * * * * * *
1 2 3 4 * * * * * * * * * * *
1 2 3 * * * * * * * * * * * * *
1 2 * * * * * * * * * * * * * * *
1 * * * * * * * * * * * * * * * * *

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

1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 *
1 2 3 4 5 6 7 * * *
1 2 3 4 5 6 * * * * *
1 2 3 4 5 * * * * * * *
1 2 3 4 * * * * * * * * *
1 2 3 * * * * * * * * * * *
1 2 * * * * * * * * * * * * *
1 * * * * * * * * * * * * * * *

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

1 2 3 4 5 6 7 8
1 2 3 4 5 6 7 *
1 2 3 4 5 6 * * *
1 2 3 4 5 * * * * *
1 2 3 4 * * * * * * *
1 2 3 * * * * * * * * *
1 2 * * * * * * * * * * *
1 * * * * * * * * * * * * *

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

1 2 3 4 5 6 7
1 2 3 4 5 6 *
1 2 3 4 5 * * *
1 2 3 4 * * * * *
1 2 3 * * * * * * *
1 2 * * * * * * * * *
1 * * * * * * * * * * *

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

1 2 3 4 5 6
1 2 3 4 5 *
1 2 3 4 * * *
1 2 3 * * * * *
1 2 * * * * * * *
1 * * * * * * * * *

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

1 2 3 4 5
1 2 3 4 *
1 2 3 * * *
1 2 * * * * *
1 * * * * * * *

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

1 2 3 4
1 2 3 *
1 2 * * *
1 * * * * *

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

1 2 3
1 2 *
1 * * *

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

1 2
1 *

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

1

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


Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 11 [только новые]





ссылка на сообщение  Отправлено: 05.07.18 15:35. Заголовок: Наверное самая часто..


Наверное самая часто встречающаяся фигура в подобных заданиях - это треугольник. Обычно требуется вывести треугольник, состоящий из звездочек, но, бывает, что задание усложняется выводом других символов, которые варьируются в зависимости от позиции в треугольнике, как показано в следующем вопросе на Stackoverflow What loop to use to generate the pattern below using C (Возможно, ссылка может стать недействительной в виду удаления указанного вопроса) В этом вопросе спрашивается, как вывести треугольник, состоящий из чисел, следующего вида

 
1

1 2

1 2 3

1 2 3 4

1 2 3 4 5

1 2 3 4 5 6

1 2 3 4 5 6 7

1 2 3 4 5 6 7 8

1 2 3 4 5 6 7 8 9


На самом деле данное задание ненамного сложнее задания вывода треугольника, состоящего из звездочек.

Для начала я покажу, как может выглядеть программа на C для вывода треугольника, состоящего из звездочек.

 
#include <stdio.h>

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

while ( 1 )
{
printf( "Enter a non-negative number (0 - exit): " );

unsigned int n;

if ( ( scanf( "%u", &n ) != 1 ) || ( n == 0 ) ) break;

putchar( '\n' );
for ( unsigned int i = 0; i < n; i++ )
{
for ( unsigned int j = 0; j < i + 1; j++ ) printf( "%c ", c );
putchar( '\n' );
}
putchar( '\n' );
}
}


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

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

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

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


Требуется незначительные изменения, чтобы программа выводила треугольник из чисел. Очевидно, что в измененной программе не требуется объявлять переменную, которая содержит символ вывода. Второе изменение связано с тем, что требуется определить ширину макисмального выводимого числа, чтобы выровнять вывод по колонкам.

Ниже показана измененная программа.

 
#include <stdio.h>

int main( void )
{
const unsigned int Base = 10;

while ( 1 )
{
printf( "Enter a non-negative number (0 - exit): " );

unsigned int n;

if ( ( scanf( "%u", &n ) != 1 ) || ( n == 0 ) ) break;

int len = 1;

for ( unsigned int tmp = n; tmp /= Base; ) ++len;

putchar( '\n' );
for ( unsigned int i = 0; i < n; i++ )
{
for ( unsigned int j = 0; j < i + 1; j++ ) printf( "%*u ", len, j + 1 );
putchar( '\n' );
}
putchar( '\n' );
}
}


Ее вывод может выглядеть так:
 
Enter a non-negative number (0 - exit): 15

1
1 2
1 2 3
1 2 3 4
1 2 3 4 5
1 2 3 4 5 6
1 2 3 4 5 6 7
1 2 3 4 5 6 7 8
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10 11
1 2 3 4 5 6 7 8 9 10 11 12
1 2 3 4 5 6 7 8 9 10 11 12 13
1 2 3 4 5 6 7 8 9 10 11 12 13 14
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

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


Если требуется, чтобы в вышепоказанном треугольники выводимые числа непрерывно возрастали, как показано ниже

 
1
2 3
4 5 6
7 8 9 10


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

 
#include <stdio.h>

int main( void )
{
const unsigned int Base = 10;

while ( 1 )
{
printf( "Enter a non-negative number (0 - exit): " );

unsigned int n;

if ( ( scanf( "%u", &n ) != 1 ) || ( n == 0 ) ) break;

int len = 1;

for ( unsigned int tmp = n * ( n + 1 ) / 2; tmp /= Base; ) ++len;

putchar( '\n' );
for ( unsigned int i = 0, value = 0; i < n; i++ )
{
for ( unsigned int j = 0; j < i + 1; j++ ) printf( "%*u ", len, ++value );
putchar( '\n' );
}
putchar( '\n' );
}
}


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

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

1
2 3
4 5 6
7 8 9 10
11 12 13 14 15
16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 32 33 34 35 36
37 38 39 40 41 42 43 44 45
46 47 48 49 50 51 52 53 54 55
56 57 58 59 60 61 62 63 64 65 66
67 68 69 70 71 72 73 74 75 76 77 78
79 80 81 82 83 84 85 86 87 88 89 90 91
92 93 94 95 96 97 98 99 100 101 102 103 104 105
106 107 108 109 110 111 112 113 114 115 116 117 118 119 120

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


Спасибо: 0 
ПрофильЦитата Ответить



ссылка на сообщение  Отправлено: 24.07.18 12:05. Заголовок: Чтобы вывести указан..


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

Ниже показаны демонстрационные программы вывода симметрично отраженных треугольников.

 
#include <stdio.h>

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

while ( 1 )
{
printf( "Enter a non-negative number (0 - exit): " );

unsigned int n;

if ( ( scanf( "%u", &n ) != 1 ) || ( n == 0 ) ) break;

putchar( '\n' );
for ( unsigned int i = 0; i < n; i++ )
{
printf( "%*c ", ( int )( 2 * ( n - i ) - 1 ), c );
for ( unsigned int j = 1; j < i + 1; j++ ) printf( "%c ", c );
putchar( '\n' );
}
putchar( '\n' );
}
}

Вывод программы на консоль может выглядеть следующим образом:
 
Enter a non-negative number (0 - exit): 15

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

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

 
#include <stdio.h>

int main( void )
{
const unsigned int Base = 10;

while ( 1 )
{
printf( "Enter a non-negative number (0 - exit): " );

unsigned int n;

if ( ( scanf( "%u", &n ) != 1 ) || ( n == 0 ) ) break;

int len = 1;

for ( unsigned int tmp = n; tmp /= Base; ) ++len;

putchar( '\n' );
for ( unsigned int i = 0; i < n; i++ )
{
unsigned int j = i + 1;
printf( "%*u ", ( int )( ( len + 1 ) * ( n - i ) - 1 ), j );
while ( --j ) printf( "%*u ", len, j );
putchar( '\n' );
}
putchar( '\n' );
}
}

Вывод программы на консоль может выглядеть следующим образом:
 
Enter a non-negative number (0 - exit): 15

1
2 1
3 2 1
4 3 2 1
5 4 3 2 1
6 5 4 3 2 1
7 6 5 4 3 2 1
8 7 6 5 4 3 2 1
9 8 7 6 5 4 3 2 1
10 9 8 7 6 5 4 3 2 1
11 10 9 8 7 6 5 4 3 2 1
12 11 10 9 8 7 6 5 4 3 2 1
13 12 11 10 9 8 7 6 5 4 3 2 1
14 13 12 11 10 9 8 7 6 5 4 3 2 1
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1

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

И, наконец,
 
#include <stdio.h>

int main( void )
{
const unsigned int Base = 10;

while ( 1 )
{
printf( "Enter a non-negative number (0 - exit): " );

unsigned int n;

if ( ( scanf( "%u", &n ) != 1 ) || ( n == 0 ) ) break;

int len = 1;

for ( unsigned int tmp = n * ( n + 1 ) / 2; tmp /= Base; ) ++len;

putchar( '\n' );
for ( unsigned int i = 0; i < n; i++ )
{
unsigned int value = ( i + 1 ) * ( i + 2 ) / 2;
printf( "%*u ", ( int )( ( len + 1 ) * ( n - i ) - 1 ), value-- );
for ( unsigned int j = 1; j < i + 1; j++ ) printf( "%*u ", len, value-- );
putchar( '\n' );
}
putchar( '\n' );
}
}

Вывод программы на консоль может выглядеть следующим образом:
 
Enter a non-negative number (0 - exit): 15

1
3 2
6 5 4
10 9 8 7
15 14 13 12 11
21 20 19 18 17 16
28 27 26 25 24 23 22
36 35 34 33 32 31 30 29
45 44 43 42 41 40 39 38 37
55 54 53 52 51 50 49 48 47 46
66 65 64 63 62 61 60 59 58 57 56
78 77 76 75 74 73 72 71 70 69 68 67
91 90 89 88 87 86 85 84 83 82 81 80 79
105 104 103 102 101 100 99 98 97 96 95 94 93 92
120 119 118 117 116 115 114 113 112 111 110 109 108 107 106

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


Спасибо: 0 
ПрофильЦитата Ответить



ссылка на сообщение  Отправлено: 30.07.18 20:52. Заголовок: Если перевернуть тре..


Если перевернуть треугольники относительно горизонтальной оси, то соответствующие программы могут выглядеть следующим образом.

 
#include <stdio.h>

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

while ( 1 )
{
printf( "Enter a non-negative number (0 - exit): " );

unsigned int n;

if ( ( scanf( "%u", &n ) != 1 ) || ( n == 0 ) ) break;

putchar( '\n' );
for ( ; n != 0; n-- )
{
for ( unsigned int j = 0; j < n; j++ ) printf( "%c ", c );
putchar( '\n' );
}
putchar( '\n' );
}
}

Вывод программы на консоль может выглядеть следующим образом:
 
Enter a non-negative number (0 - exit): 15

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

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


 
#include <stdio.h>

int main( void )
{
const unsigned int Base = 10;

while ( 1 )
{
printf( "Enter a non-negative number (0 - exit): " );

unsigned int n;

if ( ( scanf( "%u", &n ) != 1 ) || ( n == 0 ) ) break;

int len = 1;

for ( unsigned int tmp = n; tmp /= Base; ) ++len;

putchar( '\n' );
for ( ; n != 0; n-- )
{
for ( unsigned int j = 0; j < n; j++ ) printf( "%*u ", len, j + 1 );
putchar( '\n' );
}
putchar( '\n' );
}
}

Вывод программы на консоль может выглядеть следующим образом:
 
Enter a non-negative number (0 - exit): 15

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
1 2 3 4 5 6 7 8 9 10 11 12 13 14
1 2 3 4 5 6 7 8 9 10 11 12 13
1 2 3 4 5 6 7 8 9 10 11 12
1 2 3 4 5 6 7 8 9 10 11
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8
1 2 3 4 5 6 7
1 2 3 4 5 6
1 2 3 4 5
1 2 3 4
1 2 3
1 2
1

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

 
#include <stdio.h>

int main( void )
{
const unsigned int Base = 10;

while ( 1 )
{
printf( "Enter a non-negative number (0 - exit): " );

unsigned int n;

if ( ( scanf( "%u", &n ) != 1 ) || ( n == 0 ) ) break;

int len = 1;

for ( unsigned int tmp = n * ( n + 1 ) / 2; tmp /= Base; ) ++len;

putchar( '\n' );
for ( ; n != 0; n-- )
{
unsigned int value = n * ( n - 1 ) / 2;
for ( unsigned int j = 0; j < n; j++ ) printf( "%*u ", len, ++value );
putchar( '\n' );
}
putchar( '\n' );
}
}

Вывод программы на консоль может выглядеть следующим образом:
 
Enter a non-negative number (0 - exit): 15

106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
92 93 94 95 96 97 98 99 100 101 102 103 104 105
79 80 81 82 83 84 85 86 87 88 89 90 91
67 68 69 70 71 72 73 74 75 76 77 78
56 57 58 59 60 61 62 63 64 65 66
46 47 48 49 50 51 52 53 54 55
37 38 39 40 41 42 43 44 45
29 30 31 32 33 34 35 36
22 23 24 25 26 27 28
16 17 18 19 20 21
11 12 13 14 15
7 8 9 10
4 5 6
2 3
1

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

 
#include <stdio.h>

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

while ( 1 )
{
printf( "Enter a non-negative number (0 - exit): " );

unsigned int n;

if ( ( scanf( "%u", &n ) != 1 ) || ( n == 0 ) ) break;

putchar( '\n' );
for ( size_t i = 0; i < n; i++ )
{
printf( "%*c ", ( int )( 2 * i + 1 ), c );
for ( unsigned int j = i + 1; j < n; j++ ) printf( "%c ", c );
putchar( '\n' );
}
putchar( '\n' );
}
}

Вывод программы на консоль может выглядеть следующим образом:
 
Enter a non-negative number (0 - exit): 15

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

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

 
#include <stdio.h>

int main( void )
{
const unsigned int Base = 10;

while ( 1 )
{
printf( "Enter a non-negative number (0 - exit): " );

unsigned int n;

if ( ( scanf( "%u", &n ) != 1 ) || ( n == 0 ) ) break;

int len = 1;

for ( unsigned int tmp = n; tmp /= Base; ) ++len;

putchar( '\n' );
for ( unsigned int i = 0; i < n; i++ )
{
unsigned int j = n - i;
printf( "%*u ", ( int )( ( len + 1 ) * i + len ), j );
while ( --j ) printf( "%*u ", len, j );
putchar( '\n' );
}
putchar( '\n' );
}
}

Вывод программы на консоль может выглядеть следующим образом:
 
Enter a non-negative number (0 - exit): 15

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
14 13 12 11 10 9 8 7 6 5 4 3 2 1
13 12 11 10 9 8 7 6 5 4 3 2 1
12 11 10 9 8 7 6 5 4 3 2 1
11 10 9 8 7 6 5 4 3 2 1
10 9 8 7 6 5 4 3 2 1
9 8 7 6 5 4 3 2 1
8 7 6 5 4 3 2 1
7 6 5 4 3 2 1
6 5 4 3 2 1
5 4 3 2 1
4 3 2 1
3 2 1
2 1
1

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

#include <stdio.h>  

int main( void )
{
const unsigned int Base = 10;

while ( 1 )
{
printf( "Enter a non-negative number (0 - exit): " );

unsigned int n;

if ( ( scanf( "%u", &n ) != 1 ) || ( n == 0 ) ) break;

int len = 1;

for ( unsigned int tmp = n * ( n + 1 ) / 2; tmp /= Base; ) ++len;

putchar( '\n' );
for ( unsigned int i = 0; i < n; i++ )
{
unsigned int value = ( n - i ) * ( n - i + 1 ) / 2;
printf( "%*u ", ( int )( ( len + 1 ) * i + len ), value-- );
for ( unsigned int j = i + 1; j < n; j++ ) printf( "%*u ", len, value-- );
putchar( '\n' );
}
putchar( '\n' );
}
}

Вывод программы на консоль может выглядеть следующим образом:
Enter a non-negative number (0 - exit): 15 

120 119 118 117 116 115 114 113 112 111 110 109 108 107 106
105 104 103 102 101 100 99 98 97 96 95 94 93 92
91 90 89 88 87 86 85 84 83 82 81 80 79
78 77 76 75 74 73 72 71 70 69 68 67
66 65 64 63 62 61 60 59 58 57 56
55 54 53 52 51 50 49 48 47 46
45 44 43 42 41 40 39 38 37
36 35 34 33 32 31 30 29
28 27 26 25 24 23 22
21 20 19 18 17 16
15 14 13 12 11
10 9 8 7
6 5 4
3 2
1

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


Спасибо: 0 
ПрофильЦитата Ответить



ссылка на сообщение  Отправлено: 27.09.18 16:05. Заголовок: Вот еще вопрос (для ..


Вот еще вопрос (для разминки) на вывод пирамиды на консоль следующего вида, как показано в вопросе на Stackoverflow C: Hashes pyramid pattern

 
#
##
####
#######
###########


Хотя в вопросе требуется написать программу на языке C, тем не менее код будет выглядеть интереснее, если написать программу на C++.

Ниже представлена соответствующая демонстрационная программа.

 
// This file is a "Hello, world!" in C++ language by GCC for wandbox.
#include <iostream>
#include <iomanip>

int main()
{
while ( true )
{
const char FILLER = '#';

int n;

std::cout << "Enter the height of a pyramid (0 - exit): ";

if ( not ( std::cin >> n ) or ( n <= 0 ) ) break;

std::cout << '\n';
for ( int i = 0, width = 1; i < n; i++, width += i )
{
std::cout << std::setw( width ) << std::setfill( FILLER ) << FILLER << '\n';
}
std::cout << '\n';
}
}


Вывод программы на консоль может быть, к примеру, следующим:

 
Enter the height of a pyramid (0 - exit): 1

#

Enter the height of a pyramid (0 - exit): 2

#
##

Enter the height of a pyramid (0 - exit): 3

#
##
####

Enter the height of a pyramid (0 - exit): 4

#
##
####
#######

Enter the height of a pyramid (0 - exit): 5

#
##
####
#######
###########

Enter the height of a pyramid (0 - exit): 0


Спасибо: 0 
ПрофильЦитата Ответить



ссылка на сообщение  Отправлено: 30.11.18 17:58. Заголовок: В данном вопросе на ..


В данном вопросе на Ru.Stackoverflow Вводится число, выводится фигура Помогите исправить код требуется вывести треугольник следующего вида (для введенного пользователем числа 6):
 
*

* *

* *

* *

* *

***********


Соответствующая программа на C++ может выглядеть, к примеру, следующим образом:
 
#include <iostream>
#include <iomanip>

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

while ( true )
{
std::cout << "Enter a non-negative value (0 - exit): ";

unsigned int n;

if ( not ( std::cin >> n ) or ( n == 0 ) ) break;

std::cout << '\n';
for ( unsigned int i = 0; i < n; i++ )
{
std::cout << std::setfill( ' ' ) << std::setw( n - i ) << '*';
if ( i )
{
std::cout << std::setfill( i == n - 1 ? c : ' ' ) << std::setw( 2 * i ) << std::right << c;
}
std::cout << "\n\n";
}
}
}

Вывод программы, в частности, может быть таким
 
Enter a non-negative value (0 - exit): 6

*

* *

* *

* *

* *

***********

Enter a non-negative value (0 - exit): 5

*

* *

* *

* *

*********

Enter a non-negative value (0 - exit): 4

*

* *

* *

*******

Enter a non-negative value (0 - exit): 3

*

* *

*****

Enter a non-negative value (0 - exit): 2

*

***

Enter a non-negative value (0 - exit): 1

*

Enter a non-negative value (0 - exit): 0


Спасибо: 0 
ПрофильЦитата Ответить



ссылка на сообщение  Отправлено: 04.09.19 17:31. Заголовок: Вот еще одно аналоги..


Вот еще одно аналогичное задание, появившееся на Stackoverflow, по выводу изображения на консоль, с видом которого я еще не встречался.
What Is The Logic Of This Pattern?

Ниже представлено мною написанное решение этого задания.

 
#include <stdio.h>

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

while ( 1 )
{
printf( "Enter a non-negative integer (0 - exit): " );

int n;

if ( scanf( "%d", &n ) != 1 || n <= 0 ) break;

putchar( '\n' );

for ( int i = 0; i < n; i++ )
{
printf( "%*c ", 2 * ( n - i * ( i % 2 == 0 ) ), c );
for ( int j = 0; j < i; j++ ) printf( "%c ", c );
putchar( '\n' );
}

putchar( '\n' );
}

return 0;
}


Вывод программы на консоль может выглядеть, к примеру, следующим образом:
 
Enter a non-negative integer (0 - exit): 10

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

Enter a non-negative integer (0 - exit): 9

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

Enter a non-negative integer (0 - exit): 8

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

Enter a non-negative integer (0 - exit): 7

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

Enter a non-negative integer (0 - exit): 6

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

Enter a non-negative integer (0 - exit): 5

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

Enter a non-negative integer (0 - exit): 4

*
* *
* * *
* * * *

Enter a non-negative integer (0 - exit): 3

*
* *
* * *

Enter a non-negative integer (0 - exit): 2

*
* *

Enter a non-negative integer (0 - exit): 1

*

Enter a non-negative integer (0 - exit): 0


Спасибо: 0 
ПрофильЦитата Ответить



ссылка на сообщение  Отправлено: 07.09.19 13:27. Заголовок: Вот еще одна интерес..


Вот еще одна интересная фигура, состоящая из чисел, которую нужно вывести на консоль. Соответствующее задание я встретил в следующем вопросе на Stackoverflow Advanced Number Pattern

Пример изображения фигуры, которую нужно вывести на консоль:
  
1
2 19
3 18 20
4 17 21 34
5 16 22 33 35
6 15 23 32 36 45
7 14 24 31 37 44 46
8 13 25 30 38 43 47 52
9 12 26 29 39 42 48 51 53
10 11 27 28 40 41 49 50 54 55

То есть числа выводятся в треугольнике по возрастанию в зигзагообразном порядке.

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

Ниже представлены две демонстрационные программы с моими оешениями. Первая программа вычисляет значение очередного выводимого числа рекурсивно относительно значения предыдущего выведенного числа, а потому фломула для вычисления выглядет проще.
 
#include <stdio.h>

int main(void)
{
while ( 1 )
{
const unsigned int UPPER_LIMIT = 100;

printf( "Enter a non-negative number no greater than %u (0 - exit): ",
UPPER_LIMIT );

unsigned int n;

if ( scanf( "%u", &n ) != 1 || n == 0 ) break;

if ( !( n < UPPER_LIMIT ) ) n = UPPER_LIMIT - 1;

putchar( '\n' );

for ( unsigned int i = 0; i < n; i++ )
{
unsigned int value = i + 1;
for ( unsigned int j = 0; j < i + 1; j++ )
{
printf( "%2u ", value );
value += j % 2 == 0 ? 2 * ( n - i ) - 1 : 2 * ( i - j );
}

putchar( '\n' );
}

putchar( '\n' );
}

return 0;
}

Вывод программы на консоль может быть, к примеру, следующим:
 
Enter a non-negative number no greater than 100 (0 - exit): 10

1
2 19
3 18 20
4 17 21 34
5 16 22 33 35
6 15 23 32 36 45
7 14 24 31 37 44 46
8 13 25 30 38 43 47 52
9 12 26 29 39 42 48 51 53
10 11 27 28 40 41 49 50 54 55

Enter a non-negative number no greater than 100 (0 - exit): 9

1
2 17
3 16 18
4 15 19 30
5 14 20 29 31
6 13 21 28 32 39
7 12 22 27 33 38 40
8 11 23 26 34 37 41 44
9 10 24 25 35 36 42 43 45

Enter a non-negative number no greater than 100 (0 - exit): 8

1
2 15
3 14 16
4 13 17 26
5 12 18 25 27
6 11 19 24 28 33
7 10 20 23 29 32 34
8 9 21 22 30 31 35 36

Enter a non-negative number no greater than 100 (0 - exit): 7

1
2 13
3 12 14
4 11 15 22
5 10 16 21 23
6 9 17 20 24 27
7 8 18 19 25 26 28

Enter a non-negative number no greater than 100 (0 - exit): 6

1
2 11
3 10 12
4 9 13 18
5 8 14 17 19
6 7 15 16 20 21

Enter a non-negative number no greater than 100 (0 - exit): 5

1
2 9
3 8 10
4 7 11 14
5 6 12 13 15

Enter a non-negative number no greater than 100 (0 - exit): 4

1
2 7
3 6 8
4 5 9 10

Enter a non-negative number no greater than 100 (0 - exit): 3

1
2 5
3 4 6

Enter a non-negative number no greater than 100 (0 - exit): 2

1
2 3

Enter a non-negative number no greater than 100 (0 - exit): 1

1

Enter a non-negative number no greater than 100 (0 - exit): 0

Во второй программе очередное выводимое число вычисляется заново.
 
#include <stdio.h>

int main(void)
{
while ( 1 )
{
const unsigned int UPPER_LIMIT = 100;

printf( "Enter a non-negative number no greater than %u (0 - exit): ",
UPPER_LIMIT );

unsigned int n;

if ( scanf( "%u", &n ) != 1 || n == 0 ) break;

if ( !( n < UPPER_LIMIT ) ) n = UPPER_LIMIT - 1;

putchar( '\n' );

for ( unsigned int i = 0; i < n; i++ )
{
for ( unsigned int j = 0; j < i + 1; j++ )
{

unsigned int value = j % 2 == 0
? i + 1 + j * n - j * ( j + 1 ) / 2
: ( j + 1 ) * n - j * ( j + 1 ) / 2 - i + j;

printf( "%2u ", value );
}

putchar( '\n' );
}

putchar( '\n' );
}

return 0;
}

Вывод этой программы будет аналогичен выводу предыдущей демонстрационной программы.

Спасибо: 0 
ПрофильЦитата Ответить



ссылка на сообщение  Отправлено: 16.10.19 12:02. Заголовок: Встретил еще одно за..


Встретил еще одно задание по выводу изображения некоторой фигуры на консоль на Stackoverflow, но, к сожалению, не могу предоставить ссылку на соответствующий вопрос, так как он, похоже, уже удален.

Итак, требуется вывести следующую фигуру (например, для n равным 4):

  
1
2 1
3 2 1
4 3 2 1.


То есть фигура выводится с некоторым "наклоном".

Ранее мне не приходилось сталкиваться с таким заданием.

Ниже представлено решение на C. Высоту фигуры я ограничил числом 10Ю то есть высота фигуры должна быть меньше 10. Это ограничение введено мною для простоты, чтобы не рассчитывать максимальную ширину поля для выводимых чисел.

 
#include <stdio.h>

int main(void)
{
while ( 1 )
{
const int UPPER_LIMIT = 10;
const int width = 3;

printf( "Enter a non-negative number less than %d (0 - exit): ",
UPPER_LIMIT );

int n;

if ( scanf( "%d", &n ) != 1 || n <= 0 ) break;

if ( !( n < UPPER_LIMIT ) ) n = UPPER_LIMIT - 1;

putchar( '\n' );

for ( int i = 0; i < n; i++ )
{
int value = i + 1;

printf( "%*d", 1 + ( n - i - 1 ) * ( width + 1 ), value-- );
for ( int j = 0; j < i; j++ ) printf( "%*d", width, value-- );

putchar( '\n' );
}

putchar( '\n' );
}

return 0;
}

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

 
Enter a non-negative number less than 10 (0 - exit): 9
1
2 1
3 2 1
4 3 2 1
5 4 3 2 1
6 5 4 3 2 1
7 6 5 4 3 2 1
8 7 6 5 4 3 2 1
9 8 7 6 5 4 3 2 1

Enter a non-negative number less than 10 (0 - exit): 8

1
2 1
3 2 1
4 3 2 1
5 4 3 2 1
6 5 4 3 2 1
7 6 5 4 3 2 1
8 7 6 5 4 3 2 1

Enter a non-negative number less than 10 (0 - exit): 7

1
2 1
3 2 1
4 3 2 1
5 4 3 2 1
6 5 4 3 2 1
7 6 5 4 3 2 1

Enter a non-negative number less than 10 (0 - exit): 6

1
2 1
3 2 1
4 3 2 1
5 4 3 2 1
6 5 4 3 2 1

Enter a non-negative number less than 10 (0 - exit): 5

1
2 1
3 2 1
4 3 2 1
5 4 3 2 1

Enter a non-negative number less than 10 (0 - exit): 4

1
2 1
3 2 1
4 3 2 1

Enter a non-negative number less than 10 (0 - exit): 3

1
2 1
3 2 1

Enter a non-negative number less than 10 (0 - exit): 2

1
2 1

Enter a non-negative number less than 10 (0 - exit): 1

1

Enter a non-negative number less than 10 (0 - exit): 0


Спасибо: 0 
ПрофильЦитата Ответить



ссылка на сообщение  Отправлено: 21.01.20 11:50. Заголовок: Очередное задание, п..


Очередное задание, приведенное на сайте Stackoverflow, на вывод на консоль изображения "песочных часов", но на этот раз с помощью рекурсивной функции Draw hourglass recursively in C.

Например, если высота фигуры задана числом 6, то фигура будет выглядеть следующим образом
 
*****
***
*
*
***
*****

А для нечетного числа 5 фигура будет выглядеть как
 
*****
***
*
***
*****

Главное в решении этого задания - это вопрос о передачи значения отступа для вывода очередной строки фигуры от одного рекурсивного вызова функции к другому.

Сделать это можно по крайней мере двумя способами.

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

Ниже приведена соответствующая демонстрационная программа.
 
#include <stdio.h>

void draw_hourglass_rec( unsigned int n )
{
static unsigned int offset = 0;

const char c = '*';

if ( n )
{
for ( unsigned int i = 0; i < offset; i++ ) putchar( ' ' );

unsigned int k = n % 2 == 0 ? n - 1 : n;

for ( unsigned int i = 0; i < k; i++ ) putchar( c );
putchar( '\n' );

if ( ! ( n < 2 ) )
{
++offset;
draw_hourglass_rec( n - 2 );
--offset;
}

if ( n != 1 )
{
for ( unsigned int i = 0; i < offset; i++ ) putchar( ' ' );
for ( unsigned int i = 0; i < k; i++ ) putchar( c );
putchar( '\n' );
}

}
}

int main(void)
{
while ( 1 )
{
printf( "Enter a non-negative number (0 - exit): " );

unsigned int n;

if ( scanf( "%u", &n ) != 1 || n == 0 ) break;

putchar( '\n' );

draw_hourglass_rec( n );

putchar( '\n' );
}

return 0;
}

Вывод программы на консоль, к примеру, может выглядеть следующим образом:
 
Enter a non-negative number (0 - exit): 10

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

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

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

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

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

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

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

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

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

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

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

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

***
*
*
***

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

***
*
***

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

*
*

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

*

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

Второй способ заключается в написание вспомогательной функции, которая и будет рекурсивной, и которая через дополнительный параметр будет передавать значение отступа,

Вот, соответствующая демонстрационная программа.
 
#include <stdio.h>

void draw_hourglass_rec_helper( unsigned int n, unsigned int offset )
{
const char c = '*';

if ( n )
{
for ( unsigned int i = 0; i < offset; i++ ) putchar( ' ' );

unsigned int k = n % 2 == 0 ? n - 1 : n;

for ( unsigned int i = 0; i < k; i++ ) putchar( c );
putchar( '\n' );

if ( ! ( n < 2 ) ) draw_hourglass_rec_helper( n - 2, offset + 1 );

if ( n != 1 )
{
for ( unsigned int i = 0; i < offset; i++ ) putchar( ' ' );
for ( unsigned int i = 0; i < k; i++ ) putchar( c );
putchar( '\n' );
}
}
}

void draw_hourglass_rec( unsigned int n )
{
if ( n )
{
draw_hourglass_rec_helper( n, 0 );
}
}

int main(void)
{
while ( 1 )
{
printf( "Enter a non-negative number (0 - exit): " );

unsigned int n;

if ( scanf( "%u", &n ) != 1 || n == 0 ) break;

putchar( '\n' );

draw_hourglass_rec( n );

putchar( '\n' );
}

return 0;
}

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

Спасибо: 0 
ПрофильЦитата Ответить



ссылка на сообщение  Отправлено: 02.03.20 15:49. Заголовок: Вот еще один пример ..


Вот еще один пример из вопроса на Stackoverflow в копилку вывода изображений различных фигур на консоль printing numeric pyramid in C starting with the highest number at top

В данном случае форма выводимой фигуры следующая

 
55
4554
345543
23455432
1234554321

Ниже представлена программа, осуществляющая вывод такой фигуры на консоль.
 
#include <stdio.h>

int main(void)
{
while ( 1 )
{
const int UPPER_LIMIT = 10;

printf( "Enter a non-negative integer number less than %d (0 - exit): ",
UPPER_LIMIT );

int n;

if ( scanf( "%d", &n ) != 1 || n <= 0 ) break;

if ( !( n < UPPER_LIMIT ) ) n = UPPER_LIMIT - 1;

putchar( '\n' );

for ( int i = 0; i < n; i++ )
{
printf( "%*d", n - i, n - i );

int j = n - i;
while ( j++ != n ) putchar( '0' + j );
while ( j-- != n - i ) putchar( '0' + j );

putchar( '\n' );
}

putchar( '\n' );
}

return 0;
}

Вывод программы, к примеру, может выглядеть следующим образом:
 
Enter a non-negative integer number less than 10 (0 - exit): 9

99
8998
789987
67899876
5678998765
456789987654
34567899876543
2345678998765432
123456789987654321

Enter a non-negative integer number less than 10 (0 - exit): 8

88
7887
678876
56788765
4567887654
345678876543
23456788765432
1234567887654321

Enter a non-negative integer number less than 10 (0 - exit): 7

77
6776
567765
45677654
3456776543
234567765432
12345677654321

Enter a non-negative integer number less than 10 (0 - exit): 6

66
5665
456654
34566543
2345665432
123456654321

Enter a non-negative integer number less than 10 (0 - exit): 5

55
4554
345543
23455432
1234554321

Enter a non-negative integer number less than 10 (0 - exit): 4

44
3443
234432
12344321

Enter a non-negative integer number less than 10 (0 - exit): 3

33
2332
123321

Enter a non-negative integer number less than 10 (0 - exit): 2

22
1221

Enter a non-negative integer number less than 10 (0 - exit): 1

11

Enter a non-negative integer number less than 10 (0 - exit): 0


Спасибо: 0 
ПрофильЦитата Ответить



ссылка на сообщение  Отправлено: 03.03.20 16:48. Заголовок: Для вывода данной фи..


Для вывода данной фигуры на консоль

 
10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
10 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 10
10 9 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 9 10
10 9 8 7 7 7 7 7 7 7 7 7 7 7 7 7 8 9 10
10 9 8 7 6 6 6 6 6 6 6 6 6 6 6 7 8 9 10
10 9 8 7 6 5 5 5 5 5 5 5 5 5 6 7 8 9 10
10 9 8 7 6 5 4 4 4 4 4 4 4 5 6 7 8 9 10
10 9 8 7 6 5 4 3 3 3 3 3 4 5 6 7 8 9 10
10 9 8 7 6 5 4 3 2 2 2 3 4 5 6 7 8 9 10
10 9 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 10
10 9 8 7 6 5 4 3 2 2 2 3 4 5 6 7 8 9 10
10 9 8 7 6 5 4 3 3 3 3 3 4 5 6 7 8 9 10
10 9 8 7 6 5 4 4 4 4 4 4 4 5 6 7 8 9 10
10 9 8 7 6 5 5 5 5 5 5 5 5 5 6 7 8 9 10
10 9 8 7 6 6 6 6 6 6 6 6 6 6 6 7 8 9 10
10 9 8 7 7 7 7 7 7 7 7 7 7 7 7 7 8 9 10
10 9 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 9 10
10 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 10
10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10

требуются некоторые математические вычисления, чтобы уменьшить число циклов. Вот соответствующая программа на C++.
 
#include <iostream>
#include <iomanip>
#include <limits>
#include <algorithm>
#include <cstdlib>

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

int n;

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

if ( std::numeric_limits<int>::max() / 2 < n )
{
n = std::numeric_limits<int>::max() / 2;
}

int width = 1;

for ( int tmp = n; tmp /= 10; ) ++width;

std::cout << '\n';

int m = 2 * n - 1;

for ( int i = 0; i < m; i++ )
{
for ( int j = 0; j < m; j++ )
{
std::cout << std::setw( width )
<< std::max( std::abs( n - i - 1 ) + 1,
std::abs( n - j - 1 ) + 1 )
<< ' ';
}
std::cout << '\n';
}

std::cout << '\n';
}

return 0;
}

Чтобы понять формулу std::max( std::abs( n - i - 1 ) + 1, std::abs( n - j - 1 ) + 1 ), достаточно посмотреть ее значения при граничных значениях переменных i и j.

Спасибо: 0 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 31
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет