Arbeiten mit Unterprogrammen (quadrieren)



  • Hey, ich weiß es geht einfacher aber als Übung wollte ich ein Programm schreiben was mithilfe eines unterprogrammes programmiert Mein Ansatz

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    int zahl;
    void einlesen(int *zahl);
    {
        scanf("%d",&zahl);
    
    }
    int quadrat(int zahl)
    {
        return (zahl*zahl);
    
    }
    
    void ausgeben(void)
    {
        printf(" zAhl %d zum quadrat %d ",zahl,quadrat(zahl));
    }
    int main();
    
    {
        einlesen();
        ausgeben(zahl);
    }
    

    was ist falsch?


  • Mod

    Akay2113 schrieb:

    was ist falsch?

    Ich bin sicher, dass der Compiler einen Hinweis gibt.



  • Solche antworten kann man sich echt sparen.
    der Compiler sagt es hätte was mit den Klammern zu tun.
    nach Variation tut sich nichts -->deswegen schreibe ich diesen Beitrag





  • Akay2113 schrieb:

    Solche antworten kann man sich echt sparen.

    11 zeichen löschen, dann geht es.
    war die antwort schlimmer? scheint fast so. 🙂



  • Ich bin mal netter, als ich sein sollte:

    1. Vergleiche Zeilen 7,12,18 und 22. Gibt es da Unterschiede, insbesondere mit dem jeweils letzten Zeichen? Wenn ja, warum?

    2. Vergleiche Zeilen 7 und 25. Passen die zusammen?

    3. Vergleiche Zeilen 18 und 26. Passen die zusammen?

    4. Vermeide globale Variablen, schiebe das "int zahl" ins main.

    1-3 kann man durch genaues Hinsehen schnell finden. Einfacher wär's aber, wenn du dir einfach mal die Warnungen/Fehler des Compilers durchlesen würdest. Wenn du sie nicht verstehst, kannst du ja gerne nachfragen, aber dann bitte mit vollständiger Fehlermeldung (copy+paste)!

    Edit: Zeile 9 solltest du auch nochmal angucken...


  • Mod

    Akay2113 schrieb:

    der Compiler sagt es hätte was mit den Klammern zu tun.

    Das ist ein Anfang. Noch besser wäre es nat. wenn du die Fehlermeldung nicht beschreiben, sondern wörtlich wiedergeben würdest. Warum? Weil Details wichtig sind. Computer sind für gewöhnlich sehr pedantisch. Ausserdem sind sie extrem dumm. Sie haben keine Ahnung, was dein Programm tun soll, und können dir deshalb auch nicht sagen, wie etwas richtig zu tun ist.
    Das bedeutet unter anderem auch, dass der Ort, den eine Fehlermeldung anzeigt, nicht unbedingt exakt der Ort ist, an dem du eine Fehler gemacht hast. Der angezeigte Ort ist derjenige, an dem (als Folge deines Fehlers) eine Verletzung der Regeln der Sprache festgestellt wird. Bezgl. C (das gilt so nicht universell für alle Programmiersprachen) kann nur sicher gesagt werden, dass der zu behebende Fehler entweder an der angezeigten Stelle oder irgendwo davor zu suchen ist.

    Akay2113 schrieb:

    nach Variation tut sich nichts

    Wie gesagt, Details sind wichtig. Wir wissen nicht, was variiert wurde. Vermutlich gerade nichts, was den eigentlichen Fehler berührt.

    Und ja, beim Überfliegen des Codes fallen einige Fehler sofort ins Auge. Der Grund, warum wir hier keine unmittelbare Lösung anbieten, ist eben, dass wir wollen, das du etwas lernst: nicht bloss die Ursache für den Fehler, der dich zum Posten verursacht hast, sondern auch, wie man hier gute Fragen stellt. Wir mögen gute Fragen. Oft genug passiert es aber, das Probleme, die eigentlich interessant wären, auf eine Art und Weise vorgestellt werden, die es unnötig schwer oder aufwändig machen, gute Antworten zu geben. Das nächste mal hast du vielleicht ein interessantes Problem, das nicht sofort ersichtlich ist. Dann möchten wir nicht Tage und viele Seiten nur damit verbringen, herauszufinden, worum es eigentlich gehen soll.



  • Bin ja hier nicht der crack, aber vielleicht hat es etwas mit Semikolons zu tun.



  • wob schrieb:

    4. Vermeide globale Variablen, schiebe das "int zahl" ins main.

    ...

    Edit: Zeile 9 solltest du auch nochmal angucken[u]...

    Aber nur wenn er deinen Punkt 4 umsetzt. Ansonsten ist die Zeile okay.


  • Mod

    Fricky667 schrieb:

    wob schrieb:

    4. Vermeide globale Variablen, schiebe das "int zahl" ins main.

    ...

    Edit: Zeile 9 solltest du auch nochmal angucken[u]...

    Aber nur wenn er deinen Punkt 4 umsetzt. Ansonsten ist die Zeile okay.

    Nein, ist sie nicht. Guck genauer hin!



  • SeppJ schrieb:

    Nein, ist sie nicht. Guck genauer hin!

    Meinste weil scanf veraltet ist?

    Das Progrämmchen des OP mit minimalen Änderungen lauffähig gemacht. Zeile 9 (hier 😎 ist unverändert:

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    int zahl;
    void einlesen()
    {
        scanf("%d",&zahl);
    
    }
    int quadrat(int zahl)
    {
        return (zahl*zahl);
    
    }
    
    void ausgeben(void)
    {
        printf(" zAhl %d zum quadrat %d ",zahl,quadrat(zahl));
    }
    int main()
    
    {
        einlesen();
        ausgeben();
    }
    

    🙂


  • Mod

    Fricky667 schrieb:

    Meinste weil scanf veraltet ist?

    scanf soll veraltet sein? 😮

    Nein. Wie ich sagte: Guck genauer hin! Vielleicht könnte die Korrektheit eines Codeabschnitts ja eventuell auch davon abhängen, was drumherum steht?

    Und dass du nun das Programm verschlimmbesserst, indem du voll in globalen Variablen aufgehst, hilft dem Threadersteller gewiss nicht weiter. @Threadersteller: Bloß nichts von Fricky667 nachmachen!



  • SeppJ schrieb:

    Fricky667 schrieb:

    Meinste weil scanf veraltet ist?

    scanf soll veraltet sein? 😮

    Jedenfalls sieht Mickrigweich scanf als Sicherheitslücke an.
    --> https://stackoverflow.com/questions/21434735/difference-between-scanf-and-scanf-s

    SeppJ schrieb:

    Nein. Wie ich sagte: Guck genauer hin! Vielleicht könnte die Korrektheit eines Codeabschnitts ja eventuell auch davon abhängen, was drumherum steht?

    Ich bezog mich nur auf Fehler, die eine Programmausführung verhindern. Nicht auf korrekten Code. Und Variablen außerhalb von Funktionen pauschal zu verteufeln, finde ich auch nicht sinnvoll.


  • Mod

    Fricky667 schrieb:

    SeppJ schrieb:

    Nein. Wie ich sagte: Guck genauer hin! Vielleicht könnte die Korrektheit eines Codeabschnitts ja eventuell auch davon abhängen, was drumherum steht?

    Ich bezog mich nur auf Fehler, die eine Programmausführung verhindern. Nicht auf korrekten Code. Und Variablen außerhalb von Funktionen pauschal zu verteufeln, finde ich auch nicht sinnvoll.

    Es ist ein Fehler, der die Programmausführung verhindert! Meine Güte, das ist ja nicht zum Aushalten! Guck doch endlich mal, wie zahl definiert ist! Das kommt davon, wenn man lieber zufällig ausprobiert, anstatt seine Programme zu verstehen 🙄



  • SeppJ schrieb:

    Es ist ein Fehler, der die Programmausführung verhindert!

    Bei mir nicht (MinGW unter Windoze).

    SeppJ schrieb:

    Meine Güte, das ist ja nicht zum Aushalten!

    Nimms nicht persönlich.

    SeppJ schrieb:

    Guck doch endlich mal, wie zahl definiert ist!

    Guck du doch mal, dass meine "void einlesen()" kein Argument mehr braucht.



  • Fricky667 schrieb:

    Guck du doch mal, dass meine "void einlesen()" kein Argument mehr braucht.

    Tolle Leistung. Das Argument wurde sowieso zu keinem Zeitpunkt benutzt.



  • Fricky667 schrieb:

    Guck du doch mal, dass meine "void einlesen()" kein Argument mehr braucht.

    Das ist aber nicht was Akai laut seinem ersten Beitrag hier üben wollte: Unterprogramme ⚠

    Hab keine Ahnung von C, deshalb der Nick.
    Quelltext auf eigene Gefahr ansehen.

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    int einlesen()
    {
        int lieszahl;
        ...
        return lieszahl;
    }
    
    int quadrat(int zahlq)
    {
        return (zahlq * zahlq);
    }
    
    void ausgeben(int zeigezahl)
    {
        ...
    }
    
    int main(void)
    {
        int zahl;
        zahl = einlesen();
        ausgeben(zahl);
    }
    

    Fricky eine globale Variable verdeckt bei Übungen mit Unterprogrammen oft Fehler oder führt mindestens zu Missverständnissen!



  • EOP schrieb:

    Fricky667 schrieb:

    Guck du doch mal, dass meine "void einlesen()" kein Argument mehr braucht.

    Tolle Leistung. Das Argument wurde sowieso zu keinem Zeitpunkt benutzt.

    Klar doch, vom scanf. Eine lokale Variable innerhalb einer Funktion überdeckt gleichnamige globale Variablen d.h. auch die im Funktionskopf sind lokale Variablen. 😞



  • Dumpfbacke schrieb:

    Fricky eine globale Variable verdeckt bei Übungen mit Unterprogrammen oft Fehler oder führt mindestens zu Missverständnissen!

    Damit hast du sicher recht.



  • [quote="Fricky667"][quote="EOP"]

    Fricky667 schrieb:

    Klar doch, vom scanf. Eine lokale Variable innerhalb einer Funktion überdeckt gleichnamige globale Variablen d.h. auch die im Funktionskopf sind lokale Variablen. 😞

    Und wenn dir jetzt noch auffällt, dass das Argument ein Pointer war, hast du den Fehler, der in besagter Zeile 9 gemacht wurde, auch schon gefunden.


Anmelden zum Antworten