-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlab3.cpp
193 lines (167 loc) · 5.59 KB
/
lab3.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
#include <iostream>
#include <iomanip>
#include <algorithm>
#include <cmath>
#include <assert.h>
#include <stdlib.h>
#include <Windows.h>
#include <string>
#define groupno 3
using namespace std;
//epsilon for float comparison
#define EPS 0.001
//euler constant
const double Euler = std::exp(1.0);
/*
Лабораторна робота 3
виконав Вітязь Денис
Варіант 3
*/
/*допоміжні функції*/
double text2nums(std::string input,int index){ //перетворення тексту в числа
//може бути розділена або пробілами або комами
bool mode = input.find(",") != std::string::npos;
char mchr = mode ? ',' : ' ';
//mode 0 - space separated
//mode 1 - comma separated
size_t pos = 0;
size_t prevpos = 0;
size_t i = 0;
std::string number;
while (pos<input.length()){
//входження розділювача
pos = input.find_first_of(mchr, prevpos);
if(pos == std::string::npos){
//як нема розділювача то це кінець
pos = input.length();
}
//вирізаємо число
number = input.substr(prevpos, pos-prevpos);
// stod - строка в double
if(i == index){
return std::stod(number);
}
prevpos = pos+1;
i++;
}
return 0;
}
size_t countcomma(std::string input){ //кількість чисел в рядку
bool mode = input.find(",") != std::string::npos;
char mchr = mode ? ',' : ' ';//можемо розділювати або пробілами або комами
return std::count(input.begin(), input.end(), mchr) + 1;
}
double sumfx(double x){//варіант 6 - сума функцій
return ((x-1.8)*sin(3*x)) / ((1.5*x+3)*(x+7)) + 4.2 * powf(Euler,-1.2*x);
}
double prodfx(double x){//варіант 7 - добуток функцій
return 7 * powf(Euler, -3.3*x) + (5.5*x + 3*cos(4*x)) / (4.3*(2*x+5.1));
}
double tabfx(double x, double y){//3 завдання - таблиця значень функцій
return log(x + sqrt(x*x + y*y));
}
/*задачі*/
void task1(std::string str, double* sum, size_t* count){
//double* - вказівник на змінну, *sum - звернення до змінної
size_t numslen = countcomma(str);
for(int i=0;i<numslen;i++){
//дістаємо число
double n = text2nums(str,i);
//додаємо до суми або до кількості
if(n >= 0)
*sum = *sum + n;
else
(*count)++;
}
}
double task2(){
double a=0;
double b=1;
/*
i+8
Σ sumfx(x) = for(int x=i;x<=i+8;x++) a+=sumfx(x);
x=i
*/
for(int x=groupno;x<=groupno+8;x++)
a += sumfx(x);
std::cout << "DEBUG: a = " << a << std::endl;
/*
i+5
П prodfx(x) = for(int x=i;x<=i+5;x++) b*=prodfx(x);
x=i
*/
for(int x=groupno;x<=groupno+5;x++)
b *= prodfx(x);
std::cout << "DEBUG: b = " << b << std::endl;
//Z=tg(b) - a
return tan(b) - a;
}
double task3(){
//ln(x+/(x2+y2)) 1 3 0 1 0.05
double a = 1;
double b = 3;
double c = 0;
double d = 1;
double h = 0.05;
//шапка таблиці
std::cout << "x" << std::setw(6) << "y" << std::setw(11) << "f(x,y)" << std::endl;
for(int i=0;i<20;i++) std::cout << "_";
std::cout << std::endl;
for(double x=a; x<b+h; x+=h){
for(double y=c; y<d+h; y+=h){
//setw встановлює ширину поля для рівного виводу
std::cout << std::setw(6) << std::left << x;
std::cout << std::setw(6) << std::left << y;
std::cout << std::setw(8) << std::left << tabfx(x,y) << std::endl;
}
//якщо протабулювали всі х тоді не треба питати
if(x+h > b) break;
Sleep(200);
std::cout<<"Продовжити? (esc - вихід, return - продовжити)"<<std::endl;
while(true){
//чекаємо на подію клавіатури
if(GetAsyncKeyState(VK_ESCAPE)) return 0;
if(GetAsyncKeyState(VK_RETURN)) break;
}
}
}
bool test(){
//test task1
std::string seq = "1,2,3,4,5,-5,-4,-3,-2,-1";
double sum = 0;
size_t count = 0;
task1(seq, &sum, &count);
assert(sum == 15);
assert(count == 5);
//test task2
assert(fabs(task2() + 0.172856) < EPS);
//test task3
assert(fabs(tabfx(1,1) - 0.881374) < EPS);
std::cout<<"Тести пройдено успішно!"<<std::endl;
return true;
}
/*основна функція*/
int main(){
//set console encoding to utf-8
SetConsoleOutputCP(CP_UTF8);
std::string buf;
double sum = 0;
size_t count = 0;
std::cout<<"Введіть послідовність розділену комами або пробілами: \n";
std::getline(std::cin, buf);
task1(buf, &sum, &count);
std::cout<<"Сума: "<<sum<<std::endl;
std::cout<<"Кількість від'ємних: "<<count<<std::endl;
std::cout<<std::endl;
std::cout<<"Значення Z: "<<task2()<<std::endl;
std::cout << std::endl;
//clear key buffer
while(GetAsyncKeyState(VK_RETURN)){}
std::cout << "Таблиця значень функції: " << std::endl;
task3();
//clear key buffer
while(GetAsyncKeyState(VK_RETURN)){}
std::cout<<std::endl<<"Запускаємо тести"<<std::endl;
test();
return 0;
}