• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Cleiton2122

Parquímetro

1 mensagem neste tópico

Podem ajudar nesse programa?

Normalmente  o  preço  a  pagar  é  função  da

duração do estacionamento, e, recentemente, é frequente pagar-se por quarto de

hora: por exemplo, se o preço por quarto de hora  for 30 cêntimos, então quem

estaciona 35 minutos paga 90 cêntimos, o mesmo que pagaria se estacionasse 45

minutos; mas, se estacionar 46 minutos,  já pagaria €1.20. Depois, por vezes há

umas  complicações, que  estragam  a  simplicidade do  esquema: por  exemplo, o

estacionamento mínimo  é  30 minutos,  o  que  quer  dizer  que  quem  ficar  só  10

minutos paga como  se  ficasse 30 minutos, o que  é um grande  abuso, mas que

fazer? 

Pois bem, o que queremos é programar um conjunto de  funções em Python

que implementam o esquema de pagamentos de um determinado parque de

estacionamento.  Podemos  pensar  que  estas  funções  serão  incorporadas  nas

máquinas de pagamento automático que existem no parque.

6.  Comecemos com um parque simples: o preço a pagar pelo estacionamento é, tal

como  no  exemplo  de  há  pouco,  função  do  número  de  quartos  de  hora  de

estacionamento, sendo que um quarto de hora não totalmente utilizado paga por

inteiro. O preço por quarto de hora é 30 cêntimos. O estacionamento mínimo é

de  30  minutos  (o  que  significa  que  qualquer  cliente  pagará  pelo  menos  60

cêntimos).

7.  Já  identificamos  uma  função  para  programar:  a  função  que  calcula  o  preço  a

pagar  “em  função”  da  duração  do  estacionamento,  expressa  em  minutos.  O

preço  a  pagar  virá  expresso  em  cêntimos,  para  não  termos  de  andar  a  fazer

contas com números reais, que são sempre traiçoeiros.

8.  A função que calcula o preço, de acordo com as regras explicadas nos pontos 6 e

7. Será a função price, que  tem um argumento  inteiro, representando a duração

do estacionamento em minutos e um  resultado  inteiro,  representando o preço a

pagar, em cêntimos.

9.  Programemos  então  a  função  price.  Sendo  simples,  tem  as  suas manhas. Nós

damos  o  tempo  em minutos mas  as  contas,  internamente,  far-se-ão  usando  o

número de quartos de hora correspondente. Logo, há aqui uma operação prévia

que convém também programar: dada uma duração positiva expressa e minutos,

calcular  o  número  de  quartos  de  hora  correspondente. Será  a  função  quarters.

Por  exemplo  quarters(7)  vale  1,  quarters(16)  vale  2,  quarters(180)  vale  12,

quarters(181)  vale  13. Repare  no  pormenor  de  que  a  duração  é  positiva.  Isso

evita  o  caso  anómalo  de  um  estacionamento  super-rápido  (que  durasse  zero minutos)  ficar  de  borla.

Podemos  supor  que  é  fisicamente  impossível  entrar  e sair no parque em menos de um minuto. 

10. Programe  a  função  quarters.  É  simples,  vou  dar  a  dica:  faz-se  à  base  de

operadores  de  quociente  da  divisão.  Para  tal  terá  que  considerar  o  resto  da

divisão.

 

11. Passemos então a função price. Não se esqueça de que se o estacionamento não

for  superior  a meia,  paga-se  sempre  o mesmo,  60  cêntimos.  Eis  alguns  casos

price(1) vale 60, price(28) vale 60, price(30) vale 60, price(31) vale 90.

12. Isto  é  tudo  muito  interessante,  mas  é  claro  que  o  que  gostamos  de  conferir

quando vamos pagar o estacionamento é a hora de chegada ao parque e a hora de

partida,  com  as  quais  depois  calculamos  a  duração,  e  não  a  duração

directamente.  Pois  bem,  queremos  uma  função  calcular  dessa  forma.  Vamos

representar as horas de chegada e de partida ou, melhor, os instantes de chegada

e partida,  por  números  inteiros:  por  exemplo  1200  representa o meio-dia;  845

representa um quarto para as 9 da manhã; 2355 representa 5 para a meia-noite;

20  representa meia-noite  e 20. O  intervalo dos  instantes vai de 0  a 2359, mas

nem todos são válidos: por exemplo 1289 não faz sentido e nunca aparecerá. O

problema  agora  é:  programar  uma  função  duration  que,  dados  dois  números

representando  a  hora  de  chegada  e  a  hora  de  partida  ao  parque  de

estacionamento,  calcula  a  duração  do  estacionamento,  expressa  em  minutos.

Temos a complicaçãozita adicional de que podemos chegar num dia e sair no dia

seguinte (o que quer dizer que a hora de partida pode ser inferior à de chegada),

mas sabemos que a duração de estacionamento não pode ser superior a 24 horas

nem inferior a 1 minuto.

13. Sugestão: programe uma função minutes, que dada uma hora, calcula o número

de minutos que passaram desde a meia-noite desse dia. Por exemplo:

minutes(845) vale 525, minutes(1201)vale 721, minutes(15) vale 15, minutes(2359)

vale 1439. Depois, use esta função na definição da função duration.

14. Outra sugestão, ainda que não para ser utilizada já (mas fica guardada para mais

logo):  programe  a  função  inversa de  função minutes,  invMinutes,  que  calcula  a

hora, dados os minutos que passaram desde a meia-noite.

 

15. Estamos quase  lá. Só  falta mesmo uma variante da  função price, que calcula o

preço a partir da hora de chegada e da hora de partida e não a partir da duração

do estacionamento. A nossa última função será função parking. Aqui vão alguns

testes  da  função  parking:  parking(1000,  1001)  vale  60  cêntimos,  parking(1000,

1015) vale 60 cêntimos, parking(1000, 1030) vale 60 cêntimos, parking(1000, 1031)

vale 90 cêntimos, parking(1000, 1045) vale 90 cêntimos, parking(1000, 1046) vale

120 cêntimos, etc.

Segunda parte, Parquímetro

16. Imaginemos  que  a  empresa  que  gere  os  parques  de  estacionamento  ficou  tão

satisfeita com o nosso programa, que veio encomendar-nos um outro, agora para

os parquímetros que ela também explora. Nos parquímetros paga-se à chegada e

no ticket que a máquina imprime, e que temos de colocar à vista no pára-brisas,

vem indicada a hora de saída limite, em função da hora de chegada e da quantia

introduzida. Pois bem, a nossa última função de hoje é para calcular a essa hora

de saída limite que depois o parquímetro imprimirá.

 

17. Estacionar na rua é ligeiramente mais barato do que estacionar no parque, mas as

regras  são  parecidas:  o  preço  é  de  20  cêntimos  por  cada  quarto  de  hora,  na

primeira hora e de 24 cêntimos por quarto de hora da segunda hora em diante. A

hora limite de estacionamento é arredondada ao minuto sempre em benefício do

cliente  (isto é, para cima). Por exemplo, um condutor que estacione às 12:10 e

meta 50 cêntimos tem de sair até às 12:48. Um que chegue às 15:55 e meta dois

euros tem de sair até às 18:10. Há uma complicação suplementar: das 20h às 8h

do  dia  seguinte  o  estacionamento  é  livre,  pelo  que  se  alguém  chegar,  por

exemplo,  às 19:50 e meter um  euro, pode  ficar  até  às 9:03 do dia  seguinte,  se

não me enganei nas contas.  (Posso  ter-me enganado, é claro, porque ainda não

tenho o programa que há-de fazer as contas por mim…)

 

18. Programe então a função parkingPro que dada a hora de chegada, na forma de um

inteiro, e a quantia inserida, em cêntimos (também um número inteiro), calcula a

hora  limite  de  partida,  na  forma  de  um  inteiro,  de  acordo  com  as  regras

indicadas. Além disso, podemos presumir que a máquina só emite um ticket se o

cliente  tiver metido  pelo menos  40  cêntimos,  pelo  que  a  duração mínima  de

estacionamento  será  de  30 minutos  e  que  também  não  aceitará mais  do que  5

euros,  pelo  que  a  duração  do  estacionamento máximo  será  de  quanto?  (Faça

você  as  contas  ou  espere  até  ter  o  programa  pronto). Usando  os  exemplos  do

ponto  anterior  parkingPro(1210,  50)  vale  1248,  parkingPro(1555,  200)  vale  1810  e

parkingPro(1950,  100) vale 903. Mas note que  se a hora  limite de partida calhar

mesmo em cima das 20:00, passa para as 8:00 do dia seguinte, pois o período da

noite é gratuito. É o que acontece, por exemplo, a quem chegar às 19:30 e meter

40 cêntimos. Além disso, claro que se alguém chegar, por exemplo, às 23:15 e

meter 40 cêntimos, a hora limite de saída será 8:30 do dia seguinte.

 

19. A nossa última tarefa é programar a função parkingPro. 

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora