-Peer-

ВАРИАНТ РЕШЕНИЯ СТАРОЙ ЗАДАЧИ О ДОЗАПРАВКЕ САМОЛЁТА С ГРУЗОМ

Jan 10th, 2021
990
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //• ВАРИАНТ РЕШЕНИЯ ЗАДАЧИ О ДОЗАПРАВКЕ САМОЛЁТА С ГРУЗОМ
  2.  
  3. /*
  4. ПОСТАНОВКА ЗАДАЧИ
  5.   Cамолет должен пролететь с грузом из пункта А в пункт С через пункт В. Емкость бака у самолета – 300 литров. Потребление топлива на 1 км в зависимости от веса груза следующее:
  6.     — до  500 кг, включительно : 1 литров / км
  7.     — до 1000 кг, включительно : 4 литров / км
  8.     — до 1500 кг, включительно : 7 литров / км,
  9.     — до 2000 кг, включительно : 9 литров / км.
  10.     — более 2000 кг самолет не поднимает.
  11.  Пользователь вводит расстояние между пунктами А и В, расстояние между пунктами В и С, а также вес груза.
  12.  Программа должна рассчитать какое минимальное количество топлива необходимо для дозаправки самолету в пункте В, чтобы долететь из пункта А в пункт С. В случае невозможности преодолеть любое из расстояний – вывести ERROR.
  13.  
  14. Формальное решение:
  15.  
  16. 1. ВХОДНЫЕ ДАННЫЕ
  17.    Ёмкость бака capacityMax = 300 (л) — константа
  18.    Массив потребления q[] = {1, 4, 7, 9} — расход топлива (в л/км)
  19.    Остаток топлива rest = capacityMax (л)
  20.    Массив расстояний d[] — вводится пользователем (в км)
  21.    Вес груза weight вводится пользователем (в кг)
  22.  
  23.  
  24. 2. ФОРМУЛЫ
  25.    WI = (ceil(weight) - 1) / 500 — индекс весовой категории (деление целочисленное!)
  26.    fuelCalculation = q[WI] * d[i] — расход топлива на отрезке пути (л)
  27.  
  28.  
  29. 3. АЛГОРИТМ
  30.    вычисляем индекс весовой категории WI. Если  WI > 3, то ERROR (ПЕРЕГРУЗКА)
  31.    летим из А в В: расчёт fuelCalculation = q[WI] * d[0] — потребность в топливе на пути АВ
  32.    сравнить rest и fuelCalculation. Если rest < fuelCalculation, то ERROR (НЕ ДОЛЕТИТ ДО В), иначе rest -= fuelCalculation
  33.    летим из В в С: расчёт fuelCalculation = q[WI] * d[1] — потребность в топливе на пути ВС
  34.    сравнить rest и fuelCalculation. Если rest < fuelCalculation, то ДОЗАПРАВКА, иначе вывод 0 и конец (ДОЛЕТЕЛИ ДО С)
  35.    ДОЗАПРАВКА: если fuelCalculation > capacityMax, то ERROR (НЕ ДОЛЕТИТ ДО С), иначе вывод fuelCalculation - rest
  36.   конец
  37. */
  38.  
  39. #include <iostream>
  40. #include <iomanip>
  41. #include <cstdlib>
  42. #include <cmath> // используется функция ceil() — округление вверх
  43. #define ERROUT { cout << "ERROR"; return 0; }
  44. using namespace std;
  45. int main(){
  46. /*  Объявление данных  */
  47.     const double capacityMax = 300.0;                              // вместимость бака
  48.     double q[] = {1, 4, 7, 9};                                     // потребление топлива на 1 км
  49.     double d[2], weight;                                           // длина пути AB, длина пути BC, вес груза
  50.     double rest = capacityMax;                                     // остаток топлива в баке
  51.    
  52. /*  Обработка  */
  53.     setlocale(LC_ALL, "rus");
  54.     cin >> d[0] >> d[1] >> weight;
  55.     int WI = (ceil(weight) - 1) / 500;                             // индекс весовой категории: 0, 1, 2, 3 …
  56.     if (WI > 3) ERROUT                                             // перегрузка — выход из программы
  57.  
  58.     double fuelCalculation = d[0] * q[WI];                         // расход топлива на пути AB
  59.     if (rest < fuelCalculation) ERROUT                             // не долетит до В — выход из программы
  60.     rest -= fuelCalculation;                                       // остаток топлива в городе В
  61.     fuelCalculation = d[1] * q[WI];                                // расход топлива на пути BC
  62.     if (rest < fuelCalculation)                                    // если остаток меньше потребности …
  63.     {
  64.        if (fuelCalculation > capacityMax) ERROUT                   // не долетит до C — выход из программы
  65.        cout << fixed << setprecision(2) << fuelCalculation - rest; // минимум дозаправки
  66.     }
  67.     else {cout << "0.00"; return 0;}                               // дозаправка не требуется
  68.  
  69.   return 0;
  70.   }
  71.  
  72.  
RAW Paste Data