Compactar Vetor

2 respostas
leobr84

Objetivo do codigo
Um vetor v1 com N valores inteiros dara origem ao v2 da seguinte maneira. O vetor v1 deve receber apenas valores 0s e 1s.

a) o 1º elemento do v2 é o numero de algarismos 0s encontrados no v1 apartir do seu inicio até o 1º valor 1 encontrado.
b) o 2º elemento do v2 é o nuumero de algarismos 1s encontrados no v1 apos o ultimo 0, até o proximo 0
c) o 3º elementodo v2 é o numero de algarismos 0s encontrados no v1 apartir do ultimo 1 encontrado ate o proximo 1.
d) repetir os passos b e c até o fim do v1.
Ex: v1[0 0 0 1 1 0 1 0 1 1 0] obtem-se v2[3 2 1 1 1 2 1]

Inicio

package Questão_02;

import javax.swing.JOptionPane;

public class Exe02 {

public static void main(String[] args) {
// Declaração dee variáveis, constantes e vetores;
    int auxV2 = 0;
    int qtdZero = 0, qtdZero2 = 0, qtdUm = 0;
    int posicao = 0;
    
    final int VETOR_LENGHT = Integer.parseInt(JOptionPane.showInputDialog(
            "Tamanho do vetor: "));
    int v1[] = new int[VETOR_LENGHT];
    int v2[] = new int[VETOR_LENGHT];
    
    // Entrada de DADOS (com numeros randomicos);
    for (int i = 0 ; i < VETOR_LENGHT ; i++) {
        v1[i] = (int) (Math.random() * 2) ;
    }
// ### Processamento de dados ###

// A) o primeiro elemento do vetor V2 é o numero de algarismos zero que o vetor v1 tem a partir

// do seu inicio até o primeiro algarismo 1;

for (int i = posicao ; i < VETOR_LENGHT ; i++) {

if (i < 1) {

if (v1[i] == 0)

qtdZero++;

}

else {

if (v1[i] == 0) {

qtdZero++;

}

if (v1[i] == 1) {

posicao = i; // Posição do primeiro UM apos o inicio do vetor;

break;

}

}

}

v2[auxV2] = qtdZero;

auxV2++;

// B) o proximo elemento do vetor v2 é o numero de algarismos 1 que o vetor v1 contem a partir do

// ultimo zero encontrado até o proximo algarismo zero;

for ( int i = 0 ; i < VETOR_LENGHT ; i++) { // Posição do ultimo zero encontrado;

if (v1[i] == 0) {

if (v1[i+1] == 1) {

posicao = i + 1; // (Posição do ultimo ZERO) + 1;

break;

}

}

}
for (int i = posicao; i < VETOR_LENGHT ; i++) {
        if (v1[i] == 1) {
            qtdUm++;
            posicao = i; // Posição do ultimo UM;
        } else {
            
            break;
        }
    }
    
    v2[auxV2] = qtdUm;
    auxV2++;
// C) o proximo elemento do vetor v2 é o numero de algarismos zero que o vetor v1 contem

// a partir do ultimo 1 encontrado, até o proximo algarismo 1;

for (int i = posicao + 1; i < VETOR_LENGHT ; i++) {

if (v1[i] == 1) {

posicao = i;

break;

}

else

qtdZero2++;

}

if (auxV2 < 10) {

v2[auxV2] = qtdZero2;

auxV2++;

}
// Saída de dados;

for (int i = 0 ; i < VETOR_LENGHT; i++) {

System.out.print(v1[i]+"\t");

}
System.out.println("\n");
    for (int i = 0; i < auxV2 ; i++) {
        System.out.print(v2[i]+"\t ");
    }
    System.out.println("posicao: "+posicao);
}

}
FIM

###MINHA DUVIDA OU PROBLEMA OU QUEBRA-CABEÇA ###
So não sei como repetir os passos B) e C) com comandos de repetição como o ‘while’. Já que os passos a) e b) estão ok. Por mais que o codigo esteja GIGANTE! :slight_smile:
Obrigado a quem deu atenção ao topico e possa abrir a minha cabeça para isso!!
Como faço para usar os passos b e c com comandos de repetição? oO

Abraço, mt PAZ

2 Respostas

danielbussade

Fala léo blz? Eu dei uma melhorada no programa, você pode continuar usando o for, mas eu refiz utilizando o while. Dá uma olhada e vê se é isso aí, qualquer dúvida posta.

import javax.swing.JOptionPane; 
	
public class Exercicio {
	public static void main(String[] args) { 

	// Declaração dee variáveis, constantes e vetores;
	int qtdZero = 0, qtdUm = 0; 
	int posicaoV2 = 0; 
	int i=0;
	
	final int VETOR_LENGHT = Integer.parseInt(JOptionPane.showInputDialog( "Tamanho do vetor: ")); 
	int v1[] = new int[VETOR_LENGHT]; 
	int v2[] = new int[VETOR_LENGHT]; 

	// Entrada de DADOS (com numeros randomicos);
	for (i = 0 ; i < VETOR_LENGHT ; i++) { 
		 v1[i] = (int) (Math.random() * 2) ; 
	}			 	
	//zera o i
	i=0;
	// Condição de término
	while(i < VETOR_LENGHT) {
		 //Executa o passo A
		while (v1[i] < 1) { //Aqui você pode usar um while ao invés do for
				  qtdZero++;
				  i++; //incrementa i
				  
				  if(i>=VETOR_LENGHT )
					  break;
				}
		v2[posicaoV2]=qtdZero;
		//Incrementa a posicao do v2
		posicaoV2++;
		qtdZero=0;
			
		if (i>= VETOR_LENGHT) 
			break;
	
		//Passo B) 
		while(v1[i]==1 ) {
				qtdUm++;
				i++;
				
				if(i>=VETOR_LENGHT  )
					  break;
			}
			
		v2[posicaoV2]=qtdUm;
		//incrementa posicaoV2
		posicaoV2++;
		qtdUm=0;
			
		if(i>=VETOR_LENGHT)
			break;
	}//fim do while
	
	//Aqui imprime o v1
	System.out.println("######V1#######\n");
	//Aqui imprime o v1
	for (int j = 0; j < v1.length; j++) {
		System.out.println("V1[" + j + "]" + "=" + v1[j]);
	}
	
	//Aqui imprime o v2
	System.out.println("######V2#######\n");
	for (int j = 0; j < v2.length; j++) {
		System.out.println("V2[" + j + "]" + "=" + v2[j]);

	}
  }		
}

Att

leobr84

Daniel,
ae irmão, beleza sim. So passando ae para dar uma resposta positiva quanto ao código melhorado. Ainda pus uma variável para que o vetor v2 não ficasse extenso demais preenchendo os indices vazios com '0'. A variável é 'int VETOR_LENGHT_v2 = 0'.

public class Exe02 {
    public static void main(String[] args) {
 
// Declaração de variáveis, constantes e vetores;  
        int qtdZero = 0, qtdUm = 0;   
        int posicaoV2 = 0;   
        int i=0;  
        final int VETOR_LENGHT = Integer.parseInt(
                JOptionPane.showInputDialog( "Tamanho do vetor: "));   
        int VETOR_LENGHT_v2 = 0; // Variável adicionada para que o vetor fique do tamanho necessario;
        int v1[] = new int[VETOR_LENGHT];   
        int v2[] = new int[VETOR_LENGHT];   
   
// Entrada de DADOS (com numeros randomicos);  
        for (i = 0 ; i < VETOR_LENGHT ; i++) {   
            v1[i] = Integer.parseInt(JOptionPane.showInputDialog("Valor:")) ;   
        }                 
        i=0;  
     
        while(i < VETOR_LENGHT) {  
        // Passo 'A' - Encontrar 0's apartir do inicio do v1 até o primeiro algarismo 1
        // e encontrar a quantidade de 0's a apartir do ultimo algarismo 1;
            while (v1[i] < 1) { 
                   qtdZero++;
                   i++;
                   
                   if (i>=VETOR_LENGHT)
                       break;
            }  
         v2[posicaoV2] = qtdZero;
         VETOR_LENGHT_v2++; // Incrementa tamanho do v2;
         posicaoV2++;  //Incrementa posição v2;
         qtdZero=0;  
               
         if (i>= VETOR_LENGHT)   
             break;  
// Passo B: Número de algarismos 1's a partir do último 0 encontrado até o próximo 0;
         while(v1[i]==1 ) {  
                 qtdUm++;  
                 i++;  
                   
                 if(i>=VETOR_LENGHT) 
                     break;  
            }  
               
         v2[posicaoV2]=qtdUm;  
         VETOR_LENGHT_v2++;         
         posicaoV2++;  
         qtdUm=0;  
               
         if(i>=VETOR_LENGHT)  
             break;  
    }//FIM DO 'WHILE';
       
// Saída de dados - v1[] e v2[];
        System.out.print("V1[] ");
        for (int j = 0; j < v1.length; j++) {  
            System.out.print(v1[j]+"\t");  
        }  
        System.out.println("\n V2[]"); 
        for (int j = 0; j < VETOR_LENGHT_v2; j++) {  
            System.out.print(v2[j]+"\t");  
        }  
   }       
}

Abraço, mt PAZ

Criado 4 de novembro de 2007
Ultima resposta 7 de nov. de 2007
Respostas 2
Participantes 2