Постройте таблицу значений функции при с шагом 0,5. Определите наименьшее значение функции и значение , при котором оно достигается. |
Реализация циклического алгоритма
В данной лекции мы рассмотрим множество задач, соответствующих циклическому алгоритму. В каждой задаче будут представлены блок-схемы, коды программ для Microsoft Visual Studio, а также результаты выполнения программ (консоли).
Занятие 1. Программная реализация циклического алгоритма
Пример 1. Вычислить таблицу "" значений функции при с шагом 2,5.
Решение. Т.к. переменная х имеет не одно, а несколько значений (а именно 0; 2,5), то следует использовать циклический алгоритм. Решим данную задачу несколькими способами: блок-схема с предусловием, блок-схема с постусловием, программа с оператором while (соответствует блок-схеме с предусловием), программа с оператором for (соответствует блок-схеме с предусловием), программа с оператором do while (соответствует блок-схеме с постусловием).
В данной задаче мы имеем:
- – переменная цикла, т.к. изменяется согласно условиям задачи;
- – первоначальное значение переменной цикла ;
- – шаг изменения переменной цикла ;
- "" - условие выполнения итерации цикла.
В теле цикла мы будем считать значение функции и выводить строку со значениями на экран.
В программе мы будем использовать функцию setw(10) из библиотеки <iomanip>, чтобы таблица значений строилась ровно.
Блок-схема с предусловием представлена на рис. 5.1.
Выполнение блок-схемы:
Начало вывод заголовка таблицы "x, f" x=0 x≤4 0≤4 да f=2x+1=2*0+1=1 вывод x, f
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=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;}
Блок-схема с постусловием представлена на рис. 5.2.
Выполнение блок-схемы:
Начало x=0 f=2x+1=2*0+1=1 вывод x, f
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=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. Вычислить таблицу "" значений функции при с шагом 1.
Решение. Функция является кусочной, поэтому для ее расчета используем разветвляющийся алгоритм.
Необходимо добавить реализацию одномерного цикла по переменной .
В данной задаче:
- – начальное задание переменной цикла;
- – шаг изменения переменной цикла ;
- "" - условие для прохождения итерации цикла.
В теле цикла следует рассчитать значение функции и вывести очередную строку значений таблицы на экран.
В программе используется функция setw() для построения ровной таблицы значений.
Приведем две блок-схемы: с предусловием и с постусловием.
К блок-схеме с предусловием относятся две программы – с оператором while и for.
К блок-схеме с постусловием относится одна программа с оператором do while.
Блок-схема с предусловием приведена на рис. 5.3.
Код программы с оператором 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;}
Блок-схема с постусловием представлена на рис. 5.4.
Код программы с оператором 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. Вычислить таблицу "" значений функции при с шагом 1, с шагом 5 .
Решение. В данной задаче изменяются две переменные: и . Следовательно, нужно реализовать двумерный цикл: внешний цикл по переменной , внутренний цикл по переменной . Тело цикла будет содержать вычисление функции и вывод на экран строчки значений .
В данной задаче имеем:
- – начальное значение переменной внешнего цикла ;
- – шаг изменения переменной внешнего цикла ;
- "" - условие для выполнения итерации внешнего цикла по ;
- – начальное значение переменной внутреннего цикла ;
- – шаг изменения переменной внутреннего цикла ;
- "" - условие для выполнения итерации внутреннего цикла по у.
Блок-схема с предусловием приведена на рис. 5.5.
Код программы с оператором 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;}
Блок-схема с постусловием приведена на рис. 5.6.
Код программы (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 и т.д. Результат выполнения программы не должен зависеть от выбранного оператора цикла.