1й курс / Primery_vypolnenia_lab_raboty_4
.pdf1
ЛАБОРАТОРНАЯ РАБОТА №4. «АЛГОРИТМИЗАЦИЯ И С++. ОРГАНИЗАЦИЯ ЦИКЛИЧЕСКОГО ВЫЧИСЛИТЕЛЬНОГО ПРОЦЕССА»
4.1. ПРОВЕРКА ОГРАНИЧЕНИЙ В ЦИКЛЕ
Задание 4.1. В соответствии с вариантом задания, используя цикл с постусловием, составить блок-схему алгоритма и программу на языке С++, которая для каждого значения х из заданного интервала xn ≤ x ≤ xk с шагом Dx вычисляет соответствующие значения y=f(x). Для ввода данных использовать потокcin, для вывода – cout.
Пример выполнения задания 4.1 |
|
|||
ПОСТАНОВКА ЗАДАЧИ: |
|
|||
1. Исходные данные: a, xn, xk, Dx |
|
|
|
|
2. Математическая модель: |
|
|
|
|
ìax2 + ln(ax), |
если х < 2 |
|||
ï |
|
|
|
|
|
a + x, |
если 2 £ x £ 4 |
||
y = íx2 + |
|
|||
ï |
+ cos x, |
если x > 4 |
||
ïa / x |
||||
î |
|
|
|
|
3.Ограничения:
а) 1-я формула: выражение под знаком логарифма должно бытьax>0 – прове-
рять;
б) 2-я формула: подкоренное выражение должно быть a+x ³ 0 – проверять;
в) 3-я формула: знаменатель не должен быть равен нулю x ¹ 0 – не проверять, т.к. 3-я формула для вычисленияy используется, только если x > 4, а значит, ограничение (x ¹ 0) всегда будет истинным.
4.Выходные данные: x, y
5.Блок-схема алгоритма:
Примечание. Для решения поставленной задачи необходимо организовать циклический вычислительный процесс по параметруx. С помощью цикла будет организован перебор всех значений х из заданного интервала xn ≤ x ≤ xk с шагом Dx. На каждом шаге цикла для текущего значениях будет вычисляться в соответствии с условиями отбора значение у.
Например, в качестве исходных данных возьмем интервал0 ≤ x ≤ 6 (xn=0 и xk=6)с шагом Dx=2. Тогда на каждом шаге цикла будут получены следующие значения:
1 шаг: для x = xn = 0, выполняется 1-е условие отбора (x < 2) и у будем вычислять по 1-й формуле, содержащей ограничение ax>0, которое необходимо проверить перед вычислением у по заданной формуле.
2 шаг: для x = 2 (x+Dx=0+2), выполняется 2-е условие отбора (2 £ x £ 4) и у будем вычислять по2-й формуле, содержащей ограничение a+x ³ 0, которое необходимо проверить перед вычислением у по заданной формуле.
Ó Ефименко К.Н. |
Информатика |
2
3шаг: для x = 4 (x+Dx=2+2), выполняется 2-е условие отбора (2 £ x £ 4) и у будем вычислять по2-й формуле, содержащей ограничение a+x ³ 0, которое необходимо проверить перед вычислением у по заданной формуле.
4шаг: для x = 6 (x+Dx=4+2), выполняется 3-е условие отбора (x > 4) и у будем вычислять по 3-й формуле, ограничение в которой проверять перед вычислением у по заданной формуле не надо.
5шаг: для x = 8 (x+Dx=6+2) не выполнится условие входа в цикл (x ≤ xk=6) и произойдет выход из цикла.
1
НАЧАЛО
+
+ |
5 |
|
|
ax>0 |
|
6 |
|
|
|
|
|
y = ax2 + ln(ax) |
|
– |
|
|
ln не |
|
существует |
A
Изменение
параметра
цикла
+
Условие входа в цикл
|
|
|
|
2 |
|
|
Подготовка |
||||
|
Ввод a,xn,xk,Dx |
|
|
|
|
|
к циклу |
||||
|
|
|
|
|
|
|
|
|
|||
|
3 |
|
|
|
|
|
|
|
|
|
|
|
x = xn |
|
|
|
|
|
|
|
|
Тело |
|
|
4 |
|
– |
|
|
|
|
цикла |
|||
|
|
|
|
|
|
|
|||||
|
x < 2 |
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|||
|
+ |
|
8 |
– |
|
|
|
|
|||
|
|
x > 4 |
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|||
|
|
9 |
|
|
|
|
|
+ |
10 |
||
|
y = a / x + cos x |
|
|
||||||||
7 |
|
|
|
a+x³0 |
|||||||
|
|
|
11 |
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
y = x2 + |
|
|
|
|
|
|
|
|
|
|
|
|
a + x |
|
– |
12
Корень не существует
13
A
Вывод x, y
14 |
A |
x = x + Dx
15
–
x ≤ xk
16
КОНЕЦ
Ó Ефименко К.Н. |
Информатика |
3
6. Описание блок-схемы:
Блок 2 – ввод исходных данных.
Блок 3 – подготовка к циклу(присваивание параметру циклаx начального значения).
Блоки 4-15 – тело цикла с постусловием по параметру x.
Блоки 4, 8 – проверка условий отбора. Блоки 5, 10 – проверка ограничений.
Блоки 6, 9, 11 – вычисление текущего значения у. Блоки 7, 12 – вывод сообщений.
Блок 13 – вывод текущих значений х и у.
Блок 14 – вычисление следующего значения х (изменение параметра цикла).
Блок 15 – условие входа в цикл.
Организация цикла для всех вариантов задания4.1 выполняется аналогичным образом (см. ниже). Отличия в алгоритме будут только при вычисленииу в соответствии с заданными условиями отбора.
1
НАЧАЛО
2
Ввод a,xn,xk,Dx
3
x = xn
Вычисление текущего значения у по заданным условиям отбора
|
Переход при |
13 |
невыполнении |
ограничения |
Вывод x, y
14 A
x= x + Dx
+ |
15 |
– |
|
x ≤ xk |
|||
|
|
||
|
|
16
КОНЕЦ
Ó Ефименко К.Н. |
Информатика |
4
7. Программа решения задачи на ++,С реализованная с помощью компилятора
Dev-C++.
//Директивы процессора
#include <cstdlib> #include <iostream> #include <math.h> #include <stdio.h> using namespace std;
//Начало главной функции программы int main(int argc, char *argv[])
{//Описание переменных float a,b,x,xn,xk,dx,y;
//Ввод исходных данных a и xn,xk,dx cout<<"Input a="; cin>>a; cout<<"Input xn="; cin>>xn; cout<<"Input xk="; cin>>xk; cout<<"Input dx="; cin>>dx;
//Подготовка к циклу x=xn;
do //Начало тела цикла
{
if (x<2)
{
if (a*x>0) y=a*x*x+log(a*x); else
{//Вывод сообщения о невыполнении ограничения cout<<"For x="<<x<<"\t No ln!"<<endl;
goto m1; } //Переход по метке
}
else
{
if (x>4) y=a/x+cos(x); else
{
if (a+x>=0) y=x*x+sqrt(a+x); else
{//Вывод сообщения о невыполнении ограничения cout<<"For x="<<x<<"\t No radiсal!"<<endl; goto m1; } //Переход по метке
}
}
//Вывод результата x и у
cout<<"For x="<<x<<"\t y="<<y<<endl; m1: x=x+dx; //Изменение параметра цикла
}
Ó Ефименко К.Н. |
Информатика |
5
while(x<=xk); //Конец тела цикла
system("PAUSE"); return EXIT_SUCCESS;
}
8. Результаты работы программы.
4.2. ВЫЧИСЛЕНИЕ В ЦИКЛЕ СУММЫ, ПРОИЗВЕДЕНИЯ И КОЛИЧЕСТВА ЗНАЧЕНИЙ
Задание 4.2. В соответствии с вариантом задания, используя цикл с предусловием, составить блок-схему алгоритма и программу на языке ++,С которая для каждого значения х из заданного интервала xn ≤ x ≤ xk с шагом Dx вычисляет соответствующие значения y=f(x). Для ввода-вывода данных использовать функ-
ции scanf(), printf().
Пример выполнения задания 4.2
ПОСТАНОВКА ЗАДАЧИ:
1.Исходные данные: a, xn, xk, Dx
2.Математическая модель:
y = ln(x +1) + cos2 (x - a)
Вычислить количество y£a
Вычислить сумму (S) и произведение (P) значений у:
S = åy |
P =Õy |
y>a |
y<a |
Ó Ефименко К.Н. |
Информатика |
|
|
|
|
|
6 |
3. Ограничения: |
|
|
|
|
|
а) выражение под знаком логарифма x+1 > 0 – проверять. |
|
||||
4. Выходные данные: x, y, S, P и k. |
|
|
|
||
5. Блок-схема алгоритма: |
|
|
|
|
|
|
Подготовка |
НАЧАЛО |
|
|
|
|
к циклу |
|
|
|
|
Тело |
|
|
Ввод a, xn, xk, Dx |
|
|
цикла |
|
|
|
||
|
|
|
|
|
Условие |
|
|
x = xn; S = 0; P = 1; k = 0 |
входа в |
||
|
|
цикл |
|||
|
|
|
|
|
|
|
Проверка |
x £ xk |
- |
|
|
|
ограничения |
|
|
||
|
|
|
+ |
Вывод S, P, k |
|
Если текущее |
|
+ |
x+1>0 |
- |
КОНЕЦ |
значение у |
y = ln(x +1) + cos2 (x - a) |
|
|||
больше a, то |
|
|
|||
оно накапли- |
|
|
|
Текущее значение |
|
вается в сум- |
|
|
|
||
Вывод x,y |
|
|
у оказалось £ a, и |
||
ме S |
|
|
|||
|
|
|
|
|
его учитываем в |
|
|
|
|
|
количестве k |
|
+ |
y > a |
- |
|
|
Если текущее |
S = S + y |
|
k = k + 1 |
ln не су- |
|
значение у бу- |
|
|
|
ществует |
|
дет еще и < a, |
|
|
|
|
|
то оно накап- |
|
+ |
y < a |
|
|
ливается в |
|
|
|
||
произведении |
|
P = P × y |
- |
|
|
P |
|
|
|
||
|
|
x = x + Dx |
|
Изменение |
|
|
|
|
|
параметра |
|
|
|
|
|
цикла |
|
6. Программа решения задачи на С++. |
|
|
|
||
#include <cstdlib> |
|
|
|
|
|
#include <iostream> |
|
|
|
||
#include <math.h> |
|
|
|
|
|
#include <stdio.h> |
|
|
|
|
|
using namespace std; |
|
|
|
||
int main(int argc, char *argv[]) |
|
|
|||
Ó Ефименко К.Н. |
|
|
|
|
Информатика |
7
{float xn,xk,dx; float a,x,y,S,P; int k;
//Ввод исходных данных
printf("Input a="); scanf("%f",&a); printf("Input xn="); scanf("%f",&xn); printf("Input xk="); scanf("%f",&xk); printf("Input dx="); scanf("%f",&dx); x=xn; S=0; P=1; k=0;
//Начало тела цикла с предусловием while (x<=xk)
{
if (x+1>0)
{
y=log(x+1)+pow(cos(x-a),2); printf("For x=%5.1f\ty=%7.3f\n",x,y); if (y>a) S+=y;
else
{
k++;
if (y<a) P*=y;
}
}
else
printf("For x=%5.1f\ty=Error!\n",x); x+=dx;
}//Конец тела цикла printf("\nS=%7.3f\tP=%7.3f\tk=%d\n",S,P,k);
system("PAUSE"); return EXIT_SUCCESS;
}
7. Результаты работы программы
Ó Ефименко К.Н. |
Информатика |
8
4.3. ОРГАНИЗАЦИЯ ВЛОЖЕННЫХ ЦИКЛОВ
Задание 4.3. В соответствии с вариантом задания составить блок-схему алгоритма и программу на языкеC++ для расчета указанной модели при всех комбинациях a и b, значения которых заданы в виде интерваловan ≤ a ≤ ak с шагом Da и bn ≤ b ≤ bk с шагом Db соответственно. Циклы по параметрам a и b должны быть разного типа. Для ввода данных использовать поток cin, для вывода – cout.
Пример выполнения задания 4.3 ПОСТАНОВКА ЗАДАЧИ:
1. Исходные данные: an, ak, Da, bn, bk, Db. 2. Математическая модель:
z= bx - ab + 2 x2 +1
x=1 - tg (1 + a)
3.Ограничения:
а) формула для вычислениях содержит функциюtg(), следовательно, cos(1+a)¹0 – проверять;
б) формула для вычисления y: подкоренное выражение должно быть неотрица-
тельным ab+2 ³ 0 – проверять;
в) формула для вычисления y: знаменатель не должен быть равен нулю x2+1 ¹ 0
–не проверять, т.к. это неравенство всегда является истинным.
4.Выходные данные: a, b, x, z.
5.Блок-схема алгоритма:
Примечание. Внешним рационально выбрать цикл по параметру a, так как х (должен вычисляться первым) зависит только от a. Значение х необходимо вычислять во внешнем цикле, это позволит избежать многократного вычисления одних и тех же значений х. Во внутреннем цикле по параметру b будет вычисляться значение z, которое зависит от двух параметров а и b.
Если бы х и z зависели от двух параметров а и b, то значения х и z вычислялись бы во внутреннем цикле.
Блок 2 – ввод исходных данных.
Блок 3 – подготовка к внешнему циклу по параметру a. Блоки 4-16 – тело внешнего цикла с предусловием. Блок 4 – условие входа во внешний цикл.
Блоки 5, 9 – проверка ограничений.
Блок 8 – подготовка к внутреннему циклу по параметру b. Блоки 9-14 – тело внутреннего цикла с постусловием.
Блок 13 – изменение параметра внутреннего цикла (вычисление следующего значения b).
Блок 14 – условие входа во внутренний цикл.
Блок 16 – изменение параметра внешнего цикла(вычисление следующего значения а).
При каждом значении параметра внешнего циклаа, вычисляется одно зна-
Ó Ефименко К.Н. |
Информатика |
9
чение х и во внутреннем цикле будут перебираться все значения параметраb. Для каждой полученной во внутреннем цикле комбинации значений и b будет вычисляться соответствующее значение z.
|
|
|
1 |
|
|
|
|
|
|
|
|||
|
|
|
|
НАЧАЛО |
|
|
|
|
|
|
|
||
Тело |
|
|
|
|
|
|
|
|
|
|
2 |
|
|
|
|
|
Ввод an, ak, Da, bn, bk, Db |
|
|
|
|||||||
внешнего |
|
|
|
|
|
|
|||||||
цикла |
|
|
|
|
|
|
3 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
a = an |
|
|
|
|
|
|
|
|
|
+ |
|
|
|
|
|
|
|
|
|
|
||
|
|
4 |
|
|
|
– |
|
|
|
||||
|
|
|
|
a ≤ ak |
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
17 |
||||
|
|
|
|
|
|
|
|
|
|
|
|||
|
– |
5 |
+ |
|
КОНЕЦ |
||||||||
|
|
cos(1+a)¹0 |
|
|
|
||||||||
|
|
|
|
6 |
|
|
|
||||||
15 |
|
|
|
|
|
|
|
|
|
||||
tg не |
|
|
|
|
|
x = 1 - tg (1 + a) |
|
|
|
||||
|
|
|
|
|
|
|
|
|
|||||
|
существует |
|
|
|
|
7 |
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
Вывод |
|
|
Тело |
|
|
|
|
|
|
|
|
|
|
a,x |
|
|
внутреннего |
|
|
|
|
|
|
|
8 |
|
|
цикла |
|||
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
b = bn |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+ |
9 |
_ |
|
|||||||
|
|
|
|
|
|
ab+2≥0 |
|
||||||
|
|
|
|
|
|
|
|
|
|
12 |
|||
|
|
|
10 |
|
|
|
|
||||||
|
|
|
|
|
|
|
|
Корень не |
|||||
|
|
|
z = |
bx - ab + |
2 |
|
|
|
|
||||
|
|
|
|
|
|
|
существует |
||||||
|
|
|
x2 +1 |
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
11 |
|
|
|
|
|
|
||||
|
|
|
|
Вывод |
|
|
|
|
|
|
|
||
|
|
|
|
|
b,z |
|
|
|
|
|
|
|
|
|
|
|
13 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
b = b + Db |
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|||
|
_ |
|
14 |
+ |
|
|
|
||||||
|
|
|
b ≤ bk |
|
|
|
|||||||
16 |
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
a = a + Da
Ó Ефименко К.Н. |
Информатика |
10
6. Программа решения задачи на С++.
#include <cstdlib> #include <iostream> #include <math.h> #include <stdio.h> using namespace std;
int main(int argc, char *argv[])
{float a,b,x,z;
float an,ak,da,bn,bk,db; cout<<"Input an="; cin>>an; cout<<"Input ak="; cin>>ak; cout<<"Input da="; cin>>da; cout<<"Input bn="; cin>>bn; cout<<"Input bk="; cin>>bk; cout<<"Input db="; cin>>db; a=an;
//Начало внешнего цикла с предусловием while (a<=ak)
{
if (cos(1+a)!=0)
{x=1-tan(1+a);
cout<<"a="<<a<<"\t x="<<x<<endl; b=bn;
//Начало внутреннего цикла с постусловием do
{
if (a*b>=0)
{z=(b*x-sqrt(a*b+2))/(x*x+1);
cout<<"\tb="<<b<<"\t z="<<z<<endl;
}
else
//Вывод сообщения о невыполнении ограничения cout<<"\tb="<<b<<"\t No radical!"<<endl;
b=b+db;
}
while (b<=bk); //Конец внутреннего цикла
}
else
//Вывод сообщения о невыполнении ограничения cout<<"\a="<<a<<"\t No tg!"<<endl;
a=a+da;
} //Конец внешнего цикла system("PAUSE");
return EXIT_SUCCESS;
}
Ó Ефименко К.Н. |
Информатика |