Форум » C/C++ для начинающих (C/C++ for beginners) » Вывод на консоль изображения фигуры (шаблона), состоящего из цифр и звездочек » Ответить

Вывод на консоль изображения фигуры (шаблона), состоящего из цифр и звездочек

Сыроежка: Одна из многочисленных задач, задаваемых начинающим программистам, состоит в написании программы выводы на консоль того или иного изображения фигуры, состоящего из звездочек или других символов, как, например, вывод пирамид, треугольников и прочих фигур. Вот одна из таких задач вывода изображения фигуры, с которой мне ранее не приходилось встречаться. Эта задача сформулирована в следующем вопросе на Stackoverflow How can I solve the following pattern in c++? (Возможно, ссылка может стать недействительной в виду удаления указанного вопроса) [pre2] 1 2 3 4 5 1 2 3 4 * 1 2 3 * * * 1 2 * * * * * 1 * * * * * * *[/pre2] Данная фигура состоит из пяти строк. Возникает вопрос, как выводить числа, если число строк превышает 9, То есть в общем случае могут появиться двухзначные и даже многозначные числа. В связи с этим фигура не будет выглядеть выравненной. Поэтому для вывода фигуры лучше использовать только цифры 1-9 даже для большого числа заданных пользователем строк, либо использовать цифры 0-9, начиная вывод с 1.. Как обычно, сначала сами попробуйте написать соответствующую программу. Ниже приведено мое решение данной задачи. В приведенной программе для вывода чисел используются цифры 1-9. Если вы хотите включить в вывод также цифру 0, то первый вложенный цикл следует заменить на более простой цикл [pre2] for ( unsigned int k = 0; k < n - i; ++k ) std::cout << ( k + 1 ) % Base << ' ';[/pre2] Вот сама программа. [pre2] #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'; } } [/pre2] Вывод программы на консоль может выглядеть, к примеру, следующим образом: [pre2] 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 [/pre2]

Ответов - 11

Сыроежка: Наверное самая часто встречающаяся фигура в подобных заданиях - это треугольник. Обычно требуется вывести треугольник, состоящий из звездочек, но, бывает, что задание усложняется выводом других символов, которые варьируются в зависимости от позиции в треугольнике, как показано в следующем вопросе на Stackoverflow What loop to use to generate the pattern below using C (Возможно, ссылка может стать недействительной в виду удаления указанного вопроса) В этом вопросе спрашивается, как вывести треугольник, состоящий из чисел, следующего вида [pre2] 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[/pre2] На самом деле данное задание ненамного сложнее задания вывода треугольника, состоящего из звездочек. Для начала я покажу, как может выглядеть программа на C для вывода треугольника, состоящего из звездочек. [pre2] #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' ); } }[/pre2] Вывод на консоль может быть, к примеру, таким: [pre2] Enter a non-negative number (0 - exit): 15 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Enter a non-negative number (0 - exit): 0[/pre2] Требуется незначительные изменения, чтобы программа выводила треугольник из чисел. Очевидно, что в измененной программе не требуется объявлять переменную, которая содержит символ вывода. Второе изменение связано с тем, что требуется определить ширину макисмального выводимого числа, чтобы выровнять вывод по колонкам. Ниже показана измененная программа. [pre2] #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' ); } } [/pre2] Ее вывод может выглядеть так: [pre2] 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[/pre2] Если требуется, чтобы в вышепоказанном треугольники выводимые числа непрерывно возрастали, как показано ниже [pre2] 1 2 3 4 5 6 7 8 9 10[/pre2] то все, что требуется, это правильно рассчитать ширину поля для выводимых чисел. Ниже представлена программа, которая выполняет поставленную задачу. [pre2] #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' ); } } [/pre2] Ее вывод может выглядеть следующим образом: [pre2] 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[/pre2]

Сыроежка: Чтобы вывести указанные выше изображения фигур треугольников симметрично отраженные относительно вертикальной оси, то единственное существенное изменение состоит в том, что первый символ в строке выводится в поле с соответственно вычисленной шириной поля. Ниже показаны демонстрационные программы вывода симметрично отраженных треугольников. [pre2] #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' ); } } [/pre2] Вывод программы на консоль может выглядеть следующим образом: [pre2] Enter a non-negative number (0 - exit): 15 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Enter a non-negative number (0 - exit): 0[/pre2] [pre2] #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' ); } } [/pre2] Вывод программы на консоль может выглядеть следующим образом: [pre2] 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[/pre2] И, наконец, [pre2] #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' ); } } [/pre2] Вывод программы на консоль может выглядеть следующим образом: [pre2] 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[/pre2]

Сыроежка: Если перевернуть треугольники относительно горизонтальной оси, то соответствующие программы могут выглядеть следующим образом. [pre2] #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' ); } } [/pre2] Вывод программы на консоль может выглядеть следующим образом: [pre2] Enter a non-negative number (0 - exit): 15 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Enter a non-negative number (0 - exit): 0 [/pre2] [pre2] #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' ); } } [/pre2] Вывод программы на консоль может выглядеть следующим образом: [pre2] 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[/pre2] [pre2] #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' ); } } [/pre2] Вывод программы на консоль может выглядеть следующим образом: [pre2] 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[/pre2] [pre2] #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' ); } } [/pre2] Вывод программы на консоль может выглядеть следующим образом: [pre2] Enter a non-negative number (0 - exit): 15 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Enter a non-negative number (0 - exit): 0[/pre2] [pre2] #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' ); } } [/pre2] Вывод программы на консоль может выглядеть следующим образом: [pre2] 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[/pre2] [pre2]#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' ); } } [/pre2] Вывод программы на консоль может выглядеть следующим образом: [pre2]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[/pre2]


Сыроежка: Вот еще вопрос (для разминки) на вывод пирамиды на консоль следующего вида, как показано в вопросе на Stackoverflow C: Hashes pyramid pattern [pre2] # ## #### ####### ###########[/pre2] Хотя в вопросе требуется написать программу на языке C, тем не менее код будет выглядеть интереснее, если написать программу на C++. Ниже представлена соответствующая демонстрационная программа. [pre2] // 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'; } } [/pre2] Вывод программы на консоль может быть, к примеру, следующим: [pre2] 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[/pre2]

Сыроежка: В данном вопросе на Ru.Stackoverflow Вводится число, выводится фигура Помогите исправить код требуется вывести треугольник следующего вида (для введенного пользователем числа 6): [pre2] * * * * * * * * * ***********[/pre2] Соответствующая программа на C++ может выглядеть, к примеру, следующим образом: [pre2] #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"; } } } [/pre2] Вывод программы, в частности, может быть таким [pre2] 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[/pre2]

Сыроежка: Вот еще одно аналогичное задание, появившееся на Stackoverflow, по выводу изображения на консоль, с видом которого я еще не встречался. What Is The Logic Of This Pattern? Ниже представлено мною написанное решение этого задания. [pre2] #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; }[/pre2] Вывод программы на консоль может выглядеть, к примеру, следующим образом: [pre2] 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[/pre2]

Сыроежка: Вот еще одна интересная фигура, состоящая из чисел, которую нужно вывести на консоль. Соответствующее задание я встретил в следующем вопросе на Stackoverflow Advanced Number Pattern Пример изображения фигуры, которую нужно вывести на консоль: [pre2] 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 [/pre2] То есть числа выводятся в треугольнике по возрастанию в зигзагообразном порядке. Возможно, что решений этой задачи существует несколько, но два принципиальных подхода - это либо каждый раз вычислять заново значение очередного выводимого числа в требуемой позиции, либо вычислять это число рекурсивно относительно значения предыдущего выведенного числа. Второй подход выглядет проще. Ниже представлены две демонстрационные программы с моими оешениями. Первая программа вычисляет значение очередного выводимого числа рекурсивно относительно значения предыдущего выведенного числа, а потому фломула для вычисления выглядет проще. [pre2] #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; }[/pre2] Вывод программы на консоль может быть, к примеру, следующим: [pre2] 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[/pre2] Во второй программе очередное выводимое число вычисляется заново. [pre2] #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; }[/pre2] Вывод этой программы будет аналогичен выводу предыдущей демонстрационной программы.

Сыроежка: Встретил еще одно задание по выводу изображения некоторой фигуры на консоль на Stackoverflow, но, к сожалению, не могу предоставить ссылку на соответствующий вопрос, так как он, похоже, уже удален. Итак, требуется вывести следующую фигуру (например, для n равным 4): [pre2] 1 2 1 3 2 1 4 3 2 1. [/pre2] То есть фигура выводится с некоторым "наклоном". Ранее мне не приходилось сталкиваться с таким заданием. Ниже представлено решение на C. Высоту фигуры я ограничил числом 10Ю то есть высота фигуры должна быть меньше 10. Это ограничение введено мною для простоты, чтобы не рассчитывать максимальную ширину поля для выводимых чисел. [pre2] #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; }[/pre2] Вывод программы на консоль может выглядеть следующим образом. [pre2] 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[/pre2]

Сыроежка: Очередное задание, приведенное на сайте Stackoverflow, на вывод на консоль изображения "песочных часов", но на этот раз с помощью рекурсивной функции Draw hourglass recursively in C. Например, если высота фигуры задана числом 6, то фигура будет выглядеть следующим образом [pre2] ***** *** * * *** *****[/pre2] А для нечетного числа 5 фигура будет выглядеть как [pre2] ***** *** * *** *****[/pre2] Главное в решении этого задания - это вопрос о передачи значения отступа для вывода очередной строки фигуры от одного рекурсивного вызова функции к другому. Сделать это можно по крайней мере двумя способами. Первый способ состоит в объявлении в функции статической переменной, которая будет сохранять значение отступа от одного вызова функции к другому. Ниже приведена соответствующая демонстрационная программа. [pre2] #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; }[/pre2] Вывод программы на консоль, к примеру, может выглядеть следующим образом: [pre2] 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 [/pre2] Второй способ заключается в написание вспомогательной функции, которая и будет рекурсивной, и которая через дополнительный параметр будет передавать значение отступа, Вот, соответствующая демонстрационная программа. [pre2] #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; }[/pre2] Вывод этой программы на консоль будет выглядеть идентично выводу предыдущей программы. Это тот подход к решению задания, который был обозначен в соответствующем исходном вопросе на Stackoverflow.

Сыроежка: Вот еще один пример из вопроса на Stackoverflow в копилку вывода изображений различных фигур на консоль printing numeric pyramid in C starting with the highest number at top В данном случае форма выводимой фигуры следующая [pre2] 55 4554 345543 23455432 1234554321[/pre2] Ниже представлена программа, осуществляющая вывод такой фигуры на консоль. [pre2] #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; }[/pre2] Вывод программы, к примеру, может выглядеть следующим образом: [pre2] 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[/pre2]

Сыроежка: Для вывода данной фигуры на консоль [pre2] 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 [/pre2] требуются некоторые математические вычисления, чтобы уменьшить число циклов. Вот соответствующая программа на C++. [pre2] #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; }[/pre2] Чтобы понять формулу std::max( std::abs( n - i - 1 ) + 1, std::abs( n - j - 1 ) + 1 ), достаточно посмотреть ее значения при граничных значениях переменных i и j.



полная версия страницы