Нижегородский государственный технический университет имени Р. Е. Алексеева
Опубликован: 26.03.2015 | Доступ: свободный | Студентов: 6254 / 1182 | Длительность: 07:05:00
ISBN: 978-5-9556-0173-1
Специальности: Программист, Преподаватель
Лекция 5:

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

< Лекция 4 || Лекция 5: 12 || Лекция 6 >
Аннотация: Продолжаем изучать применение стандартных элементов алгоритма в простейших задачах. Циклический алгоритм – это мощное средство при решении разных примеров. Цель данной лекции – научиться правильно реализовывать циклический алгоритм в разных задачах.

В данной лекции мы рассмотрим множество задач, соответствующих циклическому алгоритму. В каждой задаче будут представлены блок-схемы, коды программ для Microsoft Visual Studio, а также результаты выполнения программ (консоли).

Занятие 1. Программная реализация циклического алгоритма

Пример 1. Вычислить таблицу "x, f" значений функции f(x)=2x+1 при 0\le х\le 4 с шагом 2,5.

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

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

  • х – переменная цикла, т.к. х изменяется согласно условиям задачи;
  • х=0 – первоначальное значение переменной цикла х;
  • h=2,5 – шаг изменения переменной цикла х;
  • "x\le 4" - условие выполнения итерации цикла.

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

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

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

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

Рис. 5.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;}

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

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

Рис. 5.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" значений функции Z(x,y)=\begin{cases}x+3,&x<1\\4x,&x\ge 1\end{cases}при -1\le х\le 2 с шагом 1.

Решение. Функция Z является кусочной, поэтому для ее расчета используем разветвляющийся алгоритм.

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

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

  • х=-1 – начальное задание переменной цикла;
  • h=1 – шаг изменения переменной цикла х;
  • "х\le 2" - условие для прохождения итерации цикла.

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

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

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

К блок-схеме с предусловием относятся две программы – с оператором while и for.

К блок-схеме с постусловием относится одна программа с оператором do while.

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

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

Рис. 5.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;}

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

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

Рис. 5.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" значений функции Z(x,y)=\begin{cases}x+y,&xy<1\\x-y,&xy\ge 1\end{cases} при -1-\le х\le 0,5 с шагом 1, 5\le y\le 15 с шагом 5 .

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

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

  • х=-1 – начальное значение переменной внешнего цикла х;
  • hx=1 – шаг изменения переменной внешнего цикла х;
  • "х\le 0,5" - условие для выполнения итерации внешнего цикла по х;
  • у=5 – начальное значение переменной внутреннего цикла у;
  • hy=5 – шаг изменения переменной внутреннего цикла у;
  • "у\le 15" - условие для выполнения итерации внутреннего цикла по у.

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

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

Рис. 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;}

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

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

Рис. 5.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 и т.д. Результат выполнения программы не должен зависеть от выбранного оператора цикла.

< Лекция 4 || Лекция 5: 12 || Лекция 6 >
Никита Беллонский
Никита Беллонский

Лекция 4. Упражнение №4.

Составил блок-схему и по ней написал программу. Работает корректно, но если подбираю значения, чтобы выходила сумма меньше -2, на выводе значится: "-na n(i nd)". 

Я так понимаю, это потому что в выражении выполняется извлечение квадратного корня из отрицательного числа. Но что значит "-na n(i nd)"? Почему вывод именно такой? Машина всегда так сообщает о "неудачных" вычислениях? 

Антон Биганов
Антон Биганов

в лекции 2.

"Таблица 2.4. Выполнение блок-схемы с предусловием для примера 9" - в блоке условия стоит а<10, при таком условии последяя строка {S=17, R=3} на экран выведена не будет.

 

Зайнобиддин Насриддинов
Зайнобиддин Насриддинов
Узбекистан, Наманган