#c #loops #for-loop
#c #циклы #для цикла
Вопрос:
Я написал эту программу,
include <stdio.h>
int main(){
int size = 5;
int row;
int col;
for (col=0; col<size; col ){
for (row=0; row<col;row ){
printf(" ");
}
for (row=0; row <(size-col) ; row ){
printf("*");
if(col<=size){
printf("*");
}
}
printf("n");
}
return 0;
}
Это должно сделать треугольник как
*********
*******
*****
***
*
Но вместо этого в каждой строке есть один дополнительный *. В чем проблема?
Большое спасибо!
Комментарии:
1. Вы используете переменные
col
androw
в обратном порядке. Я просто указываю на это, поскольку вы, похоже, учитесьC
.2. черт возьми, правда? Я полностью согласен, что кажется глупым называть их чем-то, что относится конкретно к строке или столбцу, когда на самом деле это просто переменные, которые помогают вам изменять количество пробелов и звездочек. если вы можете уточнить, я был бы очень благодарен. черт, я действительно потрясен, хотя я отправил его, и мне интересно, получу ли я за это очки стиля. Спасибо
3. @colle: я бы больше боялся разозлить Древних Богов Непоследовательным отступом от их Сна.
4. Привет, missingno, мне так и не удалось поймать тебя на синем. Однажды… Со всей серьезностью, я надеюсь, что вы не имеете в виду эту программу! Отступы кажутся мне правильными, по крайней мере, если это неправильно, я оставался неверно согласованным на протяжении всей программы. Если есть проблема, скажите мне, как я мог бы улучшить. Спасибо
5. @colle: Да, отступ вашей программы … извините… ужасно. В любом случае, что я имел в виду под
col
иrow
, так это то, что вы перебираете строки во внешнем цикле, но вы вызываете переменную итератораcol
. Затем во внутреннем цикле, где вы перебираете столбцы одной конкретной строки, вы вызываете переменную итератораrow
.
Ответ №1:
У Mystical есть решение для способа печати двух звездочек за итерацию. Использование идентификаторов row
и col
в вашем примере также делает вещи более запутанными, чем просто i
и j
, тем более, что внешний цикл на самом деле является вашей текущей строкой.
Альтернативой вашему беспорядку является (я надеюсь, что это не домашнее задание, поскольку оно не помечено как таковое):
int main(void)
{
int size = 5;
int i, j;
for (i = size; i > 0; i--) {
for (j = i; j < size; j )
putchar(' ');
for (j = 0; j < i*2 - 1; j )
putchar('*');
putchar('n');
}
return 0;
}
Вы также можете ввести i*2 - 1
переменную, чтобы она не вычислялась на каждой итерации цикла (если только компилятор не видит, что вы не изменяете i
).
Комментарии:
1. 1 за реструктуризацию программы в гораздо более понятный формат!
Ответ №2:
Изменение
if(col<=size){
Для
if((row % size) > 0){
также будет иметь тот же эффект.
Ответ №3:
Как насчет печати * вот так
for (row=0; row<(9-2*col); row )
printf("*");
printf("n");
Это выведет девять из первой строки, семь во второй и т.д.
Ответ №4:
Разложите вашу проблему на соответствующие переменные и дайте им значимые имена. Это улучшит читаемость кода и упростит исправление ошибок, например:
#include <stdio.h>
void triangle(int height)
{
int row, col;
int width = (2 * height) - 1;
for (row = 0 ; row < height ; row )
{
for (col = 0 ; col < width ; col )
{
if (row > col)
{
putchar(' ');
}
else if (col < width - row)
{
putchar('*');
}
}
puts("r");
}
}
int main(void)
{
triangle(5);
return 0;
}
Ответ №5:
Никто не упоминал о рекурсии? Это не совсем чисто, потому что вам нужно отслеживать глубину. Я назвал это пирамидой (pyr_) вместо треугольника:
#include <stdio.h>
#include <stdlib.h>
static void pyr_line(int depth, int nrows) {
int i;
if (nrows == 0) return;
for (i=0; i<depth; i )
printf(" ");
for(i=0; i<(2*(nrows-1) 1); i )
printf("*");
printf("n");
pyr_line(depth 1, nrows-1);
}
int main(int argc, char ** argv)
{
pyr_line(0, atoi(argv[1]));
return 0;
}