Schulprojekt - Groß zu Kleinbuchstaben



  • David_pb schrieb:

    int to_lower( int c )
    {
    	if  ( c >= 'A' && c <= 'Z' )
    	{
    		c += ( 'a' - 'A' );
    	}
    
    	return c;
    }
    

    👍
    Das oist die IMHO sauberste und portabelste Lösung. (Kommt uU sogar mit 'Ö' - 'ö' zurecht?)



  • darthdespotism
    Bevor du laberst ... guck dir mal eine ASCII-Tabelle an. Was soll dann noch an dem Code un portabel sein?



  • darthdespotism schrieb:

    Das oist die IMHO sauberste und portabelste Lösung. (Kommt uU sogar mit 'Ö' - 'ö' zurecht?)

    Das ist nur solang Portabel wie die Reihenfolge der Zeichen derer des ASCII Zeichensatzes entsprechen. 😉



  • darthdespotism schrieb:

    David_pb schrieb:

    int to_lower( int c )
    {
    	if  ( c >= 'A' && c <= 'Z' )
    	{
    		c += ( 'a' - 'A' );
    	}
    
    	return c;
    }
    

    👍
    Das oist die IMHO sauberste und portabelste Lösung. (Kommt uU sogar mit 'Ö' - 'ö' zurecht?)

    nein, nicht portabel! vorallem nicht im bereich ausserhalb von ASCII. Nur tolower oder ctype<char>::tolower ist portabel. Genau genommen ist in der funktion nichtmal der ASCII bereich portabel, der standard gibt nur vor, dass 96 standardzeichen darstellbar sein müssen, nicht aber ihre reihenfolge.

    Deshalb hat der Lehrer vom TE wohl keine Ahnung. So wie er die Aufgabe gestellt hat, ist sie nicht lösbar!



  • ReggaeBoy schrieb:

    Hi,

    Ich weiß das dieses Thema nicht das erste mal auftaucht, aber ich finden irgendwie nicht das richtige.

    Also folgendens, ich muss für die Schule ein C++ Projekt machen und ich habe mich für ein Wörterbuch entschieden das ein eingegebenes Wort mit einer Wordlist vergleicht und dann das Englisch (oder Deutsche) Wort ausgibt.

    Nun möchte ich aber das es keine Unterscheidung zwischen Klein- und Großbuchstaben gibt. Wie kann ich das am besten machen?

    Vorrausetzung des Lehrers:

    - Keine Strings (nur Char Arrays)
    - Keine vordefinierten Funktionen (wie tolower oder toupper)
    - Selbst geschriebene Funktion

    Ich hoffe jemand kann mir helfen.

    lg ReggaeBoy

    du darfst cout verwenden? und operator<<(ostream&,...)? warum dann nicht auch tolower oder toupper? dein lehrer ist blöd. std::string gehört zum standard ist damit teil von C++. will er, dass du C++ lernst oder nicht?

    die beste lösung: du schreibst dein programm so, wie er will und in kommentare hinein, wie du es in C++ machen würdest. wenn du willst, poste deinen code hier und wir machen das mit den kommentaren für dich.

    hier wohl das bisher portabelste für groß-/kleinbuchstabenumwandlung.

    template <class T, class U>
    T find (T begin, const T end, U value)
    {
       while (*begin != value && begin != end) ++begin;
       return begin;
    }
    
    char tolower (char c)
    {
       static char upper[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜ";
       static char lower[] = "abcdefghijklmnopqrstuvwxyzäöü";
    
       std::ptrdiff_t x = find(&upper[0], upper+sizeof(upper), c) - upper; //ptrdiff_t aus dem header <cstddef>.
       if (x == sizeof(upper)) return c;
       else return lower[x];
    }
    

    vor allem die funktion, um deine C-strings (aka NTBS) richtig (lexikographisch) zu ordnen, wird schwer portabel zu implementieren sein...



  • Ich weis nicht, wie ihr darauf kommt, dass es portabel sein soll. aber davon steht doch gar nichts



  • portabel bedeutet in diesem fall standardkonform, also nicht abhängig von irgendwelchen rechnerarchitekturen. es würde nicht nur von unglaublicher ignoranz sein, irgendeinen nicht-portablen code hier zu posten, weil (1) der OP nichts davon gesagt hat, auf welcher rechner-architektur er dieses programm schreiben muss, (2) er (der OP) sein posting extra im ISO C++ forum gestellt hat und damit impliziert, dass er das haben will. schlimmer noch: alle hinweise, die wir bekommen, deuten darauf hin, dass er ASCII nicht zur verfügung hat. nämlich das, was ich unter (2) gesagt habe, dann dass er keinen std::string, keine anderen eingebauten funktionen verwenden darf (viele embedded c++ lösungen entbehren das, um lighter zu sein), ebenso wie dass er das ganze für einen schulcomputer implementieren muss - und wir wissen alle, mit welcher (alten, vormodernen) hardware manche schulen ausgestattet sind (abgesehen davon, dass er das ganze auch absichtlich für uralt-computer machen könnte).

    kurz: alles deutet darauf hin, dass er eine portable, standardkonforme lösung wollte - nichts dagegen. es wäre also ziemlich dumm, keine zu liefern. alles andere hätte der OP sagen müssen. und wenn du trotzdem denkst, dass er das nicht portabel wollte sondern maschinenspezifisch, dann ist das nicht gerade höflich gegenüber dem OP.



  • queer_boy schrieb:

    vor allem die funktion, um deine C-strings (aka NTBS) richtig (lexikographisch) zu ordnen, wird schwer portabel zu implementieren sein...

    ersteinmal: sehr schöne Lösung. Allerdings musst du AÖÜ draussen lassen, da diese zeichen nicht von den 96 Standardzeichen abgedeckt werden.

    zum Glück ist es nicht teil der Aufgabe, richtig zu sortieren, der TE soll laut eigener angabe nur zu einem deutschen wort das englische finden(bzw umgekehrt) und ausgeben. und da reicht die normale sortierung aus.



  • ReggaeBoy schrieb:

    .. muss für die Schule ein C++ Projekt machen ..

    und

    ReggaeBoy schrieb:

    - Keine Strings (nur Char Arrays)

    Dummerweise ist das hier kein Einzelfall. Nein - ich versuche jetzt nicht die Vorteile von std::string gegenüber char-Arrays aufzuzählen. Nur soviel: Wir machen bei uns in der Firma Einstellungstests und lassen die Probanden kleine C++-Programme schreiben.

    Wer mit std::string umgehen kann, wird eingestellt. Wer char-Arrays benutzt nicht.
    Lieber ReggaeBoy, erzähl das bitte Deinem Lehrer.

    Gruß
    Werner



  • @Werner: Gute Antwort ! 👍 😃

    Gruß,

    Simon2.



  • Hey,

    Danke für die vielen und vorallem schnell Anworten.

    Ich weiß nicht wieso unser Lehrer das nicht mag, vielleicht weil wir es nicht gelernt haben. 🙂
    Ich habe auch C++ nicht richtig bei ihm gelernt. 😉

    Naja, wie auch immer, ich habe ein paar Codes ausprobiert und sie funktionieren so wie ich es will. Ich habe mir aber jetzt aber folgendes überlegt:

    Ich habe eine Suchfunktion die jedes Zeichen eines eingegebenen Wortes mit Wörter aus einer Textdatei vergleicht. Hier mal der Code:

    bool vergleich(char word[50], char DEorEN[50])
    {
    	int i = 0;
    	int x = 0;
    	int y = 0;
    
    		while(x<=(strlen(word))) {
    				if(word[x] == DEorEN[x])
    				{
    					i++;
    				} else {
    					y++;
    				}
    
    			x++;				
    		}
    
    		if(y==0) 
    			{
    				return true;
    			} else { 
    				return false; 
    			}
    }
    

    Nun möchte ich aber das bei diesem Vergleich die Groß-Kleinschreibung nicht beachtet wird, hat da jemand vielleicht eine Idee?

    lg ReggaeBoy



  • Jabadabaduu 🙂

    Ich habs gerade selber geschrieben, war ziemlich einfach.

    lg ReggaeBoy



  • ReggaeBoy schrieb:

    ...
    Ich weiß nicht wieso unser Lehrer das nicht mag, vielleicht weil wir es nicht gelernt haben....

    Ich vermute eher, dass das daran liegt, dass er es nicht gelernt hat. 😃
    Alternativ möchte er Euch "Container-Handling" und ein wenig "Schleifendenke" beibringen ... aber IMO wäre er mit int[] da besser beraten.

    ReggaeBoy schrieb:

    Jabadabaduu 🙂

    Ich habs gerade selber geschrieben, war ziemlich einfach.

    lg ReggaeBoy

    👍 😋
    Glückwunsch !!!

    So ist es am Besten.

    Gruß,

    Simon2.



  • Simon2 schrieb:

    ReggaeBoy schrieb:

    ...
    Ich weiß nicht wieso unser Lehrer das nicht mag, vielleicht weil wir es nicht gelernt haben....

    Ich vermute eher, dass das daran liegt, dass er es nicht gelernt hat. 😃

    glaube ich nicht. wenn er es nicht kennen würde, würde er es doch nicht verbieten?
    das hört sich mehr nach diesem schul-sadismus an, den sich manche lehrer gerne aneignen. (und dann rechtfertigen, so wie "ja, in der wirklichen welt, da habt ihr auch nicht immer solche annehmlichkeiten wie vorgefertigte string-klassen! ihr habt keine ahnung von der wirklichen welt!". oh ja, das kann ich mir sehr gut vorstellen)



  • queer_boy schrieb:

    ...wenn er es nicht kennen würde, würde er es doch nicht verbieten?...

    Naja, seit im vorvorvor...letzten Kurs mal einer diese Aufgabe mit std::string gelöst hat, weiß er, dass es das gibt.

    queer_boy schrieb:

    ...schul-sadismus ...

    DAS kommt vermutlich noch dazu.

    "Man hat etwas erst begriffen, wenn man es selbst mal nachgebaut hat !"
    "Warum dürfen wir dann C nutzen und fangen nicht mit ASM an ?"
    "***WTF***"

    Ich würde an der Stelle des OPs darauf bestehen, dass der Lehrer danach eine "richtige Lösung" (wie man es eben richtig in C++ machen würde) vorstellt - spätestens da zeigt sich dann, ob er keine Ahnung oder nur ein merkwürdiges didaktisches Konzept hat. 😃

    Gruß,

    Simon2.



  • nur anmerkungen.

    bool vergleich(char const* word, char const* DEorEN) //lies: zeiger auf konstante c-strings; du veränderst den inhalt ja nicht :)
    {
       int i = 0; //wozu brauchst du i? wird mir nicht ersichtlich
       int x = 0; 
       int y = 0;
       //eventuell aussagekräftigere namen verwenden.
    
       while(x<=(strlen(word))) {  //strlen selbst implementiert? wenn nicht, dann
                                   //reicht x < strlen(word)
          if(word[x] == DEorEN[x]) //du übersiehst, dass DEorEN an der stelle x 
                                   //nicht notwendigerweise einen inhalt haben muss. 
          {
             i++; //das ist die einzige stelle, wo du i verwendest?
          } else {
             y++; //warum nicht einfach mit break aus der schleife springen?
          }
          x++;				
       }
    
       //wenn es deinen lehrer nicht überfordert, kannst du 
       //auf dieses riesen-if-konstrukt verzichten und einfach
       //schreiben: return y == 0;
       if(y==0) {
          return true;
       } else { 
          return false;
       }
    }
    
    //kürzerer code ist meist aussagekräftiger.
    bool sind_gleich (char const* a, char const* b)
    {
       size_t len_a = strlen(a);
       size_t len_b = strlen(b);
       if (len_a != len_b) return false;
    
       for (int i = 0; i < len_a; ++i)
          if (len_a[i] != len_b[i]) return false;
    
       return true;
    }
    


  • @queer_boy

    Du hast sicher recht, jedoch sieht mein Code eher nach mir aus 😛

    Irgendwas muss ich ja aus dem Kopf geschrieben haben, ausserdem Funktioniert mein Code sehr gut 🙂

    lg ReggaBoy



  • Darfst du strlen denn nutzen? (implementiere es sonnst selbst:

    inline std::size_t strlen(const char* string)
    {
    	if (string == 0)
    		return 0;
    
    	size_t res = 0;
    	while (string[res])	++res;
    	return res;
    }
    

    🙂



  • std::size_t strlen(char const* string)
    {
        return *string == '\0' ? 0 : strlen(string + 1) + 1;
    }
    

    ... nur, um mal nen rekursiven Einzeiler ins Spiel zu bringen. 😉



  • Konrad Rudolph schrieb:

    std::size_t strlen(char const* string)
    {
        return *string == '\0' ? 0 : strlen(string + 1) + 1;
    }
    

    ... nur, um mal nen rekursiven Einzeiler ins Spiel zu bringen. 😉

    Was passier, wenn einer nen NULL-Zeiger übergibt ?
    Aber trotzdem nice 🙂


Anmelden zum Antworten