Ir ao conteúdo

Posts recomendados

Postado

aí pessoal, tenho de desenvolver um pequeno programa em C++ a respeito da Cifra de César. No Programa tem de haver um deslocamento após cada elemento.

a b c d e f g h i j k l m n o p q r s t u v x w y z

de a para b deslocar +1

b para c deslocar +2

c para d deslocar +3 e assim por diante até a última letra (z deslocando +26)

 

Primeiramente:

Eu só consegui até o momento fazer código normal mostrando somente o deslocamento de uma cifra. Assim como na Cifra de César, o exemplo 'abcdefghijklmnopqrstuvxwyz' ficaria 'bcdefghijklmnopqrstuvxwyz{'. O_o por que a chave aparece aqui? Depois de terminar o 'z' eu desejaria que o alfabeto retorna-se até completar o ciclo de +26 ...mas como ainda estou vendo como desenvolver isso...alguma dica?

Segundo:

Para gerar esse deslocamento +1, +2, +3...qual o caminho a seguir? Já tentei fazer mudança no contador e no deslocamento mas não acertei...

Terceiro:

Outra coisa: seria melhor utilizar ASCII para desenvolver o código ou assim dá para fazer?

 

*Já existe um tópico com o mesmo tema, mas não consegui sanar minha dúvida.

 

Obrigado!!!

 

Código:

 

#include <iostream>

using namespace std;

//PROTOTIPO
void cesar(string);

void cesar(string cadeia)
{
    int comprimento, deslocamento;

    
    comprimento = cadeia.length(); //length() dá o verdadeiro comprimento da string

    cout << "Cifra de Cesar" << endl;

    

    cout << "De o valor do deslocamento: ";
    cin >> deslocamento;


    
    for(int contador = 0; contador < comprimento; contador++) //O Index de uma string sempre começa com 0
        

        cout << static_cast<char>(cadeia[contador] + deslocamento);

    cout << endl << endl;
}

int main()
{
    string entrada;


    cout << "Digite a cadeia de caracteres (sem espacos): ";

    cin >> entrada;


    cout << "A cadeia de caracteres nativa e: " << entrada << endl << endl;

    cesar(entrada);

    return 0;
}

 

Postado

Outra forma de pensar no programa simples para a Cifra seria assim:

 

#include <iostream>
#include <string>

using namespace std;

int main()

{

	string entrada;
	int count = 0, comprimento;

	cout << "Digite sua cadeia de caracteres ou frase: \n";
	getline (cin, entrada);

	comprimento = (int)entrada.length();

	for(count = 0; count < comprimento; count++)
{
	if (isalpha(entrada[count]))
	{
	    entrada[count] = tolower(entrada[count]);
		for(int i = 0; i < 13; i++)
	{
		if(entrada[count] == 'z')
		entrada[count] = 'a';
		else
			entrada[count]++;
            }

        }
    }

cout << "Resultado: \n" << entrada << endl;
}

Ainda estou enrolado procurando entender como aumentar a cada letra +1 +2 +3...Assim que tiver resposta posto aqui completo...

Postado
27 minutos atrás, santos container disse:

Ainda estou enrolado procurando entender como aumentar a cada letra +1 +2 +3...Assim que tiver resposta posto aqui completo...

E qual é a dificuldade exatamente?

Postado

@Mauro BritivaldoOi, não busco a resposta, estou primeiramente tentando inserir no código o resultado do por quê, se é que você me entende hehe...Esse curso me mata por quê já começou do 8 aos invés do ZERO. Vou ter de estudar lógica e algorítmo haha fiz isso há cerca de 8 anos atrás...

adicionado 9 minutos depois

@Mauro BritivaldoAh outra coisa, meu professor "quer tipo obrigar" sempre a fazer o protótipo de uma função. Mas no caso desse programinha acima, no primeiro eu fiz...no segundo eu fiz sem...Se caso eu tivesse de enviar o primeiro programa o professor avaliaria como correto. Se eu enviasse o segundo ele avaliaria como incorreto por quê ele "quer" o protótipo. Por quê isso? Questão de gosto? Eu sinceramente acho que o que importa é ter o resultado que seria o programa funcionando não?

Postado

Não é questão de gosto, estrategia para resolução de problemas por medidas lógicas, e organizada.

Algumas tarefas são na verdade conjuntos de tarefas menores e as funções nos permite de maneira

muita mais sistemática encontrar a solução, através de reutilização de código, otimização e atualização

 

Um massa enorme de código indivisível é estática, ou seja, só serve para aquela tarefa e não permite

melhorias, e se tal necessidade surgir haverá muitas dificuldades para se obter resultados.

 

"Dividir para Conquistar"(Lê Prince del Maquiavel); Assim como na guerra política há também na programação

um tarefa pare ser realizada necessita de outras tarefas menores. Isto torna a programação mais limpa e dinâmica,

e evitará muitos erros lógicos se abrir a cabeça para o uso de funções e da programação prototificada.

Postado
Citação

Ainda estou enrolado procurando entender como aumentar a cada letra +1 +2 +3...Assim que tiver resposta posto aqui completo...

pra fazer com que entrada[count] desloque mais de 1 número é so fazer:

entrada[count] += numero;
// ex: entrada[count] += 10 -> entrada = A(65) + numero(10) = K(75)

 

Postado

@Gustavo AndrettoNão deu certo. O que eu quero dizer é que quando a gente dê uma chave de deslocamento, esse deslocamento tem de ser consecutivo. Por exemplo, segundo o alfabeto teria de ser assim:

o a desloca +1

o b desloca +2

o c desloca +3 e assim por diante.

Se você digitar 'carro' o resultado tem de ser: dcuvt

Esse tipo de resultado não sai na tela.

Postado
1 hora atrás, santos container disse:

@Gustavo AndrettoNão deu certo. O que eu quero dizer é que quando a gente dê uma chave de deslocamento, esse deslocamento tem de ser consecutivo. Por exemplo, segundo o alfabeto teria de ser assim:

o a desloca +1

o b desloca +2

o c desloca +3 e assim por diante.

Se você digitar 'carro' o resultado tem de ser: dcuvt

Esse tipo de resultado não sai na tela.

@santos container você quer que o deslocamento seja variável de acordo com o comprimento da string?

 

#include <iostream>
#include <string>

using namespace std;

int main()

{
	string entrada;
	int count = 0, comprimento;

	cout << "Digite sua cadeia de caracteres ou frase: \n";
	getline(cin, entrada);

	comprimento = (int)entrada.length();

	for (count = 0; count < comprimento; count++)
	{
		if (isalpha(entrada[count]))
		{
			entrada[count] = tolower(entrada[count]);
			for (int i = 0; i < 13; i++)
			{
				/*
				if(entrada[count] == 'z')
					entrada[count] = 'a';
				else
					entrada[count]++;
				*/
				entrada[count] += (count + 1);

				if ((int)entrada[count] > (int)'z')
					entrada[count] -= 26;
			}
		}
	}

	cout << "Resultado: \n" << entrada << endl;
}

 

Postado

@Gustavo AndrettoNa verdade eu não sei como definir essa chave O_o. Dessa forma que você me mostrou já tinha testado antes. Vou tentar mais umas vezes para ver se sai o final hehe mas muito obrigado!!!

adicionado 43 minutos depois

@Gustavo AndrettoAh, eu fiz uma pequena mudança e foi nesse trecho:

 

entrada[count] += (count + 1);

para:

 

entrada[count] += (count++);

Dá para ver que com essa mudança o código funciona e faz o que quero mas há algum vício que preciso corrigir: não importa qual seja a cadeia que eu insira as duas primeiras letras não sofrem deslocamento haha mas o restante sim.

Outro problema que ocorre é que se eu digitar o alfabeto completamente: abcdefghijklmnopqrstuvwxyz então o resultado vem abdfhjlnprtvxzbdÇéäåêèììÉÆ hahaha

  • 3 semanas depois...
Postado

Aqui, acredito que seja isto o que você quer fazer:

#include <iostream>
#include <string>

using namespace std;

int main()
{
    string entrada;
    int count = 0, comprimento, totaldeslocado;

    cout << "Digite sua cadeia de caracteres ou frase: \n";
    getline(cin, entrada);

    comprimento = (int)entrada.length();

    for (count = 0; count < comprimento; count++)
    {
        if (isalpha(entrada[count]))
        {
            entrada[count] = tolower(entrada[count]);
			
            /*Abaixo fiz a soma numa variavel int pois char só tem 8 bits 
            então só contaria até 255, o que causaria problemas quando a string
            for muito longa, e count começa a crescer tal que a soma resulta em
            mais que 255, como num texto ao invés de uma frase ou palavra.*/
            totaldeslocado = (int)entrada[count] + count + 1; 

            if (totaldeslocado > (int)'z')
                /*Subtrai o total deslocado de 'a', pega o resto da divisão 
                inteira do resultado por 26, converte o resto p/ char, e soma a 
                'a' para obter o caractere deslocado.*/
                entrada[count] = 'a' + (char)((totaldeslocado - (int)'a') % 26);
            else
                entrada[count] = (char)totaldeslocado;
        }
    }

    cout << "Resultado: \n" << entrada << endl;
}

 

Visitante
Este tópico está impedido de receber novas respostas.

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