|
Постройте таблицу значений функции |
Реализация циклического алгоритма
В данной лекции мы рассмотрим множество задач, соответствующих циклическому алгоритму. В каждой задаче будут представлены блок-схемы, коды программ для 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 и т.д. Результат выполнения программы не должен зависеть от выбранного оператора цикла.









при
с шагом 0,5. Определите наименьшее значение функции и значение
, при котором оно достигается.