- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
#include <iostream>
#include <string>
using namespace std;
long double opros(char s);
bool proverka(string stroka, int i, bool (*func)(int, string, bool &));
bool magia(string stroka, int i, bool (*func)(int, string, bool &));
int main() {
long double a;
for (char i = 'a'; i < 'd'; i++) { a = opros(i);
cout << "\n\nЗначение:\n" << a << " - корректное!\n";}}
bool f_break(int i, string s, bool &z){
return true;}
bool sub_func_mantissa(int j, string stroka, bool &flag, int &index) {
switch (stroka[j]) {
case 'e':
case 'E':
if ((flag) or (j == (stroka.length() - 1))) return false;
flag = true;
index = j;
break;
} return true;
}
bool sub_func_vetka1(int j, string stroka, bool &flag) {
if (stroka[j] == '.') {
if (flag) return false;
flag = true;
}
return true;
}
bool zikl_vetka(string stroka, int i, bool &flag, int &index, bool (*p_base_func)(int, string, bool &), char Drive) {
int j = 1;
bool flag_zikla = true;
for (j += i; j < stroka.length(); j++) {
if (not (Drive == 'M')) {
if (not ((flag_zikla) or (p_base_func(j, stroka, flag)))) return false;
flag_zikla = proverka(stroka, j, f_break);
} else {
if (not sub_func_mantissa(j, stroka, flag, index)) return false;
}
}
return true;
}
bool vetka1(bool &flag, int i, string stroka) {
int index;
return zikl_vetka(stroka, i, flag, index, sub_func_vetka1, 'O');
}
bool vetka2_dalshe(int i, string stroka, bool &z) {
bool flag = false;
int index;
return zikl_vetka(stroka, i, flag, index, f_break, 'O');
}
bool vetka2(string stroka) {
return magia(stroka, 1, vetka2_dalshe);
}
bool mantissa(string stroka, bool &flag, int &index) {
return zikl_vetka(stroka, -1, flag, index, f_break, 'M');
}
bool Dalshe(int i, string stroka, bool &z) {
int index_mant;
bool flag_dot = false;
bool flag_mant = false;
if (not mantissa(stroka, flag_mant, index_mant)) return false;
else {
if (flag_mant) {
string sub1 = stroka.substr(0, index_mant);
string sub2 = stroka.substr(index_mant+1);
return (vetka1(flag_dot, i, sub1) and vetka2(sub2));}
else return vetka1(flag_dot, i, stroka);}}
bool proverka(string stroka, int i, bool (*func)(int, string, bool &)) {
cout << " ---> proverka ";
bool z = true;
switch (stroka[i]) {
case '0': case '1': case '2':case '3':case '4': case '5': case '6': case '7': case '8': case '9': return func(i, stroka, z); break;
default:
return false;
break;}}
bool magia(string stroka, int i, bool (*func)(int, string, bool &)) { //3
switch (stroka[0]) {
case '-':
case '+': if (stroka.length() > 1) return proverka(stroka, i, func);
else return false; break;
default:
return proverka(stroka, 0, func); break;}}
bool general_proverka(string stroka) {
return magia(stroka, 1, Dalshe);}
long double opros(char s) { //1
string argument;
cout << "\nВведите значение: " << s << ": ";
getline(cin, argument);
if (argument.length() == 0) {
cout << "Вы не ввели значение!\n";
return opros(s);
}
else if (not general_proverka(argument)) {
cout << "\n\nНекорректное значение!\n";
return opros(s);
}
else return strtold(argument.c_str(), nullptr);
}