Loopar
import java.util.Scanner;
public class MysteryProgram {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
double sum = 0;
int nbrPos = 0;
for (int i = 0; i < n; i++) {
double term = scan.nextDouble();
if (term > 0) {
sum += term;
nbrPos++;
}
}
System.out.println(sum/nbrPos);
}
}
När programmet exekveras med följande indata
5, (-7,2), 8, 7, (-3,5) och (-20).
Vilket värde kommer att skrivas ut?
Jag försöker ta det i små steg men förstår inte. Från start har vi
sum = 0
nbrPos = 0
term = -
När n tilldelas första värdet 5, vad händer därefter? Tilldelas term också värdet 5 eller stannar vi där i koden och inväntar nästa inmatningsvärde -7,2? Om ja, vad händer då? Jag vill få det som att det låser sig då, iom "if (term > 0) … Någon som kan vägleda mig?
Det låser sig inte vid if (term>0) om term är mindre än noll. Då hoppar man bara över det blocket inom klamrar efter if.
nextInt läser bara ett tal, och det blir 5. Sedan kör koden fram till nextDouble och där läser man nästa tal, som är -7,2 och fortsätter sen.
Jaha, så n förblir 5 och loopen matas in med värden hela tiden?
Så, första rundan skriver man i 5 och kommer till då in i for-loopen. Sedan matas ännu ett värde in, i detta fall (-7,2). Här stoppas inte koden utan inväntar ett värde som är >0. Nästa värde är 8 så då kommer man in i if-satsen som är i for-loopen. Värdena här blir:
sum = 8, n = 5, term = 8, nbrPos = 1. Alltså sum/nbrPos = 8. Varför skriver inte programmet ut det när jag skriver 5, (-7,2) och sedan 8? Jag får endast siffror efter jag skrivit i samtliga ovan.
Först ska for-loopen loopa klart. Den räknar från 0 till n-1, så den gås igenom fem gånger. Sedan kommer utskriften.
Jag missar n:et helt i for-loopen. Logiskt och självklart. Tack för förklaringen!
Så, bara för att se så att allt stämmer:
5 matas in, vilket blir n-värdet. Vi kommer in i for-loopen som då ska genomgås 5* ggr (0-(n-1), n = 5).
Här inväntas nästa inmatade siffra, i detta fall (-7,2) som tilldelas term. P.g.a. villkoret i if-satsen, term > 0, så inväntas nästa värde för att kunna genomföra if-satsen. Dock har "ett varv" av for-loopen gått.
Andra varvet av for-loopen genomgås när vi matar in nästa värde, 8. I detta fall stämmer if-satsens villkor och vi genomgår if-satsen där det står att sum += term, vilket betyder sum = sum + term vilket i sin tur betyder sum = 0 + 8 = 8. Därefter räknas nbrPos upp +1.
Tredje varvet av for-loopen genomgår if-satsen p.g.a. samma anledning som andra varvet då vi skriver in värdet 7. Detta leder till sum = 8 + 7 = 15, nbrPos +1 = 2.
Fjärde varvet matas värdet -3,5 vilket är ett negativt tal, alltså genomgås inte if-satsen och därmed oförändrad sum och nbrPos.
Femte* varvet matas också ett negativt värde vilket resulterar i att vi hoppar ut ur for-loopen och läser sista rader:
"System.out.println(sum/nbrPos);"
Detta betyder division mellan sum och nbrPos, vilket ger 15/2=7,5.
Det verkar vara rätt uppfattat, men jag undrar vad "inväntas nästa värde" betyder. När programmet väntar så är det alltid vid nextDouble, och om du matar in mycket snabbt (eller skickar in värdena på något annat sätt) så behöver det inte vänta. När programmet vill använda term så behöver man inte vänta, för term har redan ett värde.
Det finns programmeringsspråk där man inte väntar vid inmatning utan kör vidare men väntar senare när det inlästa värdet behövs. Effekten blir i alla fall densamma.