Advertisement
LisunovaMaryna

c++ lab4_2

Mar 12th, 2024
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.70 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <string>
  4.  
  5. void PrintCondition()
  6. {
  7.     std::cout << "Goal: using a recursive function, find the square root with a given accuracy using Newton's iterative formula.\n";
  8. }
  9.  
  10. void PrintResult(std::ostream& outStream, double y,
  11.     std::string header)
  12. {
  13.     if (y != 0)
  14.     {
  15.         outStream << header << y;
  16.     }
  17. }
  18.  
  19. double InputNumUnlimited()
  20. {
  21.     double number;
  22.     bool isCorrect = false;
  23.     do
  24.     {
  25.         std::cin >> number;
  26.  
  27.         if (std::cin.fail())
  28.         {
  29.             std::cin.clear();
  30.             std::cerr << "\nUnexpected symbol entered\n";
  31.  
  32.             while (std::cin.get() != '\n');
  33.         }
  34.         else if (std::cin.get() != '\n')
  35.         {
  36.             std::cout << "\nIncorrect value\n";
  37.  
  38.             while (std::cin.get() != '\n');
  39.         }
  40.         else
  41.         {
  42.             isCorrect = true;
  43.         }
  44.  
  45.     } while (!isCorrect);
  46.  
  47.     return number;
  48. }
  49.  
  50. double InputNumber(double min, double max)
  51. {
  52.     double number;
  53.     bool isCorrect = false;
  54.     do
  55.     {
  56.         number = InputNumUnlimited();
  57.  
  58.         if (number < min)
  59.         {
  60.             std::cerr << "\nMinimal allowed value is " << min << "\n";
  61.         }
  62.         else if (number > max)
  63.         {
  64.             std::cerr << "\nMaximum allowed value is " << max << "\n";
  65.         }
  66.         else
  67.         {
  68.             isCorrect = true;
  69.         }
  70.  
  71.     } while (!isCorrect);
  72.  
  73.     return number;
  74. }
  75.  
  76. char ReadCondition()
  77. {
  78.     char condition;
  79.     std::cout << "\nWould you like to enter matrix manually [m] or get from file [f] ? \n";
  80.     bool selected = false;
  81.     do
  82.     {
  83.         std::cin >> condition;
  84.         if (condition != 'm' && condition != 'f')
  85.         {
  86.             while (std::cin.get() != '\n');
  87.             std::cout << "\nPlease type [m] or [f]\n";
  88.         }
  89.         else
  90.         {
  91.             if (std::cin.get() != '\n')
  92.             {
  93.                 while (std::cin.get() != '\n');
  94.                 std::cout << "\nPlease type [m] or [f]\n";
  95.             }
  96.             else
  97.             {
  98.                 selected = true;
  99.             }
  100.         }
  101.  
  102.     } while (!selected);
  103.  
  104.     return condition;
  105. }
  106.  
  107. double InputValue(std::string text, int min, int max)
  108. {
  109.     double value;
  110.     std::cout << "\nInput " + text;
  111.     value = InputNumber(min, max);
  112.     return value;
  113. }
  114.  
  115. double CountRoot(double yi1, double x, double eps)
  116. {
  117.     double yi;
  118.     yi = 0.5 * (yi1 + x / yi1);
  119.  
  120.     if (abs(yi - yi1) < eps)
  121.     {
  122.         return yi;
  123.     }
  124.     else
  125.     {
  126.         return CountRoot(yi, x, eps);
  127.     }
  128. }
  129.  
  130. double InputSourceValuesManually()
  131. {
  132.     double y;
  133.     double y0 = 1;
  134.     double x;
  135.     double eps;
  136.     constexpr int imin = std::numeric_limits<int>::min();
  137.     constexpr int imax = std::numeric_limits<int>::max();
  138.     x = InputValue("X (1..10000): ", 1, 10000);
  139.     eps = InputValue("EPS (0<EPS<1): ", 0, 1);
  140.  
  141.     y = CountRoot(y0, x, eps);
  142.  
  143.     return y;
  144. }
  145.  
  146. bool IsFileExist(std::string fileName)
  147. {
  148.     std::ifstream in(fileName);
  149.     return in.good();
  150. }
  151.  
  152. bool HasTxtExtension(std::string fileName)
  153. {
  154.     int length = fileName.length();
  155.  
  156.     if (length < 5)
  157.     {
  158.         return false;
  159.     }
  160.     if (fileName[length - 4] != '.')
  161.     {
  162.         return false;
  163.     }
  164.     if (fileName[length - 3] != 't')
  165.     {
  166.         return false;
  167.     }
  168.     if (fileName[length - 2] != 'x')
  169.     {
  170.         return false;
  171.     }
  172.     if (fileName[length - 1] != 't')
  173.     {
  174.         return false;
  175.     }
  176.  
  177. }
  178.  
  179. std::string InputFilePath(bool checkExistence)
  180. {
  181.     std::string fileName;
  182.     bool isCorrect = false;
  183.     do
  184.     {
  185.         std::cout << "\nInput file path (*.txt):\n";
  186.         std::getline(std::cin, fileName);
  187.         if (fileName.length() < 5)
  188.         {
  189.             std::cerr << '\n' << "invalid file name\n";
  190.         }
  191.         else if (!HasTxtExtension(fileName))
  192.         {
  193.             std::cerr << '\n' << "invalid file extension \n";
  194.         }
  195.         else if (checkExistence && !IsFileExist(fileName))
  196.         {
  197.             std::cerr << '\n' << fileName << " is not found \n";
  198.         }
  199.         else
  200.         {
  201.             isCorrect = true;
  202.         }
  203.     } while (!isCorrect);
  204.  
  205.     return fileName;
  206. }
  207.  
  208. double GetValue(std::ifstream& inStream)
  209. {
  210.     double value = 0;
  211.     try
  212.     {
  213.         inStream >> value;
  214.         if (inStream.fail())
  215.         {
  216.             return 0;
  217.         }
  218.         else
  219.         {
  220.             return value;
  221.         }
  222.     }
  223.     catch (...)
  224.     {
  225.         return 0;
  226.     }
  227. }
  228.  
  229. double GetSourceValuesFromFile()
  230. {
  231.     double x;
  232.     double eps;
  233.     double y;
  234.     double y0 = 1;
  235.     std::string filename;
  236.     filename = InputFilePath(true);
  237.     try
  238.     {
  239.         std::ifstream in(filename);
  240.         if (in.is_open())
  241.         {
  242.  
  243.             x = GetValue(in);
  244.             if ((x < 1) || (x > 10000))
  245.             {
  246.                 std::cerr << "\nReading X's error. Not correct value.";
  247.                 in.close();
  248.                 return 0;
  249.             }
  250.  
  251.             eps = GetValue(in);
  252.             if ((eps < 0.0001) || (eps >= 1))
  253.             {
  254.                 std::cerr << "\nReading EPS's error. Not correct value.";
  255.                 in.close();
  256.                 return 0;
  257.             }
  258.  
  259.             if (not(in.eof()))
  260.             {
  261.                 std::cerr << "\nToo much data.";
  262.                 return 0;
  263.             }
  264.  
  265.             std::cout << "\nX: " << x;
  266.             std::cout << "\nEPS: " << eps;
  267.  
  268.             y = CountRoot(y0, x, eps);
  269.  
  270.             return y;
  271.             in.close();
  272.         }
  273.     }
  274.     catch (...)
  275.     {
  276.         std::cerr << "Read error.";
  277.     }
  278. }
  279.  
  280. double GetRealValues()
  281. {
  282.     char condition = ReadCondition();
  283.  
  284.     if (condition == 'm')
  285.     {
  286.         return InputSourceValuesManually();
  287.     }
  288.     else
  289.     {
  290.         return GetSourceValuesFromFile();
  291.     }
  292. }
  293.  
  294. bool SaveResult(std::string filename, double y)
  295. {
  296.     std::ofstream outf(filename);
  297.  
  298.     if (!outf)
  299.     {
  300.         std::cerr << filename << " could not be opened for writing!\n";
  301.         return false;
  302.     }
  303.     PrintResult(outf, y, "\nRoot of the equation : ");
  304.  
  305.     outf.close();
  306.     return true;
  307. }
  308.  
  309. void InputFilePathAndSaveResult(double y)
  310. {
  311.     if (y != 0)
  312.     {
  313.         std::string path;
  314.         bool isCorrect = false;
  315.         do
  316.         {
  317.             path = InputFilePath(false);
  318.             isCorrect = SaveResult(path, y);
  319.  
  320.         } while (!isCorrect);
  321.  
  322.         std::cout << "\nCompleted!\n";
  323.     }
  324. }
  325.  
  326. int main()
  327. {
  328.     double y;
  329.  
  330.     std::string outFilename;
  331.  
  332.     PrintCondition();
  333.  
  334.     y = GetRealValues();
  335.  
  336.     PrintResult(std::cout, y, "Root of the equation: ");
  337.  
  338.     InputFilePathAndSaveResult(y);
  339. }
  340.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement