Die Mathe-Redaktion - 21.07.2019 23:43 - Registrieren/Login
Auswahl
ListenpunktHome
ListenpunktAktuell und Interessant ai
ListenpunktArtikelübersicht/-suche
ListenpunktAlle Links / Mathe-Links
ListenpunktFach- & Sachbücher
ListenpunktMitglieder / Karte / Top 15
ListenpunktRegistrieren/Login
ListenpunktArbeitsgruppen
Listenpunkt? im neuen Schwätz
ListenpunktWerde Mathe-Millionär!
ListenpunktAnmeldung MPCT Sept.
ListenpunktFormeleditor fedgeo
Schwarzes Brett
Aktion im Forum
Suche
Stichwortsuche in Artikeln und Links von Matheplanet
Suchen im Forum
Suchtipps

Bücher
Englische Bücher
Software
Suchbegriffe:
Mathematik bei amazon
Naturwissenschaft & Technik
In Partnerschaft mit Amazon.de
Kontakt
Mail an Matroid
[Keine Übungsaufgaben!]
Impressum

Bitte beachten Sie unsere Nutzungsbedingungen, die Distanzierung, unsere Datenschutzerklärung und
die Forumregeln.

Sie können Mitglied werden. Mitglieder können den Matheplanet-Newsletter bestellen, der etwa alle 2 Monate erscheint.

Der Newsletter Okt. 2017

Für Mitglieder
Mathematisch für Anfänger
Wer ist Online
Aktuell sind 425 Gäste und 22 Mitglieder online.

Sie können Mitglied werden:
Klick hier.

Über Matheplanet
 
Zum letzten Themenfilter: Themenfilter:
Matroids Matheplanet Forum Index
Moderiert von matph
Informatik » Programmieren » C: Armstrongzahl-Programm incl. Hilfsfunktion funktioniert nicht
Druckversion
Druckversion
Autor
Schule J C: Armstrongzahl-Programm incl. Hilfsfunktion funktioniert nicht
Zrebna
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 25.09.2018
Mitteilungen: 185
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Themenstart: 2019-05-18


Hallo!

Ich habe mich an einem Programm versucht, welches prüfen soll, ob eine Zahl beliebiger Länge (Input per scanf) eine Armstrongzahl ist.
Anmerkung: Erstmal keine eingegebene Zahl,
sondern als testcase die Zahl 153.

So sieht mein Quellcode aus:
C
  1. #include <stdio.h>
  2.  
  3. int armstrong(int zahl) {
  4. int laenge = 0, summe = 0, stelle, i, orginal;
  5.  
  6. orginal = zahl;
  7.  
  8. while(zahl != 0) {
  9. zahl /= 10;
  10. laenge++;
  11. }
  12. for (i = 0; zahl != 0; i++){
  13. stelle = zahl % 10;
  14. summe = summe + potenz(stelle, laenge); //zur Berechnung der einzelnen Summanden - KG gilt.
  15. // printf("%d\n", potenz(stelle, laenge));
  16. zahl /= 10;
  17. }
  18.  
  19. // printf("%d\n", summe); 0 wird ausgeprintet - wieso klappt Rechnung nicht?
  20.  
  21. if (summe == orginal) {
  22. return 1;
  23. }
  24. else {
  25. return 0;
  26. }
  27. }
  28.  
  29. int potenz(int basis, int exponent) {
  30. int erg = 1, i;
  31.  
  32. for (i = 0; i < exponent; i++) {
  33. erg *= basis;
  34. }
  35. // printf("%d\n", erg);
  36. return erg;
  37. }
  38.  
  39. int main()
  40. {
  41. int test = 153;
  42.  
  43. if (armstrong(test)) {
  44. printf("Die Zahl %d ist eine Armstrongzahl.\n", test);
  45. }
  46. else {
  47. printf("Die Zahl %d ist keine Armstrongzahl.\n", test);
  48. }
  49.  
  50. return 0;
  51. }
  52.  


In Zeile 18 habe ich den Output der Summe an dieser Stelle natürlich auskommentiert - wollte nur gucken, was mein Programm an der Stelle "intuss" hat bzw. "was es macht".
Falls Zeile 18 aber drucken lassen würde, dann wäre die Summe 0 und nicht 153 (27 + 125  + 1 bzw. 3³ + 5³ + 1³).
Daher scheint es, dass entweder die Rechnung in der Funktion nicht geschehen ist, oder etwas in der Hilfsfunktion Potenz() ist schief gelaufen.
Nebenfrage:
Ich wollte bei Zeile 34 gucken, ob mein Programm die Potenz berechnet hat und es vor "return" printen.
Wieso geht das nicht?
Bei Zeile 15 wollte ich auch gucken, ob per Iteration die korrekten Potenzen bzw. Summanden zurückgegeben worden sind.
Auch hier gab es keinen Output.
Ich hätte nun vermutet, dass man nur in der main() print-output erzeugen kann, aber in Zeile 19 wäre es ja zu einem Output gekommen, wenn es nicht auskommentiert wäre.

Na ja, evtl. findet ihr paar Hinweise und könnt mir helfen, das Programm zum Laufen zu bringen.

Lg,
Zrebna



  Profil  Quote  Link auf diesen Beitrag Link
zippy
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 24.10.2018
Mitteilungen: 525
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.1, eingetragen 2019-05-18


2019-05-18 13:23 - Zrebna im Themenstart schreibt:
Wieso geht das nicht?

Du zerstörst in der "while"-Schleife deine Zahl, obwohl du sie in der "for"-Schleife noch brauchst.

Außerdem solltest du die Definitionen von "armstrong" und "potenz" in die richtige Reihenfolge bringen, sonst ist der Compiler nicht ganz glücklich:
$ gcc x.c
x.c: In function 'armstrong':
x.c:14:29: warning: implicit declaration of function 'potenz' [-Wimplicit-function-declaration]
  summe = summe + potenz(stelle, laenge); //zur Berechnung der einzelnen Summanden - KG gilt.
                  ^~~~~~



  Profil  Quote  Link auf diesen Beitrag Link
Zrebna
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 25.09.2018
Mitteilungen: 185
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.2, vom Themenstarter, eingetragen 2019-05-19


2019-05-18 13:31 - zippy in Beitrag No. 1 schreibt:
2019-05-18 13:23 - Zrebna im Themenstart schreibt:
Wieso geht das nicht?

Du zerstörst in der "while"-Schleife deine Zahl, obwohl du sie in der "for"-Schleife noch brauchst.

Tatsächlich - danke!

Außerdem solltest du die Definitionen von "armstrong" und "potenz" in die richtige Reihenfolge bringen, sonst ist der Compiler nicht ganz glücklich:
$ gcc x.c
x.c: In function 'armstrong':
x.c:14:29: warning: implicit declaration of function 'potenz' [-Wimplicit-function-declaration]
  summe = summe + potenz(stelle, laenge); //zur Berechnung der einzelnen Summanden - KG gilt.
                  ^~~~~~


Was meinst du mit richtiger Reihenfolge?
Du meinst, dass armstrong_Fkt. über der Potenz-Hilfs-Fkt. stehen soll?

so, in etwa:
C
  1. #include <stdio.h>
  2.  
  3. int armstrong(int zahl) {
  4. int laenge = 0, summe = 0, stelle, i, original;
  5.  
  6. original = zahl;
  7.  
  8. while(zahl != 0) {
  9. zahl /= 10;
  10. laenge++;
  11. }
  12.  
  13. zahl = original;
  14.  
  15. for (i = 0; zahl != 0; i++){
  16. stelle = zahl % 10;
  17. summe = summe + potenz(stelle, laenge); //zur Berechnung der einzelnen Summanden - KG gilt.
  18. // printf("%d\n", potenz(stelle, laenge));
  19. zahl /= 10;
  20. }
  21.  
  22. // printf("%d\n", summe); 0 wird ausgeprintet - wieso klappt Rechnung nicht?
  23.  
  24. if (original == summe) {
  25. return 1;
  26. }
  27. else {
  28. return 0;
  29. }
  30. }
  31.  
  32. int potenz(int basis, int exponent) {
  33. int erg = 1, i;
  34.  
  35. for (i = 0; i < exponent; i++) {
  36. erg *= basis;
  37. }
  38. // printf("%d\n", erg);
  39. return erg;
  40. }
  41.  
  42. int main()
  43. {
  44. int test = 153;
  45.  
  46. if (armstrong(test)) {
  47. printf("Die Zahl %d ist eine Armstrongzahl.\n", test);
  48. }
  49. else {
  50. printf("Die Zahl %d ist keine Armstrongzahl.\n", test);
  51. }
  52.  
  53. return 0;
  54. }
  55.  



  Profil  Quote  Link auf diesen Beitrag Link
zippy
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 24.10.2018
Mitteilungen: 525
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.3, eingetragen 2019-05-19


2019-05-19 12:33 - Zrebna in Beitrag No. 2 schreibt:
Was meinst du mit richtiger Reihenfolge?
Du meinst, dass armstrong_Fkt. über der Potenz-Hilfs-Fkt. stehen soll?

Nein, genau umgekehrt: Eine Funktion ist zu definieren, bevor sie verwendet wird. Da "potenz" in "armstrong" verwendet wird, ist also erst "potenz" und dann "armstrong" zu definieren.



  Profil  Quote  Link auf diesen Beitrag Link
Zrebna hat die Antworten auf ihre/seine Frage gesehen.
Zrebna hat selbst das Ok-Häkchen gesetzt.
Neues Thema [Neues Thema]  Druckversion [Druckversion]

 


Wechsel in ein anderes Forum:
 Suchen    
 
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2019 by Matroids Matheplanet
This web site was made with PHP-Nuke, a web portal system written in PHP. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen.
Lesen Sie die Nutzungsbedingungen, die Distanzierung, die Datenschutzerklärung und das Impressum.
[Seitenanfang]