Есть ли лучший и более короткий способ моего цикла for?

#c #for-loop

#c #for-loop

Вопрос:

Я здесь новичок, и это мой первый вопрос. Я изучаю базовый c в Visual Studio 2019. Я изучаю функции и циклы.

У меня есть домашнее задание, которое нужно распечатать:

Я решил это с помощью своего кода из 30 строк. Но мне просто интересно, есть ли более короткий и лучший способ сделать это?

 using namespace std;
int main() 
{   
        for (int j = 0; j < 5; j  )
        {
            if (j == 1)
                break;
            cout << "*";
            cout << endl;
            if (j == 2)
                break;
            cout << "**";
            cout << endl;
            if (j == 3)
                break;
            cout << "***";
            cout << endl;
            if (j == 4)
                break;
            cout << "****";
            cout << endl;
            if (j == 5)
                break;
            cout << "*****";
            cout << endl;
        }
    return 0;
}

 

Комментарии:

1. Это вообще не цикл, а некоторые cout операторы, выполняемые последовательно. На второй итерации j == 1 и цикл будет завершен

2. Вы никогда не выполняете if (j == 5) break; условие.

3. @Caleth Он даже не попадает if (j == 2) , потому что он всегда break будет на второй итерации.

4. По какой-то причине я думал continue , что нет break

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

Ответ №1:

Вы допустили несколько ошибок в своем коде.

  • break операторы на самом деле должны быть continue операторами. break полностью завершает весь цикл (т. Е. В предоставленном вами коде не будет напечатано абсолютно ничего).
  • i == 5 никогда не может быть true , так как цикл завершается до того, как это произойдет (см. Условие i < 5 ).

Чтобы ответить на ваш вопрос, вы можете использовать вложенный цикл.

 for (int i = 0; i < 5; i  ) {
    for (int j = 0; j <= i; j  ) {
        std::cout << '*';
    }
    std::cout << std::endl;
}
 

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

 std::cout << "*n**n***n****n*****" << std::endl;
        
 

Комментарии:

1.О, endl всегда вставляет новую строку. Я виноват в неправильном прочтении документации.

2. @iwonderwhat Вложенный цикл Thisapidoes был моим решением. Однако мой код выполняется в Visual studio 2019, но я понял, что мой код — это ненужная работа. Большое спасибо за ваше объяснение.

Ответ №2:

Почему цикл? Вот та же логика в семи строках кода:

 int main() {
    std::cout << "*n";
    std::cout << "**n";
    std::cout << "***n";
    std::cout << "****n";
    std::cout << "*****n";
}
 

Честно говоря, это, вероятно, настолько коротко, насколько это возможно (если не считать втискивания всех выходных данных в один оператор).

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

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

 void print_stars(int n) {
    for (int i = 0; i < n;   i) {
        std::cout << "*";
    }
    std::cout << "n";
}

int main() {
    for (int i = 0; i < 5;   i) {
        print_stars(i   1);
    }
}
 

Комментарии:

1. вариация: std::cout << std::string('*', n) << "n";

2. @Caleth Это был бы следующий уровень. Я не хотел вводить в решение какие-либо новые концепции.

3. @Konrad Rudolph Мне нравится ваша функция void и цикл for. Я буду учиться этому. Большое спасибо за ваше объяснение.

Ответ №3:

 #include<iostream>
using namespace std;


int main(){
    for(int i = 1;i <= 5;i  ){
        for(int j = 1;j <= i;j  ){
            cout<<"*";
        }
        cout<<"n";
    }
}
 

Ответ №4:

 void printTrignleL(size_t n)
{
    for (size_t i = 0; i < n;   i) {
        std::cout << std::string(i   1, '*') << 'n';
    }
}