Будь умным!


У вас вопросы?
У нас ответы:) SamZan.net

схема алгоритма- Оператор С имеет вид- while выражение оператор; Работает цикл так- Вычисляется зна

Работа добавлена на сайт samzan.net:


2.7. Алгоритмы циклической структуры

Циклический процесс или просто цикл это повторение одних и тех же действий.

Последовательность действий, которые повторяются в цикле, называют телом цикла.

Один проход цикла называют шагом или итерацией.

Переменные, которые изменяются внутри цикла, и влияют на его окончание, называются параметрами цикла.

Оператор цикла с предусловием

Блок-схема алгоритма:

Оператор С++ имеет вид:

while (выражение) оператор;

Работает цикл так:

Вычисляется значение выражения. Если оно истинно (0), выполняется оператор. В противном случае цикл заканчивается, и управление передается оператору, следующему циклом. Выражение вычисляется перед каждой итерацией цикла. Если при первой проверке выражение = 0, цикл не выполнится ни разу.

Если тело цикла состоит более чем из одного оператора, используют составной оператор:

while (условие)

{

оператор 1;

оператор n;

}

Пример 1. Вывести на экран таблицу значений функции y=esin(x)cos(x) на отрезке [0;] с шагом 0.1.

#include <iostream.h>

#include <math.h>

#define PI 3.14159

int main()

{

float x, y;

x=0;

while (x<=PI) //Цикл с предусловием.

{

y=exp(sin(x))*cos(x);

cout<<x<<"\t"<<y;

x+=0.1;

} //Конец цикла.

}

Оператор цикла с постусловием

Блок-схема:

В С++ реализован конструкцией:

do оператор while (выражение);

Работает цикл так:

Выполняется оператор, представляющий собой тело цикла.Вычисляется значение выражения. Если оно истинно (≠0), оператор тела цикла выполняется еще раз. В противном случае цикл завершается, и управление передается оператору, следующему за циклом.

Цикл с постусловием всегда будет выполнен хотя бы один раз, в отличие от цикла с предусловием, который может не выполниться ни разу.

Если тело цикла состоит более чем из одного оператора, то используют составной оператор:

do

{

оператор_1;

оператор_n;

}

while (выражение);

Пример 2. (условие см. в ПРИМЕР 1).

#define PI 3.14159

int main()

{

float x=0, y;

do   //Цикл с постусловием.

{

y=exp(sin(x))*cos(x);

cout<<x="\t"<<y<<endl;

x+=0.1;

}

while(x<=PI);  //Конец цикла

}

Оператор цикла с параметром

for (начальные_присваивания;

      выражение; приращение)

оператор;

здесь

начальные_присваивания – оператор или группа операторов, которые выполняются один раз в начале цикла; применяются для присвоения начальных значений величинам, используемым в цикле, в том числе параметру цикла;

выражение – определяет условие выполнения цикла, если значение выражения истинно (≠0), то цикл выполняется;

приращение – оператор или группа операторов, которые выполняются после каждой итерации и служат для изменения параметра цикла;

оператор – любой оператор языка, представляющий собой тело цикла.

Приращение или оператор должны влиять на условие, иначе цикл никогда не закончится. Любой из трех параметров в записи оператора for может отсутствовать, но при этом точки с запятой должны оставаться на своих местах.

Если приращение или начальные_присваивания это не один оператор, а группа, то они отделяются запятой. Здесь запятая это операция последовательного выполнения.

Алгоритм работы цикла for:

1. Выполняются начальные_присваивания.

2. Вычисляется значение выражения, если оно ≠0(true), то выполняется переход к п.3. В противном случае, выполнение цикла завершается.

3. Выполняется оператор.

4. Выполняется оператор приращение и осуществляется переход к п.2, то есть опять вычисляется значение выражения и т.д.

Этот алгоритм представляет собой цикл с предусловием:

В дальнейшем в блок-схемах цикл for будем изображать так:

Если тело цикла состоит более чем из одного оператора, используют составной оператор:

for (начальные_присваивания;

         выражение; приращение)

{

оператор_1;

оператор_n;

}

Пример 3. (условие см. ПРИМЕР 1).

#define PI 3.14159

int main()  //Вариант 1

{

float x, y;

for (x=0;x<=PI; x+=0.1)

{

y=exp(sin(x))*cos(x);

   cout<<x<<"\t"<<y<<endl;

 }

}

int main()   //Вариант 2

{float x, y;

for (x=0;x<=PI; y=exp(sin(x))*cos(x),

   cout<<x<<"\t"<<y<<endl,

      x+=0.1);}

int main()  //Вариант 3

{

float x=0, y;

for (;x<=PI;)

{

y=exp(sin(x))*cos(x);

   cout<<x<<"\t"<<y<<endl;

x+=0.1;

 }

}

Операторы передачи управления 

принудительно изменяют порядок выполнения команд.

Оператор goto метка, применяют для безусловного перехода, он передает управление оператору2:  

метка: оператор;

Оператор break осуществляет немедленный выход из циклов while, dowhile, for и из оператора выбора switch. Управление передается оператору, находящемуся непосредственно за циклом или оператором выбора.

Оператор continue начинает новую итерацию цикла, даже если предыдущая не была завершена.

Оператор return выражение завершает выполнение функции и передает управление в точку ее вызова.

2.8. Решение задач с использованием циклов

Задача 1. Составить таблицу значений функции y=esin(x)cos(x) на отрезке [xn;xk] с шагом dx. Найти сумму положительных и произведение отрицательных значений y.

Входные данные:

начальн. значение аргумента – xn,

конечн. значение аргумента – xk,

шаг изменения аргумента – dx.

Выходные данные: 

множество значений X и Y;

сумма S значений Y;

произведение P значений Y.

Накапливание суммы значений

Для сложения нескольких чисел результат суммирования нужно накапливать в определенном участке памяти, например S.

Для выполнения первого оператора накапливания суммы из участка памяти необходимо взять такое число, которое не влияло бы на результат сложения, т.е. нуль S=0.

Далее, из переменной S считывается предыдущее значение суммы и к нему прибавляется следующее слагаемое S = S + Y.

Накапливание произведения значений

При умножении нескольких чисел произведение также накапливается в определенном участке памяти, например P.

Для выполнения первого оператора из участка памяти необходимо взять такое число, которое не влияло бы на результат умножения, т.е. единицу P = 1.

Далее, из переменной P считывается предыдущее значение и умножается наследующее P = P * Y.

Алгоритм решения задачи 1.

Текст программы с оператором while.

#include <stdio.h>

#include <math.h>

int main()

{

float xn, xk, dx, x, y, s, p;

printf("Введите xn,xk,dx");

scanf("%f%f%f",&xn,&xk,&dx);

s=0;p=1;x=xn;

while(x<=xk)

{

y=exp(sin(x))*cos(x);

printf("X=%g\tY=%g\n",x,y);

if (y>=0) s+=y;

else p*=y;

x+=dx;

}

printf("S=%g\tP=%g\n",s,p);

}

Фрагмент программы с оператором for.

for(s=0,p=1,x=xn;x<=xk;x+=dx)

{

y=exp(sin(x))*cos(x);

printf("X=%g\tY=%g\n",x,y);

if (y>=0) s+=y;

else p*=y;

}

printf("S=%g\tP=%g\n",s,p);

Фрагмент программы с do-while.

s=0;p=1;x=xn;

do

{

y=exp(sin(x))*cos(x);

printf("X=%g\tY=%g\n",x,y);

if (y>=0) s+=y;

else p*=y;

x+=dx;

}

while(x<=xk);

printf("S=%g\tP=%g\n",s,p);

Задача 2. Составить таблицу значений функции y=3cos(x2) на отрезке [xn;xk] с шагом dx. Вывести на печать каждую вторую пару значений x и y. Найти среднее арифметическое ненулевых значений y.

Входные данные:

начальн. значение аргумента – xn,

конечн. значение аргумента – xk,

шаг изменения аргумента – dx.

Выходные данные: 

множество значений аргумента X и Y;

S – среднее значение Y;

Вспомагательные переменные:

K – количество значений Y;

iномер выводимых значений.

При вычислении количества значений практически происходит суммирование единиц. Поэтому, для выполнения первого оператора накапливания ячейка обнуляется, K=0.

Далее, K = K + 1.

Алгоритм решения задачи 2.

#include <iostream>

#include <math.h>

int main()

{

   float xn, xk, dx, s, x, y; int i, k;

   cout<<"Xn=";cin>>xn;

   cout<<"Xk=";cin>>xk;

   cout<<"Dx=";cin>>dx;

   for(s=0,k=0,x=xn;x<=xk;x+=dx)

   {

y=3*cos(x*x);

if (++i%2==0)

cout<<"X="<<x<<"\t Y="<<y<<"\n";

if (y!=0) {s+=y; k++;}

   }

cout<<"S="<<s/k;

}

Задача 3. Найти наибольшее значение функции y=3cos(x2). Функция задана на отрезке [xn;xk] с шагом dx.

Входные данные:

начальн. значение аргумента – xn,

конечн. значение аргумента – xk,

шаг изменения аргумента – dx.

Выходные данные:

Max – наибольшее значение Y;

Вспомагательные переменные:

iномер текущего значения Y.

Вычисление наибольшего значения

Алгоритм решения задачи 3.

Для вычисления наименьшего значения в алгоритме достаточно изменить знак.

#include <iostream>

#include <math.h>

int main()

{

   float xn, xk, dx, Max, x, y; int i;

   cout<<"Xn=";cin>>xn;

   cout<<"Xk=";cin>>xk;

   cout<<"Dx=";cin>>dx;

   for(i=0,x=xn;x<=xk;x+=dx)

   {

y=3*cos(x*x);

if (++i==1) Max=y;

else if (Max<y) Max=y;

cout<<"X="<<x<<"\t Y="<<y<<endl;

}

cout<<"Max="<<Max<<endl;

}

ЗАДАЧА 4. Вычислить факториал числа N (N!=123 …N).

Дано: N целое число.

Найти: factorial (целое) N!: произведение чисел от 1 до N.

i (целое) – параметр цикла.

Алгоритм решения задачи:


#include<iostream.h>

void main()

{int i,N,factorial;

cout <<"N="; cin>>N;

for (factorial=1,i=2;i<=N;factorial*=i,i++);

cout<<"factorial="<<factorial;

}

ЗАДАЧА 5. Вычислить сумму натуральных четных чисел, не превышающих N.

Дано: N целое число.

Найти: S сумма четных чисел.

i – принимает значения 2, 4, 6 … N.

#include<iostream.h>

void main()

{ int i,N,S; cout <<"N="; cin>>N;

for (S=0,i=1;i<=N;S+=i,i+=2);

cout << "\n S=" << S; }

ЗАДАЧА 6. Вычислить сумму ряда , при x=1.2, N=10.

#include <iostream>

#include <math.h>

int main()

{int N=10, i; float x=1.2, s,p=-1,f=1;

for (i=1;i<=N;p=-p,f=f*2,s+=p*sin(x)/f,i++);

cout<<"s="<<s<<endl;

}

ЗАДАЧА 7. Дано натуральное число N. Определить Кколичество делителей этого числа, не включая само число.

Например, для N=12 делители: 1, 2, 3, 4, 6. Т.о. K=5.

Дано: N.

Найти: K.

#include<iostream.h>

void main()

{

int i,N,K;

cout <<"\n N="; cin  >>N;

for (K=0,i=1;i<=N/2;i++)

    if(N%i==0) K++;

cout << "\n K=" << K;

}

ЗАДАЧА 8. Дано натуральное число N. Определить, является ли оно простым.

Натуральное число N называется простым, если оно делится нацело без остатка только на единицу и на само себя.

Число 13 – простое (1 и 13).

Число 12 не является простым, так как делится на 1, 2, 3, 4, 6,12.

Дано: N целое число.  

Выходные данные: сообщение.

Промежуточные данные: 

i – параметр цикла (возможные делители числа N).

#include<iostream.h>

void main()

{int i,N,Pr;

cout <<"\n N="; cin  >>N;

for (Pr=1,i=2;i<=N/2;i++)

      if(N%i==0) {Pr=0; break;}

if (Pr==1) cout << "N-prostoe";

else cout << "N-ne prostoe";

}

ЗАДАЧА 8. Поступает последовательность из N вещественных чисел. Определить наибольший элемент последовательности.

Входные данные:

N целое число;

Х – вещественное число, определяет текущий элемент последовательности.

Выходные данные: 

Max – вещественное число, элемент последовательности с наибольшим значением.

Промежуточные переменные: 

i – параметр цикла, номер элемента последовательности.

#include <iostream>

int main()

{ unsigned int i,N; float X,Max;

cout<<"N="; cin>>N;

cout<<"X="; cin>>X;

for (Max=X,i=2,Max=X;i<=N;i++)

{cout<<"X="; cin>>X;

if (X>Max) Max=X; }

cout<<"Max="<<Max<<"\n";

}

ЗАДАЧА 9. Определить сколько раз последовательность из N произвольных чисел меняет знак.

#include <iostream>

int main()

{

float A,B;

int i,K=0,N;

cout<<"N=";cin>>N;

cout<<"A=";cin>>A;

for (i=2;i<=N;i++)

{

  cout<<"B=";cin>>B;

  if (A*B<0) K++;

  A=B;

}

cout<<"K="<<K<<"\n";

}

ЗАДАЧА 10. Вводится последовательность целых чисел, 0 – конец последовательности. Найти наименьшее число среди положительных.

#include <iostream>

int main()

{float N,Min; int K;

for (cout<<"N=",cin>>N,K=0; N!=0;

                                cout<<"N=",cin>>N)

if (N>0)

if (K==0) {K=1;Min=N;}

 else if (N<Min) Min=N;

if (K!=0)

cout<<"Min="<<Min<<"\n"

<<"K="<<K<<"\n";

else cout<<"Positive elements

                                       are absent \n";}

ЗАДАЧА 11. Поступает последовательность целых положительных чисел. 0 – конец последовательности. Определить количество простых чисел в последовательности.

#include <iostream>

int main()

{

unsigned int i,k; int X; bool Pr;

cout<<"X="; cin>>X;

k=0;

while (X!=0)

{

if (X>0)

{

for (Pr=true,i=2;i<=X/2;i++)

if (X%i==0) {Pr=false; break;}

if (Pr) k++;

}

else cout<<"Input error";

cout<<"X="; cin>>X;  

}

if (k==0)

cout<<"Prime numbers are not \n";

else

cout<<"Prime numbers k="<<k;

}

2 Обычно применение оператора goto приводит к усложнению программы и затрудняет отладку. Он нарушает принцип структурного программирования, согласно которому все блоки, составляющие программу, должны иметь только один вход и один выход. В большинстве алгоритмов применения этого оператора можно избежать




1. Реферат- Свойства и функции морали
2. Убой и первичная обработка шкурок пушных зверей
3. trnsmissio перенесение на других заразные болезни человека возбудители которых передаются кровососущими чле
4. Контрольная работа- Строение и функции среднего мозга
5. деловой этикет Особенности невербального общения
6. своему от критического пессимизма до крайнего оптимизма
7. реферат дисертації на здобуття наукового ступеня кандидата економічних наук
8. Об утверждении порядка приема в общеобразовательные учреждения в редакции Приказа Минобрнауки России от 0
9. Мне грустно и легко; печаль моя светла; Печаль моя полна тобоюТобой одной тобой.html
10. 15 Плат Арис Эпик Стоики Упр 1 Платон 1 Внимательно прочитайте текст Найдите в нём 3 ошибки их нумеровать В
11. СЕВЕРОКАВКАЗСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ Кафедра специальноправовых дисциплин
12.  Зарождение воспитания в опыте человечества
13. Проблемы профессионального спорта правовой аспект
14. Механизм мотивации труда работников предприятий отечественного АПК
15. Поширення мікроорганізмів в природі Виконав- студент II курсу ФХТ групи ТМЯ05031 Калюжний
16. Эврика раскопаны 15 стратифицированных курганов содержащих 30 погребений ямной культуры
17. Документы о государственной поддержке СМИ с комментарием Судебная палата Парламентская хроника
18. РЕФЕРАТ ПОДГОТОВКА И ПРОВЕДЕНИЕ БИЗНЕС'ПЕРЕГОВОРОВ Профессиональные навыки менеджера Групп
19. тематичних наук Київ 2000 Дисертацією є рукопис Робота виконана в Інституті фізики напівпровідн
20. Выбор резака