Лб инф передел / OTChET2_4
.docxСАНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ МОРСКОГО И РЕЧНОГО ФЛОТА ИМ. АДМИРАЛА МАКАРОВА
КАФЕДРА ВЫЧИСЛИТЕЛЬНЫХ СИСТЕМ И ИНФОРМАТИКИ
Лабораторная работа № 2.4.
Разветвляющиеся программы. Циклы.
Таблица значений функции
Вариант № 100
Работу выполнила
студентка гр. ИС-11
Примерная Елена
Работу принял
доцент кафедры ВСиИ
Неклюдова С.А.
Санкт-Петербург
2012
-
Условие задачи
Вычислить и вывести на экран в виде таблицы значения функции Fна интервале от Хнач.. доХкон. с шагом dX.
где a, b, c– действительные числа.
Функция Fдолжна принимать действительное значение, если выражение НЕ(Ац ИЛИ Вц И НЕ (Ац ИЛИ Сц) не равно 0 и целое значение в противном случае.
Через Ац, Вц и Сц обозначены целые части значений a, b, c, операции НЕ, И и ИЛИ – поразрядные. Значения a, b, c, Хнач., Хкон., dX ввести с клавиатуры.
-
Таблица имен
Имя объекта в задаче |
Имя объекта в программе |
Тип объекта |
Содержательный смысл |
a |
a |
вещественное число |
исходное данное |
b |
b |
вещественное число |
исходное данное |
c |
c |
вещественное число |
исходное данное |
Хнач. |
Xn |
вещественное число |
исходное данное |
Хкон/. |
Xk |
вещественное число |
исходное данное |
dX |
dX |
вещественное число |
исходное данное |
x |
x |
вещественное число |
расчетная переменная |
F |
F |
вещественное число |
расчетная переменная |
|
whole |
логическая переменная |
при whole = True выводится целое число, при whole = False - вещественное |
|
rupture |
логическая переменная |
rupture=True означает разрыв функции |
-
Блок-схема алгоритма
начало ВводXn,
Xk, dX,a, b, c Вывод
“шапки”
таблицы
1 1 2 3 5 4 False True
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 True True False True False False False True False True False True False True
-
Трассировочная таблица
№ шага |
№ блока на блок-схеме |
Результаты вычислений |
||||||||||
|
1 |
ВводXn=1, Xk=1.5, dX=0.5, a=2, b=1, c=2 |
||||||||||
|
2 |
Вывод “шапки” таблицы |
||||||||||
|
3 |
|
||||||||||
|
5 |
whole = true |
||||||||||
|
6 |
x=Xn=1 |
||||||||||
|
7 |
rupture=false |
||||||||||
|
8 |
(x<0) (b≠0) (1<0) (1≠0) True |
||||||||||
|
9 |
cxa=0 (2)∙(1)2=0 22=0 True |
||||||||||
|
10 |
rupture=true |
||||||||||
|
19 |
rupture True |
||||||||||
|
20 |
Выводстрокиx, “Разрыв” (1, Разрыв) |
||||||||||
|
6 |
x=x+dX=1.0+0.5=0.5 |
||||||||||
|
7 |
rupture=false |
||||||||||
|
8 |
(x<0) ( b≠0) (0.5<0) (1≠0) True |
||||||||||
|
9 |
cxa=0 (2)∙(0.5)2=0 12=0 False |
||||||||||
|
11 |
|||||||||||
|
19 |
rupture False |
||||||||||
|
21 |
whole True |
||||||||||
|
22 |
Вывод строки x, Fцелое (0.5 1) |
||||||||||
|
6 |
x=x+dX=0.5+0.5=0 |
||||||||||
|
7 |
rupture=false |
||||||||||
|
8 |
(x<0) ( b≠0) (0<0) (1≠0) False |
||||||||||
|
12 |
(x>0) (b=0) (0>0) (1=0) False |
||||||||||
|
16 |
(c=0) (x=0) (2=0) (0=0) True |
||||||||||
|
17 |
rupture=true |
||||||||||
|
19 |
rupture True |
||||||||||
|
20 |
Выводстрокиx, “Разрыв” (0, Разрыв) |
||||||||||
|
6 |
x=x+dX=0+0.5=0.5 |
||||||||||
|
7 |
rupture=false |
||||||||||
|
8 |
(x<0) ( b≠0) (0.5<0) (1≠0) False |
||||||||||
|
12 |
(x>0) (b=0) (0.5>0) (1=0) False |
||||||||||
|
16 |
(c=0) (x=0) (2=0) (0.5=0) False |
||||||||||
|
18 |
|||||||||||
|
19 |
rupture False |
||||||||||
|
21 |
whole True |
||||||||||
|
22 |
Вывод строки x, Fцелое (0.5 2) |
||||||||||
|
6 |
x=x+dX=0.5+0.5=1 |
||||||||||
|
7 |
rupture=false |
||||||||||
|
8 |
(x<0) ( b≠0) (1<0) (1≠0) False |
||||||||||
|
12 |
(x>0) ( b=0)
|
||||||||||
|
16 |
(c=0) (x=0) (2=0) (1=0) False |
||||||||||
|
18 |
|||||||||||
|
19 |
rupture False |
||||||||||
|
21 |
whole True |
||||||||||
|
22 |
Вывод строки x, Fцелое (1 1) |
||||||||||
|
6 |
x=x+dX=1+0.5=1.5 |
||||||||||
|
7 |
rupture=false |
||||||||||
|
8 |
(x<0) ( b≠0) (1.5<0) (1≠0) False |
||||||||||
|
12 |
(x>0) (b=0) (0>0) (1=0) False |
||||||||||
|
16 |
(c=0) (x=0) (2=0) (1.5=0) False |
||||||||||
|
18 |
|||||||||||
|
19 |
rupture False |
||||||||||
|
21 |
whole True |
||||||||||
|
22 |
Вывод строки x, Fцелое (1.5 1) |
||||||||||
|
6 |
x=x+dX=1.5+0.5=2 x>Xk (2>1.5) |
||||||||||
|
24 |
Вывод “подвала” таблицы |
||||||||||
|
25 |
Конец |
-
Код программы
#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
setlocale(0,"Rus");
double Xn, Xk, dX, a, b, c, F;
bool whole;
// Ввод исходных данных
cout <<"Введите Xn="; cin >> Xn;
cout <<"Введите Xk="; cin >> Xk;
cout <<"Введите dX="; cin >> dX;
cout <<"Введите a="; cin >> a;
cout <<"Введите b="; cin >> b;
cout <<"Введите c="; cin >> c;
// Вывод “шапки” таблицы
cout<<"--------------------"<< endl;
cout<<"| X | F |"<< endl;;
cout<<"--------------------"<< endl;
// Выполнение побитовой операции НЕ(Ац ИЛИ Вц) И НЕ(Ац ИЛИ Сц) ≠ 0
whole = ((~(static_cast<int>(a) | static_cast<int>(b)) & ~(static_cast<int>(a) | static_cast<int>(c))) != 0) ? false: true;
// Вывод строк таблицы
for (double x = Xn; x <= Xk; x += dX)
{
bool rupture = false;
if ((x < 0) &&( b != 0))
if (c * x - a == 0)
rupture = true;
else
F = -(2 * x - c) / (c * x - a);
else
if ((x > 0) && (b == 0 ))
if (x - c == 0)
rupture = true;
else
F = (x - a)/(x - c);
else
if ((c == 0)||(x == 0))
rupture = true;
else
F = -(x / c) - c / 2 / x;
cout << fixed;
if (rupture)
cout <<"|"<< setw(6) << setprecision(1) << x << setw(2)<< "|" <<setw(9) << "Разрыв" << setw(2) << "|" << endl;
else
if (whole)
cout << "|" << setw(6) << setprecision(1) << x << setw(2) << "|" << setw(9) << static_cast<int>(F) << setw(2) << "|" << endl;
else
cout << "|" << setw(6) << setprecision(1) << x << setw(2) << "|" << setw(9) << setprecision(4) << F << setw(2) << "|" << endl;
}
// Вывод “подвала” таблицы
Cout << "--------------------" << endl;
return 0;
}
-
Тестирование программы
Xn=1, Xk=1.5, dX=0.5, a=2, b=1, c=2
Ац=210=00102 |
Ац=210=00102 |
Bц=110=00012 |
Cц=210=11102 |
Ац ИЛИ Вц=00112 |
Ац ИЛИ Сц=11102 |
НЕ(Ац ИЛИ Вц)=11002 |
НЕ (Ац ИЛИ Сц)=00012 |
НЕ(Ац ИЛИ Вц) И НЕ (Ац ИЛИ Сц)=11002 И 00012=00002 выводить Fцелое |
x |
F |
Результаты расчета |
1.0 |
Разрыв |
Этот вариант проверен трассировкой, результаты совпадают. |
0.5 |
1 |
|
0.0 |
Разрыв |
|
0.5 |
2 |
|
1.0 |
1 |
|
1.5 |
1 |
Xn=1, Xk=2.5, dX=0.5, a=2, b=0, c=1
|
Ац=210=00102 |
Ац=210=00102 |
||
|
Bц=010=00002 |
Cц=110=00012 |
||
|
Ац ИЛИ Вц=00102 |
Ац ИЛИ Сц=00112 |
||
|
НЕ(Ац ИЛИ Вц)=11012 |
НЕ (Ац ИЛИ Сц)=11002 |
||
|
НЕ(Ац ИЛИ Вц) И НЕ (Ац ИЛИ Сц)=11012 И 11002=11002 выводить Fвеществ. |
|||
x |
F |
Результаты расчета |
||
1.0 |
1.5000 |
|||
0.5 |
1.5000 |
|||
0.0 |
Разрыв |
Недопустимая операция – деление на 0 |
||
0.5 |
3.0000 |
|||
1.0 |
Разрыв |
Недопустимая операция – деление на 0 |
||
1.5 |
1.0000 |
|||
2.0 |
0.0000 |
|||
2.5 |
0.3333 |
-
Результаты и выводы
Поскольку результаты трассировки и тестирования программы совпали с результатами выполнения программы на компьютере, алгоритм разработан верно.