[Modularisierung] Ich komme nicht weiter



  • Hi,
    in meinem Studium hatten wir eine Aufgabe aufbekommen und ich komm nicht mehr weiter... Daher wollte ich fragen was ich falsch gemacht habe.

    Aufgabe 3 Textverarbeitung
    Implementieren Sie die Funktion delete_blanks, die eine Zeichenkette als Parameter übernimmt
    und alle überflüssigen Leerzeichen aus der Zeichenkette entfernt.
    Die Funktion hat die Aufgabe, die unterschiedlich vielen Leerzeichen (blanks) zwischen den Wörter durch ein einzelnes Leerzeichen zu ersetzen.
    Als return-Wert soll die Funktion die Anzahl gelöschter Leerzeichen zurückgeben.

    Ich habe dann angefangen mit dem Header:

    #ifndef header_h
    #define header_h
    extern int delete_blanks(char *wort, int n);
    #endif
    

    Dann die Funktion versucht aufzubauen:

    #include "Header.h"
    
    int delete_blanks(char *wort, int n)
    {
    	int h;
    	char *hilfe = new char[n];
    	*hilfe = *wort;
    	int position = 0;
    	for (int i = 0; i<n; i++)
    	{
    		if (wort[i] == !' ')
    		{
    			hilfe[position] = wort[i];
    			h = 0;
    			position++;
    		}
    		else if (wort[i] == ' ' && h == 0)
    		{
    			h = 1;
    			hilfe[position] = wort[i];
    			position++;
    		}
    
    	}
    	return h;
    }
    

    Und dann natürlich die main geschrieben:

    #include "Header.h"
    #include <iostream>
    using namespace std;
    int n;
    void main()
    {
    	char *wort= new char [n];
    	cout << "Gebe Satz ein: " << endl;
    	fflush(stdin);
    	fgets(wort, n, stdin);
    	n = strlen(wort);
    	*wort = NULL;
    	*wort=delete_blanks(wort, n);
    	cout << "Satz korrigiert: " << wort << endl;
    }
    

    Ich hatte das Programm soweit bekommen, dass es sachen löscht aber es hat immer alles gelöscht was nach dem ersten Wort kam und jetzt scheint es so das gar nichts mehr klappt 😞 😞

    Kann mir jemand helfen?



  • Ist die Funktion mit char* vorgegeben?

    Nein: benutze std::string

    Ja: herzliches Beileid.

    Wozu?

    *wort = NULL;
    
    *hilfe = *wort;
    

    Was macht dss?

    if (wort[i] == !' ')
    

    Generell: benutze einen Debugger



  • Mit Strings waren wir in der Aufgabe noch nicht soweit in den Aufgaben sollten wir lernen wie man grundsätzlich eine Modularisierung durchführt.

    das

    if (wort[i] == !' ')
    

    Soll gucken ob dort kein leerzeichen ist und somit h=0 setzten, in dem nächsten schleifen zug ist dann h=0 und springt wieder in die if/else Bedigung um zu gucken ob da ein leerzeichen ist und wenn da eins ist guckt er ob h=0 ist.



  • unsigned delete_blanks(char *in)
    {
        char *out = in;
        char c;
        while ((c = *in++) != 0) if (c != ' ') *out++ = c;
        return in-out-1;
    }
    


  • Sonic12 schrieb:

    Soll gucken ob dort kein leerzeichen ist und somit h=0 setzten

    Hast du nur nicht aufgepasst, oder ist euer Lehrer so schwach?
    Sowas prüft man mit dem != -Operator:

    if (wort[i] != ' ')
    

    Dein Code hingegen negiert das Leerzeichen (macht es zum NUL-Byte) und prüft somit, ob das Ende des Strings erreicht ist.



  • Du solltest Dir angewöhnen, Variablen zu initialisieren. In Zeile 7 in main.cpp alloziierst Du Speicher für wie viele Zeichen? Später setzt Du das erste Zeichen des Texts auf die Anzahl der gelöschten Leerzeichen? Was für einen Sinn soll das ergeben.

    Ansonsten, fang klein an. Wenn die Funktion einen Leer-String bekommt, dann muss sie 0 zurück liefern. Wenn der Input keine Leerzeichen enthält muss sie 0 zurück geben. Wenn sie maximal ein Leerzeichen enthält muss sie 0 zurück geben. Teste mehrere Leerzeichen am Anfang, in der Mitte am End. Teste eine Gruppe von mehreren Leerzeichen, teste mehrere Gruppe von Leerzeichen.

    Durch zufälliges Herumprobieren wirst Du in absehbarer Zeit nicht auf die Lösung kommen.

    Die Signatur von delete_blanks() legt nah, dass Du die Leerzeichen in der übergebenen Zeichenkette löschen musst.

    Ansonsten versuche es mal mit einer Funktion, die alle Leerzeichen löscht.


Anmelden zum Antworten