Array + Structs -> Fehler
-
/* * File: main.cpp * Author: dev * * Created on 27. Mai 2010, 19:54 */ #include <iostream> using namespace std; struct august { float temperatur[30]; float durchschnitt; }aug, *ptr; void eingabe (struct august *ptr ); void ausgabe (struct august *ptr); void durchschnitt (struct august *ptr); int main() { ptr=&aug; eingabe(ptr); ausgabe(ptr); durchschnitt(ptr); } void eingabe (struct august *ptr ) { for (int x=0; x<=29; x++) { cout<<endl<<x+1<<". Tag des Augusts: "; cin>>ptr->temperatur[x]; } } void ausgabe (struct august *ptr) { for (int x=0; x<=29; x++) { cout<<endl<<x+1<<". Tag des Augusts: "<<ptr->temperatur[x]; } } void durchschnitt (struct august *ptr) { for ( int x=0; x<=29; x++) { ptr->durchschnitt=0; ptr->durchschnitt=(ptr->durchschnitt+ptr->temperatur[x]); } cout<<endl<<"Durschnitt: "<<(ptr->durchschnitt)/30<<"Grad"; }Leider bekomm ich beim Durschnitt zahlen gegen lim->0, woran kann das liegen?
-
Das hier ptr->durchschnitt=0; gehört in der Funktion durchschnitt wohl nicht in die Schleife, oder was meinst du

P.S. der August hat 31 Tage

-
ich idiot :S
danke dir
-
/* * File: main.cpp * Author: dev * * Created on 27. Mai 2010, 21:13 */ #include <stdlib.h> #include <iostream> using namespace std; struct klasse { struct gut { int n1; int n2; int n3; }gelernt; struct schlecht { int n4; int n5; int n6; }ngelernt; float durchschnitt; int schueler; }klausur, *ptr; void noteneingabe(struct klasse *ptr); void berechnung(struct klasse *ptr); /* * */ int main() { ptr=&klausur; noteneingabe(ptr); berechnung(ptr); cout<<"Der Durschnitt der Klasse liegt bei: "<<klausur.durchschnitt; } void noteneingabe(struct klasse *ptr) { cout<<"----Noteneingabe----"; cout<<endl<<"Wieviel mal gab es:"; cout<<"Note1 :"; cin>>ptr->gelernt.n1; cout<<"Note2 :"; cin>>ptr->gelernt.n2; cout<<"Note3 :"; cin>>ptr->gelernt.n3; cout<<"Note4 :"; cin>>ptr->ngelernt.n4; cout<<"Note5 :"; cin>>ptr->ngelernt.n5; cout<<"Note6:"; cin>>ptr->ngelernt.n6; cout<<"Wieviel Schüler gibt es in der Klasse ?"; cin>>ptr->schueler; cout<<endl<<endl<<endl; } void berechnung(struct klasse *ptr) { ptr->durchschnitt= (ptr->gelernt.n1*1)+(ptr->gelernt.n2*2)+(ptr->gelernt.n3*3)+(ptr->ngelernt.n4*4)+(ptr->ngelernt.n5*5)+(ptr->ngelernt.n6*6)/(ptr->schueler); }Hier ist das Problem, dass der durschnitt falsch angegeben wird: stat 1,4 -> 14 statt 6,0 -> 60
wo ist denn mein fehler?
-
Punktrechnung VOR Strichrechnung drum Klammern um die Addition:
ptr->durchschnitt= ( (ptr->gelernt.n1*1)+(ptr->gelernt.n2*2)+(ptr->gelernt.n3*3)+(ptr->ngelernt.n4*4)+(ptr->ngelernt.n5*5)+(ptr->ngelernt.n6*6) ) /(ptr->schueler);oftmals hilft es, eine Zwischensumme zu bilden
und nicht alles in einer Codezeile zu vereinigen.
-
Wenn du arrays benutzt statt für jede Note ein eigenes Attribut/Struktur geht´s wesentlich einfacher. Ausserdem scheint mir, dass da noch einige Ungereimtheiten in deinem Code sind (warum heisst eine Struktur klasse, die Variable dazu aber Klausur?).
Die Anzahl der Schueler lässt sich durch die Summe der Notenanzahl bestimmen (unter der Voraussetzung, dass nur die Schüler betrachtet werden, die die Klausur tatsächlich mitgeschrieben haben). Gleiches gilt für den Durchschnitt. Meine Lösung sähe also so aus:struct Klausur { unsigned char Noten[6]; Klausur() { for( unsigned int i = 0; i < 6; ++i ) { Noten[i] = 0; } } unsigned int SchuelerZahl() const { // benutze hier eine manuelle Schleife. C++ bietet mit der STL // Komfortfunktionen an, die das eleganter lösen unsigned int Zahl = 0; for( unsigned int i = 0; i < 6; ++i ) { Zahl += Noten[i]; } return Zahl; } double Durchschnitt() const { // siehe SchuelerZahl() // Summe als double, da der Durchschnitt eine Fließkommazahl ist double Summe = 0; for( unsigned int i = 0; i < 6; ++i ) { // Anzahl der Noten mit Notenwert multiplizieren Summe += Noten[i] * (i+1); } unsigned int Anzahl = SchuelerZahl(); if( Anzahl > 0 ) { return Summe / Anzahl; } return 0; } };Ich habe hier bewusst auf die STL verzichtet da du Einsteiger zu sein scheinst und dich erst einmal auf grundlegende Dinge konzentrieren solltest.
-
Die Standard-Bibliothek ist ein grundlegender Teil von C++, warum darauf verzichten?
-
Janjan schrieb:
Die Standard-Bibliothek ist ein grundlegender Teil von C++, warum darauf verzichten?
Weil man sich erst über die entstehenden Problematiken bei der Verwendung von Arrays im Klaren werden sollte. Wenn ich jetzt mit std::fill gearbeitet hätte dann hätte ich auch noch Iteratoren erklären müssen und warum man rohe Pointer als Iteratoren behandeln kann. Spätestens bei bind für die Durchschnittsbildung werden dann mehr Fragen aufgeworfen als die Lösung beantwortet, daher (noch) der Verzicht auf die STL.
Edit:
Mir fällt grad auf, dass man den Durchschnitt nicht so einfach bilden kann, zumindest nicht mit accumulate und binder. Mit inner_product und einem zweiten Array mit den Wertigkeiten der Noten geht´s relativ einfach. Kriegt jemand die Durchschnittsbildung als Einzeiler ohne eigene Funktoren hin?
-
?
std::accumulate(vec.begin(), vec.end(), 0) / static_cast<double>(vec.size())Wobei es doof wäre erst alles zu addieren und dann zu teilen, da es so, je nach Anzahl der Elemente und Datentyp, zu einem Überlauf kommen kann, der nicht nötig wäre.
-
Das ist nicht der Notendurchschnitt, der muss ja noch gewichtet werden

-
Ah, okay, hatte das nur überflogen.
