Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

книги / Проектирование программ и программирование на C++. Структурное программирование

.pdf
Скачиваний:
4
Добавлен:
12.11.2023
Размер:
3.86 Mб
Скачать

Если значение выражения-условия отлично от нуля, то выполня­ ется оператор 1, при нулевом значении выражения-условия выполня­ ется оператор2.

i f (d>=0)

{

xl=(-b-sqrt(d))/(2*а);

х2=(-b+sqrt(d))/(2*а);

cout<< "\nxl="<<xl<<"x2="<<x2;

}

e l s e co u t« "\n P em eH M 4 н е т " ;

2. Переключатель определяет множественный выбор. s w itc h (выражение)

{

 

c a s e к о н стан та1

о п ератор1

c a s e к о н стан та2

оп ер ато р 2

[ d e f a u l t : о п е р а т о р ы ;]

}

При выполнении оператора s w itc h вычисляется выражение,

записанное после s w itc h , оно должно быть целочисленным. Полу­ ченное значение последовательно сравнивается с константами, кото­ рые записаны следом за c a s e . При первом же совпадении выполня­ ются операторы, помеченные данной меткой. Если выполненные операторы не содержат оператора перехода, то далее выполняются операторы всех следующих вариантов, пока не появится оператор перехода или не закончится переключатель. Если значение выраже­ ния, записанного после s w itc h не совпало ни с одной константой,

то выполняются операторы, которые следуют за

меткой d e f a u l t .

Метка d e f a u l t

может отсутствовать.

 

#in c lu d e

d o s t г earn. h>

 

 

v o id m a in ()

 

 

{

 

 

 

 

i n t

i ;

 

 

 

c o u t< < M\n E n te r th e

n u m b er";

 

c i n » i

;

 

 

s w i t c h ( i )

 

 

{

 

 

 

 

c a s e

1: c o u t « " \ n t h e

num ber i s

o n e " ;

c a s e 2 : c o u t « " \ n 2 * 2 = " < d * i ;

case 3: cout«"\n3*3="<<i*i;break; case 4: cout«f,\ n " « i « " is very

beautiful!";

default:cout«,f\nThe end of work";

}

}

Результаты работы программы: 1. При вводе 1 будет выведено:

The number is one

2 * 2=1

3*3=1

2. При вводе 2 будет выведено:

2*2=4

3*3=4

3.При вводе 3 будет выведено:

3*3=9

4.При вводе 4 будет выведено:

4is very beautiful!

5.При вводе всех остальных чисел будет выведено:

The end of work

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

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

while (выражение-условие)

оператор;

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

while (а !=0)

{

cin>>a;

s+=a;

}

• Цикл с постусловием: do

оператор

while (выражение-условие);

Тело цикла выполняется до тех пор, пока выражение-условие истинно.

do

{

cin>>a;

s+=a;

}

while(a!=0);

• Цикл с параметром:

for (выражение_1;выражение-условие;выражение_3)

оператор;

Выражение_1 и выражение_3 могут состоять из нескольких выражений, разделенных запятыми. Выражение_1 - задает началь­ ные условия для цикла (инициализация). Выражение-условие оп­ ределяет условие выполнения цикла, если оно не равно 0, цикл вы­ полняется, а затем вычисляется значение выражения_3. Выражение_3 - задает изменение параметра цикла или других переменных (коррекция). Цикл продолжается до тех пор, пока выражение-условие не станет равно 0. Любые выражения могут отсутствовать, но разде­ ляющие их « ; » должны быть обязательно.

1.

for (п=10; п>0; п--)// Уменьшение параметра

{

оператор;

}

2 .

for (п=2; п>60; п+=13)// Изменение шага //корректировки

{

оператор;

}

3.

for (num=l;num*num*num<216; num++)//проверка //условия отличного от того, которое налагается на //число итераций

{

оператор;

}

f o r (d = 1 0 0 .0 ; d < 1 5 0 . 0 ; d * = l . 1 ) /^ к о р р е к ц и я с по­

мощью ум н ож ени я*/

 

{

 

 

о п е р а т о р ;

 

}

 

 

5 .

 

 

f o r

(x = l;y < = 7 5 ;y = 5 * (x + + )+ 1 0 )/^ к о р р е к ц и я

с по­

мощью

ар и ф м е ти ч ес к о го вы раж ен и я*/

 

{

 

 

о п е р а т о р ;

 

}

 

 

6 .

 

 

f o r

(х= 1, у= 0 ; х < 1 0 ; х++; у+=х) ; ^ и с п о л ь з о в а н и е

н е с к о л ь к и х корректирую щ их выраж ений, тел о

цикла

о т с у т с т в у е т * /

 

 

10.6. Операторы перехода

Операторы перехода выполняют безусловную передачу управления.

b r e a k - оператор прерывания цикла.

{

 

 

о п е р а т о р ;

 

i f

(<вы раж ение__условие>)

b r e a k ;

о п е р а т о р ;

 

}

 

 

Таким образом, оператор b r e a k

целесообразно использовать, ко­

гда условие продолжения итераций надо проверять в середине цикла.

/* Н ай ти

сумму

ч и с е л ,

ч и с л а

в в о д я т с я

с клави а­

туры

до

т е х

п о р ,

п о ка не

б у д е т

в вед ен о

100 чисел

или

0 . * /

 

 

 

 

 

f o r ( s = 0 ,

i = l ;

i< 1 0 0 ;i+ + )

 

 

{

 

 

 

 

 

 

c in > > x ;

 

 

 

 

 

i f (

x==0) b r e a k ; /* е с л и в вел и 0, то

суммирова­

ние

з а к а н ч и в а е т с я * /

 

 

 

s+ = x ;

}

t i n u e

- переход к следующей итерации цикла. Он ис­

пользуется, когда тело цикла содержит ветвления.

 

//Н а й т и

к о л и ч еств о и сумму

полож ительных

чисел

f o r (

k=0, s = 0 , х =1 ; х !=0;)

 

 

{

 

 

 

 

 

 

c in > > x ;

 

 

 

 

i f

(x<=0)

c o n tin u e ;

 

 

k++;

s+=x;

 

 

 

}

 

 

 

 

 

 

g o to

<метка> - передает управление оператору,

который

содержит метку.

 

 

 

В

теле

той

же функции должна

присутствовать конструкция

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

 

 

Метка - это обычный идентификатор, областью видимости кото­ рого является функция. Оператор g o to передает управления операто­ ру, стоящему после метки. Использование оператора g o to оправдано, если необходимо выполнить переход из нескольких вложенных циклов или переключателей вниз по тексту программы или перейти в одно место функции после выполнения различных действий.

Применение g o to нарушает принципы структурного и модуль­ ного программирования, по которым все блоки, из которых состоит программа, должны иметь только один вход и только один выход.

Нельзя передавать управление внутрь операторов i f , s w itc h и циклов. Нельзя переходить внутрь блоков, содержащих инициали­ зацию, на операторы, которые стоят после инициализации,

i n t

к;

g o to

ш;

int a=3,b=4; к=а+Ь;

m: int с=к+1;

В этом примере при переходе на метку ш не будет выполняться инициализация переменных а, b и к.

• r e t u r n - оператор возврата из функции. Он всегда заверша­ ет выполнение функции и передает управление в точку ее вызова.

Вид оператора:

r e t u r n [вы р аж ен и е];

11. ПРИМЕРЫ РЕШЕНИЯ ЗАДАЧ С ИСПОЛЬЗОВАНИЕМ ОСНОВНЫХ ОПЕРАТОРОВ C++

Решение задач по программированию предполагает выполнение ряда этапов:

1. Разработка математической модели. На этом этапе определя­ ются исходные данные и результаты решения задачи, а также мате­ матические формулы, с помощью которых можно перейти от исход­ ных данных к конечному результату.

2.Разработка алгоритма. Определяются действия, выполняя ко­ торые можно будет от исходных данных придти к требуемому ре­ зультату.

3.Запись программы на некотором языке программирования. На этом этапе каждому шагу алгоритма ставится в соответствие конст­ рукция выбранного алгоритмического языка.

4.Выполнение программы (исходный модуль -» компилятор ->

-> объектный модуль —>компоновщик —> исполняемый модуль).

5. Тестирование и отладка программы. При выполнении про­ граммы могут возникнуть ошибки трех типов:

-синтаксические - исправляются на этапе компиляции;

-исполнения программы (деление на 0, логарифм от отрица­

тельного числа и т.п.) - исправляются при выполнении программы;

- семантические (логические) ошибки - появляются из-за не­ правильно понятой задачи, неправильно составленного алгоритма.

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

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

Математическая модель:

Ок=1 || II || III || VI, где I, II, III, IV - условия попадания точки в заштрихованную область для каждого квадранта.

Квадрант I: Область формируется прямыми ОХ и 0Y, прямой, проходящей через точки (0, 1) и (1, 0) и прямой, проходящей через

точки (0, 3) и (2, 0).

Необходимо определить уравнения прямых у = ах + Ь. Решаем

две системы уравнений:

 

1 )

1 = а - 0 + Ь ;0 = а

1 +Ь;

2 )

2 = а*0 + Ь ;0 = а

3 + Ь;

Из этих систем получаем следующие уравнения прямых:

У= -1 х + 1;

у= -2/3 х + 1;

Тогда условие попадания точки в I квадрант будет выглядеть сле­ дующим образом:

у>=-х+1&&у<=-2/Зх+2&&у>=0&&х>=0.

Квадранты II и III: Область формируется прямыми ОХ и 0У

и двумя окружностями, описываемыми формулами х2 + у2

1,

х2 + у2- 9 .

Тогда условие попадания точки во II и III квадранты будет вы­ глядеть следующим образом:

х2+у2>=1&& х2+у2<=9&&&&х<=0.

Квадрант IV: Область формируется двумя прямоугольниками. Точка может попадать либо в первый прямоугольник, либо во второй.

Условие попадания точки в IV квадрант будет выглядеть сле­ дующим образом:

(х>=0&&х<= 1&&у<=-1 &&у>=-3)|| (х>=1&&х<=3&&у<=0&&у>=-3).

Программа:

#include ciostream.h> #include <math.h>

void main()

{

float x,y; cout<<"\nEnter x, y"; cin>>x»y;

bool Ok=(y>=-x+l&&y<=2/3*x+2&&x>=0&&y>=0) II

(pow(x,2)+pow(y,2)>=l&&pow(x,2)+pow(y,2)<=9&&x<=0)||

(х>=0&&х<=1&&у<=-1&&у>=-3) || (х>=1&&х<=2&&у<=0&&у>=-3); cout<<"\n"<<Ok;

Тесты:

Квадрант

Исходные

Результат (ОК)

данные (X; Y)

 

 

I

0.2; 0.2

0

I

0.7; 0.5

1

II

-0.5; 0.5

0

II

-2.0; 0.0

1

III

-0.5; -0.5

0

III

-2.0; -1.0

1

IV

0.5;-0.5

0

IV

1.5; -1.0

1

Центр системы

0.0; 0.0

0

координат

 

 

11.2. Программирование арифметических циклов

Для арифметического цикла заранее известно, сколько раз вы­ полняется тело цикла.

Задача № 2. Дана последовательность целых чисел из п элемен­ тов. Найти среднее арифметическое этой последовательности.

#include ciostream.h> #include <math.h> void main()

{

int a,n,i;

double s=0; /^инициализируем переменную на­

чальным значением*/

c o u t < < " \ n E n t e r n";

cin>>n; /^вводим количество элементов в по­

следовательности */

for(i=l;i<=n;i++)// цикл выполняется п раз

{

cout«"\nEnter а";

cin>>a; // вводим переменную s+=a;/^добавляем значение пере­

менной к сумме*/

 

}

 

 

 

 

 

 

 

 

s = s / n ; //н а х о д и м

с р е д н е е ариф м етическое

 

c o u t c c " Х псреднее

ар и ф м ети ч еско е

р а в -

HO=,f« s « ,f\ n ff ;

 

 

 

 

 

 

 

}

 

 

 

 

 

 

 

 

Задача № 3. Найти значение S = l + 2

+ 3 + 4 + . .. + N

 

 

# i n c l u d e c i o s t r e a m .h >

 

 

 

 

 

# i n c l u d e < m a th .h >

 

 

 

 

 

 

v o id

m a in ()

 

 

 

 

 

 

 

{

 

 

 

 

 

 

 

 

/ * о п исы ваем

перем енны е и

и ни ц иализи руем

s

на­

чальны м

з н а ч е н и е м * /

 

 

 

 

 

 

i n t n , i , s = 0 ;

 

 

 

 

 

 

c o u t< < " \ n E n t e r n " ;

 

 

 

 

 

c in > > n ; /^ в в о д и м к о л и ч е с т в о

элем ен то в

в

по­

с л е д о в а т е л ь н о с т и * /

 

 

 

 

 

 

f o r ( i = l ;

i< = n ;

i + + ) + + )/* ц и к л

вы полняется

п р а з * /

 

 

 

 

 

 

 

 

s + = i;

//д о б а в л я е м

зн а ч е н и е

перем енной к

сумме

c o u t< < " \n S = ”« s « " \ n ,f ;

11.3. Программирование итерационных циклов

Для итерационного цикла должно быть известно условие выпол­ нения цикла. При использовании цикла с предусловием (w h ile) тело цикла может не выполняться ни разу, если сразу же не выполняется условие цикла. При использовании цикла с постусловием тело цикла будет выполнено хотя бы один раз. И в том, и в другом случае ис­ пользуется условие выполнения цикла.

Задача № 4. Дана последовательность целых чисел, за которой следует 0. Найти минимальный элемент этой последовательности.

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

# i n c l u d e c i o s t r e a m .h >

# i n c l u d e < m a th .h > v o id m a in ()

{

Соседние файлы в папке книги