- 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);
}
KAPA6AXCKuu_nemyx 21.12.2020 22:54 # 0
bormand 22.12.2020 00:47 # 0
bormand 22.12.2020 00:42 # 0
Westnik_Govnokoda 22.12.2020 03:03 # 0
bormand 22.12.2020 09:27 # 0
Кресты -- не функциональный язык. Оптимизатор, конечно, умеет хвостовую рекурсию в цикл переделывать. Но лучше на это не полагаться и написать цикл самому.
guest6 22.12.2020 11:59 # 0
кстати, а строку почему не по констрефу?
guest6 22.12.2020 12:53 # 0
guest6 22.12.2020 12:59 # 0
bormand 22.12.2020 16:54 # 0
Цифры, конечно, и так всегда по порядку. Но вот буквы во всяких ebcdic с разрывом.
gost 22.12.2020 16:14 # 0
Я, кстати, за «std::string_view».
MAKAKA 22.12.2020 16:16 # 0
guest6 22.12.2020 16:23 # 0
MAKAKA 22.12.2020 16:27 # 0
guest6 22.12.2020 16:34 # 0
bormand 22.12.2020 16:39 # 0
MAKAKA 22.12.2020 16:43 # 0
bormand 22.12.2020 16:45 # 0
З.Ы. В целом, если забить на поломавшийся код, мне новый вариант больше нравится. Он более интуитивный для программиста.
MAKAKA 22.12.2020 16:54 # 0
Не нужно только вот про бесплатное удаление молодого поколения: тысяча запусков ГЦ даже для молодняка это не бесплатно для интерактивного приложения.
Но да: удержать в ГЦ метровую строку, повесив ее на сабстинг из двух чаров стало невозможно.
Правильное решение было бы иметь И такой метод И такой (С++сник бы наверное так и сделал?), но увы: джавари слишком тупы
bormand 22.12.2020 16:55 # 0
З.Ы. Ну т.е. просто subSequence() позвать вместо subString() если нужно старое поведение, лол.
Только не говори, что сиквенсы тоже копируются.
MAKAKA 22.12.2020 17:02 # 0
bormand 22.12.2020 17:03 # 0
MAKAKA 22.12.2020 17:05 # 0
bormand 22.12.2020 17:07 # 0
З.Ы. CharBuffer + slice() или subSequence() походу должен прокатить. У них в доке есть гарантия что буфера расшарены.
MAKAKA 22.12.2020 17:14 # 0
gost 22.12.2020 17:13 # +1
Desktop 22.12.2020 17:15 # +1
gost 22.12.2020 17:19 # 0
Но я таки напиздел, логарифмический там только random access, а подсрока осталась O(N).
UPD: Тьфу, не посмотрел на ссылку внимательно, там какая-то питушня.
bormand 22.12.2020 17:32 # +1
Надо было ещё что-нибудь про сборку SOAP запросов с помощью этой Rope скинуть, чтобы роскомнадзор забанил за пропаганду.
MAKAKA 22.12.2020 17:15 # +1
Неужели все (кроме си и си плюс плюс) программисты недостаточно умны, чтобы ответить на вопрос: вы хотите копию, или указатель на кусочек данных?
bormand 22.12.2020 17:17 # +1
Прикладной программист не обязан думать над такими низкоуровневыми вещами.
guest6 22.12.2020 16:52 # 0
MAKAKA 22.12.2020 17:01 # 0
Но в джава есть ГЦ, так что нужно еще учесть время на удаление