8 svar
377 visningar
narkingen 3 – Fd. Medlem
Postad: 21 feb 2017 19:36

Problem med Scanner

Hej. Jag har så smått börjat med java och är alltså nybörjare som har en fråga. Jag har börjat med en kod som ska räkna ut hur mycket jag tjänar på dag X, koden som jag har skrivit finner ni nedan. När jag kör den hänger inte det matematiska med när jag vill räkna ut hur mycket pengar jag har tjänat på dag Y. När jag kör koden och skriver in att jag kom till jobbet 08:15 får jag följande output. Jag får alltså inte möjlighet att skriva när jag lämnade jobbet och summan på 206 kr är fel då timlönen är 100 kr.

Skriv in när du började jobba idag [hh:mm]>08:15
Skriv in när du slutade jobba idag [hh:mm]>Din lön för idag blir 205.83333333333331Kr

Kan någon med större kunskaper än mig förklara varför resultatet blir som det blir?

-----------------------------------------------------------------------------------

import java.util.*;

public class Tid 
{

public static void main(String[] args)
{
int hours;
double minutes, totalhours;
double lon=0;
int pengar=100;

Scanner keyboard = new Scanner(System.in).useDelimiter(":|\s*");

System.out.print("Skriv in när du kom till jobbet idag [hh:mm]>");
int ankomst = keyboard.nextInt();

System.out.print("Skriv in när du lämnade jobbet idag [hh:mm]>");
int slut = keyboard.nextInt();

hours = keyboard.nextInt();
minutes = keyboard.nextDouble();
totalhours = hours + (minutes/60);
lon = totalhours*pengar;

System.out.println("Din lön för dagen är " + lon + "Kr");

}

}

Henrik Eriksson 1405 – Fd. Medlem
Postad: 21 feb 2017 21:35

 Du ska läsa både timme och minut från den första inputen. Du läser bara timmen.

I mönstret ska du skriva \\s* om du menar godtyckligt antal blanka. Men vad jag ser används inte blanka som avskiljare utan kolon och ny rad. Jag föreslår att du tar bort |\s* ur mönstret ochi stället gör keyboard.nextLine() när du läst timme och minut.

narkingen 3 – Fd. Medlem
Postad: 21 feb 2017 22:00

Tack för ditt svar Henrik. Jag förstår dock inte riktigt vad du menar när du skriver att jag bara läser in timmen?

Ingemar 517 – Fd. Medlem
Postad: 21 feb 2017 22:49

Du måste väl ta tiden du slutar - tiden du kommer  för att få fram den totala tiden du är på jobbet?

Ex: Kommer du 10.00 och går 18.00 måste det finnas någon punkt i koden där du tar 18.00-10.00 för att få fram en totalhours på 8 timmar. Den skall sedan tas * 100 som är lönen, vilket kodens sista rad visar.

Det din kod verkar göra (jag är C++ och inte Java, ursäkta om jag har fel)  är att istället ta fram 
totalhours = hours + (minutes/60);
Men du har bara timmar och minuter från det ena värdet, inte det andra.

Henrik Eriksson 1405 – Fd. Medlem
Postad: 22 feb 2017 01:04

Du skriver 08:15 och läser in 08 till ankomst men du läser inte in 15.

narkingen 3 – Fd. Medlem
Postad: 22 feb 2017 14:17

 är det int hours som gör att endast timmar läses in?

PeterÅ 842
Postad: 22 feb 2017 14:23 Redigerad: 22 feb 2017 14:26

Läsa in från tangentbord kan vara knepigt. Börja istället att definiera några testvärden direkt i programmet och kör det för att verifiera att matematiken fungerar. Sedan tar du dig an att läsa siffror från tangentbordet.
Dessutom läser du in variablerna ankomst och slut, men du använder dem inte.

Byt ut hours = keyboard.nextInt(); osv mot

hours = 8;
minutes = 45;

Kör sedan uträkningen:
totalhours = hours + (minutes/60);
lon = totalhours*pengar;
System.out.println("Din lön för dagen är " + lon + "Kr");

Prova med lite olika värden på hours och minutes.
När du är nöjd med resultatet börjar du med tangentbordsinmatningen. Henrik hade några bra tips där.

MagicJulia 5 – Avstängd
Postad: 22 mar 2017 13:31

Samma problem här

annlu 230
Postad: 22 mar 2017 17:20
MagicJulia skrev :

Samma problem här

MagicJulia, vad exakt är det du inte förstår? Hur ser din kod ut? Vad är det du inte förstår i hjälpen och hintarna som Henrik, Ingemar och PeterÅ gav till narkingen? Var fastnar du? Med mer info kan vi hjälpa dig bättre. 

Posta gärna som ny fråga ifall ditt problem är annorlunda mot narkingens. 

Svara
Close