kalkulator, dodawanie, kod.

0

Witam. Uczę się programowania w jęzuku JAVA. Chcialem napisać krótki kod w którym będzie kalkulator dodawał wpisywane liczby przez użytkownika, wykorzytsując przy tym podstawową wiedzę języka taką jak pętle, czy instrukcje warunkowe if. Kalkulator działa, lecz Moje pytanie czy mogłbym uproscić ten kod mając podstawową wiedze?

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    System.out.println("Kalkulator 0.1");
    System.out.println();
    System.out.println("Sumowanie liczb. Podaj Liczbe:");

    boolean score=true;

    while (score) {

        double number1 = scanner.nextDouble();
        System.out.println("+");
        double number2 = scanner.nextDouble();
        double number3=number1+number2;
        System.out.println("= " + number3);
       score=false;

        while (true) {

        if (number3>0) {
            double number4 = scanner.nextDouble();
            System.out.println("+");
            number3 = number4 + number3;
            System.out.println("=" + number3);
        }


        }
    }

}

}

1

:)
Wklej po wczytywaniu z klawiatury scanner.close();

import java.util.Scanner;
public class HelloWorld{
public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    System.out.println("Kalkulator 0.2\nSumowanie liczb. Podaj Liczbe:");
    
    boolean score= true;

    while (score) {

        double number1 = scanner.nextDouble();
        System.out.println("+");
        double number2 = scanner.nextDouble();
        double number3=number1+number2;
        System.out.println("= " + number3);
       score= false;

        while (true) {

        if (number3> 0) {
            double number4 = scanner.nextDouble();
            System.out.println("+");
            number3 = number4 + number3;
            System.out.println("=" + number3);
        }

        }
    }

    }
}
1

Ja na twoim miejscu pomyślałbym jak zakończyć prace programu i czy te pętle while są na pewno w porządku. Dwie pętle są niepotrzebne, wystarczy jedna np. do while lub jedno while z zadeklarowaną wcześniej zmienną kończącą prace pętli. Tak samo boolean score oraz instrukcja warunkowa if do wyrzucenia. Tak to ciężko stwierdzić co dla Ciebie jest podstawową wiedzą, a co nie, bo to pojęcie względne ;)

0

Jeśli o zakonczenie pracy programu to mysle. ze tak bedzie ok? Jesli mozesz to zamiesc kod jak bys zapisal w jenej pętli.


package com.company;

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("Kalkulator 0.2\n Sumowanie liczb.\nBy zakończyć pracę programu wcisnij 0\n Podaj Liczbe:");

        boolean score=true;

        while (score) {

            double number1 = scanner.nextDouble();
            if (number1==0){
                return;
            }
            System.out.println("+");
            double number2 = scanner.nextDouble();
            double number3=number1+number2;
            System.out.println("= " + number3);
           score=false;

            while (true) {

            if (number3>0) {
                double number4 = scanner.nextDouble();
                if (number4==0){
                    return;
                }
                System.out.println("+");
                number3 = number4 + number3;
                System.out.println("=" + number3);
            }


            }
        }

    }
}
0

Ja bym jednak polegal na jakims EOFie (end of file).

java.util.Scanner ma chyba taka metode jak .hasNext() i jesli zwroci false to zakoncz program.
A wiec

while(scanner.hasNext())

Ale jak wyslac EOF z interaktywnej sesji terminala? W linuksie control+d a w Windowsie chyba control+z.


I tak jak koledzy wyzej pisali, wywal druga petle.

0

Pisane na szybko:

public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);
        System.out.println("Kalkulator 0.1");
        System.out.println();

        int choice=1;
        while (choice==1){
            System.out.println("Sumowanie liczb. Podaj Liczbe:");

            double number1 = scanner.nextDouble();
            System.out.println("+");
            double number2 = scanner.nextDouble();
            double number3 = number1 + number2;
            System.out.println("= " + number3);

            System.out.println("Wciśnij 0 by zakończyć prace programu, lub 1 by kontynuować");
            choice=scanner.nextInt();
        }


        }
0

W kalkulatorze chodzi o to by suma dwoch pierwszych liczb była dodana do trzeciej liczby suma z trzech liczb dodana do czwratej liczby itd. wpsiując libczy chcę by wszytskie byly dodawane do Siebie, np gdy mam dodać do siebie 20 liczb, lub 100liczb, 200itd a w przykładzie wyżej sumowanie zaczyna się za każdym razem od 0 a nie od ostatniego wyniku.
Czy da się zapisać to w jednej pętli? Najlepiej bez zapytania za kazdym razem o konczeniu programu po wpisaniu liczb.

1
LuFCc napisał(a):

W kalkulatorze chodzi o to by suma dwoch pierwszych liczb była dodana do trzeciej liczby suma z trzech liczb dodana do czwratej liczby itd. wpsiując libczy chcę by wszytskie byly dodawane do Siebie, np gdy mam dodać do siebie 20 liczb, lub 100liczb, 200itd a w przykładzie wyżej sumowanie zaczyna się za każdym razem od 0 a nie od ostatniego wyniku.

Czy da się zapisać to w jednej pętli? Najlepiej bez zapytania za kazdym razem o konczeniu programu po wpisaniu liczb.

Aaaa oki :) To nie zrozumiałem zamierzenia :) A wiesz już co to rekurencja?

1

Zadanie jedno z tych na którym się wychowały pokolenia programistów :)

@LuFCc:

Pomyśl i zaprojektuj, żeby działało dobrze gdy ktoś będzie wpisywać

1
2
3
4
5

albo

1 2 3 4 5

albo

1 2
3
4 5
6
7 8 9
10

albo dla ambitnych :)

Ala miała 1 i 2 oraz 3
dostała 4 z 5
później wpadło
6
do 7
    String line;
    System.out.println("Empty line to get sum");
    try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {
        while (!"".equals(line = br.readLine())) {
            System.out.println("Entered: " + line);
        }
        System.out.println("This is the end my friend");
    }
}

Do poznania jak nie znasz: parseInt, split

0

@TheLearner: Niestety jeszcze nie uczyłem się o rekurencji

1

Bardziej skomplikowane niz tylko petle i zmienne ale patrz np. to

import java.util.Scanner;

class Main {
  public static void main(String[] args) {
    var scanner = new Scanner(System.in);
    scanner.useDelimiter(System.getProperty("line.separator"));

    while(scanner.hasNext()) {
      var line = scanner.next();
      var tokens = line.split(" ");

      double sum = 0.0;

      for(var token : tokens) {
        try {
          var value = Double.parseDouble(token);
          sum += value;
        }
        catch(Exception e) {
          System.out.println(token + " is not a double!");
        }
      }

      System.out.println(line.replace(" ", "+") + "=" + sum);
    }

    scanner.close();
  }
}
> 3 5 6 8
3+5+6+8=22.0
> 8 5
8+5=13.0

0
LuFCc napisał(a):

@TheLearner: Niestety jeszcze nie uczyłem się o rekurencji

Tu fajnie by się robiło rekurencje, ale jak nie znasz, to żeby nie motać to jest jeszcze taka metoda:

public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("Kalkulator 0.1");
        System.out.println();

        System.out.println("Sumowanie liczb. Podaj Liczbe:");
        double number1 = scanner.nextDouble();
        System.out.println("+");
        double number2 = scanner.nextDouble();
        double number3 = number1+number2;

        int choice=1;
        while (choice==1){
            System.out.println("= " + number3);            

            System.out.println("Podaj Liczbe:");
            System.out.println("+");
            number2 = scanner.nextDouble();
            number3=addNumbers(number3,number2);

            System.out.println("= " + number3);
            System.out.println("Wcisnij 1 by kontynuowac lub 0 by przerwac");
            choice=scanner.nextInt();
        }

    }
    public static double addNumbers(double number1, double number2){
        return number1+number2;
    }
```

@stivens  teraz się lepiej wyraziłem co miało być w poprzedniej wersji posta :) wybacz :)
1

Parsowanie, bez wypisywania "Drogi użytkowniku, niestety nie o to nam chodziło" ;)
Eksepszynom rzucanym w twarz użytkownikowi mówimy nie ;)

package com.abc;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class ThisIsJustTheBeginning {

    public static void main(String[] args) throws IOException {

        String line;
        int sum=0;
        System.out.println("Empty line to get sum");
        try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {
            while (!"".equals(line = br.readLine())) {
                int subTotal = parseLine(line);
                sum+=subTotal;
            }
            System.out.println("Got " + sum);
        }
    }

    private static int parseLine(String line) {

        int total = 0;
        String regex = "\\d+";
        final Pattern pattern = Pattern.compile(regex);
        final Matcher matcher = pattern.matcher(line);
        while (matcher.find()) {
            final String group = matcher.group();
            final int anInt = Integer.parseInt(group);
            total += anInt;
        }

        return total;
    }
}
Empty line to get sum
1a b2c ala ma 3 koty
Pies As
3psy pies1
1,2,3,4,a,,x,ac,5,a6.;7:8 9% & $10

Got 65
0

Dzięki wszytskim za odpowiedzi. Jeszcze chciałem spytać. Gdybym np ten kalkulator dodawania, chciał odpalić na innym komputerze gdzie nie ma kompilatora IntelliJ tylko zainstalowana java jdk,by odpaliło się w wierszu polecen cmd, bez isntalowania IntellIJ, jest taka możliwość? i jak to zrobić? :)

0

Skompiluj klasy do .jara a potem odpalasz to za pomoca java -jar

0

@stivens: Mógłbyś opisać jak dokładniej to zrobic?:)

1

@stivens: I jeszcze manifest więc będzie problem dla początkującego

Lepiej z IDE, np IntelliJ

1

@LuFCc, może takie podejście Cię zainteresuje, żadnych regexp nie trzeba, tylko Scanner i jego trzy metody:

public class SumApp {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("Input numbers to sum. Input q or Q to finish.");
        double sum = 0;
        while (true) {
            //petla poniżej przetwarza wszystko co nie jest liczbą
            while (!scanner.hasNextDouble()) {
                String token = scanner.next();
                //to na wypadek pustych wierszy, które są akceptowane
                if (token.isEmpty()) {
                    continue;
                }
                //testujemy czy token zawiera polecenie zakończenia programu
                if ("q".equals(token) || "Q".equals(token)) {
                    System.out.println("App finished!");
                    scanner.close();
                    return;
                } else {
                    //feedback do użytkownika
                    System.out.println("Your input: \"" + token + "\" is not a valid number!");
                }

            }
            //tutaj sumujemy i wyświetlamy komunikaty o wyniku
            double number = scanner.nextDouble();
            sum += number;
            System.out.println((sum - number) + " + " + number + " = " + sum);
        }
    }
}

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