Exercicio em Python

tenho um exercício em python que não consigo resolver…
Escreva um programa que receba como parâmetro de entrada um número inteiro de 5 digitos no intervalo fechado [10000, 30000] que represente códigos de produtos vendidos em uma loja, crie uma função para validar os dados de entrada, obrigando o usuário a respeitar o intervalo e o tipo de dado (inteiro).
crie uma função que calcule e retorne o digito verificador do código, utilizando a regra de calculo explicada. por exemplo., considere o código 98765, em que cada digito é multiplicado por um peso começando em 2, os valores obtidos são somados, e do total obtido calcula-se o resto de sua divisão por 7.
exemplo, 9 * 2, 83, 74, 65, 56.
retorne na função o valor do digito verificador calculado e imprima na tela o codigo do produto digitado e seu digito verificador separado por hifen, como 9876-5
alguem consegue ajudar?

Qual código você já tentou?

Comecei assim, e depois não consegui continuar…

def valida_int(valor, min, max):
x = int(input(valor))
while ((x < min) or (x > max )):
x = int(input(valor))
return x

while True:
x = valida_int('Digite o codigo do produto: de 10000 a 30000 ',10000, 30000)

Para ler o número, pode ser assim:

def ler_numero(minimo, maximo):
    while True:
        try:
            n = int(input(f'Digite um número entre {minimo} e {maximo}: '))
            if minimo <= n <= maximo:
                return n
            else:
                print(f'O número deve estar entre entre {minimo} e {maximo}')
        except ValueError:
            print('Você não digitou um número')

Ou seja, ele repete o while até que o número seja válido. O bloco try/except é para o caso de não ser digitado um número (por exemplo, se for digitado “xyz”). Depois, você verifica se o número está dentro do intervalo válido, e caso esteja, retorna.

Eu acho assim melhor, porque a leitura do valor é feita apenas uma vez. Eu não gosto de repetir uma vez antes do loop e outra dentro dele (se mudar a mensagem, por exemplo, você teria que mudar em 2 lugares, já fazendo como o código acima, só precisa mudar uma vez).


Depois, basta ler o número e ir obtendo os dígitos dele um a um:

n = ler_numero(10000, 30000)

x = n
total = 0
for peso in range(6, 1, -1):
    x, digito = divmod(x, 10)
    total += digito * peso

# calcula o dígito verificador
dv = total % 7
print(f'{n}-{dv}')

Como a leitura garante que o número tem 5 dígitos, eu sei que os pesos serão de 2 a 6. Mas no for eu começo do último dígito: pego o resto da divisão por 10 (usando divmod, que retorna ao mesmo tempo o resultado da divisão e o resto da mesma).

Assim, ao pegar o resto da divisão por 10, eu pego o último dígito. E ao dividir por 10, eu “removo” este dígito do número, assim na próxima iteração o resto da divisão retorna o penúltimo, etc.

E como eu começo do último dígito, eu uso o range(6, 1, -1), que faz os números variarem de 6 a 2, em ordem decrescente.

Depois é só pegar o resto da divisão por 7 para obter o dígito verificador e mostrar os valores separados por hífen.

1 curtida

precisa multiplicar os digitos pelo peso, não somar

Não funcionou corretamente…

Mas eu fiz isso: digito * peso. Talvez o print no loop tenha confundido (retirei ele, em todo caso), mas estou multiplicando sim.

E uma dica: quando você diz que algo não funciona, tem que dizer o que exatamente não funcionou, senão a gente não tem como adivinhar. Foi o cálculo, a leitura do número? O que não funcionou?
Tem alguns exemplos de números e qual deveria ser o dígito verificador?

Segue aqui um teste que fiz, me parece estar de acordo com o enunciado : https://ideone.com/DrEjkj

1 curtida

Bom dia, desculpe amigo por não me expressar direito, mas o resultado dos valores digitados precisam ser multiplicados em sequencia, no caso se eu digitar:
98765 precisa ser multiplicado nessa ordem

  • 23456
    ou seja o nove 82, 83, 7*4 e assim por diante, no seu teste ele apenas deu print do que digitou
    em uma linha imprimir digito= digitado, em outra linha peso em sequencia 2 3 4 5 6 e o resultado da multiplicação em baixo

Mas tanto faz multiplicar começando do primeiro ou último dígito, o resultado é o mesmo…

preciso que seja igualexercico

Cara do céu eu to empacada nesta neste mesmo exercicio e não consigo fazer não vai de jeito nenhum.
Você conseguiu?

O que você já conseguiu fazer?

Só a validação
Não conmsigo ir para o calculo.

def valida(pergunta, min, max):
cod = int(input(pergunta))
while ((cod < min) or (cod > max)):
cod = int(input(pergunta))
return cod
cod = valida(‘Digite o codigo do produto: ‘, 10000, 30000)
print (’{}’.format(cod))

1 curtida

E aí alguém conseguiu?

Testou esse código?
Rodei ele e está conforme o exercício.

A validação consigo fazer, o meu problemas está em fazer a função, alguém conseguiu fazer esta parte?

Crie uma função que calcule e retorne o dígito verificador do código, utilizando a regra
de cálculo explicada a seguir. Por exemplo, considere o código 21853, em que cada dígito
é multiplicado por um peso começando em 2, os valores obtidos são somados, e do total
obtido calcula-se o resto de sua divisão por 7.
Retorne na função o valor do dígito verificador calculado e imprima na tela o código
do produto digitado e seu dígito verificador separado por hífen, como: 21853-5.

O Hugo deu a solução alguns posts acima (no nº. 3). Tentou fazer o que ele falou pelo menos ou nem leu o que os colegas escreveram?

O querido obrigado pela preocupação, mas eu vi sim e tentei executar mas não deu certo.
Por isso questionei se alguém tinha conseguido finalizar, queria entender se fiz algo errado ou se realmente o código não estava trazendo o que foi pedido.

Qual foi exatamente o erro?

Normalmente é mais fácil corrigir um erro pontual do que fazer tudo do zero.

É só pegar o código que fiz ali em cima e colocar em uma função:

def calcula_dv(numero):
    x = numero
    total = 0
    for peso in range(6, 1, -1):
        x, digito = divmod(x, 10)
        total += digito * peso

    return total % 7

Juntando tudo, fica assim:

def ler_numero(minimo, maximo):
    while True:
        try:
            n = int(input(f'Digite um número entre {minimo} e {maximo}: '))
            if minimo <= n <= maximo:
                return n
            else:
                print(f'O número deve estar entre entre {minimo} e {maximo}')
        except ValueError:
            print('Você não digitou um número')

def calcula_dv(numero):
    x = numero
    total = 0
    for peso in range(6, 1, -1):
        x, digito = divmod(x, 10)
        total += digito * peso

    return total % 7

numero = ler_numero(10000, 30000)
dv = calcula_dv(numero)
print(f'{numero}-{dv}')

Uma dica (que vai servir não só para o curso, mas também para a futura vida profissional): dizer apenas “não funciona”, “não deu certo”, etc, é muito vago e não ajuda os outros a entender onde está o problema. Sempre é bom dar detalhes: o código que você usou, os valores recebidos e o resultado obtivo versus o que vc esperava (“Usei esse código, digitei X e ele fez Y, mas tinha que fazer Z”).

Com mais detalhes, fica mais fácil os outros tentarem descobrir o que está errado (sem nenhum detalhe, só na base da adivinhação :slight_smile: ). Enfim, pelo que entendi, o exercício era só criar as funções (uma que lê o número e outra que calcula o dígito verificador), e no final imprimir o número + dv.


PS: este é um daqueles cursos que tem um sistema de correção automática? Geralmente - pelo que tenho percebido - eles esperam que a entrada e saída estejam em um formato bem específico (se tiver uma vírgula diferente no print ele diz que está errado, mesmo que o algoritmo esteja certo).

Se for esse o caso, talvez o problema esteja aí. Ou o professor quer que as funções usem algum algoritimo específico, sei lá (não é incomum ter restrições como “não pode usar X, que apesar de ser bem mais fácil eu ainda não ensinei”). Também não sei se é o caso.

Enfim, pelo que entendi do enunciado, seria só isso…

2 curtidas