Раздел: Задачи / Простейшие /
Сколько должен заплатить каждый пассажир
Основы программирования Каждый профессионал когда-то был чайником. Наверняка вам знакомо состояние, когда “не знаешь как начать думать, чтобы до такого додуматься”. Наверняка вы сталкивались с ситуацией, когда вы просто не знаете, с чего начать. Эта книга ориентирована как раз на таких людей, кто хотел бы стать программистом, но совершенно не знает, как начать этот путь. Подробнее... |
Задача 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 - количество рублей, которое должен заплатить каждый пассажир.
- Вычислить значение ЦЕНА2 - сумму, которую заплатят второй и третий пассажиры. Для этого вычисляем разницу между счётчиком 2 и счётчиком 1, и делим результат на 2 (потому что в машине осталось два пассажира). К полученному значению прибавляем значение ЦЕНА1 (потому что эту сумму платит каждый), и таким образом получаем число ЦЕНА2.
- Вычислить значение ЦЕНА3 - сумму, которую заплатит третий пассажир. Для этого вычисляем разницу между счётчиком 3 и счётчиком 2. К полученному значению прибавляем ЦЕНА2, и таким образом получаем число ЦЕНА3.
Сумма значений ЦЕНА1, ЦЕНА2 и ЦЕНА3 - это полная стоимость поездки с учётом стоимости посадки.
Может и не всем будет понятно, но это работает. Возможно, понятнее будет в примерах программ на Паскале и С++.
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.
#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
Эта книга для тех, кто хочет стать программистом. На самом деле хочет, а не просто мечтает. И хочет именно стать программистом с большой буквы, а не просто научиться кулебякать какие-то примитивные программки… Подробнее... |
Помощь в технических вопросах
Помощь студентам. Курсовые, дипломы, чертежи (КОМПАС), задачи по программированию: Pascal/Delphi/Lazarus; С/С++; Ассемблер; языки программирования ПЛК; JavaScript; VBScript; Fortran; Python и др. Разработка (доработка) ПО ПЛК (предпочтение - ОВЕН, CoDeSys 2 и 3), а также программирование панелей оператора, программируемых реле и других приборов систем автоматизации. Подробнее... |