- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
#include <string>
#include <iostream>
int main() {
std::string kakoi("Какой багор )))", 5);
std::string bagor((std::string)"Какой багор )))" , 5);
std::cout << kakoi << bagor << std::endl;
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
0
#include <string>
#include <iostream>
int main() {
std::string kakoi("Какой багор )))", 5);
std::string bagor((std::string)"Какой багор )))" , 5);
std::cout << kakoi << bagor << std::endl;
}
Наверняка было, но ладно.
https://ideone.com/syFnI2
0
#include <iostream>
using namespace std;
const char _Arr_Digit [] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'},
_Arr_Mantissa [] = {'e', 'E'},
_Arr_Sign [] = {'-', '+'},
_Arr_Dot[] = {'.'},
_Arr_Combo[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.'};
const bool DIGIT = false, SIGN = false, OTHER = true;
bool _Call_Mantissa = false, _flag_dot = false, _flag_mant = false;
int _position_mant;
bool Parse_symbol (char _symb, const char* _Arr, int _size_arr);
bool Parse_full_string (string _checking, int _offset, int _amount, bool _sec_cond, const char* _Arr, int _size_arr, bool _Drive);
bool Parse_the_first_symbol (string _checking);
bool Parse_the_second_symbol (string _checking);
bool Control_result (int i, string _checking);
bool Parse_mantissa (string _checking);
bool Parse_full_string_before_mantissa (int i, string _checking);
bool Parse_the_first_symbol_after_mantissa (string _checking);
bool Parse_full_string_after_mantissa (string _checking);
long double Questioning (char s);
long double Questioning (char s) {
string _checking;
while (true) {
cout << "Введите значение " << s << ": ";
getline(cin, _checking);
if (_checking.length() == 0)
cout << "Вы не ввели значение!" << endl;
else if (!Parse_the_first_symbol(_checking))
cout << "Некорректное значение!" << endl;
else return strtold(_checking.c_str(), nullptr); }}
bool Parse_symbol (char _symb, const char* _Arr, int _size_arr) {
for (int i = 0; i <= _size_arr; i++)
if (_symb == _Arr[i]) return true;
return false; }
bool Parse_full_string (string _checking, int _offset, int _amount, bool _sec_cond, const char* _Arr, int _size_arr, bool _Drive) {
bool _parse_flag;
int _parse_count = 0;
for (int j = _offset; j < _amount; j++) {
if (Parse_symbol(_checking[j], _Arr, _size_arr)) {
_parse_count++;
if (_sec_cond) return false;
if (_Drive) {
if (_Call_Mantissa)
_sec_cond = (j == (_amount-1));
if (_parse_flag) return false;
_parse_flag = true;
if (_Call_Mantissa) {
_flag_mant = _parse_flag;
_position_mant = j;
}
}
}
}
if (!_Drive) {
if ((_amount - _offset) == _parse_count) return true;
else return false;
}
else return true;
}
bool Parse_the_first_symbol (string _checking) {
int LENGTH = _checking.length();
bool _parse_cond = (LENGTH < 2);
if (Parse_full_string (_checking, 0, 1, _parse_cond, _Arr_Sign, 1, SIGN))
return Parse_the_second_symbol (_checking);
else if (Parse_full_string (_checking, 0, 1, false, _Arr_Digit, 9, DIGIT))
return Control_result (0, _checking);
else return false; }
bool Parse_the_second_symbol (string _checking) {
if (Parse_full_string (_checking, 1, 2, false, _Arr_Digit, 9, DIGIT))
return Control_result (1, _checking);
else return false; }
bool Control_result (int i, string _checking) {
if (!Parse_mantissa (_checking)) return false;
else if (_flag_mant) {
string _before_mantissa = _checking.substr(0, _position_mant);
string _after_mantissa = _checking.substr(_position_mant + 1);
return (Parse_full_string_before_mantissa (i, _before_mantissa)
&& Parse_the_first_symbol_after_mantissa (_after_mantissa)); }
else return Parse_full_string_before_mantissa (i, _checking); }
bool Parse_mantissa (string _checking) {
int LENGTH = _checking.length();
_Call_Mantissa = true;
bool cash = Parse_full_string (_checking, 0, LENGTH, false, _Arr_Mantissa, 1, OTHER);
_Call_Mantissa = false;
return cash; }
bool Parse_full_string_before_mantissa (int i, string _checking) { // but the first symbol
int LENGTH = _checking.length();
return Parse_full_string (_checking, i, LENGTH, false, _Arr_Dot, 0, OTHER) &&
Parse_full_string (_checking, i, LENGTH, false, _Arr_Combo, 10, DIGIT); }
bool Parse_the_first_symbol_after_mantissa (string _checking) {
int LENGTH = _checking.length();
bool _parse_cond = (LENGTH < 2);
if ((Parse_full_string (_checking, 0, 1, _parse_cond, _Arr_Sign, 1, SIGN)) ||
(Parse_full_string (_checking, 0, 1, false, _Arr_Digit, 9, DIGIT)))
return Parse_full_string_after_mantissa (_checking);
else return false; }
bool Parse_full_string_after_mantissa (string _checking) {
int LENGTH = _checking.length();
return Parse_full_string (_checking, 1, LENGTH, false, _Arr_Digit, 9, DIGIT); }
Очередная говнопопытка оптимизации алгоритма.
0
#include <iostream>
#include <cmath>
#include <iomanip>
#include "govno.h"
using namespace std;
void prnt_msg_start() {
cout << endl << "Программа решения квадратного уравнения по формуле: ";
cout << "aX^2 + bX + c = 0" << endl;
cout << setprecision(69) << endl; }
long double ks[] = {1, 2, 1, 3, 10, 2};
class SqrtQual {
const string msg_not_roots = "Нет корней!\n",
msg_any_number = "X -- любое число.\n",
msg_special_event = "Решение частного случая (bX + c = 0):\n",
msg_discrim = "Дискриминант = ";
long double A, B, C, D, X1, X2;
bool flag_roots = true, flag_equal_zero, flag_special_event, flag_not_equal_zero,
flag_any_number, flag_input = true, flag_abs_roots, flag_cubes_roots;
void init_fields();
string answer();
bool to_decide();
void to_start();
public:
SqrtQual ();
SqrtQual (int z);
SqrtQual (long double a, long double b, long double c);
};
void variation_task(int variant) {
if (!variant) SqrtQual obj;
else {
for (int i = 0, j = 0; i < 2; i++, j += 3) {
if (variant < 2) SqrtQual obj(ks[j], ks[j+1], ks[j+2]);
else SqrtQual obj(i);
}
}
}
int main() {
prnt_msg_start();
for (int i = 1; i < 3; i++) variation_task(i);
}
SqrtQual::SqrtQual(int z) {
if (z) flag_abs_roots = true;
else flag_cubes_roots = true;
to_start(); }
SqrtQual::SqrtQual() {
to_start(); }
SqrtQual::SqrtQual(long double a, long double b, long double c) {
A = a;
B = b;
C = c;
flag_input = false;
to_start(); }
void SqrtQual::to_start() {
cout << endl;
if (flag_input) Govnokod l_obj(A, B, C);
init_fields();
cout << answer(); }
void SqrtQual::init_fields() {
flag_any_number = ((A == 0) && (B == 0) && (C == 0));
flag_not_equal_zero = ((A == 0) && (B == 0) && (C != 0));
flag_special_event = ((A == 0) && (B != 0) && (C != 0));
bool equal_zero_v1 = ((A == 0) && (B != 0) && (C == 0));
bool equal_zero_v2 = ((A != 0) && (B == 0) && (C == 0));
flag_equal_zero = equal_zero_v1 || equal_zero_v2;
D = B*B - 4*A*C;
if ((D < 0) || flag_not_equal_zero)
flag_roots = false; }
string SqrtQual::answer() {
string tmp = msg_discrim + to_string(D) + "\n";
if (flag_special_event)
tmp = msg_special_event + tmp;
if (flag_any_number)
return msg_any_number;
else if (not flag_roots)
return msg_not_roots;
else {
bool flag_args = to_decide();
string root1("X = "), root2("X2 = ");
if (flag_abs_roots) {
root1 = "| X | = ", root2 = "| X2 | = ";
X1 = abs(X1), X2 = abs(X2);
}
else if (flag_cubes_roots) {
root1 = "X ^3 = ", root2 = "X2 ^3 = ";
X1 = pow(X1, 3), X2 = pow(X2, 3);
}
tmp += root1 + to_string(X1) + "\n";
if (flag_args)
tmp += root2 + to_string(X2) + "\n";
}
return tmp;
}
bool SqrtQual::to_decide() /* if true then two roots else one root */ {
if (flag_equal_zero) X1 = 0;
else if (flag_special_event) X1 = (-C/B); // special event
else if (D == 0) X1 = (-B/2*A);
else {
X1 = ((-B + sqrt(D)) / 2*A), X2 = ((-B - sqrt(D)) / 2*A);
return true; }
return false; }
Немного расширил функционал говнокода с учётом замечаний (в том числе и по архитектуре).
0
#include <iostream>
#include <cmath>
#include "govno.h"
using namespace std;
class SqrtQual {
const string not_kor = "Нет корней!\n";
long double A;
long double B;
long double C;
long double D;
void vspomog();
void konez();
public:
void hello();
} obj;
int main() {
obj.hello();
}
void SqrtQual::hello() {
cout << "Программа решения квадратного уравнения по формуле: ";
cout << "aX^2 + bX + c = 0" << endl;
Govnokod obj;
A = obj.opros('a');
B = obj.opros('b');
C = obj.opros('c');
cout << endl;
konez();
}
void SqrtQual::vspomog() {
D = B*B - 4*A*C;
cout << "Дискриминант = " << D << endl;
if (D < 0)
cout << not_kor;
else if (D == 0)
cout << "X = " << (-B/(2*A));
else {
long double dsqrt = sqrt(D);
cout << "X1 = " << ((-B + dsqrt) / 2*A) << endl;
cout << "X2 = " << ((-B - dsqrt) / 2*A) << endl;
}
}
void SqrtQual::konez() {
bool any_digit = ((A == 0)
and (B == 0)
and (C == 0));
bool not_equal_zero = ((A == 0)
and (B == 0)
and (C != 0));
bool equal_zero_v1 = ((A == 0)
and (B != 0)
and (C == 0));
bool equal_zero_v2 = ((A != 0)
and (B == 0)
and (C == 0));
bool equal_zero = equal_zero_v1
or equal_zero_v2;
bool bx_plus_c = ((A == 0)
and (B != 0)
and (C != 0));
if (any_digit)
cout << "X -- любое число." << endl;
else if (not_equal_zero) {
cout << C << " != 0" << endl;
cout << not_kor;
}
else if (equal_zero)
cout << "X = 0" << endl;
else if (bx_plus_c) {
cout << "Решение частного случая (bX + c = 0):" << endl;
cout << "X = " << (-C/B) << endl;
}
else vspomog();
}
Попытался убрать лишнее из кода, возможно стало немного лучше, но это не точно...
+1
#include <iostream>
#include <cmath>
#include "govno.h"
using namespace std;
class SqrtQual {
const string not_kor = "Нет корней!\n";
struct ABC {
long double kA;
long double kB;
long double kC;
} gABC;
long double diskrim(long double a, long double b, long double c);
void diskrim_zero(long double a, long double b);
void diskrim_bolshe(long double a, long double b, long double d);
void vspomog();
void konez();
void m_bx_plus_c();
public:
void hello();
} obj;
int main() {
obj.hello();
}
void SqrtQual::hello() {
cout << "\nПрограмма вычисления корней квадратного уравнения по формуле: ";
cout << "aX^2 + bX + c = 0\n";
Govnokod obj;
gABC.kA = obj.opros('a');
gABC.kB = obj.opros('b');
gABC.kC = obj.opros('c');
cout << endl;
konez();
}
long double SqrtQual::diskrim(long double a, long double b, long double c) {
long double ac4 = 4*a*c;
long double bkv = pow(b, 2);
long double d = bkv - ac4;
cout << "Дискриминант = " << d << endl;
return d;
}
void SqrtQual::diskrim_zero(long double a, long double b) {
if (a == 0)
cout << not_kor;
else {
long double x = -b/(2*a);
cout << "X = " << x;
}
}
void SqrtQual::diskrim_bolshe(long double a, long double b, long double d) {
if (a == 0)
cout << not_kor;
else {
long double dsqrt = sqrt(d);
long double a2 = a * 2;
long double x1 = (-b + dsqrt) / a2;
long double x2 = (-b - dsqrt) / a2;
cout << "X1 = " << x1 << endl;
cout << "X2 = " << x2 << endl;
}
}
void SqrtQual::m_bx_plus_c() {
long double x = -gABC.kC/gABC.kB;
cout << "X = " << x << endl;
}
void SqrtQual::vspomog() {
long double D = diskrim(gABC.kA, gABC.kB, gABC.kC);
if (D < 0)
cout << not_kor;
else if (D == 0)
diskrim_zero(gABC.kA, gABC.kB);
else
diskrim_bolshe(gABC.kA, gABC.kB, D);
}
void SqrtQual::konez() {
bool any_digit = ((gABC.kA == 0) and
(gABC.kB == 0) and
(gABC.kC == 0));
bool not_equal_zero = ((gABC.kA == 0) and
(gABC.kB == 0) and
(gABC.kC != 0));
bool equal_zero_v1 = ((gABC.kA == 0) and
(gABC.kB != 0) and
(gABC.kC == 0));
bool equal_zero_v2 = ((gABC.kA != 0) and
(gABC.kB == 0) and
(gABC.kC == 0));
bool equal_zero = equal_zero_v1 or equal_zero_v2;
bool bx_plus_c = ((gABC.kA == 0) and (gABC.kB != 0));
if (any_digit)
cout << "X -- любое число.";
else if (not_equal_zero) {
cout << gABC.kC << " -- Не равно нулю!";
cout << not_kor; }
else if (equal_zero)
cout << "X = 0";
else if (bx_plus_c)
m_bx_plus_c();
else vspomog();
}
Вот для этой проги я писал предыдущие говнокоды. Тут нет решений для множества комплексных чисел пока что.
0
#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) {
if (stroka.length() == 0) return false;
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; }}
string cut_incorrect_symbol(const 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.push_back(stroka[j]);
break;
default: i++; break; }}
return buf; }
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(cut_incorrect_symbol(argument))) cout << "Некорректное значение!" << endl;
else return strtold(argument.c_str(), nullptr); }}};
Модифицированная версия говнокода проверки строки на корректность соответствия символов типу long double: изначально вырезаются все левые символы. А вообще этот модуль "govno.h", я написал для основной проги для решения квадратного уравнения.
0
#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;
}
}
Решил попробовать в стиле ООП переписать.
0
#include <iostream>
#include <string>
using namespace std;
bool vetka1(bool &flag, int i, const string stroka) {
int j = 1;
for (j += i; j < stroka.length(); j++) {
switch (stroka[j]) {
case '.':
if (flag) return false;
flag = true;
break;
case '1' ... '9': break;
default: return false; } }
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; } }
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, bool &flag, int &index) {
for (int j = 0; j < stroka.length(); j++) {
switch (stroka[j]) {
case 'e':
case 'E':
if (flag) return false;
if (j == (stroka.length() - 1)) return false;
flag = true;
index = j;
break; } }
return true; }
bool Dalshe(int i, const string stroka) {
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(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; } }
long double opros(char s) {
string argument;
do {
cout << "Введите значение " << s << ": ";
getline(cin, argument);
if (argument.length() == 0) cout << "Вы не ввели значение!" << endl;
else if (not general_proverka(argument)) cout << "Некорректное значение!" << endl;
else break;
} while (true);
return atof(argument.c_str()); }
int main() {
for (char i = 'a'; i < 'd'; i++) {
long double a = opros(i);
cout << "Значение: " << a << " - корректное!" << endl;
}
}
В общем, частично переписал некоторые куски кода. Отчасти тут предыдущая версия (с дублированием кода),
что, конечно, не менее говно, но зато стало чуть читабельнее и работает без очевидных багов, как в исходной версии,
например: если в исходной версии ввести - "3w", то значение отображалось, как корректное, что не верно.
0
#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);
}
Проверяет введённую строку на корректность соответствия символов,
входящих в тип - long double. Если введённая строка корректна, приводит
данную строку к типу - long double. Иначе - просит заново ввести значение.
+1
//Попробуйте программно смоделировать разговор людей.Всего есть 10 людей.Каждый человек имеет имя(строку) и возраст(число).
//Возраст каждого человека генерируется рандомно из диапазона от 20 до 40, а имена состоят из следующего списка:
//Александр, Андрей, Анастасия, Ирина, Наталья, Павел, Роман, Светлана, Сергей, Татьяна.
//Любой человек способен выполнять два действия :
//-здороваться с другим человеком;
//-рассказывать о себе.
//Люди делятся на 3 типа(разные классы) :
// Тип №1 : Формалисты.Здороваются со всеми следующим образом : Здравствуйте, <имя>!, где <имя> — это имя человека, с которым он здоровается.
// Тип №2 : Неформалы.Со всеми здороваются : Привет, <имя>!.
// Тип №3 : Реалисты.Если возраст собеседника меньше / равен или не больше, чем на 5 лет, то здороваются следующим образом : Привет, <имя>!, в противном случае — Здравствуйте, <имя>!.
// В программной реализации приветствие должно быть реализовано как полиморфный метод, принимающий человека в качестве параметра и возвращающий строку.
// Рассказ о человеке является строкой формата "Меня зовут Вася, мой возраст 21 лет и я неформал" (вместо Вася используется имя любого другого человека,
// вместо 21 возраст этого человека, вместо неформал может быть формалист, либо реалист).Как видите у людей с грамматикой не всё в порядке,
// и они говорят лет после любого числа — непорядок, это нужно обязательно исправить.
// Программа должна показать информацию обо всех людях.Затем все люди должны поздороваться друг с другом в следующем порядке :
// первый здоровается со вторым, затем второй с первым, а затем первый с третьим, третий с первым и т.д.Например :
// Петя : Привет, Вася!
// Вася : Здравствуйте, Петя!
// Петя : Привет, Женя!
// Женя : Привет, Петя!
unique_ptr<Person>& createPerson()
{
switch (getRandomNumber(0, 2))
{
case 0:
{
unique_ptr<Person> person = make_unique<Formalist>(RANDNAME_0_10, RANDAGE_20_40);
return person;
}
case 1:
{
unique_ptr<Person> person = make_unique<Neformal>(RANDNAME_0_10, RANDAGE_20_40);
return person;
}
case 2:
{
unique_ptr<Person> person = make_unique<Realist>(RANDNAME_0_10, RANDAGE_20_40);
return person;
}
default:
{
unique_ptr<Person> person = nullptr;
return person;
}
};
}
void createGroup(vector<unique_ptr<Person>>& group, int8_t size)
{
unique_ptr<Person> tempPerson = nullptr;
for (int i = 0; i < size; ++i)
{
tempPerson = std::move(createPerson());
group.push_back(tempPerson);
}
}
Не могу понять как инициализировать массив в createGroup() через unique_pointers. Нужно ли было изначально возвращать shared pointers из createPerson()? Или использовать перемещения с unique_pointers? И куда по правильному впихивать using namespace std; если не в global scope? Спасибо заранее
Полный код
https://repl.it/@radionnazmiev/Ravesli#Ravesli_12_H/main.cpp