Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие 1 семестр.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
5.52 Mб
Скачать

5.3 Реализация циклического алгоритма

Пример 5.14. Вычислить таблицу «x, f» значений функции при 0≤х≤4 с шагом 2,5.

Решение. Т.к. переменная х имеет не одно, а несколько значений, то следует использовать циклический алгоритм. Решим данную задачу несколькими способами: блок-схема с предусловием, блок-схема с постусловием, программа с оператором while (соответствует блок-схеме с предусловием), программа с оператором for (соответствует блок-схеме с предусловием), программа с оператором do while (соответствует блок-схеме с постусловием).

В данной задаче мы имеем:

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

х=0 – первоначальное значение переменной цикла х;

h=2,5 – шаг изменения переменной цикла х;

«х≤4» - условие выполнения итерации цикла.

В теле цикла мы будем считать значение функции f и выводить строку со значениями x, f на экран.

В программе мы будем использовать функцию setw(10) из библиотеки <iomanip>, чтобы таблица значений строилась ровно.

Блок-схема (с предусловием)

Выполнение блок-схемы

Рис. 5.16. Блок- схема для примера 5.14

Начало

вывод заголовка таблицы «x, f»

x=0

x≤4 0≤4 да

f=2x+1=2•0+1=1

вывод x, f

Экран

x f

0 1

x=x+2,5=0+2,5=2,5

наверх

x≤4 2,5≤4 да

f=2x+1=2•2,5+1=6

вывод x, f

Экран

x f

0 1

2,5 6

x=x+2,5=2,5+2,5=5

наверх

x≤4 5≤4 нет

выход из цикла по х

Конец.

Код программы (Visual Studio) с оператором while (предусловие):

// proga23while.cpp: определяет точку входа для консольного приложения.

//

#include "stdafx.h"

#include <iostream>

#include <iomanip>

using namespace std;

int main()

{

double x, f;

cout<<setw(10)<<"x"<<setw(10)<<"f"<<endl;

x=0;

while(x<=4){

f=2.0*x+1.0;

cout<<setw(10)<<x<<setw(10)<<f<<endl;

x=x+2.5;

}

return 0;}

Код программы (Visual Studio) с оператором for (предусловие):

// proga23for.cpp: определяет точку входа для консольного приложения.

//

#include "stdafx.h"

#include <iostream>

#include <iomanip>

using namespace std;

int main()

{

double x, f;

cout<<setw(10)<<"x"<<setw(10)<<"f"<<endl;

for(x=0; x<=4; x=x+2.5){

f=2.0*x+1.0;

cout<<setw(10)<<x<<setw(10)<<f<<endl;

}

return 0;}

Результат выполнения программы (Visual Studio) с оператором while (предусловие):

Результат выполнения программы (Visual Studio) с оператором for (предусловие):

Код программы (Visual Studio) с оператором do while (постусловие):

// proga23dowhile.cpp: определяет точку входа для консольного приложения.

//

#include "stdafx.h"

#include <iostream>

#include <iomanip>

using namespace std;

int main()

{

double x, f;

cout<<setw(10)<<"x"<<setw(10)<<"f"<<endl;

x=0;

do{

f=2.0*x+1.0;

cout<<setw(10)<<x<<setw(10)<<f<<endl;

x=x+2.5;

}while(x<=4);

return 0;

}

Код программы (Borland C++) с оператором while (предусловие):

#include <iostream.h>

#include <iomanip.h>

int main()

{

double x, f;

cout<<setw(10)<<"x"<<setw(10)<<"f"<<endl;

x=0;

while(x<=4){

f=2.0*x+1.0;

cout<<setw(10)<<x<<setw(10)<<f<<endl;

x=x+2.5;

}

return 0;}

Блок-схема (с постусловием)

Выполнение блок-схемы

Рис. 5.17. Блок- схема для примера 5.14 (с постусловием)

Начало

x=0

f=2x+1=2•0+1=1

вывод x, f

Экран

x f

0 1

x=x+2,5=0+2,5=2,5

x≤4 2,5≤4 да

наверх

f=2x+1=2•2,5+1=6

вывод x, f

Экран

x f

0 1

2,5 6

x=x+2,5=2,5+2,5=5

x≤4 5≤4 нет

выход из цикла по х

Конец.

Результат выполнения программы:

Результат выполнения программы:

Код программы (Borland C++) с оператором for (предусловие):

#include <iostream.h>

#include <iomanip.h>

int main(){

double x, f;

cout<<setw(10)<<"x"<<setw(10)<<"f"<<endl;

for(x=0; x<=4; x=x+2.5){

f=2.0*x+1.0;

cout<<setw(10)<<x<<setw(10)<<f<<endl;

}

return 0;}

Код программы (Borland C++) с оператором do while (постусловие):

#include <iostream.h>

#include <iomanip.h>

int main(){

double x, f;

cout<<setw(10)<<"x"<<setw(10)<<"f"<<endl;

x=0;

do{ f=2.0*x+1.0;

cout<<setw(10)<<x<< setw(10)<<f<<endl;

x=x+2.5;

}while(x<=4);

return 0;}

Результат выполнения программы:

Результат выполнения программы:

Проверка результатов в программе MathCad:

Ручной счет:

Диапазон значений х: 0; 2,5.

при x=0 f=2x+1=2•0+1=1

при x=2,5 f=2x+1=2•2,5+1=6

Пример 5.15. Вычислить таблицу «x, Z» значений функции при -1≤х≤2 с шагом 1.

Решение. Функция Z задана так же, как в Примере 5.7. Поэтому принцип вычисления функции возьмем из Примера 5.7.

Необходимо добавить реализацию одномерного цикла по переменной х.

В данной задаче:

х=-1 – начальное задание переменной цикла;

h=1 – шаг изменения переменной цикла х;

«х≤2» - условие для прохождения итерации цикла.

В теле цикла следует рассчитать значение функции Z и вывести очередную строку значений x, Z таблицы на экран.

В программе используется функция setw() для построения ровной таблицы значений.

Приведем две блок-схемы: с предусловием и с постусловием.

К блок-схеме с предусловием относятся две программы – с оператором while и for (реализация в Visual Studio и Borland C++).

К блок-схеме с постусловием относится одна программа с оператором do while (реализация в Visual Studio и Borland C++).

Также приведен ручной счет и проверка результатов в программе MathCad.

Блок-схема с предусловием

Блок-схема с постусловием

Рис. 5.18. Блок- схема для примера 5.15

Рис. 5.19. Блок- схема для примера 5.15

Выполнение блок-схемы

(с предусловием):

Выполнение блок-схемы

(с постусловием):

Начало

вывод заголовка таблицы «x, Z»

Экран

x Z

x=-1

x≤2 -1≤2 да

x<1 -1<1 да

Z=x+3=-1+3=2

вывод x, Z

Экран

x Z

-1 2

x=x+1=-1+1=0

наверх

x≤2 0≤2 да

x<1 0<1 да

Z=x+3=0+3=3

вывод x, Z

Экран

x Z

-1 2

0 3

x=x+1=0+1=1

наверх

x≤2 1≤2 да

x<1 1<1 нет

Z=4x=4•1=4

вывод x, Z

Экран

x Z

-1 2

0 3

1 4

x=x+1=1+1=2

наверх

x≤2 2≤2 да

x<1 2<1 нет

Z=4x=4•2=8

вывод x, Z

Экран

x Z

-1 2

0 3

1 4

2 8

x=x+1=2+1=3

наверх

x≤2 3≤2 нет

выход из цикла по х

Конец.

Начало

вывод заголовка таблицы «x, Z»

Экран

x Z

x=-1

x<1 -1<1 да

Z=x+3=-1+3=2

вывод x, Z

Экран

x Z

-1 2

x=x+1=-1+1=0

x≤2 0≤2 да

наверх

x<1 0<1 да

Z=x+3=0+3=3

вывод x, Z

Экран

x Z

-1 2

0 3

x=x+1=0+1=1

x≤2 1≤2 да

наверх

x<1 1<1 нет

Z=4x=4•1=4

вывод x, Z

Экран

x Z

-1 2

0 3

1 4

x=x+1=1+1=2

x≤2 2≤2 да

наверх

x<1 2<1 нет

Z=4x=4•2=8

вывод x, Z

Экран

x Z

-1 2

0 3

1 4

2 8

x=x+1=2+1=3

x≤2 3≤2 нет

выход из цикла по х

Конец.

Код программы (Visual Studio) с оператором while (предусловие):

// proga24while.cpp: определяет точку входа для консольного приложения.

//

#include "stdafx.h"

#include <iostream>

#include <iomanip>

using namespace std;

int main(){

double x, Z;

cout<<setw(10)<<"x"<<setw(10)<<"Z"<<endl;

x=-1.0;

while(x<=2.0){

if(x<1){

Z=x+3;

}

else {

Z=4*x;

}

cout<<setw(10)<<x<<setw(10)<<Z<<endl;

x=x+1.0;

}

return 0;}

Результат выполнения программы:

Код программы (Visual Studio) с оператором for (предусловие):

// proga24for.cpp: определяет точку входа для консольного приложения.

//

#include "stdafx.h"

#include <iostream>

#include <iomanip>

using namespace std;

int main(){

double x, Z;

cout<<setw(10)<<"x"<<setw(10)<<"Z"<<endl;

for(x=-1; x<=2; x=x+1){

if(x<1){

Z=x+3;

}

else {

Z=4*x;

}

cout<<setw(10)<<x<<setw(10)<<Z<<endl;

}

return 0;}

Результат выполнения программы:

Код программы (Visual Studio) с оператором do while (постусловие):

// proga24dowhile.cpp: определяет точку входа для консольного приложения.

//

#include "stdafx.h"

#include <iostream>

#include <iomanip>

using namespace std;

int main(){

double x, Z;

cout<<setw(10)<<"x"<<setw(10)<<"Z"<<endl;

x=-1;

do{

if(x<1){

Z=x+3;

}

else {

Z=4*x;

}

cout<<setw(10)<<x<<setw(10)<<Z<<endl;

x=x+1;

}while(x<=2);

return 0;}

Результат выполнения программы:

Код программы (Borland C++) с оператором while (предусловие):

#include <iostream.h>

#include <iomanip.h>

int main(){

double x, Z;

cout<<setw(10)<<"x"<<setw(10)<<"Z"<<endl;

x=-1.0;

while(x<=2.0){

if(x<1){

Z=x+3;

}

else {

Z=4*x;

}

cout<<setw(10)<<x<<setw(10)<<Z<<endl;

x=x+1.0;

}

return 0;}

Результат выполнения программы:

Код программы (Borland C++) с оператором for (предусловие):

#include <iostream.h>

#include <iomanip.h>

int main(){

double x, Z;

cout<<setw(10)<<"x"<<setw(10)<<"Z"<<endl;

for(x=-1; x<=2; x=x+1){

if(x<1){Z=x+3;}

else {Z=4*x;}

cout<<setw(10)<<x<<setw(10)<<Z<<endl;

}

return 0;}

Результат выполнения программы:

Код программы (Borland C++) с оператором do while (постусловие):

#include <iostream.h>

#include <iomanip.h>

int main(){

double x, Z;

cout<<setw(10)<<"x"<<setw(10)<<"Z"<<endl;

x=-1;

do{ if(x<1){Z=x+3;}

else {Z=4*x;}

cout<<setw(10)<<x<<setw(10)<<Z<<endl;

x=x+1;

}while(x<=2);

return 0;}

Результат выполнения программы:

Проверка результатов в программе MathCad:

Ручной счет:

Диапазон значений х: -1; 0; 1; 2.

при x=-1 Z={по первой ветви}=x+3=-1+3=2;

при x=0 Z={по первой ветви}=x+3=0+3=3;

при x=1 Z={по первой ветви}=4x=4•1=4;

при x=2 Z={по первой ветви}=4x=4•2=8.

Пример 5.16. Вычислить таблицу «x, y, Z» значений функции при -1≤х≤0,5 с шагом 1, 5≤y≤15 с шагом 5 .

Решение. Функция Z считается так же, как в Примере 5.9. В данной задаче изменяются две переменные: х и у. Следовательно, нужно реализовать двумерный цикл: внешний цикл по переменной х, внутренний цикл по переменной у. Тело цикла будет содержать вычисление функции Z как в примере 5.9 и вывод на экран строчки значений x, y, Z.

В данной задаче имеем:

х=-1 – начальное значение переменной внешнего цикла х;

hx=1 – шаг изменения переменной внешнего цикла х;

«х≤0,5» - условие для выполнения итерации внешнего цикла по х;

у=5 – начальное значение переменной внутреннего цикла у;

hy=5 – шаг изменения переменной внутреннего цикла у;

«у≤15» - условие для выполнения итерации внутреннего цикла по у.

Рис. 5.20. Блок- схема для примера 5.16

Рис. 5.21. Блок- схема для примера 5.16

Выполнение блок-схемы

Выполнение блок-схемы

Начало

вывод заголовка таблицы «x, y, Z»

Экран

x y Z

x=-1

x≤0,5 -1≤0,5 да

y=5

y≤15 5≤15 да

xy<1 -1•5<1 -5<1 да

Z=x+y=-1+5=4

вывод x, y, Z

Экран

x y Z

-1 5 4

y=y+5=5+5=10

наверх по внутреннему циклу

y≤15 10≤15 да

xy<1 -1•10<1 -10<1 да

Z=x+y=-1+10=9

вывод x, y, Z

Экран

x y Z

-1 5 4

-1 10 9

y=y+5=10+5=15

наверх по внутреннему циклу

y≤15 15≤15 да

xy<1 -1•15<1 -15<1 да

Z=x+y=-1+15=14

вывод x, y, Z

Экран

x y Z

-1 5 4

-1 10 9

-1 15 14

y=y+5=15+5=20

наверх по внутреннему циклу

y≤15 20≤15 нет

выход из внутреннего цикла

x=x+1=-1+1=0

наверх по внешнему циклу

x≤0,5 0≤0,5 да

y=5

y≤15 5≤15 да

xy<1 0•5<1 0<1 да

Z=x+y=0+5=5

вывод x, y, Z

Экран

x y Z

-1 5 4

-1 10 9

-1 15 14

0 5 5

y=y+5=5+5=10

наверх по внутреннему циклу

y≤15 10≤15 да

xy<1 0•10<1 0<1 да

Z=x+y=0+10=10

вывод x, y, Z

Экран

x y Z

-1 5 4

-1 10 9

-1 15 14

0 5 5

0 10 10

y=y+5=10+5=15

наверх по внутреннему циклу

y≤15 15≤15 да

xy<1 0•15<1 0<1 да

Z=x+y=0+15=15

вывод x, y, Z

Экран

x y Z

-1 5 4

-1 10 9

-1 15 14

0 5 5

0 10 10

0 15 15

y=y+5=15+5=20

наверх по внутреннему циклу

y≤15 20≤15 нет

выход из внутреннего цикла

x=x+1=0+1=1

наверх по внешнему циклу

x≤0,5 1≤0,5 нет

выход из внешнего цикла

Конец.

Начало

вывод заголовка таблицы «x, y, Z»

Экран

x y Z

x=-1

y=5

xy<1 -1•5<1 -5<1 да

Z=x+y=-1+5=4

вывод x, y, Z

Экран

x y Z

-1 5 4

y=y+5=5+5=10

y≤15 10≤15 да

наверх по внутреннему циклу

xy<1 -1•10<1 -10<1 да

Z=x+y=-1+10=9

вывод x, y, Z

Экран

x y Z

-1 5 4

-1 10 9

y=y+5=10+5=15

y≤15 15≤15 да

наверх по внутреннему циклу

xy<1 -1•15<1 -15<1 да

Z=x+y=-1+15=14

вывод x, y, Z

Экран

x y Z

-1 5 4

-1 10 9

-1 15 14

y=y+5=15+5=20

y≤15 20≤15 нет

выход из внутреннего цикла

x=x+1=-1+1=0

x≤0,5 0≤0,5 да

наверх по внешнему циклу

y=5

y≤15 5≤15 да

xy<1 0•5<1 0<1 да

Z=x+y=0+5=5

вывод x, y, Z

Экран

x y Z

-1 5 4

-1 10 9

-1 15 14

0 5 5

y=y+5=5+5=10

y≤15 10≤15 да

наверх по внутреннему циклу

xy<1 0•10<1 0<1 да

Z=x+y=0+10=10

вывод x, y, Z

Экран

x y Z

-1 5 4

-1 10 9

-1 15 14

0 5 5

0 10 10

y=y+5=10+5=15

y≤15 15≤15 да

наверх по внутреннему циклу

xy<1 0•15<1 0<1 да

Z=x+y=0+15=15

вывод x, y, Z

Экран

x y Z

-1 5 4

-1 10 9

-1 15 14

0 5 5

0 10 10

0 15 15

y=y+5=15+5=20

y≤15 20≤15 нет

выход из внутреннего цикла

x=x+1=0+1=1

x≤0,5 1≤0,5 нет

выход из внешнего цикла

Конец.

Код программы (Visual Studio) с оператором while (предусловие):

// proga25while.cpp: определяет точку входа для консольного приложения.

//

#include "stdafx.h"

#include <iostream>

#include <iomanip>

using namespace std;

int main(){

double x, y, Z;

cout<<setw(10)<<"x"<<setw(10)<<"y"<<setw(10)<<"Z"<<endl;

x=-1;

while(x<=0.5){

y=5;

while(y<=15){

if(x*y<1){

Z=x+y;

}

else{

Z=x-y;

}

cout<<setw(10)<<x<<setw(10)<<y<<setw(10)<<Z<<endl;

y=y+5;

}

x=x+1;

}

return 0;}

Результат выполнения программы:

Код программы (Visual Studio) с оператором for (предусловие):

// proga25for.cpp: определяет точку входа для консольного приложения.

//

#include "stdafx.h"

#include <iostream>

#include <iomanip>

using namespace std;

int main(){

double x, y, Z;

cout<<setw(10)<<"x"<<setw(10)<<"y"<<setw(10)<<"Z"<<endl;

for(x=-1; x<=0.5; x=x+1){

for(y=5; y<=15; y=y+5){

if(x*y<1){

Z=x+y;

}

else{

Z=x-y;

}

cout<<setw(10)<<x<<setw(10)<<y<<setw(10)<<Z<<endl;

}

}

return 0;}

Результат выполнения программы:

Код программы (Visual Studio) с оператором do while (постусловие):

// proga25dowhile.cpp: определяет точку входа для консольного приложения.

//

#include "stdafx.h"

#include <iostream>

#include <iomanip>

using namespace std;

int main(){

double x, y, Z;

cout<<setw(10)<<"x"<<setw(10)<<"y"<<setw(10)<<"Z"<<endl;

x=-1;

do{

y=5;

do{

if(x*y<1){

Z=x+y;

}

else{

Z=x-y;

}

cout<<setw(10)<<x<<setw(10)<<y<<setw(10)<<Z<<endl;

y=y+5;

}while(y<=15);

x=x+1;

}while(x<=0.5);

return 0;}

Результат выполнения программы:

Код программы (Borland C++) с оператором while (предусловие):

#include <iostream.h>

#include <iomanip.h>

int main(){

double x, y, Z;

cout<<setw(10)<<"x"<<setw(10)<<"y"<<setw(10)<<"Z"<<endl;

x=-1;

while(x<=0.5){

y=5;

while(y<=15){

if(x*y<1){

Z=x+y;

}

else{

Z=x-y;

} cout<<setw(10)<<x<<setw(10)<<y<<setw(10)<<Z<<endl;

y=y+5;

}

x=x+1;

}

return 0;}

Результат выполнения программы:

Код программы (Borland C++) с оператором for (предусловие):

#include <iostream.h>

#include <iomanip.h>

int main(){

double x, y, Z;

cout<<setw(10)<<"x"<<setw(10)<<"y"<<setw(10)<<"Z"<<endl;

for(x=-1; x<=0.5; x=x+1){

for(y=5; y<=15; y=y+5){

if(x*y<1){

Z=x+y;

}

else{

Z=x-y;

} cout<<setw(10)<<x<<setw(10)<<y<<setw(10)<<Z<<endl;

}

}

return 0;}

Результат выполнения программы:

Код программы (Borland C++) с оператором do while (постусловие):

#include <iostream.h>

#include <iomanip.h>

int main(){

double x, y, Z;

cout<<setw(10)<<"x"<<setw(10)<<"y"<<setw(10)<<"Z"<<endl;

x=-1;

do{

y=5;

do{

if(x*y<1){

Z=x+y;

}

else{

Z=x-y;

} cout<<setw(10)<<x<<setw(10)<<y<<setw(10)<<Z<<endl;

y=y+5;

}while(y<=15);

x=x+1;

}while(x<=0.5);

return 0;}

Результат выполнения программы:

Проверка результатов в программе MathCad:

Ручной счет:

Диапазон значений х: -1; 0.

Диапазон значений у: 5, 10, 15.

при x=-1 y=5 Z={по первой ветви}=x+y=-1+5=4;

при x=-1 y=10 Z={по первой ветви}=x+y=-1+10=9;

при x=-1 y=15 Z={по первой ветви}=x+y=-1+15=14;

при x=0 y=5 Z={по первой ветви}=x+y=0+5=5;

при x=0 y=10 Z={по первой ветви}=x+y=0+10=10;

при x=0 y=15 Z={по первой ветви}=x+y=0+15=15.

Примечание. В данном примере операторы вложенного и внешнего циклов совпадают. Например, в одной программе задействован один оператор while два раза. Можно сочетать операторы цикла как угодно: оператор do while может быть вложен в оператор for, оператор for в оператор while и т.д.