Problem bei Unterprgramm Rückgabe Werten



  • Also ich hab da mal wieder nen Problem.

    Ich sitz grad an nem Programm was die Fakultät berechnet, ausgelaggert in 3 unterprogramm:
    1.UP ließt wert ein
    2.UP berechnet fakultät
    3.UP gibt fakultät aus.

    Also das 2te und das 3te hab ich ohne Probleme hinbekommen,
    es hängt bei mir nur an den Rückgabe wert des ersten UP.
    Wichtig ist, das die Signatur unsigned eingabe (void) beibehalten werden soll.

    Das Prog iseht folgendermaßen aus:

    #include <stdio.h>              
    #include <stdlib.h>
    #include <conio.h>
    #include <string.h>
    
    unsigned eingabe (void);
    unsigned fakul_berechnung (unsigned);
    void ausgabe (unsigned);
    
    unsigned eingabe (void)
    {
    	unsigned int z;
    	printf("\n\tF A K U L T A E T E N - R E C H N E R\n\n");   
        printf("Geben sie einen Wert zwischen 2 und 10 ein\n");
    	printf("Eingabe von 0 als Wert Beendet das Programm\n");   
    	scanf("%i",&z); 
    	return z;
    }
    
    unsigned fakul_berechnung (unsigned y)
    {
    	unsigned int x;
        for(x=y; x>1; x=x - 1)		
    		{
    		    y = y * (x - 1);      	
    		}
    
    	return y;
    }
    
    void ausgabe (unsigned x)
    {
    	printf("%i\n\n",x);          
    }
    
    int main(void)                     
    {                              
    unsigned int wert;                     
    
    	do                          
    	{
             eingabe ();
             wert = eingabe ();   //???
    
    	     if(wert>1 && wert < 10 )        
    		 {
             fakul_berechnung (wert);
    
    		 wert= fakul_berechnung (wert);
    		 ausgabe (wert);
    		 }
    
    	     else if (wert == 0)
    		 { 
    		 }        
    
    	     else                           
    		 {                              
    		  printf("FEHLER:\nWertebereich ueberschritten,"); 
    		  printf("bitte erneute Eingabe taetigen!\n\n");     
    		 }                              
    
    	}while (wert<0 || wert >10 );   
    return 0;
    }
    

    Proble mist den rückgabe wert z aus dem ersten UP gleichzusetzen mit wert im HP:

    also hier:

    eingabe ();
             wert = eingabe ();   //???
    


  • Hi,
    "wert = eingabe ();"

    kannst du schon machen, es ist mir auch schleierhaft, was denn nun das genaue Problem darstellt.Ein paar Tipps:

    -ersetze "unsigned" z.B. bei der Rückgabe von "eingabe" durch "unsigned int" und an anderen Stellen wo nur unsigned steht auch.

    -In der For Schleife "x=x - 1" schreibt man "x--" (dekrementieren)
    oder x++ (inkrementieren)

    -mit "wert= fakul_berechnung (wert);" überschreibst du dir den vorher eingegebenen Wert. "int ergebnis=fakul_berechnung (wert);" wäre um viele schöner

    -int main() solltest du generell nochmal überdenken.

    Gruß Andy



  • Hm also ich habe da nen merkwürdigen fehler bei der eingabe im programm fest gestellt.

    - wert einlesen
    - keine berechnung
    - wert erneut einlesen
    - berechnung

    wiso bekommt er da einfach erst beim zweiten mal den wert mit ?



  • Du rufst zweimal hintereinander eingabe() auf, also liest dein Programm auch zwei Werte ein, bevor es weitermacht (und ignoriert den ersten). Also ist die Lösung recht einfach: Lass das alleinstehende eingabe(); am Anfang der do-while-Schleife weg.

    wwwAndy schrieb:

    -ersetze "unsigned" z.B. bei der Rückgabe von "eingabe" durch "unsigned int" und an anderen Stellen wo nur unsigned steht auch.

    Unnötig - 'unsigned' ist eine Kurzform für 'unsigned int'

    -In der For Schleife "x=x - 1" schreibt man "x--" (dekrementieren)
    oder x++ (inkrementieren)

    Oder noch besser "--x"

    -mit "wert= fakul_berechnung (wert);" überschreibst du dir den vorher eingegebenen Wert. "int ergebnis=fakul_berechnung (wert);" wäre um viele schöner

    Wenn man den Ausgangswert nicht mehr braucht, kann man die Variable auch wiederverwenden.

    -int main() solltest du generell nochmal überdenken.

    Wieso? Das ist eine der beiden Möglichkeiten, nach ANSI-Standard die main() zu deklarieren.



  • CStoll schrieb:

    wwwAndy schrieb:

    -ersetze "unsigned" z.B. bei der Rückgabe von "eingabe" durch "unsigned int" und an anderen Stellen wo nur unsigned steht auch.

    Unnötig - 'unsigned' ist eine Kurzform für 'unsigned int'

    Klar, aber ist keine "gängige Notation" und für Anfänger etwas verwirrend, wenn man den typedef nicht kennt.

    CStoll schrieb:

    -In der For Schleife "x=x - 1" schreibt man "x--" (dekrementieren)
    oder x++ (inkrementieren)

    Oder noch besser "--x"

    Nicht wirklich besser, da "--x" in der For-Schleife das gleiche bewirkt wie "x--" und der Urban Legend, dass "--x" hier schneller sei, habe ich auch lange geglaubt, bis ich mir den Assemblercode angeschaut habe..

    CStoll schrieb:

    -mit "wert= fakul_berechnung (wert);" überschreibst du dir den vorher eingegebenen Wert. "int ergebnis=fakul_berechnung (wert);" wäre um viele schöner

    Wenn man den Ausgangswert nicht mehr braucht, kann man die Variable auch wiederverwenden.

    Bei dem Fragesteller handelt es sich um einen Anfänger, gibst du mir da Recht?
    Und da sollte man IMHO sauber programmieren und Variablen für verschiedene Werte (einmal Eingabe, das andere Mal berechneter Wert) nicht mixen. Um es klar zu stellen, es geht mir hier nicht nur um die Funktion sondern Übersichtlich, sauber, Anfängergerecht zu sein.

    CStoll schrieb:

    -int main() solltest du generell nochmal überdenken.

    Wieso? Das ist eine der beiden Möglichkeiten, nach ANSI-Standard die main() zu deklarieren.

    Ja sicher, wenn du damit "int main()" , "int main(int argc, char* argv[])" und "int main(int argc, char** argv)" meinst. Ich beanstande nicht die Funktionssignatur sondern die IMPLEMENTATION der Funktion, wie z.B. die 2 Aufrufe von "fakul_berechnung" und "eingabe"

    Gruß Andy



  • wwwAndy schrieb:

    ...

    CStoll schrieb:

    -In der For Schleife "x=x - 1" schreibt man "x--" (dekrementieren)
    oder x++ (inkrementieren)

    Oder noch besser "--x"

    Nicht wirklich besser, da "--x" in der For-Schleife das gleiche bewirkt wie "x--" und der Urban Legend, dass "--x" hier schneller sei, habe ich auch lange geglaubt, bis ich mir den Assemblercode angeschaut habe.....

    Naja, da muß ich ja CStoll mal ein wenig in Schutz nehmen: In C++ ist das nämlich keine "urban legend".

    Die Aussage bedeutet auch nicht, dass prefix-inc IMMER schneller sei als postfix-inc, sondern dass prefix-inc schneller sein KANN und deswegen (wo sinnvoll möglich) prefix verwenden sollte. (schad' ja auch nix)
    ... und dass man das dann auch in C macht, halte ich für normal.

    Gruß,

    Simon2.

    P.S.: Hast Du Dir den Assemblercode einer optimierten Version angesehen oder einer unoptimierten ?



  • wwwAndy schrieb:

    CStoll schrieb:

    wwwAndy schrieb:

    -ersetze "unsigned" z.B. bei der Rückgabe von "eingabe" durch "unsigned int" und an anderen Stellen wo nur unsigned steht auch.

    Unnötig - 'unsigned' ist eine Kurzform für 'unsigned int'

    Klar, aber ist keine "gängige Notation" und für Anfänger etwas verwirrend, wenn man den typedef nicht kennt.

    Das ist kein typedef, sondern eine nach Standard definierte Abkürzung 😉

    CStoll schrieb:

    -In der For Schleife "x=x - 1" schreibt man "x--" (dekrementieren)
    oder x++ (inkrementieren)

    Oder noch besser "--x"

    Nicht wirklich besser, da "--x" in der For-Schleife das gleiche bewirkt wie "x--" und der Urban Legend, dass "--x" hier schneller sei, habe ich auch lange geglaubt, bis ich mir den Assemblercode angeschaut habe..

    --x kann schneller sein als x--, auf jeden Fall ist es nicht langsamer (das liegt aber alles im Ermessen des Compilers).

    (Anmerkung: Ich arbeite primär mit C++ - und gerade mit eigenen Klassen gibt es durchaus Geschwindigkeits-Unterschiede zwischen Pre- und Post-Inkrement. Da solltest du dir lieber gleich die (potentiell) schnellere Version angewöhnen.)

    CStoll schrieb:

    -mit "wert= fakul_berechnung (wert);" überschreibst du dir den vorher eingegebenen Wert. "int ergebnis=fakul_berechnung (wert);" wäre um viele schöner

    Wenn man den Ausgangswert nicht mehr braucht, kann man die Variable auch wiederverwenden.

    Bei dem Fragesteller handelt es sich um einen Anfänger, gibst du mir da Recht?
    Und da sollte man IMHO sauber programmieren und Variablen für verschiedene Werte (einmal Eingabe, das andere Mal berechneter Wert) nicht mixen. Um es klar zu stellen, es geht mir hier nicht nur um die Funktion sondern Übersichtlich, sauber, Anfängergerecht zu sein.

    OK, das ist ein Argument. Aber das solltest du auch dazubringen.

    CStoll schrieb:

    -int main() solltest du generell nochmal überdenken.

    Wieso? Das ist eine der beiden Möglichkeiten, nach ANSI-Standard die main() zu deklarieren.

    Ja sicher, wenn du damit "int main()" , "int main(int argc, char* argv[])" und "int main(int argc, char** argv)" meinst. Ich beanstande nicht die Funktionssignatur sondern die IMPLEMENTATION der Funktion, wie z.B. die 2 Aufrufe von "fakul_berechnung" und "eingabe"

    Dann sag auch gleich dazu, was du meinst 😉

    Generell: Wenn du Tips geben willst, wie es besser geht, mach das. Aber gerade bei Anfängern (und du hast selber festgestellt, daß Dragonslayer vermutlich ein Anfänger ist) solltest du auch begründen, warum man es besser so machen sollte, wie du sagst. Und der einzige Tip, der tatsächlich etwas mit dem Problem zu tun hatte, war der Hinweis auf "int main()" - und der war zu allgemein gehalten, um wirklich weiterzuhelfen. Da kannst du das nächste mal auch ein "das geht so nicht" drunterschreiben, der Informationsgehalt ist der gleiche :xmas2:.



  • Simon2 schrieb:

    In C++ ist das nämlich keine "urban legend".

    und warum heisst C++ dann nicht ++C?

    Simon2 schrieb:

    ... und dass man das dann auch in C macht, halte ich für normal.

    ich nicht, in einer for-schleife ist's piepegal ob hinten ein ++x oder x++ steht.
    :xmas2:



  • net schrieb:

    ...
    ich nicht, ...

    Du bist ja auch der Beste ! *orden-verleih*

    Gruß,

    Simon2.



  • net schrieb:

    Simon2 schrieb:

    In C++ ist das nämlich keine "urban legend".

    und warum heisst C++ dann nicht ++C?

    Weil C++ einfach besser aussieht - oder vielleicht auch, weil C++ den alten Wert von C zurückgibt 😃

    Simon2 schrieb:

    ... und dass man das dann auch in C macht, halte ich für normal.

    ich nicht, in einer for-schleife ist's piepegal ob hinten ein ++x oder x++ steht.

    Wenn es egal ist, dann brauchst du dich auch nicht daran stören, daß manche Leute die Präfix-Version bevorzugen (die Macht der Gewohnheit).



  • Und hier beenden wir wenig sinnvolle Diskussionen über persönliche Vorlieben, C++ und weitere Flameansätze ⚠



  • TactX schrieb:

    Und hier beenden wir wenig sinnvolle Diskussionen über persönliche Vorlieben, C++ und weitere Flameansätze ⚠

    alter spielverderber... 😉


Anmelden zum Antworten