Funktion lower mit bedingten Ausdrücken



  • Es ist also ein Funktion vorgegeben, die mit bedingten Ausdrücken geschrieben werden soll.

    Vorgegebene Funktion:

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


  • Und was ist jetzt die Frage?



  • Wie das genau funktioniert 😉

    Und wie ich die Funktion ins Hauptprogramm einbinde !



  • Und selbst hast du überhaupt keine Idee dazu? Sagt dir der Begriff "bedingter Ausdruck" etwas? Kleiner Tipp: ?: Operator ...



  • Ich erarbeite erstmal die normale Fassung für das Programm mit lower, bevor ich da lower mit bedingten Ausdrücken schreiben werde.

    #include <stdio.h>
    
    #define SIZE 1
    
    int lower (char c);
    
    int main(int argc, char* argv[])
    {
      int x;
      char eingabe1[SIZE], Ergebnis;
      printf("Eingabe 1:\n");
      gets(eingabe1);
    
      if (Ergebnis != 0)
      Ergebnis = lower(eingabe1[SIZE-1]);
      else
      for(x = 0; x <= (SIZE-1); x++)
      {
        printf("Das Ergebnis ist %c\n", Ergebnis[x]);
      }
      return 0;
    }
    
    int lower (char c)
    {
      if (c >= 'A' && c <= 'Z')
        return c + 'a' - 'A';
      else
        return c;
    }
    

    Aber er spuckt mir noch einen Fehler bei Ergebnis aus.... "Invalid Direction" ist die Fehleraussage. Daher muss ich daran noch etwas verändern.



  • Die Kommentare sind Hinweise!!!

    #include <stdio.h>
    
    #define SIZE 1
    
    int lower (char c);
    
    int main(int argc, char* argv[])
    {
      int x;
      char eingabe1[SIZE], Ergebnis; // Hier nur Ergebnis!!! //
      printf("Eingabe 1:\n");
      gets(eingabe1);
    
      if (Ergebnis != 0) // hier auch!!! //
      Ergebnis = lower(eingabe1[SIZE-1]); // hier auch!!! //
      else
      for(x = 0; x <= (SIZE-1); x++)
      {
        printf("Das Ergebnis ist %c\n", Ergebnis[x]); // und hier aufeinmal Ergebnis[x]!!!!!//
      }
      return 0;
    }
    
    int lower (char c)
    {
      if (c >= 'A' && c <= 'Z')
        return c + 'a' - 'A';
      else
        return c;
    }
    

    Verbesser das!!! 😃



  • Dann bekomm ich aber wieder den "Invalid Indirection"-Fehler bei der Ausgabezeile mit Ergebnis.

    hmmmm... ich checke das Ganze nochmal durch !

    also ich hab das mal angeglichen, damit überall die gleichen Ergebnisse stehen, aber es gibt dann zwar keinen Fehler vom Compiler, aber vom OS wegen der Speicheradresse.

    #include <stdio.h> 
    
    #define SIZE 1 
    
    int lower (char c); 
    
    int main(int argc, char* argv[]) 
    { 
      int x; 
      char eingabe1[SIZE], Ergebnis[SIZE]; // Hier nur Ergebnis!!! // 
      printf("Eingabe 1:\n");
      gets(eingabe1);
    
      Ergebnis[x] = lower(eingabe1[SIZE-1]); // hier auch!!! //
      for(x = 0; x <= (SIZE-1); x++)
      { 
        printf("Das Ergebnis ist %c\n", Ergebnis[x]); // und hier aufeinmal Ergebnis[x]!!!!!// 
      } 
      return 0; 
    } 
    
    int lower (char c) 
    { 
      if (c >= 'A' && c <= 'Z') 
        return c + 'a' - 'A'; 
      else 
        return c; 
    }
    


  • just in work!!! 😃



  • So compilieren lässt er sich schon mal, aber ich bekomme bei Ergebnis nur das allererste Zeichen klein dargestellt.
    Wenn ich mehr Zeichen eingebe, ignoriert dies das Programm und gibt nichts weiter aus !

    😕



  • Na dann sag doch dass er mehr zeichen in klein umwandeln soll und nicht nur eins!!!!
    Ich ging von deinem Quelltext aus!!!



  • also wenn ich die SIZE verändere, passiert folgendes:
    Anstatt dass ich mehr Zeichen verkleinere, wird erst ab der Position mit der Ausgabe der verkleinerten Zeichen begonnen, an der der maximale define steht.

    Dies bedeutet im Klartext.
    Eingabe 1 = ABCD
    Fall 1 mit #define SIZE 1 - Ausgabe a

    Fall 2 mit #define SIZE 2 - Ausgabe b

    Fall 3 mit #define SIZE 3 - Ausgabe c

    Fall 4 mit #define SIZE 4 - Ausgabe d

    Es wird aber nur das eine Zeichen ausgegeben und nicht die anderen !!! ⚠



  • OHNE WORTE!!! 😉 😃

    #include <stdio.h> 
    
    #define SIZE 10 
    
    int lower (char c); 
    
    int main(int argc, char* argv[]) 
    { 
      int x; 
      char eingabe1[SIZE], Ergebnis[SIZE]; 
      for(x=0;x<=(SIZE-1);x++)
      {
        eingabe1[x]=' ';
        Ergebnis[x]=' ';
      }
      printf("Eingabe 1:\n");
      fgets(eingabe1,SIZE,stdin); 
      for(x=0;x<=(SIZE-1);x++)
      {
        Ergebnis[x] = lower(eingabe1[x]);  
      }
      printf("Das Ergebnis ist:\n");
      for(x = 0; x <= (SIZE-1); x++) 
      { 
        printf("%c", Ergebnis[x]); 
      } 
      return 0; 
    } 
    
    int lower (char c) 
    { 
      if (c >= 'A' && c <= 'Z') 
        return c + 'a' - 'A'; 
      else 
        return c; 
    }
    


  • Das ist ja wie das Programm vom letzten mal....
    hmmm... ich dachte, dass man da was völlig Neues schreiben muss 😮

    Es geht auch logischerweise, weil es fast genauso ist, wie das Programm mit den Zeilen !



  • ist klar:

    #include <stdio.h> 
    #include <string.h>
    
    #define SIZE 20 
    
    int lower (char c); 
    
    int main(int argc, char* argv[]) 
    { 
    	int x; 
    	char szEingabe[SIZE]; 
    	printf("Eingabe 1: ");
    	fgets(szEingabe, SIZE, stdin); // war doch letztes mal schon gesagt, das fgets() viel sicherer ist
    
    	printf("Das Ergebnis ist ");
    
    	for(x = 0; x < (int) strlen(szEingabe); x++)
    	{ 
    		printf("%c", lower(szEingabe[x])); 
    	} 
    
    	printf("\n");
    
    	return 0; 
    } 
    
    int lower (char c) 
    { 
    	if (c >= 'A' && c <= 'Z') 
    		return c + 'a' - 'A'; 
    	else 
    		return c; 
    }
    


  • @Horst2: Sehr gut verbessert!!! 👍



  • @hohesC:
    War nicht verbessert, war gleichzeitig gepostet 😉



  • Warum schreibste denn

    char szEingabe[SIZE];
    

    und nicht ganz normal Eingabe[SIZE] ?

    So pfiffig bin ich noch nicht, um auf diese Zeile zu kommen, aber ist schon mal was Neues, was ich in den nächsten Programmen auf jeden Fall testen kann.

    for(x = 0; x < (int) strlen(szEingabe); x++)
    

    Ich bis dato noch keine vorgefertigte Funktion bei einem Vergleich eingesetzt.



  • Und ohne lower funktion!

    #include <stdio.h> 
    #include <ctype.h>
    #include <string.h>
    
    #define SIZE 20 
    
    void main() 
    { 
        int x; 
        char szEingabe[SIZE]; 
        printf("Eingabe 1: "); 
        fgets(szEingabe, SIZE, stdin);   
        printf("Das Ergebnis ist: "); 
        for(x = 0; x < (int) strlen(szEingabe); x++) 
          printf("%c", tolower(szEingabe[x])); 
    }
    

    😃 😃



  • Da sieht das Ganze wesentlich kürzer aus muss ich mal sagen, aber ich muss es leider ja so machen und kann keine Sachen da auslassen, aber ich sehe schon, dass ihr das alles drauf habt.

    So ich guck jetzt nur noch mal, wie ich die Funktion von lower mit bedingten Ausdrücken schreiben muss und dann poste ich die Endvariante des Programms.

    😃



  • cHillb3rT schrieb:

    Warum schreibste denn

    char szEingabe[SIZE];
    

    und nicht ganz normal Eingabe[SIZE] ?

    Das nennt sich ungarische Notation. Dadurch kann man im Programm leichter erkennen von welchem Datentyp die Variable ist, ohne das man jedes mal die Definition nachschauen muss. sz bedeutet "string zero", als null-terminierter string

    cHillb3rT schrieb:

    Ich bis dato noch keine vorgefertigte Funktion bei einem Vergleich eingesetzt.

    Solltest aber vorgefertigte Funktionen einsetzen, dafür sind sie da und nehmen die viel arbeit ab


Log in to reply