var
...i: inteiro
...declare letras[ 10 ]: literal
inicio
...leia letras[ 1 ]
...i <- 2
...enquanto i <= 10 faca
......leia letras[ i ]
......se letras[ i ] < letras[ i - 1 ] entao
.........escreva "Letra inválida: Menor que a anterior..."
.........i <- i - 1
......fimse
......i <- i + 1
...fimenquanto
fimalgoritmo
2º - Um número de CPF é formado por 9 dígitos, mas 2 dígitos verificadores que ficam no final. Estes dígitos verificadores são calculados de acordo com os outros 9 dígitos do CPF e servem para verificar a validade do CPF.
Apresentamos aqui uma forma simplificada para o calculo destes dígitos: Somar os produtos de cada um dos dígitos do CPF, pela sua respectiva posição, e pegar o resto da divisão inteira desta soma por 11. este resultado será o digito verificador 1. Para calcular o digito verificador 2 , repetir o processo, somente alterando a multiplicação dos dígitos pela sua posição, de forma que as posições fiquem invertidas.
Faça um algoritmo capaz de, uma vez informado os 9 dígitos de um CPF qualquer, informar os 2 dígitos verificadores deste CPF.
var
...i: inteiro
...declare dv1, dv2, cpf: inteiro
inicio
...dv1 <- 0
...dv2 <- 0
...i <- 1
...enquanto i < 10 faca
......leia cpf
......dv1 <- dv1 + i * cpf
......dv2 <- dv2 + ( 10 - i ) * cpf
......i <- i + 1
...fimenquanto
...dv1 <- dv1 mod 10
...dv2 <- dv2 mod 10
...escreva dv1
...escreva dv2
fimalgoritmo
Observações.
- Em 2 dias as respostas serão acrescentadas a esta postagem.
- Quaisquer dúvidas devem ser especificadas através de comentários a esta postagem, não sendo respondido nenhum questionamento via e-mail.
- O enunciado da 2ª questão especifica resto da divisão por 11, o que daria valores de 0 a 10, e cada dígito verificador deve ser de 0 a 9. Com isso, acho que houve um erro no enunciado, devendo o valor 11 ser substituído por 10.
Prof° o CPF tem 11 dígitos(9 + 2 dífitos vereficadores).
ResponderExcluirO algorítmo calcula esses "dois dígitos". Mas a resposta vem com 4 dígitos.
Ex.:dv1=49
dv2=19
A resposta tem de ser assim mesmo ou está contrariando o fato de só haver 11 dígitos no CPF em vez de 13.
A resposta tem que ter apenas 11 dígitos. Verifiquei as regras definidas no enunciado da questão e observei que os valores citados no teu comentário seriam impossíveis de aparecer. Deve ter algo errado nele. Pequei este exercício de uma apostila e ainda não tive tempo para fazê-lo. Espero ainda hoje ter um tempo postar a resposta no Blog.
ResponderExcluirprofº o algoritmo interpreta as letras igualmente aos numeros?
ResponderExcluirEx.: a < b => 1 < 2
Caso sim, o motivo tem haver com os números hexadecimais onde o decimal 10 equivale ao hexadecimal A e o 11 equivale ao hexadecimal B?
Profº agora que analisei com mais atenção percebi que o que o comando queria não era parte inteira da divisão por 11 e sim o resto da divisão inteira por 11(Dá p/ confundir!).Portanto, depois desta descoberta o algorítmo calcula e exibe apenas dois dígitos finais e não 4 como havia comentado anteriormente.Obrigado!
ResponderExcluirProf. fiz o do CPF só que não rodou no visualg! Já refiz e não encontrei o erro! Dava de o sr. verificar pra mim ai:
ResponderExcluirvar
n, digito, sProd1, sProd2, digVer1, digVer2 : inteiro
x : vetor[1..9] de inteiro
t : vetor[11..19] de inteiro
inicio
// Seção de Comandos
x<-0
n<-1
leia(digito)
enquanto n<=9 faca
x<-x+1
vetor[x]<-digito
n<-n+1
leia (digito)
fimenquanto
sProd1<-0
enquanto x<>1 faca
vetor[t]<-vetor[x]*n
x<-x-1
n<-n-1
sProd1<-sProd1+vetor[t]
t<-t+1
fimenquanto
digVer1<-sProd1/11
n<-n+8
sProd2<-0
enquanto x<>9 faca
vetor[t]<-vetor[x]*n
x<-x+1
n<-n-1
sProd2<-sProd2+vetor[t]
t<-t-1
fimenquanto
digVer2<-sProd2/11
Escreval ("Digito verificador 1: ", digVer1)
Escreval ("Digito verificador 2: ", digVer2)
fimalgoritmo
Para o Fabrício
ResponderExcluirTeu programa tem alguns problemas de lógica e por isso, mesmo que funcionasse, não iria cumprir com o objetivo. Além disso detectei algumas falhas de código, onde a primeira define um vetor de inteiro "x" que é usado como uma variável inteira. Todo acesso a vetor deve ser acompanhado de seu índice, ou seja, toda ocorrência de "x", deveria ter o formato "x[índice]". A solução para este problema é simples e virá em breve.
Para o Edson
ResponderExcluirAs linguagens de programação associam letras a números. Isto acontece devido a codificação do alfabeto, onde foi convencionado que letras e outros símbolos seriam dispostos em uma tabela, conhecida como ASCII, onde, por exemplo, a letra A equivale ao decimal 65, B ao 66, e assim por diante. A definição de letras em algarismos hexadecimais é uma outra convenção.
Cássio, na resposta da 1ª questão na linha:"se letras[ i ] <>"
ResponderExcluir..."diferente" de quê???
.
a resposta ta errada, porque o i tem q ser menor que 10 e não menor e igual. João Paulo
ResponderExcluirAxo q ue sua resposta não está certa, ja fiz o teste com alguns cpf's aqui e não dá certo. João Paulo
ResponderExcluirO erro referente ao "letras[ i ] <>" é culpa do Blogger, pois toda vez que vou postar um programa com o sinal de "<" ele coloca o sinal de ">" e some com o restante da linha e troca a fonte de uma parte da postagem. O erro já foi corrigido. Obrigado por ter observado.
ResponderExcluirProfessor, acredito que nesta linha de código de "Exercícios de Programação", esteja faltando uma variável.(Corrija-me se estiver errado)
ResponderExcluir"enquanto n <>"
Seria:
"enquanto n <> qtde"
Você está certo. Já corrigi a postagem. Só observo que o comentário deveria ter sido feito na postagem correta.
ResponderExcluir