Выражение scanf("%d", &n)
попытается прочитать целое число в n
и, в случае успеха, вернет значение 1
(на самом деле, оно вернет количество успешно прочитанных вещей, но, поскольку вы только прося одну вещь, это самое большее, что вы вернетесь). Если это не удастся, вы получите что-то еще.
Следовательно, сравнение с 1
должно гарантировать, что это сработало. Если вы не получите 1
, что-то пошло не так.
Оператор printf( "%*d ", width, something)
на самом деле тесно связан с printf("%5d", something)
(который будет печатать поле шириной не менее пять символов ) но вместо фиксированной 5
вместо нее используется переменная width
.
Следовательно, два вызова printf
ниже эквивалентны:
int val = 42;
int wid = 5;
printf("%5d", val);
printf("%*d", wid, val);
С width
всегда кажется 1
в коде, который вы дали, я не уверен , почему это было сделано таким образом. Мне кажется, было бы проще использовать %d
в качестве спецификатора формата.
Если вы заинтересованы в более кратком и структурированном решении, вы можете найти это полезным. Не используйте это, если это образовательная работа, поскольку есть намерение научиться делать это самостоятельно, но полезно увидеть другой подход.
Этот код исключает логику c для выполнения одной строки, печать достаточного количества элементов до go от максимального значения до одного, а затем повторное резервное копирование (но установка минимального значения для печати на основе строки).
Затем основной код просто печатает достаточно строк, так что середина значение каждой строки изменяется от максимума до единицы, а затем снова увеличивается (в основном те же логики c, которые использовались для каждой строки).
#include <stdio.h>
// Code to print out a single line, values going from max down to min then back up.
static void outLine(int max, int min) {
for (int i = max; i > 0; i--) printf("%d ", i < min ? min : i);
for (int i = 2; i <= max; i++) printf("%d ", i < min ? min : i);
putchar('\n');
}
int main() {
while ( 1 ) {
// Get the value, <1 means stop.
int n;
printf( "\nEnter a non-negative number (< 1 = exit): " );
if ((scanf("%d", &n) != 1) || (n <= 0)) break;
// Do each line, max down to 1 then back up.
for (int i = n; i > 0; i--) outLine(n, i);
for (int i = 2; i <= n; i++) outLine(n, i);
}
return 0;
}
Стенограмма в соответствии с запросом:
pax> ./testProg
Enter a non-negative number (< 1 = exit): 2
2 2 2
2 1 2
2 2 2
Enter a non-negative number (< 1 = exit): 3
3 3 3 3 3
3 2 2 2 3
3 2 1 2 3
3 2 2 2 3
3 3 3 3 3
Enter a non-negative number (< 1 = exit): 4
4 4 4 4 4 4 4
4 3 3 3 3 3 4
4 3 2 2 2 3 4
4 3 2 1 2 3 4
4 3 2 2 2 3 4
4 3 3 3 3 3 4
4 4 4 4 4 4 4
Enter a non-negative number (< 1 = exit): -42