# Wie könnte man folgen Aufgabe in Java umsetzen. String-Methoden sind alle erlaubt. Keine array.Listen sind erlaubt?



## OliI. (27. Nov 2022)

Beliebig viele Parameter einlesen? Wie soll ich das machen, wenn keine Array Listen erlaubt sind?


----------



## yfons123 (27. Nov 2022)

naja du willst einen haufen an parametern haben das hat man anfangs mit nem array gelöst

```
public void calculateNumbers(char mathSymbol,int[] numbers)
{
    // ...
}
```

Java hat für eine "unbekannte menge" an parametern was in die sprache eingebaut

```
public void calculateNumbers(char mathSymbol,int... numbers)
{
    // ...
}
```
was gleich beudeutend ist ansich
in der methode kannst du dann auf die numbers werte auch wie in einem array zugreifen, nur man kann "beliebig viele" ints übergeben und muss nicht zuerst ein array machen, du kannst aber trotzdem ein array übergeben oder irgendwas was eine Collection ist wie zb eine Liste oder Arraylist oder was es sonst noch gibt

mal ein beispiel code den du ausprobieren kannst

```
public class MyClass {
    public static void main(String args[]) {
        calculateNumbers('+',1,2,3,4);
    }
    public static void calculateNumbers(char mathSymbol,int... numbers)
    {
        for (int number : numbers)
        {
            System.out.println(number);  
        }
    }
}
```


----------



## KonradN (27. Nov 2022)

Also das kann man ja direkt schreiben.

Die wichtigen technischen Punkte sind ja dabei:

Wie bekommt man die Programmparameter im Programm?
Kannst Du dann auf den letzten Parameter zugreifen und diesen auswerten?
Wie kannst Du dann alle Parameter durchgehen um damit etwas zu machen?
Wie bekommst Du aus einem Parameter eine Zahl?

Wenn du diese technischen Punkte kannst, dann kannst Du den Algorithmus beschreiben. Wie gehst Du vor? Kannst Du es in Worten beschreiben?


----------



## Oneixee5 (27. Nov 2022)

yfons123 hat gesagt.:


> naja du willst einen haufen an parametern haben das hat man anfangs mit nem array gelöst
> 
> ```
> public void calculateNumbers(char mathSymbol,int[] numbers)
> ...


Das entspricht aber nicht der Aufgabe! Da steht "beliebig viele Zahlen" usw.. Ein Array sind aber nicht beliebig viele Zahlen, sondern nur Integer.MAX_VALUE viele Zahlen*. *Wobei vermutlich einfach nur die Aufgabe dumm formuliert ist. Eine unbegrenzte Anzahl von Parametern/Werten ist einfach nicht möglich. Es wird auch nicht spezifiziert, welche Art von Zahlen verwendet werden soll. So könnte auch byte oder double gemeint sein.
Bei der Übergabe von int ist zu beachten, das bei der Addition der Werte, der Wertebereich des Ergebnisses nicht mehr im Bereich von int liegen könnte. In dem Fall würde es dann zu einem Überlauf kommen und das Ergebnis wäre plötzlich negativ. Gleiches gilt für die Subtraktion. Vermeiden kann man das Problem mit der verwendung passender Datentypen, z.B. BigInteger

```
final int a = Integer.MAX_VALUE / 2;
        final int b = a + 3;
        
        System.out.println(a + " " + b + " " + (a + b));

        final BigInteger sum = BigInteger.valueOf(a).add(BigInteger.valueOf(b));
        System.out.println(a + " " + b + " " + sum);
```


----------



## KonradN (27. Nov 2022)

Oneixee5 hat gesagt.:


> Das entspricht aber nicht der Aufgabe! Da steht "beliebig viele Zahlen" usw..


Wir haben aber die klare Aussage, dass es Programmparameter sein sollen. Damit hat die Aufgabe bereits eine Limitierung der Anzahl der Parameter bezüglich der Anzahl. Daher ist die Begrenzung auf Integer.MAX_VALUE durch das Programm absolut unkritisch, denn die Beschränkung durch die Systeme ist hier viel strenger.

Die Problematik mit dem Überlauf besteht tatsächlich, wobei die ganze Diskussion erst einmal hinfällig ist, denn bei der Übung wird es mit sehr großer Sicherheit in erster Linie um das Erlernen von einfachen Basics gehen.


----------



## mihe7 (27. Nov 2022)

@OliI. wichtig für Dich sind erstmal die Punkte, die @KonradN in #3 genannt hat.


----------



## OliI. (27. Nov 2022)

KonradN hat gesagt.:


> Also das kann man ja direkt schreiben.
> 
> Die wichtigen technischen Punkte sind ja dabei:
> 
> ...



Wie bekommt man die Programmparameter im Programm?
Ich hab mir halt gedacht ich nutze den Scanner. Der Nutzer soll erstmal zwei Zahlen einlesen.
Das Problem ist nun, dass ich keine ArrayList verwenden kann/darf, da wir diese noch nicht kennen.
*Wir kennen nur einfache char-Array, String-arrays und die String-Methoden. Mehr nicht.   *
Also ich lese zwei Zahlen ein. Diese könnte ich in ein int Array speichern, Problem. Ich kann, dann das Array nicht weiter erweitern. 
Also müsste ich die Zahlen als String einlesen, und dann immer weiter aneinander ketten.

Dann könnte ich z. B.  5 4 3 2 + einlesen lassen:         (Als String stehen die Zahlen natürlich hintereinander und ohne Leerzeichen)
Die Länge des Strings könnte ich ermitteln

Jetzt müsste ich das ganze wahrscheinlich in ein Char-Array einlesen. String.toCharArray ist möglich. 

Kannst Du dann auf den letzten Parameter zugreifen und diesen auswerten?
Ich könnte jetzt die zuvor ermittelte Länge des Strings nutzen, um den letzten Wert des charArrays auszulesen. Dies ist das Plus

also char vz = chararry[chararray.length-1]       
Jetzt habe ich das plusZeichen in einem eigenen char nämlich vz gespeichert.

Wie kannst Du dann alle Parameter durchgehen um damit etwas zu machen?
Gute Frage?

for-Schleife einsetzen      for(int i = 0; i<= chararray.length;i++)
                                              int ergebnis = chararry[0] + vz                     ????  

Ich müsste jetzt den letzten Wert des chararrys[chararray.length-1) als Wert hinter chararray[0] setzen, um damit die Addition durchführen. Das dies so geht , wie ich hier geschrieben habe. Bezweifle ich.


----------



## yfons123 (27. Nov 2022)

OliI. hat gesagt.:


> Wie bekommt man die Programmparameter im Programm?


falls du den scanner schon hattest kannst du diese so in das programm kriegen

falls du noch keien möglichkeit gelernt hast diese ins programm zu kriegen, dann einfach hardcoden also einfach rein tippen wie ich es zum beispiel gemacht hatte


----------



## yfons123 (27. Nov 2022)

Oneixee5 hat gesagt.:


> Das entspricht aber nicht der Aufgabe! Da steht "beliebig viele Zahlen" usw.. Ein Array sind aber nicht beliebig viele Zahlen, sondern nur Integer.MAX_VALUE viele Zahlen*. *Wobei vermutlich einfach nur die Aufgabe dumm formuliert ist. Eine unbegrenzte Anzahl von Parametern/Werten ist einfach nicht möglich. Es wird auch nicht spezifiziert, welche Art von Zahlen verwendet werden soll. So könnte auch byte oder double gemeint sein.
> Bei der Übergabe von int ist zu beachten, das bei der Addition der Werte, der Wertebereich des Ergebnisses nicht mehr im Bereich von int liegen könnte. In dem Fall würde es dann zu einem Überlauf kommen und das Ergebnis wäre plötzlich negativ. Gleiches gilt für die Subtraktion. Vermeiden kann man das Problem mit der verwendung passender Datentypen, z.B. BigInteger
> 
> ```
> ...


_sarkasmus an_ 
warum nicht gleich eine micro service architektur aufbauen... hatte ja schon strings.. also aufgehts
_sarkasmus aus_


----------



## KonradN (27. Nov 2022)

OliI. hat gesagt.:


> Ich hab mir halt gedacht ich nutze den Scanner.


Das sind dann aber User Eingaben und keine Parameter des Programmes. Die Parameter des Programmes (auch Kommandozeilen Parameter genannt) bekommst Du in der main Methode über den Parameter `String[] args`

Die anderen Ideen wären interessant, so man von einer Eingabe ausgeht. Aber die haben wir nicht. Wir haben hier jetzt ein Array aus Strings, die die Programmparameter enthalten.

Kannst Du mit dieser Information die Fragen erneut betrachten?


----------



## mihe7 (27. Nov 2022)

OliI. hat gesagt.:


> Ich hab mir halt gedacht ich nutze den Scanner


Nein, die bekommst Du in main übergeben:

```
public static void main(String[] args) {
}
```
Das `args` sind die Parameter.

Nachtrag: da @KonradN mal wieder schneller war, füge ich noch hinzu, dass der Aufruf ja mit

```
java Parameteruebergabe 1 2 3 +
```
erfolgt. Bei einem solchen Aufruf enthält `args` die Strings "1", "2", "3" und "+".


----------



## OliI. (27. Nov 2022)

yfons123 hat gesagt.:


> falls du den scanner schon hattest kannst du diese so in das programm kriegen
> 
> falls du noch keien möglichkeit gelernt hast diese ins programm zu kriegen, dann einfach hardcoden also einfach rein tippen wie ich es zum beispiel gemacht hatte





KonradN hat gesagt.:


> Das sind dann aber User Eingaben und keine Parameter des Programmes. Die Parameter des Programmes (auch Kommandozeilen Parameter genannt) bekommst Du in der main Methode über den Parameter `String[] args`
> 
> Die anderen Ideen wären interessant, so man von einer Eingabe ausgeht. Aber die haben wir nicht. Wir haben hier jetzt ein Array aus Strings, die die Programmparameter enthalten.
> 
> Kannst Du mit dieser Information die Fragen erneut betrachten?


"Das sind dann aber User Eingaben und keine Parameter des Programmes."

Die Zahlen werten einfach über den Scanner eingelesen => In Aufgabenstellung steht: Lesen Sie alle Parameter ein und führen Sie eine Addition bzw. eine Subtraktion auf alle übergebenen Zahlen aus.


----------



## mihe7 (27. Nov 2022)

OliI. hat gesagt.:


> In Aufgabenstellung steht: Lesen Sie alle Parameter ein und führen Sie eine Addition bzw. eine Subtraktion auf alle übergebenen Zahlen aus.


Nein, der Aufruf des Programms ist eindeutig (s. dazu auch meinen Nachtrag in #11).


----------



## KonradN (27. Nov 2022)

Das "Parameter einlesen" bedeutet, dass Du die Parameter auswerten sollst. Ich verstehe, dass es hier zu Missverständnissen kommen kann - die Aufgabe ist aus meiner Sicht schlecht formuliert. Einlesen ist tatsächlich in der Regel das Einlesen von Werten aus einer anderen Quelle (z.B. Eingaben von einem User, der Inhalt einer Datei, ...)

Aber: Die Beispiele sind auch eindeutig! Da sieht man ja den Aufruf auf der Kommandozeile mit `java Parameteruebergabe .....`


----------



## yfons123 (27. Nov 2022)

rein aus Interesse am programmieren kann man auch beide Varianten mal programmieren.. 

niemand wird erschossen wenn man was extra macht auch wenns nicht verlangt wird


----------



## mihe7 (27. Nov 2022)

yfons123 hat gesagt.:


> niemand wird erschossen wenn man was extra macht auch wenns nicht verlangt wird


Wer weiß?


----------



## KonradN (27. Nov 2022)

Wobei die Variante mit dem Scanner deutlich schwerer ist und ohne Datenstrukturen wie eine Arraylist sehr schwer. Mir würde da nur der Weg über die Rekursion einfallen oder - auf Grund der Begrenzung - einfach beides berechnen um dann am Ende nur das gewünschte Ergebnis auszugeben.


----------



## Neumi5694 (27. Nov 2022)

Hier ist entweder der Aufgabentext falsch oder der Beispielaufruf des Programms. Ich vermute, dass der Punkt mit dem "Einlesen" da einfach nicht hingehört. Gleich danach steht ja auch, dass etwas "übergeben" wird, was nicht das Gleiche ist wie Einlesen.
Ich *vermute* mal, dass hier statt dem Einlesen gemeint war, die Strings nach Int zu konvertieren oder so was.


----------



## OliI. (28. Nov 2022)

Neumi5694 hat gesagt.:


> Hier ist entweder der Aufgabentext falsch oder der Beispielaufruf des Programms. Ich vermute, dass der Punkt mit dem "Einlesen" da einfach nicht hingehört. Gleich danach steht ja auch, dass etwas "übergeben" wird, was nicht das Gleiche ist wie Einlesen.
> Ich *vermute* mal, dass hier statt dem Einlesen gemeint war, die Strings nach Int zu konvertieren oder so was.


Mit dem Einlesen ist gemeint, dass man einen Scanner benutzt, um die Werte "einzulesen".
D. h. ich lese die Zahlen alle in ein String-array ein und schau dann am Ende ob ein + oder - eingelesen wurde. 
Dann führe ich die entsprechende Operation aus.
MFG


----------



## Blender3D (28. Nov 2022)

OliI. hat gesagt.:


> Beliebig viele Parameter einlesen? Wie soll ich das machen, wenn keine Array Listen erlaubt sind?


Indem Du das Array args benutzt.

```
public static void main(String[] args) {
    // args beinhaltet die beim Aufruf übergebenen Parameter
}
```


----------



## mihe7 (28. Nov 2022)

OliI. hat gesagt.:


> Mit dem Einlesen ist gemeint, dass man einen Scanner benutzt, um die Werte "einzulesen".




```
public static void main(String[] args) {
    String params = "";
    for (String arg : args) params += " " + arg;
    Scanner sc = new Scanner(new StringReader(params));
}
```
und jetzt viel Spaß beim "Einlesen".


----------



## Neumi5694 (28. Nov 2022)

OliI. hat gesagt.:


> Mit dem Einlesen ist gemeint, dass man einen Scanner benutzt, um die Werte "einzulesen".
> D. h. ich lese die Zahlen alle in ein String-array ein und schau dann am Ende ob ein + oder - eingelesen wurde.
> Dann führe ich die entsprechende Operation aus.
> MFG


Dann ist das schlichtweg falsch:

```
Beispiel:
java Parameteruebergabe 1 2 3 +      ->6    (=1+2+3)
java Parameteruebergabe 10 2 3 -     ->5    (=10-2-3)
```
Denn hier wird nichts eingelesen, die Parameter liegen als Kommandozeilenparameter vor.


----------



## mihe7 (28. Nov 2022)

Neumi5694 hat gesagt.:


> Dann ist das schlichtweg falsch:


Am Anfang steht ganz klar, dass das Programm Programmparameter übergeben bekommt, die Zeilen zur Ausführung unterlegen das, es gibt keinen einzigen Hinweus auf eine Benutzereingabe aber weil da irgendwo mal das Wörtchen "einlesen" auftaucht, muss es ja unbedingt ein Scanner sein... Wenn er meint, dann gibts halt Code aus #21.


----------



## Neumi5694 (28. Nov 2022)

mihe7 hat gesagt.:


> Am Anfang steht ganz klar, dass das Programm Programmparameter übergeben bekommt, die Zeilen zur Ausführung unterlegen das, es gibt keinen einzigen Hinweus auf eine Benutzereingabe aber weil da irgendwo mal das Wörtchen "einlesen" auftaucht, muss es ja unbedingt ein Scanner sein... Wenn er meint, dann gibts halt Code aus #21.


Ja, den find ich gut 
Tatsächlich geht's auch 'on the fly' mit 2 Integer-Werten.
1. Startwert, 2. Summe aller nachfolgenden Werte (muss natürlich beim Einlesen laufend aktualisiert werden), die dann anhand des letzten Parameters vom ersten abgezogen oder eben hinzuaddiert wird.
Einen Scanner kriegt auch so sicher noch irgendwo unter.


----------



## yfons123 (28. Nov 2022)

mihe7 hat gesagt.:


> Wer weiß?


also ich zieh meine aussage zurück:

niemand wird erschossen wenn man was extra macht auch wenns nicht verlangt wird außer mihe läuft im garten mit einem Gewehr rum dann ist die Chance relativ hoch


----------



## KonradN (28. Nov 2022)

Es ist ja egal, ob jemand etwas extra machen will. Aber als erstes sollte man die Aufgabe selbst erfüllen. Ansonsten ist es toll, dass Du irgend etwas anderes gemacht hast...

Die Aufgabe ist eindeutig. Die Interpretation der Aufgabe läßt keine Zweifel offen. Der Ansatz, der vom TE gewählt wurde (Einlesen von Werten vom User per Scanner), erfüllt die Aufgabe schlicht nicht.

Darüber muss man nicht weiter diskutieren. Die Fakten sind deutlich genannt und damit ist doch eigentlich das Ende der Diskussion erreicht, oder?


----------



## yfons123 (28. Nov 2022)

in meiner Studienzeit hatte ich immer mit meinen Freunden einen Overkill programmiert und der Prof hat uns auch dabei unterstüzt .. es war halt wichtiger etwas zu lernen als stur aufgaben zu machen und im nachhinein gesehen würde ich es wieder so machen

ich war noch nie der sture hausaufgaben machertyp

aber jedem das seine, mir etwas mehr


----------



## KonradN (28. Nov 2022)

Das ist ja toll, dass du geübt hast. Dagegen sagt auch niemand etwas.

Alles, worauf hingewiesen wird:
Aufgabe nicht erfüllt = Setzen Sechs!

Das sollte eigentlich klar und verständlich sein und im Augenblick verstehe ich ehrlich gesagt nicht, wo du gerade Probleme hast.


----------



## Neumi5694 (28. Nov 2022)

Das Problem ist halt, dass der Aufgabentext missverständlich, bzw. einfach nur falsch ist.
Mag sein, dass der Prof eine andere Aufgabe abgeändert hat, ohne auf die Details zu achten. "Lesen Sie alle Parameter ein" sollte im Text nicht vorkommen. Man könnte die Parameter "auswerten" oder "casten" oder "parsen", man kann so vieles damit tun, man kann sie halt nur nicht einlesen im herkömmlichen Sinne.


----------

