Занятие 1. Программная реализация циклического алгоритма
Пример 1. Вычислить таблицу «x, f» значений функции f(x)=2x+1 при 0≤х≤4 с шагом 2,5.
Решение. Т.к. переменная х имеет не одно, а несколько значений (а именно 0; 2,5), то следует использовать циклический алгоритм. Решим данную задачу несколькими способами: блок-схема с предусловием, блок-схема с постусловием, программа с оператором while (соответствует блок-схеме с предусловием), программа с оператором for (соответствует блок-схеме с предусловием), программа с оператором do while (соответствует блок-схеме с постусловием).
В данной задаче мы имеем:
х – переменная цикла, т.к. х изменяется согласно условиям задачи;
х=0 – первоначальное значение переменной цикла х;
h=2,5 – шаг изменения переменной цикла х;
«х≤4» - условие выполнения итерации цикла.
В теле цикла мы будем считать значение функции f и выводить строку со значениями x, f на экран.
В программе мы будем использовать функцию setw(10) из библиотеки <iomanip>, чтобы таблица значений строилась ровно.
Блок-схема с предусловием представлена на рис. 1.
Рис. 1 Блок-схема с предусловием для примера 1
Выполнение блок-схемы:
Начало
вывод заголовка таблицы «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 нет
выход из цикла по х
Конец.
Код программы с оператором 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;}
Код программы с оператором 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;}
Блок-схема с постусловием представлена на рис. 2.
Рис. 2 Блок-схема с постусловием для примера 1
Выполнение блок-схемы:
Начало
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 нет
выход из цикла по х
Конец.
Код программы с оператором 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;
}
Результат выполнения программ с операторами while, for, do while:
Ручной счет:
Диапазон значений х: 0; 2,5.
при x=0 f=2x+1=2•0+1=1
при x=2,5 f=2x+1=2•2,5+1=6
Пример 2. Вычислить таблицу «x, Z» значений функции при -1≤х≤2 с шагом 1.
Решение. Функция Z является кусочной, поэтому для ее расчета используем разветвляющийся алгоритм.
Необходимо добавить реализацию одномерного цикла по переменной х.
В данной задаче:
х=-1 – начальное задание переменной цикла;
h=1 – шаг изменения переменной цикла х;
«х≤2» - условие для прохождения итерации цикла.
В теле цикла следует рассчитать значение функции Z и вывести очередную строку значений x, Z таблицы на экран.
В программе используется функция setw() для построения ровной таблицы значений.
Приведем две блок-схемы: с предусловием и с постусловием.
К блок-схеме с предусловием относятся две программы – с оператором while и for.
К блок-схеме с постусловием относится одна программа с оператором do while.
Блок-схема с предусловием приведена на рис. 3.
Рис. 3 Блок-схема с предусловием для примера 2
Код программы с оператором 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;}
Код программы с оператором 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;}
Блок-схема с постусловием представлена на рис. 4.
Рис. 4 Блок-схема с постусловием для примера 2
Код программы с оператором 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;}
Результат выполнения программ с операторами while, for, do while:
Ручной счет:
Диапазон значений х: -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.
Пример 3. Вычислить таблицу «x, y, Z» значений функции при -1≤х≤0,5 с шагом 1, 5≤y≤15 с шагом 5 .
Решение. В данной задаче изменяются две переменные: х и у. Следовательно, нужно реализовать двумерный цикл: внешний цикл по переменной х, внутренний цикл по переменной у. Тело цикла будет содержать вычисление функции Z и вывод на экран строчки значений x, y, Z.
В данной задаче имеем:
х=-1 – начальное значение переменной внешнего цикла х;
hx=1 – шаг изменения переменной внешнего цикла х;
«х≤0,5» - условие для выполнения итерации внешнего цикла по х;
у=5 – начальное значение переменной внутреннего цикла у;
hy=5 – шаг изменения переменной внутреннего цикла у;
«у≤15» - условие для выполнения итерации внутреннего цикла по у.
Блок-схема с предусловием приведена на рис. 5.
Рис. 5 Блок-схема с предусловием для примера 3
Код программы с оператором 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;}
Код программы с оператором 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;}
Блок-схема с постусловием приведена на рис. 6.
Рис. 6 Блок-схема с постусловием для примера 3
Код программы (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;}
Результат выполнения программ с операторами while, for, do while:
Ручной счет:
Диапазон значений х: -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 и т.д. Результат выполнения программы не должен зависеть от выбранного оператора цикла.