Ir ao conteúdo

Posts recomendados

Postado

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.

Postado

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.

 

 

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

Postado

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

Postado

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
  • Membro VIP
Postado

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
Postado

@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
  • Membro VIP
Postado

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
Postado

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
Postado
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
  • Membro VIP
Postado

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
Postado
9 minutos atrás, Simon Viegas disse:

Deixa ele se virar um pouco, rs.

Tadinho está aqui já porque não consegui, e não seria sádico de ficar só dando pistas.

  • Curtir 2
  • Membro VIP
Postado
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

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!