Funda¸
c˜
ao CECIERJ - Vice Presidˆ
encia de Educa¸
c˜
ao Superior a Distˆ
ancia
Curso de Tecnologia em Sistemas de Computa¸
c˜
ao
Disciplina: Programa¸
c˜
ao com Interfaces Gr´
aficas
AD1 2
osemestre de 2021.
Professores: Mario Benevides e Paulo Roma
AD1: Desconto Racional por Dentro
1
Descri¸
c˜
ao do Problema
Suponha que:
• o pre¸co de uma mercadoria a prazo ´e x reais e que o pre¸co `
a vista ´
e y reais.
• o valor ´e pago em p presta¸c˜
oes mensais iguais a R = x/p com uma de entrada (1+(p−1))
• que o mercado esteja adotando uma remunera¸c˜
ao banc´
aria fixa de t% ao mˆ
es (taxa).
1.1
Descobrindo o Valor Presente
Para determinar se vale a pena comprar a prazo ou n˜
ao, ´
e necess´
ario obter o valor presente
da compra, e descobrir o quanto o comerciante ou a financeira est˜
ao cobrando a mais.
O pre¸co atualizado A, voltando cada parcela para o tempo inicial 0, ´
e a soma de uma
P.G.
1de raz˜
ao q =
1(1+t)
e cujo primeiro termo ´
e q: R q
(1−qn) 1−q, onde R =
x p´
e o valor de cada
parcela.
1https://www.todamateria.com.br/progressao-geometrica/Como, neste exerc´ıcio, a primeira parcela ´
e paga no ato da compra, na realidade, n = p − 1
e deve-se somar
xp(a entrada):
x
atualizado= A =
x
p
(1 + q
1 − q
(p−1)1 − q
).
Com as substitui¸c˜
oes necess´
arias, chega-se a seguinte f´
ormula:
A =
x
p
∗
(1 + t)
p− 1
t(1 + t)
(p−1)= x ∗
1 + t
p ∗ CF
, CF =
t
1 − (1 + t)
−p.
Para calcular
2o valor das parcelas fixas, no sistema de amortiza¸c˜
ao francˆ
es (Cr´
edito
Direto ao Consumidor - CDC
3no Brasil), dados o valor do empr´
estimo, v, o n´
umero de
parcelas, p, e a taxa de juros, t, basta usar o Coeficiente de Financiamento, CF (p, t):
R =
x
p
= v ∗
CF (p, t)
f (e)
(valor das presta¸c˜
oes em fun¸c˜
ao de v, t e p),
(1)
Para calcular
4o valor presente no tempo 0, dados o valor final do empr´
estimo, x, o n´
umero
de parcelas, p, e a taxa de juros, t, basta usar o Coeficiente de Financiamento, CF (p, t):
A =
x
p
∗
f (e)
CF (p, t)
(valor presente em fun¸c˜
ao de x, t e p),
(2)
onde f (e) = 1 + t ou 1, caso haja uma entrada, ou n˜
ao, respectivamente.
´
E comum, o comerciante n˜
ao informar a taxa de juros ou o pre¸co `
a vista, dizendo que os
juros valem zero. Nesse caso, s´
o nos resta usar a taxa Selic como uma base para a taxa de
juros empregada. Portanto, o seu programa deve aceitar trˆ
es op¸c˜
oes:
• Op¸c˜
ao 1: Imprimir o pre¸co atualizado e o percentual pago a mais (
A−yA∗ 100), ou seja,
o custo estimado do financiamento
5.
Em geral, a taxa t ´
e muito maior do que a taxa Selic, e `
as vezes vale mais a pena
aplicar o dinheiro no mercado financeiro e pagar `
a vista mais tarde.
Se o pre¸co `
a vista oferecido for maior do que o pre¸co corrigido, vale mais a pena
comprar a prazo, nesse caso.
• Op¸c˜
ao 2: Classificar a adequa¸c˜
ao do parcelamento da seguinte forma.
Se o percentual pago a mais estiver entre 0% e 1%, imprima VALOR BAIXO.
Se o percentual pago a mais estiver entre 1% e 3%, imprima VALOR ACEIT ´
AVEL.
Se estiver entre 3% e 5%, imprima EST ´
A CARO.
Se estiver acima de 5%, imprima VOCˆ
E EST ´
A SENDO ROUBADO.
2Neste caso, A = y = v e n˜ao se conhece x. 3
http://orion.lcg.ufrj.br/python/html/cdc.html 4Neste caso, A = y e n˜ao se conhece y.
• Op¸c˜
ao 3: Imprimir qual deveria ser o pre¸co total a prazo para ningu´
em sair ganhando
(ou seja, que iguala o pre¸co `
a vista, quando atualizado com a taxa t) e o fator, k =
p∗CFf (e),
a ser aplicado (caso vocˆ
e quisesse levar para as lojas, por exemplo, para ter uma base
de compara¸c˜
ao).
1.2
Descobrindo a Taxa Real
Para o caso em que se tenha o valor `
a vista, o n´
umero de presta¸c˜
oes e o valor final a prazo,
mas n˜
ao se conhe¸ca a taxa de juros empregada, ´
e necess´
ario obtˆ
e-la por um m´
etodo num´
erico,
pois n˜
ao existe uma f´
ormula expl´ıcita para isso. Encontrar a taxa t, que produz o pre¸co `
a
vista y, requer o m´
etodo de Newton
6 7, ou o uso de uma planilha Excel
8:
x
n+1= x
n−
f (x
n)
f
0(x
n)
com entrada:
y =
x
p
(c − 1)
tb
, onde a = (1 + t)
(p−2), b = (1 + t)
(p−1), c = (1 + t)
pf (t) = ytb −
x
p
(c − 1), f
0(t) = y(b + t(p − 1)a) − xb
(3)
sem entrada:
y =
x
p
(1 − a)
t
, onde a = (1 + t)
−p, b = (1 + t)
(−p−1)f (t) = yt −
x
p
(1 − a), f
0(t) = y − xb
(4)
t
n+1= t
n−
f (t)
f
0(t)
, t
o=
x
y
(pre¸co a prazo / pre¸co `
a vista).
(5)
A fun¸c˜
ao (5) ´
e decrescente e converge para t : lim
n→∞= t. A condi¸c˜
ao de parada pode
ser: |t
n+1− t
n| ≤ 1.0 E−04.
6https://en.wikipedia.org/wiki/Newton’s_method 7https://www.youtube.com/watch?v=WuaI5G04Rcw 8
## A c h a a t a x a que p r o d u z o pre ¸c o `a v i s t a p e l o m ´e t o d o de N e w t o n . # # N o t a : se n ~a o h o u v e entrada , r e t o r n a g e t I n t e r e s t 2 ( x , y , p ) # # T a x a P o u p a n ¸c a : # - 70% da t a x a S e l i c (2% ao ano ) ou # - 1 . 4 0 % ao ano ou # - 0 . 1 1 5 9 % ao m ^e s . # # @ p a r a m x pre ¸c o a p r a z o . # @ p a r a m y pre ¸c o `a v i s t a . # @ p a r a m p n ´u m e r o de p a r c e l a s . # @ r e t u r n taxa , n ´u m e r o de i t e r a ¸c ~o es . # def g e t I n t e r e s t ( x , y , p ):
Exemplo (com entrada): Se p = 10, t = 1% ao mˆ
es, x = $500 e y = $450, ent˜
ao:
• O pre¸co `
a vista ´
e menor do que o pre¸co total corrigido → compre `
a vista.
• Taxa Real = 2.4227% ao mˆes (15 itera¸c˜
oes, fator aplicado = 0.9566)
• Pre¸co a prazo - juros de 1% ao mˆes = $478.30
• Pre¸co `
a vista + juros de 1% ao mˆ
es = $470.42
• Juros Embutidos = ($500.00 - $450.00) / $450.00 * 100 = 11.11%
• Desconto = ($500.00 - $450.00) / $500.00 * 100 = 10.00%
• Excesso = $478.30 - $450.00 = $28.30
• Excesso = ($500 - $470.42) * 0.9566 = $28.30
• Percentual pago a mais = 5.92%
• Valor financiado = $450.00 - $47.04 = $402.96
T a b e l a P r i c e _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | M ^e s | P r e s t a ¸c ~a o | J u r o s | A m o r t i z a ¸c ~a o | S a l d o D e v e d o r | | _ _ _ _ _ _ | _ _ _ _ _ _ _ _ _ _ _ _ _ | _ _ _ _ _ _ _ _ _ _ _ _ _ | _ _ _ _ _ _ _ _ _ _ _ _ _ | _ _ _ _ _ _ _ _ _ _ _ _ _ | | 1 | 4 7 . 0 4 | 4 . 0 3 | 4 3 . 0 1 | 3 5 9 . 9 5 | | 2 | 4 7 . 0 4 | 3 . 6 0 | 4 3 . 4 4 | 3 1 6 . 5 0 | | 3 | 4 7 . 0 4 | 3 . 1 7 | 4 3 . 8 8 | 2 7 2 . 6 3 | | 4 | 4 7 . 0 4 | 2 . 7 3 | 4 4 . 3 2 | 2 2 8 . 3 1 | | 5 | 4 7 . 0 4 | 2 . 2 8 | 4 4 . 7 6 | 1 8 3 . 5 5 | | 6 | 4 7 . 0 4 | 1 . 8 4 | 4 5 . 2 1 | 1 3 8 . 3 5 | | 7 | 4 7 . 0 4 | 1 . 3 8 | 4 5 . 6 6 | 9 2 . 6 9 | | 8 | 4 7 . 0 4 | 0 . 9 3 | 4 6 . 1 1 | 4 6 . 5 8 | | 9 | 4 7 . 0 4 | 0 . 4 7 | 4 6 . 5 8 | 0 . 0 0 | | _ _ _ _ _ _ | _ _ _ _ _ _ _ _ _ _ _ _ _ | _ _ _ _ _ _ _ _ _ _ _ _ _ | _ _ _ _ _ _ _ _ _ _ _ _ _ | _ _ _ _ _ _ _ _ _ _ _ _ _ | | T o t a l | 4 2 3 . 3 7 | 2 0 . 4 2 | 4 0 2 . 9 6 | 0 | | _ _ _ _ _ _ | _ _ _ _ _ _ _ _ _ _ _ _ _ | _ _ _ _ _ _ _ _ _ _ _ _ _ | _ _ _ _ _ _ _ _ _ _ _ _ _ | _ _ _ _ _ _ _ _ _ _ _ _ _ |Note-se que a tabela Price acima foi criada usando a taxa de 1% e n˜
ao a taxa real de
2.4227%. Com uma taxa de 1%, o valor final n˜
ao ser´
a $500, mas sim $470.42. Para que a
tabela seja impressa com a taxa real, esta deve ser calculada:
t, ni = getInterest(450, 400, 10)
• Taxa = 2.4227% - 15 itera¸c˜
oes
• O pre¸co `
a vista ´
e igual ao pre¸co total corrigido.
• Taxa Real = 2.4227%, Itera¸c˜
oes = 15, Fator = 0.9000
• Pre¸co `
a vista + juros de 2.42% ao mˆ
es = $500.00
• Pre¸co a prazo - juros de 2.42% ao mˆes = $450.00
• Juros Embutidos = ($500.00 - $450.00) / $450.00 * 100 = 11.11%
• Desconto = ($500.00 - $450.00) / $500.00 * 100 = 10.00%
• Excesso = $450.00 - $450.00 = $-0.00
• Excesso = ($500.00 - $500.00) * 0.9000 = $-0.00
• Percentual pago a mais = -0.00%
• Coeficiente de Financiamento: 0.113803
• Valor financiado = 450.00 - 50.00 = 400.00
• Presta¸c˜
ao: $50.00
T a b e l a P r i c e _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | M ^e s | P r e s t a ¸c ~a o | J u r o s | A m o r t i z a ¸c ~a o | S a l d o D e v e d o r | | _ _ _ _ _ _ | _ _ _ _ _ _ _ _ _ _ _ _ _ | _ _ _ _ _ _ _ _ _ _ _ _ _ | _ _ _ _ _ _ _ _ _ _ _ _ _ | _ _ _ _ _ _ _ _ _ _ _ _ _ | | 1 | 5 0 . 0 0 | 9 . 6 9 | 4 0 . 3 1 | 3 5 9 . 6 9 | | 2 | 5 0 . 0 0 | 8 . 7 1 | 4 1 . 2 9 | 3 1 8 . 4 1 | | 3 | 5 0 . 0 0 | 7 . 7 1 | 4 2 . 2 9 | 2 7 6 . 1 2 | | 4 | 5 0 . 0 0 | 6 . 6 9 | 4 3 . 3 1 | 2 3 2 . 8 1 | | 5 | 5 0 . 0 0 | 5 . 6 4 | 4 4 . 3 6 | 1 8 8 . 4 5 | | 6 | 5 0 . 0 0 | 4 . 5 7 | 4 5 . 4 3 | 1 4 3 . 0 1 | | 7 | 5 0 . 0 0 | 3 . 4 6 | 4 6 . 5 4 | 9 6 . 4 8 | | 8 | 5 0 . 0 0 | 2 . 3 4 | 4 7 . 6 6 | 4 8 . 8 2 | | 9 | 5 0 . 0 0 | 1 . 1 8 | 4 8 . 8 2 | -0.00 | | _ _ _ _ _ _ | _ _ _ _ _ _ _ _ _ _ _ _ _ | _ _ _ _ _ _ _ _ _ _ _ _ _ | _ _ _ _ _ _ _ _ _ _ _ _ _ | _ _ _ _ _ _ _ _ _ _ _ _ _ | | T o t a l | 4 5 0 . 0 0 | 5 0 . 0 0 | 4 0 0 . 0 0 | 0 | | _ _ _ _ _ _ | _ _ _ _ _ _ _ _ _ _ _ _ _ | _ _ _ _ _ _ _ _ _ _ _ _ _ | _ _ _ _ _ _ _ _ _ _ _ _ _ | _ _ _ _ _ _ _ _ _ _ _ _ _ |1.3
Imprimindo a Tabela Price
A tabela Price
9indica o quanto se pagou de juros no per´ıodo e o quanto foi amortizado do
principal. Por exemplo, para um empr´
estimo de $23.000 reais, a ser pago em 12 vezes, com
uma taxa de juros de 4,55% ao mˆ
es, temos:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | M ^e s | P r e s t a ¸c ~a o | J u r o s | A m o r t i z a ¸c ~a o | S a l d o D e v e d o r | | _ _ _ _ _ _ | _ _ _ _ _ _ _ _ _ _ _ _ _ | _ _ _ _ _ _ _ _ _ _ _ _ _ | _ _ _ _ _ _ _ _ _ _ _ _ _ | _ _ _ _ _ _ _ _ _ _ _ _ _ | | n | R = pmt | J | U = pmt - J | PV - U | | _ _ _ _ _ _ | _ _ _ _ _ _ _ _ _ _ _ _ _ | _ _ _ _ _ _ _ _ _ _ _ _ _ | _ _ _ _ _ _ _ _ _ _ _ _ _ | _ _ _ _ _ _ _ _ _ _ _ _ _ | | 1 | 2 5 2 9 . 5 4 | 1 0 4 6 . 5 0 | 1 4 8 3 . 0 4 | 2 1 5 1 6 . 9 6 | | 2 | 2 5 2 9 . 5 4 | 9 7 9 . 0 2 | 1 5 5 0 . 5 2 | 1 9 9 6 6 . 4 4 | | 3 | 2 5 2 9 . 5 4 | 9 0 8 . 4 7 | 1 6 2 1 . 0 7 | 1 8 3 4 5 . 3 7 | | 4 | 2 5 2 9 . 5 4 | 8 3 4 . 7 1 | 1 6 9 4 . 8 3 | 1 6 6 5 0 . 5 4 | | 5 | 2 5 2 9 . 5 4 | 7 5 7 . 6 0 | 1 7 7 1 . 9 4 | 1 4 8 7 8 . 6 0 | | 6 | 2 5 2 9 . 5 4 | 6 7 6 . 9 8 | 1 8 5 2 . 5 7 | 1 3 0 2 6 . 0 3 | | 7 | 2 5 2 9 . 5 4 | 5 9 2 . 6 8 | 1 9 3 6 . 8 6 | 1 1 0 8 9 . 1 8 | | 8 | 2 5 2 9 . 5 4 | 5 0 4 . 5 6 | 2 0 2 4 . 9 8 | 9 0 6 4 . 1 9 | | 9 | 2 5 2 9 . 5 4 | 4 1 2 . 4 2 | 2 1 1 7 . 1 2 | 6 9 4 7 . 0 7 | | 10 | 2 5 2 9 . 5 4 | 3 1 6 . 0 9 | 2 2 1 3 . 4 5 | 4 7 3 3 . 6 2 | | 11 | 2 5 2 9 . 5 4 | 2 1 5 . 3 8 | 2 3 1 4 . 1 6 | 2 4 1 9 . 4 6 | | 12 | 2 5 2 9 . 5 4 | 1 1 0 . 0 9 | 2 4 1 9 . 4 6 | 0 . 0 0 | | _ _ _ _ _ _ | _ _ _ _ _ _ _ _ _ _ _ _ _ | _ _ _ _ _ _ _ _ _ _ _ _ _ | _ _ _ _ _ _ _ _ _ _ _ _ _ | _ _ _ _ _ _ _ _ _ _ _ _ _ | | T o t a l | 3 0 3 5 4 . 5 0 | 7 3 5 4 . 5 0 | 2 3 0 0 0 . 0 0 | 0 | | _ _ _ _ _ _ | _ _ _ _ _ _ _ _ _ _ _ _ _ | _ _ _ _ _ _ _ _ _ _ _ _ _ | _ _ _ _ _ _ _ _ _ _ _ _ _ | _ _ _ _ _ _ _ _ _ _ _ _ _ | ## R e t o r n a a T a b e l a Price , t a m b ´e m c h a m a d a de s i s t e m a f r a n c ^e s # de a m o r t i z a ¸c ~a o . # ´E um m ´e t o d o u s a d o em a m o r t i z a ¸c ~a o de e m p r ´e s t i m o s c u j a p r i n c i p a l # c a r a c t e r ´ı s t i c a ´e a p r e s e n t a r p r e s t a ¸c ~o es ( ou p a r c e l a s ) i g u a i s . # O m ´e t o d o foi a p r e s e n t a d o em 1 7 7 1 por R i c h a r d P r i c e em sua o b r a # " O b s e r v a ¸c ~o es s o b r e P a g a m e n t o s R e m i s s i v o s ". # # @ p a r a m np n ´u m e r o de p r e s t a ¸c ~o es . # @ p a r a m pv v a l o r do e m p r ´e s t i m o . # @ p a r a m t t a x a de j u r o s . # @ p a r a m pmt p a g a m e n t o m e n s a l . # @ r e t u r n uma m a t r i z c u j a s l i n h a s s ~a o l i s t a s com : # ( m ^e s , p r e s t a ¸c ~a o , juros , a m o r t i z a ¸c ~a o , s a l d o d e v e d o r ). # def p r i c e T a b l e ( np , pv , t , pmt ):
Embora as presta¸c˜
oes sejam fixas, ou seja, sabe-se exatamente o quanto vai ser pago a
cada mˆ
es, se a dura¸c˜
ao do empr´
estimo for muito longa e com juros altos, como os cobrados
pelo sistema banc´
ario brasileiro, a amortiza¸c˜
ao ser´
a muito lenta, e, por conseguinte, se pagar´
a
uma quantidade de juros exorbitante.
9
1.4
Disponibilizando Tudo na Internet
CGI ´
e uma forma padr˜
ao de gerar conte´
udo dinˆ
amico para p´
aginas Web.
CGI significa
Common Gateway Interface e provˆ
e uma interface padr˜
ao entre o servidor HTTP e programas
que geram conte´
udo Web. Esses programas s˜
ao mais conhecidos como scripts CGI, e s˜
ao
escritos com uma linguagem script (em geral interpretada) qualquer, como Python ou Perl,
por exemplo. O servidor HTTP processa esses arquivos script fonte, linha por linha, e chama
as fun¸c˜
oes do CGI quando necess´
ario. A sa´ıda de uma fun¸c˜
ao CGI ´
e enviada ao cliente Web
(navegador) como parte de uma p´
agina Web.
Dessa forma, se utilizarmos o CGI para executar scripts Python no servidor
10, tudo o que
calculamos pode ser acessado por qualquer navegador e ser muito ´
util na avalia¸c˜
ao de um
empr´
estimo por uma pessoa com acesso `
a Internet
11.
Portanto, um script CGI como o do c´
odigo 1, pode ser executado num servidor HTTP,
para processar entradas fornecidas atrav´
es de um formul´
ario HTML.
# !/ usr / bin / env p y t h o n 3 # c o d i n g : UTF -8
#
# CGI i n t e r f a c e for CDC c a l c u l a t i o n s . # S h o u l d be c o p i e d to :
# - / L i b r a r y / W e b S e r v e r / CGI - E x e c u t a b l e s / ( M a c O S ) # - / usr / lib / cgi - bin / ( U b u n t u )
# - / var / www / cgi - bin ( F e d o r a ) #
# @ a u t h o r P a u l o R o m a # @ d a t e 2 9 / 0 6 / 2 0 2 0 #
# @ s e e h t t p s :// d e v e l o p e r . m o z i l l a . org / en - US / d o c s / Web / H T M L / E l e m e n t / c o d e
# @ s e e h t t p :// lcg . u f r j . br / p y t h o n / h t m l / cdc . cgi ? np = 1 0 & tax =0& pv = 4 5 0 & pp = 5 0 0 & e =0 # I m p o r t m o d u l e s for CGI h a n d l i n g i m p o r t cgi , c g i t b i m p o r t sys , os , c o d e c s sys . p a t h . a p p e n d ( os . e n v i r o n . get ( " D O C U M E N T _ R O O T " )+ ’ / p y t h o n / l a b s / h i d d e n ’ ) f r o m _ 0 2 f _ r a t i o n a l i m p o r t g e t I n t e r e s t , CF , p r i c e T a b l e , p r i n t T a b l e , \ s e t D o w n P a y m e n t , g e t D o w n P a y m e n t # W h e n P y t h o n p r i n t s U n i c o d e s t r i n g s to the c o n s o l e it u s u a l l y d e t e c t s # the c o n s o l e e n c o d i n g and a u t o m a t i c a l l y e n c o d e s the U n i c o d e s t r i n g s # u s i n g t h a t e n c o d i n g .
# For CGI t h e r e is no t e r m i n a l so the d e f a u l t is a s c i i . # One can c h a n g e s t d o u t to a n o t h e r e n c o d i n g by u s i n g : sys . s t d o u t = c o d e c s . g e t w r i t e r ( ’ u t f 8 ’ )( sys . s t d o u t . b u f f e r ) # we w a n t s o m e e r r o r m e s s a g e s c g i t b . e n a b l e () # C r e a t e i n s t a n c e of F i e l d S t o r a g e 10 https://www.tutorialspoint.com/python/python_cgi_programming.htm 11 http://orion.lcg.ufrj.br/python/html/cdc.cgi?np=12&tax=4.55&pv=23000&pp=30500
f o r m = cgi . F i e l d S t o r a g e () e r r m s g = " " # Get d a t a f r o m f i e l d s try : np = int ( f o r m . g e t v a l u e ( ’ np ’ )) t = f l o a t ( f o r m . g e t v a l u e ( ’ tax ’ ) ) / 1 0 0 pp = f l o a t ( f o r m . g e t v a l u e ( ’ pp ’ )) pv = f l o a t ( f o r m . g e t v a l u e ( ’ pv ’ )) e x c e p t E x c e p t i o n as err : e r r m s g = " I n v a l i d P a r a m e t e r s : {} " . f o r m a t ( err ) p r i n t ( """ Content - t y p e : t e x t / h t m l ; c h a r s e t = utf -8\ r \ n \ r \ n < html > < h6 >{} </ h6 > < head >
< m e t a n a m e =" v i e w p o r t " c o n t e n t =" w i d t h = device - width , initial - s c a l e =1" > < title > CDC - Cr ´e d i t o D i r e t o ao C o n s u m i d o r CGI Program </ title >
</ head > < body > """ . f o r m a t ( " P y t h o n { 0 [ 0 ] } . { 0 [ 1 ] } . { 0 [ 2 ] } - E n c o d i n g : {1} " . f o r m a t ( sys . v e r s i o n _ i n f o [:3] , sys . g e t d e f a u l t e n c o d i n g ( ) ) ) ) if e r r m s g : p r i n t ( e r r m s g ) sys . e x i t (1) dp = len ( f o r m . v a l u e ) <= 4 p r i n t ( """ < h4 > P a r c e l a s : { } { : d } </ h4 > < h4 > T a x a : { : . 2 f }% </ h4 > < h4 > Pre ¸c o a P r a z o : $ { : . 2 f } </ h4 > < h4 > Pre ¸c o `a V i s t a : $ { : . 2 f } </ h4 > """ . f o r m a t ( " 1+ " if dp e l s e " " , np -1 if dp e l s e np , 1 0 0 * t , pp , pv )) s e t D o w n P a y m e n t ( dp ) # com ou sem e n t r a d a i = g e t I n t e r e s t ( pp , pv , np ) if t <= 0: t = i [ 0 ] * 0 . 0 1 cf = CF ( t , np ) pmt = pv * cf if g e t D o w n P a y m e n t (): pmt /= (1+ t ) np -= 1 # uma p r e s t a ¸c ~a o a m e n o s pv -= pmt # pre ¸c o `a v i s t a m e n o s a e n t r a d a p r i n t ( " < h4 > V a l o r f i n a n c i a d o = $ { : . 2 f } - $ { : . 2 f } = $ { : . 2 f } </ h4 > " . f o r m a t ( pv + pmt , pmt , pv )) p r i n t ( """ < h4 > T a x a R e a l ({} i t e r a ¸c ~o es ): { : . 4 f }% </ h4 > < h4 > C o e f i c i e n t e de F i n a n c i a m e n t o : { : . 6 f } </ h4 >
< h4 > P r e s t a ¸c ~a o : $ { : . 2 f } </ h4 > < h2 > T a b e l a Price </ h2 > """ . f o r m a t ( i [1] , i [0] , cf , pmt )) ptb = p r i c e T a b l e ( np , pv , t , pmt ) t a b l e = " " for i in r a n g e ( len ( ptb )): t a b l e += " < tr > " for j in r a n g e ( len ( ptb [ 0 ] ) ) : col = " { : . 2 f } " . f o r m a t ( ptb [ i ][ j ]) if i > 0 and \ j > 0 e l s e str ( ptb [ i ][ j ]) t a b l e += ( " < td s t y l e = ’ text - a l i g n : c e n t e r ’ > " if i > 0 e l s e " < th > " ) + \ col + ( " </ td > " if i > 0 e l s e " </ th > " ) t a b l e += " </ tr > " p r i n t ( """ < t a b l e b o r d e r =1 > { c o n t e n t } </ table > """ . f o r m a t ( c o n t e n t = t a b l e )) if F a l s e : # h t m l s u p p r e s s e s s p a c e s p r i n t ( " < pre > " ) # m o n o s p a c e d f o n t p r i n t ( " < code > " ) p r i n t T a b l e ( ptb ) p r i n t ( " </ code > " ) p r i n t ( " </ pre > " ) p r i n t ( " </ body > " ) p r i n t ( " </ html > " )
C´
odigo 1: cdc.cgi
1.5
Criando o Seu Pr´
oprio Servidor HTTP
´
E relativamente simples criar um servidor HTTP (Hypertext Transfer Protocol ) local em
MacOS
12,
13ou Linux
14. Isso vai facilitar muito os testes do seu c´
odigo Javascript ou Python.
Ambos os sistemas possuem um servidor Apache
15pr´
e-instalado
16que pode ser ativado.
Aconselho atribuir um nome ao servidor, por exemplo, o nome do seu computador, e em Linux,
redirecionar o Document Root para fora da raiz (/) do sistema, colocando-o por exemplo em
/home/html.
Em MacOS, os arquivos de configura¸c˜
ao est˜
ao em /etc/apache2. Basicamente, ´
e
ne-cess´
ario editar o arquivo httpd.conf e no diret´
orio extra, os arquivos httpd-ssl.conf
e httpd-vhosts.conf para configurar o m´
odulo ssl.
Opcionalmnete, criar arquivos
para cada usu´
ario no diret´
orio users, se for necess´
ario permitir o acesso ao diret´
orio
Sites (equivalente ao public html em Linux) no home de cada usu´
ario, que poder´
a
ser acessado como: http://localhost/∼user.
O Document Root do Apache2 est´
a em
/Library/WebServer/Documents. Finalmente, para reiniciar o servidor Apache, basta
exe-cutar:
sudo apachectl restart
Em Ubuntu, ´
e poss´ıvel criar um host virtual em /etc/apache2/sites-available, usando
o arquivo 000-default.conf como ponto de partida. Desta forma, n˜
ao ´
e necess´
ario alterar o
arquivo de configura¸c˜
ao global em /etc/apache2/apache2.conf. Algo como cederj.conf:
< V i r t u a l H o s t *:8088 > # p o r t a p a r a o h o s t v i r t u a l S e r v e r N a m e c e d e r j # n o m e do h o s t S e r v e r A l i a s c e d e r j . l o c a l S e r v e r A d m i n r o m a @ l o c a l h o s t # e m a i l do a d m i n i s t r a d o r D o c u m e n t R o o t / h o m e / h t m l # o n d e f i c a m os a r q u i v o s h t m l < D i r e c t o r y "/ h o m e / h t m l " > O p t i o n s I n d e x e s F o l l o w S y m L i n k s A l l o w O v e r r i d e All R e q u i r e all g r a n t e d A d d D e f a u l t C h a r s e t utf -8 # q u e r e m o s a c e n t o s </ D i r e c t o r y > . . . . </ V i r t u a l H o s t >
Para ativar este novo arquivo, deve-se fazer:
sudo a2ensite cederj.conf
Depois, deve-se ativar o m´
odulo CGI:
sudo a2enmod cgid
12https://discussions.apple.com/docs/DOC-3083
13https://jasonmccreary.me/articles/install-apache-php-mysql-mac-os-x-catalina/ 14https://phoenixnap.com/kb/how-to-install-apache-web-server-on-ubuntu-18-04 15https://apache.org
16
Para reler os arquivos de configura¸c˜
ao do servidor Apache no Ubuntu 18.04 basta usar
17:
sudo apache2ctl graceful
Em caso de erro, pode-se verificar a validade dos arquivos de configura¸c˜
ao:
sudo apachectl configtest
O Diret´
orio padr˜
ao para colocar os scripts ´
e:
• /Library/WebServer/CGI-Executables, para macOS;
• /usr/lib/cgi-bin, para Ubuntu e
• /var/www/cgi-bin, para Fedora.
Para poder colocar os scripts num diret´
orio qualquer, basta adicionar um arquivo .htaccess,
com o seguinte conte´
udo:
O p t i o n s + E x e c C G I
A d d H a n d l e r cgi - s c r i p t . py
Se a sua distribui¸c˜
ao Linux usar SELinux
18(Security-Enhanced Linux ), deve-se alterar o
contexto dos arquivos python, para que possam ser executados:
sudo chcon -t httpd_user_script_exec_t *.py
´
E poss´ıvel tamb´
em ativar o servidor seguro que utiliza o m´
odulo ssl para criptografar o
tr´
afego. A configura¸c˜
ao est´
a em /etc/apache2/mods-available/ssl.conf. No entanto, isso
d´
a um pouco mais de trabalho, porque ser´
a necess´
ario criar chaves RSA para identificar o
servidor. Neste curso, isso ´
e absolutamente dispens´
avel. O script pode ser acessado como
http://localhost:porta/cgi-bin/cdc.cgi ou http://cederj:8088/cgi-bin/cdc.cgi.
A porta padr˜
ao 80 pode ser omitida e os argumentos podem ser passados da seguinte forma:
http://localhost/cgi-bin/cdc.cgi?np=12&tax=4.55&pv=23000&pp=30500
´
E poss´ıvel acessar o seu servidor de fora da Intranet (rede local), desde que se saiba o IP
externo da conex˜
ao, e que o seu provedor de Internet n˜
ao utilize CGNAT
19. Para ter acesso
ao IP externo, pode-se utilizar um servi¸co de redirecionamento qualquer, como o do no-ip
20.
17https://www.configserverfirewall.com/ubuntu-linux/restart-apache-ubuntu-18/
18SELinux pode controlar que atividades um sistema permite para cada usu´ario, processo e daemon, com especifica¸c˜oes muito precisas.
19https://www.copeltelecom.com/site/blog/conheca-o-cgnat/ 20