[Java] Hilfe zu einer Probeklausur

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von M.G., 12. Februar 2012 .

Schlagworte:
  1. 12. Februar 2012
    Zuletzt von einem Moderator bearbeitet: 14. April 2017
    Hilfe zu einer Probeklausur

    Hallo,

    mann mir jemand eine Musterlösung zu folgenden Aufgaben erstellen? Es handelt sich dabei um eine Probeklausur. Wir bekommen dafür keine Musterlösung und ich würde das anhand dieser Lösung viel besser nachvollziehen können.

    Hier die Aufgaben als .pdf:

    Download: aufgaben_java.pdf | www.xup.in

    Bewertung ist selbstverständlich.
     
  2. 12. Februar 2012
    AW: Hilfe zu einer Probeklausur

    Stell deine Methoden hier rein, dann kriegst du Korrekturen. Aber ohne dass du irgendwas lieferst hat hier sicher keiner darauf Lust..
     
  3. 12. Februar 2012
    AW: Hilfe zu einer Probeklausur

    Das hat mehr was mit Mathematik als mit Programmierung zu tun. Um das zu lösen brauchst du nur minimale Programmierkenntnisse.

    z. b. bei der ersten aufgabe muss man sich erst mal überlegen wie das zu interpretieren ist.

    Wenn man davon aus geht das das stimmt (muss man ohne Java machen):

    t0 = 1
    t1 = 1
    t2 = 2
    t3 = 3
    t4 = 5

    dann ist das einfach so:
    Code:
     int compIterative(int i) {
     if (i < 2)
     return 1;
     
     int a1 = 1, a2 = 1, ergebnis = 0, zeitpunkt = 2;
     
     while (zeitpunkt <= i)
     {
     ergebnis = a1 + a2;
     a2 = a1;
     a1 = ergebnis;
     
     zeitpunkt++;
     }
     
     return a1;
     }
    Also wo ist dein Problem genau?
     
  4. 12. Februar 2012
    AW: Hilfe zu einer Probeklausur

    danke ersteinmal für deine hilfe. das sieht echt top aus.

    also, wenn ich mir jetzt nochmal die zeilen so anschaue, erkenne ich die fibonaccifolge.
    mein problem ist es, dass ich einfach zu kompliziert denke :angry:

    muss da eher schritt für schritt an die aufgabe rangehen.
    hab jetzt mal die 3b versucht:

    eigentlich müsste ich folgendes nur noch hinzufügen

    Code:
    
    a2=0;
    
    zeitpunkt=0;
    
    do{
     while (zeitpunkt <= i)
     {
     ergebnis = a1 + a2;
     a2 = a1;
     a1 = ergebnis;
     
     zeitpunkt++;
     }
     
     return a1;
     } while (zeitpunkt <= i) 

    wäre das so in ordnung?
     
  5. 12. Februar 2012
    AW: Hilfe zu einer Probeklausur

    mit do while eher so:

    Code:
     int compIterative2(int i) {
     if (i < 2)
     return 1;
     
     int a1 = 1, a2 = 1, ergebnis = 0, zeitpunkt = 2;
     
     do{
    
     
     ergebnis = a1 + a2;
     a2 = a1;
     a1 = ergebnis;
     
     zeitpunkt++;
     }while(zeitpunkt <= i);
     
     return a1;
     }
     
  6. 12. Februar 2012
    AW: Hilfe zu einer Probeklausur

    Nein, das ist so leider nicht in Ordnung.

    Was ist der Initialwert von a1 bei dir ? Der scheint nirgendwo angegeben zu sein.
    Den rot markierten Teil musst du auch unbedingt verstehen. Du willst eigentlich "do {...} while (...) benutzen, aber benutz innerhalb dieses do-while eine while-Schleife. Nach deiner while-Schleife innerhalb des do-while benutzt du ein "return a1;". Nach einem return ist die Methode logischerweise sowieso zu Ende und die Bedingung vom do-while wird nie überprüft. Mit anderen Worten: Völlig falsche Verwendung von do-while oder du hast do-while noch gar nicht verstanden.
     
  7. 12. Februar 2012
    AW: Hilfe zu einer Probeklausur

    ok danke.
    also aufgabe 3 habe ich jetzt verstanden. muss mir da glaube ich ersteinmal bisschen zeit nehmen in der klausur und die aufgabenstellung aufschreiben, denn das programm an sich scheint ja echt simpel zu sein.

    aufgabe 4a:

    gut, wenn eine Summe vorkommt, habe ich gelernt, dass man eine for-schleife verwenden soll.
    hab mir mal angeguckt, wie man die formel interpretieren muss und mal ein beispiel dazu gerechnet:

    Dezimal -> Oktal : 125(8) = 1·8^2+2·8^1+5·8^0 = 85(10) //die zahlen in den runden klammern ist der index

    Oktal -> Dezimal : 85 : 8 = 10 Rest 5
    10 : 8 = 1 Rest 2
    1: 8 = 0 Rest 1
    85(10) = 125(8)

    also müsste ich jetzt eine laufvariable programmieren, die von 8 runter bis 0 oder umgekehrt läuft mit der for-schleife oder?

    Code:
    public int convertOktoToEuro(String octal)
     {int n = 0;
     for (int i=okt.length()-1; i>=0;i--)
     
     
    
    jetzt weiß ich nicht mehr weiter...



    edit:

    @mortuus:

    ja, hab mir die do-while schleife nochmal angeschaut und das war echt dumm von mir beim post. jetzt wo ich die bedingungen und den aufbau der do-while schleife angeguckt habe, verstehe ich es mit dem startwert, abbruchbedingung usw.
     
  8. 12. Februar 2012
    AW: Hilfe zu einer Probeklausur

    Wenn eure richtige Klausur auch so schwer wird, dann musst du wohl noch viel üben.

    Code:
     int convertOktoToEuro(String oktal) {
    
     int temp = 0, ergebnis = 0;
    
     for (int i = (oktal.length() - 1), j = 0; i >= 0; i--, j++) {
     temp = Integer.valueOf(oktal.substring(j, j + 1));
    
     if (temp > 7) {
     System.out.println("Falsche Oktalzahl");
     return 0;
     }
    
     ergebnis += temp * Math.pow((double) 8, (double) i);
     }
    
     return ergebnis;
     }
     
  9. 12. Februar 2012
    AW: Hilfe zu einer Probeklausur

    Finde die Aufgaben auch ziemlich schwer für einen Anfängerkurs...

    Aufgabe 1 und 2 waren zwar relativ einfach, weil man dort nur wissen wiedergibt, ohne Programmierung, aber 3 und 4 sind schon was anderes...
    Könntest du dein Programm kommentieren, besonders die schleife bitte.

    Könnte mir gut vorstellen, dass diese Aufgabe so ähnlich vorkommt, nämlich das ganze umgekehrt umgewandelt.
     
  10. 12. Februar 2012
    AW: Hilfe zu einer Probeklausur

    Benutze den Debugger einer IDE (Netbeans ist komfortabel). Setzt ein Breakpoint in die Schleife und "step over". Dadurch siehst du den Inhalt der Variablen und so versteht man es am besten.

    Du bist doch dann sicher nicht der einzige der Probleme damit hat. Macht halt Lerngruppen und bringt es euch gegenseitig bei.

    Hier hast noch die Lösung der letzten Funktion:

    Code:
    String convertEuroToOkto(int decimal) {
     String ergebnis = "", reverse = "";
     int rest = 0;
     
     do { 
     rest = decimal % 8;
     
     ergebnis += String.valueOf(rest);
     
     decimal /= 8;
     } while(decimal > 0);
     
     for (int i = (ergebnis.length() - 1); i >= 0;i--)
     {
     reverse += ergebnis.substring(i, i+1);
     }
     
     return reverse;
     }
     
  11. 12. Februar 2012
    AW: Hilfe zu einer Probeklausur

    Ich versuchs dir einfach mal zu erklären was der Code von N0S macht.

    Beispiel ist für den ersten Durchlauf ich denke der zweite usw. wird dadurch auch klar.

    Nimm einfach mal an du gibts als Oktalstring "56" ein.

    Code:
     
     for (int i = (oktal.length() - 1), j = 0; i >= 0; i--, j++) 
    Zwei Werte werden initialisiert. i ist gleich die Länge des Oktal Strings - 1, also 2-1 = 1. Wenn ein String 2 Zeichen groß ist, dann sind diese durchnummeriert mit 0-1, daher das - 1. j ist = 0. Die Schleife bricht ab, wenn i nicht mehr >=0 ist und nach jedem Durchlauf wird i um eins verringert und j um eins erhöht. D.h. also beim ersten Mal ist i = 1, beim zweiten mal i = 0 und danach wäre i = -1 und dadurch wird die Schleife nicht mehr ausgeführt. Bedeutet also wir gehen so oft durch die Schleife, wie es Ziffern in der Oktalzahl gibt.


    Code:
     
     temp = Integer.valueOf(oktal.substring(j, j + 1));
    
     if (temp > 7) {
     System.out.println("Falsche Oktalzahl");
     return 0;
     }
    
    Der substring von oktal ist einfach die erste Stelle des Oktalstrings, sprich von 0 bis 1, was nur dem allersten Zeichen entspricht, also an der Stelle 0. Das ganze wird dann einfach als Integer gecastet durch die Integer.valueOf(String) Funktion. D.h. temp = 5

    Die if-Abfrage dient einfach dazu zu überprüfen, dass keine Zahlen mit Ziffern > 7 eingegeben werden, da Oktal nur von 0-7 geht.


    Code:
     
    
     ergebnis += temp * Math.pow((double) 8, (double) i);
    
    Die Ergebnisse werden immer aufaddiert. Das weiß man schon dadurch, dass du eine Summenformel benutzen sollst ;-). temp ist die Oktalziffer diese wird multipliziert mit 8^i. Wir sind an der ersten Stelle des Oktalstrings und der Oktalstring ist 2 Zeichen groß, also ist dass der 8^1 Bereich. Also nimmst du die Ziffer (temp) 5 und multiplizierst diese mit 8^1. Beim zweiten Durchgang wird dann 6 * 8^0 herauskommen.

    EDIT: Nochmal zur Verdeutlichung: i ist also für den Durchlauf der Potenzen und fängt deswegen von "Größe des Strings -1" an und j um die Ziffern aus dem String zu bekommen und fängt daher bei 0 an, also bei der Ziffer die ganz links steht.
     
  12. 13. Februar 2012
    AW: Hilfe zu einer Probeklausur

    wow,
    besser hätte man es nicht erklären können!bw habt ihr beide schon bekommen! wenn ich mir das jetzt so durchlese, dann verstehe ich den durchlauf sofort, aber es direkt so perfekt zu implementieren, hätte ich nicht geschafft.

    werd mir ein paar ähnliche aufgaben dazu suchen und es dann selbst ausprobieren.

    fehlt nur noch die 4c.
     
  13. 13. Februar 2012
    AW: Hilfe zu einer Probeklausur

    mhh aber das is doch jetzt lediglich das einlesen von der Tastatur und zwei drei mal System.out.println() ?!

    Mich verwirrte eher die Summenformel oben, da die Summenformel von i=n bis 0 (null) läuft, und nicht bis O ?
    Denn Summenformeln kenn ich ehrlich gesagt nie mit abfallenden Indiezies, was ja auch iwie quark wäre weil dann die Limes Hauptintension verloren geht.

    Aber egal..

    Code:
    InputStreamReader isr = new InputStreamReader(System.in); 
    BufferedReader br = new BufferedReader(isr); 
    System.out.print("Gib was ein: "); 
    String eingabe = br.readLine();
    
    System.out.println(convertOktoToEuro(eingabe));
    System.out.println(convertEuroToOkto(20));
    
     
  14. 29. März 2012
    AW: Hilfe zu einer Probeklausur

    ich bins nochmal

    hab eine weitere aufgabe, und zwar möchte ich nun dezimal in hexadezimal und umgekehrt programmieren.

    da hab ich bisher folgendes:

    Code:
    import java.util.Scanner;
     public class hexazahlen {
     
     /**
     * @param args
     */
     
     public static void main(String[] args) {
     // TODO Auto-generated method stub
     Scanner tastatur; //Scanner
     tastatur = new Scanner(System.in); 
     int dezimale;
     System.out.print("Bitte geben sie eine Zahl von 0-255 ein: ");
     dezimale=tastatur.nextInt();
     int restx = dezimale/16; //Berechnung der Hexazahl 
     int reste = dezimale%16; //Berechnung der Hexazahl 
     if(dezimale <10){
     System.out.print("Ihre Zahl ist im Hexadezimalsystem: " +dezimale);
     }
     if(dezimale >9 & dezimale <16){
     switch (dezimale)
     {
     case 10:
     System.out.print("Ihre Zahl ist als Hexadezimale: A");
     break;
     case 11:
     System.out.print("Ihre Zahl ist als Hexadezimale: B");
     break;
     case 12:
     System.out.print("Ihre Zahl ist als Hexadezimale: C");
     break;
     case 13:
     System.out.print("Ihre Zahl ist als Hexadezimale: D");
     break;
     case 14:
     System.out.print("Ihre Zahl ist als Hexadezimale: E");
     break;
     case 15:
     System.out.print("Ihre Zahl ist als Hexadezimale: F");
     }
     }
     if(dezimale >15){
     if(restx >9 & restx <16) {
     switch (restx)
     {
     case 10:
     System.out.print("Ihre Zahl ist als Hexadezimale: A");
     break;
     case 11:
     System.out.print("Ihre Zahl ist als Hexadezimale: B");
     break;
     case 12:
     System.out.print("Ihre Zahl ist als Hexadezimale: C");
     break;
     case 13:
     System.out.print("Ihre Zahl ist als Hexadezimale: D");
     break;
     case 14:
     System.out.print("Ihre Zahl ist als Hexadezimale: E");
     break;
     case 15:
     System.out.print("Ihre Zahl ist als Hexadezimale: F");
     }
     
     }
     else{
     System.out.print("Ihre Zahl ist im hexadezimalsystem: "+restx); 
     
     }
     if(reste >9 & reste <16){
     switch (reste)
     {
     case 10:
     System.out.print("A"); 
     break;
     case 11:
     System.out.print("B");
     break;
     case 12:
     System.out.print("C");
     break;
     case 13:
     System.out.print("D");
     break;
     case 14:
     System.out.print("E");
     break;
     case 15:
     System.out.print("F");
     }
     }
     else{
     System.out.print(+reste);
     
     }
     }
     } 
    }
    also in der klausur denke ich, dass solche spielereien mit tastatureingabe nicht vorkommen brauchen. auch die main methode wird denke ich nicht gebraucht.
    ist bisschen lang geworden mit dem case und break, aber weiß nicht genau wie ich es anders machen soll...
     
  15. 29. März 2012
    AW: Hilfe zu einer Probeklausur

    Du kannst doch sowohl bei der Eingabe als auch bei der Ausgabe Direkt HEX oder Dezimal einlesen/ausgeben:
    (Pseudocode bzw. ungetestet)
    Code:
    int dec,hex;
    Scanner scan = new Scanner(System.in);
    System.out.print("Bitte geben Sie eine Dezimalzahl eine");
    dec = scan.nextInt();
    System.out.print("Bitte geben Sie eine Hexadezimalzahl eine");
    hex = scan.nextInt(16);
    System.out.printf("Ihre Dezimalzahl war: %i\nIhre Hexadezimalzahl war: %X", dec,hex);
    Du kannst eine Zahl immer in einem Zahlsystem mit einer anderen Basis darstellen.
     
  16. 29. März 2012
    AW: Hilfe zu einer Probeklausur

    Um dir die 700 Cases zu sparen kannst du z.B. die "Zeichen", die deine Zahl beinhaltet in nen Array schreiben
    Code:
    char[] bla = {0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F}
    hinterher kannste mit
    Code:
    system.out.println("Zahl in Hex ist:" + bla[restx]+bla[reste]);
    die Hexzahl Printen.

    Wenn du die führende 0 nicht haben willst kannste ja noch mit nem if arbeiten (if restx==0) und in dem println das bla[restx] weglassen

    Edit: Du solltest checken, ob der Int wirklich zwischen 0 und 255 ist. SOnst kriegste mit meiner Lösung ne Exception (mit deiner Lösung Quark^^)

    Edit: Noch nen Edit: Wenn du zwei Boolesche Werte verunden willst solltest du && benutzen. & arbeitet auf Bits. Ist in dem Fall wohl auch richtig, aber mit && ists "richtiger" und auch effizienter. Wenn du nämlich 2 Bedingungen hast (x<7 && y>9), dann checkt er das y>9 NUR, falls x<7 True liefert, da ansonsten das && in jedem Fall False ist, egal, was y>9 ergibt.

    [Ewig kein Java mehr gemacht also nur Pseudocode, welcher evtl sogar funktioniert xD]

    @MJ ich glaube es ging nicht darum eine Hex-Zahl einzulesen oder sie mit nem printf auszugeben, sondern eine Zahl per Hand umzurechnen.

    Edit:
    Weil du Programmieranfänger bist und es mithilfe eines einfachen Algorythmus lernen sollst.
    Genausogut könnte er auch die Fakultät implementieren. Gibts schon vordefiniert, also warum neu schreiben? Richtig: Weils Easy ist und man so programmieren lernt.
     
  17. 29. März 2012
    AW: Hilfe zu einer Probeklausur

    Das macht aber keinen Sinn. Hexzahlen sind gewöhnliche Interger. Wiese sollte ich diese "Per Hand" umrechnen. Ich kann sie via printf direkt als hex ausgeben. Eine solche Aufgabe wäre Stumpfsinnig. Sowas macht man in Mathe wenn man andere Zahlensysteme durchnimmt aber doch nicht in Info. Ohne Klare Aufgabenstellung ist das jedoch alles nur Spekulation.
     
  18. 29. März 2012
    AW: Hilfe zu einer Probeklausur

    danke für eure antworten.

    ich soll es anhand einer formel, so ähnlich wie in den aufgaben oben umformen. fertige befehle werden wahrscheinlich nicht benotet, da nach vorgabe programmiert werden soll...
    werde mal bisschen ausprobieren:]

    edit:

    habs jetzt nochmal ausprobiert und folgendes raus und es klappt

    Code:
    
    public class neu {
    
     /**
     * @param args
     */
     public static void main(String[] args) {
     // TODO Auto-generated method stub
     
     int zahl = 100;
     String hexazahl="";
     
     
     
     do { 
     if ((zahl%16)< 10) { hexazahl = zahl%16 + hexazahl; }
     if ((zahl%16)==10) { hexazahl = "A" + hexazahl; } 
     if ((zahl%16)==11) { hexazahl = "B" + hexazahl; } 
     if ((zahl%16)==12) { hexazahl = "C" + hexazahl; } 
     if ((zahl%16)==13) { hexazahl = "D" + hexazahl; } 
     if ((zahl%16)==14) { hexazahl = "E" + hexazahl; } 
     if ((zahl%16)==15) { hexazahl = "F" + hexazahl; }
     zahl = zahl/16; 
     } while (zahl > 0);
     
     System.out.println(hexazahl);
     
    
     }
    
    }
    
    umgekehrt muss ich mal schauen wie ich es mache!
     
  19. 30. März 2012
    AW: Hilfe zu einer Probeklausur

    vllt hilft dir ja das hier:
    Umrechnung von Zahlensystemen

    da gibste werte ein und du kannst dir genau angucken wie man das algorithmisch lösen könnte.
    das musste dann nurnoch nett implementieren und fertig^^
     
  20. 30. März 2012
    AW: Hilfe zu einer Probeklausur

    das ist gut erklärt auf der seite, aber wie man es errechnet weiß ich schon

    habe hier mal den code, der das (hoffentlich) umsetzt:

    Code:
     for (int i=0;i<myZahlDezimal.length; i++){ 
     summe += myZahlDezimal[i] * Math.pow(16, myZahlDezimal.length-1-i);
    das ist glaube ich schonmal richtig. jetzt muss ich nur noch wissen, wie ich von links nach rechts bei der zahleneingabe dem programm mitteile, dass bestimmte buchstaben für bestimme zahlen stehen.
     
  21. 30. März 2012
    AW: Hilfe zu einer Probeklausur

    Ich nehme an du hast nen String "5A". Diesen kannst du in ein Char-Array umwandeln mit .toCharArray() oder so glaube ich. Auf dem Ergebnisarray kannste dann mit ner For-Schleife alle Zeichen einzeln lesen und dann in "myZahlDezimal" reinschreiben.

    Umrechnen eines Zeichens in den Zahlenwert kannst du z.B mithilfe eines switch (oder wieder 7 ifs^^).
    Code:
    switch(zeichen){
    case '1': wert=1;
     break;
    ...
    case 'A': wert=10;
     break;
    case 'B': wert=11;
    ...
    }
    
    Würds dann als Methode auslagern, damit du den Code nicht an 3 Stellen kopieren musst. Dann kannste statt der Wertzuweisung zu der Variable (wert=42) auch ein return benutzen, dann kannste die breaks sparen^^

    Ne andere Möglichkeit wäre den Ascii-Value des Zeichens zu nehmen.
    Code:
    char zeichen='A';
    int charwert=(int) zeichen;
    int ergebnis;
    if (charwert > 47 && charwert < 58){
     ergebnis = charwert - 48
    } else {
     ergebnis = charwert - 55
    }
    
    Siehe: ASCII-Tabelle


    Auch hier wieder keine Garantie auf Syntax.

    Edit: Auch deinen Code für dec->hex kannste mit nem switch schöner (und effizienter) machen, als mit den 7 ifs Einfach die Werte 11-15 abfragen mit cases und default dahinter für "ansonsten". Da machste dann was du in deiner ersten if machst.
     
  22. 31. März 2012
    AW: Hilfe zu einer Probeklausur

    danke für deine tipps! sieht schon ziemlich gut aus.
    kann man aber die switch oder die if-abfragen nicht irgendwie durch einen code ersetzen, der das alles kürzt?
     
  23. 31. März 2012
    AW: Hilfe zu einer Probeklausur

    So in die eine Richtung:
    Code:
    char[] bla = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}
    system.out.println("Zahl in Hex ist:" + bla[restx]+bla[reste]);
    Und so in die andere:
    Code:
    char zeichen='A';
    int charwert=(int) zeichen;
    int ergebnis;
    if (charwert > 47 && charwert < 58){
     ergebnis = charwert - 48
    } else {
     ergebnis = charwert - 55
    }
    Glaube viel kürzer kann man das Problem nicht lösen

    Edit: Evtl kann man die erste Lösung nutzen (also das Char-Array) und mit ner Suche arbeiten. Weiss da grad nicht die Funktionen, da ich wie erwähnt lang kein Java mehr gemacht hab.
    Prinzipiell würds aber so laufen, dass du im Array z.b. nach 'A' suchst, er dir dann sagt, das steht an Position 10 -> Was ja der entsprechende Zahlenwert ist, mit dem du dann weiterarbeiten kannst. Allerdings ist das dann eher ineffizient, weil du bei jedem Zugriff ne Suche auf dem Array machen musst. Da ist die Lösung mit dem Ascii-Wert wohl schneller.
     
  24. 31. März 2012
    AW: Hilfe zu einer Probeklausur

    die array abfrage ist gut! ist mir irgendwie nicht eingefallen, weil die buchstaben mich verwirrt haben. werd das damit mal probieren! es muss einfach nur richtig sein! und kurz wäre am besten, da ich in der klausur alles auf papier schreiben muss, deswegen suche ich die kürzesten wege
     
  25. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.