Раздел: Задачи / Простейшие /

Сколько должен заплатить каждый пассажир

Основы программирования 2.0 Основы программирования
Каждый профессионал когда-то был чайником. Наверняка вам знакомо состояние, когда “не знаешь как начать думать, чтобы до такого додуматься”. Наверняка вы сталкивались с ситуацией, когда вы просто не знаете, с чего начать. Эта книга ориентирована как раз на таких людей, кто хотел бы стать программистом, но совершенно не знает, как начать этот путь. Подробнее...

Задача 1.5
В такси одновременно сели три пассажира. Когда вышел первый пассажир, на счётчике было Р1 рублей; когда вышел второй - Р2 рублей. Сколько должен заплатить каждый пассажир, если по окончании поездки счётчик показал Р3 рублей и если плата за посадку составляет Р0 рублей. Считаем, что за совместную поездку пассажиры платят поровну (то есть если все три доехали до конца, то каждый заплатит (Р0 + Р3)/3 рублей).

Итак, самый простой частный случай уже решён в условии задачи - если все три пассажира ехали от начала движения и до конца (если Р1 = Р2 = Р3), то каждый из них заплатит (Р0 + Р3)/3 рублей. Здесь считаем, что стоимость посадки всегда одинаковая, независимо от количества пассажиров, и делится на всех пассажиров.

Другой крайний случай, когда первые два пассажира отказались ехать. Тогда они заплатят по Р0/3, а оставшуюся сумму заплатит 3-й пассажир.

Но как быть с остальными случаями? Да примерно также. Только придётся учитывать, сколько проехал каждый пассажир. Например, если пассажиры 1 и 2 вышли одновременно (Р1 = Р2), то каждый из пассажиров (каждый, а не только 1 и 2) заплатят:

(Р0 + Р2) / 3

а третий пассажир, кроме этого, заплатит ещё:

Р3 - P2 + ((Р0 + Р2) / 3)

То есть к сумме, поделённой на троих, придётся добавить оставшуюся сумму (разность между счётчиками 3 и 2), когда он ехал уже один.

Например, если поездка обошлась в 900 рублей (Р3), стоимость посадки равна 0 рублей, а 1-й и 2-й пассажиры вышли, когда на счётчике было 600 рублей (Р2), то они заплатят по:

(Р0 + Р2) / 3 = (0 + 600) / 3 = 200 рублей

А вот третьему придётся заплатить чуть больше:

Р3 - P2 + ((Р0 + Р2) / 3) = 900 - 600 + 200 = 500

Проверим наши выводы. Первые два пассажира заплатили по 200, а третий - 500. То есть:

200 + 200 + 500 = 900

Всё верно.

С математикой разобрались. А вот как это выполнить программно? Ведь комбинаций получается довольно много. Есть где заблудиться.

Во-первых, нам надо проверить значения счётчиков. Здесь может быть несколько комбинаций:

1. Р1 = Р2 = Р3
2. Р1 = Р2 < Р3
3. Р1 < Р2 = Р3
4. Р1 < Р2 < Р3

Вообще могут быть и другие комбинации. Например, отказаться ехать может не 1-й, а третий или второй пассажир. То есть:

Р1 < Р2 > P3

Или пассажир 1 едет дальше, чем пассажир 2:

P1 > P2 < Р3

Но для простоты мы не будем рассматривать все возможные комбинации. К тому же в таком случае мы можем просто изменить нумерацию пассажиров, отсортировав их по значению счётчика. То есть первого сделать вторым и наоборот. Кроме того, эти комбинации нужны нам больше для проверки работы программы, чем для разработки алгоритмов.

Таким образом считаем, что у нас есть только четыре возможные комбинации. Ну и ещё можно проверить случай, когда Р1 = Р2 = Р3 = 0, то есть когда все отказались от поездки (пусть это будет комбинация 5).

Продолжаем размышлять. Считаем, что Р1 всегда меньше или равен Р2, а Р2 всегда меньше или равен Р3.

Тогда 1-й пассажир всегда (за исключением крайних случаев) платит:

(P0 + P1) / 3

Второй пассажир платит:

((P0 + P1) / 3) + ((Р2 - Р1) / 2)

А третий:

[((P0 + P1) / 3) + ((Р2 - Р1) / 2)] + (Р3 - Р2)

Описать алгоритм можно так:

  1. Вычислить значение ЦЕНА1 - сумму, которую платит каждый пассажир. Для этого надо разделить сумму стоимости посадки и первого счётчика на всех пассажиров, потому что до первого счётчика доедут все. Таким образом получаем число ЦЕНА1 - количество рублей, которое должен заплатить каждый пассажир.
  2. Вычислить значение ЦЕНА2 - сумму, которую заплатят второй и третий пассажиры. Для этого вычисляем разницу между счётчиком 2 и счётчиком 1, и делим результат на 2 (потому что в машине осталось два пассажира). К полученному значению прибавляем значение ЦЕНА1 (потому что эту сумму платит каждый), и таким образом получаем число ЦЕНА2.
  3. Вычислить значение ЦЕНА3 - сумму, которую заплатит третий пассажир. Для этого вычисляем разницу между счётчиком 3 и счётчиком 2. К полученному значению прибавляем ЦЕНА2, и таким образом получаем число ЦЕНА3.

Сумма значений ЦЕНА1, ЦЕНА2 и ЦЕНА3 - это полная стоимость поездки с учётом стоимости посадки.

Может и не всем будет понятно, но это работает. Возможно, понятнее будет в примерах программ на Паскале и С++.

Решение задачи 1.5 на Паскале
program mytask;

//*******************************************************************
// ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ
//*******************************************************************
var
  P0, P1, P2, P3   : Single;
  Sum1, Sum2, Sum3 : Single;

//*******************************************************************
// ОСНОВНАЯ ПРОГРАММА
//*******************************************************************
begin
  Write('Плата за посадку  : '); ReadLn(P0);
  Write('Счётчик 1         : '); ReadLn(P1);
  Write('Счётчик 2         : '); ReadLn(P2);
  Write('Счётчик 3         : '); ReadLn(P3);

  Sum1 := (P0 + P1) / 3;
  Sum2 := Sum1 + (P2 - P1) / 2;
  Sum3 := Sum2 + (P3 - P2);

  WriteLn('Стоимость: ');
  WriteLn('  для пассажира 1 : ', Sum1:0:2);
  WriteLn('  для пассажира 2 : ', Sum2:0:2);
  WriteLn('  для пассажира 3 : ', Sum3:0:2);
  WriteLn('  общая           : ', (Sum1 + Sum2 + Sum3):0:2);

  WriteLn('The end. Press ENTER...');
  ReadLn;
end.
Решение задачи 1.5 на С++
#include <cstdlib>
#include <iostream>

using namespace std;

//*******************************************************************
// ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ
//*******************************************************************
float P0, P1, P2, P3;
float Sum1, Sum2, Sum3;

//*******************************************************************
// ОСНОВНАЯ ПРОГРАММА
//*******************************************************************
int main(int argc, char *argv[])
{
  cout << "Плата за посадку  : "; cin >> P0;
  cout << "Счётчик 1         : "; cin >> P1;
  cout << "Счётчик 2         : "; cin >> P2;
  cout << "Счётчик 3         : "; cin >> P3;


  Sum1 = (P0 + P1) / 3;
  Sum2 = Sum1 + (P2 - P1) / 2;
  Sum3 = Sum2 + (P3 - P2);

  cout << "Стоимость:";
  cout << "  для пассажира 1 : " << Sum1 << endl;
  cout << "  для пассажира 2 : " << Sum2 << endl;
  cout << "  для пассажира 3 : " << Sum3 << endl;
  cout << "  общая           : " << (Sum1 + Sum2 + Sum3) << endl;

  system("PAUSE");
  return EXIT_SUCCESS;
}

Сколько должен заплатить каждый пассажир

На этом всё. Подписывайтесь на рассылки и подключайтесь к группам в соцсетях, чтобы ничего не пропустить.


Как стать программистом 2.0 Как стать программистом 2.0

Эта книга для тех, кто хочет стать программистом. На самом деле хочет, а не просто мечтает. И хочет именно стать программистом с большой буквы, а не просто научиться кулебякать какие-то примитивные программки… Подробнее...
Помощь в технических вопросах Помощь в технических вопросах

Помощь студентам. Курсовые, дипломы, чертежи (КОМПАС), задачи по программированию: Pascal/Delphi/Lazarus; С/С++; Ассемблер; языки программирования ПЛК; JavaScript; VBScript; Fortran; Python и др. Разработка (доработка) ПО ПЛК (предпочтение - ОВЕН, CoDeSys 2 и 3), а также программирование панелей оператора, программируемых реле и других приборов систем автоматизации. Подробнее...

Инфо-МАСТЕР ®
Все права защищены ©
e-mail: mail@info-master.su

Яндекс.Метрика