Hilfe bei kleinem Programm



  • Hallo Leute,
    Ich habe ein Problem, und zwar muss ich aufgrund einer Projektarbeit mehrere Programme beschreiben und dokumentieren, allerdings habe ich bei diesem Programm ein paar verständnissprobleme. Konnte leider auch nichts finden was mir das ganze ein bisschen erklären könnte...
    Könnte mir da einer helfen und in den Zeilen 42-84 kurze Komentare dahinter schreiben, am besten immer nur 3-4Wörter

    Das wäre super nett, da ich da momentan nicht weiter komme.

    #include <iostream>
    #include <malloc.h>
    #include <string.h>
    
    class strings
    // contains all sort of nonsense keeping students busy
    {
    private:
    	char *myStr;					// pointer to string to be allocated
    	unsigned int length;			// maximum length of string		
    public:
    	strings(int maxlen = 200);	// constructor
    	~strings();						// destructor
    	void Display();
    	void Insert(char s[]);		// inserts new string contents
    	int count();						// reports actual length of string
    	void Chinese();				// produces 'Chinese' version of contents
    	void Capital();					// changes to uppercase characters
    	void Cut();						// cuts string after first blanc
    };
    
    strings::strings(int maxlen)
    {                       	// allocates new memory for string
    	myStr = (char*)malloc(length = maxlen);
    	myStr[0] = '\0';				// terminates string to be empty
    }
    
    strings::~strings()
    {
    	free(myStr);					// deallocates memory
    }
    
    void strings::Display()
    {
    	printf("%s\n", myStr);		// prints string to display
    }
    
    void strings::Insert(char s[])
    {
    	if (strlen(s) < length)		// new string exeeds allocated memory?
    		strcpy(myStr, s);			// no, ok, insert it
    }
    
    int strings::count()
    {return strlen(myStr);
    }
    
    void strings::Chinese()
    {
    	for(int i=0; i<strlen(myStr);i++){
    
    		if(myStr[i]=='r'){
    		myStr[i]='l';
    		}
    
    		else if (myStr[i]=='R') {
    	    myStr[i]='L';
    		}
    
    	}
    
    }
    
    void strings::Capital()
    {	
    	for(int i=0; i<strlen(myStr);i++)
    	{
    		if(myStr[i] > 96 && myStr[i] < 123)
    		{
    		 myStr[i] -= 32;
    		}
    	}
    }
    
    void strings::Cut()
    {
    
    	for(int i=0; i<strlen(myStr);i++)
    	{
    
    		if(myStr[i]==32) 
    		{				 
    		myStr[i]='\0';
    		}
    
    	}
    }
    
    // test environment for functions
    void main()
    {
    	strings object_s(250);
    	object_s.Insert("Frohe Ostern!");
    	object_s.Display();
    	printf("%i character\n", object_s.count());
    	object_s.Chinese();
    	object_s.Display();
    	object_s.Capital();
    	object_s.Display();
    	object_s.Cut();
    	object_s.Display();
    }
    


  • Falsches Forum und falsche main Signatur!



  • Welches Forum denn??? Dachte das wäre C++

    Das mit dem main wurde von unserem Professor so geschrieben und auch so gezeigt 😮
    Was ist denn daran falsch?

    Sorry wenn es das falsche Forum ist aber ich hab keine Ahnung wo sonst damit hin 😕



  • richtiges forum.

    man schreibt

    int main ()

    void war nie standard. aber sags deinem prof nicht, der hat dich sonst vielleicht auf dem kieker 😉

    wieso willst du kommentare? die methoden haben doch fantastisch sprechende namen, da steht doch, was die methoden machen.



  • int strings::count()
    {return strlen(myStr); //strlen: länge
    }
    
    void strings::Chinese()
    {
    	for(int i=0; i<strlen(myStr);i++){
    
    		if(myStr[i]=='r'){
    		myStr[i]='l'; //ersetzte r mit l
    		}
    
    		else if (myStr[i]=='R') {
    	    myStr[i]='L'; //ebenso aber gross
    		}
    
    	}
    
    }
    
    void strings::Capital()
    {	
    	for(int i=0; i<strlen(myStr);i++)
    	{
    		if(myStr[i] > 96 && myStr[i] < 123)
    		{
    		 myStr[i] -= 32; //großbuchstabe, ascii tabelle aufmachen und sehen
                                     //wo du nach -32 hinkommst ;)
    		}
    	}
    }
    
    void strings::Cut()
    {
    
    	for(int i=0; i<strlen(myStr);i++)
    	{
    
    		if(myStr[i]==32) 
    		{				 
    		myStr[i]='\0'; //schneide ab, indem du \0 setzt (ende)
    		}
    
    	}
    }
    

  • Administrator

    RedLine schrieb:

    Welches Forum denn??? Dachte das wäre C++

    Bis auf die Klasse an sich (ohne Implementationen) und den Header <iostream> , welcher du gar nicht benötigst, ist in deinem Code alles C. Falls deine Professor dir dies beigebracht hat, dann gratuliere ich dir. Du bist Student Nummer 9999999999999999... (sehr grosse Zahl), welcher einen unfähigen Professor hat, welcher kein C++ kann.

    Zu deiner Frage:
    Stell bitte ein wenig konkretere Fragen. Was genau verstehst du nicht?

    Grüssli



  • Laut ISO-Standard wird die main-Funktion als integer deklariert.

    int strings::count() //integer, erwartet einen dezimalen rückgabewert
    {
     return strlen(myStr); //strlen( ) erwartet einen string als parameter und gibt
                           //die Zeichenlänge des strings zurück.
    }
    
    void strings::Chinese()
    {
        for(int i=0; i<strlen(myStr);i++){ //inkrementiere i, bis der string 
                                           //komplett durchlaufen wurde
    
            if(myStr[i]=='r'){ //falls ein element des strings = "r" ist
            myStr[i]='l'; //übernehme das literal "l" für das element
            }
    
            else if (myStr[i]=='R') { //anderenfalls, wenn das element = "r" ist
            myStr[i]='L'; //übernehme das literal "L" für das element
            }
    
        }
    
    }
    
    void strings::Capital()
    {   
        for(int i=0; i<strlen(myStr);i++) //loop für eine komplette string länge
        {
            if(myStr[i] > 96 && myStr[i] < 123) //ist ein element größer als 96 und
                                                //kleiner als 123
            {
             myStr[i] -= 32; //dann subtrahiere davon 32
            }
        }
    }
    
    void strings::Cut()
    {
    
        for(int i=0; i<strlen(myStr);i++) //loop für eine komplette string länge
        {
    
            if(myStr[i]==32) //falls ein string = 32 ist
            {                 
            myStr[i]='\0'; //definiere ihn mit einem '\0'-byte (zeilenumbruch)
            }
    
        }
    }
    

    EDIT:
    Hoppala, gerade war es nur 1 Antwort...



  • Laut ISO-Standard wird die main-Funktion als integer deklariert

    oO
    Vll besser so:

    Laut ISO-Standard besitzt die main-Funktion einen Rückgabewert: int
    dort steht dann imho so was in der richtung drin:
    erlaubt sind folgende signaturen:
    `

    int main(int argc, char *argv[])

    int main(int argc, char**argv)

    int main()

    `
    und dann steht da imho noch so was, wie:
    [es sind auch alle anderen signaturen erlaubt, so lange die main-fkt den rückgabetyp int hat]
    bin nur gerade (ma wieder ^^) zu faul, genau nachzugucken...

    bb



  • Super, danke das bringt mich schonmal ein großes Stück vorran 👍

    Acchhhssoooo, ja das wusste ich nicht, dachte mein Prof. könnte das und laufen tut es ja auch so 😉 Aber jetzt weis ich ja bescheid.



  • Btw: Der Typ einer Funktion gehört nicht zur Signatur.



  • Es haben ja schon einige gesagt, aber dein Prof hat wirklich Ahnung von nichts. Da lernst du mehr aus einem Second-Hand Tutorial aus dem Internet über C++. Erstmal vermischt er C mit C++, autsch! Wie schon gesagt, gehört zu dem Standard, dass die main int zurückgibt. Meine IDE verlangt sogar von mir, dass main int zurückgibt, ansonsten lässt es mich nicht compilieren. Ich kenn mich kaum mit C aus, aber ich glaube mit free rumzuhantieren ist nicht gut (muss jetzt nicht stimmen, vielleicht hab ich mich verhört, deswegen verbessert mich falls es falsch ist). Falls du den Code wirklich so belassen willst, kannst du iostream rausnehmen, da du sowieso nichts aus C++ benutzt, außer eine Klasse und kannst stattdessen stdio.h benutzen.

    Nun zu deiner Codeerklärung.
    strings::count() sollte eigentlich klar sein. Es gibt die größe deines "Strings" zurück. An deiner Stelle würde ich aber das count in z.B. size oder length umbennen, denn deine Methode zählt nichts, sondern gibt einen Wert zurück. Die Methode von string, heisst auch size und zählt auch nichts.
    Die Methode Chinese versucht einen chinesischen Dialekt nachzumachen und geht Zeichen für Zeichen den "String" durch und sucht nach einem "r" oder "R" und ersetzt es durch ein "l" oder "L".
    Deine Methode Capital ersetzt jeden kleinen Buchstaben in einen großen. Such in Google nach "ASCII Tabelle" und schau mal nach 96 und 123. 96 ist "`" und 123 "{". Dann wird in der for-Schleife jedes Zeichen geprüft, ob es über 96 und unter 123 ist. D.h. die Zahl muss min. 97 oder max. 122 sein.
    In C++ kannst du nämlich z.B. sowas machen:

    #include <iostream>
    
    int main()
    {
        char test_char = 97;
        std::cout << test_char;
        //bzw.
        int test_int = 'a'
        std::cout << test_int;
    }
    

    Die Ausgabe wird "a" und einmal "97" sein.
    Nun zur letzten Methode, deine Cut Methode.
    Diese geht wieder jedes Zeichen in deinem "String" durch und schaut nach einem Leerzeichen. Wird eins gefunden, wird dort das Nullzeichen gesetzt, was den Rest des Strings terminiert.

    Ich hoffe ich konnte helfen.

    mfg



  • Es haben ja schon einige gesagt, aber dein Prof hat wirklich Ahnung von nichts.

    Du aber, hm?
    Ich habe das Gefühl, dass du und RedLine nicht sehr bewandert seid. Entweder stammt der Code nicht von einem Professor oder er versucht euch C zu lehren.

    Da lernst du mehr aus einem Second-Hand Tutorial aus dem Internet über C++.

    Na du musst es ja wissen...

    compilieren

    Unbewanderte schreiben kompilieren mit c, hihi...

    mit free rumzuhantieren ist nicht gut

    Warum nicht? Ist daraus zu schliessen, dass du malloc( ) auch nicht gut findest?



  • Was willst du jetzt eigentlich von mir? Ich helfe hier ganz normal und ich denke mal, es gibt nicht wirklich Fehler in meinem Text. Willst du mir sagen das ich mit dem was ich geschrieben habe nicht Recht habe? Es neigen immer mehr Leute dazu unnötige Kommentare abzugeben die den Thread kein Stück weiterbringen. Einer dieser Leute ist jetzt z.B. du. Anscheinend meinst du ich hab keine Ahnung von C++, dass ist dann deine Meinung. Willst du mir also sagen, dass man durch den Code mehr lernt als durch ein billiges C++ Tutorial im Internet? Wohl kaum. Dein Wortschatz scheint auch ein wenig begrenzt zu sein:

    nicht sehr bewandert

    Unbewanderte

    Zwar hast du was geschrieben, jedoch glaube ich das mein Post ein wenig mehr verständlich ist.
    Sowas wie

    myStr[j] -= 32; //dann subtrahiere davon 32
    

    ist wohl selbsterklärend...
    Und klar Kóyaánasqatsi, du hast mit deiner Aussage einen klassen Widerspruch geleistet.
    "Entweder nicht von einem Prof, oder er versucht euch C zu lehren"...
    Deswegen bringt er ihnen auch C mit Klassen bei 👍
    Über free() meinte ich extra, dass ich mir nicht sicher bin und ob ich es gut finde habe ich auch nicht geschrieben. Wenn wir in einem C++ Forum sind und ich teilweisen C++ Code sehe, dann schreibe ich wohl das free() bzw. malloc() nicht gut ist oder? Wofür gibt es new und delete?



  • Bitte kein Streit hier 🤡

    Habe noch eine kleine Frage undzwar

    strings object_s(250);
    

    Bedeutet das, das die Stringlänge 250 ist?

    Was für mich unlogisch wäre, da die max.stringlänge ja vorher schon mit 200 angeben wurde???



  • RedLine schrieb:

    strings object_s(250);
    

    Bedeutet das, das die Stringlänge 250 ist?

    Was für mich unlogisch wäre, da die max.stringlänge ja vorher schon mit 200 angeben wurde???

    Die =200 im Konstruktor sind ein Default-Wert. D.h. wenn Du keine Länge angibst wird ein char-Feld der Länge 200 angelegt.

    RedLine schrieb:

    .. ja das wusste ich nicht, dachte mein Prof. könnte das und laufen tut es ja auch so

    Nein - tut es nicht. Zumindest nicht in jedem Fall. Füge doch mal in dem kleinen main folgendes ein:

    void malsehn( object_s x )
    {
        std::cout << "der String hat die Laenge: " << x.count() << std::endl;
    }
    // test environment for functions
    void main()
    {
        strings object_s(250);
        object_s.Insert("Frohe Ostern!");
        malsehn( object_s );
        object_s.Display(); 
        // usw.
    

    das führt zu undefiniertem Verhaltem - im Debug-Mode sollte sich eine aussagekräftige Fehlermeldung zeigen.

    Abgesehen davon enthält der Code noch ca. ein Dutzend mehr oder weniger schwerer Fehler. Und ich hatte auf Grund dieses Kommentars in Zeile 6

    class strings
    // contains all sort of nonsense keeping students busy
    

    angenommen, es ist die Aufgabe der Studenten, die alle zu finden - oder?

    Gruß
    Werner



  • Eigentlich war das nicht die Aufgabe 😃

    Habe aber auch schon einige beseitigt mit das Programm überhaupt lief 😉


Log in to reply