Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #59 da revista programar. Faz já o download aqui!

Gonkali

[Resolvido] Operador de Divisão

Mensagens Recomendadas

Gonkali    11
Gonkali

Boa Tarde, foi-me proposto o seguinte exercicio :

"Write a program that reads two positive integers a and b on separate lines. If a is divisible by b, print the message "divisible". Otherwise, print the message "not divisible""

Para a Resolução do mesmo criei o seguinte código:

a = input ()
b = input ()
c = int(a)/int(b)
if c == int( c ):
   print ('divisible')
if c == float( c ):
   print ('not' + ' divisible')

Para os seguintes resultados:

Results for test case 1 out of 3

Input:

18

4

Program executed without crashing.

Program gave the following correct output:

not divisible

Results for test case 2 out of 3

Input:

24

6

Program executed without crashing.

Program output:

divisible

not divisible

Expected this correct output:

divisible

Result of grading: Your output is not correct.

Se me puderem ajudar, gostava de saber o que estou a fazer de mal, sendo que no resultado 2/3, ele está a considerar 2 outputs.

Obrigado

Gonçalo

Editado por thoga31
GeSHi

" The quieter you become, the more you are able to hear"

"Eu adoraria mudar o mundo, mas não me deram o código-fonte."

"A arte de programar consiste na arte de organizar e dominar a complexidade."

"Qualquer um pode escrever um código que o computador entenda. Bons programadores escrevem códigos que os humanos entendam."

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
thoga31    594
thoga31

Simples: se o número for inteiro, c == float( c ) também se cumpre! Essa é uma condição sempre verdadeira!

Porque é que não utilizaste um else? E porquê concatenar 2 strings no output do segundo caso?

Editado por thoga31

Knowledge is free!

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Gonkali    11
Gonkali

Simples: se o número for inteiro, c == float( c ) também se cumpre! Essa é uma condição sempre verdadeira!

Porque é que não utilizaste um else? E porquê concatenar 2 strings no output do segundo caso?

Desculpa Thoga, não percebi a 1ª parte.

Não utilizei um else porque estou a seguir o tutorial do cscircles e ainda não cheguei ao "capitulo Else,And,Or,Not", quanto a concatenação, utilizei porque ele estava a assumir o Not como função.

Editado por Gonkali
Quotes corrigidos

" The quieter you become, the more you are able to hear"

"Eu adoraria mudar o mundo, mas não me deram o código-fonte."

"A arte de programar consiste na arte de organizar e dominar a complexidade."

"Qualquer um pode escrever um código que o computador entenda. Bons programadores escrevem códigos que os humanos entendam."

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
thoga31    594
thoga31

@Gonkali, quando calculas c, ele fica do tipo float (estás a fazer uma divisão). Portanto, c==float( c ) é sempre verdade, no matter what. Se c for um número inteiro, o que vai o Python ver? Exemplo: c = 5.0, portanto c == float( c ) --> 5.0 == float (5.0) --> 5.0 == 5.0 --> verdade!

Portanto, aquela condição é sempre, mas sempre, verdadeira.

Se não deste o else, então deverás fazer isto:

if c == int( c ):
   print ('divisible')
if not (c == int( c )):
   print ('not divisible')

Mas como o else é simples, eu até de dou a solução para veres:

if c == int( c ):
   print('divisible')
else:
   print('not divisible')

Quanto ao assumir o "not" como função, esta é que eu não percebi mesmo. Explica.

Deixo só uma nota: a melhor forma de ver se dois números são divisíveis um pelo outro não é essa, mas sim utilizando o resto da divisão.

Editado por thoga31

Knowledge is free!

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Gonkali    11
Gonkali

Percebido ;)

Mas como o else é simples, eu até de dou a solução para veres:

if c == int( c ):
   print('divisible')
else:
   print('not divisible')

Utilizar o else, é bem mais fácil e prático, acho que nos próximos exercicios vou começar a usar.

Quanto ao assumir o "not" como função, esta é que eu não percebi mesmo. Explica.

Thoga, esquece, estupidez minha, inicialmente não pus os apostrofos e estava assim print (not divisible) e deu uma mensagem de erro a indicar que não reconhecia a ligação a função Not e a String.

Deixo só uma nota: a melhor forma de ver se dois números são divisíveis um pelo outro não é essa, mas sim utilizando o resto da divisão.

Estava mesmo a espera que isto me desse problemas, não comprendi muito bem a parte do resto da divisão e já estava mesmo a espera que ela voltaria to bite my a**.

Já passei essa parte mas o exercicio proposto era fácil e por uma questão de lógica consegui resolver, pois era apenas para fazer a divisão de um input() para descobrir quantas caixas com capacidade para 12 ovos se podia fazer e saber o resto.

Ovos = input()
Caixa = 12
Ncaixas = int(Ovos)/int(Caixa)
Resto = int(Ovos)%int(Caixa)
print (int(Ncaixas))
print (Resto)

Ah, já agora, uma solução mais "exótica":

print(("not " if a % b != 0 else "") + "divisible")

Por acaso, a maneira como este código está descrito utilizando o operador de resto e a concatenação, faz me mais sentido. O.o

Editado por thoga31
Tags quote + formatação do tópico subsequente + GeSHi

" The quieter you become, the more you are able to hear"

"Eu adoraria mudar o mundo, mas não me deram o código-fonte."

"A arte de programar consiste na arte de organizar e dominar a complexidade."

"Qualquer um pode escrever um código que o computador entenda. Bons programadores escrevem códigos que os humanos entendam."

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Pedro C.    15
Pedro C.

Repare-se que para versões anteriores a Python 3.0 a divisão de dois inteiros dá, necessariamente, um inteiro (como, aliás, acontece nas linguagens de mais baixo nível como o C de onde o Python vem). Utilizando a minha versão 2.7:

In [10]: 5/2
Out[10]: 2

In [11]: from __future__ import division

In [12]: 5/2
Out[12]: 2.5

Note-se que estou a importar a divisão de um modulo que se chama "futuro". Penso que foi a maneira que eles arranjaram de ir metendo as características de Python 3.0 nas versões anteriores enquanto este não tinha uma "release".

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
thoga31    594
thoga31

Estava mesmo a espera que isto me desse problemas, não comprendi muito bem a parte do resto da divisão e já estava mesmo a espera que ela voltaria to bite my a**.

Já percebeste, ou preferes que te explique? ;)

Por acaso, a maneira como este código está descrito utilizando o operador de resto e a concatenação, faz me mais sentido. O.o

Não me admira. Mas não abuses disto, só nestes casos mais simples faz sentido utilizar esta notação. Noutros casos pode não ser prático ou mesmo ser impossível.


Knowledge is free!

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Gonkali    11
Gonkali

Já percebeste, ou preferes que te explique? ;)

Se me puderes explicar agradecia imenso :)


" The quieter you become, the more you are able to hear"

"Eu adoraria mudar o mundo, mas não me deram o código-fonte."

"A arte de programar consiste na arte de organizar e dominar a complexidade."

"Qualquer um pode escrever um código que o computador entenda. Bons programadores escrevem códigos que os humanos entendam."

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
thoga31    594
thoga31

Se me puderes explicar agradecia imenso :)

Lembras-te das "contas em pé"? As da divisão eram e são as mais chatas, mas vamos com um exemplo simples:

25   | 2
    ------
05     12
1

Portanto, o quociente é 12 e o resto é 1. A divisão poderia ter proseeguido de forma a obteres as casas decimais, mas isto é o que nos interessa para distinguir dois operadores: a divisão inteira e o módulo. Watch this:

>>> 25 / 2   # Divisão dita "normal" no Python 3.x
12.5
>>> 25 // 2  # quociente inteiro
12
>>> 25 % 2   # resto da divisão
1

Se dois números são, então, divisíveis, aquele resto tem de dar 0. Se não der zero, então tens de acrescentar uns 0's nas casas decimais do numerador (neste caso 25) e vais obter um número decimal como resultado (neste caso 12,5), e isto até que o resto final seja 0, o que nem sempre acontece:

25,0 | 2
    ------
05     12,5
10
 0

5,00  | 4
     ------
1 0     1,25
 20
  0

Se os números são divisíveis, então não precisas dessa "cirurgia":

125  | 5
    ------
25    25
 0

Como podes ver, chegámos a um resto 0 sem "prolongar" o nosso 125.

Moral da história: se dois números inteiros são divisíveis, então o resto da divisão é zero.

Editado por thoga31

Knowledge is free!

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Gonkali    11
Gonkali

Lembras-te das "contas em pé"? As da divisão eram e são as mais chatas, mas vamos com um exemplo simples:

25 | 2
------
05 12
1

Portanto, o quociente é 12 e o resto é 1. A divisão poderia ter proseeguido de forma a obteres as casas decimais, mas isto é o que nos interessa para distinguir dois operadores: a divisão inteira e o módulo. Watch this:

>>> 25 / 2   # Divisão dita "normal" no Python 3.x
12.5
>>> 25 // 2  # quociente inteiro
12
>>> 25 % 2   # resto da divisão
1

Se dois números são, então, divisíveis, aquele resto tem de dar 0. Se não der zero, então tens de acrescentar uns 0's nas casas decimais do numerador (neste caso 25) e vais obter um número decimal como resultado (neste caso 12,5), e isto até que o resto final seja 0, o que nem sempre acontece:

25,0 | 2
------
05 12,5
10
0

5,00 | 4
------
1 0 1,25
20
0

Se os números são divisíveis, então não precisas dessa "cirurgia":

125 | 5
------
25 25
0

Como podes ver, chegámos a um resto 0 sem "prolongar" o nosso 125.

Moral da história: se dois números inteiros são divisíveis, então o resto da divisão é zero.

Obrigado Thoga.

Finalmente consegui perceber ;)

Obrigado pela tua ajuda e pelo esclarecimento.

Um abraço.

Gonçalo


" The quieter you become, the more you are able to hear"

"Eu adoraria mudar o mundo, mas não me deram o código-fonte."

"A arte de programar consiste na arte de organizar e dominar a complexidade."

"Qualquer um pode escrever um código que o computador entenda. Bons programadores escrevem códigos que os humanos entendam."

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
icemonster2    1
icemonster2

Boa mas não tenhas receio em publicar mais tópicos sobre as tuas duvidas nem receio que estejas a ser chato porque aqui toda a gente gosta de aprender, partilhar o seu próprio conhecimento e possivelmente vais estar a ajudar outros com estes tópicos que tenham as mesmas duvidas que tu. Apenas não caias na tentação de pedir exclarecimentos sempre que te apareçer uma minima duvida. Vai tentando fazer por ti e se não conseguires fazer então posta aqui a tua duvida que será um prazer responder.

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


×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.