terça-feira, 29 de junho de 2010

Mais Exercícios de Programação

1º - Dado um vetor de 10 posições do tipo literal faça uma algoritmo que permita que o usuário digite 10 letras, e que estas letras sejam colocadas nas respectivas posições dentro do vetor. O algoritmo no entanto não poderá permitir que seja digitada uma letra menor (ordem alfabética crescente) que a letra que foi digitadas anteriormente, ou seja a letra que será colocada na posição 2 deverá ser maior ou igual que a letra colocada na posição 1, a letra colocada na posição 3 deverá ser maior que a letra digitada para a posição 2, e assim sucessivamente até o final do vetor. A primeira letra poderá ser digitada livremente pelo usuário sendo que a regra acima somente se aplica as letras que forem colocadas da segunda posição em diante.

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.

13 comentários:

  1. Prof° o CPF tem 11 dígitos(9 + 2 dífitos vereficadores).
    O 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.

    ResponderExcluir
  2. 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.

    ResponderExcluir
  3. profº o algoritmo interpreta as letras igualmente aos numeros?
    Ex.: 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?

    ResponderExcluir
  4. 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!

    ResponderExcluir
  5. Prof. 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:
    var
    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

    ResponderExcluir
  6. Para o Fabrício

    Teu 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.

    ResponderExcluir
  7. Para o Edson

    As 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.

    ResponderExcluir
  8. Cássio, na resposta da 1ª questão na linha:"se letras[ i ] <>"
    ..."diferente" de quê???


    .

    ResponderExcluir
  9. a resposta ta errada, porque o i tem q ser menor que 10 e não menor e igual. João Paulo

    ResponderExcluir
  10. Axo 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

    ResponderExcluir
  11. O 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.

    ResponderExcluir
  12. Professor, acredito que nesta linha de código de "Exercícios de Programação", esteja faltando uma variável.(Corrija-me se estiver errado)
    "enquanto n <>"
    Seria:
    "enquanto n <> qtde"

    ResponderExcluir
  13. Você está certo. Já corrigi a postagem. Só observo que o comentário deveria ter sido feito na postagem correta.

    ResponderExcluir