Начинающим изучение C++ описанный ниже материал может оказаться достаточно сложным для восприятия, хотя относится к примитивным.
В статье Цикл for в С++ для начинающих было предложено решить задачу вывода на экран последовательности натуральных чисел по убыванию или вывести на экран последовательность натуральных чисел по возрастанию. Суть той задачи в том, что в зависимости от введённых значений программа принимает решение: какие числа выводить на экран и в каком порядке.
Поскольку я сам начинающий, мной были испытаны определённые затруднения с решением этой задачи.
Если вы приложили много усилий, но так и не поняли, как это реализовать, то, может быть, предложенное решение поможет проанализировать упущенные моменты и закрепить уже полученные знания о работе с циклом for, и вы продвинетесь на небольшой шажок к настоящему профессионализму.
Ввести в программу 2 числа: начало и окончание последовательности — и ввести интервал последовательности, после чего вывести последовательность натуральных чисел, разреженную определённым интервалом на экран.
Как-то так звучит то задание.
Например:
вводим 1 и 5 интервал 1, результат вывода на экран: 1 2 3 4 5
вводим 2 и 100 интервал 2, результат вывода на экран: 2 4 6 8 … 100 (кратное 2)
вводим 5 и 1 интервал 1, результат вывода на экран: 5 4 3 2 1
вводим 1 и 10 интервал 2, результат вывода на экран: 1 3 5 7 9 10
Если суть задачи ясна, то смотрите исходный код:
C++
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
//Borland C++ 3.1 Решение задачи Цикл for
#include <iostream.h>
#include <conio.h>
intmain()
{
clrscr();
inta,b,flag,interval;// определяем необходимые переменные
inti;//счетчик
for(flag=0;flag<1;)// переменная для проверки хотим ли мы завершить программу
{
cout<<"Wwedi a: ";
cin>>a;//Начальное значение
cout<<"Wwedi b: ";
cin>>b;//Конечное значение
cout<<"Wwedi interval: ";
cin>>interval;// Определяем интервал
if(a>b)
{
for(i=a;i>=b;i-=interval)
{
cout<<i<<" ";
}
cout<<"\n";
}
if(a<b)
{
for(i=a;i<=b;i+=interval)
{
cout<<i<<" ";
}
cout<<"\n";
}
cout<<"\n";
cout<<"povtorit' ? 0 = da ";
cout<<"\n";
cin>>flag;
}//Конец for
}
Что можно сказать по коду? В коде описан один внешний цикл-for. Код, повторяемый этим внешним циклом, можно разделить на 4 независимые составляющие:
1. Ввод значений с клавиатуры.
2. Проверка значений условием "больше".
3. Проверка значений условием "меньше".
4. Проверка на желание выйти.
Условиями 2 и 3 определяется поведение программы: при одном условии поведение одно, при другом условии другое. Внутри условий описаны внутренние циклы-for. Эти внутренние циклы-for вложены в условия, а условия вложены во внешний цикл-for. Своеобразная матрёшка. Таким образом получается, что цикл вложен в цикл. Циклы в C++ можно вкладывать в циклы. Можно делать бесконечно большую матрёшку, но обычно хватает небольшой вложенности. Если решаемая задача требует очень большой вложенности циклов, то, возможно, вы должны пересмотреть подход к решению задачи.
В нашем случае внешний цикл описывается только для того, чтобы пользователь мог выбрать, стоит ли ему продолжать работу. Постоянно запускать программу не очень выгодно. Если вы играете в игру и после каждой неудачи игра закрывается, а вам не только загружать сэйв, но и запускать игру — не комфортно ведь. Для внешнего цикла была опредена переменная, получившая себе имя flag. Транслитерацию для именования использовать не очень хорошо, имеет смысл учиться давать англоязычные имена: так и английский немного подтягивается, и более опытным проще понять, если переменная своим именем передаёт смысл своего существования.
Внутри круглых скобок используется три параметра, третий параметр — пустой параметр
C++
1
for(flag=0;flag<1;)
Внешний цикл-for будет выполняться до тех пор, пока переменная flag не примет значение цифру не ноль. Если сделать неаккуратный ввод, например, ввести символ-букву, то программа собъётся, тонкости C++. Значение флага можно изменять внутри круглых скобок и внутри фигурных скобок. Одновременно изменять и там и там допускается правилами языка, но делать такое крайне плохо. Либо вы или пользователь вашей программы изменяете переменную: ваша территория внутри фигурных скобок; либо цикл-for изменяет переменную: его территория внутри круглых скобок. Поскольку переменная flag определена нами для пользователя, изменяем мы её внутри фигурных скобок. Дальше всё просто: если флаг ноль, то продолжаем, если любая другая цифра — выходим.
Определение вами смысла остальных переменных должно произойти без проблем. a, b – начальное значение и последнее значение (своего рода границы нужного диапазона). i – счетчик
Надеюсь, всё остальное, не написанное мной тут, вам ясно и без моей помощи. В принципе, я всё старался расписать в темах предшествующих этой.
Этот материал нужен для того, чтобы вы могли получить представление о работе счетчика внутри цикла-for и понять сам принцип циклических вычислений. Скромный багаж знаний, полученный до этого момента, может хорошо поспособствовать вам в решении некоторых несложных задач.
Постарайтесь понять эту тему – без понимания знаний не будет. Циклические вычисления требуются невероятно часто.
6 комментариев на «“Программа, выводящая на экран числа с определенным интервалом в порядке возрастания (в порядке убывания)”»
ну в 15 строке у вас кавычка потеряна.
\n — не всегда верно, тем более раз пользуетесь плюсами то и пишите endl
зачем использовать фор когда есть вайл
в вашем случае проще было сделать так
C++
1
2
3
4
5
6
7
8
inti,flag=1;
while(flag)
{
//ввод данных
if(b==a)&&((i==b)&&(i<=a);i+=interval)
cout<<i<<" ";
cout<<endl<<"povtorit' ? (0-net)"<>flag;
}
Автор сайта отвечает:
что значит не всегда верно? Это всегда перенос строки.
и что значит ”если плюсами”? endl используют не потому что плюсы, а или потому что не видят и не понимают разницы или потому что нужно выполнить очистку буфера потока после переноса строки. И вообще ленивым \n меньше букв.
зачем использовать for? потому что известен предел. Циклы for и while в этой задаче взаимозаменяемы, но если изначально известно конечное, тогда обычно используют for, а иначе while. В примере конечное известно.
у вас в примере ошибки (опечатки),
да и читается он тяжело.
Автор сайта отвечает:
Ну там еще одна, но у меня на сайте их всё равно больше.
Я здесь просто съерничал. А читается этот кусочек некоторыми начинающими глазами правда тяжело. Судите не только по себе.
Я только сегодня начал изучать программирование! По ком мне судить?
Автор сайта отвечает:
изучайте) не судите.
хорошо, что для вас легко читается.
стиль у меня написания не прощеписания, а максимальной отдачи информации даже тяжело вникающим людям.
когда человек полностью врубается в сам принцип, то ему несложно упростить код дальше так, как ему удобно.
я вот такой упрощенный код покажу, например в статье, а кто-то не сообразит, что это условие можно внутри цикла разбить на части. Потом будет у него какое-то сложное условие в задаче и он будет стараться запихать его как в таком примере “прощеписания”, и чем сложнее условие, тем больше у него трудностей возникнет.
В конкретном случае пример Максима, может, и более правильный, чем мой. Тяжелее только в понимании порядка действий работы компилятора (несложно, но есть такое дело).
Вот и всё.
Автору сайта большое спасибо! Рад за Максима, что он все «ловит на лету», но Админ прав, в таком объеме информации вполне возможны опечатки, а написание кода у Админа читается легко и понятно!!! Максиму спасибо за найденные опечатки!
для чего нужен
в 16, 18, 20 и 22 строчке и почему n не где не определили
ну в 15 строке у вас кавычка потеряна.
\n — не всегда верно, тем более раз пользуетесь плюсами то и пишите endl
зачем использовать фор когда есть вайл
в вашем случае проще было сделать так
Нормально читается, а ошибка разве что
Я только сегодня начал изучать программирование! По ком мне судить?
Автору сайта большое спасибо! Рад за Максима, что он все «ловит на лету», но Админ прав, в таком объеме информации вполне возможны опечатки, а написание кода у Админа читается легко и понятно!!! Максиму спасибо за найденные опечатки!
Я только не понял что означает & ? И для чего оно там, всё остальное понял.
мсвтупил нно не во все
основа понятна