Ir ao conteúdo
  • Cadastre-se

Python Programa nao funciona se der numeros negativos de entrada


Posts recomendados

fiz um programa que calcula a distancia entre dois pontos, mas ele nao funciona se eu coloco numeros negativos como entrada.

 

a = input("Digite o primeiro numero:")

X1 = float(a)

b = input("Digite o segundo numero:")

Y1 = float(b)

c = input("Digite o terceiro numero:")

X2 = float(c)

d = input("Digite o quarto numero:")

Y2 = float(d)

import math

Distancia = math.sqrt(X1) - math.sqrt(X2**2) + math.sqrt(Y1) - math.sqrt(Y2**2)

print(Distancia)

if Distancia >= 10:
        print("longe")
else:
     print("perto")

 

Link para o comentário
Compartilhar em outros sites

Olá!

"""
Siga sempre os padrões da PEP 8 - As importações de módulos sempre no começo do documento e 
em linhas separadas ficam mais legíveis e seguem uma ordem de xecução, assim voce não corre 
o risco da sua aplicação de pular alguma função que necessite dela.

Leia a PEP 8: https://www.python.org/dev/peps/pep-0008/
"""
import math

'''
Porque você não oferece logo a X1 como receptora direta do input?

X1 = float(input("Digite o primeiro numero:"))
o mesmo para: Y1, X2, Y2
Isso diminui o código e melhora a legibilidade.
'''

A sua fórmula quer calcular a distância entre pontos, mas a forma de obtenção da abcissa não está correta! seus resultados sempre são negativos e sempre dão resultado como perto.

veja os valor próximos:

image.png.cf541c616b6f1d446b2b3deed945ade2.png

  

A sua mesma fórmula, mas com valores distantes:

image.png.51731bcba733767a62b00b30307dd279.png

 

Então eu fiz aqui meu teste e passando os mesmo valores, e olha o resultado:

image.png.c12004f79c5458e1d1abaa12dba4797c.png

e

image.png.aa7ad72e6d75e979e748488fa310e2e5.png

 

revise sua fórmula com resultados reais antes de começar a programar, assim você tem um comparativo real ao seu simulado

 

Quanto ao valor negativo, faça uma função ou mesmo uma condicional if else, que verifica se o valor do input é um número positivo ou negativo, pode ser assim:

def somente_positivos(valor):

    while True:
        if float(valor) < 0:
            print('Digite apenas números positivos!')
            exit()
        else:
            return valor
          
# Chamando a função de dentro do input e convertendo para X1 o valor em flutuante(float)

X1 = float(somente_positivos(input("Digite o primeiro numero: ")))
print(f'valor digitado: {X1}')

Os possíveis resultados na tela seriam esses:

Numero negativo, dá um aviso e sai do programa

 

mas você pode implementar com um while e ele fica testando enquanto a condição não foi atingida

 

ou o segundo resultado para números positivos:

 

 

Não sei se ajuda, mas já tem aí uma dica de como contornar esse problema.

Qualquer dúvida deixe mensagem aqui.

image.png

image.png

Link para o comentário
Compartilhar em outros sites

obrigado pelas dicas, realmente revisar a formula antes de programar é um bom conselho.

 

esse programa faz parte de um curso que estou fazendo, e ele tem um corretor que testa o programa, e no teste ele digita os valores de entrada: -1, 2, 3, -4

 

o erro que da é este: math domain error

Link para o comentário
Compartilhar em outros sites

8 minutos atrás, Fabio Umpierre disse:

obrigado pelas dicas, realmente revisar a formula antes de programar é um bom conselho.

 

esse programa faz parte de um curso que estou fazendo, e ele tem um corretor que testa o programa, e no teste ele digita os valores de entrada: -1, 2, 3, -4

 

o erro que da é este: math domain error

 

Saquei, então curso com esse teste automatizado deve querer todos o returns dos seus inputs, para isso voce tem que testar mesmo cada valor inserido na variável e se ela é um positivo ou um negativo e dar um return também.

 

Não sei o conteúdo do exercício, mas acredito que seja isso.

 

Você pode montar seus próprios testes(unittest, doctest) nativos do Python,(pytest)voce instala o pacote com o pip, e pode ir verificando se o seu código está acertando ou não antes de enviar.

Link para o comentário
Compartilhar em outros sites

entendi, vou tentar fazer isso, muito obrigado pela ajuda que esta me dando.

 

 

 

sou iniciante na programação, e não tenho contato com programadores, então se tiver tempo poderia me responder algumas perguntas? não são muitas.

 

1- no começo é normal ler o objetivo proposto de um programa, e não saber o que fazer? ficar umas 3 horas "travado" naquilo por mais simples que seja e ficar perdido?

 

exemplos:

1.1 - Escreva um programa que receba um número inteiro na entrada, calcule e imprima a soma dos dígitos deste número na saída

 

1.2-Receba um número inteiro positivo na entrada e imprima os nn primeiros números ímpares naturais. Para a saída, siga o formato do exemplo abaixo.

 

são programas simples, mas estou travado.

 

2- é possível que mesmo com um grande esforço e dedicação eu não aprenda a programar?

 

 

 

 

 

foto do exercício proposto pelo curso:

Teste.png

Link para o comentário
Compartilhar em outros sites

1 hora atrás, Fabio Umpierre disse:

entendi, vou tentar fazer isso, muito obrigado pela ajuda que esta me dando.

 

 

 

sou iniciante na programação, e não tenho contato com programadores, então se tiver tempo poderia me responder algumas perguntas? não são muitas.

Para ter contato com os melhores e mais ativos programadores você precisa estar em vários fóruns, uns ajudam mais e outros ajudam menos, mas de qualquer forma é uma ajuda, portanto se quer aprender algo sobre uma linguagem em específico, acompanhe o máximo que puder dos fóruns com perguntas e respostas e tente reproduzir em casa com valores diferentes, leia bastante sobre o que está aprendendo e depois pratique até que consiga entender o conceito, uma das melhores formas de aprender e comigo super funciona é a técnica de de feynman, ela diz que você deve ser capaz de explicar aquilo que você aprendeu como se estivesse explicando a outra pessoa que está aprendendo o mesmo que voce, você pode praticar com outras pessoas ou com você mesmo, como se estivesse ensaiando uma peça de teatro, pode crer falar sozinho não é maluquice, e voz moderada ao explicar você concentra seus pensamento em explicar o conteúdo e se por acaso falhar na hora de explicar e tiver dúvidas, reveja o tópico em dúvida e tente explicá-lo sozinho...depois tente novamente explicar tudo que já havia explicado, inclusive a dúvida ou as dúvidas....até que você consiga ter na mente tudo guardado e de forma que voce possa explicar tudo novamente assim que for solicitado...é uma técnica de conservar conhecimento muito boa.

 

Citação

1- no começo é normal ler o objetivo proposto de um programa, e não saber o que fazer? ficar umas 3 horas "travado" naquilo por mais simples que seja e ficar perdido?

Sim, normal, terão coisas que voce vai saber como faz, mas não saberá como montar, por isso estudar o básico de uma linguagem te leva a subir todos os degraus de conhecimento que você precisa....e não se esquente, pois cada pessoa tem seu próprio tempo de aprendizado, uns levam mais tempo e outros levam menos, e não quer dizer por isso que quem levou mais tempo ou menos tempo é melhor ou pior, o foco é aprender, então respeite os limites de cada um.

 

Citação

exemplos:

1.1 - Escreva um programa que receba um número inteiro na entrada, calcule e imprima a soma dos dígitos deste número na saída

Quando se sabe o básico isso se torna tão fácil quanto o 1+1

voce pode fazer de várias formas:

exemplo 1:

valor1 = int(input('Digite um valor: '))
valor2 = int(input('Digite outro valor: '))
print(valor1 + valor2)

outra forma como função para reaproveitamento de código:

def somar(x1, x2):
    print(x1 + x2)

somar(10,20) #dará 30

outra forma

val1, val2 = 10,20
print(val1 + val2) # vai sair 30

 

Citação

1.2-Receba um número inteiro positivo na entrada e imprima os nn primeiros números ímpares naturais. Para a saída, siga o formato do exemplo abaixo.

 

quantidade = int(input('Digite a quantidade de números impares a serem apresentados até : '))

lista_de_impares = [] # leia sobre o conceito de listas

for i in range(quantidade):
    if i % 2 == 0: # Leia sobre módulo de divisão Python
        pass
    else:
        lista_de_impares.append(i)
print(lista_de_impares)

 

Citação

são programas simples, mas estou travado.

Não esquenta que no começo é assim, voce não pode ter é pressa de chegar logo na frente sem antes formar uma base sólida no aprendizado básico.

 

Citação

2- é possível que mesmo com um grande esforço e dedicação eu não aprenda a programar?

Pode ser possível sim, programar não é qualquer um que tem a curiosidade ou habilidade de ir adiante, e como em todas as profissões, você tem que sentir gosto pelo que faz, é dito o "tesão pela coisa", se a pessoa entrar nessa porque acha que vai lucrar muito vai ter alta empregabilidade, então pode estar indo no caminho errado, porque se leva realmente muito tempo estudando e se aprofundando numa linguagem e o mercado hoje exige do programador muitas habilidades, não só em uma linguagem(especialista), mas em várias outras(conhecimento de funcionamento e capacidade de implementação), hoje em dia está em voga no  mercado Python, o Java, a sagrada triade(HTML5, CSS3 e Javascript), EcmaScript, Vue.js, Node.js, React, Angular, AngulaJS, Bootstrap, e ainda tem também aparte de infra-estrutura de servidor, o banco de dados que pode  relacional(PostgreSQL,MySql, SQLServer,) e não relacional nosql (MongoDB, Redis e Cassandra), e é preciso saber avaliar o porquê de utilizar um deles(para dar conta dos usuários), dependendo de como o projeto é desenhado.

Mas isso vem com o tempo e estudo, quanto mais você se meter em "projetos cabeludos" e ajudar pessoas a resolverem esses problemas e as suas capacidades começarem a resolver esses problemas, mais habilidoso você se torna e mais responsabilidades voce tem com projetos, por isso tem algumas categorias de programadores que são separados por tempo de conhecimento e responsabilidades, o Júnior(que está começando, e pode fazer coisas de baixa responsabilidade), o Pleno(que já manja do que rola por baixo dos panos e tem muitas habilidades inclusive de refatoração e override de código, já é mais exigido dele nos projetos) e o sênior(que conhece um projeto de ponta-a-ponta e sabe tudo que se passa nele, tem uma visão mais ampla das regras de negócio, e é muito exigido dos donos e tem que trazer o resultado porque senão isso implica em perda financeira e de cliente) e tem também o arquiteto de software que tem um conceito bem abrangente de atribuições.

 

Citação

 

 

 

 

foto do exercício proposto pelo curso:

Teste.png

Já me propuseram esses cursos de Python na Coursera pela USP, fiz um e não gostei muito do conteúdo, achei que por ser da USP deveria ser mais puxado para quem tem pré-conhecimento....mas não é ruim para os iniciantes.!

Link para o comentário
Compartilhar em outros sites

cara, não tenho palavras para agradecer a ajuda, pode ter certeza que vou aproveitar todos os conselhos, pois estou muito certo de querer trilhar esse caminho, estou estudando 6 horas por dia nesse curso, tambem comecei a fazer faculdade de analise e desenvolvimento de sistemas, mas por ser EAD, to achando ela um pouco fraquinha, então eu fico o tempo todo buscando conteúdos na internet.

 

muito obrigado pela ajuda com os exercicios, o primeiro eu ja consegui fazer, mas ele nao era do tipo digitar 2 digitos e somar, ele era assim:

 

usuario digitou 1567, dai o programa faria 1+5+6+7 = 19

 

eu ja dominei o if e else, só o while que esta sendo um pouco difícil pra mim.

 

 

muito obrigado pela ajuda, um grande abraço!

Link para o comentário
Compartilhar em outros sites

8 horas atrás, Fabio Umpierre disse:

cara, não tenho palavras para agradecer a ajuda, pode ter certeza que vou aproveitar todos os conselhos, pois estou muito certo de querer trilhar esse caminho, estou estudando 6 horas por dia nesse curso, tambem comecei a fazer

Ótimo, que bom que você tem certeza do que quer, muitos iniciam e mais lá na frente topam com problemas que são difíceis e acabam por desistir da carreira, persistência é a chave de conseguir ir adiante e ter sucesso.

 

8 horas atrás, Fabio Umpierre disse:

faculdade de analise e desenvolvimento de sistemas, mas por ser EAD, to achando ela um pouco fraquinha, então eu fico o tempo todo buscando conteúdos na internet.

Depende....minha segunda faculdade foi EAD, mas eu consegui obter muita informação, principalmente porque fiz networking com de pessoas do meio, ao participar dos eventos promovidos pela faculdade(palestras e cursinhos extras) para enriquecer conhecimento e promover justamente esse encontro entre pessoas do mesmo ramo de estudo, eu me inscrevia e ia lá "ver qual é", eu achei muito bom o curso EAD e se puder farei outro em 2020 ou 2021, pois já tem coisa nova na área e em prática que seria bom estudar, como I.A. para negócios e Machine Learning, a tendência é que estes sistemas se tornem autogerenciáveis acabem precisando cada vez menos da intervenção humana(um programador), pois a medida que "nós" vamos ensinando as máquinas como "pensar" e os algorítimos venham se tornando cada vez mais complexos, os computadores serão capazes de propor soluções em poucos segundos ou minutos em relação ao que um time de programadores experientes poderia levar horas ou dias para resolver. Estamos meio distantes disso ainda, mas não é uma certeza, pois existem várias coisas(competências) que um ser humano é ainda muito melhor do que uma máquina fria no campo do raciocínio.

 

 

8 horas atrás, Fabio Umpierre disse:

muito obrigado pela ajuda com os exercicios, o primeiro eu ja consegui fazer, mas ele nao era do tipo digitar 2 digitos e somar, ele era assim:

 

usuario digitou 1567, dai o programa faria 1+5+6+7 = 19

 

eu ja dominei o if e else, só o while que esta sendo um pouco difícil pra mim.

 

 

muito obrigado pela ajuda, um grande abraço!

 

Não sei se ficou próximo a isso, mas depois de sua explicação eu pensei nisso para sua resposta

# Duas linhas de código resolvem

valor = input('Digite um número a ser somado: ')
print(sum(int(i) for i in valor))

que imprime na tela

image.png.17654cc24d2edfa8020805658e48bd0e.png

 

Qualquer dúvida deixe sua mensagem aqui no fórum!✌️

Link para o comentário
Compartilhar em outros sites

12 horas atrás, fspjonny disse:

 

Não sei se ficou próximo a isso, mas depois de sua explicação eu pensei nisso para sua resposta


# Duas linhas de código resolvem

valor = input('Digite um número a ser somado: ')
print(sum(int(i) for i in valor))

que imprime na tela

image.png.17654cc24d2edfa8020805658e48bd0e.png

 

Qualquer dúvida deixe sua mensagem aqui no fórum!✌️

o meu ficou assim:

 

N = int(input("Digite um valor: "))

soma = 0
p = False


while (not p) :
    soma = soma + (N % 10)
    if (N // 10) == 0:
        p = True
    else:
        N = N // 10
print(soma)

 

Link para o comentário
Compartilhar em outros sites

Mas chegou a testar o código que fiz? veja como está a mais simples...é disso que te falei, quando se tem um bom estudo básico, tudo fica mais fácil. E o conhecimento quem vai buscar é você, nenhum curso é totalmente completo, eles na maioria te dão um Norte a ser seguido, dali voce segue a documentação oficial ou troca experiências com outros programadores que conseguiram abstrair mais e reduzir seus códigos.

Eu participo de uma pancada boa de grupos estrangeiros, de Kivy, Django, Python, e cada um deles tem uma uma pessoa que sempre está disposta a mostrar mais, e tem até mais didática ao ensinar. Vale a pena participar de fóruns fora do Brasil, isso te enriquece o conhecimento e te ajuda a forçar mais seu inglês e aprender, pois algumas empresas estão aderindo o contato direto do desenvolvedor com o cliente e saber as necessidades, já não se pede mais inglês técnico e sim fluência(conversation and answers), assim pula uma etapa e agiliza processos, ao invés das antigas reuniões em que um funcionário analista de requisitos ia até a empresa e pegava o briefing todo e no retorno a empresa fazia uma reunião onde distribuía as tarefas aos times. Isso tá ficando para trás também.

Link para o comentário
Compartilhar em outros sites

Sim, testei o codigo e funcionou perfeitamente, incrivel como ficou reduzido! 

Só nao entendi o "sum", pois ainda nao vi, acho ate mais simples que usar while, ja que estou tendo certa dificuldade nele. Eu tava aprendendo em uma velocidade incrivel, mas dai chegou o while e complicou tudo, na maioria dos casos eu faço um loop infinito!

 

Sim, eu segui o seu conselho e estou focando no basico, estou procurando outros materiais na internet, inclusive agora estou usando o pycharm para fazer meus codigos, ja que antes estava utilizando bloco de notas + prompt de comando, assim estava perdendo muito tempo

 

Poderia me indicar um desses foruns? Nao é a primeira vez que ouço para ver conteudos estrangeiros, meu tio que trabalha na gameloft disse que o material é muito mais amplo, mas como ele trabalha com o design de games e nao com a programacao, ele nao sabe me indicar esse tipo de coisa

Link para o comentário
Compartilhar em outros sites

9 horas atrás, Fabio Umpierre disse:

Sim, testei o codigo e funcionou perfeitamente, incrivel como ficou reduzido! 

Show!  O ideal seria sempre isso, código pequeno mas eficiente. Porém nem sempre será assim...kkk

 

Citação

Só nao entendi o "sum", pois ainda nao vi, acho ate mais simples que usar while, ja que estou tendo certa dificuldade nele. Eu tava aprendendo em uma velocidade incrivel, mas dai chegou o while e complicou tudo, na maioria dos casos eu faço um loop infinito!

 

Esta aqui é uma ótima definição do sum() https://www.programiz.com/python-programming/methods/built-in/sum

O sum() tem como função única fazer isso, iterar sobre um objeto iterável e retornar a soma dele.

 

Você pode iterar sobre objetos de várias formas, cada objeto tem sua forma de acesso, por exemplo uma string, pode-se fazer assim:

a,b,c,d = '1976' # Por atribuição múltipla
print(a)
print(b)
print(c)
print(d)

#----o que acontece aqui?
print(a + b) # imprime um 10 ou um 19?

print( int(a) + int(b) ) # e aqui? imprime um 10 ou um 19?


valor = '1976' # Acesso a string pelo seu índice
print(valor[0])
print(valor[1])
print(valor[2])
print(valor[3])

#----o que acontece aqui?
print(valor[0] + valor[1]) # imprime um 19 ou um 10?

print(int(valor[0]) + int(valor[1])) # imprime um 10 ou um 19?

 

 

Citação

Sim, eu segui o seu conselho e estou focando no basico, estou procurando outros materiais na internet, inclusive agora estou usando o pycharm para fazer meus codigos, ja que antes estava utilizando bloco de notas + prompt de comando, assim estava perdendo muito tempo

Use esse curso, é bom e é de graça: http://excript.com/curso-de-python.html

 

Citação

Poderia me indicar um desses foruns? Nao é a primeira vez que ouço para ver conteudos estrangeiros, meu tio que trabalha na gameloft disse que o material é muito mais amplo, mas como ele trabalha com o design de games e nao com a programacao, ele nao sabe me indicar esse tipo de coisa

 

Não sei se posso fazer aqui esse tipo de indicação aqui, eu dependerei da resposta e autorização de algum dos moderadores deste fórum, portanto vou deixar um nome citado aqui que sempre me atendeu e pode esclarecer melhor.

 

Pode ou não pode @DiF divulgar endereço de outros fóruns estrangeiros aqui?

 

 

Link para o comentário
Compartilhar em outros sites

acredito eu, pela lógica, que onde não esteja convertido para dado tipo int, ira retornar 19, por se tratar de uma string, e onde foi convertido para int, era retornar 10.não rodou aqui por erro de iteração, algo que tu mencionou quando eu perguntei sobre o sum, ja estou lendo a matéria que você me enviou sobre isso e entendendo como funciona

8 horas atrás, fspjonny disse:

 

 

Você pode iterar sobre objetos de várias formas, cada objeto tem sua forma de acesso, por exemplo uma string, pode-se fazer assim:


a,b,c,d = '1976' # Por atribuição múltipla
print(a)
print(b)
print(c)
print(d)

#----o que acontece aqui?
print(a + b) # imprime um 10 ou um 19?

print( int(a) + int(b) ) # e aqui? imprime um 10 ou um 19?


valor = '1976' # Acesso a string pelo seu índice
print(valor[0])
print(valor[1])
print(valor[2])
print(valor[3])

#----o que acontece aqui?
print(valor[0] + valor[1]) # imprime um 19 ou um 10?

print(int(valor[0]) + int(valor[1])) # imprime um 10 ou um 19?

 

 

 

 

 

mais uma vez, obrigado pela ajuda que esta me dando, já estou conseguindo entender um pouco melhor a linguagem python, linguagem que pretendo me especializar, eu já tive contato com c#, mas algo me chamou a atenção e curiosidade para o python.

 

ah, e já dei inicio ao curso que me indicou.

Link para o comentário
Compartilhar em outros sites

30 minutos atrás, Fabio Umpierre disse:

acredito eu, pela lógica, que onde não esteja convertido para dado tipo int, ira retornar 19, por se tratar de uma string, e onde foi convertido para int, era retornar 10.

 

Exatamente apesar de parecerem iguais quando você converte o tipo, ela muda suas características e segue o tipo que voce determinar, fora isso o Python é capaz naturalmente de determinar sozinho o tipo de dado que você associa a uma variável, isso é a tipagem dinâmica.

No exemplo que mandei: 

print(a + b) # imprime 19 pois o sinal de + passa a agir como um sinalizador de uma 
             # concatenação entre tipos iguais strings.

# E neste outro exemplo:  

print(int(a) + int(b)) # imprime um 10, pois trata-se de tipos iguais que foram tipados
                       # para valores inteiros e o sinal de + deixa de ser um 
                       # concatenador e passa a ser um operador matemático.

 

Veja: http://blog.abraseucodigo.com.br/python-uma-linguagem-de-tipagem-dinamica-e-forte.html

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...