Anzahl Kommandozeilenparamter mittels Methode

maxmuster987

Aktives Mitglied
Java:
import javax.swing.*;
import java.util.*;
import java.io.*;

public class Dateischreiben {

    public static double Py(double v0, double grad, double t) {               
        final int g = 10;
        double Py = v0*Math.sin(Math.toRadians(grad))*t-(1/2.)*g*Math.pow(t,2);
        return Py;                                                             
    }

    public static void main(String[] args) {
        System.out.println("========================================");
        System.out.println("=======Programm zur Wurfberechnung======");
        System.out.println("========================================");   
        
        if (args.length != 3) {
            System.out.println("Zu wenige oder zu viele Kommandozeilenparameter");
            System.exit(0);
        }
        else {
            
            int t, grad, v0;
            
            String eingabe1 = args[0];
            String eingabe2 = args[1];
            String eingabe3 = args[2];
                
            t = Integer.parseInt(eingabe1);
            grad = Integer.parseInt(eingabe2);
            v0 = Integer.parseInt(eingabe3);
                        
            System.out.println("Flugzeit t: \t\t\t " +t +"  [s]");
            System.out.println("Startwinkel alpha: \t\t " +grad +" [\u00B0]");
            System.out.println("Startgeschwindigkeit v0: \t " +v0 +" [m/s]");
            System.out.println("Ergebnisse in Datei Ergebnis.csv geschrieben");
            
            FileWriter fileW;
            try {
                fileW = new FileWriter("Ergebnis.csv");
                
                fileW.write("Berechnung für Flugzeit t = " +t +" [s]:\n");   
                fileW.write("Position in X-Richtung: " +(v0*Math.cos(Math.toRadians(grad))*t) +" [m]\n");
                fileW.write("Position in Y-Richtung: " +Py(v0, grad, t) +" [m]");

                fileW.close();
            }           
            catch (IOException e) {
                System.out.println("Ergebnisse erfolgt, Ergebnis in Ergebnis.csv widerlegt");
            }
        }       
    }
}

Ich hab für vorliegende Aufgabe diesen Code geschrieben, welcher auch soweit 100% funktioniert und ebenfalls korrekt das ausführt, was verlangt ist.
Das einzige Problem: Die Anzahl der Kommandozeilenparamter soll ich mit Hilfe einer Methode lösen und nicht mit args.length.
Wenn nicht exakt 3 Kommandozeilenparameter eingegeben worden sind, dann soll eine Meldung auftauchen, so wie sie im oben stehenden Code erfolgt.

Wie löse ich das jetzt mittels Methode?
 
Du kannst der Methode args übergeben und darin prüfen wie lang args ist.
So wirst du übrigends feststellen, dass dein else-Zweig nicht nötig ist. Nach System.exit(0); ist das Programm zu Ende.
 
man kann das sicher noch besser schreiben, ich möchte nur zeigen, dass man mit sinnvollen Benamungen das Programm besser versteht.
Java:
import java.io.FileWriter;
import java.io.IOException;

public class Dateischreiben {

    private static final int GRAVITY = 10;

    public static double positionY(final double startingSpeed, final double startingAngle, final double airTime) {
        return startingSpeed * Math.sin(Math.toRadians(startingAngle)) * airTime
                - 1 / 2. * GRAVITY * Math.pow(airTime, 2);
    }

    public static double positionX(final int startingSpeed, final int startingAngle, final int airTime) {
        return startingSpeed * Math.cos(Math.toRadians(startingAngle)) * airTime;
    }

    private static void validateParameters(final String[] args) {
        if (args.length != 3) {
            System.out.println("Zu wenige oder zu viele Kommandozeilenparameter");
            System.exit(0);
        }
    }

    public static void main(final String[] args) {
        System.out.println("========================================");
        System.out.println("=======Programm zur Wurfberechnung======");
        System.out.println("========================================");

        validateParameters(args);
        final int airTime = Integer.parseInt(args[0]); // NumberFormatException?
        final int startingAngle = Integer.parseInt(args[1]);
        final int startingSpeed = Integer.parseInt(args[2]);

        System.out.println("Flugzeit t: \t\t\t " + airTime + " [s]");
        System.out.println("Startwinkel alpha: \t\t " + startingAngle + " [\u00B0]");
        System.out.println("Startgeschwindigkeit v0: \t " + startingSpeed + " [m/s]");

        try (FileWriter writer = new FileWriter("Ergebnis.csv")) {
            writer.write("Berechnung für Flugzeit t = " + airTime + " [s]:\n");
            writer.write("Position in X-Richtung: " + positionX(startingSpeed, startingAngle, airTime) + " [m]\n");
            writer.write("Position in Y-Richtung: " + positionY(startingSpeed, startingAngle, airTime) + " [m]");
            System.out.println("Ergebnisse in Datei Ergebnis.csv geschrieben");
        } catch (final IOException e) {
            System.out.println("Ergebnisse erfolgt, Ergebnis in Ergebnis.csv widerlegt");
        }

    }

}
 
Java:
import javax.swing.*;
import java.util.*;
import java.io.*;

public class Dateischreiben {
   
    public static int kommandozeilenparameter(int args.length) {
        if(args.length!=3) {
            System.out.println("Zu wenige oder zu viele Kommandozeilenparameter");
            System.exit(0);
        }
    }

    public static double Py(double v0, double grad, double t) {              
        final int g = 10;
        double Py = v0*Math.sin(Math.toRadians(grad))*t-(1/2.)*g*Math.pow(t,2);
        return Py;                                                            
    }

    public static void main(String[] args) {
       
        kommandozeilenparameter(args.length);

        System.out.println("========================================");
        System.out.println("=======Programm zur Wurfberechnung======");
        System.out.println("========================================");  
               
            int t, grad, v0;
           
            String eingabe1 = args[0];
            String eingabe2 = args[1];
            String eingabe3 = args[2];
               
            t = Integer.parseInt(eingabe1);
            grad = Integer.parseInt(eingabe2);
            v0 = Integer.parseInt(eingabe3);
                       
            System.out.println("Flugzeit t: \t\t\t " +t +" [s]");
            System.out.println("Startwinkel alpha: \t\t " +grad +" [\u00B0]");
            System.out.println("Startgeschwindigkeit v0: \t " +v0 +" [m/s]");
            System.out.println("Ergebnisse in Datei Ergebnis.csv geschrieben");
           
            FileWriter fileW;
            try {
                fileW = new FileWriter("Ergebnis.csv");
               
                fileW.write("Berechnung fuer Flugzeit t = " +t +" [s]:\n");  
                fileW.write("Position in X-Richtung: " +(v0*Math.cos(Math.toRadians(grad))*t) +" [m]\n");
                fileW.write("Position in Y-Richtung: " +Py(v0, grad, t) +" [m]");

                fileW.close();
            }          
            catch (IOException e) {
                System.out.println("Ergebnisse erfolgt, Ergebnis in Ergebnis.csv widerlegt");
            }
       
    }
}


Meinst du sowas in die Richtung?
Ich erhalte dann im Compiler die Fehlermeldung: Zeile 7: wrong receiver parameter name
public static int kommandozeilenparameter(int args.length) {
 
Hier mal was ganz Böses. Das ist ein übler Hack, aber er erfüllt die Aufgabenstellung.
Java:
int count(String... args) {
  int num = 0;
  for (String s : args) {
      num++;
  }
  return num;
}
Es geht noch etwas übler
Java:
int count2(String... args) {
for (int num = 1; num < Integer.POSITIVE_INFINITY; num++) {
  try {
    String s = args[num-1];
  } catch (IndexOutOfBoundsException e) {
    return num-1;
  }
  return -1; //wird nicht passieren
}

Ein etwas einfacher Hack wäre
Java:
int count3(String... args) {
  return Arrays.asList(args).size();
}
 
Zuletzt bearbeitet:
Was ist, wenn x-beliebige Kommandozeilenparameter eingegeben werden sollen können, aber nur in einem bestimmten Wertebereich (z.B. kleiner gleich 10 nicht erlaubt und größer 30 auch nicht.
Wie würde ich das realisieren?

Also:
Eingabe in Kommandozeile:

java Uebung1 10 20 30 40

Dann soll er mir eine Fehlermeldung ausspucken und das Programm terminieren, weil 10 und 40 außerhalb des Wertebereichs liegen.
 
Meinst du sowas in die Richtung?
Deine Antwort wird sich mit der Antwort von @Oneixee5 überschnitten haben - da findest Du ja auch die Methode, so dass Du die richtige Methodensignatur übernehmen kannst.

Die Ideen von @Neumi5694 kannst du evtl. als einen Scherz ansehen - da ein Array ja eine Länge hat, die man abfragen kann, braucht es natürlich keinerlei Code um diese Größe zu bekommen. Also keine Schleife, kein Abfangen von Exceptions und auch kein Umwandeln in eine Liste um da dann die size zu bekommen. Du hast ja schon eine valide Lösung und bis auf das Verschieben in eine Methode ist da ja nichts notwendig.

Und als kleinen Hinweis: Wenn Du eine Entwicklungsumgebung wie IntelliJ nutzt, dann kannst Du das auch die Entwicklungsumgebung machen lassen. Den Part, den Du in einer Methode haben willst, markieren und dann über Rechtsclick Refactor -> Extract Method ... gehen (Kann bei anderen Entwicklungsumgebungen anders heißen) wird dir das alles gleich richtig gemacht.
 
Was ist, wenn x-beliebige Kommandozeilenparameter eingegeben werden sollen können, aber nur in einem bestimmten Wertebereich (z.B. kleiner gleich 10 nicht erlaubt und größer 30 auch nicht.
Wie würde ich das realisieren?

Also:
Eingabe in Kommandozeile:

java Uebung1 10 20 30 40

Dann soll er mir eine Fehlermeldung ausspucken und das Programm terminieren, weil 10 und 40 außerhalb des Wertebereichs liegen.
Dann musst Du nicht nur die Länge des args Arrays prüfen sondern auch jedes einzelne Element.
Dazu einfach den Parameter zu einem int parsen und prüfen.
 
Eine Frage an den TE sollst du das Prüfen nur in einer Methode machen darfst aber length benutzen.

Oder darfst du das length nicht benutzen?
 

Zurück
Oben