11 svar
154 visningar
Koya_The_Koala2.0 är nöjd med hjälpen
Koya_The_Koala2.0 36
Postad: 27 nov 2020 20:30

Varför printar den inte ut namnet?

Hej!

Jag försöker skapa ett program som printar ut namnet och poängen för en spelare/spelarna så att det ser ut som sådan: "name: hercules points: 20". Såhär ser min kod ut

 void program() {
        Player[] players = inputPlayers();
        outPlayers(players);
    }

    //This class captures the concept of a Player
    class Player {
        String name;   // A Player has a name and...
        int points;    // ... and points

        // TODO Add a constructor

        Player(String name, int points) {
            this.name = name;
            this.points = points;
        }

    }



    // ---------- Methods -------------------

     Player[] inputPlayers() {
        out.println("How many players?");
        int nplayers = sc.nextInt();
        Player[] players = new Player[nplayers];
        for (int i = 0; i < nplayers; i++){
            int index = i + 1;
            out.println("Whats the name of player" + "  " + index +" ?");
            String name = sc.nextLine();
            sc.nextLine();
            out.println("How many points does player" + " "+ index + "?");
            int points = sc.nextInt();
            Player p = new Player(name,points);
            players[i] = p;
            sc.nextLine();
        }
        return players;   // For now
    }

    void outPlayers(Player[] players){
       // TODO
     for (int i = 0; i < players.length; i++){

         out.println("Players are:");
         out.println("Name:" + " " + players[i].name + " " +"Points:"+ " " +players[i].points );
     }
    }


}

Mitt problem är att såsom koden ser ut nu så printar den inte ut namnet på den första spelaren, alltså player[0].name. Vad är det jag gör fel? Kan någon ge mig en ledtråd?

Laguna Online 28443
Postad: 27 nov 2020 21:24

Jag vet inte riktigt, men kan du visa en exempelkörning med fyra spelare? 

Koya_The_Koala2.0 36
Postad: 27 nov 2020 21:47

Laguna Online 28443
Postad: 27 nov 2020 22:09

Det är lite för många nextLine(), tycker jag. 

Hur såg det ut i början av körningen? De första fem raderna. 

Koya_The_Koala2.0 36
Postad: 27 nov 2020 22:24

Angående nextLine() så stod i instruktionerna att man skulle lägga en extra sc.readLine() eftersom det har något med ENTER och att man användaer både text och siffer input, men jag tycker också att inte alla nextLine() jag har är nödvändiga.

Laguna Online 28443
Postad: 28 nov 2020 08:44

Jag föreslår att du skriver ut vad varje sc.nextLine() returnerar, så vet vi om nån text försvinner genom att den blir inläst vid fel tillfälle. Jag minns att sådant här förvirrade mig i början, tills jag hittade rätt sätt att tänka (i olika språk), nämligen att läsa in en hel rad i taget och sedan bearbeta den som sträng. Men det borde gå att göra rätt enligt dina instruktioner också.

Det har nog nånting att göra med att nextInt (kanske) läser (inklusive tomma rader) tills det finns något som kan vara ett heltal, medan nextLine bara läser en ny rad.

Vad säger dokumentationen om nextInt()?

Koya_The_Koala2.0 36
Postad: 28 nov 2020 19:18

Det står ingenting om nextInt() i dokumentationen.

Laguna Online 28443
Postad: 28 nov 2020 20:04

Man ska inte behöva programmera utan dokumentation. Klaga hos din lärare.

För att fortsätta debugga: byt ut alla rader som ser ut som

    sc.nextLine();

mot

    out.println("[" + sc.nextLine() + "]");

Stoppa dessutom in

    out.println("[name = " + name + "]");

precis efter att du har läst in 'name'.

(Typsnittet från koden verkar ha fastnat på min vanliga text också.)

Koya_The_Koala2.0 36
Postad: 28 nov 2020 22:03

Jag tror att jag har hittat problemet. När jag kör programmet via debugger så verkar det som att den inte sparar namnet på den första spelaren.

Jag vet inte har jag ska fixa det här problemet, kan du ge mig ett tips?

Laguna Online 28443
Postad: 28 nov 2020 22:16

nextInt och nextLine verkar interagera på nåt konstigt sätt. Om du skriver ett kort program där du bara utför lite olika kombinationer av dem och ser vad som läses in så kanske du kommer på hur det fungerar. Jag kan inte riktigt tänka ut det.

Lindehaven 820 – Lärare
Postad: 29 nov 2020 10:05

Troligen behöver den första inläsningen av heltal efterföljas av inläsning/konsumption av nyradstecknet. Prova lägga in:

int nplayers = sc.nextInt();
sc.nextLine(); // consume newline
Koya_The_Koala2.0 36
Postad: 8 dec 2020 19:48

Tack!

Svara Avbryt
Close