Fakultät

Hallo und frohe Weihnachten,

wir haben an unsrer Uni vor Weihnachten mit Java begonnen als einführende Programmiersprache hatten wir Haskell.

Es dauerte bis ich mich in Haskell zurechtgefunden habe, aber als ich das Grundlegende verstanden habe hat es richtig Spaß gemacht. Jetzt wollte ich in den Ferien ein bisschen in Java üben, indem ich die Funktionen die wir vorher in Haskell geschrieben haben auch in Java mal schreiben.

Eine der ersten Funktionen war die Fakultät, als ich gehört habe dass es auch in Java wieder Schleifen gibt, fand ich dass ganz gut somit lassen sich vorher gelernte Programme hoffentlich, leicht „übertragen“.

Ich hab mal bisschen was ausprobiert, aber der Compiler sagt ich hätte noch einen Fehler. Hier mal mein Versuch:

public class fac
{
static int fac(int n)
{
int last = 1;
{
int next = (n*(fac(n-1)));
}
}
public static void main( String [] args)
{
System.out.println (" Result = "+fac (20));
}
}

Kann mir jemand sagen wo mein Fehler ist?

Ich dachte mir ich könnt den Ansatz, von der im Skript gegebenen Fibonacci Funktion, verwenden. Die sieht wie folgt aus:

public class Fib {
static int fib(int n) {
int last = 0;
int res = 1;
for(int i=1;i

Hallo,

Du möchtest nur Hilfestellung, sehr löblich :wink:

Haskell ist eine funktionelle Programmiersprache, Java hingegen eine objektorientierte, da prallen Welten aufeinander. Ich kenne das aber gut, war damals bei uns im ersten Semester genauso, der Einstieg mit Haskell und dann kam Java. Auch bei uns hat man damals versucht eine Brücke zu bauen, indem man zunächst einmal auf statische Klassen zurückgriff.
Dies zunächst einmal ganz grundsätzlich.

Für die Zukunft solltest Du Dir merken, Fehlermeldungen explizit zu benennen. Manches kann man auch mit Hilfe des Debuggens schnell finden, aber das bedarf einer gewissen Übung. Du solltest ferner dazu schreiben, welche IDE Du verwendest, falls Du nicht wie wir damals, mit einem simplen Texteditor arbeitest. Ich vermute mal XEmacs ist heute mal das mindeste, was an Universitäten so verwendet wird.

Was bei solchen „Fingerübungen“ am Anfang oft weiterhilft ist ein Trace von Hand. Wenn Du das mal probierst, sollte Dir etwas auffallen.
Da ist z.B. in deinem Code eine Variable, die überhaupt nicht zum tragen kommt, andererseits solltest Du Dich mal fragen, wo da etwas zurückgeliefert wird.

Ich hoffe, ich konnte Dir mit meinen Ratschlägen dienlich sein.

Gruss
Petra

Hallo,

da waren jetzt für mich schon ziemlich viele Fremwörter drin. Ich versuche mal deine Fragen weitgehenst zu beantworten.

Zuerst mal zu dem IDE, damit ist bestimmt der Editor gemeint, oder? Also an der Uni benutzt unser Professor wie du schon gesagt hast dem Emacs ich Zuhause benutze aber gedit.

Jetzt zur Fehlermeldung ich hab mal noch etwas am Programm probiert.
Als erstes wieder das Programm und dann die Fehlermeldung:

/* fakultaet.java */

public class fakulteat {
static int fakultaet(int n) {
int last = 1;
int next = n*fakultaet(n-1);
for(int i=1;i

brayn@ubuntu:~/Java_Aufgaben$ javac fakultaet.java
fakultaet.java:3: class fakulteat is public, should be
declared in a file named fakulteat.java
public class fakulteat {
^
1 error
brayn@ubuntu:~/Java_Aufgaben$

Dieser Fehler sagt aus, das dein Dateiname vom Klassennamen differiert. Du Darfst auch keine zwei klassen in eine Datei packen! Jede klasse braucht ihre eigene Datei!

Mit dem Emacs, gedit oder vi Java zu Programmieren find ich für den anfang echt hart.

Du solltest dir eine vernümpftige IDE wie Eclipse besorgen. Es bringt dich am anfang nicht weiter einfach nur auf Erde zu Programmieren. Das ist was für Freaks bzw. für den späteren verlauf deiner Java Kariere.

http://www.eclipse.org/downloads/?osType=linux

Downloaden, installieren und Spaß am Proggen haben :wink:

LG

David

Re^3: Fakultät (Problem fast gelöst) :smile:
Hallo,

ich habe wieder etwas rumprobiert und binn zu einem tollen Ergbniss gekommen. Die Fakultätsfuktion funktioniert, einziges Problem das ich jetzt noch habe, ich will nicht jedes mal das Programm ändern nur weil ich mir von einer anderen Zahl die Fakultät berechnen will. Dazu fand ich auf unsrer SE1 Hompage ( https://sites.google.com/a/iupr.com/se1/material ) folgende Datei zum herunterladen:

https://sites.google.com/a/iupr.com/se1/material/IO…
( IO.java )

Aber wie muss ich meine Funktion umschreiben dass das funktioniert?

So sieht meine Version der Fakultätsfunktion aus:

public class fakultaet {
static int fakultaet(int n) {
int last = 1;
for(int i=1;i

Da solltest du erstmal mit Buffer, Reader und Stream anfangen. Das schaut im ersten moment schwieriger aus, ist es aber garnicht.

Rd ist wichtig sich mit Streams und Buffern auseinander zu setzen, denn irgendwann willst du auch mal ne Datei einlesen.

Schau dir das Beispiel an, und verwende es in deinem Programm. Lese auch im Inet nach was da genau passiert und wie man diese Klassen verwendet. Das wird dich echt weiter bringen.

Hier mal ein Beispiel:

package de.Hilfe\_Fuer\_Foren;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Add {

 public int addTwoNumbers() throws IOException {

 System.out.println("Dieses Programm Addiert zwei Zahlen");
 int a;
 int b;
 int amount = 0;
 String tempString;
 //Hier wird der System.in Stream angesteuert
 BufferedReader bin = new BufferedReader(
 new InputStreamReader(System.in));

 System.out.println("Bitte die erste Zahl eingeben: ");
 //Hier wird über den system.in Stream eine zeile eingelesen
 tempString = bin.readLine();
 //Hier wird die zeile von sstring zu int geparsed
 a = Integer.parseInt(tempString);
 System.out.println("Bitte die zweite Zahl eingeben: ");
 //und noch mal das ganze
 tempString = bin.readLine();
 b = Integer.parseInt(tempString);
 //Addieren und gleichzeitig ausgeben
 System.out.println("das ergebnis ist:" +(a+b));

 return amount;
 }

}

Hallo,

ich hab mir dein Programm durch gelesen es sieht auch ganz plausiebel aus, dann wollt ich es bei mir mal ausprobieren und dann kam eine Fehlermeldung. Die gleiche Fehlermeldung kam bei meinem Versuch der Fakultätsfunktion auch irgendwann mal. Als er hat es anstandslos in den Maschienencode überstezt doch dann kam diese Fehlermeldung:

Exception in thread „main“ java.lang.NoSuchMethodError: main

Mit Aufruf und Fehlermeldung sieht das ganze dann so aus:

brayn@ubuntu:~/Java_Aufgaben$ javac Add.java
brayn@ubuntu:~/Java_Aufgaben$ java Add
Exception in thread „main“ java.lang.NoSuchMethodError: main
brayn@ubuntu:~/Java_Aufgaben$

Kann es sein dass mir noch eine Hilfsdatei fehlt? In Haskell war es ja so dass bei einer Datei die man importieren will immer eine main Datei vorhanden sein muss, könnte es vielleicht auch sein dass das „main“ in der Fehlermeldung damit was zu tun hat?

Danke für deine Mühe, lg Matthias

Du hast es richtig erkannt. In meinem Beispiel habe ich nur ein Klasse zur verfügung gestellt. Dir fehlt noch eine Main methode in der Datei oder eine Hilfsdatei.

Bitte, bitte, bitte hör auf meinen Rat und schaff dir für den anfang ne IDE an… Eclipse wird dein verständniss erhöhen. Ich respektiere deinen Wunsch es so zu machen wie der Prof es sagt aber du machst es dir nur unnötig schwer.

Der untenstehende code ist ausführbar…

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Add {

 public static int addTwoNumbers() throws IOException {

 System.out.println("Dieses Programm Addiert zwei Zahlen");
 int a;
 int b;
 int amount = 0;
 String tempString;

 BufferedReader bin = new BufferedReader(
 new InputStreamReader(System.in));

 System.out.println("Bitte die erste Zahl eingeben: ");
 tempString = bin.readLine();
 a = Integer.parseInt(tempString);
 System.out.println("Bitte die zweite Zahl eingeben: ");
 tempString = bin.readLine();
 b = Integer.parseInt(tempString);

 System.out.println("das ergebnis ist:" +(a+b));

 return amount;
 }

 public static void main(String[] args) {
 try {
 addTwoNumbers();
 } catch (IOException e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
 }
 }

}

Hallo,

danke schön schon mal, für deine bisherigen Hilfen. Ich habe mir natürlich deinen Rat zu Herzen genommen und habe mir Eclipse heruntergeladen. Irgendwie war das in Linux nicht so einfach und zum Schluß habe ich es dann doch über die Shell gemacht. Wenn ich aber nun eine datei öffnen will, ein Bsp. „eclipse test.java“ dann ist es noch relativ kompliziert den Text zu verfassen, mitlerweile weiß ich wo man schreibt, nur das abspeichern macht mir jetzt probleme…
Da muss ich mich wohl noch etwas reinschaffen.

Dein Programm funktioniert bei mir jedenfalls sehr gut, ich werde versuchen mit hilfe deines programmes und meiner Funktion die funktion so umzuschreiben, dass meine Funktion auch Variablen einlesen kann. Ich halte dich auf jedenfall auf dem laufenden.

Vielen Dank noch einmal für deine großartige Hilfe, lg Matthias

Hallo,

ich bin nun mal zu zwei Ergebnissen gekommen. Zu beginn des Studiums habe ich mir das „Handbuch der Java Programmierung“ gekauft, wo ich nun auch eine Methode nachschlagen konnte.Ich weiß nicht ob wir es schon nach dem „BufferedReader“ Schema machen sollen oder ob wir erst mit „Scanner“ beginnen sollen, mich kommt es so vor als gäbe es zwischen den beiden Methoden garnicht so viel Unterschied (vom schreiben zumindest), wenn ich das richtig erkannt habe.

Nun mal zu meinen Ergebnissen, einmal hab ich es mit Scanner und einmal mit BufferedReader gemacht, aber beides läuft noch nicht.

Scanner Version:
import java.util.Scanner;
import java.io.IOException;

public class fakultaet
{
public static void main(String[] args)
throws IOException
{
int a;
int b;
int amount = 1;

Scanner scanner = new Scanner(System.in);

System.out.println("Bitte geben Sie eine Zahl ein: ");
a = scanner.nextInt();

b = fakultaet(a) {
int last = 1;
for(int i=1;i

Re^9: Fakultät (Problem fast gelöst) :smile:
Matthias, ich muss sagen ich weiss nicht genau was ich mit dir anfangen soll :slight_smile:

Du scheinst da noch ganz grundlegende Dinge durcheinander zu bringen.

Weisst du eigentlich was eine Bootstrap-Methode ist? Hast du ne Ahnung was die Main-Methode beweirkt?

Ich denke nicht. Du solltest deine Vorlesungsaufzeichnungen noch mal durchsehen und wenn die nichts bringen lies dir noch mal das ein oder andere Buch/Totorial durch.

fang mal mit dem hier an: http://www.programmersbase.net/Content/Java/Content/…

Dir fehlt zeitweise eine Basis die unabdingbar ist.

Du bist nicht zu dumm zum Programmieren, du bringst nur die ganze Syntax durcheinander. Das is ärgerlich, weil du gute Ansätze lieferst aber durch so kleine Dinge demotiviert wirst.

Nochmal: Du brauchst eine laufende IDE wie Eclipse, die markiert dir die Fehler und macht vorschläge zur änderung. Wenn es unter Linux was besseres gibt, bitte nutze es… ABER DU BRAUCHST SYNTAXHIGHLIGHTING!! Das ist ein nett gemeinter Befehl :wink: :stuck_out_tongue: :slight_smile:

So nun aber zu deinem Code.

Deine Methode Funktioniert, du hast nur wie gesagt, ein par syntaktische Fehler begangen… na gut… ein paar viele aber der Ansatz war sehr gut.

Hier der Lauffähige code, bei Fragem einfach Fragen:

Buffered Löseung

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class buffer {

 public static int facfromtheNumber() throws IOException {

 System.out.println("Dieses Programm berechnet die Fakultät einer Zahl");
 int a;
 int b;
 int amount = 1;
 String tempString;

 BufferedReader bin = new BufferedReader(
 new InputStreamReader(System.in));

 System.out
 .println("Bitte geben Sie die Zahl ein, von der Sie die Fakultät berechnen lassen wollen: ");
 tempString = bin.readLine();
 a = Integer.parseInt(tempString);

 for (int i = 1; i 


Scanner Lösung



    import java.util.Scanner;
    import java.io.IOException;
    
    public class scanner {
    
     public static void main(String[] args) throws IOException {
    
     int a;
     int b;
     int amount = 1;
    
     Scanner scanner = new Scanner(System.in);
    
     System.out.println("Bitte geben Sie eine Zahl ein: ");
     a = scanner.nextInt();
     for (int i = 1; i 

Hallo,

Du scheinst da noch ganz grundlegende Dinge durcheinander zu bringen.
Weisst du eigentlich was eine Bootstrap-Methode ist? Hast du ne
Ahnung was die Main-Methode beweirkt?

Zu allem nein. :frowning:
Ich weiß auch nicht was ich noch tun kann, unser Skript ist so schlecht, weil neune Worte einfach benutzt und nicht neu vorgestellt oder Erklärt werden und vorallem weil nichts zu all dem gesagt wurde, wir bekommen als Übungsaufgaben so Sachen wie Primzahlen und Primfaktoren berechnen lassen unsre Freaks haben sowas in einer halben Stunde fertig, woher die dass auch wissen aber ich kann doch nicht mehr machen als Bücher und Skripte lesen. :frowning:

Ich werde zusehen dass ich das Eclipse zum laufen bekomme und dass ich dein vorgeschlagenes Buch bis zum Ferien ende durch habe.

Den bis jetzt weiß ich noch garnichts über Java.

Danke nochmal für deine Hilfe, lg Matthias

Du hast ne Mail