- •Н.В. Галина, и.Е. Белоцерковская, л.Ю. Катаева
- •Оглавление
- •Введение
- •Глава 1 Устройство и принципы работы персонального компьютера. Основы работы с ос Windows
- •1.1 Устройство и принципы работы персонального компьютера
- •1.2 Назначение блоков и их краткая характеристика
- •1.3 Программное обеспечение персонального компьютера
- •Глава 2 Понятие алгоритма. Виды алгоритмов
- •1. Линейный алгоритм,
- •2. Разветвляющийся алгоритм,
- •3. Циклический алгоритм.
- •Глава 3 Понятие блок-схемы. Основные типы блоков. Реализация основных алгоритмов
- •3.1 Понятие блок-схемы
- •3.2 Линейный алгоритм
- •3.3 Разветвляющийся алгоритм
- •3.4 Циклический алгоритм
- •4.2 Начало работы в приложении Visual Studio
- •Глава 5 Графическая и программная реализации алгоритмов
- •5.1 Реализация линейного алгоритма
- •5.2 Реализация разветвляющегося алгоритма
- •5.3 Реализация циклического алгоритма
- •5.4 Исследование таблицы значений функции
- •Глава 6 Понятие массива. Одномерные и двумерные массивы
- •6.1 Одномерные массивы
- •6.2 Двумерные массивы
- •6.3 Исследование двумерного массива
- •Глава 7 Задания и варианты для лабораторных работ. Методические указания
- •7.1 Задания и варианты для лабораторных работ
- •7.2 Методические указания и примеры выполнения лабораторных работ
- •Литература
- •Галина Наталья Владимировна Белоцерковская Ирина Ефимовна Катаева Лилия Юрьевна
- •603950, Г. Нижний Новгород, ул. Минина, 24.
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=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 нет выход из цикла по х Конец. |
||||
Код программы (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=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 нет выход из цикла по х Конец.
|
|||||
Результат выполнения программы:
|
Результат выполнения программы:
|
|||||
Код программы (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=-1 x≤2 -1≤2 да x<1 -1<1 да Z=x+3=-1+3=2 вывод x, Z
x=x+1=-1+1=0 наверх x≤2 0≤2 да x<1 0<1 да Z=x+3=0+3=3 вывод x, Z
x=x+1=0+1=1 наверх x≤2 1≤2 да x<1 1<1 нет Z=4x=4•1=4 вывод x, Z
x=x+1=1+1=2 наверх x≤2 2≤2 да x<1 2<1 нет Z=4x=4•2=8 вывод x, Z
x=x+1=2+1=3 наверх x≤2 3≤2 нет выход из цикла по х Конец. |
Начало вывод заголовка таблицы «x, Z»
x=-1 x<1 -1<1 да Z=x+3=-1+3=2 вывод x, Z
x=x+1=-1+1=0 x≤2 0≤2 да наверх x<1 0<1 да Z=x+3=0+3=3 вывод x, Z
x=x+1=0+1=1 x≤2 1≤2 да наверх x<1 1<1 нет Z=4x=4•1=4 вывод x, Z
x=x+1=1+1=2 x≤2 2≤2 да наверх x<1 2<1 нет Z=4x=4•2=8 вывод x, Z
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=-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
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
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
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
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
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
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=-1 y=5 xy<1 -1•5<1 -5<1 да Z=x+y=-1+5=4 вывод x, y, Z
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
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
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
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
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
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 и т.д.
