Ergebnis 1 bis 8 von 8
  1. #1
    Fortgeschrittener
    Registriert seit
    24.05.2010
    Beiträge
    35

    Standard Fragen zum Befehl ? :

    Hallo zusamen ich arbeite mich grade durch diese Seite bei Punkt 5.5 kommt eine Aufgabe bei der man einen mini Taschenrechner macht der jeweils 2 zahlen + - * oder / macht. Die Lösung davon sieht so aus

    Code:
    #include <stdio.h>
    
    int main(int argc, char *argv[])
    {
            int x,z1,z2,ergebnis;
            
            printf("Welche Operation möchtest du durchführen?\n");
            printf("1. Addition\n");
            printf("2. Subtraktion\n");
            printf("3. Multiplikation\n");
            printf("4. Division\n");
            printf("5. Programm beenden\n");
            scanf("%d", &x);
            
            if (x>4?0:x<1?0:1)
            {
                    printf("Eingabe: %d\n", x);
                    printf("Gib die 1. Zahl ein: ");
                    scanf("%d", &z1);
                    printf("Gib die 2. Zahl ein: ");
                    scanf("%d", &z2);
            
                    printf("Ergebnis: ");
                    switch(x)
                    {
                            case 1:
                                    ergebnis=z1+z2;
                                    printf("%d + %d = %d\n", z1, z2, ergebnis);
                                    break;
                            case 2:
                                    ergebnis=z1-z2;
                                    printf("%d - %d = %d\n", z1, z2, ergebnis);
                                    break;
                            case 3:
                                    ergebnis=z1*z2;
                                    printf("%d * %d = %d\n", z1, z2, ergebnis);
                                    break;
                            case 4:
                                    ergebnis=z1/z2;
                                    printf("%d / %d = %d", z1, z2, ergebnis);
                                    if (z1%z2!=0)
                                    {
                                            ergebnis=z1%z2;
                                            printf(" Rest %d", ergebnis);
                                    }
                                    printf("\n");
                    }
            }
            else
            {
                if (x!=5)
                {
                   printf("Falsche Eingabe!\n");
                   return 1;
                }
            }
            printf("Vielen Dank für das Benutzen dieses Programms!\n");
            
            return 0;
    }
    so und nun zu frage bei dem Befehl der Fett ist verstehe ich nicht warum die letze zahl eine 1 ist ? eigentlich sollte das doch ein x sein oder sehe ich das falsch ? Wenn da eine 1 steht so müsst aus dem x eine 1 werden un immer nur der 1 Fall auftreret also die addition. Hoffe ihr versteht was ich meine und einer kann mir das erklären ^^
    Geändert von °Light° (29.05.2010 um 20:12 Uhr)

  2. #2
    Der mit Anatidaephobie Avatar von blackberry
    Registriert seit
    11.07.2008
    Beiträge
    2.350

    Standard

    Eigentlich sollte man diesen Source gleich löschen und nie wieder davon sprechen, damit niemals jemand einen so schlechten Stil nachmacht.
    Ich bitte dich: gewöhne dir das NIE an!

    Was der Typ hier macht ist in einem If zweimal einen Ternery-Operator verschachtelt zu benutzen.
    Geklammert sieht das so aus:
    x>4 ? 0 : (x<1 ? 0 : 1)

    Es steht also da:
    0, wenn x > 4, oder x < 1
    1, wenn nicht 0 (also 1 <= x <= 4)

    In C gibt es eine besondere Art Wahrheitswerte auszudrücken:
    0 = falsch
    alles ungleich 0 = wahr (folglich: 1 = wahr)

    Sollte also aufgrund der Bedingungen im Ternary-Operator eine 0 rauskommen wird der Code der zur If-Abfrage gehört nicht ausgeführt - sollte dort eine 1 stehen jedoch schon.


    Besserer Stil:
    if (x >= 1 && x <= 4)

    oder:
    if (!(x < 1 || x > 4))

    PDFTT cr3w a.E. — ReiDC0Re, lindor, Sera, berry
    please do feed the trolls crew and elk
    Ehrenwerte Mitglieder im Ruhestand: OpCodez, SFX.
    "Was sich blackberry gerade denkt" — Vorsicht! Frei laufender Wahnsinn!
    Zitat von fuckinghot19: "PS: Blackberry ist auf FH der Trollkönig ^^."
    An dieser Stelle danke ich all meinen Fans und Hatern gleichermaßen ^.^

  3. #3
    Fortgeschrittener
    Registriert seit
    24.05.2010
    Beiträge
    35

    Standard

    ahh jetz verstehe ich es deine art das zu schreiben ist eindeutig viel einfacher zu verstehen. Danke dir BlackBerry

    noch iene Frage wenn ich ein "oder" negiere also !(||) dann wird daraus ein "und" also && ist das richtig ?
    Geändert von °Light° (29.05.2010 um 21:54 Uhr)

  4. #4
    Master of Porn Avatar von sp1nny
    Registriert seit
    28.05.2007
    Beiträge
    533

    Standard

    Nein.

    Bei dieser Aufgabe wäre es dann nach deiner Logik:

    if (!(x < 1 || x > 4))
    ->
    if (x < 1 && x > 4)

    Dies kann deshalb schon nicht sein, da es keine Zahl gibt die kleiner 1 und gleichzeitig größer 4 ist.
    Dies würde zudem zu einem Fehler führen, da Zahlen Ausserhalb {1, 2, 3 ,4} garnicht bearbeitet werden könnten (in der Aufgabe (die IF-Abfrage schließt ja diesen Bereich aus)).

    Das '||' liefert ein true zurück wenn eine der beiden Bedingungen zutrifft. Dieses wird mit '!' zu einem false. '&&' wird false wenn nur eine oder keine der beide Bedinungen zutreffen.

    (true || true) -> true
    (true || false) -> true
    (false || false) -> false

    ___ Umkehrung ___

    (!(true || true)) -> false
    (!(true || false)) -> false
    (!(false || false)) -> true

    ___ ungleich ___

    (true && true) -> true
    (true && false) -> false
    (false && false) -> false
    Geändert von sp1nny (30.05.2010 um 00:07 Uhr)
    XMPP: sp1nny @ exploit.im
    MAIL: sp1nny @ tuta.io

    PGP:

    Wir müssen wissen — wir werden wissen.


  5. #5
    Fortgeschrittener
    Registriert seit
    24.05.2010
    Beiträge
    35

    Standard

    ahso okay ich ich habe das mit größer und kleiner nicht berucksichtigt.
    Danke nochmal für die Erklärung

    Mfg °LIGHT°

    habe da nochmal so ne frage da ich kein neues thema öffnen wollte schreib ichs hier rein
    ich habe in wxdev c++ folgendes geschrieben
    Code:
    #include <stdio.h>
    #include <conio.h> 
    
    main()
    {
      char buchstabe;
      
      printf ("Gebe einen Buchstaben ein: ");
      scanf ("%c", buchstabe);
      fflush(stdin);
      
      printf("Sie haben %c eingegeben\n", buchstabe);
      getch();
      
    }
    wen ich das ausfürhe sollte mir am ende der buchstabe gezeigt werden den ich eingegeben habe aber ich kireg immer diese Meldung liegt das an wxdev c++ oder an mir ^^
    Geändert von °Light° (30.05.2010 um 10:48 Uhr) Grund: Automerged Doublepost

  6. #6
    Der mit Anatidaephobie Avatar von blackberry
    Registriert seit
    11.07.2008
    Beiträge
    2.350

    Standard

    scanf ("%c", &buchstabe);

    Edit: Erklärung:
    C übergibt Variablen in der Regel "by value" - das heißt nur den Wert.
    Für scanf heißt das, dass es im Grunde keine Ahnung hat wo deine Variable liegt - du übergibst nur deren Wert - eine lokale Änderung dieses Wertes in scanf selber hat keine Auswirkungen nach außen.

    Um dieses Problem zu überwinden nimmt scanf nur Adressen von Variablen an (in der Praxis natürlich auch anderes, da scanf es nicht überprüfen kann, das führt jedoch zu dem dir bekannten Fehler).

    Scanf macht dann im Grunde sowas wenn etwas eingelesen wurde und das nun gespeichert werden soll:
    *((int *) dieAdresseVonDerVariablen) = was auch immer

    Wenn du nur einen char übergibst steht da ein Wert von 0 bis 0xFF drin und es wird versucht das eingelesene an diese Speicheradresse zu schreiben - das führt zu fehlern.

    Edit 2:
    Bitte bitte bitte NIEMALS einfach nur main() { ... schreiben.
    main ist eine Funktion, die einen Integer zurückgibt und sollte darum auch int main() { ... heißen.
    Das sage ich nicht, weil es einfach schöner und sauberer ist, sondern weil die andere Variante falsch ist.
    Sollte dein Compiler das tatsächlich fressen, dann stammt er entweder aus dem letzten Jahrhundert (im C-89 Standart war das noch erlaubt), oder ist einfach kein echter C-Compiler.
    Geändert von blackberry (30.05.2010 um 11:08 Uhr)

    PDFTT cr3w a.E. — ReiDC0Re, lindor, Sera, berry
    please do feed the trolls crew and elk
    Ehrenwerte Mitglieder im Ruhestand: OpCodez, SFX.
    "Was sich blackberry gerade denkt" — Vorsicht! Frei laufender Wahnsinn!
    Zitat von fuckinghot19: "PS: Blackberry ist auf FH der Trollkönig ^^."
    An dieser Stelle danke ich all meinen Fans und Hatern gleichermaßen ^.^

  7. #7
    Master of Porn Avatar von sp1nny
    Registriert seit
    28.05.2007
    Beiträge
    533

    Standard

    Du hast den Adressoperator (&) bei scanf vergessen.

    Code:
    #include <stdio.h>
    #include <conio.h> 
    
    main()
    {
      char buchstabe;
      
      printf ("Gebe einen Buchstaben ein: ");
      scanf ("%c", &buchstabe);
      fflush(stdin);
      
      printf("Sie haben %c eingegeben\n", buchstabe);
      getch();
      
    }
    XMPP: sp1nny @ exploit.im
    MAIL: sp1nny @ tuta.io

    PGP:

    Wir müssen wissen — wir werden wissen.


  8. #8
    Fortgeschrittener
    Registriert seit
    24.05.2010
    Beiträge
    35

    Standard

    ajajaj immer diese keleine dinge ^^ danke euch

Ähnliche Themen

  1. Flush BefehL in C++
    Von TiduS im Forum C, C++
    Antworten: 6
    Letzter Beitrag: 04.09.2008, 15:34
  2. Antworten: 10
    Letzter Beitrag: 30.08.2008, 19:52
  3. [S] Befehl für .bat
    Von Medicin_man im Forum Sonstige Programmiersprachen
    Antworten: 7
    Letzter Beitrag: 22.08.2008, 22:33
  4. Extahieren befehl
    Von big earl im Forum GFX Angebote & Wünsche
    Antworten: 0
    Letzter Beitrag: 01.12.2007, 17:25

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •