Ir ao conteúdo

Posts recomendados

Postado
var
   original: vetor [1..20] de caractere
   cifra: vetor [1..20] de inteiro
   alfabeto: vetor [1..26] de caractere
   i, j, aux, RA, soma: inteiro
   resto : real
inicio

   alfabeto[1] <- "A"
   alfabeto[2] <- "B"
   alfabeto[3] <- "C"
   alfabeto[4] <- "D"
   alfabeto[5] <- "E"
   alfabeto[6] <- "F"
   alfabeto[7] <- "G"
   alfabeto[8] <- "H"
   alfabeto[9] <- "I"
   alfabeto[10] <- "J"
   alfabeto[11] <- "K"
   alfabeto[12] <- "L"
   alfabeto[13] <- "M"
   alfabeto[14] <- "N"
   alfabeto[15] <- "O"
   alfabeto[16] <- "P"
   alfabeto[17] <- "Q"
   alfabeto[18] <- "R"
   alfabeto[19] <- "S"
   alfabeto[20] <- "T"
   alfabeto[21] <- "U"
   alfabeto[22] <- "V"
   alfabeto[23] <- "W"
   alfabeto[24] <- "X"
   alfabeto[25] <- "Y"
   alfabeto[26] <- "Z"

   escreval ("Digite os caracteres da mensagem original, utilize um "." Para finalizar: ")
   para i de 1 ate 20 faca
      leia (original[i])
      se (original[i] = ".") entao
         original[i] <- ""
         Interrompa
      fimse
   fimpara
   escreva ("Quantos dígitos possui seu RA: ")
   leia (RA)
   para i de 1 ate RA faca
      escreva ("Digite o ", i, ". dígito de seu RA: ")
      leia (aux)
      soma <- soma + aux
      resto <- soma minusc 26
   fimpara
   escreval ("RA: ", RA, " - RESTO: ", resto)
   para i de 1 ate 20 faca
      escreva (original[i])
   fimpara
   escreval()
   // mecanismo para fazer a troca de letras por números.
    para i de 1 ate 20 faca
---------------------------------------------------------------------------
      XXXXXXXXXXXXXXXXX se(original[i] = alfabeto[i])entao
                original[i]  <- alfabeto[i]XXXXXXXXXXXXXXXXX
---------------------------------------------------------------------------                
         

       fimpara

   // mensagem cifrada com números gerada pelas trocas.
   escreva (" Mensagem criptografada: ")
   escreval()

   // recuperação da mensagem original.
   para i de 1 ate 20 faca
      se (cifra[i] <> 0) entao
        aux <- cifra[i] - resto
        original[i] <- alfabeto[aux]
      fimse
   fimpara
   escreval()
   // Exibição da mensagem original recuperada.
   // A mensagem original recuperada pela etapa anterior de troca de números por letras.
   escreva ("Mensagem original: ")


fimalgoritmo

Código de criptografia.

 

O objetivo deste código e melhorar e resolve-lo, na parte onde tem os ""X"", e onde eu tenho que colocar original dentro de alfabeto, pegar os números e somar com resto

gostaria de ajuda para colocar original em alfabeto, para fazer o resto, por isso a sintaxe esta errada.

 

Postado

@Eric level   essa parte do código

// mecanismo para fazer a troca de letras por números.
para i de 1 ate 20 faca
---------------------------------------------------------------------------
      XXXXXXXXXXXXXXXXX se(original[i] = alfabeto[i])entao
                original[i]  <- alfabeto[i]XXXXXXXXXXXXXXXXX
---------------------------------------------------------------------------                
fimpara

não tem nenhuma Lógica , pois se original[i]  igual  alfabeto[i]  então não precisa adicionar nada pois já são iguais ,   e por que você disse que não consegue chamar o vetor    ?  ?  ,     isso de fazer encriptações e descriptações é bem complicado mesmo ,  tente explicar melhor o que você pretende fazer nesse código , 

  • Membro VIP
Postado

@Eric level, poste o enunciado completo da questão e tente demonstrar mais ou menos o que está tentando fazer...

 

Adendo:

Para facilitar a tua vida, você não precisa ficar digitando toda a hora o "original". Inseria logo no código...

 

Exemplo:

   //   escreval ("Digite os caracteres da mensagem original, utilize um "." Para finalizar: ")
   //   para i de 1 ate 20 faca
   //      leia (original[i])
   //      se (original[i] = ".") entao
   //         original[i] <- ""
   //         Interrompa
   //      fimse
   //   fimpara

   original[1] <- "V"
   original[2] <- "I"
   original[3] <- "S"
   original[4] <- "U"
   original[5] <- "A"
   original[6] <- "L"
   original[7] <- "G"
   original[8] <- ""

 

Depois que tiver funcionando bem você faz testes com mais palavras.

 

  • Curtir 1
Postado

@devair1010 saberia me explicar como eu faço para declarar a posição de um vetor 

 para i de 1 ate 20 faca
                 para j de 1 ate 26 faca
                      se(original[i]=alfabeto[j])entao

                          
                     fimse
                  fimpara
             fimpara

gostaria de pegar os valores em números para continuar a criptografar

  • Curtir 1
Postado

@Eric level   creio que voce quis dizer especificar a posicao do vetor ,  entao , a posicao do vetor eh informada pelo numero que se coloca entre os colchetes 

       [ este abre colchete    e  esse fecha colchete  ]      ;

  • Curtir 1
Postado

@Simon Viegas, segue:

 

Imagine que você é responsável pelo setor de desenvolvimento de novos contratados em uma empresa de desenvolvimento de software e, inicialmente, devem ser observados os conhecimentos de programação gerais destes colaboradores de forma que possam ser avaliados como adequados ou não para os trabalhos regulares da empresa.

O objetivo maior de seu trabalho é auxiliar todos em seu desenvolvimento dentro das necessidades básicas da empresa e avaliação do potencial produtivo imediato destes novos contratados. Assim, foi solicitado a você que desenvolva um algoritmo que sirva como experimento para que estes possíveis novos integrantes da equipe de desenvolvimento, possam implementa-lo em uma linguagem de programação específica de uso da empresa.

Sendo assim, observe a ideia de problema que servirá de base para o desenvolvimento do algoritmo proposto:
Uma mensagem de texto deve ser criptografada com base em uma chave que é obtida a partir da soma de todos os dígitos do seu número de RA (registro acadêmico), e é usada no processo de troca de caracteres da mensagem original para uma versão cifrada da mesma.

Basicamente, a regra consiste na soma de um valor, que posteriormente deve ser dividido por 26, que é a quantidade de letras do alfabeto, imaginando que as mensagens para esta atividade envolvem apenas letras do alfabeto, maiúsculas e sem acentuação para simplificar o processo. Na maioria das divisões, o resultado será uma divisão imperfeita, gerando resto para evitar resultados com um valor que apresente casas decimais.

Considerando este cenário, existe uma operação computacional que divide dois números e retorna como resultado o resto da divisão e não o número chamado de quociente (resultado da divisão). Por exemplo, na divisão de 8 por 4, o quociente é 2 e o resto 0, mas na divisão de 9 por 4, o quociente também é 2, mas o resto 1. Esse valor do resto é o que interessa no algoritmo que você irá desenvolver.

A partir da obtenção do resto, seja 0 ou mais (podendo ser de no máximo 25), este valor é a base da criptografia, pois será usado para que os caracteres da mensagem original sejam trocados. Esta troca poderia ser realizada de várias maneiras com base nesse valor do resto, como por exemplo, trocar as letras por números usando o resto como base, trocar as letras por equivalentes a quantidade de posições para frente ou para trás na ordem alfabética, etc.

Para esta atividade, a ideia será de que as letras da mensagem original sejam trocadas pelo número equivalente na ordem alfabética somado a este resto, separando cada número com um espaço em branco. Como forma de ilustrar este observe o exemplo a seguir que mostra parcialmente como seria realizada a criptografia:
 
Palavra original: UNICESUMAR
RA exemplo: 1951009-5 (para definir a chave)
Soma RA: 1+9+5+1+0+0+9+5=30
30 / 26 = 1
RESTO = 4
Neste caso a chave será 4.


Agora observe o alfabeto abaixo e os respectivos valores para cada letra. 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
A B C D E F G H I  J  K  L  M  N  O  P  Q  R  S  T  U  V  W  X  Y  Z

 
A partir dessa representação, a palavra original será cifrada da seguinte forma:
21+4 14+4 9+4 3+4 5+4 19+4 21+4 13+4 1+4 18+4
Resultado final = 25 18 13 7 9 23 25 17 5 22
 
O importante é que com base nesta regra, seja possível a obtenção da mensagem original de volta usando a mensagem cifrada e aplicando a regra inversa, ou seja, trocando cada número pela letra equivalente do alfabeto após subtrair o valor do resto de cada valor da mensagem cifrada como se pode ver a seguir:
 
Palavra cifrada:
25 18 13 7 9 23 25 17 5 22
25-4 18-4 13-4 7-4 9-4 23-4 25-4 17-4 5-4 22-4
21 14 9 3 5 19 21 13 1 18
Palavra original: UNICESUMAR
 
As letras que estão mais adiante no alfabeto não foram cifradas por ser apenas um exemplo ilustrativo da mecânica do processo, mas para a atividade, é preciso que o algoritmo seja capaz de converter uma mensagem original toda que pode ter quaisquer letras de todo o alfabeto, e sendo capaz de retornar a mensagem original novamente.

Como critério de avaliação da atividade, serão avaliados os pontos a seguir:
1. Cálculo do valor da “CHAVE”.
2. Algoritmo de criptografia que seja capaz de cifrar uma mensagem com até 50 letras seguindo a regra de criptografia indicada na atividade. Algoritmos que realizem trocas baseadas em outras lógicas serão considerados errados.
3. Uma mensagem original e a correspondente cifrada para avaliação da funcionalidade do algoritmo e validação da correta interpretação do problema

 

 

 

@devair1010  [ este abre colchete  e  esse fecha colchete ]   

Certo mas gostaria de saber como pegar o numero comparando com a letra a frente exemplo

 

   alfabeto[7] <- "G"
   alfabeto[8] <- "H"
   alfabeto[9] <- "I"

 

GHI = 789

  • Obrigado 1
Postado

@Eric level,     esse numeros 789 se referem ao contador , que estando nesse loop   "para"  , seria  i  , entao voce faria assim  :

para j de 7 ate 9 faca
    escreva(alfabeto[7])
fimpara
escreva(" = ")
para j de 7 ate 9 faca
    escreva(j)
fimpara

 

assim vai escrever na tela esses caracteres do jeito que voce escreveu ,   mas Agora se o que voce quer seja armazenar esses caracteres , entao use outro vetor de caracteres .

  • Obrigado 1
Postado

@devair1010 é porque no caso eu precisava pegar estes números através daki

 

Em 31/05/2021 às 10:02, Eric level disse:

escreval ("Digite os caracteres da mensagem original, utilize um "." Para finalizar: ")
para i de 1 ate 20 faca
  leia (original[i])
  se (original[i] = ".") entao
    original[i] <- ""

 

 

 

  • Curtir 1
  • Membro VIP
Postado

@Eric level, segue algumas dicas para reorganizar o código (e ajudar a focar mais na lógica):

 

1# Pré-defina os valores para o testes

Exemplo:

   //   escreval ("Digite os caracteres da mensagem original, utilize um "." Para finalizar: ")
   //   para i de 1 ate 20 faca
   //      leia (original[i])
   //      se (original[i] = ".") entao
   //         original[i] <- ""
   //         Interrompa
   //      fimse
   //   fimpara

   original[1]  <- "U"
   original[2]  <- "N"
   original[3]  <- "I"
   original[4]  <- "C"
   original[5]  <- "E"
   original[6]  <- "S"
   original[7]  <- "U"
   original[8]  <- "M"   
   original[9]  <- "A"
   original[10] <- "R"
   original[11] <- ""

 

E faz a mesma coisa com o RA:

   RA <- 19510095
   resto <- 4
   escreval ("RA: ", RA:1, " - RESTO: ", resto:1)

 

Pronto. Você terá o original e o resto de uma forma prática... não ficar perdendo tempo..

 

 

 

 

2# Cada variável deveria ser apenas utilizada para o propósito dela

Exemplo:

Em 31/05/2021 às 10:02, Eric level disse:

   // recuperação da mensagem original.
   para i de 1 ate 20 faca
      se (cifra[i] <> 0) entao
        aux <- cifra[i] - resto
        original[i] <- alfabeto[aux]
      fimse
   fimpara

 

 

Ali dentro do se você está sobrescrevendo o conteúdo da palavra original (que está no vetor original)... isso não seria interessante. Sugeriria ter outra variável para armazenar o valor decifrado... a "palavra" decifrada não é a mesma "palavra" que a original... ela é uma palavra nova, apenas, pelo contexto, elas devem ser iguais entre si... entende?

 

Poderia utilizar algo assim:

var
   original, cifrado, decifrado: vetor [1..20] de caractere

 

São 3 coisas distintas... fazendo assim, por exemplo, daria para você comparar se o conteúdo do original está igual ou não ao valor do decifrado. (Afinal, esse é o objetivo do algoritmo.)

 

 

 

 

3# Codificação de letras para número e vice-versa

A minha sugestão é procurar tentar dividir o problema maior em parte menores... ou seja: procurar identificar uma parte do todo.

 

Vamos lá:

14 minutos atrás, Eric level disse:

@devair1010  [ este abre colchete  e  esse fecha colchete ]   

Certo mas gostaria de saber como pegar o numero comparando com a letra a frente exemplo

 


   alfabeto[7] <- "G"
   alfabeto[8] <- "H"
   alfabeto[9] <- "I"

 

GHI = 789

 

 

Aqui você queria que, para a palavra for "GHI", o programa retorne o código "789"? Algo do tipo?

 

Se sim, tente simplificar.. que tal em vez de 3 letras, você tente responder apenas para 1 letra? Você concorda que para traduzir 3, precisaria traduzir 1 no processo? 

 

Vamos exemplificar um contexto para apenas uma letra:

 

Exemplos:

Letra informada: A

Resultado esperado: 1

 

Letra informada: H

Resultado esperado: 8

 

Letra informada: T

Resultado esperado: 20

 

Agora perceba... o que você (supostamente) quer seria um conjunto de letras ao mesmo tempo, correto? Então PRIMEIRO consiga resolver com uma letra só... cria uma lógica para ela...   depois de conseguir, verá que pode surgir outros problemas... por exemplo:

 

Palavra informada: AHT

Resultado esperado: 1820

 

Ao tentar, verá que se você tentar "somar" 1 + 8 + 20 vai dar 29, e não 1820... e aí? Perceba que, como você já sabe traduzir a letra, agora só irá se preocupar em como "concatenar" números...   então, agora imagine tentado fazer as duas coisas ao mesmo tempo (saber traduzir e saber concatenar)??? Sacou? São 2 problema distintos.. ambos necessitam de um esforço... (A medida que vai testando e aprendendo/relembrando vai conseguindo fazer mais coisas ao mesmo tempo, mas a ideia seria sempre procurar fazer coisas mais simples antes de tentar ir direto por mais complexo.)

 

Pelo o contexto do programa, você não precisará desses códigos concatenados, ou seja: o resultado não presaria ficar numa variável só, mas apenas ter cada código separado, que poderia ser armazenado num vetor... pronto!

 

Seria algo do tipo:

Palavra informada: AHT

Resultado esperado:

1 //na posição 1 do vetor

8 //na posição 2 do vetor

20 //na posição 3 do vetor

 

 

Minha sugestão... faça isso:

"Leia uma letra do usuário e retorne a posição dessa letra no alfabeto."

 

Só depois, tente fazer a tradução de um vetor de caracteres completos...

 

Por fim, verás que para cifrar a palavra, você simplesmente precisaria incrementar o valor de resto para cada código encontrado... só isso. Para decifrar, o oposto: decrementa o valor de resto.

 

 

  • Obrigado 1
Postado

@Eric level

 

para i de 1 ate 20 faca         leia(original[i]) 
    se   original[i] = "."  entao
        original[i] <- "  "
    fimse
    se  (  original[i] = "g"  ) ou (original[i] = "h") ou (original[i] = " i" ) entao
    escreva(original[i])
    fimse
fimpara
escreval("789")

 

mas ainda nao entendi o por que fisdo , de pegar o numeto referente a posicao da letra .

  • Membro VIP
Postado

@devair1010, não sei se foi uma pergunta retórica... mas vou tentar complementar:

 

 

3 minutos atrás, devair1010 disse:

mas ainda nao entendi o por que fisdo , de pegar o numeto referente a posicao da letra .

 

O propósito do problema é codificar uma palavra. Daí, para tanto precisaria "traduzir cada letra da palavra para o seu código (valor da posição) no alfabeto acrescido de um valor arbitrário".

 

  • Curtir 1
Postado

@devair1010

6 minutos atrás, devair1010 disse:

mas aiinda nao entendi o por que fisdo , de pegar o numeto referente a posicao da letra .

Esta atividade e referente a criptografia, no caso eu tenho q pegar estes números de uma palavra aleatória, e somar estes números com "resto" e assim criptografar uma mensagem

  • Membro VIP
Postado

 

Resumindo:

Primeiro apenas traduz a palavra:

"UNICESUMAR" daria:

21 14 9 3 5 19 21 13 1 18

 

Só que, como quer "cifrar", incrementa com um valor arbitrário, como por exemplo o 4:

"UNICESUMAR" resultaria em:

25 18 13 7 9 23 25 17 5 22

 

Por fim.. a definição "desse valor arbitrário" sugeria de OUTRA lógica lá... (que pode ser tratado posteriormente... ou seja: não precisa tentar fazer tudo de uma vez... OU tenta encontrar o valor do código; OU tenta codificar utilizando um código qualquer. Depois junta uma coisa com a outra.)

 

Adendo: vejam... se o valor do código der errado, é praticamente impossível que a criptografia seja correta... logo: cada "pequena parte" do programa, como sugestão, precisaria ser feito separadamente... 

 

Seria algo assim: cada coisa que está implementando, precisa ter uma boa certeza que está correta... daí, implementar varias coisas ao mesmo tempo tende a tonar mais complicado identificar onde e o que está errado...

 

Por exemplo, vamos testar o valor do resto:

image.png

 

Veja que no seu código deu 30, mas deveria dar 4, veja:

 

1 hora atrás, Eric level disse:

RA exemplo: 1951009-5 (para definir a chave)
Soma RA: 1+9+5+1+0+0+9+5=30
30 / 26 = 1
RESTO = 4
Neste caso a chave será 4.

 

Logo, ANTES de tentar traduzir, você precisaria focar apenas no cálculo desse resto... OU, como sugeri, apenas definir que o resto é 4 e focar apenas na criptografia.

 

ADENDO: independente do código utilizado, ao criptografar e decifrar, o resultado daria certo, pois para esse caso o valor do código não importa, importa apenas que tanto para criptografar, tanto para decifrar, utilizem o mesmo valor!!!. Entretanto, o contexto do enunciado subentende que necessariamente o código lá deveria dar 4, pois faz parte da fluxo... (Mesmo que eventualmente não faça diferença.)

 

  • Obrigado 1

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