Returning value 0 in this.return java

2

I'm trying to make a program that brings me the critical path to a list of activities reported by the user, my problem is: my code is returning 0 for the calculation of slack.

Intheaboveimageexample,theslackinvertices2and6is8,whenIputthesedatainmyprogramitshowsthatthegapis0,whatI'mfindingstrangeisthatapparentlythemethodiscorrect.>

Thecodesbelow:

ClassActivity:

/**Tochangethislicenseheader,chooseLicenseHeadersinProjectProperties.*Tochangethistemplatefile,chooseTools|Templates*andopenthetemplateintheeditor.*/packagetrabalho_m3;importjava.util.Arrays;publicclassAtividade{privateintidAtividade;privateStringnomeAtividade;privatefloattempoDuracao,tInicioCedo,tTerminoCedo,tTerminoTarde,tInicioTarde,folga;privateintqtdPredecessores,qtdSucessores;privateAtividadepredecessores[],sucessores[];privateintcnt_aux1=0,cnt_aux2=0;publicAtividade(intid,Stringnome,floatduracao,intnPre,intnSuc){this.idAtividade=id;this.nomeAtividade=nome;this.tempoDuracao=duracao;this.qtdPredecessores=nPre;this.qtdSucessores=nSuc;this.predecessores=newAtividade[this.qtdPredecessores];this.sucessores=newAtividade[this.qtdSucessores];}/**Métodoquecalculaostemposdetérminoeíniciocedodasatividades*/publicvoidcalcular_Tes_Tef(){//CálculodoTempodeInícioCedodaatividade(Tes).if(this.qtdPredecessores==0){this.tInicioCedo=0;}else{this.tInicioCedo=this.maxTefPredecessores(this.predecessores);}//CálculodoTempodeTérminoCedodaatividade(Tef).this.tTerminoCedo=(this.tInicioCedo+this.tempoDuracao);}/**Métodoquecalculaostemposdetérminoeíniciotardedasatividades*/publicvoidcalcular_Tlf_Tls(){//CálculodoTempodeTérminoTardedaatividade(Tlf).if(this.qtdSucessores==0){this.tTerminoTarde=this.tTerminoCedo;}else{this.tTerminoTarde=this.minTlsSucessores(this.sucessores);}//CálculodoTempodeInícioTardedaatividade(Tls).this.tInicioTarde=(this.tTerminoTarde-this.tempoDuracao);}/**MétodocalculaaFOLGA(R)dasatividadesdoprojeto.*/publicvoidcalcular_R(){this.folga=(this.tTerminoTarde-this.tTerminoCedo);}/**MétodoencontraovalorMÁXIMOdoTefentreospredecessores*deumaatividade.*/publicfloatmaxTefPredecessores(Atividadepredecessores[]){floatmaxTef=predecessores[0].tTerminoCedo;for(inti=1;i<predecessores.length;i++){if(maxTef<predecessores[i].tTerminoCedo){maxTef=predecessores[i].tTerminoCedo;}}returnmaxTef;}/**MétodoencontraovalorMÍNIMOdoTlsentreossucessores*deumaatividade.*/publicfloatminTlsSucessores(Atividadesucessores[]){floatminTls=sucessores[0].tInicioTarde;for(inti=1;i<sucessores.length;i++){if(sucessores[i].tInicioTarde<minTls){minTls=sucessores[i].tInicioTarde;}}returnminTls;}/**Vinculaaumadadaatividadesuasprecedencias,incluindo*seusprecedentesnoArraypredecessores[].*/publicvoidsetarAtividadePredecessora(AtividadeatividadePre){if(cnt_aux1==this.qtdPredecessores){System.out.println("A atividade " + this.nomeAtividade + " nao suporta mais pre-requisitos!");
        } else {
            this.predecessores[this.cnt_aux1] = atividadePre;
            this.cnt_aux1++;
        }
    }

    /*
    *  Vincula a uma dada atividade seus sucessores. 
    */
    public void setarAtividadeSucessora(Atividade atividadeSuc){
        if(cnt_aux2 == this.qtdSucessores){
            System.out.println("A atividade " + this.nomeAtividade + " nao suporta mais atividades sucessoras!");
        } else {
            this.sucessores[this.cnt_aux2] = atividadeSuc;
            this.cnt_aux2++;
        }
    }

    // Retorna o NOME de uma atividade.
    public String getNome(){
        return this.nomeAtividade;
    }

    // Retorna a FOLGA(R) de uma atividade.
    public float getFolga(){
        return this.folga;
    }

        public float getPredecessores(){
        return this.qtdPredecessores;
    }

        public float getId(){
        return this.idAtividade;
    }

         public float getSucessores(){
        return this.qtdSucessores;
    }

         public Atividade[] getSucessores1() {
            return sucessores;
        }

    /*
    *  Imprime todas as informações de uma atividade
    */
    public void informacoesAtividade(){
        System.out.println();
        System.out.println("Id: " + (this.idAtividade+1));
        System.out.println("Nome: " + this.nomeAtividade);

        if(this.qtdPredecessores == 0){
            System.out.println("Precedencia: --");
        } else {
            System.out.print("Precedencia: ");
            for(int i = 0; i < this.predecessores.length; i++){
                System.out.print(predecessores[i].nomeAtividade + " ");
            }
            System.out.println();
        }

        if(this.qtdSucessores == 0){
            System.out.println("Sucessores: --");
        } else {
            System.out.print("Sucessores: ");
            for(int j = 0; j < this.sucessores.length; j++){
                System.out.print(sucessores[j].nomeAtividade + " ");
            }
            System.out.println();
        }

        System.out.println();
        System.out.println("Duração: " + this.tempoDuracao);
        System.out.println("Tempo Inicial Mais Cedo: " + (this.tInicioCedo+1));
        System.out.println("Tempo Final Mais Cedo: " + this.tTerminoCedo);
        System.out.println("Tempo Inicial Mais Cedo: " + (this.tInicioTarde+1));
                System.out.println("Tempo Final Mais Tarde: " + this.tTerminoTarde);
        System.out.println("Folga: " + this.folga);
        System.out.println();
    }
}

Main:

package trabalho_m3;


import java.io.IOException;
import java.util.Scanner;
import javax.swing.JFrame;

public class TRABALHO_M3 {

   public static void Tes_Tef(Atividade[] Ativ){
        for(int i = 0; i < Ativ.length; i++){
            Ativ[i].calcular_Tes_Tef();
        }
    }



    public static void Tlf_Tls(Atividade[] Ativ){
        for(int i = (Ativ.length - 1); i >= 0; i--){
            Ativ[i].calcular_Tlf_Tls();
        }
    }

    public static void R(Atividade[] Ativ){
        for(int i = 0; i < Ativ.length; i++){
            Ativ[i].calcular_R();
        }
    }

    public static void atividadeInfo(Atividade[] Ativ){
        for(int i = 0; i < Ativ.length; i++){
            Ativ[i].informacoesAtividade();
        }
    }

    public static void caminhoCritico(Atividade[] Ativ){
        System.out.print("Caminho Critico: ");
        for(int i = 0; i < Ativ.length; i++){
            if(Ativ[i].getFolga() == 0.0){
                System.out.print(Ativ[i].getNome() + " ");
            }
        }
        System.out.println();
    }



    public static void main(String[] args) throws IOException {
       int qtd = 0;
       int aux;
       String rotulo;
       float peso;
       int predecessores, sucessores;
       Scanner s = new Scanner(System.in);
       System.out.println("Informe a quantidade de atividades: ");
       qtd = s.nextInt();
       Atividade atividades[] = new Atividade[qtd];
       for (int i = 0; i <  qtd; i++){
           System.out.println("Informe o rótulo da atividade["+(i+1)+"]: ");
           rotulo = s.next();
           System.out.println("Informe a duracao da atividade["+(i+1)+"]: ");
           peso = s.nextFloat();
           System.out.println("Informe a quantidade de predecessores da atividade["+(i+1)+"]: ");
           predecessores = s.nextInt();
           System.out.println("Informe a quantidade de sucessores da atividade["+(i+1)+"]: ");
           sucessores = s.nextInt();
           atividades[i] = new Atividade(i,rotulo,peso,predecessores,sucessores);
           System.out.println("Pressione Enter para continuar..."); 
           System.in.read();
       }

        for (int i = 0; i <  qtd; i++){
            for (int b = 0; b <  qtd; b++){
                System.out.println("Atividade "+atividades[b].getNome()+" - ID = "+(atividades[b].getId()+1));
            }
            System.out.println("Pressione Enter para continuar..."); 
            System.in.read();
            if (atividades[i].getPredecessores() > 0 ) {
                System.out.println("Atividades Predecessoras de "+atividades[i].getNome());    
                for (int k=0; k<atividades[i].getPredecessores(); k++){
                           System.out.println("Informe o ID da atividade predecessora de numero "+(k+1)+" ...");
                           aux = (s.nextInt()-1);
                           atividades[i].setarAtividadePredecessora(atividades[aux]);
                           System.out.println("Pressione Enter para continuar..."); 
                           System.in.read();
                    }   
            } else {
                    System.out.println("A atividade ["+atividades[i].getNome()+"] não possui predecessores");
                    System.out.println("Pressione Enter para continuar..."); 
                    System.in.read();
            }
            for (int b = 0; b <  qtd; b++){
                System.out.println("Atividade "+atividades[b].getNome()+" - ID = "+(atividades[b].getId()+1));
            }
            System.out.println("Pressione Enter para continuar..."); 
            System.in.read();
            if (atividades[i].getSucessores() > 0 ) {
                    System.out.println("Atividades Sucessoras de "+atividades[i].getNome());
                    for (int k=0; k<atividades[i].getSucessores(); k++){
                           System.out.println("Informe o id da atividade sucessora de numero "+(k+1)+" ...");
                           aux = (s.nextInt()-1);
                           atividades[i].setarAtividadeSucessora(atividades[aux]);
                           System.out.println("Pressione Enter para continuar..."); 
                           System.in.read();
                    }   
            } else {
                    System.out.println("A atividade ["+atividades[i].getNome()+"] não possui sucessores");
                    System.out.println("Pressione Enter para continuar..."); 
                    System.in.read();
            }
        }
    Tes_Tef(atividades);
    Tlf_Tls(atividades);    
    atividadeInfo(atividades);
    R(atividades);
    caminhoCritico(atividades);

An example of data entry (graph with 4 vertices):

Informe a quantidade de atividades: 
4
Informe o rótulo da atividade[1]: 
A
Informe a duracao da atividade[1]: 
5
Informe a quantidade de predecessores da atividade[1]: 
0
Informe a quantidade de sucessores da atividade[1]: 
2
Pressione Enter para continuar...

Informe o rótulo da atividade[2]: 
B
Informe a duracao da atividade[2]: 
6
Informe a quantidade de predecessores da atividade[2]: 
1
Informe a quantidade de sucessores da atividade[2]: 
1
Pressione Enter para continuar...

Informe o rótulo da atividade[3]: 
C
Informe a duracao da atividade[3]: 
4
Informe a quantidade de predecessores da atividade[3]: 
1
Informe a quantidade de sucessores da atividade[3]: 
1
Pressione Enter para continuar...

Informe o rótulo da atividade[4]: 
D
Informe a duracao da atividade[4]: 
4
Informe a quantidade de predecessores da atividade[4]: 
2
Informe a quantidade de sucessores da atividade[4]: 
0
Pressione Enter para continuar...

Atividade A - ID = 1.0
Atividade B - ID = 2.0
Atividade C - ID = 3.0
Atividade D - ID = 4.0
Pressione Enter para continuar...

A atividade [A] não possui predecessores
Pressione Enter para continuar...

Atividade A - ID = 1.0
Atividade B - ID = 2.0
Atividade C - ID = 3.0
Atividade D - ID = 4.0
Pressione Enter para continuar...

Atividades Sucessoras de A
Informe o id da atividade sucessora de numero 1 ...
2
Pressione Enter para continuar...

Informe o id da atividade sucessora de numero 2 ...
3
Pressione Enter para continuar...

Atividade A - ID = 1.0
Atividade B - ID = 2.0
Atividade C - ID = 3.0
Atividade D - ID = 4.0
Pressione Enter para continuar...

Atividades Predecessoras de B
Informe o ID da atividade predecessora de numero 1 ...
1
Pressione Enter para continuar...

Atividade A - ID = 1.0
Atividade B - ID = 2.0
Atividade C - ID = 3.0
Atividade D - ID = 4.0
Pressione Enter para continuar...

Atividades Sucessoras de B
Informe o id da atividade sucessora de numero 1 ...
4
Pressione Enter para continuar...

Atividade A - ID = 1.0
Atividade B - ID = 2.0
Atividade C - ID = 3.0
Atividade D - ID = 4.0
Pressione Enter para continuar...

Atividades Predecessoras de C
Informe o ID da atividade predecessora de numero 1 ...
1
Pressione Enter para continuar...

Atividade A - ID = 1.0
Atividade B - ID = 2.0
Atividade C - ID = 3.0
Atividade D - ID = 4.0
Pressione Enter para continuar...

Atividades Sucessoras de C
Informe o id da atividade sucessora de numero 1 ...
4
Pressione Enter para continuar...

Atividade A - ID = 1.0
Atividade B - ID = 2.0
Atividade C - ID = 3.0
Atividade D - ID = 4.0
Pressione Enter para continuar...

Atividades Predecessoras de D
Informe o ID da atividade predecessora de numero 1 ...
2
Pressione Enter para continuar...

Informe o ID da atividade predecessora de numero 2 ...
3
Pressione Enter para continuar...

Atividade A - ID = 1.0
Atividade B - ID = 2.0
Atividade C - ID = 3.0
Atividade D - ID = 4.0
Pressione Enter para continuar...

A atividade [D] não possui sucessores
Pressione Enter para continuar...


Id: 1
Nome: A
Precedencia: --
Sucessores: B C 

Duração: 5.0
Tempo Inicial Mais Cedo: 1.0
Tempo Final Mais Cedo: 5.0
Tempo Inicial Mais Cedo: 1.0
Tempo Final Mais Tarde: 5.0
Folga: 0.0


Id: 2
Nome: B
Precedencia: A 
Sucessores: D 

Duração: 6.0
Tempo Inicial Mais Cedo: 6.0
Tempo Final Mais Cedo: 11.0
Tempo Inicial Mais Cedo: 6.0
Tempo Final Mais Tarde: 11.0
Folga: 0.0


Id: 3
Nome: C
Precedencia: A 
Sucessores: D 

Duração: 4.0
Tempo Inicial Mais Cedo: 6.0
Tempo Final Mais Cedo: 9.0
Tempo Inicial Mais Cedo: 8.0
Tempo Final Mais Tarde: 11.0
Folga: 0.0


Id: 4
Nome: D
Precedencia: B C 
Sucessores: --

Duração: 4.0
Tempo Inicial Mais Cedo: 12.0
Tempo Final Mais Cedo: 15.0
Tempo Inicial Mais Cedo: 12.0
Tempo Final Mais Tarde: 15.0
Folga: 0.0

Caminho Critico: A B D 

In my vertex C:

Duração: 4.0
Tempo Inicial Mais Cedo: 6.0
Tempo Final Mais Cedo: 9.0
Tempo Inicial Mais Cedo: 8.0
Tempo Final Mais Tarde: 11.0
Folga: 0.0

Using the method to calculate the slack

folga = Tempo Final Mais Tarde - Tempo Final Mais Cedo

In the output it returns me 0, but the correct one would be 2.

My method for calculating slack.

public void calcular_R(){
        this.folga = (this.tTerminoTarde - this.tTerminoCedo);
    }

The methods for displaying information (output)

public static void atividadeInfo(Atividade[] Ativ){
        for(int i = 0; i < Ativ.length; i++){
            Ativ[i].informacoesAtividade();
        }
    }

public void informacoesAtividade(){
        System.out.println();
        System.out.println("Id: " + (this.idAtividade+1));
        System.out.println("Nome: " + this.nomeAtividade);

        if(this.qtdPredecessores == 0){
            System.out.println("Precedencia: --");
        } else {
            System.out.print("Precedencia: ");
            for(int i = 0; i < this.predecessores.length; i++){
                System.out.print(predecessores[i].nomeAtividade + " ");
            }
            System.out.println();
        }

        if(this.qtdSucessores == 0){
            System.out.println("Sucessores: --");
        } else {
            System.out.print("Sucessores: ");
            for(int j = 0; j < this.sucessores.length; j++){
                System.out.print(sucessores[j].nomeAtividade + " ");
            }
            System.out.println();
        }

        System.out.println();
        System.out.println("Duração: " + this.tempoDuracao);
        System.out.println("Tempo Inicial Mais Cedo: " + (this.tInicioCedo+1));
        System.out.println("Tempo Final Mais Cedo: " + this.tTerminoCedo);
        System.out.println("Tempo Inicial Mais Cedo: " + (this.tInicioTarde+1));
                System.out.println("Tempo Final Mais Tarde: " + this.tTerminoTarde);
        System.out.println("Folga: " + this.folga);
        System.out.println();
    }
    
asked by anonymous 13.07.2016 / 06:35

1 answer

0

The problem is because you are printing before calculating the slack.

Invert the order of the methods atividadeInfo and R .

Change this:

atividadeInfo(atividades);
R(atividades);

For this:

R(atividades);
atividadeInfo(atividades);

Tip: Use the debug. This type of problem is easily identified by debugging the code.

    
31.08.2016 / 02:48