Dúvidas Exercício Lógica

17 respostas
S

Exercício:

Quero deixar bem claro que não quero a resposta pronta, quero discutir as idéias para ir melhorando meus conhecimentos no java.E ir aprendendo.

Eu já fiz isso:Para receber o valor.

import java.util.Scanner;

public class Main {
	public static void main(String[] args) 
	{
		int mensagem;
		
		//inicializa Scanner
		Scanner input = new Scanner(System.in);
		
		//prompt
		System.out.print("Mensagem: ");
		mensagem = input.nextInt();
		
		//verifica se a mensagem tem quatro digitos
		while (mensagem != 4) //!= 4 digitos e não o valor 4
		{
			//prompt
			System.out.print("A mensagem precisa ter quatro digitos:\n");
			System.out.print("Digite novamente a mensagem: ");
			mensagem = input.nextInt();
		}//fim do while
		
	}//fim do método

}//fim da classe

Vamos devagar então ai vai minhas primeirar duvidas:

Queria saber como contar o numero de digitos que tem no inteiro.
Para se o número for diferente de 4 digitos inserir outro numero.
Com string tinha feito assim: mensagem.length(), mas com int não achei.

E também ali como faço para separar o 4 digitos para efetuar as operações separadamente?
No php sabia que tinha explode para isso, mas no java não achei algo semelhante.

Ou seria mais facil trata-los como string dai poderia usar o mensagem.length() e usar um charAt()?

Obrigado a todos que queiram colaborar e espero conseguir resolver esse exercício.

17 Respostas

A

Já que o exercício pede que você receba um inteiro mas não exige que o tratamento da criptografia seja feito nessa tipagem, eu acho que facilitaria se você convertesse para String… podendo acessar os métodos que você mesmo já citou…

Não sei se é a maneira mais correta mas eu faria assim…

No final, pede-se pra imprimir o inteiro criptografado… aí você converte novamente…

Lembro que, tratando-se de exercícios de faculdade, sempre é interessante perguntar ao professor antes se pode fazer assim ou assado… pra não tomar um susto na hora da nota…

Interessante o exercício… faz o cara pensar um pouquinho… é de onde :?: :?:

spycall

para contar o numero de digito vc pode vazer assim

int nDigito = Integer.toString(1234).length();
F
um ideia cara é pegar os 4 digitos tipo 3456,e trabalhar com divisao inteira e por resto.

vc  faz  3456 /10=345 seguido de 3456 % 10=6 logo os resto vc vai pegando e acrescentando o 7.

O laçao inicial dever ser feito até a divisao inteira não dar zero,assim passa por todos os restos!!para o 10 usa uma variável a vai amentando a cada iteracão! na primeira

int x=10;

laco(){

3456/x;

x*=10;

}
os resultados vc poderia colocar em uma string e ir costruindo o numero criptografado
espero ter te dado uma ideia!!

S

AdrianoPalm:
Já que o exercício pede que você receba um inteiro mas não exige que o tratamento da criptografia seja feito nessa tipagem, eu acho que facilitaria se você convertesse para String… podendo acessar os métodos que você mesmo já citou…

Não sei se é a maneira mais correta mas eu faria assim…

No final, pede-se pra imprimir o inteiro criptografado… aí você converte novamente…

Lembro que, tratando-se de exercícios de faculdade, sempre é interessante perguntar ao professor antes se pode fazer assim ou assado… pra não tomar um susto na hora da nota…

Interessante o exercício… faz o cara pensar um pouquinho… é de onde :?: :?:

Ok.Mas ali minha a variável mensagem, eu poderia colocar como string ou deixar com int?
Os métodos que citei o .length já estava funcionando mas depois vi dos inteiros e pensei que tinha que trata-los como inteiro.
E o charAt eu vi que era usado.Buscando na internet, mas nunca usei.Se tiver algum exemplo vai ser bom, senão dou uma procurada agora estou sem tempo, amanhã pela vou testar as alterações e posto como ta ficando.

O exercício não é de faculdade, já que estou apenas começando o 2º ano do Ensino Médio.O livro é do Livro do Deitel capítulo 4, achei estranho um exercício bastante complexo em capítulos iniciais.Acho que foram colocados ali para fazer o cara pensar e correr atrás e isso que estou fazer :smiley:

[quote=spycall]para contar o numero de digito vc pode vazer assim

int nDigito = Integer.toString(1234).length();

Valeu é uma maneira quando eu precisar, mas vou fazer como foi falado acima tratá-lo como String.Mas por curiosidade como eu faria para colocá-lo no código ao invés de ter os números pré-definidos(1234)ser o número que foi inserido?

<blockquote><div class="quote-author">fabioEM:</div>um ideia cara é pegar os 4 digitos tipo 3456,e trabalhar com divisao inteira e por resto.

vc  faz  3456 /10=345 seguido de 3456 % 10=6 logo os resto vc vai pegando e acrescentando o 7.

O laçao inicial dever ser feito até a divisao inteira não dar zero,assim passa por todos os restos!!para o 10 usa uma variável a vai amentando a cada iteracão! na primeira

int x=10;

laco(){

3456/x;

x*=10;

}
os resultados vc poderia colocar em uma string e ir costruindo o numero criptografado
espero ter te dado uma ideia!!

Não entendi muito bem, mas no exercício fala “Substitua cada digito …” acho que devo pega-los separadamente, ficando um pouco mais complicado.

rafael.lima

AdrianoPalm:
Já que o exercício pede que você receba um inteiro mas não exige que o tratamento da criptografia seja feito nessa tipagem, eu acho que facilitaria se você convertesse para String… podendo acessar os métodos que você mesmo já citou…

Não sei se é a maneira mais correta mas eu faria assim…

Também acho que facilitaria se você converter tudo para string.
Resta saber se você pode fazer isso com o seu professor…

S

rafael.lima se você ler o que eu respondi você vai ver que este exercício foi retirado no livro e não de professores.

A verificação dos caracteres funcionou como o SpyCall falou.

O código está assim:

import java.util.Scanner;

public class Main {
	public static void main(String[] args) 
	{
		int mensagem;
		
		//inicializa Scanner
		Scanner input = new Scanner(System.in);
		
		//prompt
		System.out.print("Mensagem: ");
		mensagem = input.nextInt();
			
		//verifica se a mensagem tem quatro digitos
		while (Integer.toString(mensagem).length() != 4)
		{
			//prompt
			System.out.print("A mensagem precisa ter quatro digitos:\n");
			System.out.print("Digite novamente a mensagem: ");
			mensagem = input.nextInt();
		}//fim do while
		
		char a = Integer.toString(mensagem).charAt(0);
		char b = Integer.toString(mensagem).charAt(1);
		char c = Integer.toString(mensagem).charAt(2);
		char d = Integer.toString(mensagem).charAt(3);
		
	}//fim do método

}//fim da classe

Obrigado a todos que tem ajudado.

S

Consegui separar os caracteres que são recebidos na “mensagem” só que surgiu um problema.Se eles em quatro variaveis char.Mas quando vou efetuar as operações de soma,resto,…
Ele pego os valores ASCII, por exemplo o 1 pega o valor 49.
Andei dando uma olhada na internet, mas não achei nada concreto de como fazer.
Porque o parseInt funciona so com Strings não funciona com char.

Seria mais facil eu fazer a separação em um array?Para efetuar os calculos?

F
public class Main {

  
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        Integer x=in.nextInt();
        int y=x;
        int pro=10,resto=0;
        String str="";
        while(x > 0){
          y=x;
          x/=10;
        resto=y%10;
        str+=((resto+7)%10 );
       out.println(resto);
      
        }
       out.println("resultado "+str+"   ");
        // TODO code application logic here
   }

Cara da uma olhada nesse exemplo direto da minha explicação,eu pessoalmente acho melhor resolver direto com os números mesmo.O truque besta é usar o operador resto % com o /,lembra?
exemplo 1234/10=resultado 123,o loop vai ate o resto pegar todos os numeros!!a String ajuda a concatener o resultado.
Mas veja ,esse método simples faz o que tu queria mas a String sai ao contrário.Se quiser converter é fácil :wink:

wilcorrea

Gostei do exercicio…uahuauah…divertido…

Eu fiz aqui o exercicio como estava descrito…Vc está fazendo certinho cara, seguindo passo-a-passo o que o enunciado te manda fazer…
Como vc falou que não quer a resposta vou dar umas dicas.

A primeira:
é em cima de seu ultimo post…vc pegou os quatro números como inteiro…pra destrinchá-lo vc fez um cast para string
(char a = Integer.toString(mensagem).charAt(0); ) …oras…pegue como string…
Pq com string??? porque o enunciado manda explicitamente que trabalhemos com cada dígito (Substitua cada dígito pelo resultado da adição de 7 ao digito e obtendo o resto depois da divisão do novo valor por 10.) e só sei dividir dados em subpartes com string, quem souber de outro jeito pode usá-lo tbm sem problemas ;·)

Feito isso, a segunda:
o char é um tipo dificil de lidar, ele é extremamente primitivo não fornece quase recurso nenhum…não devemos chegar até ele. No seu código ai funcionaria:

int a = Integer.toString(mensagem).charAt(0);  
         int b = Integer.toString(mensagem).charAt(1);  
         int c = Integer.toString(mensagem).charAt(2);  
         int d = Integer.toString(mensagem).charAt(3);

Mas vc msm já viu que não daria certo…( Ele pego os valores ASCII, por exemplo o 1 pega o valor 49. )
A classe String possui um método chamado .subString(indexInicio, indexFim) …acho que esse é o pulo do gato aqui neste exemplo. Teríamos algo como:

......
       String mensagem;
       .....
       mensagem = input.next();
       ......
       int a = Integer.parseInt(mensagem.substring(0, 1));  
       ....↓

Entendeu??!!

Finalmente a terceira:
Já temos então os quatro inteiros…que resultado devemos ter para 1234???
Como ficaria ele criptografado com (Substitua cada dígito pelo resultado da adição de 7 ao digito e obtendo o resto depois da divisão do novo valor por 10.)

Tenta ai e me diz…

valeu cara, até breve…

[]'s

S

wilcorrea:
Gostei do exercicio…uahuauah…divertido…

Eu fiz aqui o exercicio como estava descrito…Vc está fazendo certinho cara, seguindo passo-a-passo o que o enunciado te manda fazer…
Como vc falou que não quer a resposta vou dar umas dicas.

A primeira:
é em cima de seu ultimo post…vc pegou os quatro números como inteiro…pra destrinchá-lo vc fez um cast para string
(char a = Integer.toString(mensagem).charAt(0); ) …oras…pegue como string…
Pq com string??? porque o enunciado manda explicitamente que trabalhemos com cada dígito (Substitua cada dígito pelo resultado da adição de 7 ao digito e obtendo o resto depois da divisão do novo valor por 10.) e só sei dividir dados em subpartes com string, quem souber de outro jeito pode usá-lo tbm sem problemas ;·)

Feito isso, a segunda:
o char é um tipo dificil de lidar, ele é extremamente primitivo não fornece quase recurso nenhum…não devemos chegar até ele. No seu código ai funcionaria:

int a = Integer.toString(mensagem).charAt(0);  
         int b = Integer.toString(mensagem).charAt(1);  
         int c = Integer.toString(mensagem).charAt(2);  
         int d = Integer.toString(mensagem).charAt(3);

Mas vc msm já viu que não daria certo…( Ele pego os valores ASCII, por exemplo o 1 pega o valor 49. )
A classe String possui um método chamado .subString(indexInicio, indexFim) …acho que esse é o pulo do gato aqui neste exemplo. Teríamos algo como:

......
       String mensagem;
       .....
       mensagem = input.next();
       ......
       int a = Integer.parseInt(mensagem.substring(0, 1));  
       ....↓

Entendeu??!!

Finalmente a terceira:
Já temos então os quatro inteiros…que resultado devemos ter para 1234???
Como ficaria ele criptografado com (Substitua cada dígito pelo resultado da adição de 7 ao digito e obtendo o resto depois da divisão do novo valor por 10.)

Tenta ai e me diz…

valeu cara, até breve…

[]'s

É esse exercício faz pensar bastante.No livro do deitel tem vários exercícios como esse.Se quiser te passo alguns.

Beleza deu certo só que ali tava falando que os dados são transmitidos como inteiros de 4 digitos.
E assim ele seriam transmitidos por String…Vou tentar fazer o resto recebendo como String depois vou tentar como inteiro.

Valeu a ajuda.

Editado:

Eu não entendi quais operações devo fazer aqui.
Substitua cada dígito pelo resultado da adição de 7 ao digito e obtendo o resto depois da divisão do novo valor por 10.

Porque:

((1 + 7) / 10) % 10?

ou

(1 + 7) % 10 ?

Porque no outro exercício pede para criar um programa que faça o contrario para receber os digitos certos.
Só que assim:

1 + 7 = 8
8 / 10 = 0
0 % 10 = 0 //nao seria necessario o resto

Os digitos de 1 e 2 seriam 0
Os digitos 3 a 9 seriam 1

ou

1 + 7 = 8
8 % 10 = 8 //não seria necessario o resto

Estou meio confuso

wilcorrea

Fica louco não…
Não tinha porque dar errdo não…pode ser problema de versão do Java (uso o 6)

package teste;
/**
 * Uma empresa quer transmitir dados por telefone, 
 * mas está preocupada com a possibilidade do telefone estar grampeado.
 * Ela pediu para você escrever um programa que criptografe os dados 
 * de modo que estes possam ser transmitidos mais seguramente.
 * 
 * Todos os dados são transmitidos como inteiros de quatro digitos.
 * Seu aplicativo deve ler um inteiro de quatro digitos inserido pelo usuário 
 * e criptografá-lo desta maneira: Substitua cada dígito pelo resultado da adição de 7 
 * ao digito e obtendo o resto depois da divisão do novo valor por 10.
 * Troque então o primeiro digito pelo terceiro e o segundo digito pelo quarto.
 * 
 * Então imprima o inteiro criptografado.
 * 
 */
import java.util.Scanner;

public class Main {
	public static void main(String[] args) 
	{
		String mensagem;
		
		//inicializa Scanner
		Scanner input = new Scanner(System.in);
		
		//prompt
		System.out.print("Mensagem: ");
		mensagem = input.next();
			
		//verifica se a mensagem tem quatro digitos
		while (mensagem.length() != 4)
		{
			//prompt
			System.out.print("A mensagem precisa ter quatro digitos:\n");
			System.out.print("Digite novamente a mensagem: ");
			mensagem = input.next();
		}//fim do while
		
		//pega cada posição da string
		int a = Integer.parseInt(mensagem.substring(0, 1));
		int b = Integer.parseInt(mensagem.substring(1, 2));
		int c = Integer.parseInt(mensagem.substring(2, 3));
		int d = Integer.parseInt(mensagem.substring(3, 4));
		
		//apenas confere se os dados estavam corretos 
		//(enquanto ainda eram char, rsrsrs)
		System.out.println(a);
		System.out.println(b);
		System.out.println(c);
		System.out.println(d);
		
		//faz o que o cara mandou: 
		//Substitua cada dígito pelo resultado da adição de 7 
		//ao digito e obtendo o resto depois da divisão do novo valor por 10.
		String aCriptogrfado = String.valueOf((a + 7) % 10);
		String bCriptogrfado = String.valueOf((b + 7) % 10);
		String cCriptogrfado = String.valueOf((c + 7) % 10);
		String dCriptogrfado = String.valueOf((d + 7) % 10);
		
		//Então imprima o inteiro criptografado....
		String dadoCriptografado = 
		cCriptogrfado + dCriptogrfado + aCriptogrfado + bCriptogrfado;
		
		System.out.print("Mensagem criptografada: " + dadoCriptografado);
	}//fim do método

}//fim da classe

V se funciona isso ai…

Valeu
[]'s

S

Nossa rápido eu estava editando a mensagem ali em cima tu já colocou a resposta.

wilcorrea

Hahahahahahah…
Foi malz…

uhauhauahauaaa…

Valeu

S

Ontem nem deu tempo de testar tive que sair, testei agora funcionando, só mais uma dúvida agora para descriptografar a mensagem.

Qual é a operação inversa do %?

wilcorrea

Boa pergunta…
uhuahua

Vou ver aqui como ficaria e vejo se te ajudo…

Valeu

wilcorrea

E ai, super fez progressos??
Depois de queimar um pouco a mufa descobri uma coisa…desfazer é bem menos simples que fazer…hehe

Não existe um operador inverso de %(mod). Na verdade não é possível recostruir uma divisão com o seu resto. principalmente quando o quociente dela é sempre zero…

Entretanto, dá pra pensar o seguinte…o % quando foi usado pra criptografar serviu pra q??
Oras, serviu para deixar o numero sempre com um unico digito, como se subtraíssemos dez dele…

Essa é a dica:
E se adicionassemos esses dez que foram tirados na criptografia e retirassemos os 7 que foram adicionados??
É uma idéia promissora…por aqui deu certo…
Tenta ai…

Qualquer coisa posto aqui o código
Ah, serei menos apressadinho…uhuahuahau

Valeu

[]'s

J

maxo muito codigo ai e melhor usar uma estrutura de repetiçao…fica melhor assim :twisted: …
http://phpfi.com/307067

Criado 11 de março de 2008
Ultima resposta 2 de abr. de 2008
Respostas 17
Participantes 7