/
lyapdy
/
Object_oriented_programming_cpp_318
Обзор
Документация
Войти
/
lyapdy
/
Object_oriented_programming_cpp_318
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
lab5/task_7.cpp
239 строк
7 KB
danillyapunov
5th commit
21 авг 2025, 15:59
21 авг 2025, 15:59
646f4d9
Код
Авторство
О чём код?
#include <iostream> #include <cstring> #include <string> #include <typeinfo> #include "task_7.h" #include <string> #include <sstream> #include <cmath> std::string intToString(int num) { // ��ࠡ�⪠ ��� � ����⥫��� �ᥫ if (num == 0) return "0"; bool isNegative = false; if (num < 0) { isNegative = true; // �ᯮ��㥬 ����������� �८�ࠧ������, �⮡� �������� ��९������� �� -2147483648 if (num == INT_MIN) { return "-2147483648"; } num = -num; } std::string result = ""; while (num > 0) { int digit = num % 10; result = char('0' + digit) + result; // ������塞 ���� � ��砫� ��ப� num /= 10; } if (isNegative) { result = '-' + result; } return result; } int stringToInt(const std::string& str) { int result = 0; int sign = 1; size_t i = 0; // �ய�᪠�� ���� � ��砫� (�� �������� � �⠭����� ����������) while (i < str.length() && str[i] == ' ') { ++i; } if (i >= str.length()) { return 0; // ��ப� ����� ��� ⮫쪮 ���� } // ���塞 ���� if (str[i] == '-') { sign = -1; ++i; } else if (str[i] == '+') { ++i; } // ��ࠡ�⪠ ��� while (i < str.length()) { char c = str[i]; if (c < '0' || c > '9') { break; // �����४�� ᨬ��� ? ��⠭���������� } // ��ઠ �� ��९������� (���) if (result > (INT_MAX - (c - '0')) / 10) { return (sign == 1) ? INT_MAX : INT_MIN; } result = result * 10 + (c - '0'); ++i; } return result * sign; } std::string floatToString(float num, int precision = 6) { // ��ࠡ�⪠ ᯥ樠���� ��砥� if (num != num) return "nan"; // NaN if (num == 340282346638528859811704183484516925440.0000000000000000) return "inf"; if (num == -340282346638528859811704183484516925440.0000000000000000) return "-inf"; bool isNegative = false; if (num < 0) { isNegative = true; num = -num; } if (num == 0.0f) return "0.0"; // �⤥�塞 楫�� ���� int intPart = static_cast<int>(num); float fracPart = num - intPart; std::string result = intToString(intPart); // �ᯮ��㥬 ���� intToString if (precision > 0) { result += '.'; // ��ࠡ��뢠�� ���� ���� for (int i = 0; i < precision; ++i) { fracPart *= 10; int digit = static_cast<int>(fracPart); result += char('0' + digit); fracPart -= digit; // ��⠭��, � ���� ���� �⠫� 0 if (fracPart == 0.0f) break; } } if (isNegative) { result = '-' + result; } return result; } float stringToFloat(const std::string& str) { size_t i = 0; int sign = 1; float result = 0.0f; float fracMultiplier = 1.0f; bool hasDigits = false; // �ய�� ����� � ��砫� while (i < str.length() && str[i] == ' ') { ++i; } if (i >= str.length()) { return 0.0f; // ����� ��ப� } // ��ࠡ�⪠ ����� if (str[i] == '-') { sign = -1; ++i; } else if (str[i] == '+') { ++i; } // ��ઠ �� "inf" ��� "nan" (�� ���⢨⥫쭮 � ॣ�����) if (i < str.length()) { if (str[i] == 'i' || str[i] == 'I') { // ���塞 "inf" ��� "infinity" if (str.length() >= i + 3 && (str[i+1] == 'n' || str[i+1] == 'N') && (str[i+2] == 'f' || str[i+2] == 'F')) { return sign == 1 ? INFINITY : -INFINITY; } } if (str[i] == 'n' || str[i] == 'N') { // ���塞 "nan" if (str.length() >= i + 3 && (str[i+1] == 'a' || str[i+1] == 'A') && (str[i+2] == 'n' || str[i+2] == 'N')) { return sign * NAN; // NaN �� ������ �� �����, �� ��� ᮢ���⨬��� } } } // ���ᨭ� ��� �� �窨 ��� 'e' while (i < str.length() && str[i] >= '0' && str[i] <= '9') { result = result * 10.0f + (str[i] - '0'); hasDigits = true; ++i; } // ���� ���� �� �窨 if (i < str.length() && str[i] == '.') { ++i; // �ய�᪠�� ��� while (i < str.length() && str[i] >= '0' && str[i] <= '9') { fracMultiplier *= 0.1f; result += (str[i] - '0') * fracMultiplier; hasDigits = true; ++i; } } // ��ᯮ���樠�쭠� ����: e ��� E if (i < str.length() && (str[i] == 'e' || str[i] == 'E')) { ++i; int expSign = 1; int expValue = 0; if (i < str.length() && str[i] == '-') { expSign = -1; ++i; } else if (i < str.length() && str[i] == '+') { ++i; } // ���뢠�� ���� ��ᯮ����� while (i < str.length() && str[i] >= '0' && str[i] <= '9') { expValue = expValue * 10 + (str[i] - '0'); hasDigits = true; ++i; } // �ਬ��塞 ��ᯮ�����: 㬭����� �� 10^(expSign * expValue) float power = 1.0f; float base = (expSign == 1) ? 10.0f : 0.1f; int absExp = expValue; for (int j = 0; j < absExp; ++j) { power *= base; } result *= power; } // � �� �뫮 �� ����� ���� ? �����頥� 0 if (!hasDigits) { return 0.0f; } return sign * result; } void task_7() { std::cout << "������� 7" << '\n'; std::string str1, str2; int iVal = -1; // 楫�� ����⥫쭮� � float fVal = 0.09f; // � � ������饩 �窮� float std::cout << "��室�� �: iVal = " << iVal << ", fVal = " << fVal << '\n'; std::cout << "���� ��室��� �ᥫ: iVal - " << typeid(iVal).name() << ", fVal - " << typeid(fVal).name() << '\n'; str1 = intToString(iVal); // �८�ࠧ㥬 楫�� � � ��ப� str2 = floatToString(fVal); // �८�ࠧ㥬 � � ������饩 �窮� � ��ப� std::cout << "�८�ࠧ������ � ��ப� �: iVal = " << str1 << ", fVal = " << str2 << '\n'; std::cout << "���� �८�ࠧ������� � ��ப� �ᥫ:\niVal - " << typeid(str1).name() << ", \nfVal - " << typeid(str2).name() << '\n'; iVal = stringToInt(str1); // �८�ࠧ㥬 ��ப� � ���祭�� int fVal = stringToFloat(str2); // �८�ࠧ㥬 ��ப� � ���祭�� float std::cout << "���⭮ �८�ࠧ������ �: iVal = " << iVal << ", fVal = " << fVal << '\n'; std::cout << "���� ���⭮ �८�ࠧ������� �ᥫ: iVal - " << typeid(iVal).name() << ", fVal - " << typeid(fVal).name() << '\n'; }