Оператор с предусловием: (while)
Цикл с постусловием: (do…while)
for (иниц-я;усл.;изм)
{
оператор_1;
оператор_2;
…
оператор_n;
}
while (условие)
{
оператор_1;
оператор_2;
…
оператор_n;
}
do{
оператор_1;
оператор_2;
…
оператор_n;
}
whileусловие;
Если известно точное количество действий (итераций) цикла, то можем использовать цикл for.
Семантика:
1. Инициализация используется для объявления и присвоения начальных значений величинам, используемым в цикле. В этой части можно записать несколько операторов, разделенных запятой.
2. Вычисляется выражение, задающее условие окончания цикла. Если условие истинно, то выполняются операторы тела цикла.
3. После выполнения блока производится приращение счетчика и снова проверяется условие. Если оно по-прежнему истинно, блок кода выполняется повторно. Этот процесс продолжается до тех пор, пока не перестает выполняться условие.
Пример кодаНапишем программу, которая будет считать сумму всех чисел от 1 до 10.
#include
using namespace std;
int main()
{
int i; // счетчик цикла
int sum = 0; // сумма чисел от 1 до 10.
for (i = 1; i <= 10; i++)
// задаем начальное значение 1, конечное 10 и задаем шаг цикла - 1.
{
sum = sum + i;
}
cout << "Сумма чисел от 1 до 10 = " << sum << endl;
return 0;
}
Если скомпилировать этот код и запустить программу, то она покажет нам ответ: 55. Это и есть сумма всех целых чисел от 1 до 10.
Заметьте, что конечное значение счетчика задано нестрогим неравенством ( <= — меньше либо равно), поскольку, если поставить знак меньше, то цикл произвел бы 9 итераций, т.е. на одну меньше, чем требуется. Значение шага цикла задано равное единице. i++ — это тоже самое, что и i = i + 1.
В теле цикла, при каждом проходе программа увеличивает значение переменной sum на единицу. Еще один очень важный момент — в начале программы переменной sum присвоено значение нуля. При объявлении переменной без ее инициализации эта переменная будет хранить «мусор».
Естественно к мусору мы ничего прибавить не можем. Некоторые компиляторы, такие как gcc, инициализирует переменную нулем при ее объявлении.
Когда мы не знаем, сколько итераций должен произвести цикл, нам понадобится цикл while или do...while.
Семантика:
1. Вычисляется значение условия.
2. Если условие истинно, то выполняются операторы тела цикла и повторяется шаг 1.
3. Если условие ложно, то цикл завершается и происходит переход к следующему за while оператору.
Данный цикл будет выполняться, пока условие, указанное в круглых скобках является истиной.
Решим ту же задачу с помощью цикла while. Хотя здесь мы точно знаем, сколько итераций должен выполнить цикл, очень часто бывают ситуации, когда это значение неизвестно.
Ниже приведен исходный код программы, считающей сумму всех целых чисел от 1 до 10.
#include
using namespace std;
int main()
{
int i = 0; // инициализируем счетчик цикла.
int sum = 0; // инициализируем счетчик суммы.
while (i < 10)
{
i++;
sum += i;
}
cout << "Сумма чисел от 1 до 10 = " << sum << endl;
return 0;
}
После компиляции программа выдаст результат, аналогичный результату работы предыдущей программы.
Теперь давайте рассмотрим по порядку исходный код нашей программы. Сначала мы инициализируем счетчик цикла и переменную, хранящую сумму чисел.
В данном случае мы обязательно должны присвоить счетчику цикла какое-либо значение, т.к. в предыдущей программе мы это значение присваивали внутри цикла for, здесь же, если мы не инициализируем счетчик цикла, то в него попадет «мусор» и компилятор выдаст ошибку.
Затем мы описываем условие цикла — «пока переменная i меньше 10 — выполняй цикл». При каждой итерации цикла значение переменной-счетчика i увеличивается на единицу внутри цикла.
Когда выполнится 10 итераций цикла, счетчик станет равным 9 и следующая итерация уже не выполнится, поскольку 10 не меньше 10. Выражение sum += i является укороченной записью sum = sum + i.
После окончания выполнения цикла, выводим сообщение с ответом.
Цикл do while
Семантика:
- Выполняются операторы тела цикла.
- Вычисляется значение условия.
- Если условие ложно, то повторяется шаг 1.
- Если условие ложно, то цикл завершается и происходит переход к следующему за do оператору.
Цикл do while очень похож на цикл while. Единственное их различие в том, что при выполнении цикла do while один проход цикла будет выполнен независимо от условия. Решение задачи на поиск суммы чисел от 1 до 10, с применением цикла do while.
#include
using namespace std;
int main ()
{
int i = 0; // инициализируем счетчик цикла.
int sum = 0; // инициализируем счетчик суммы.
do {// выполняем цикл.
i++;
sum += i;
}
while (i < 10); // пока выполняется условие.
cout << "Сумма чисел от 1 до 10 = " << sum << endl;
return 0;
}
Итерационными (пошаговыми) алгоритмами называются алгоритмы, в которых на каждом шаге используется одна и та же формула, выраженная через значения, полученные на предыдущих шагах алгоритма.
Синтаксис цикла с предусловием. Опишите работу цикла. Пример.
Формат оператора цикла с предусловием:
while (выражение) оператор;
Цикл повторяет свое выполнение, пока значение выражения отлично от нуля, т.е. заключенное в нем условие цикла истинно.
В качестве примера использования оператора цикла рассмотрим программу вычисления факториала целого положительного числа N!.
Пример 1.
Программа на Си++
// Программа вычисления факториала
#include <iostream.h>
void main ()
{ long int F;
int i, N;
cout<<"N="; сin>>N;
F=i=1;
while(i<=N) F=F*i++;
cout<<"\n"<<N<<" !="<<F;
}
Еще один пример использования оператора цикла while. Вернемся к задаче итерационного вычисления суммы гармонического ряда: 1+1/2+1/3+.. с заданной точностью e.
Пример 2.
// Сумма
//гармонического ряда
#include <iostream.h>
#include <limits.h>
void main()
{int n=1;
double S=0, eps;
cout<<"Точность: " ;
cin>>eps;
while(1.0/n>eps &&
n<INT_MAX)
S+=1./n++;
Cout<<"\nCyммa="<<S;
}
Синтаксис цикла с постусловием. Опишите работу цикла. Пример.
Формат оператора цикла с постусловием:
do оператор while (выражение);
Пример 3.
// Программа
вычисления факториала
#include <iostream.h>
void main ()
{ long int F;
int i, N;
cout<<"N="; cin>>N;
F=i=1;
do F*=i++;
while(i<=N);
cout<<"\n"<<N<<" !<<F;
}
Синтаксис цикла с параметром. Опишите работу цикла. Пример.
Формат оператора цикла с параметром:
for (выражение_1; выражение_2; выражение_3)
оператор;
Обратите внимание на то, что после вычисления выражения 3 происходит возврат к вычислению выражения 2 -проверке условия повторения цикла.
С помощью цикла for нахождение N!можно организовать следующим образом:
F=1;
for(i=1; i<=N; i++) F=F*i;
Используя операцию «запятая», можно в выражение 1 внести инициализацию значений сразу нескольких переменных:
for(F=1, i=l; i<=N; i++) F=F*i;
Некоторых элементов в операторе for может не быть, однако разделяющие их точки с запятой обязательно должны присутствовать. В следующем примере инициализирующая часть вынесена из оператора for:
F=1;
i=1;
for(; i<=N; i++) F=F*i;
Ниже показан еще один вариант вычисления N!. В нем на месте тела цикла находится пустой оператор, а вычислительная часть внесена в выражение 3.
for(F=1, i=1; i<=N; F=F*i, i++);
Этот же оператор можно записать в следующей форме:
for(F=1, i=1; i<=N; F*=i++);
В языке Си оператор for является достаточно универсальным средством для организации циклов. С его помощью можно программировать даже итерационные циклы, что невозможно в Паскале. Вот пример вычисления суммы элементов гармонического ряда, превышающих заданную величину e:
for(n=1, S=0; 1.0/n>eps && n<INT_MAX; n++) S+=1.0/n;
И наконец, эта же самая задача с пустым телом цикла:
for(n=1, S=0;1.0/n>eps && n<INT_MAX; S+=1.0/n++);
Следующий фрагмент программы на Си++ содержит два вложенных цикла for. В нем запрограммировано получение на экране таблицы умножения.
for(х=2; х<=9; х++)
for(y=2; y<=9; y++)
cout<<"\n"<<x<<"*"<<y<<" = "<<x*y;
Опишите работу оператора continue. Опишите работу оператора goto. Пример.
Если выполнение очередного шага цикла требуется завершить до того, как будет достигнут конец тела цикла, используется оператор continue. Следующий фрагмент программы обеспечивает вывод на экран всех четных чисел в диапазоне от 1 до 100.
for(i=1; i<=100; i++)
{if (i%2) continue; cout<<"\t"<<i; }
24) Определение функции в С++. Формат обращения к функции в С++. Прототип функции. Пример.
Функция является основной программной единицей в Си, минимальным исполняемым программным модулем.
Вот программа решения этой задачи с использованием вспомогательной функции.
Пример 1.
#include <iostream.h>
//Определение вспомогательной функции
Int MAX(int x, int у)
{ if (x>y) return х;
else returnу;
}
//Основная функция
void main()
{ inta,b,c,d;
Cout<<”Введите a,b,c:”;
Cin>>a>>b>>c;
d=MAX(MAX(a,b),c);
Cout<<”\nmax (a, b, c) = <<d;
}
Формат определения функции следующий:
тип__имя_функции (спецификация__параметров)
{тело_функции}
Тип функции — это тип возвращаемого функцией результата. Если функция не возвращает никакого результата, то для нее указывается тип void.
Имя функции — идентификатор, задаваемый программистом или main для основной функции.
Спецификации параметров — это либо «пусто», либо список имен формальных параметров функции с указанием типа для каждого из них.
Тело функции — это либо составной оператор, либо блок.
Формат обращения к функции (вызова функции) традиционный:
имя_функции (список_фактических_праметров) ;
Вызов функции с переменным числом параметров. Пример.
Параметры, их количество и типы, становятся известны только во время вызова функции. Формат описания функций с переменным числом параметров:
<тип> <имя> (<список явных параметров>, …) { <тело функции> } |
Здесь:
<тип> – тип возвращаемого значения,
<список параметров> – список параметров известных до вызова функции.
При создании функций с переменным числом параметров необходимо предусмотреть способ определения количества параметров и их типов. Используется для этих целей два способа:
· один из параметров определяет число параметров функции;
· в списке явных параметров задается параметр, указывающий на конец списка параметров.
Если не один из этих способов не используется, тогда можно использовать специальный набор макроопределений.
Параметры функции помещаются в стек, при этом первый параметр оказывается в вершине стека. Переход от одного параметра к другому осуществляется с помощью указателей.
Пример 1. Задание числа дополнительных параметров с помощью первого параметра. Функция вычисляет сумму значений дополнительных параметров. Список явных параметров состоит из одного параметра, который задает число дополнительных параметров.
#include <stdio.h> #include <conio.h> #include <iostream> void main() { i int sum(int n,...); //прототип функции с переменным // числом параметров cout << "\n 4+6=" << sum(2,4, 6); cout << "\n 1+2+3+4+5+6=" << sum(6,1,2,3,4,5,6); cout << "\n Parametrov net.Summa ravna:" << sum(0); getch(); } int sum(int n,...)//n-число суммируемых параметров { int s=0; int *p = &n; //получение адреса параметров в стеке for(int i=1; i<=n; i++) s+=*++p; //суммируем числа return s; } |