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



Глава 3. Операторы управления

Основные конструкции алгоритма

Алгоритм – это четкое описание последовательности действий, которые необходимо выполнить для того, чтобы при соответствующих исходных данных получить требуемый результат

 

Составной оператор

Составной оператор :

{

оператор_1;

...

оператор_n;

}

Транслятор воспринимает составной оператор как одно целое.

Условные операторы

Условный оператор

if ( условие) оператор_1; else оператор_2;

 

 

 

cin>>a; cin>>b;

if (a==b) cout<<”а equal b”); else cout<<(”а not equal b”);

 

if (условие)

{

оператор_1;

оператор_2;

}

else

{

оператор_1;

оператор_2;

}

 

 

if ( условие) оператор;

или

If ( условие)

{

оператор_1;

оператор_2;

}

 

cin>>a; cin>>b;

c=0;

//Значение переменной c изменяется

//только при условии, что a не равно b

if (a!=b) c=a+b;

//Вывод на экран c выполняется в любом

// случае

cout<<”c=”<<c;

If ( условие_1) if (условие_2) оператор_А;

else оператор_Б;

if ( условие_1) {if (условие_2) оператор_А;}

else оператор_Б;

ЗАДАЧА 3.1. Написать программу решения квадратного уравнения ax2 + bx + c = 0.

Исходные данные: а, b и с.

Результаты работы программы: x1 и x2 – корни квадратного уравнения или сообщение о том, что корней нет.

Вспомогательные переменные: вещественная переменная d.

#include "stdafx.h"

#include <iostream.h>

#include <math.h>

int main()

{

float a,b,c,d,x1,x2;

//Ввод значений коэффициентов

//квадратного уравнения

cout<<"a=";cin>>a;

cout<<"b=";cin>>b;

cout<<"c=";cin>>c;

//Вычисление дискриминанта

d=b*b-4*a*c;

//Если дискриминант отрицателен,

if (d<0)

//то вывод сообщения, что корней нет,

cout<<"Real roots are not present";

else

{

//иначе вычисление корней x1, x2

x1=(-b+sqrt(d))/2/a;

x2=(-b-sqrt(d))/(2*a);

//и вывод их значений на экран

cout<<"X1="<<x1<<"\t X2="<<x2<<"\n";

}

return 0;

}

ЗАДАЧА 3.2. Составить программу нахождения действительных и комплексных корней квадратного уравнения ax2 + bx + c = 0.

Исходные данные: вещественные числа а, b и с.

Результаты работы программы: вещественные числа x1 и x2 – действительные корни квадратного уравнения, либо x1 и x2 – действительная и мнимая части комплексного числа.

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

 

#include "stdafx.h"

#include <iostream.h>

#include <math.h>

int main()

{

float a,b,c,d,x1,x2;

cout<<"a=";cin>>a;

cout<<"b=";cin>>b;

cout<<"c=";cin>>c;

d=b*b-4*a*c;

//Проверка знака дискриминанта

if (d<0)

{

//Если дискриминант отрицателен, то

//вывод сообщения

cout<<"Real roots are not present \n";

//Вычисление действительной части

//комплексных корней

x1=-b/(2*a);

//Вычисление модуля мнимой части

// комплексных корней

x2=sqrt(abs(d))/(2*a);

//Сообщение о комплексных корнях

//уравнения вида ax^2+bx+c=0

cout<<"Complex roots of equalization \n";

cout<<a<<"x^2+"<<b<<"x+"<<c<<"=0 \n";

//Вывод значений комплексных корней в

// виде x1±ix2

cout<<x1<<"+i*("<<x2<<")\t";

cout<<x1<<"-i*("<<x2<<")\n";

}

else

{

//иначе вычисление действительных

//корней x1, x2

x1=(-b+sqrt(d))/2/a;

x2=(-b-sqrt(d))/(2*a);

//и вывод их на экран

cout<<"Real roots of equalization \n";

cout<<a<<"x^2+"<<b<<"x+"<<c<<"=0 \n";

cout<<"X1="<<x1<<"\t X2="<<x2<<"\n";

}

return 0;

}

 

 

ЗАДАЧА 3.3. Составить программу для решения

 кубического уравнения ax3 + bx2 + cx + d = 0.

Кубическое уравнение имеет вид

                                                      

После деления на a уравнение (3.1) принимает канонический вид:

                                              

где , , . В уравнении (3.2) сделаем замену  и получим приведенное уравнение (3.3)

                          ,                                  

где , .

Число действительных корней приведенного уравнения (3.3) зависит от знака дискриминанта (табл. 3.1).

 

Табл. 3.1.

 

Дискриминант Количество действительных корней Количество комплексных корней
D≥0 1 2
D<0 3 -

 

 

Корни приведенного уравнения могут быть рассчитаны по формулам Кардано (3.4).

                                                  

где

.

При отрицательном дискриминанте уравнение (3.1) имеет три действительных корня, но они будут вычисляться через вспомогательные комплексные величины. Чтобы избавиться от этого, можно воспользоваться следующими формулами (3.5):

                , где , .            (3.5)

Таким образом, при положительном дискриминанте кубического уравнения (3.3) расчет корней будем вести по формулам (3.4), а при отрицательном – по формулам (3.5). После расчета корней приведенного уравнения (3.3) по формулам (3.4) или (3.5) необходимо по формулам  перейти к корням заданного кубического уравнения (3.1).

Блок-схемарешения кубического уравнения представлена на рис. 3.12.

 

#include "stdafx.h"

#include <iostream.h>

#include <math.h>

#define pi 3.14159

int main()

{

float a,b,c,d,D,r,s,t,p,q,ro,fi,x1,x2,x3,u,v,h,g;

cout<<"a="; cin>>a;

cout<<"b="; cin>>b;

cout<<"c="; cin>>c;

cout<<"d="; cin>>d;

//Расчет коэффициентов канонического

//уравнения по формуле (3.2)

r=b/a; s=c/a; t=d/a;

//Вычисление коэффициентов приведенного

// уравнения по формуле (3.3)

p=(3*s-r*r)/3; q=2*r*r*r/27-r*s/3+t;

//Вычисление дискриминанта кубического

//уравнения

D=(p/3)*(p/3)*(p/3)+(q/2)*(q/2);

if (D<0)

//Формулы (3.5)

{

ro=sqrt((float)(-p*p*p/27));

fi=-q/(2*ro);

fi=pi/2-atan(fi/sqrt(1-fi*fi));

x1=2*pow(ro,(float)1/3)*cos(fi/3)-r/3;

x2=2*pow(ro,(float)1/3)*

cos(fi/3+2*pi/3)-r/3;

x3=2*pow(ro,(float)1/3)*

cos(fi/3+4*pi/3)-r/3;

cout<<"\n x1="<<x1<<"\t x2="<<x2<<

"\t x3="<<x3<<"\n";

}

else

//Формулы (3.4)

{

//К выражению 1/3 необходимо применить

// операцию преобразования типа

//(float)1/3,иначе будет выполнена

//операция целочисленного деления,

//результат

которой равен 0.

if (-q/2+sqrt(D)>0)

u=pow((-q/2+sqrt(D)),(float)1/3);

else

if (-q/2+sqrt(D)<0)

u=-pow(fabs(-q/2+sqrt(D)),(float)1/3);

else u=0;

if (-q/2-sqrt(D)>0)

v=pow((-q/2-sqrt(D)),(float)1/3);

else

if (-q/2-sqrt(D)<0)

v=-pow(fabs(-q/2-sqrt(D)),(float)1/3);

else v=0;

//Вычисление действительного корня

//кубического уравнения

x1=u+v-r/3;

//Вычисление действительной и мнимой

//части комплексных корней

h=-(u+v)/2-r/3;

g=(u-v)/2*sqrt((float)3);

cout<<"\n x1="<<x1;

cout<<"\t x2="<<h<<"+i*("<<g<<

") \t x3="<<h<<"-i*("<<g<<") \n";

}

return 0;

}

ЗАДАЧА 3.4. Заданы коэффициенты a, b и с биквадратного уравнения ах4 + ² + с = 0. Найти все его действительные корни.

Входные данные: a, b, c.

Выходные данные: х1, х2, х3, х4.

аy2 + by + с = 0.

 

 

 

#include "stdafx.h"

#include <iostream.h>

#include <math.h>

int main()

{

float a,b,c,d,x1,x2,x3,x4,y1,y2;

//Ввод коэффициентов уравнения

cout<<"a="; cin>>a;

cout<<"b="; cin>>b;

cout<<"c="; cin>>c;

//Вычисление дискриминанта

d=b*b-4*a*c;

//Если дискриминант <0

if (d<0)

//Вывод сообщения «Корней нет»

cout<<"Real roots are not present \n";

//Если дискриминант ≥0

else

{

//Вычисление корней соответствующего

//квадратного уравнения

y1=(-b+sqrt(d))/2/a;

y2=(-b-sqrt(d))/(2*a);

//Если оба корня квадратного уравнения <0

if (y1<0 && y2<0)

//Вывод сообщения «Корней нет»

cout<<"Real roots are not present \n";

//Если оба корня квадратного уравнения ≥0

else if (y1>=0 && y2>=0)

{

//Вычисление четырех корней

//биквадратного уравнения

x1=sqrt(y1);

x2=-x1;

x3=sqrt(y2);

x4=-sqrt(y2);

//Вывод корней биквадратного уравнения

//на экран

cout<<"X1="<<x1<<"\t X2="<<x2;

cout<<"X3="<<x3<<"\t X4="<<x4<<"\n";

}

//Если не выполнились оба условия,

//1. y1<0 И y2<0

//2. y1>=0 И y2>=0,

//то проверяем условие y1>=0

else if (y1>=0)

//Если оно истинно

{

//для вычисления корней биквадратного

//уравнения, извлекаем корни из y1

x1=sqrt(y1);

x2=-x1;

cout<<"X1="<<x1<<"\t X2="<<x2<<"\n";

}

else

//Если условие y1>=0 ложно, то

{

//для вычисления корней биквадратного

//уравнения извлекаем корни из y2

x1=sqrt(y2);

x2=-x1;

cout<<"X1="<<x1<<"\t X2="<<x2<<"\n";

}

}

return 0;

}

 

Оператор варианта

Оператор варианта switch необходим в тех случаях, когда в зависимости от значений какой-либо переменной надо выполнить те или иные операторы:

 

 

Switch ( выражение)

{

case значение_1: Операторы_1; break;

case значение_2: Операторы_2; break;

case значение_3: Операторы_3; break;

case значение_n: Операторы_n; break;

default: Операторы; break;

}

 

 

Switch ( выражение)

{

case значение_1: Операторы_1; break;

case значение_2: Операторы_2; break;

case значение_3: Операторы_3; break;

case значение_n: Операторы_n; break;

}

Оператор break необходим для того, чтобы осуществить выход из оператора switch. Если оператор break не указан, то будут выполняться следующие операторы из списка, не смотря на то, что значение, которым они помечены, не совпадает со значением выражения.

ЗАДАЧА 3.6. По заданному номеру месяца m вывести на печать его название.

#include "stdafx.h"

#include <iostream.h>

using namespace std;

int main()

{

unsigned int m; cout<<"m="; cin>>m;

switch (m)

{

//В зависимости от значения m

//выводится название месяца

case 1: cout<<"January \n"; break;

case 2: cout<<"February \n"; break;

case 3: cout<<"March \n"; break;

case 4: cout<<"April \n"; break;

case 5: cout<<"May \n"; break;

case 6: cout<<"June \n"; break;

case 7: cout<<"July \n"; break;

case 8: cout<<"August \n"; break;

case 9: cout<<"September \n"; break;

case 10:cout<<"October \n"; break;

case 11:cout<<"November \n"; break;

case 12:cout<<"December \n"; break;

//Если значение переменной m выходит

//за пределы области

//допустимых значений, то выдается

//сообщение об ошибке

default: cout<<"ERROR! \n"; break;

}

return 0;

}

 

Операторы цикла

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

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

В С++ для удобства пользователя предусмотрены три оператора, реализующих циклический процесс: while, do…while и for.

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

На рис. 3.15 изображена блок-схема алгоритма цикла с предусловием. Оператор, реализующий этот алгоритм в С++, имеет вид:

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

Рис. 3.15. Алгоритм циклической структуры с предусловием

 

 

while условие

{

оператор 1;

оператор 2;

оператор n;

}

Рассмотрим пример. Пусть необходимо вывести на экран таблицу значений функции y = esin(x)cos(x) на отрезке [0;π] с шагом 0.1. Применив цикл с предусловием, получим:

#include <stdio.h>

#include <math.h>

#define PI 3.14159

int main()

{

float x, y;

x=0;

//Цикл с предусловием

while (x<=PI)

//Пока параметр цикла не превышает

//конечное значение,

{ //выполнять тело цикла

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

 

printf("x=%f \t y=%f \n",x,y);

 

x+=0.1; /

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

}


Дата добавления: 2018-09-22; просмотров: 208; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!