Dúvida com uma multiplicação

8 respostas
F

Nem sei se o nome do tópico está bom, mas… Estou estudando a partir de códigos prontos e queria saber quem é converteOct. À variável r está sendo atribuído n mod 8 +10 multiplicado com quem?

Seria a mesma coisa de eu dizer(se o n valer por exemplo, 7)
r = n % 8 + 10 * (7/8 )?

static int converteOct(int n){ int r; if (n/8 == 0){ r = n % 8; }else{ r = n % 8 + 10 * converteOct(n/8); } return r;

8 Respostas

F

Então

Esse método passa um numero n para a base octal… funcao semelhante a existente na calculadora cientifica do windows…

r é a varivavel que vai acumular o resultado… e n o numero que voce deseja converter(passado como parametro)…

ficaria

r =7 % 8 + 10 * (7/8 )

resto da divisao de 7 por 8 + 10 * ( 7 / 8 );

ddmizu

Isso é uma função que converte um número decimal num octal. É uma função recursiva.

Pro caso do número 7 o IF vai dar verdadeiro e por consequência r receberá n mod 8, ou seja 7. O que quer dizer que o número octal 7 equivale ao decimal 7.

Agora, pro caso do número 12, por exemplo, o programa ia entrar no else e entao

r = n % 8 + 10 * converteOct(n/8 )

r = 12 % 8 + 10 * converteOct(12/8 ) //atribuindo as variáveis

r = 4 + 10 * converteOct(1) //converte(1) entra no IF e o resultado é 1.

r = 4 + 10

r = 14

Essas funções recursivas costumam ser um pouco confusas, mas fui claro?

F

Não entendi.

Eu quis dizer assim…

r = n % 8 + 10 * converteOct(n/8);

“r” recebe n(que é o valor de entrada) mod 8 + 10 multiplicado por converteOct. Acontece que converteOct é o nome da função. O que significa isso em termos mais… digamos, mais fáceis de compreender?
Como um inteiro( r) pode receber string?

Não sei se estou fazendo vcs entenderem a dúvida. De qualquer forma, eu não sei o que esse converteOct está fazendo aí.

ddmizu

Em termos mais simples quer dizer que a função chama ela msma!

Rpz… É q o negócio é confuso msmo. converteOct(int) retorna um numero e esse número ele usa na conta.

F

Seria legal, você utilizar um livro sobre Algoritmos… ajuda bastante no começo e vem com vários exemplos

F

Eu já li alguns livros de algoritmos.

import java.util.*;
class Repr{
	public static void main (String args []){
		Scanner leitura = new Scanner(System.in);
		int n, p;
		do{
			System.out.print("Digite um valor positivo:  "); 
         //primeiro ele pergunta ao usuário


			 n = leitura.nextInt(); 
		}while (n <=0);  
		  
		System.out.println(n + " em representacao decimal é ");
		System.out.println(converteOct(n) + " em representacao octal ");
	}


		static int converteOct(int n){   
    		int r;   
    			if (n/8 == 0){   

/*se o n° digitado for 6, 6/8 não dá zero, então vai pro else.*/

        			r = n % 8;   


    			}else{   
        		r = n % 8 + 10 * converteOct(n/8);   
   // 0,75*10+8 % n=0,5.  

  // R vale 0,5. Está certo?
    			}   
    			
			return r;   
         //r retorna 0,5 pra onde?
F

Alguém pode me dizer?

clayton.d3

Comentei no código. Não sei se ficou claro, mas isso se chama recursividade. Dá uma lida sobre o assunto.

import java.util.*;
class Repr{
	public static void main (String args []){
		Scanner leitura = new Scanner(System.in);
		int n, p;
		do{
			System.out.print("Digite um valor positivo:  "); 
         //primeiro ele pergunta ao usuário


			 n = leitura.nextInt(); 
		}while (n <=0);  
		  
		System.out.println(n + " em representacao decimal é ");
		System.out.println(converteOct(n) + " em representacao octal ");
	}


		static int converteOct(int n){   
    		int r;   
    			if (n/8 == 0){   

/*se o n° digitado for 6, 6/8 não dá zero, então vai pro else.*/
/* 6/8 dá 0 sim, Este operador retorna o resultado inteiro, sem a parte decimal. E o operador % retorna o resto. */

        			r = n % 8;   
// então r recebe 6 e ele vai retornar 6 pro usuário


    			}else{   
        		r = n % 8 + 10 * converteOct(n/8);   
   // 0,75*10+8 % n=0,5.  

/* Supondo que o usuário digitou 10, por exemplo, ele entra neste else. Então r recebe o resto da divisão de 10 por 8 (2) + 10 * o resultado deste mesmo método, só que passando a parte inteira da divisão de 10 por 8 (1), que vai entrar no if e retornar 1. Então r = 2 + 10*1, que dá 12. */

  // R vale 0,5. Está certo?
// como disse em cima, errado, dá 12.
    			}   
    			
			return r;   
         //r retorna 0,5 pra onde?

/* no meu exemplo usando 10, a primeira chamada fica esperando o retorno de uma nova chamada. Esta nova chamada retorna para a primeira chamada, que retorna para o usuário. */
Criado 5 de dezembro de 2007
Ultima resposta 6 de dez. de 2007
Respostas 8
Participantes 4