Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Carcleo

Lógica (Exercício da faculdade)

Recommended Posts

Pessoal, estou precisando de Ajuda com uma Lógica em um exercício da faculdade.


O professor (a distancia) pediu o seguinte:


Considere que sua empresa seja contratada por uma outra companhia para resolver o problema de projeto de redes a 2-caminhos.


Este problema consiste em realizar ligações de vários pares de dispositivos eletrônicos usando OU uma ligação direta OU um outro dispositivo eletrônico entre este par, MINIMIZANDO o custo total destas ligações.


Uma maneira de resolver este problema é, a partir de cada par de dispositivos, descobrir qual é a ligação mais barata possível. Neste momento, o custo das ligações que já fazem parte da solução passam a ser zero, indicando que esta

ligação pode ser usada para ligar mais de um par de dispositivos.


Seu programa deve receber, como parâmetro de entrada, um arquivo contendo as ligações possíveis e os custos associados a essas ligações, e um outro arquivo de entrada indicando os pares que devem ser ligados OBRIGATORIAMENTE.


Seu programa deve retornar um arquivo contendo as ligações usadas e o custo da solução.


Um EXEMPLO dos arquivos de entrada neste formato seriam


//ARQUIVO DE LIGAÇÕES POSSÍVEIS

4 //NÚMERO DE DISPOSITIVOS

1 2 3 //O DISPOSITIVO 1 LIGA-SE AO DISPOSITIVO 2 COM CUSTO 3

1 3 1

1 4 2

2 3 1

2 4 3

3 4 3


//ARQUIVOS DE LIGAÇÕES QUE DEVEM SER FEITAS PELO SEU SOFTWARE

2 //NÚMERO DE LIGAÇÕES OBRIGATÓRIAS

1 2 //SEU SOFTWARE DEVE LIGAR O DIPOSITIVO 1 AO 2

3 4


Logo após a leitura, a solução deve ser calculada e gravada no arquivo resp.txt.


Para o exemplo acima, o arquivo de resposta seria composto das ligações {1-3, 2-3, 1-4} com custo 4.

Neste caso, a ligação 1-3 foi usada duas vezes.

Por questões de desempenho, seu programa deve ler os arquivos de entrada SOMENTE uma vez.


Preciso de orientações e desde já agradeço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

A ideia inicial aqui é popular um array de inteiros e dar ele como return de uma função.

Mas toda vez que tento fazer função, o compilador pede static void main.
import java.io.BufferedReader; 
import java.io.FileReader; 
import java.io.IOException; 
import java.util.Scanner; 
 
public class LerArquivo3
{ 
  public static void main(String[] args) 
  { 
    try 
    { 
      FileReader arq = new FileReader("arquivoPossiveis.txt"); 
      BufferedReader lerArq = new BufferedReader(arq); 
      String linha = lerArq.readLine(); 
      int[6][3] arrayPossiveis;
 int conta = 0;
 
      // lê a primeira linha 
      // a variável "linha" recebe o valor "null" quando o processo 
      // de repetição atingir o final do arquivo texto 
 
      while (linha != null) 
      { 
         //System.out.printf("%s\n", linha); 
         linha = lerArq.readLine(); 
         for (int i=0; i<linha.length(); i++)
{
   //System.out.print(linha.charAt(i));
arrayPossiveis[conta][0] = Integer.valueOf(linha.charAt(0));
arrayPossiveis[conta][1] = Integer.valueOf(linha.charAt(2));
arrayPossiveis[conta][2] = Integer.valueOf(linha.charAt(4));
}
conta++;
//System.out.println();
         // lê da segunda até a última linha 
      } 
 
      arq.close(); 
    } catch (IOException e) 
    { 
      System.err.printf("Erro na abertura do arquivo: %s.\n", e.getMessage()); 
    } 
   System.out.println(); 
  } 
}
Aonde estou errando?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Basta usar static no seu método também. Ou então criar uma nova classe com o método nela, assim você pode criar uma instância dentro do main e chamar o método que criou. Posta o código com o método que tentou usar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pois é, acho que estou é meio desorientado e preciso estudar mais.

 

Esse ai é o arquivo todo.

 

Apenas troque o static void por um método que retorna String

 

Erro:

 

C:\java\ad2>javac LerArquivo4.java
LerArquivo4.java:44: error: incompatible types: int[][] cannot be converted to S
tring[]
          return arrayPossiveis;
                 ^
1 error
 
C:\java\ad2>

Compartilhar este post


Link para o post
Compartilhar em outros sites

O problema não é o static. Acontece que você está tentando retornar um array bidimensional de um método que deve retornar uma String. Em qual parte do seu código você retornou?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendi.
Agora esta assim:

Criei 5 arquivos:


arquivoPossiveis.txt // com os numeros possiveis
arquivoObrigatorios.txt // com os numeros Obrigatorios

LerArquivoPossivel.java retornando um array multidimensional de int[6][3]
LerArquivoObrigatorio.java retornando um array multidimensional de int[2][2]

Principal.java. Com a saída principal

Uma coisa queria ver contigo: Deve ter uma forma de popular os dois arquivos ao mesmo tempo em java e ter um array multidimensional dinâmica.


arquivoPossiveis.txt // com os numeros possiveis

1 2 3
1 3 1
1 4 2
2 3 1
2 4 3
3 4 3
arquivoObrigatorios.txt // com os numeros Obrigatorios
1 2
3 4
LerArquivoPossivel.java retornando um array multidimensional de int[6][3]
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class LerArquivoPossivel
{
public static void main (String[] args)
{

}
int [][] getArray (String arquivo)
{
    return constroiArrayPossivel(arquivo);
}

int [][] constroiArrayPossivel(String arquivo)
{
    int [][] arrayImPossiveis = new int [0][0];
    try{
      FileReader arq = new FileReader(arquivo);
      BufferedReader lerArq = new BufferedReader(arq);
      String linha = lerArq.readLine();
      int[][] arrayPossiveis = new int[6][3];
int conta = 0;

      // lê a primeira linha
      // a variável "linha" recebe o valor "null" quando o processo
      // de repetição atingir o final do arquivo texto
      while (linha != null)
      {
         for (int i=0; i<linha.length(); i++)
{
arrayPossiveis[conta][0] = Character.getNumericValue(linha.charAt(0));
arrayPossiveis[conta][1] = Character.getNumericValue(linha.charAt(2));
arrayPossiveis[conta][2] = Character.getNumericValue(linha.charAt(4));
}
conta++;
linha = lerArq.readLine();
         // lê da segunda até a última linha
      }
      arq.close();
return arrayPossiveis;
} catch (IOException e)
    {
      System.err.printf("Erro na abertura do arquivo: %s.\n", e.getMessage());
return arrayImPossiveis;
    }  
   }
}
LerArquivoObrigatorio.java retornando um array multidimensional de int[2][2]
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class LerArquivoObrigatorio
{
public static void main (String[] args)
{

}
int [][] getArray (String arquivo)
{
    return constroiArrayObrigatorio(arquivo);
}

int [][] constroiArrayObrigatorio(String arquivo)
{
    int [][] arrayImObrigatorios = new int [0][0];
    try{
      FileReader arq = new FileReader(arquivo);
      BufferedReader lerArq = new BufferedReader(arq);
      String linha = lerArq.readLine();
      int[][] arrayObrigatorios = new int[2][2];
int conta = 0;

      // lê a primeira linha
      // a variável "linha" recebe o valor "null" quando o processo
      // de repetição atingir o final do arquivo texto
      while (linha != null)
      {
         for (int i=0; i<linha.length(); i++)
{
arrayObrigatorios[conta][0] = Character.getNumericValue(linha.charAt(0));
arrayObrigatorios[conta][1] = Character.getNumericValue(linha.charAt(2));
}
conta++;
linha = lerArq.readLine();
         // lê da segunda até a última linha
      }
      arq.close();
return arrayObrigatorios;
} catch (IOException e)
    {
      System.err.printf("Erro na abertura do arquivo: %s.\n", e.getMessage());
return arrayImObrigatorios;
    }  
   }
}
Principal.java. Com a saída principal

public class Principal
{
  public static void main (String[] args)
  {
    LerArquivoPossivel arquivoPossiveis = new LerArquivoPossivel();
int[][] arrayPossiveis = new int[6][3];
arrayPossiveis = arquivoPossiveis.getArray("arquivoPossiveis.txt");

    LerArquivoObrigatorio arquivoObrigatorios = new LerArquivoObrigatorio();
int[][] arrayObrigatorios = new int[2][2];
arrayObrigatorios = arquivoObrigatorios.getArray("arquivoObrigatorios.txt");
  }
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Reduzindo o tamanho da dúvida:

 

import java.io.BufferedReader; 
import java.io.FileReader; 
import java.io.IOException; 
import java.util.ArrayList;
 
public class Principal
{
 
 public static void main (String[] args)
 {
      String arquivo = "arquivoPossiveis.txt";
      FileReader arq = new FileReader(arquivo); 
.......

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ok.

 

Por último.

 

Porque é que na linh 63 não imprime nada. Compilador não dá erro e roda normalmente?

 

import java.io.BufferedReader; 
import java.io.FileReader; 
import java.io.IOException; 
import java.util.ArrayList;
 
public class Principal
{ 
 
    public static void main (String[] args)
    {
try{
      String arquivo = "arquivoPossiveis.txt";
      FileReader arq = new FileReader(arquivo); 
      BufferedReader lerArq = new BufferedReader(arq); 
      String linha = lerArq.readLine(); 
 int contaLinha = 0;
 int contaColuna = 0;
 int conta = 0;
      // lê a primeira linha 
      // a variável "linha" recebe o valor "null" quando o processo 
      // de repetição atingir o final do arquivo texto
      while (linha != null) 
      { 
    contaColuna = 0;
         for (int i=0; i<linha.length(); i++)
{
   contaColuna++;
}
contaLinha++;
linha = lerArq.readLine(); 
         // lê da segunda até a última linha 
      } 
 
 ArrayList<Ligacoes> LigacaoObrigatoria = new ArrayList<Ligacoes>();  
 ArrayList<Ligacoes> LigacaoPossivel = new ArrayList<Ligacoes>();  
    
      int[][] arrayRetorno = new int[contaLinha][contaColuna];
 
      while (linha != null) 
      { 
         for (int i=0; i<linha.length(); i++)
{
  if(contaColuna==3)
  {
     int pontoA = Character.getNumericValue(linha.charAt(0));
     int pontoB = Character.getNumericValue(linha.charAt(2));
         LigacaoObrigatoria.add(new Ligacoes(pontoA,pontoB));  
  }
  if(contaColuna==5)
  {
     int pontoA = Character.getNumericValue(linha.charAt(0));
     int pontoB = Character.getNumericValue(linha.charAt(2));
     int distancia = Character.getNumericValue(linha.charAt(4));
         LigacaoPossivel.add(new Ligacoes(pontoA,pontoB));  
         new Ligacoes(pontoA,pontoB).informaDistancia(distancia); 
  }
}
conta++;
linha = lerArq.readLine(); 
         // lê da segunda até a última linha 
      } 
      arq.close(); 
 
 for (int i = 0; i < LigacaoObrigatoria.size(); i++) 
 { 
        int s = LigacaoObrigatoria.get(i).getPontoA(); 
        System.out.println(s); 
 }
 
} catch (IOException e) 
    { 
      System.err.printf("Erro na abertura do arquivo: %s.\n", e.getMessage());     
}   
 
  }
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vou postar as 3 classes

Distancias.java

public class Distancias extends Ligacoes
{
  private int distancia;

  Distancias(int a, int b)
  {
super (a,b);  
  }

  public void setDistancia(int c)
  {
    this.distancia = c;
  }

  public int getDistancia ()
  {
    return this.distancia;
  }

}
Ligacoes.java
public class Ligacoes
{
  private int pA, pB;
  private Distancias distancia;

  Ligacoes (int a, int b)
  {
    this.pA = a;
    this.pB = a;
  }

  public void informaDistancia (int _distancia)
  {
     distancia = new Distancias (this.pA, this.pB);
     distancia.setDistancia(_distancia);
//System.out.println(distancia.getDistancia());
  }

  public int getPontoA ()
  {
    return this.pA;
  }

  public int getPontoB ()
  {
    return this.pB;
  }  

  public int getDistanciaAB ()
  {
    return this.distancia.getDistancia();
  }  
}
Principal.java
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;

public class Principal
{
    public static void main (String[] args)
    {
try{
      String arquivo = "arquivoPossiveis.txt";
      FileReader arq = new FileReader(arquivo);
      BufferedReader lerArq = new BufferedReader(arq);  
      String linha = lerArq.readLine();  
ArrayList<Ligacoes> LigacaoObrigatoria = new ArrayList<Ligacoes>();  
ArrayList<Ligacoes> LigacaoPossivel = new ArrayList<Ligacoes>();  
boolean possivel;

      // lê a primeira linha
      // a variável "linha" recebe o valor "null" quando o processo de repetição atingir o final do arquivo texto

int pontoA, pontoB, distancia, contaColuna;

      while (linha != null)
      {
   contaColuna = linha.length();

pontoA = Character.getNumericValue(linha.charAt(0));
pontoB = Character.getNumericValue(linha.charAt(2));

if(contaColuna>=5)
{
  distancia = Character.getNumericValue(linha.charAt(4));  
      LigacaoPossivel.add(new Ligacoes(pontoA,pontoB));  
      new Ligacoes(pontoA,pontoB).informaDistancia(distancia);
}
else
{
      LigacaoObrigatoria.add(new Ligacoes(pontoA,pontoB));  
}

linha = lerArq.readLine();
        // lê da segunda até a última linha
      }

arq.close();

for (int i = 0; i < LigacaoPossivel.size(); i++)
{
        int s = LigacaoPossivel.get(i).getDistanciaAB();
        System.out.println(s);
}

} catch (IOException e)
    {
      System.err.printf("Erro na abertura do arquivo: %s.\n", e.getMessage());    
}
  }
}
Compila normal.

Mas dá erro de execução:
C:\java\2>java Principal
Exception in thread "main" java.lang.NullPointerException
        at Ligacoes.getDistanciaAB(Ligacoes.java:31)
        at Principal.main(Principal.java:50)

C:\java\2>

 

Ou seja: Como faço para, à partir da classe Principal, pegar o valor da variável distancia que esta na classe Distancias que estende a classe Ligações?

Compartilhar este post


Link para o post
Compartilhar em outros sites

você esta a criar matriz 6 por 3 e 2 por 2 para os arquivos Possiveis e Obrigatório ? Já pensou em outra solução com ponteiros ? Se o arquivo tiver que ser alterado passar pra 3 por 7 ou 2 por 3 por exemplo...

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.