Frage zu Funktionsvariablen



  • Nehmen wir an cih hätte folgende Funktion geschrieben:

    int wertauslesen(int ergebnis){
        int wert1, wert2, ergebnis;
        char zeichen;
        printf("Bitte geben sie hier die Aufgabe ein: ");
        scanf("%i", wert1);
        getchar(zeichen);
        scanf("%i", wert2);
    
        switch(zeichen){
                  case '+': ergebnis: wert1+wert2;
                  case '-': ergebnis: wert1-wert2;
                  case '*': ergebnis: wert1*wert2;
                  case '/': ergebnis: wert/wert2;
                  }
        return ergebnis;
    }
    

    Dann müsste ich in main doch nur die Variable ergebnis deklarieren oder müsste ich auch ncoh wert1, wert2 usw. deklariern??

    Weil ich hab das mit Funktionen so verstanden das man nur eine Variable für den Wert der in den Parametern steht für main zur verfügen stellen muss oder???



  • Du kannst auch jetzt schon deine Funktion so

    int wertauslesen(void)
    

    definieren.
    Der Compiler muss doch schon in Zeile 2 eine Warnung gemeldet haben, da du die Variable ergebnis ein zweites mal benutzt.

    Variablen aus Funktionen haben nichts mit den Variablen aus anderen Funktionen zu tun. (Es sei denn es sind globale Variablen)



  • int wertauslesen(void){
        int wert1, wert2, ergebnis;
        char zeichen;
        printf("Bitte geben sie hier die Aufgabe ein: ");
        scanf("%i", wert1);
        getchar(zeichen);
        scanf("%i", wert2);
    
        switch(zeichen){
                  case '+': ergebnis: wert1+wert2;
                  case '-': ergebnis: wert1-wert2;
                  case '*': ergebnis: wert1*wert2;
                  case '/': ergebnis: wert/wert2;
                  }
        return ergebnis;
    }
    
    int main (void) {
        printf ("\nErgebnis: %d\n", wertauslesen() );
        return(0);
    }
    

    Auf diese Art und Weise könntest Du allerdings die in der Funktion "wertauslesen()" abgefragten wert1 und wert2 nicht mehr verwenden, um sie in main mit auszugeben (à la '1' + '2' = '5' (widiwidiwitt und 3 macht Neune!)).

    Dafür müßtest Du die Ausgabe entweder in wertauslesen() bereits printen, da dort die lokalen Variablen noch bekannt sind, dafür brauchst Du dann auch das ergebnis nicht mehr returnen, hast Du ja schließlich schon ausgegeben. somit könnte die Funktion eine "void wertauslesen(void)" werden.

    Was Du wahrscheinlich eher im Sinn hattest, war etwas ähnliches wie das hier:

    int wertauslesen(int * pwert1, int * pwert2, char * pzeichen){
        int ergebnis;    
        printf("Bitte geben sie hier die Aufgabe ein: ");
        scanf("%i", wert1);
        getchar(zeichen);
        scanf("%i", wert2);
    
        switch(zeichen){
                  case '+': ergebnis: wert1+wert2;
                  case '-': ergebnis: wert1-wert2;
                  case '*': ergebnis: wert1*wert2;
                  case '/': ergebnis: wert/wert2;
                  }
        return ergebnis;
    }
    
    int main (void) {
        int wert1, wert2, ergebnis;
        char zeichen;
        ergebnis = wertauslesen(&wert1, &wert2, zeichen);
        printf ("\nErgebnis: %d %c %d = %d\n", wert1, zeichen, wert2, ergebnis);
        return(0);
    }
    

    Abgesehen davon, dass da sicherlich von mir noch Syntaxfehler drin sind, solltest Du folgendes im Auge behalten:

    Eine Division zweier Ganzzahlen kann schnell mal eine Kommazahl ergeben... (7:2=3,5).
    Int kennt aber kein Komma, also solltest Du mit Double arbeiten, zumindest im Ergebnis (Fließkommazahl mit "doppelter Genauigkeit").

    Desweiteren holt sich zwar getchar ein Zeichen aus dem Tastaturpuffer (das Du eingibst), allerdings kann da schnell mal ein Zeilenumbruch drin schlummern, der dann statt der nächsten Eingabe gelesen wird. Dazu gibts schon verschiedene kleine Hilfsschnipsel, die Du über die Suchfunktion finden wirst.



  • http://www.c-plusplus.net/forum/39349

    Das wäre wohl übrigens entsprechender Link zur Erklärung des "Zeilenumbruchs" im Tastaturpuffer.

    Kurz von einem Blödi umschrieben:
    Wenn Du getchar() aufrufst, wartet das Programm auf eine Eingabe. Du gibst z.B. ein "+" ein - soweit, so gut. Dann gibst Du ihm aber noch ein Enter -> das ist ein Zeilenumbruch. (\n in Linux)
    Der gammelt dann so lange in Deinem Tastaturpuffer, bis ein weiteres getchar() ihn holt oder ein anderer Aufruf ihn rausfischt oder den Puffer entsprechend leert.

    Deshalb könnte in einem ähnlichen Programm ein zweites gewünschtes eingegebenes Zeichen automatisch mit '\n' befüllt werden, statt die Abfrage auszuführen.

    Gern gemachter Anfängerfehler (von mir sehr häufig) und mit einer einfachen Schleife à la

    while ((zeichen = getchar()) != '\n') {
        zeichenkette[x] = zeichen;
        x++;
    }
    

    So frage ich (ungefähr) heutzutage Strings in meinen Anwendungen ab. Damit bekomme ich nämlich auch alle Leerzeichen und Sonderzeichen mitgeliefert, bis eben Enter gedrückt wird.


Log in to reply