Reset variable every time you switch to a method

Asked

Viewed 235 times

1

I’m making a simple program that inserts at the first possible position of a vector, a String.

This is the code I have:

import java.util.Formatter;
import java.util.Scanner;

/**
 *
 * @author AmândioMagalhães(115
 */
public class PL7_ex6 {

    private static Scanner input = new Scanner(System.in);
    private static Formatter output = new Formatter(System.out);

    public static void main(String[] args) {
        String[] visitantes = new String[100];
        int nElm = 0;
        menu(visitantes, nElm);

    }

    private static void menu(String[] vec, int nElm) {
        int op;
        output.format("bem-vindo!");
        output.format("\n\nAqui pode:");
        do {
            System.out.println("\n\n1 - Inserir um visitante"
                    + "\n2 - Listar todos os visitantes"
                    + "\n3 - Atualizar um nome dado"
                    + "\n4 - Eliminar um visitante dado"
                    + "\n5- Lisstar os nomes começados por uma dada letra"
                    + "\n6 - Listar nomes repetidos"
                    + "\n0 - para terminar o programa");
            op = input.nextInt();
            if (op < 0 || op > 6) {
                output.format("%sTem de introduzir uma opção válida!");
            }

            if (op == 0) {
                //termina
            } else {
                switch (op) {
                    case 0:

                    case 1:
                        inserirVisitante(vec, nElm);
                        System.out.println(vec[0]);
                        break;
                    case 2:
                        listarVisitantes(vec, nElm);
                        break;
                    case 3:
                        break;
                    default:
                        throw new AssertionError();
                }
            }
        } while (op > 0 || op > 6);

    }


    private static void inserirVisitante(String[] vec, int nElm) {
        int pos = 0;
        int i = 0;
        if (nElm == vec.length) {
            output.format("Não há espaço disponível :(");
        } else {
            do {
                if (i == nElm - 1) {
                    pos = i;
                }
                i++;
            } while (i >= nElm - 1);
            System.out.println("Introduza o nome do visitante");
            input.nextLine();
            vec[pos] = input.nextLine();
            vec[pos].trim();
            nElm = nElm + 1;
            //para testar
            System.out.println("\n" + nElm + "\n");
        }
    }

    //nElem não passa de inserirVisitantes para este método
    private static void listarVisitantes(String[] vec, int nElm) {
        if (nElm == 0) {
            //para testar
            System.out.println("\n" + nElm + "\n");
            output.format("Não há visitantes.");
        } else {
            for (int i = 0; i < nElm; i++) {
                output.format("%n%d", vec[i]);
            }
        }
    }

}

The problem here is that the variable nElm reset to 0 without me defining it as 0

  • Tu gives the value of the variable nElm in line 2 after public Static void main

2 answers

1


If you want to keep the state of the variable between the methods you need to send and receive. That would be:

import java.util.Formatter;
import java.util.Scanner;

/**
 *
 * @author AmândioMagalhães(115
 */
public class PL7_ex6 {

    private static Scanner input = new Scanner(System.in);
    private static Formatter output = new Formatter(System.out);

    public static void main(String[] args) {
        String[] visitantes = new String[100];
        int nElm = 0;
        menu(visitantes, nElm);

    }

    private static void menu(String[] vec, int nElm) {
        int op;
        output.format("bem-vindo!");
        output.format("\n\nAqui pode:");
        do {
            System.out.println("\n\n1 - Inserir um visitante"
                    + "\n2 - Listar todos os visitantes"
                    + "\n3 - Atualizar um nome dado"
                    + "\n4 - Eliminar um visitante dado"
                    + "\n5- Lisstar os nomes começados por uma dada letra"
                    + "\n6 - Listar nomes repetidos"
                    + "\n0 - para terminar o programa");
            op = input.nextInt();
            if (op < 0 || op > 6) {
                output.format("%sTem de introduzir uma opção válida!");
            }

            if (op == 0) {
                //termina
            } else {
                switch (op) {
                    case 0:

                    case 1:
                        nElm = inserirVisitante(vec, nElm);
                        System.out.println(vec[0]);
                        break;
                    case 2:
                        listarVisitantes(vec, nElm);
                        break;
                    case 3:
                        break;
                    default:
                        throw new AssertionError();
                }
            }
        } while (op > 0 || op > 6);

    }


    private static int inserirVisitante(String[] vec, int nElm) {
        int pos = 0;
        int i = 0;
        if (nElm == vec.length) {
            output.format("Não há espaço disponível :(");
        } else {
            do {
                if (i == nElm - 1) {
                    pos = i;
                }
                i++;
            } while (i >= nElm - 1);
            System.out.println("Introduza o nome do visitante");
            input.nextLine();
            vec[pos] = input.nextLine();
            vec[pos].trim();
            nElm = nElm + 1;
            //para testar
            System.out.println("\n" + nElm + "\n");
            return eElm;
        }
    }

    //nElem não passa de inserirVisitantes para este método
    private static void listarVisitantes(String[] vec, int nElm) {
        if (nElm == 0) {
            //para testar
            System.out.println("\n" + nElm + "\n");
            output.format("Não há visitantes.");
        } else {
            for (int i = 0; i < nElm; i++) {
                output.format("%n%d", vec[i]);
            }
        }
    }

}

But the ideal would be to have this information in the class and be able to access it in all methods directly without having to communicate. It’s not ideal to do it the way you did, but it’s an improvement. The code still has other errors. I fixed several of them, so many that I can’t remember most of them, but it helps.

import java.util.Formatter;
import java.util.Scanner;

public class PL7_ex6 {
    private static Scanner input = new Scanner(System.in);
    private static Formatter output = new Formatter(System.out);
    private static String[] visitantes = new String[100];
    private static int nElm = 0;

    public static void main(String[] args) {
        output.format("bem-vindo!");
        output.format("\n\nAqui pode:");
        int op;
        do {
            System.out.println("\n\n1 - Inserir um visitante"
                    + "\n2 - Listar todos os visitantes"
                    + "\n3 - Atualizar um nome dado"
                    + "\n4 - Eliminar um visitante dado"
                    + "\n5- Lisstar os nomes começados por uma dada letra"
                    + "\n6 - Listar nomes repetidos"
                    + "\n0 - para terminar o programa");
            op = input.nextInt();
            if (op < 0 || op > 6) {
                output.format("%sTem de introduzir uma opção válida!");
                continue;
            }
             switch (op) {
                case 1:
                    inserirVisitante();
                    System.out.println(visitantes[0]); //por que tem isso?
                    break;
                case 2:
                    listarVisitantes();
                    break;
                case 3:
                    break;
                default:
                    throw new AssertionError(); //não deveria fazer isso
            }
        } while (op != 0);
    }

    private static void inserirVisitante() {
        int pos = 0;
        int i = 0;
        if (nElm == visitantes.length) {
            output.format("Não há espaço disponível :(");
        } else {
            System.out.println("Introduza o nome do visitante");
            visitantes[nElm++] = input.nextLine().trim();
            //para testar
            System.out.println("\n" + nElm + "\n");
        }
        return;
    }

    private static void listarVisitantes() {
        if (nElm == 0) {
            //para testar
            System.out.println("\n" + nElm + "\n");
            output.format("Não há visitantes.");
        } else {
            for (int i = 0; i < nElm; i++) {
                output.format("%n%d", visitantes[i]);
            }
        }
    }
}

I put in the Github for future reference.

0

The point is that java loses the reference of the variable, so running in the method in other words would be to say that the nElm that defines in the main method is not the same that is processed within the inserirVisitante, but a reference. That is why it is not possible to use.

So the best way is to declare variables as static outside the scope

And the fact that the object is nElm inside the main method, it loses values as soon as the insertionVisitant finishes executing.

Thus:

import java.util.Formatter;
import java.util.Scanner;

public class PL7_ex6 {
private static Scanner input = new Scanner(System.in);
private static Formatter output = new Formatter(System.out);
private static String[] visitantes;
private static int nElm;

public static void main(String[] args) {
    visitantes = new String[100];
    nElm = 0;
    menu();

}

private static void menu() {
    int op;
    output.format("bem-vindo!");
    output.format("\n\nAqui pode:");
    do {
        System.out.println("\n\n1 - Inserir um visitante"
                + "\n2 - Listar todos os visitantes"
                + "\n3 - Atualizar um nome dado"
                + "\n4 - Eliminar um visitante dado"
                + "\n5- Lisstar os nomes começados por uma dada letra"
                + "\n6 - Listar nomes repetidos"
                + "\n0 - para terminar o programa");
        op = input.nextInt();
        if (op < 0 || op > 6) {
            output.format("%sTem de introduzir uma opção válida!");
        }

        if (op == 0) {
            //termina
        } else {
            switch (op) {
                case 0:

                case 1:
                    inserirVisitante();
                    System.out.println(visitantes[0]);
                    break;
                case 2:
                    listarVisitantes();
                    break;
                case 3:
                    break;
                default:
                    throw new AssertionError();
            }
        }
    } while (op > 0 || op > 6);

}


private static void inserirVisitante() {
    int pos = 0;
    int i = 0;
    if (nElm == visitantes.length) {
        output.format("Não há espaço disponível :(");
    } else {
        do {
            if (i == nElm - 1) {
                pos = i;
            }
            i++;
        } while (i >= nElm - 1);
        System.out.println("Introduza o nome do visitante");
        input.nextLine();
        visitantes[pos] = input.nextLine();
        visitantes[pos].trim();
        nElm = nElm + 1;
        //para testar
        System.out.println("\n" + nElm + "\n");
    }
}

//nElem não passa de inserirVisitantes para este método
private static void listarVisitantes() {
    if (nElm == 0) {
        //para testar
        System.out.println("\n" + nElm + "\n");
        output.format("Não há visitantes.");
    } else {
        for (int i = 0; i < nElm; i++) {
            output.format("%n%d", vec[i]);
        }
    }
}

}

Browser other questions tagged

You are not signed in. Login or sign up in order to post.