Java Übung (TeilSumme, ISBN berechnen, Nullstellen quadratischer Gleichung bestimmen)

SuGaaaR

Grünschnabel
Hallo,
Ich bin Informatik-Student im 1. Semester und lerne in Java zu programmieren. Habe eine Übungsaufgabe bei der ich ein paar Probleme habe. Wäre um Hilfestellungen und Lösungsvorschläge dankbar.

Habe meine Übungsaufgabe als .pdf hochgeladen.

Die erste Aufgabe ist noch relativ leicht und diese habe ich bereit so gelöst:

Java:
import java.lang.Math;
import de.htw.saarland.stl.Stdin;

/**
* Eine Klasse die die Teilersumme einer natürlichen Zahl berechnet.
*
* @author (-----)
* @version (1.0 - 17.11.14)
*/

public class teilersumme
{
   
    /**
     * Funktion zur berechnung der Teilersumme
     * @param teilernummer
     */
  
    public static int TeilerNummer(int teilernummer)
    {
        int summe = 0;                             //Variable summe
       
    /**
     * Vorschleife zur berechnung der Teilersumme mit mod 2
     * @param i
     * if Bedingung zur Überprüfung der zahl ob sie eine Teilersummme ist
     * @return summe Ausgabe der Summe
     */
   
        for(int i = 1; i <= teilernummer; i++)
        {
            if(teilernummer % i==0)
            {
                summe = summe + i;
            }
        }
        return summe;
    }
   
    /**
     * Eine Main Methode zum starten des Programmes
     * variable zahl, kann hier eingegeben werden
     * Eingegebene Zahl wird von der Funktion übernommen
     * "Teilernummer(zahl)"
     * @param String [] args
     */
   
    public static void main(String [] args)
    {
       int zahl = 0;
       zahl = Stdin.readlnInt(" Zahl eingeben = ");
       
       System.out.println("TeilerSumme = " + TeilerNummer(zahl));   
    }
}



Vorab schonmal vielen dank für die Hilfe und denkt dran, ich bin hier neu und unerfahren.
:)
 

Anhänge

  • ueb03.pdf
    375,8 KB · Aufrufe: 28

sheel

I love Asm
Wenn du wissen willst, was man im ersten Code besser machen könnte etc.:
Schaut für mich schon sehr gut aus.
Nur bei den Kommentaren fehlen mir die Parametererklärungen,
und die Version fast ganz oben darf nicht so ein Format haben.

Für den Rest wirst du wohl keinen finden, der dir die Hausübung macht.
Das ist deine, bei der du was lernen sollst.
 

SuGaaaR

Grünschnabel
Danke für die Antwort.
Ich wollte nicht das mir jemand die Aufgabe vorkaut, sollte nicht falsch verstanden werden^^ aber das war leider mein Formulierungsfehler.
So habe mittlerweile die Aufgabe fertig, aber ich finde das mein Code nicht ganz so gut ist und noch verbessert werden kann... aber für heute ist für mich schluss und werde mich morgen der Aufgabe weiter widmen.


Hier die 2. Aufgabe mit der ISBN Prüfnummer (noch ohne Kommentare und alles)
Java:
import de.htw.saarland.stl.*;
/**
* Beschreiben Sie hier die Klasse ISBN.
*
* @author (Ihr Name)
* @version (eine Versionsnummer oder ein Datum)
*/
public class ISBN
{
   public void einlesen()
   {
       final int a = 0;

     int zahl1 = Stdin.readInt("\nZahl eingeben ");
            assert zahl1 >= a
       :"daf nicht kleiner 0 sein";
     int zahl2 = Stdin.readInt("Zahl eingeben");
           assert zahl2 >= a
       :"daf nicht kleiner 0 sein";
     int zahl3 = Stdin.readInt("Zahl eingeben");
            assert zahl3 >= a
       :"daf nicht kleiner 0 sein";
     int zahl4 = Stdin.readInt("Zahl eingeben");
            assert zahl4 >= a
       :"daf nicht kleiner 0 sein";
     int zahl5 = Stdin.readInt("Zahl eingeben");
            assert zahl5 >= a
       :"daf nicht kleiner 0 sein";
     int zahl6 = Stdin.readInt("Zahl eingeben");
            assert zahl6 >= a
       :"daf nicht kleiner 0 sein";
     int zahl7 = Stdin.readInt("Zahl eingeben");
            assert zahl7 >= a
       :"daf nicht kleiner 0 sein";
     int zahl8 = Stdin.readInt("Zahl eingeben");
            assert zahl8 >= a
       :"daf nicht kleiner 0 sein";
     int zahl9 = Stdin.readInt("Zahl eingeben");
            assert zahl9 >= a
       :"daf nicht kleiner 0 sein";
   
    int einlesen = (zahl1 * 1) + (zahl2 * 2) + (zahl3 * 3) + (zahl4 * 4) + (zahl5 * 5)+
    (zahl6 * 6) + (zahl7 * 7) + (zahl8 * 8) +(zahl9 * 9);
     
    if(einlesen %11 == 0)
    {
        System.out.print( einlesen +":" + zahl1 + "-" + zahl2 + "-"+ zahl3 + "-" +zahl4 + "-"
        +zahl5+ "-" +zahl6+ "-" +zahl7+ "-" +zahl8+ "-" +zahl9+ "-X");
    }
    else
    {
        System.out.print("ISBN-Nr falsch");
    }
   
  
}

    public static void main(String[] ags)
    {
    new ISBN().einlesen();  
    }
}

Also was ich verbessern möchte, aber nicht weiß wie ist, dass die ISBN nummer auf einmal eingegeben werden kann, und nicht zahl <enter> zahl <enter> .. usw
.......sonst wenn ihr noch schönheitsfehler findet, wäre ich schonmal dankbar und wüsste gerne was ihr so davon haltet oder wo es einfacher oder besser geht.



so jetzt zur 3. Aufgabe (da bin ich mir relativ unsicher ob das überhaupt stimmt was ich da gemacht habe....)

Java:
import  de.htw.saarland.stl.*;
import static java.lang.Math.*;
/**
* Beschreiben Sie hier die Klasse Quadratische_Gleichung.
*
* @author (Ihr Name)
* @version (eine Versionsnummer oder ein Datum)
*/
public class Quadratische_Gleichung
{


    public void einlesen()
    {
        double a = Stdin.readInt("\n a = zahl eingeben: ");

        double b = Stdin.readInt("\n b = zahl eingeben: ");

        double c = Stdin.readInt("\n c = zahl eingeben: ");
  
      
        final double D = (b * b)-1*(4*a*c);
      
        double summe1 = ((-1*(b) + sqrt(D)) / (2*a));
        double summe2 = ((-1*(b) - sqrt(D)) / (2*a));
      
        if(D > 0)
        {
            System.out.print("2 Nullestellen: " + summe1+ " und " +summe2+ ".");
        }
        else if(D == 0)
        {
            System.out.print(" 1 Doppelte Nullstell: " + summe1+ " und " +summe2+ ".");
        }
        else if(D <0)
        {
            System.out.print(" 2 komplexe Nullstellen: " + summe1+ " und " +summe2+ ".");
        }
      
    }
  
    public static void main(String[] ags)
    {
     new Quadratische_Gleichung().einlesen();
    }
}


So ich danke für die Zeit und Mühe und hoffe auf ein bisschen Kritik oder Hilfe...
Vielen Dank für Antworten :)
 

sheel

I love Asm
Und beim "String[] ags" kann man die Variable zwar nennen, wie man will, aber üblich ist args :)

...Bei den zwei Programmen hab ich einiges "auszusetzen", geht nur grad nicht. Später.
 

SuGaaaR

Grünschnabel
Moin moin,
okay, schonmal danke.. Ich habe später nochmal Zeit meine Programme zu überarbeiten,
ich schaue nachher nochmal rein :) und hoffe ihr könnt mir ein paar verbesserungen anbieten
 

sheel

I love Asm
Zuerst noch einmal zum ersten Programm, nachdem ich die Angabe endlich gründlich gelesen hab:
a) Das sollen zwei getrennte Klassen werden. zB. "Dialog" und "Berechnung".
b) Die Methode teilersumme soll vermutlich nicht static sein (im main dann zuerst mit
new ein Objekt von Berechnung erzeugen, um die Methode zu verwenden).


Programm 2 (ISBN):

Im Main könnte hier eine Auswahl nach Zahlen Sinn machen, also "Geben sie 1 ein,
um eine Teilersumme zu berechnen" usw. (es soll ja alles ein Programm werden).
Und in der Berechnung-Klasse einrach eine weitere Methode, unabhängig von teilersumme,
für die ISBN-Berechnung. Soll ein long als Parameter bekommen und die Prüfziffer
als String zurückgeben.

Das Einlesen ist etwas durcheinander, wie du ja selber sagst.
Einerseits die Sache mit den Einzeleingaben, andererseits das assert, das nicht für eine
derartige Verwendung gedacht ist. Die ganze Nummer soll auch laut Angabe in ein einzelnes
Long eingelesen werden. Da die "Stdin"-Klasse eurer Uni wohl nicht richtig funktioniert,
hier eine Standard-Java-Lösung:
Java:
import java.util.Scanner;
...
Scanner sc = new Scanner(System.in);
long input;
boolean valid;
...
do {
    valid = true;
    try {
        System.out.println("Bitte ISBN ohne Prüfziffer eingeben:");
        input = sc.nextLong();
        if(input < 0 || input > 999999999) throw new Exception();
    } catch (Exception) {
        System.out.println("Ungültig");
        valid = false;
    }
} while(!valid);
Schaut etwas kompliziert aus, aber das Meiste ist nur, um zu prüfen,
dass die Eingabe eine Zahl und max. 9-stellig ist.

Zur Berechnung bzw. dem Inhalt der gesuchten Methode:
Du machst da genau das Gegenteil vom Gesuchten. Die Prüfziffer soll Berechnet werden,
du prüfst die (noch nicht eingegebene) Prüfziffer, ob sie gültig ist.
Folgendes schaut als Idee schon gut aus:
Java:
(zahl1 * 1) + (zahl2 * 2) + (zahl3 * 3) + (zahl4 * 4) + (zahl5 * 5)+
    (zahl6 * 6) + (zahl7 * 7) + (zahl8 * 8) + (zahl9 * 9);
nur dass das Ergebnis long (statt int) sein soll und ja keine einzelnen Variablen
wie zahl1 vorhanden sind. Idee zur Extrahierung der Ziffern:
Wenn die eingelesene long-Variable isbn heißt und man die vierte Ziffer
(von rechts, also die Tausenderstelle) will: (isbn/1000)%10
Das Ganze kann man auch schön in eine Schleife packen...

Wenn man diese Summe dann hat, modulo 11 rechnen wie schon gemacht.
Wenn 10 herauskommt "X" mit return zurückgeben, sonst eben "1", "2" oder so.
Um die int- oder long-Variable stelle einfach in einen String umzuwandeln:
Java:
return(""+stelle);


Programm 3, Nullstellen einer quadratischen Gleichung:

Muss wieder in Eingabeteil im main und Berechnung in
einer abgetrennten Methode aufgeteilt werden.

Bei den drei Variablen a,b,c willst du Kommazahlen (double), verwendest aber ein
readInt zum Einlesen. Passt nicht ganz zusammen so. Die Einlessache mit dem Scanner
von oben kann man auch leicht für double verwenden:
Java:
import java.util.Scanner;
...
Scanner sc = new Scanner(System.in);
double a,b,c;
boolean valid;
...
do {
    valid = true;
    try {
        System.out.println("Bitte a eingeben:");
        a = sc.nextDouble();
    } catch (Exception) {
        System.out.println("Ungültig");
        valid = false;
    }
} while(!valid);
Wenn das dreifach zu hässlich ist kann man den Block auch in
eine Methode auslagern und ebene dreimal aufrufen...

Der Rest schaut gut aus.
 
Zuletzt bearbeitet: