Hilfe bei Programm "Ersetzen der Vokale"

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
elpaffron
Beiträge: 2
Registriert: Sa Jan 04, 2020 4:58 pm

Hilfe bei Programm "Ersetzen der Vokale"

Beitrag von elpaffron » Sa Jan 04, 2020 5:13 pm

Hallo liebe Gemeinde,

ich hab eine Frage bezüglich meines Programms. Mein Prof. hat die Aufgabe gestellt ein vorhandenes Programm zu ersetzen. Dabei gehts darum alle Vokale aus dem Lied "Drei Chinesen mit dem Kontrabass" jeweils mit "a" "e" "i" "o" und "u" zu ersetzen und auszugeben. Aufgrund das mir der Ablauf nicht ganz klar war habe ich das Programm abgespeckt nachgebaut. Nur in einem Punkt komm ich nicht weiter. In der Funtktion Void Ausgabe wird die eingelesene Zeichenkette übergeben. Von dort aus wird diese in die Funktion vokaländern übergeben und der Rückgabewert soll ausgegeben werden. Ich hab das Programm auch ohne eine Funktion nachgebaut und das ersetzen der Vokale funktioniert. Es wäre sehr hilfreich wenn mir jemand einen Tipp geben könnte was ich falsch mache.

[img]C:\Users\Jupp\Desktop\Programm[/img]

nufan
Wiki-Moderator
Beiträge: 2557
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Hilfe bei Programm "Ersetzen der Vokale"

Beitrag von nufan » Sa Jan 04, 2020 10:39 pm

Hallo elpaffron!
Ich fürchte beim Upload deines Codes ist etwas schief gelaufen. Hast du versucht ein Bild hochzuladen? Bitte poste ihn direkt hier als Text (nicht als Bild).

Mir ist das Problem noch nicht ganz klar:
elpaffron hat geschrieben:
Sa Jan 04, 2020 5:13 pm
Ich hab das Programm auch ohne eine Funktion nachgebaut und das ersetzen der Vokale funktioniert.
Funktionen helfen dir dabei, dein Programm zu strukturieren. Das ist vor allem bei größeren Programmen sehr sinnvoll, aber kein Zwang.

elpaffron
Beiträge: 2
Registriert: Sa Jan 04, 2020 4:58 pm

Re: Hilfe bei Programm "Ersetzen der Vokale"

Beitrag von elpaffron » So Jan 05, 2020 1:40 pm

Hi Sorry irgendwie ist da was schief gelaufen. Der Code ist wie folgt:

Code: Alles auswählen

int Eingabe(char* text) // Eingabe vom Satz
{
	printf("Bitte geben Sie eine Zeichenkette ein: (max. 100 Zeichen)");
	fgets(text, 100, stdin);

	return text;
}

char* vokalAendern(char* zeichenkette, char vokal) // Umwandeln der Vokale
{
	while (*zeichenkette != '\0')
	{
		if (*zeichenkette == 'a' || *zeichenkette == 'e' || *zeichenkette == 'i' || *zeichenkette == 'o' || *zeichenkette == 'u')
		{
			*zeichenkette = vokal;
		
		}

		zeichenkette++;
		
	}
	
}

void Ausgabe(char* zeichenkette) // Ausgabe der Zeichenkette mit ersetzen des Vokals
{
	char* text;

	printf("Der eingebene Text lautet: %s\n", zeichenkette);
	printf("\nStrophen: \n");

	text = vokalAendern(zeichenkette, 'a');
	printf("%s", text);
	text = vokalAendern(zeichenkette, 'e');
	printf("%s", text);
	text = vokalAendern(zeichenkette, 'i');
	printf("%s",text);
	text = vokalAendern(zeichenkette, 'o');
	printf("%s", text);
	text = vokalAendern(zeichenkette, 'u');
	printf("%s", text);
}
int main(void) // Hauptprogramm
{
	char eingabestring[100];
	char *text = eingabestring;

	text = Eingabe(eingabestring);

	Ausgabe(eingabestring);


	return 0;
}
Mein Problem ist bei der Funktion Ausgabe und VokalÄndern. Was für einen Rückgabewert benötige ich in der Funktion "Vokaländern"

Ich denke das dort mein Problem liegt, weil er nix sinnvolles in die Variable text schreibt.

Danke und gruß

el paffron

nufan
Wiki-Moderator
Beiträge: 2557
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Hilfe bei Programm "Ersetzen der Vokale"

Beitrag von nufan » So Jan 05, 2020 7:50 pm

Du übergibst an "vokalAendern" einen Zeiger mit dem Namen "zeichenkette". Dieser verweist auf einen Speicherbereich, den du innerhalb deiner Funktion veränderst:

Code: Alles auswählen

*zeichenkette = vokal;
Eigentlich musst du gar nichts mehr zurückgeben, du hast den angegebenen Speicherbereich schon verändert und kannst ihn außerhalb der Funktion weiter verwenden.
Also z.B. folgendermaßen:

Code: Alles auswählen

vokalAendern(zeichenkette, 'a');
printf("%s", zeichenkette);
Ähnlich sieht es übrigens bei der Funktion "Eingabe" aus. Du ignorierst den Rückgabewert sogar:

Code: Alles auswählen

text = Eingabe(eingabestring);
Ausgabe(eingabestring);
"text" wird zwar zugewiesen, aber nicht verwendet. "Eingabe" könnte auch einfach "void" als Rückgabetyp haben. "int" ist übrigens auf jeden Fall unpassend, aktuell wäre "char *" der richtige Typ.

Ist die Verwendung von Rückgabewerten verpflichtend? Mir fallen 3 Varianten zur Umsetzung ein:
1) Du könntest in der jetzigen Variante natürlich den ursprünglichen Wert des Eingabeparameters zwischenspeichern und zurückgeben:

Code: Alles auswählen

char* vokalAendern(char* zeichenkette, char vokal) // Umwandeln der Vokale
{
    char *ergebnis = zeichenkette;
    while (*zeichenkette != '\0')
    {
        // ...
    }
    return ergebnis;
}
Wirklich sinnvoll ist das allerdings nicht. Die aufrufende Funktion weiß ja bereits, was übergeben wurde.
2) Falls du mit dynamischer Speicherverwaltung vertraut bist, könntest du innerhalb der Funktion neuen Speicher anfordern und das Ergebnis dort hinein schreiben.
3) Die Funktion hat einen eigenen statischen Speicherbereich (ein Array mit dem Attribut "static"), der beschrieben und zurückgegeben wird.

Antworten