Wie mache ich ein Programm, dass Verben konjugiert in 'C'?

... komplette Frage anzeigen

4 Antworten

Tolle Idee! Dabei lernst Du C-Grundlagen und nebenbei noch ein paar Feinheiten der deutschen Sprache.

In <string.h> sind zwar standardmäßig nicht viele Funktionen enthalten, aber für diesen Zweck reichts. Zusätzlich gibt es noch einige POSIX-Funktion wie strndup(), die zwar nicht 100% Standard sind, aber das Leben leichter machen.

Zuerst musst Du den Wortstamm ermitteln. Normalerweise wird dazu einfach die Endung -en abgeschnitten. Später kannst Du dann Verben auf -ern, -eln , -n usw. dazunehmen und Vorsilben separieren.

Aufgabe 1: Prüfe das Verb auf die Endung -en. Wenn vorhanden, erzeuge einen neuen String stamm, der das Verb ohne diese Endung enthält. Dazu brauchst Du strlen(), strcmp(), strndup() (nicht offiziell im C-Standard — ggf. malloc() & strncpy() nehmen) und natürlich free().

Aufgabe 2: Aus dem Wortstamm kannst Du bei regelmäßigen Verben alle Formen bauen. Entweder nach dem Schema "ihr habt ge"+stamm+"t" (das + wird durch strcat() erreicht), oder komfortabler mit sprintf( flektiert, "ihr habt ge%st", stamm ).

Erweiterungen: Finde eine Faustregel, wann:

  • das Perfekt mit sein (statt haben) gebildet wird
  • das Partizip mit -en (statt auf -t) endet
  • das Partizip nicht mit ge- beginnt (evtl. aber -ge- enthält)

Du wirst erstaunt sein, wieviel Dein Programm mit so wenig Regeln schon richtig macht.

Für unregelmäßige Verben musst Du meist nur noch beachten, dass der Wortstamm für Präsens, Perfekt und Imperfekt verschieden lauten kann. Wirkliche Ausnahmefälle (Lautverschiebungen, Bindekonsonanten) sind im Deutschen wohl eher selten (haben, essensein, ...). Da hilft nur noch eine Wortliste.

Praxistipps:

  1. Schreibe zuerst einen Prototypen für den Normalfall (das Verb steht in argv[1]). Damit gewöhnst Du dich an den Umgang mit C-Strings.
  2. Definiere in einem neuen Modul flexion.c/h eine Struktur flexion, die  Sonderfälle beschreibt (Perfekt mit sein, Partizipbildung, Imperativ, ...). Definiere aber nur Felder, die Du auch benutzt (kann man ja jederzeit erweitern). Lege eine solche Struktur für den Normalfall und einen ersten Spezialfall an. (static struct flexion const normalfall = {...};)
  3. Schreibe dazu eine Funktion, die für ein Verb die passende Flexion ermittelt. Anfangs reicht dazu ein simples return &normalfall;
  4. Schreibe eine Funktion, die eine flexion, eine Verbform und einen Wortstamm erhält und die entsprechende Konjugation zurückgibt.
  5. Verwende dieses Modul in main.c. main() selbst sollte sich nur um die Ein- und Ausgabe kümmern. Wenn das mehr als 50 Zeilen werden, hast Du etwas grundsätzlich falsch gemacht.

Viel Spaß beim Programmieren!

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von Michiselinger1
22.04.2016, 15:42

Danke, sehr hilfreich !

1
Kommentar von ralphdieter
08.09.2016, 09:50

Danke fürs Sternle!

0

Hallo Michiselinger1,

Für dein erstes Problem wirst du wohl nicht an einer Datenbank vorbei kommen.

In der kannst du dann für jedes eingetragene Verb die dazu gehörigen Werte auslesen.

Beim vertauschen von Buchstaben oder löschen von Buchstaben eines eingegebenen Wortes schaust du dir am besten einfach mal an, aus was ein String besteht :)

Zusätzlich solltest du dir einmal die Datenstruktur eines "Arrays" genauer anschauen. Das wäre für mich die erste Anlaufstellen für dein Problem :)

LG

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von Michiselinger1
22.04.2016, 09:57

Danke ich werde gleich mal mein C Buch nach Arrays und Strings durchsröbern!

1

http://www.c-howto.de/tutorial-strings-zeichenketten.htmlhttp://www.c-howto.de/tutorial-strings-zeichenketten.html

Ein String wird z.B. so deklariert:

char* verb;

kann man auch so schreiben (ist das gleiche):

char verb[];

Nach dem letztem Zeichen im String kommt immer eine 0, daran erkennt man das Ende.

So z.B. zählt man die Zeichen in einem Text:

int i;

for(i=0; verb[i]!=0; i++)

  ;  // leere Anweisung, die Schleife tut nichts ausser zählen


printf("Anzahl Buchstaben des Verbs: %i\\n", i);

Übrigens gibt es unregelmäßige Verben, da hilft ein Programm nicht weiter.



Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von TheQ86
22.04.2016, 10:11

Das letzte Zeichen eines C-Strings ist keine 0, sondern das Steuerzeichen \0 (https://de.wikipedia.org/wiki/Nullzeichen)

Manuell muss man es auch nicht hinzufügen, wenn man mit String-Literalen arbeitet.

1

is das nicht eigentlich sehr simple? Du brauchst einfach ne Datenbank in der für jedes verb die Konjugationen hinterlegt sind. Das is die Grundlage und drum herum kannst du weiterbauen

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von Michiselinger1
22.04.2016, 16:34

Ich bin ein Anfänger...

0

Was möchtest Du wissen?