- 001
- 002
- 003
- 004
- 005
- 006
- 007
- 008
- 009
- 010
- 011
- 012
- 013
- 014
- 015
- 016
- 017
- 018
- 019
- 020
- 021
- 022
- 023
- 024
- 025
- 026
- 027
- 028
- 029
- 030
- 031
- 032
- 033
- 034
- 035
- 036
- 037
- 038
- 039
- 040
- 041
- 042
- 043
- 044
- 045
- 046
- 047
- 048
- 049
- 050
- 051
- 052
- 053
- 054
- 055
- 056
- 057
- 058
- 059
- 060
- 061
- 062
- 063
- 064
- 065
- 066
- 067
- 068
- 069
- 070
- 071
- 072
- 073
- 074
- 075
- 076
- 077
- 078
- 079
- 080
- 081
- 082
- 083
- 084
- 085
- 086
- 087
- 088
- 089
- 090
- 091
- 092
- 093
- 094
- 095
- 096
- 097
- 098
- 099
- 100
#include <iostream>
#include <string>
using namespace std;
class Govnokod {
bool _flag_dot;
bool _flag_mant;
int _index_mant;
bool vetka1(int i, const string stroka) {
for (int j = i++; j < stroka.length(); j++) {
switch (stroka[j]) {
case '.':
if (_flag_dot) return false;
_flag_dot = true;
break;
case '0' ... '9': break;
default:
return false;
break; }}
return true;}
bool vetka2_dalshe(const string stroka) {
for (int j = 1; j < stroka.length(); j++) {
switch (stroka[j]) {
case '0' ... '9': break;
default:
return false;
break; }}
return true; }
bool vetka2(const string stroka) {
switch (stroka[0]) {
case '+':
case '-':
if (stroka.length() < 2) return false;
return vetka2_dalshe(stroka);
break;
case '0' ... '9':
return vetka2_dalshe(stroka);
break;
default:
return false;
break; }}
bool mantissa(const string stroka) {
for (int j = 0; j < stroka.length(); j++) {
switch (stroka[j]) {
case 'e':
case 'E':
if ((_flag_mant) or (j == (stroka.length() - 1))) return false;
_flag_mant = true;
_index_mant = j;
break; }}
return true; }
bool Dalshe(int i, const string stroka) {
_flag_dot = false;
_flag_mant = false;
if (not mantissa(stroka)) return false;
else if (_flag_mant) {
string sub1 = stroka.substr(0, _index_mant);
string sub2 = stroka.substr(_index_mant+1);
return (vetka1(i, sub1) and vetka2(sub2)); }
else return vetka1(i, stroka); }
bool proverka(const string stroka) {
switch (stroka[1]) {
case '0' ... '9':
return Dalshe(1, stroka);
break;
default:
return false;
break; }}
bool general_proverka(const string stroka) {
switch (stroka[0]) {
case '-':
case '+':
if (stroka.length() > 1) return proverka(stroka);
else return false;
break;
case '0' ... '9':
return Dalshe(0, stroka);
break;
default:
return false;
break; }}
public:
long double opros(char s) {
string argument;
while (true) {
cout << "Введите значение " << s << ": ";
getline(cin, argument);
if (argument.length() == 0)
cout << "Вы не ввели значение!" << endl;
else if (not general_proverka(argument))
cout << "Некорректное значение!" << endl;
else
return strtold(argument.c_str(), nullptr); }
}
} obj;
int main() {
for (char c = 'a'; c < 'd'; c++) {
long double result = obj.opros(c);
cout << "Значение: " << result << " -- корректное!" << endl;
}
}
Westnik_Govnokoda 25.12.2020 17:42 # 0
string cut_incorrect_symbol(string stroka) {
int j, i;
string buf;
for (j = 0, i = 0; j < stroka.length(); j++) {
switch (stroka[j]) {
case '0' ... '9':
case '-':
case '+':
case '.':
case 'e':
case 'E':
buf[j-i] = stroka[j];
break;
default:
i++;
break;
}
}
cout << "Значение buf == " << buf << endl;
return buf;
}
bormand 25.12.2020 17:52 # +2
> buf[j-i] = stroka[j];
Типичный вылет за границы буфера. В данном случае buf[...] вообще нельзя трогать т.к. конструктор по-умолчанию создаёт строку пустой (нулевой длины). Иначе ты перетираешь чужую память и получаешь неопределённое поведение.
Можешь добавлять в неё символы push_back()'ом. Либо resize()'нуть до нужного размера перед тем как лезть к ней скобочками.
MAKAKA 25.12.2020 18:32 # 0
Westnik_Govnokoda 25.12.2020 19:10 # 0
1024-- 25.12.2020 23:00 # +1
ryadovoy_ispytanie
Steve_Brown 28.12.2020 10:45 # 0
general.where(general.orders)
// Угадай мелодию
Мистер Хэнки 15.01.2021 11:47 # 0
Desktop 15.01.2021 13:53 # 0
inkanus_gray 15.01.2021 22:20 # 0
slesar_kip 25.08.2021 19:34 # 0