C - Klausuraufgabe - Brauche eure Hilfe



  • wxSkip schrieb:

    _Falkes Code kann man aber ganz leicht so abändern, dass er ohne if-Abfrage immer funktioniert.

    Ja, und das mach' ich auch mal schnell.

    #include <stdio.h>
    int main(void)
    {
      int eingabe;
      const char* def = "";
      const char* nr;
    
      scanf("%d", &eingabe);
      switch(eingabe)
      {
        case 5: nr="Fuenf"; break;
        case 6: nr="Sechs"; break;
        case 7: nr="Sieben"; break;
        case 8: nr="Acht"; break;
        case 9: nr="Neun"; break;
        default: nr = def; break;
      }
      puts(nr);
    
      return 0;
    }
    


  • --jr-- schrieb:

    Aber die Aufgabe soll doch ohne If oder If else geloest werden...

    Das habe ich überlesen sry.



  • scanf("%d", &eingabe);
    
    gefordert war: welches ein Zeichen von der Tastatur einliest.
    

    Kann schon keine volle Punktzahl mehr geben.



  • dabei hat wutz vollkommen recht...

    int main(){
    
      char eingabe;
      const char* zahl;
    
      printf("Geben sie eine Zahl zwischen 1 und 5 ein!\n");
      scanf("%c", &eingabe);
    
      eingabe-=48; // 1 = 49, 2 = 50, 3 = 51 etc. wenn man davon jetzt 48 abzieht, kommt
      // man auf den gewünschten wert, aber achtung: in eingabe steht jetzt ein Steuerungs-
      // zeichen
    
      switch(eingabe){
    
        case 1: zahl="EINS"; break;
        case 2: zahl="ZWEI"; break;
        case 3: zahl="DREI"; break;
        case 4: zahl="VIER"; break;
        case 5: zahl="FÜNF"; break;
        default: zahl="Falsche Eingabe!";
      }
    
      puts(zahl);
    
      return 0;
    }
    


  • itedvo schrieb:

    dabei hat wutz vollkommen recht...

    int main(){
     
      char eingabe;
      const char* zahl;
    
      printf("Geben sie eine Zahl zwischen 1 und 5 ein!\n");
      scanf("%c", &eingabe);
    
      eingabe-=48; // 1 = 49, 2 = 50, 3 = 51 etc. wenn man davon jetzt 48 abzieht, kommt
      // man auf den gewünschten wert, aber achtung: in eingabe steht jetzt ein Steuerungs-
      // zeichen
    
      switch(eingabe){
    
        case 1: zahl="EINS"; break;
        case 2: zahl="ZWEI"; break;
        case 3: zahl="DREI"; break;
        case 4: zahl="VIER"; break;
        case 5: zahl="FÜNF"; break;
        default: zahl="Falsche Eingabe!";
      }
    
      puts(zahl);
    
      return 0;
    }
    

    Dsa richtige Funktionieren deines Codes wird von ANSI C aber auch nicht garantiert. ('0' muss nicht gleich 48 sein, Ü muss es vielleicht gar nicht im Zeichensatz geben). Macht es doch einfach mit case '5':, case '6', usw.



  • bist jetzt hat es bei mir immer super funktioniert, ok die
    umlaute sind nicht enthalten, dafür hab ich mir auch was geschrieben:

    #ifndef DEF_H
    #define DEF_H
    
    #define AE (unsigned char)142
    #define ae (unsigned char)132
    #define OE (unsigned char)153
    #define oe (unsigned char)148
    #define UE (unsigned char)154
    #define ue (unsigned char)129
    #define ss (unsigned char)225
    
    #endif /* DEF_H */
    


  • Oh Gott, hilf!



  • ach, wieso? es funktioniert und das zählt für mich...



  • itedvo schrieb:

    ach, wieso? es funktioniert und das zählt für mich...

    Das haben die AKWe in Japan bis jetzt auch. 🙄



  • bis auf den unterschied dass dieser programm-code nicht radio aktiv ist



  • itedvo schrieb:

    bis auf den unterschied dass dieser programm-code nicht radio aktiv ist

    Ja, und wenn er noch ein Backup in den USA macht ist er auch noch ziemlich sicher vor Naturkatastrophen.



  • wxSkip schrieb:

    itedvo schrieb:

    bis auf den unterschied dass dieser programm-code nicht radio aktiv ist

    Ja, und wenn er noch ein Backup in den USA macht ist er auch noch ziemlich sicher vor Naturkatastrophen.

    das wäre dann der anfang vom ende ^^

    nein, jetzt wirklich, was is an meinem code jetzt so schlimm ?


  • Mod

    itedvo schrieb:

    nein, jetzt wirklich, was is an meinem code jetzt so schlimm ?

    Zweibuchstabige Makros.



  • aha, und was währe für ä besser geignet als ae? etwa _ae was wiederum etwas ist
    was man vermeiden sollte, da underscore schon verwendet sein kann...

    was wären den bessere namen? damit ich es nächstes mal besser machen kann...


  • Mod

    itedvo schrieb:

    aha, und was währe für ä besser geignet als ae? etwa _ae was wiederum etwas ist
    was man vermeiden sollte, da underscore schon verwendet sein kann...

    was wären den bessere namen? damit ich es nächstes mal besser machen kann...

    1. Namen nehmen die nicht extrem häufig zufällig vorkommen können.
    2. Wozu überhaupt diese Makros? Entweder kennt deine Plattform die Zeichen sowieso - in diesem Fall kannst du sie direkt in die Stringliterale schreiben - oder sie kennt sie nicht und es kommt trotz der Makros Zeichensalat heraus.



  • Auf Windows ist sowas notwendig 😃
    <-- MacUser



  • Habe jetzt eine Loesung die funktioniert und fuer mich am durchschaubarstem erscheint:

    #include <stdio.h>
    int main(void)

    {
    int eingabe;

    scanf("%d", &eingabe);

    switch(eingabe)
    {
    case 5: printf("fuenf\n"); break;
    case 6: printf("Sechs\n"); break;
    case 7: printf("Sieben\n"); break;
    case 8: printf("Acht\n"); break;
    case 9: printf("Neun\n"); break;
    default: printf("hau rein!\n");break;
    }
    return 0;
    }

    Ist die Loesung legitim oder funktioniert es nur so in diesem Fall?

    Beste Gruesse



  • Du sollst einen char einlesen...



  • SeppJ schrieb:

    itedvo schrieb:

    aha, und was währe für ä besser geignet als ae? etwa _ae was wiederum etwas ist
    was man vermeiden sollte, da underscore schon verwendet sein kann...

    was wären den bessere namen? damit ich es nächstes mal besser machen kann...

    1. Namen nehmen die nicht extrem häufig zufällig vorkommen können.
    2. Wozu überhaupt diese Makros? Entweder kennt deine Plattform die Zeichen sowieso - in diesem Fall kannst du sie direkt in die Stringliterale schreiben - oder sie kennt sie nicht und es kommt trotz der Makros Zeichensalat heraus.

    ach so... was die makros angeht hat 314159265358979 schon recht... auf Windows,
    vorallem auf Consolen Ebene wird zum beispiel bei einem

    printf("Die Bären");
    

    anstatt ein ä irgendwas ausgegeben...

    wxSkip schrieb:

    Dsa richtige Funktionieren deines Codes wird von ANSI C aber auch nicht garantiert. ('0' muss nicht gleich 48 sein, Ü muss es vielleicht gar nicht im Zeichensatz geben). Macht es doch einfach mit case '5':, case '6', usw.

    weiteres hab ich jetzt ein wenig nachgeforscht und es hat sich endgültig ergeben,
    dass die Zahl 0 im ASCII-Code als 48 definiert ist. weiteres haben alle höhere
    Zeichentabellen den ASCII-Code am Anfang sprich es wird auf dem ASCII-Code
    aufgebaut. [Links folgen] Was soviel bedeutet wie, dass in so gut wie jeder Darstellung folgendes
    korrekt ist:

    int main(){
    
      char zeichen;
    
      scanf("%c", &zeichen); // es wurde die Zahl (!) 5 eingelesen --> zeichen = 53
    
      printf("%d", zeichen-48); // es wird 5 ausgegeben
    
      return 0;
    }
    

    woraus dann folglich richtig ist:

    int main(){
    
      char eingabe;
    
      scanf("%c", &eingabe);
    
      eingabe-=48;
    
      switch(eingabe){
    
         case 1: printf("EINS\n"); break;
         case 2: printf("ZWEI\n"); break;
         case 3: printf("DREI\n"); break;
         case 4: printf("VIER\n"); break;
         case 5: printf("FÜNF\n"); break; 
         default: printf("Falsche Eingabe\n");
      }
    
      return 0;
    }
    


  • Zu den Makros: Da kann man ja trotzdem Konstanten nehmen. Außer, du willst gleich so etwas machen:

    #ifndef DEF_H
    #define DEF_H
    
    const unsigned char AE = 142;
    const unsigned char ae = 132;
    const unsigned char OE = 153;
    const unsigned char oe = 148;
    const unsigned char UE = 154;
    const unsigned char ue = 129;
    const unsigned char ss = 225;
    
    #define STR_AE "\x8e"
    #define STR_ae "\x84"
    //usw...
    
    #endif /* DEF_H */
    
    #include <stdio.h>
    #include "def.h"
    
    int main()
    {
        printf("Echt " STR_UE "bel");
    }
    

    Zu 48: Warum nimmst du nicht einfach '0'? Das funktioniert auch bei nicht-ASCII und ist leichter lesbar.

    P.S.: Vielleicht kannst du mit Windows-Spezifischen Sachen erreichen, dass deine Umlaute auch normal in Stringliteralen richtig ausgegeben werden. Ich glaube, ich habe das mal herausgefunden (vielleicht war's auch mit Locales), es aber nicht benutzt, weil diese Funktion dann noch eine Debugausgabe gemacht hat, die ich nicht wollte.


Anmelden zum Antworten