#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';
}
}