WCM Forum

WCM Forum (http://www.wcm.at/forum/index.php)
-   Programmierung (http://www.wcm.at/forum/forumdisplay.php?f=17)
-   -   Armstrongzahlen (http://www.wcm.at/forum/showthread.php?t=224700)

druno 10.11.2007 10:36

Armstrongzahlen
 
Hi soll dass in c programmieren und hab keine ahnung wie das geht. Wäre um tipps sehr dankbar

Eine Zahl mit n Ziffern in dezimaler Schreibweise heißt Arm-strong – Zahl, wenn sie gleich der Summe der n – ten Potenzen ihrer Ziffern ist. Beispiel: die Zahl 153 hat 3 Ziffern und es gilt:1³+5³+3³ .Schreiben Sie eine Funktion armstrong(n), die 1 zurückliefert, wenn die Ganzzahl n eine Armstrongzahl ist. Sonst wird 0 zurückgegeben. Erweitern Sie diese Funktion zur Berechnung beliebiger Armstrongzahlen größer als Null. Testen Sie diese Funktion im Hauptprogramm durch Ausgabe aller Arm-strongzahlen zwischen 1 und 100000.

itsme 10.11.2007 12:17

das ist simple:

beispiel in python-code, aber sicher verständlich. musst nur nach c übersetzen ;)


import string
import math

for zahl in range(1, 1000):
zahlstring = str(zahl)
zahllaenge = len(zahlstring)

ziffernsumme = 0
for ziffer in range(1, zahllaenge+1):
tmpziffer = int(zahlstring[ziffer-1])
ziffernsumme = ziffernsumme + pow(tmpziffer, zahllaenge)

if ziffernsumme == zahl:
print "Zahl %d ist Armstrong-Zahl" % zahl

druno 10.11.2007 12:27

danke für den tipp aber leider bin ich noch anfänger und sowas wie python code sagt mir leider nix.

zAPPEL 10.11.2007 12:39

Hirn anstrengen und die Hausübung selber machen :D :rolleyes: ;)

lg

druno 10.11.2007 12:42

probier ich ja schon seit 3 stunden aber irgendwie fällt mir nix ein und wenn das gehirn dann auch noch sehr klein ist dann is um so schwieriger

druno 10.11.2007 14:06

für bestimmte zahlen wie zum beispiel von 100 bis 999 oder 1000 bis 9999 könnte ich es ja programmieren mein problem liegt darin es zu verallgemeinern dass das programm die stellen von 1 bis n der zahl erkennt.

smoking gnu 10.11.2007 17:07

schnell mal übersetzt:

Code:

int main ()
{
    char eingabe[20];
    int zahllaenge, ziffernsumme=0;
   
    scanf("%s", eingabe);

    zahllaenge=strlen(eingabe);
    int i;
    for ( i=0; i<zahllaenge; i++){
        ziffernsumme+=(int) pow(eingabe[i]-48, zahllaenge);
    }
   
    printf("%d", ziffernsumme);
}


druno 12.11.2007 08:12

Danke für die kleine übersetzung aber jetzt hätt ich noch zwei fragen wo kommt die 20 her und die 48?

hewlett 12.11.2007 09:48

was ich echt nicht verstehe an dem ganzen:

du bekommst aufgaben die vom schwierigkeitsgrad sehr einfach gehalten sind und kannst damit überhaupt nichts anfangen!? Wenn euch euer Prof. solche Aufgaben gibt dann habt ihr ja die C-Grundlagen schon durch, also müsstest du das ja schon können (du kennst ja laut deiner Aussage nicht mal ein char array).

Wenn ich mich an meine HTL Zeit zurückerinnere dann sind wir da schon anders zur Sache gegangen.

Meines erachtens ist das Problem das viele Leute kein Algorithmisches Denken mehr haben und beim kleinsten Problem schon nicht mehr weiter wissen...

...

itsme 12.11.2007 10:00

mein leitspruch:

ich kann jedem affen beibringen, dass er auf einen knopf drückt, damit er eine banane bekommt - das heisst aber nicht, dass er intelligent ist. ;)

druno 13.11.2007 15:42

kann man das ganze auch ohne felder lösen?

druno 13.11.2007 17:47

@hewlett

Zur meiner Verteidigung:
Also die c Grundlagen haben wir bestimmt noch nicht durch und ein char array haben wir auch noch nicht durchgenommen.

pong 13.11.2007 18:06

Zitat:

ein char array haben wir auch noch nicht durchgenommen.
dann brauchst es auch nicht

Schonmal überlegt die Zahl einfach zu zerlegen (dividieren durch 10 ist ein heißer Tipp) und dann einfach gemäß der Wertigkeit die Potenz dazuzubilden?


Nicht böse sein, aber die Ausprogrammierung in <Sprache selbst einfügen> ist das kleinste Übel. Zeig uns deinen Pseudocode, wir zeigen dir, wie er umzusetzen ist


pong

druno 13.11.2007 18:18

ja das hab ich mir schon überlegt mit modulo 10 aber wie erkennt dass programm wie oft es das machen muss wenn ich irgendeine zahl eingebe. Dann müsste ich es ja für zweistellige dreistellige vierstellige usw immer wieder neu programmieren. deshalb hab ich ja schon geschrieben dass es für mich kein problem wäre wenn ich nur zahlen zwischen 100 und 999 hab oder 1000 und 9999.

pong 13.11.2007 18:23

Schonmal überlegt die Zahl einfach sooft durch 10 zu dividieren bis das Ergebnis 0 (int) bzw. <0 (float) ist?

Was hier fehlt sind essentielle Grundlagen nebst "dem Programmierer sein Denken"

pong

druno 13.11.2007 18:49

so sieht mein programm bis jetzt aus wie kann man dann die summe berechnen? bzw würde es so überhaupt klappen?

#include <stdio.h>


int armstrong (int n) {
int n;
int summe;
int zahl;

zahl = n;
do {
n = zahl % 10;
zahl = zahl / 10;
}
while (zahl>0);

summe = ?????

if (summe == n)
return 1;
else
return 0;
}

pong 13.11.2007 19:02

1.) Fang dir nicht den Blödsinn mit Fussgesteuerten Schleifen an, das macht in Realität so ziemlich kein Mensch

2.)

Zitat:

zahl = n;
do {
n = zahl % 10;
zahl = zahl / 10;
}
Erst die Stellen zählen, dann anfangen die Zahl zu zerlegen


pong

druno 13.11.2007 19:23

wie meinst du dass? ich dachte ich muss die zahl erst zerlegen damit ich die anzahl der stellen bekomme.

pong 13.11.2007 19:29

Wie willst wissen mit welcher Potenz du die Summe der Ziffern bildest, bevor du Stellenanzahl der Zahl weißt?


pong

druno 13.11.2007 19:32

wie kommt man dann auf die stellenanzahl?

zAPPEL 13.11.2007 19:35

Das hat Pong drei Postings weiter oben geschrieben... :rolleyes:

druno 13.11.2007 19:40

ja solange durch 10 teilen bis 0 raus kommt bei int aber wie mach ich dass dann mit dem gemäß der wertigkeit der potenz übergeben?

pong 13.11.2007 19:57

Zitat:

Original geschrieben von druno
ja solange durch 10 teilen bis 0 raus kommt bei int aber wie mach ich dass dann mit dem gemäß der wertigkeit der potenz übergeben?
sorry, aber ab hier ist auch von meiner Seite Schluss, die Lösung steht in meiner ersten Reply zu diesem Thema, in einem Satz beschrieben. Wennst Troubles beim Umsetzen hast (syntaktisch) helf ich gern aus, aber ich mach sicher deine HÜ nicht für dich


pong

druno 14.11.2007 21:04

so sieht meine funktion aus wollte wissen ob die so hinhaut?

int armstrong (int n) {
int zahl;
int laenge;

laenge = 1;

while (zahl > 9)
{
zahl = zahl / 10;
laenge = laenge + 1;
}

int x;
zahl = x;
while (x > 0)
{
x = zahl % 10;
zahl = zahl / 10;
}

zAPPEL 14.11.2007 21:08

Probiers halt einfach aus was rauskommt - dann überleg dir (falls es falsch ist) wo der Fehler liegt und verbessere ihn, gib Zwischenergebnisse aus usw... Try&Error.

Wirst ja hoffentlich einen C-Compiler haben um das ganze zu testen :-)

lg

p.s. so bekommst auf jeden fall einen compiler fehler weil eine klammer fehlt und ein Ergebnis gibt das ganze auch nicht zurück ;)

pong 14.11.2007 21:36

Zitat:

wollte wissen ob die so hinhaut?
niemals, allein schon auf den ersten Blick - und ich hab seit 5 Jahren kein C mehr programmiert - seh ich 1 Syntaxfehler nebst 2 Absturzherden, davon das das Ding nicht das macht, was verlangt ist mal abgesehen

btw. ich leg dir ans Herz 1.) zu testen 2.) deinen "Stil" schwer zu überdenken (allein schon wenn ich Deklarationen irgendwo innerhalb der Logik seh, wird mir schlecht)

pong

hewlett 15.11.2007 12:29

@druno
mich würde interessieren wie lange du schon Informatikunterricht hast? Ich will dir ja nicht zu nahe treten aber du gehst das Problem komplett falsch an.

Du solltest die vorher überlegen wie du das Programm machen willst (dein Problem ist ja wirklich math. trivial) und nachher eventuel das ganze mittels Pseudecode mal aufschreiben.

Wenn du das hast, dann kannst mit dem Implementieren anfangen. Mach dir Testausgaben, oder noch besser benutz den Debugger ordentlich.

Wenn du dir immer von anderen Stück für Stück Infos holst wird das sicher nichts. Du musst dich halt schon mit der Materie (C) auseinandersetzen.

FordPrefect 15.11.2007 16:58

Bitte um Hilfe ich versteh die Definition der Armstrong Zahl nicht wirklich. Könntet ihr mich mit einer verständlichen Erklärung aushelfen
lg Peter

holzi 15.11.2007 17:23

is eine zahl ist, bei der die summe der einzelnen ziffern, die man nun jeweils mit der anzahl der stellen dieser zahl (also zb. für 407=3 stellen) potenziert wird, wiederum gleich der Zahl ist

also etwa: 407=4^3+0^3+7^3=64+0+343=407

FordPrefect 15.11.2007 19:30

Aha danke :o , Da hatte ich mit 153 einen Rechenfehler darum bin ich nicht draufgekommen.
lg Peter

druno 15.11.2007 22:04

@ hewlett

seit 5 wochen

pong 15.11.2007 22:26

Zitat:

Original geschrieben von druno
@ hewlett

seit 5 wochen

Dann wirds Zeit für ein Gespräch mit der Lehrkraft, meinst nicht?

pong

druno 17.11.2007 14:17

was soll mir das bringen?

zed 17.11.2007 19:07

:lol:

Biri 18.11.2007 23:12

hallo,

jetzt muss ich auch mal was dazu schreiben - das tut ja schon weh beim mitlesen, schließlich bin ich von 10 jahren auch mal in eine edv htl gegangen.

Ist das Niveau in den letzten Jahren denn wirklich so drastisch abgefallen?
Du bist ein Techniker, der dazu ausgebildet wird, technische Probleme zu lösen! Das verlangt selbstständgies Denken.
Du bist derjenige, der andren Leuten technische Sachen mal erklären soll! Du sollst dabei neue, eigene Lösungen entwickeln, an die zuvor keiner gedacht hat bzw. in der Lage war diese umzusetzen!
Du sollst stolz darauf sein, weil du gut bist darin, was du tust!

Wenn du an alle Aufgabenstellungen ohne Eigeninitiative herangehst, wirst du die HTL nicht schaffen.

fg + is nicht böse, sondern hoffentlich motivierend gemeint,
hannes

Don Manuel 19.11.2007 08:53

Tut mir leid, ich kann leider kein C, aber wie die Herrn "Auskenner" da mit Dir umgehen, ist auch peinlich.
Wer hier vor ein paar Jahren diese Ausbildung hinter sich gebracht hat, scheint wohl von Pädagogik oder Didaktik nicht viel mitbekommen zu haben.
Ich finde es ganz konträr völlig OK, wenn Du in Deiner Freizeit für die Lösung Deiner Aufgaben auch hier recherchierst. Lösungen im Austausch mit Menschen zu finden, wird Dich im Leben durchaus menschlicher machen als so manchen IT-Autisten, der hier auf scheinbare Pädagogik macht. Ich finde, Du zeigst damit durchaus Eigeninitiative, andere schreiben halt einfach ab.
Übrigens: wer etwas wirklich verstanden hat, zeichnet sich für mich vor allem dadurch aus, dass er es jedem Trottel verständlich machen kann. Mit dem Programmierknowhow mancher Superschlauer scheint es somit nicht allzuweit her zu sein :D
Doch nein: die haben nach 5 Wochen erstmaliger Befassung mit der Materie sicher schon nach 5 Minuten den fehlerfreien Code abgeliefert, bestimmt! :lol:

Biri 19.11.2007 09:22

hi,

da du mich so dezent indirekt ansprichst, möchte ich auch darauf antworten. :cool:

Ich finde es völlig ok, wenn man zur Lösung seiner Probleme in Internetforen recherchiert - dazu sind foren ja da - jedoch haben wir wohl eine unterschiedliche auffassung von recherche. Für mich bedeutet diese nicht, dass mir jemand vorgefertigte Lösungen präsentiert.

Weiters wurde inzwischen jedoch schon eine solche präsentiert.

Ich stimme dir zu, dass in der Arbiet die menschliche Komponente genauso wichtig ist wie das Fachwissen (wenn nicht sogar wichtiger), jedoch bringt es halt auch nicht viel, wenn sich alle gut verstehen und unterhalten können, vom fach jedoch keiner eine ahnung hat - dann artet es in einen debatierclub aus und in einem technischen Beruf ist es halt auch wichtig, technisches Verständnis zu haben bzw. zu entwickeln.

Weiters finde ich, dass man nach 5 Wochen Programmierunterricht und Beschäftigung mit der Materie die Aufgabenstellung durchaus lösen kann.

Da es jetzt aber schon überhaupt nichts mehr mit dem Thema zu tun hat, möchte ich auf weitere kommentare verzichten. Mein Beitrag war wie gesagt auch als konstruktive Kritik für den Threadersteller gedacht.

fg
hannes

smoking gnu 19.11.2007 21:16

Ich selbst kann erst seit einigen Monaten C (allerdings vorher schon andere Programmiersprachen), und meiner Meinung nach ist es nicht so wichtig ob man jetzt alle Befehle der string.h auswendig kann o.ä.
Was wirklich wichtig ist, ist strukturiertes Denken -> damit kann man zumindest Pseudocode produzieren, auch wenn man sich mit der C-Syntax nicht so gut auskennt. Wenn er so was gepostet hätte, hätte ihm sicher jeder geholfen, den Pseudocode nach C zu übersetzen. Hier ist ist allerdings nicht ersichtlich, ob er irgendwas verstanden hat bzw. wo er hängt. Ob man "Programmiererdenken" schon nach 5 Wochen verlangen kann, kann ich nicht beurteilen - aber ich gebe den anderen Postern recht, dass niemandem geholfen ist, wenn man ihm ein fertiges C-Programm präsentiert!

[/rant]

pong 19.11.2007 22:08

Zitat:

Doch nein: die haben nach 5 Wochen erstmaliger Befassung mit der Materie sicher schon nach 5 Minuten den fehlerfreien Code abgeliefert, bestimmt!
Hat das irgendjemand verlangt?

Liefert einen Pseudocode, an der Übersetzung in eine Sprache nach Wunsch solls ja nicht scheitern.

Und nein, nach 5 Wochen hat niemand jemals fehlerfreien Code geliefert, aber zumindest Ansätze und diese lassen sich auch in Worte fassen

btw. wäre druno seinen Code zumindest per Schreibtischtest - hoffentlich wird sowas noch gelehrt - durchgegangen hätte er sofort gemerkt, was nicht passt

Ende (das artet sich hier wieder zu einer Grundsatzdiskussion aus)

pong

zed 20.11.2007 07:51

@Don Manuel

das mit der string.h war der andere thread. aber egal.


wie die beiden anderen schon geantwortet haben, ist jeder von uns gerne bereit bei problemen mit einer sprache zu helfen. ist ja klar!

allerdings ist ihm nicht nur nicht geholfen, sondern es ist so gar KONTRAPRODUKTIV, wenn er hier nur die angabe reinstellt und sich eine fertige lösung erwartet!

man muss einfach im stande sein, ein programmiertechnisches problem in pseudo code umwandeln zu können. DAS ist der wichtige schritt. das kann man nach 5 wochen aber durchaus verlangen!


Alle Zeitangaben in WEZ +2. Es ist jetzt 05:23 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 2009 FSL Verlag