Vladislav_Bezruk

Untitled

Dec 16th, 2021
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.61 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <cmath>
  4.  
  5. //допустимі межі змінних для перевірки
  6. #define qA 1e-9
  7. #define qB 2e-9
  8. #define eA 12e-11
  9. #define eB 15e-11
  10. #define rA 1e-4
  11. #define rB 3e-4
  12.  
  13. #define EPS 1e-18
  14.  
  15. //помилка при діленні на нуль
  16. #define DIV_ERROR       "Cannot be divided by zero!"
  17.  
  18. //помилка відриття файла
  19. #define OPEN_ERROR      "The file cannot be opened!"
  20.  
  21. //помилки при некоректних параметрах
  22. #define E_ERROR     "Param e is invalid!"
  23. #define R_ERROR     "Param q is invalid!"
  24. #define Q_ERROR     "Param r is invalid!"
  25.  
  26. //вхідний та вихідний файли
  27. #define INPUT_FILE  "input.txt"
  28. #define OUTPUT_FILE "output.txt"
  29.  
  30. using namespace std;
  31.  
  32. //абстрактний клас об’єкт_обчислення
  33. class calcObject {
  34.     protected:
  35.         //обчислюваний параметр
  36.         float calcParam;
  37.    
  38.     public:
  39.         //віртуальна функція введення даних із файлу
  40.         virtual void read(ifstream& ifs) = 0;
  41.        
  42.         //віртуальна фукнція розрахунок обчислюваного параметру
  43.         virtual float getResult() = 0;
  44.        
  45.         //віртуальна фукнція виведення в файл результату та вхідних даних
  46.         virtual void write(ofstream& ofs) = 0;     
  47.        
  48.         //віртуальна функція виведення результату та вхідних даних у консоль
  49.         virtual void print() = 0;  
  50. };
  51.  
  52. //клас заряд похідний від абстрактного класу
  53. class Charge : public calcObject {
  54.     private:
  55.         //заряди
  56.         float q1, q2;
  57.        
  58.         //епсілон
  59.         float e;
  60.        
  61.         //відстань між зарядами
  62.         float r;
  63.        
  64.         //функція для перевірки параметрів
  65.         void check() {
  66.             if (e < eA || eB < e) {
  67.                 cout << E_ERROR << endl;
  68.                 exit(1);   
  69.             }
  70.            
  71.             if (r < rA || rB < r) {
  72.                 cout << R_ERROR << endl;
  73.                 exit(1);   
  74.             }
  75.            
  76.             if (q1 < qA || qB < q1 || q2 < qA || qB < q2) {
  77.                 cout << Q_ERROR << endl;
  78.                 exit(1);   
  79.             }
  80.         }
  81.        
  82.     public:
  83.         //констуктор за замовчуванням
  84.         Charge() {
  85.             q1 = q2 = e = r = calcParam = 0;
  86.         }
  87.        
  88.         //констуктор з ініціалізацією списком
  89.         Charge(float _e, float _q1, float _q2, float _r) : e(_e), q1(_q1), q2(_q2), r(_r) {
  90.             check();
  91.         }
  92.        
  93.         //конструктор копіювання
  94.         Charge(const Charge &x) {
  95.             q1 = x.q1;
  96.             q2 = x.q2;
  97.             e = x.e;
  98.             r = x.r;
  99.         }
  100.        
  101.         //перевантажена функція читання даних із файлу
  102.         void read(ifstream& ifs) {
  103.             ifs >> q1 >> q2 >> e >> r;
  104.             check();
  105.         }
  106.        
  107.         //перевантажена функція обчислення
  108.         float getResult() {
  109.             if (fabs(e * pow(r, 2)) < EPS) {
  110.                 cout << DIV_ERROR << endl;
  111.                 exit(1);
  112.             }
  113.            
  114.             calcParam = (q1 * q2) / (e * pow(r, 2));
  115.            
  116.             return calcParam;
  117.         }
  118.        
  119.         //перевантажена функція друкування даних у файл
  120.         void write(ofstream& ofs) {
  121.             ofs << "Params:" << endl;
  122.             ofs << "q1 = " << q1 << endl;
  123.             ofs << "q2 = " << q2 << endl;
  124.             ofs << "e = " << e << endl;
  125.             ofs << "r = " << r << endl;
  126.             ofs << "Result:" << endl;
  127.             ofs << "F = " << getResult() << endl;
  128.             ofs << endl;
  129.         }
  130.        
  131.         //функція для друкування параметрів і результату у консоль
  132.         void print() {
  133.             cout << "Params:" << endl;
  134.             cout << "q1 = " << q1 << endl;
  135.             cout << "q2 = " << q2 << endl;
  136.             cout << "e = " << e << endl;
  137.             cout << "r = " << r << endl;
  138.             cout << "Result:" << endl;
  139.             cout << "F = " << getResult() << endl;
  140.             cout << endl;
  141.         }
  142.        
  143.         //оператор ==
  144.         bool operator == (Charge &x) {
  145.             return getResult() == x.getResult();
  146.         }
  147.        
  148.         //оператор !=
  149.         bool operator != (Charge &x) {
  150.             return getResult() != x.getResult();
  151.         }
  152.        
  153.         //оператор <
  154.         bool operator < (Charge &x) {
  155.             return getResult() < x.getResult();
  156.         }
  157.        
  158.         //оператор <=
  159.         bool operator <= (Charge &x) {
  160.             return getResult() <= x.getResult();
  161.         }
  162.        
  163.         //оператор >
  164.         bool operator > (Charge &x) {
  165.             return getResult() > x.getResult();
  166.         }
  167.        
  168.         //оператор >=
  169.         bool operator >= (Charge &x) {
  170.             return getResult() >= x.getResult();
  171.         }
  172. };
  173.  
  174. int main() {
  175.     Charge a(13e-11, 1.1e-9, 2e-9, 2e-4);
  176.     cout << "Constructor with list-initialization:" << endl;
  177.     a.print();
  178.    
  179.     Charge b = a;
  180.     cout << "Copy constructor:" << endl;
  181.     b.print();
  182.    
  183.     cout << "Operator == : ";
  184.     cout << boolalpha;
  185.     cout << (a == b) << endl;
  186.     cout << endl;
  187.    
  188.     cout << "Operator != : ";
  189.     cout << boolalpha;
  190.     cout << (a != b) << endl;
  191.     cout << endl;
  192.    
  193.     cout << "Operator < : ";
  194.     cout << boolalpha;
  195.     cout << (a < b) << endl;
  196.     cout << endl;
  197.    
  198.     cout << "Operator <= : ";
  199.     cout << boolalpha;
  200.     cout << (a <= b) << endl;
  201.     cout << endl;
  202.    
  203.     cout << "Operator > : ";
  204.     cout << boolalpha;
  205.     cout << (a > b) << endl;
  206.     cout << endl;
  207.    
  208.     cout << "Operator >= : ";
  209.     cout << boolalpha;
  210.     cout << (a >= b) << endl;
  211.     cout << endl;
  212.    
  213.     ofstream ofs(OUTPUT_FILE);
  214.     ifstream ifs(INPUT_FILE);
  215.    
  216.     if (ifs.is_open() == false) {
  217.         cout << OPEN_ERROR << endl;
  218.         exit(1);
  219.     }
  220.    
  221.     Charge x;
  222.     cout << "Reading from file ..." << endl;
  223.     x.read(ifs);
  224.     cout << endl;
  225.    
  226.     cout << "Info:" << endl;
  227.     x.print();
  228.    
  229.     cout << "Calculating ..." << endl;
  230.     x.getResult();
  231.     cout << endl;
  232.    
  233.     cout << "Writing to file ..." << endl;
  234.     x.write(ofs);
  235.    
  236.     return 0;
  237. }
Add Comment
Please, Sign In to add comment