Schulaufgabe
-
Das reicht ja in diesem speziellen Fall auch aus - 759 / 33 = 23.
Stilistisch ist das nicht sonderlich hübsch, aber direkt falsch ist an dem Programm nur, dass main void zurückgibt - per Standard muss es "int main" heißen, und bei Erfolg sollte 0 zurückgegeben werden - und dass <stdio.h> nicht eingebunden ist, so dass printf unbekannt sein könnte. Allerdings ist mir <t89c51ac2.h> nicht bekannt. Geht es dabei um einen Mikrocontroller? Für die gelten mitunter ganz andere Regeln.
-
Kann mir jemand sagen was ich falsch gemacht habe.
Du hast offensichtlich einen furchtbaren Lehrer, sag ihm das bitte ehrlich ins Gesicht. Dieser Code müsste So aussehen:
#include <iostream> int main() { int sum(0);///sum wird die Summe aller Zahlen const int start(7), end(40);///Die Menge, durch die Iteriert werden soll (Range). Hier: 7 - 39 (40 - 1) for(int iter = start ; iter < end ; ++iter)///Eine Schleife. Start Anweisung: Deklaration eines Iterators, der durch die Menge iterieren wird. Prüfung: Der Iterator soll bei erreichen des Endes abbrechen, und natürlich bei jedem Schritt inkrementiert werden sum += iter; ///Hier wird der Wert des Iterators zu sum addiert. std::cout << sum / (end - start) << '\n';///Ausgabe (Summe / Anzahl) }
-
#include <t89c51ac2.h> void main(void){ float summe; summe=0; float lv; for( lv=7;lv<=39;lv++){ summe=summe+lv; } summe=summe/33; printf ("\n %i ",summe); }leider lässt er sich nach wie vor nicht compilieren.
Gugelmoser schrieb:
So ziemlich alles was man falsch machen kann (bzgl. C++), aber hauptsächlich, dass das Ergebnis einer Ganzahlendivision eine Ganzzahl ist.
-
Vielleicht solltest Du die Antworten auch lesen?
-
tobifeli schrieb:
#include <t89c51ac2.h> void main(void){ float summe; summe=0; float lv; for( lv=7;lv<=39;lv++){ summe=summe+lv; } summe=summe/33; printf ("\n %i ",summe); }leider lässt er sich nach wie vor nicht compilieren.
Bist du eigentlich absichtlich doof, oder so? Ob der Code compilierbar ist, hängt hier (!) doch nicht von den Typen deiner Variablen ab!
-
seldon schrieb:
Das reicht ja in diesem speziellen Fall auch aus - 759 / 33 = 23.
Stilistisch ist das nicht sonderlich hübsch, aber direkt falsch ist an dem Programm nur, dass main void zurückgibt - per Standard muss es "int main" heißen, und bei Erfolg sollte 0 zurückgegeben werden - und dass <stdio.h> nicht eingebunden ist, so dass printf unbekannt sein könnte. Allerdings ist mir <t89c51ac2.h> nicht bekannt. Geht es dabei um einen Mikrocontroller? Für die gelten mitunter ganz andere Regeln.
Ich bekomme immer null raus, was mach ich falsch????
#include <stdio.h> #include <stdlib.h> int main(void) { float summe; summe=0; float lv; for( lv=7;lv<=39;lv++){ summe=summe+lv; } summe=summe/33; printf ("\n %i ",summe); return 0; }
-
Du versuchst, einen float als int auszugeben. %i ist nicht der richtige Format-Spezifikator.
-
seldon schrieb:
Du versuchst, einen float als int auszugeben. %i ist nicht der richtige Format-Spezifikator.
Und Prompt sind wir bei den I/O-Streams von C++ angelangt.
-
Hacker schrieb:
seldon schrieb:
Du versuchst, einen float als int auszugeben. %i ist nicht der richtige Format-Spezifikator.
Und Prompt sind wir bei den I/O-Streams von C++ angelangt.
vielen dank
-
Ah, das ist hier ja das C++-Forum. Da hat der Code, so wie er da steht, eigentlich nichts zu suchen; das passt besser ins C-Forum. In diesem speziellen Fall beschränkt sich der Unterschied allerdings auf die Ausgabe.
Ansonsten scheint mir das mit der Schleife recht umständlich. Ein kleines bisschen Mathematik bringt das auf O(1) runter:
#include <iostream> int summe_bis(int n) { return n * (n + 1) / 2; } double durchschnitt_zwischen(int unten, int oben) { return (summe_bis(oben) - summe_bis(unten - 1)) / (oben - unten + 1.0); } int main() { std::cout << durchschnitt_zwischen(7, 39) << '\n'; }
-
seldon schrieb:
return n * (n + 1) / 2;Der ist gut, den kannte ich noch nicht

-
Das sollte man eigentlich in der Schule gelernt haben: Gaußsche Summenformel
-
Th69 schrieb:
Das sollte man eigentlich in der Schule gelernt haben: Gaußsche Summenformel
Hatten wir nie. Aber die Anekdote kenn ich

-
seldon schrieb:
Ansonsten scheint mir das mit der Schleife recht umständlich. Ein kleines bisschen Mathematik bringt das auf O(1) runter
Was in der Aufgabe aber nicht erwünscht ist.
-
hmpff schrieb:
seldon schrieb:
Ansonsten scheint mir das mit der Schleife recht umständlich. Ein kleines bisschen Mathematik bringt das auf O(1) runter
Was in der Aufgabe aber nicht erwünscht ist.
Was er nicht behauptet hat. Die Version mit der Schleife hab ich vorgemacht.
-
seldon schrieb:
Ah, das ist hier ja das C++-Forum. Da hat der Code, so wie er da steht, eigentlich nichts zu suchen; das passt besser ins C-Forum. In diesem speziellen Fall beschränkt sich der Unterschied allerdings auf die Ausgabe.
Ansonsten scheint mir das mit der Schleife recht umständlich. Ein kleines bisschen Mathematik bringt das auf O(1) runter:
#include <iostream> int summe_bis(int n) { return n * (n + 1) / 2; } double durchschnitt_zwischen(int unten, int oben) { return (summe_bis(oben) - summe_bis(unten - 1)) / (oben - unten + 1.0); } int main() { std::cout << durchschnitt_zwischen(7, 39) << '\n'; }Das ist aber ziemlich umständlich.

double durchschnitt_zwischen(int unten, int oben) { return (oben+unten)/2.0; } int main() { std::cout << durchschnitt_zwischen(7, 39) << '\n'; }summe_bis(oben) - summe_bis(unten - 1)) / (oben - unten + 1.0) =
(oben*(oben+1)/2 - (unten-1)unten /2 )/(oben-unten+1) =
(oben²+oben - unten² + unten)/2(oben-unten+1) =
((oben-unten)(oben+unten) + oben + unten)/2(oben-unten+1) =
(oben+unten)(oben-unten+1)/2(oben-unten+1) =
(oben+unten)/2
-
Ha! Das hatte ich nicht gesehen.
