Ir ao conteúdo
  • Cadastre-se

C++ Função para codificar e decoficar um numero.


Leoveira

Posts recomendados

Boa tarde.

 

Gostaria de ajuda com um exercício, pois estou estudando sozinho e não tenho alguém para poder recorrer. Ele diz o seguinte:

 

Uma empresa pretende enviar cifrada uma sequência de inteiros decimais de 4 dígitos(DigDigDigDig). A cifra consiste em: substituir cada dígito Dig por (Dig+8)%10 (i.e., adiciona 8 e calcula o resto da divisão do resultado por 10); depois troca o terceiro dígito com o primeiro e troca o quarto dígito com o segundo.

a) Escreva uma função que receba um inteiro decimal de 4 dígitos e o devolva cifrado.
b )Escreva uma função que receba um inteiro cifrado e o decifre para o valor original.
c) Escreva uma função que apresente um «menu» com 2 opções, cifrar e decifrar número, peça ao utilizador para escolher uma das opções, e retorne a opção escolhida.
d) Faça um programa que permita testar as funções anteriores.

 

Primeiro estou fazendo sem a função para entender como fazer. Fiz o seguinte:

int main(){

int n,i,num[4];

cout << "Digite um numero: ";
cin >>n;

i=0;

    while(n>0){
        num= n%10;
        n=n/10;
        i=i+1;
    }

     cout << num[1]<<num[0]<<num[3]<<num[2];

}

 

Não consigo fazer o decodificar de maneira correta, se alguém poder me explicar em vez de colocar um código já pronto iria agradecer muito.

Link para o comentário
Compartilhar em outros sites

Olá@Leoveira

int main(){

int n,i,num[4];

cout << "Digite um numero: ";
cin >>n;

i=0;

    while(n>0){
        num= n%10;
        n=n/10;
        i=i+1;
    }

     cout << num[1]<<num[0]<<num[3]<<num[2];

}

Para melhor  visualização coloquei na box-code.

Não testei, porém só de olhar consigo dizer que tem alguns erros lógicos aqui. Contudo consigo ver a intenção da tarefa principalmente no loop-while.

Ainda sim, vejo que i=0; que não serve a nada e o seu incremento que também não serve de nada foram postos aí à toa. Você percebeu isso? Não. Comece por ai dizendo a sua intenção com esse i.

 

 

Link para o comentário
Compartilhar em outros sites

2 horas atrás, Leoveira disse:

eu comecei usando o for para fazer a repetição, quando troquei para while esqueci de tirar.

Divida essa lista de questões que compões o problemas em etapas. Primeiro pensando como cifrar apenas uma entrada, esquece o loop por enquanto. Essa é um boa forma de começar e resolver. Tentas aí.

Link para o comentário
Compartilhar em outros sites

@Mauro Britivaldo  Sem loop ficaria assim:

 

int main(){

int n;

cout << "Digite um numero: ";
cin >>n;

	cout << "\t" << n%10+8;
	n=n/10;

	cout << "\t" << n%10+8;
	n=n/10;

	cout << "\t" << n%10+8;
	n=n/10;

	cout << "\t" << n%10+8;
	n=n/10;

}

Meu maior problema e entender como decodificar. Tentei colocar cada digito em um vetor e depois fazer a conta inversa mas não deu certo.

Link para o comentário
Compartilhar em outros sites

Vejo conflito de interpretação da tarefa. Estamos com ideias diferentes do problema.

Olha eu pensei assim:

Sequência de inteiros decimais de 4 dígitos(DigDigDigDig), por exemplo:

4567 essa sequência tem 4 dígitos 4-5-6-7; segundo o enunciado que diz (Dig+8)%10 para cada dígito faz-se isto: 

(4+8)%10= 2

(5+8)%10= 3

(6+8)%10= 4

(7+8)%10= 5

Para re-cifrar a questão:

(2+10)-8= 4

(3+10)-8= 5

(4+10)-8= 6

(5+10)-8= 7

Concorda?

  • Amei 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá a todos.

 

Possivelmente o código original seja esse:

#include <iostream>  //aqui no Dev++ precisou das duas linhas para o cout funcionar
using namespace std;
int main() {
    int n,i,num[4];  
    cout << "Digite um numero: ";
    cin >> n;
    i=0;
    while(n>0){
        num[i]=n%10; //o [i] deve ter sumido devido ao não uso da tag CODE. A página entende como itálico
        n=n/10;
        i=i+1;
    }
    cout << num[1]<<num[0]<<num[3]<<num[2];
}

 

Daí, para decifra, basta usar os números que estão cifrados na fórmula.

 

Alguns pontos:

- pelo que eu vi, o enunciado não explica como decifrar, rs. Mas o @Mauro Britivaldo já deu uma boa dica, ou seja, usaria o vetor na base da fórmula que ele fez;

- o enunciado exige que os procedimentos sejam feitos com funções. É necessário implementá-las;

- o objetivo do algoritmo é ter um número cifrado ou decifrado, o que é diferente de "exibir o número cifrado na tela", ou seja, você precisa ter o número todo numa variável só. Você está apenas apresentando um número na tela como esperado... é diferente. De qualquer modo, você precisará fazer isso (ter o número em uma só variável) para função, ou seja, a função deverá receber o número original e retornar nela mesma o número cifrado. Idem para decifrar. Ficaria algo como:

numCifrado=cifrarNumero(numero);
cout << "Número cifrado   : " << numCifrado;
numDecifrado=decifrarNumero(numCifrado);
cout << "Número decifrado : " << numDecifrado;

obs.: não sei se a sintaxe do cout é assim mesmo, fiz apenas um esboço.

 

Perceba que o objetivo é ter funções que criptografam e decriptografam números, exibir eles na tela servirá apenas para testar/demonstrar que eles funcionam.

 

No aguardo.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Mauro Britivaldo você me deu uma luz nesse decodificar meu caro, com isso fiz algo assim:

 

#include <iostream>
#include <stdlib.h>

using namespace std;

int main(){
    int n,i,num[4];
    cout << "\n\t Codificar e Decodificar\n";

    cout << "\nDigite um numero: ";
    cin >> n;

    //codificar
    i=0;

    while(n>0){
        num[i]=(n+8)%10;
        n=n/10;
        i=i+1;
    }

    cout << num[1]<<num[0]<<num[3]<<num[2];

    //decodificar
    i=0;

    while(i<4){
        num[i]=(num[i]+10)-8;
        i=i+1;
    }

    cout <<"\n" << num[3]<<num[2]<<num[1]<<num[0];

}

Porém está dando problemas com o digito 1, ex: se eu codificar 1234 na hora de decodificar ele me retorna 11234.

 

@Simon Viegas eu estou fazendo sem funções por que não entendi exercício por completo, assim que conseguir faço as funções necessárias. E o seu cout esta correto.

  • Curtir 1
  • Confuso 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá.

 

Coincidentemente assisti, por acaso, um vídeo sobre o que você precisa: da "função inversa" da outra função.

obs.: o nome do prof. é Gustavo Viegas, mas apesar do mesmo sobrenome não temos quaisquer vínculos. (será que é meu parente? vá saber!)
obs. 2: o vídeo pode servir para explicar o contexto do que você precisa, mas não exatamente como fazer, pois a sua primeira função (que seria o f(x)) tem a periodicidade do uso do % (resto), o que foge  do padrão...

 

 

Ou seja, a função:

26 minutos atrás, Leoveira disse:

num[i]=(num[i]+10)-8;

Não é inversa da primeira. Ela precisa ser ajustada.

 

 

RESUMINDO: você precisa ajustar a fórmula para que chegue ao resultado esperado. Tente entender como funciona a primeira função, assim como está funcionando a segunda, e tente ajustá-la para o seu contexto. (ou encontrar outra fórmula).

 

No aguardo.

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Vendo mais uma vez, o que me ocorre é tirar o mod10 mais uma vez.

Em 01/02/2018 às 21:09, Mauro Britivaldo disse:

Para re-cifrar a questão:

(2+10)-8= 4

(3+10)-8= 5

(4+10)-8= 6

(5+10)-8= 7

Para decifrar:

(2+10)-8= 4%10= 4

(3+10)-8= 5%10= 5

(4+10)-8= 6%10= 6

(5+10)-8= 7%10= 7

De fato não sei a maneira de inverter a primeira função. Porém no caso do dígito 1, refaz %10.

Ainda sim é uma medida para assegurar o bug que faz o dígito 1 e 0.

(1+8)%10= 9

((9+10)-8)%10= 1

 

(0+8)%10= 8

((8+10)-8)%10= 0

Vocês@Simon Viegas @Leoveira concordam?

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

Em 30/01/2018 às 16:26, Leoveira disse:

b )Escreva uma função que receba um inteiro cifrado e o decifre para o valor original.

Segunda parte não diz que teve ser a inversa da primeira, mais sim uma que decifre, então tá valendo qualquer solução. Ainda sim no caso de ser realmente a inversa.

 

Teria de ser a inversa da composta.

Pois f e composta de g | g: x + 8 e f: (g-10*(g/10));

para x= 1 tem f:((1+8)-10*((1+8)/10))= 9 em '/' é divisor de resultado inteiro.

Pensar na inversa desta expressão já não é mais puramente C é matemática+C o que é absolutamente maravilhoso.

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá @Mauro Britivaldo.

 

15 horas atrás, Mauro Britivaldo disse:

((9+10)-8)%10= 1

Vocês@Simon Viegas @Leoveira concordam que resolveu?

Justamente... essa seria uma resposta (por sinal a mesma que tinha encontrado)... ou seja, nesse contexto (com esse domínio e imagem do conjunto), um "inverso" de "X%10" seria "(X+10) %10". A princípio vai resolver o problema. :thumbsup:

 

Então, como o vídeo sugere, uma função só pode ter uma inversa se ela for "bijetora".
conjunto_do_problema.jpg

obs.: nesse exemplo o contra-domínio é igual a imagem.

 

Como vemos na imagem, ela é tanto injetora, tanto sobrejetora. Logo é bijetora.

 

Utilizando a função inversa, chegaríamos algo como:

 

conjunto_do_problema2.jpg

 

Ou seja, C = A

 

 

Mas...

17 horas atrás, Mauro Britivaldo disse:

Não consigo pensar mais em nada.:(

Nesse momento a "responsabilidade" do problema ainda estaria com @Leoveira. Por isso deixei para ele encontrar, caso não conseguisse, aí sim tentávamos ajudar :D. ("ajudar ele encontrar uma resposta"). Deixa ele se virar um pouco, rs.

 

@Leoveira, tente ai ajustar o seu código com essa nova fórmula e testar. Depois, ajuste para usar as funções como sugerido no enunciado.

 

 

No aguardo.

 

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP
8 horas atrás, Mauro Britivaldo disse:

Segunda parte não diz que teve ser a inversa da primeira, mais sim uma que decifre, então tá valendo qualquer solução. 

Perfeito... qualquer coisa que entregue o resultado já estaria valendo...

 

No resumir o

22 horas atrás, Mauro Britivaldo disse:

refaz %10

resume tudo.

  • Curtir 1
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...