Dúvida: soma de decimais

28 views
Skip to first unread message

José Casadei

unread,
Feb 26, 2014, 12:25:35 PM2/26/14
to programaded...@googlegroups.com
Pessoal, 
Quem puder ajudar, agradeço.

Há u exercício na página 25, capítulo 3, do livro: Let s be a string that contains a sequence of decimal numbers separeted by commas, e.g., s = '1.23,2.4,3.123'. Write a program that prints the sum of the numbers in s.

Tentei algo assim:

total = 0
for c in '1.23,2.4,3.123':
    total = total + int(c)
print total

Mas recebo como resposta: ValueError: invalid literal for int() with base 10: '.' O código sempre captura o ponto (.) depois de capturar o numeral inteiro, à esquerda do ponto.

Lendo o capítulo, parece que tenho de converter cada número decimal (1.23, 2.4, 3.123) em número binário e, em seguida, convertê-los novamente em número base 2. É isso? Me parece muito trabalhoso para um exercício simples ....

Alguém socorre?

Abs
José

Capi Etheriel

unread,
Feb 26, 2014, 7:03:22 PM2/26/14
to programaded...@googlegroups.com
"for x in something" funciona se something for uma lista ou algo iterável (isto é, que eu posso ir pegando item por item, tipo uma lista).

você passou uma string. curiosamente, em python, strings são iteráveis! mas elas retornam caractere por caractere.
então seu código inicializa o total como 0 (parabéns) e na primeira iteração pega o primeiro caractere (1) e transforma em número. por fim, ele soma o total com esse número (0+1 = 1)
segunda iteração, ele pega o segundo caractere: o ponto (.)! e na hora de converter o ponto em número inteiro ele grita: ERRO. afinal, que número esse sinal gráfico deveria virar?

dica: vc precisa quebrar essa string em 3 números decimais (dentro de uma lista, de preferência).

Pedro Markun

unread,
Feb 26, 2014, 7:21:13 PM2/26/14
to Capi Etheriel, programadedados2014_01
E pra ser bem claro, não você não precisa transformar em binário :)

O Python sabe transformar string direto em float... se for um float! :)

[]'s
Pedro


--
Você está recebendo esta mensagem porque se inscreveu no grupo "Aprendendo a Programar com o MIT e a Escola de Dados" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para programadedados20...@googlegroups.com.
Para postar neste grupo, envie um e-mail para programaded...@googlegroups.com.
Visite este grupo em http://groups.google.com/group/programadedados2014_01.
Para ver esta discussão na web, acesse https://groups.google.com/d/msgid/programadedados2014_01/e9218f42-ee25-4a5d-b607-6f7e13bdac23%40googlegroups.com.

Para obter mais opções, acesse https://groups.google.com/groups/opt_out.

José Casadei

unread,
Feb 27, 2014, 7:28:31 AM2/27/14
to programaded...@googlegroups.com, Capi Etheriel
Obrigado pelas dicas, todas. Vou dar mais uma olhada nas aulas para ver se eu consigo.
Abs
José 

José Casadei

unread,
Feb 27, 2014, 2:16:34 PM2/27/14
to programaded...@googlegroups.com
Caras,

Segui as dicas de vocês, sobre lista e separar a string. Consegui mais ou menos assim:

total = 0
s = '1.23,2.4,3.123'

list=s.split(',')
print list

for c in list:
    total+=float(c)
print total

O foda é que o professor sugere este exercício, mas para construir o código foi preciso buscar conhecimento que nem ele, nem o livro, nem as vídeo-aulas passaram. Por exemplo: split() e float(). Foi necessário buscar esse conhecimento fora do curso. (a não ser que eu não tenha percebido, apesar de ver e rever o material).

E esse era um exercício simples .. perdi umas quatro horas .... rs
Bom, acho que é isso. Abs
José

capi etheriel

unread,
Feb 27, 2014, 2:48:26 PM2/27/14
to José Casadei, programadedados2014_01
é assim mesmo. todos os dias eu tenho que estudar como algo funciona nas tecnologias que eu uso, e 1 a cada 3 vezes nem está documentado como funciona.
(meus amigos programadores na lista podem se impressionar que 33% do código documentado é um número alto).


--
Você recebeu esta mensagem porque está inscrito em um tópico do grupo "Aprendendo a Programar com o MIT e a Escola de Dados" dos Grupos do Google.
Para cancelar a inscrição neste tópico, acesse https://groups.google.com/d/topic/programadedados2014_01/zhq8gSP-2kU/unsubscribe.
Para cancelar a inscrição neste grupo e todos os seus tópicos, envie um e-mail para programadedados20...@googlegroups.com.

Para postar neste grupo, envie um e-mail para programaded...@googlegroups.com.
Visite este grupo em http://groups.google.com/group/programadedados2014_01.

Para obter mais opções, acesse https://groups.google.com/groups/opt_out.



--
Capi Etheriel
Desenvolvedor e Designer para Web
Comunidade Transparência Hacker
http://barraponto.blog.br http://zerp.ly/barraponto

João Batista Neto

unread,
Feb 28, 2014, 9:54:49 AM2/28/14
to programaded...@googlegroups.com
Fala José,

Como o pessoal já disse, o erro é causado por que você está trabalhando com uma string, em vez de números. Traduzindo o seu código, o que está acontecendo é o seguinte:

1 - declare a variável total com valor 0
2 - para cada c contido em '1.23,2.4,3.123', faça alguma coisa.
Como '1.23,2.4,3.123' é uma string, então "cada c" significa: 1, ponto, 2, 3, vírgula, 2, ponto, 4, etc
3 - Na primeira volta do for, c é o caractere 1. Então vai haver a soma de total, que vale zero, com o resultado da conversão do caractere 1 em um inteiro.
4 - Na segunda volta do for, c é o caractere . (ponto). Quando tentar fazer a conversão do ponto para um inteiro, você recebe o ValueError.

No seu segundo algorítimo, você fez um split utilizando a vírgula como separador.

total = 0
s = '1.23,2.4,3.123'
list=s.split(',')
print list

Isso obviamente funciona, mas não é a maneira mais adequada. Da mesma forma como uma string é uma cadeia de caracters, uma lista é uma cadeia de valores. Assim, você pode declarar a lista literalmente, por exemplo:

total = 0

for c in [1.23,2.4,3.123]:
    total = total + int(c)

print total

Veja que, utilizando a lista diretamente no for, o código é muito semelhante à sua primeira tentativa. A única diferença é que, em vez das aspas que delimitam strings, você utiliza colchetes para delimitar listas.

Agora, atente-se ao detalhe do int(c). Isso fará que 1.23 seja somado como 1, 2.4 seja somado como 2 e 3.123 seja somado como 3, resultando em 6 em vez de 6.753. Se o objetivo for fazer a soma dos decimais, então você precisa remover essa função. O algorítimo ficaria assim:

total = 0

for c in [1.23,2.4,3.123]:
    total = total + c

print total

Ou, para evitar a tendinite, você pode utilizar += para simplificar:

total = 0

for c in [1.23,2.4,3.123]:
    total += c

print total

Abraços,

Em quarta-feira, 26 de fevereiro de 2014 14h25min35s UTC-3, José Casadei escreveu:
Reply all
Reply to author
Forward
0 new messages