Pliki Java. Wykonuje się jedynie jeden warunek w pętli.

0

Cześć,

Mam problem z zadaniem w języku Java o treści:
W pliku "dochody.txt" w kolejnych liniach zapisane są dane określające płeć i dochody roczne np.
K 28450
M 26730
M 42440
K 53100
K 46565
M 49000
Napisz program obliczający średnie dochody kobiet i mężczyzn.

import java.util.Scanner;
import java.io.File;

public class Main {

    public static void main(String[] args) throws java.io.FileNotFoundException {

        File file = new File("dochody.txt");
        Scanner scanner = new Scanner(file);

        int dochodK =0, dochodM = 0, licznikK = 0, licznikM = 0, sredniaK =0, sredniaM =0;



       while (scanner.hasNext()) {
           if (scanner.next().equals("M")) {
               dochodM = dochodM + scanner.nextInt();
               licznikM++;
           }
           else if (scanner.next().equals("K"))
            {
                dochodK = dochodK + scanner.nextInt();
                licznikK++;
            }

        }
        if (licznikK ==0)
            System.out.println("Nie dzielimy przez zero!");
        else
        {
            sredniaK = dochodK / licznikK;
        }

        if (licznikM == 0)
            System.out.println("Nie dzielimy przez zero!");
        else
        {
            sredniaM = dochodM / licznikM;
        }


        System.out.println("Srednia pensji kobiet wynosi: " + sredniaK + "\n Srednia pensji mężczyzn wynosi: " +
                sredniaM );
    }
}

Problem jest taki, że wykonuje się jedynie pierwsza instrukcja if w pętli while. Mógłby ktoś dać wskazówkę, dlaczego tak się dzieje?

3

Tak na szybo, to problem w tym, że w else skanujesz już kolejny znak (next). Dodaj zmienną do której skanujesz, i ją analizuj.

zmienna = scanner.next()
 if (zmienna.equals("M")) {
               dochodM = dochodM + scanner.nextInt();
               licznikM++;
           }
           else if (zmienna.equals("K"))
            {
                dochodK = dochodK + scanner.nextInt();
                licznikK++;
            }
2

Bo czytasz za dużo ze źródła! Jak robisz scanner.next() to tego znaku na wejściu już nie ma! A ty wesoło zakładasz ze czasem jest a czasem nie.

           if (scanner.next().equals("M")) {
               dochodM = dochodM + scanner.nextInt();
               licznikM++;
           }
           else if (scanner.next().equals("K"))
            {
                dochodK = dochodK + scanner.nextInt();
                licznikK++;
            }

Zauważ że w obu warunkach robisz scanner.next() więc jeśli warunek pierwszy nie jest spełniony to wesoło wczytasz sobie kolejny znak z wejścia. Więc jeśli na wejściu masz K 1234 to pierwszy if wczyta sobie K i warunek nie jest spełniony więc idziemy do else if i wczytujemy... 1 bo to kolejny znak na wejściu i zaczynamy dalej wczytywać dane zupełnie bez sensu.

Wczytaj znak raz, przed ifami a dopiero potem sprawdzaj co to za znak!

0

Z całego tego badziewnego kodu najbardziej wk... każdego kto skończył przynajmniej 4 klasy szkoły podstawowej powinno być dzielenie przez... licznik.

https://pl.wikipedia.org/wiki/U%C5%82amek

Inna koncepcja która chyba jest obca autorowi posta to "suma".
http://lubiematematyke.blog.pl/2015/09/02/suma-i-roznica-liczb/

0

Ciekawe, czy gdyby użył CounterF i CounterM też byś się czepiał? Co do sumy, to w sumie nie wiem czego tu można się przyczepić? No można by to skrócić

dochodK +=  scanner.nextInt();
0

Dziękuję za odpowiedzi, już wiem w czym był błąd :)

P.S. Przecież oczywistym jest, że chodziło mi o licznik kobiet i mężczyzn, a nie o licznik jako składowa ułamka! :D

1 użytkowników online, w tym zalogowanych: 0, gości: 1