Zum Inhalt springen

Java-Anfänger: Spassproblem "Silben mischen"


Empfohlene Beiträge

Geschrieben

Hallo.

Ich möchte mich mehr mit Java beschäftigen, rein privat erstmal, keine Schulaufgabe oder ähnliches.

Als erstes Lern-/Spassprogramm habe ich mir "Silben mischen" ausgedacht, dass soll (z.B.) _alle_ möglichen Kombinationen von 5 Silben (z.B.) AA, BB, CC, DD, EE ausgeben, wobei jede Silbe maximal einmal (oder gar nicht) verwendet werden darf.

Möglich ist also

- DDBBCC (nur drei Silben benutzt)

- EEAABBCCDD

nicht aber: AADDAACC (Silbe AA doppelt verwendet)

Ich brauche also ein Array von Strings, in die ich die Silben einlese und ein Array von Flags, wo ich abspeichere "Silbe1 bereits verwendet ja/nein, Silbe2 bereits verwendet ja/nein".

Bloss: wie formuliere ich die Methode?

Oder habe ich bereits einen Denkfehler bis hier?

Spass: Nein, ich werde das Programm nicht benutzen, um festzulegen, wie ich im Superwahljahr 2009 abstimme.

Danke

Geschrieben

Ich brauche also ein Array von Strings, in die ich die Silben einlese und ein Array von Flags, wo ich abspeichere "Silbe1 bereits verwendet ja/nein, Silbe2 bereits verwendet ja/nein".

Nein das brauchst Du nicht. Einfacheres Bsp Du willst die Buchstaben A B C kombinieren. Damit hast Du 2^n => 2^3 = 8 Möglichkeiten. Dazu kommen dann noch 3!, nämlich diese in der Du je die einen Buchstaben weglässt

(3! = 3 Fakultät = 3 * 2 * 1 = 6):

D.h. für n Zeichen hast Du 2^n + n! Kombinationen. Ob wir das nun für Zeichen oder bei Dir eben für Silben machen, ist relativ egal. Wir sagen einfach, dass Du n Elemente hast.

Bloss: wie formuliere ich die Methode?

Oder habe ich bereits einen Denkfehler bis hier?

Du brauchst dafür keine Methode. Du kannst alles in Deine main-Methode rein schreiben. Du musst Dir nun überlegen wie Du eben die 2^n Kombinationen ermittelst und wie Du die n! Kombinationen ermittelst. Das geht mit Schleifen, in denen Du die Elemente entsprechend durchläufst.

Die Idee mit dem Array ist gut, denn darin kannst Du Deine Elemente ablegen

Viel Spaß dabei

Phil

Geschrieben
Nein das brauchst Du nicht. Einfacheres Bsp Du willst die Buchstaben A B C kombinieren. Damit hast Du 2^n => 2^3 = 8 Möglichkeiten. Dazu kommen dann noch 3!, nämlich diese in der Du je die einen Buchstaben weglässt

Danke erstmal

Hmmm. mal gucken:

ABC + ACB + BAC + BCA + CAB + CBA = 6 drei"silbige" Möglichkeiten

AB + AC + BA + BC + CA + CB = 6 zwei"silbige" Möglichkeiten

A + B + C = 3 ein"silbige" Möglichkeiten

Macht zusammen 15, oder?

Ich würde als drei Schleifen programmieren, abgestuft nach Silbenzahl, oder? Davon die erste mit zwei inneren Schleifen, und die zweite mit einer inneren Schleife?

Scheint mir irgendwie wenig objektorientiert, oder habe ich da einen Denkfehler?

Geschrieben

Sorry hatte mich vertan, ich war im Dualsystem im Kopf, bei 3 Bits hab ich 2^3 Möglichkeiten.

Also bei n Elementen hast Du n! Möglichkeiten diese zu kombinieren.

Da aber Deine Elemente Gruppierungen aus sich selbst sind, hast Du für ein silbige Mengen n Kombinationen und (m-1)*n! für alle anderen mehrsilbigen Mengen. Damit hast n + (m-1)*n! Möglichkeiten wobei n die Anzahl Deiner "Buchstaben" und m die Anzahl Deiner Silben sind.

In Deinem Fall n = 4 (A B C D) und m = 2 (für AA, BB, CC, DD) => 4 + 1*4! = 4 + 24 = 28 Kombinationen.

Man kann das prozedural oder auch mit der OOP lösen. Wenn Du mit Objekten arbeitest, dann musst Du Dir dafür ein Konzept überlegen. Ich würde das eher mathematisch motiviert und unabhängig von den Daten programmieren.

Phil

Geschrieben
Man kann das prozedural oder auch mit der OOP lösen. Wenn Du mit Objekten arbeitest, dann musst Du Dir dafür ein Konzept überlegen. Ich würde das eher mathematisch motiviert und unabhängig von den Daten programmieren.

Ähm, *nixblick* kannst Du das bite mit Code-Beispielen nochmal erklären? Bin Java-Neuling

Geschrieben
Ähm, *nixblick* kannst Du das bite mit Code-Beispielen nochmal erklären? Bin Java-Neuling

Wie wäre es, wenn Du zunächst es prozedural in der main-Methode löst und wenn das funktioniert gehst Du in das OOP Konzept.

Es bringt vom Lerneffekt nichts, wenn ich Dir hier meine Lösung präsentiere, Du muss sie gerade am Anfang selbst entwickeln

Phil

Geschrieben
Wie wäre es, wenn Du zunächst es prozedural in der main-Methode löst und wenn das funktioniert gehst Du in das OOP Konzept.

Das mit den drei For-Schleifen hintereinander (je nach Silbenzahl) ist doch prozedural, oder?

Wie soll das mit OOP gehen? <-- Das ist mein Frage.

Geschrieben
Wie ich es schon geschrieben hatte, in dem Du es abstrakter betrachtest, sprich nicht 2 silbige Elemente betrachtest, sondern Mengen von Elementen, die dann Deinen Kriterien entsprechend verarbeitet werden

Und wie geht das?

Geschrieben
Und wie geht das?

Es gibt für so etwas keine Step-by-Step Anleitung. Das muss man lernen. Man erzeugt entsprechend Klassen und deren Assoziationen bzw Ableitungen. Man bildet eben Strukturen aus der realen Welt in Quellcode ab. WIe der Quellcode später konkret aussieht ist dann von der Sprache abhängig, bei Java eben "class xyz {}", in der sich dann noch Eigenschaften und Methoden befinden.

Beispiele findest Du dazu in entsprechender Literatur.

Geschrieben
In Deinem Fall n = 4 (A B C D) und m = 2 (für AA, BB, CC, DD) => 4 + 1*4! = 4 + 24 = 28 Kombinationen.

Ich komme auf 33 Möglichkeiten, was mache ich falsch?

ABCD --- 1 viersilbiges Wort

ABC + ABD + ACB + ACD + BAC + BAD + BCA + BCD + CAB + CAD + CBA + CBD + DAB + DAC + DBA + DBC --- 16 dreisilbige Worte

AB + AC + AD + BA + BC + BD + CA + CB + CD + DA + DB + DC --- 12 einsilbige Worte

A + B + C + D --- 4 einsilbige Worte

Beispiele findest Du dazu in entsprechender Literatur.

Wenn Du der Meinung bist, dass Beispiele alles sind, warum schliesst Du nicht einfach diesen Forenbereich, Herr Moderator Java?

Geschrieben
Ich komme auf 33 Möglichkeiten, was mache ich falsch?

Es wäre hilfreich, wenn Du für Dein Problem, das nicht konsistent beschrieben ist, einen regulären Ausdruck bzw. einen allgemein gültigen Ausdruck. Ich kann nur nur hier mehr raten, wie das Aussehen soll. Am Anfang hast Du nur 2 Silben, mit denen Du arbeitest, nun hast Wörter. Wo ist dort der Zusammenhang?

Wenn Du der Meinung bist, dass Beispiele alles sind, warum schliesst Du nicht einfach diesen Forenbereich, Herr Moderator Java?

Ein Forum ist nicht dazu gedacht, dass man Dir hier Dir das komplette Konzept der OOP beibringt. Ich empfehle Dir das Buch Lehrbuch Grundlagen der Informatik von Helmut Balzert.

Geschrieben
Es wäre hilfreich, wenn Du für Dein Problem,..., einen regulären Ausdruck bzw. einen allgemein gültigen Ausdruck

specifikation"mischprogramm4"

begin

lese Textbausteine ein(); // ein Textbaustein bestehe hier aus einem Buchstaben A oder B oder C oder D - Erweiterbar auf weitere und mehrere Buchstaben aber einplanen

do while (noch nicht ALLE möglichen Kombinationen ausgegeben sind)

erzeuge silbe aus einbisvierTextbausteinen ohnedass ein Textbaustein innerhalb einer silbe mehrfach verwendet wird.

gebe silbe aus

done

endspecification

"Erlaubte" Ausgabemenge ist also mindestens (insgesamt)

ABCD + ABDC + ACBD + ....

ABC + ABD + ACB + ACD + BAC + BAD + BCA + BCD + CAB + CAD + CBA + CBD + DAB + DAC + DBA + DBC

AB + AC + AD + BA + BC + BD + CA + CB + CD + DA + DB + DC

A + B + C + D

"nicht erlaubte" Ausgabemenge ist also

ABBA // zwei Textbausteine ("A" und "B") doppelt verwendet

ADAC // ein Textbaustein "A" doppelt verwendet

BABBEL // mehr als vier Buchstaben und unerlaubte Textbausteine "E" und "L"

Ein Forum ist nicht dazu gedacht, dass man Dir hier Dir das komplette Konzept der OOP beibringt.

Was OOP ist, war nicht meine Frage. Meine Frage war, wie ich das konkrete Programm "Silben Mischen" mittels Methoden (d.h. ohne BASIC-artige FOR/NEXT-Schleifen umsetze). Dürf ruhig alles "public"-Aufrufe sein, Stil zählt nicht. Wenn Du das nicht kannst, dann heisst das nicht, dass ich mehr lesen muss - gibt ja noch andere Leute hier im Forum.

Geschrieben
Wenn Du das nicht kannst, dann heisst das nicht, dass ich mehr lesen muss - gibt ja noch andere Leute hier im Forum.

Es geht hier nicht darum ob er es kann oder nicht, man will hier eigeninitiative von den Nutzern sehen.

Dir wird zu einem bestimmten Problem geholfen und nich zu einem ganzen Programm...

Mach dir einfach mal selbst gedanken darueber warum und wie man dein Programm in Objekte einteilen kann / darf / sollte. Mal es auf, schreibs zusammen, stells hier rein...

Danach wird dir Phil, oder jemand anderes, bestimmt auch noch einmal etwas dazu sagen. Aber vorkauen wird dir hier sichlich niemand etwas.

Ted

Geschrieben

Wenn Du das nicht kannst, dann heisst das nicht, dass ich mehr lesen muss - gibt ja noch andere Leute hier im Forum.

Bevor Du mir unterstellst, dass ich das nicht kann, kannst Du gerne mal einen Blick auf meine Webseite oder auch mein Profil hier werfen. Dann wirst Du sehen, dass ich das kann. Im Gegensatz zu Dir bin ich kein Anfänger, ich erwarte Eigeninitiative.

Da es Dir aber wichtiger ist hier Leute "anzumachen", bekommst Du von mir keine Antwort mehr. Außerdem ist dein Problem, wenn man es richtig beschreibt, banal und in einigen Minuten in OOP lösbar.

Geschrieben
Es geht hier nicht darum ob er es kann oder nicht, man will hier eigeninitiative von den Nutzern sehen.

Eigeniniative einfaordern, ohne danach Hilfe anzubieten = ganz unterste Schublade. Nein, werfen mit ganzen Büchern ist keine Hilfe. Und sagen, was man alles nicht tut, ist auch keine Hilfe.

Geschrieben
Was OOP ist, war nicht meine Frage. Meine Frage war, wie ich das konkrete Programm "Silben Mischen" mittels Methoden (d.h. ohne BASIC-artige FOR/NEXT-Schleifen umsetze).
Ich glaube, was OOP ist, sollte hier durchaus die Frage sein. OOP heißt nicht, auf for-Schleifen zu verzichten, und for-Schleifen sind auch nicht "BASIC-artig". Auf unterster Ebene ist man mit OOP letzten Endes doch wieder prozedural - Sequenz, Schleife, Verzweigung.

Wenn Du das nicht kannst, dann heisst das nicht, dass ich mehr lesen muss - gibt ja noch andere Leute hier im Forum.
Du wirst wohl noch merken, dass man hier nur mit sehr viel Glück an fertigen Code kommt.
Geschrieben
Okay, und wie komme ich zu einer Methode, darum gehts doch bei OOP?
Nein, darum geht's nicht bei OOP. Wenn du deinen prozeduralen Code in eine Methode und diese wiederum in eine Klasse packst, hast du keinen objektorientierten Code.

Aber das hier alles zu erklären, würde zu weit führen. Das Forum ist keine Tutorialmaschine.

Geschrieben
Ich glaube, was OOP ist, sollte hier durchaus die Frage sein. OOP heißt nicht, auf for-Schleifen zu verzichten, und for-Schleifen sind auch nicht "BASIC-artig". Auf unterster Ebene ist man mit OOP letzten Endes doch wieder prozedural - Sequenz, Schleife, Verzweigung.

Nein, darum geht's nicht bei OOP. Wenn du deinen prozeduralen Code in eine Methode und diese wiederum in eine Klasse packst, hast du keinen objektorientierten Code.

Da widerspricht sich was, scheint mir.

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...