Statistik
-
kaenon schrieb:
Wow, das ist wirklich nervig
C ist ja auch keine Kindergartensprache.
kaenon schrieb:
Habe die Größe des Arrays jetzt mit
int laenge = sizeof(daten) / sizeof(daten[0]);
bestimmt. Stimmt das so?
Ja.
Allerdings nur da, wo du daten auch als Array definiert hast.
Bei dir inmain
.
-
kaenon schrieb:
float spannweite_berechnen(int *daten) { int max = 0; int min = 10000000;
Diese Vorbelegeung ist ungünstig.
Besser wäre zumindestINT_MIN
bzwINT_MAX
auslimits.h
Es gibt aber einen Wert, der für beide richtig ist und auch ganz sicher Teil des Arrays ist:
Das Erste Element vom Array
-
MatzeHHC schrieb:
Ist das wirklich so? Ich dachte der macht daraus immer:
int mittelwert_berechnen()
Ja, inklusive Argumentpromotion (was das ganze noch schlimmer macht).
Siehe http://port70.net/~nsz/c/c89/c89-draft.html#3.3.2.2.
Und wenn du GCC verwendest, kannst du
-Wformat
missbrauchen um den Typ einer Variable (halbwegs verlässlich) zu erfahren: http://goo.gl/Y78KKl.
-
kaenon schrieb:
Ich habe die Fehlermeldung: Conflicting types for 'mittelwert_berechnen'. Was mache ich falsch?
Ab C99 sind implzite Funktionsdeklarationen nicht mehr erlaubt.
Bei gcc hilft dirgcc -std=c99 -pedantic -Werror
dabei; hier wird dann nur compiliert, wenn du nicht gegen C99 verstößt, d.h. du musst erst alle Warnungen=Fehler beseitigen.
-
Habe es wie folgt geändert:
#include <stdio.h> #include <math.h> float varianz_berechnen(int *daten, int laenge); float standardabweichung_berechnen(int *daten, int laenge); float spannweite_berechnen(int *daten, int laenge); float mittelwert_berechnen(int* daten, int laenge); float median_berechnen(int *daten, int laenge); int main(int argc, const char * argv[]) { int daten[] = {2, 4, 5, 6, 8, 9, 14, 16}; int laenge = sizeof(daten) / sizeof(daten[0]); printf("Varianz: %.2f\n", varianz_berechnen(daten, laenge)); printf("Standardabweichung: %.2f\n", standardabweichung_berechnen(daten, laenge)); printf("Spannweite: %.2f\n", spannweite_berechnen(daten, laenge)); printf("Mittelwert: %.2f\n", mittelwert_berechnen(daten, laenge)); printf("Median: %.2f\n", median_berechnen(daten, laenge)); return 0; } float varianz_berechnen(int *daten, int laenge) { float summe = 0; for (int i = 0; i <= laenge; i++) { summe += powf(daten[i] - mittelwert_berechnen(daten, laenge), 2); } return summe / laenge; } float standardabweichung_berechnen(int *daten, int laenge) { return sqrt(varianz_berechnen(daten, laenge)); } float spannweite_berechnen(int *daten, int laenge) { int max = 0; int min = 10000000; for (int i = 0; i <= laenge; i++) { if (daten[i] > max) max = daten[i]; if (daten[i] < min) min = daten[i]; } return max - min; } float mittelwert_berechnen(int *daten, int laenge) { float summe_der_elemente = 0; for (int i = 0; i <= laenge; i++) { summe_der_elemente += daten[i]; } return summe_der_elemente / laenge; } float median_berechnen(int *daten, int laenge) { if (laenge % 2 == 0) { return (daten[laenge/2] + daten[laenge-1]) / 2.0; } else { return daten[laenge/2]; } }
Der erste Fehler ist die Spannweite, das Minimum beträgt komischerweise 0 und nicht 2. Hat das was damit:
Es gibt aber einen Wert, der für beide richtig ist und auch ganz sicher Teil des Arrays ist: Das Erste Element vom Array
zu tun?
Der zweite Fehler liegt in Varianz und Standardabweichung, da stimmen die Ergebnisse nicht
-
for (int i = 0; i <= laenge; i++)
Klassischer Anfängerfehler, Arrayindexe gehen immer von 0...N-1, bei dir aber von 0...N, und UB ist das dann auch noch.
-
Das hat das Problem gelöst, danke. Wo gibt es eigentlich gute C-Tutorials? Und was lagere ich jetzt wie in ein Header-File? Und sollte ich C oder lieber doch C++ lernen?
-
kaenon schrieb:
Wo gibt es eigentlich gute C-Tutorials?
In Büchereien.
Die haben so viele davon, dass sie diese sogar verkaufen.
(Aber nicht jedes dort ist gut)
-
Fehlerfreie C Tutorials gibt es sehr selten.
Alle Funktionsprototypen (explizite Funktionsdeklarationen) gehören in eine Headerdatei, ebenso wie eigene Typdefinitionen (typedef).
C oder C++, das hängt von deinem Aufgabenbereich ab; C geht sehr viel mehr in die Tiefe, es gibt mehr Fallstricke. Das liegt daran, dass C von Profis für Profis entwickelt wurde, was auf C++ nicht zutrifft. C ist also prinzipiell nichts für Anfänger, die nur schnell eben mal was programieren wollen/sollen.
-
Also ist für den schnellen Erfolg C++ besser geeignet?
-
Deshalb habe ich gesagt "hängt ab von deinem Aufgabenbereich";
wenn es dir nur darum geht, mal schnell irgendwelche Strings zusammenzubasteln oder mit cout irgendwas auf die Konsole zu bringen, wird es mit C++ schneller gehen, dann aber bitte nicht jammern wenn du merkst, dass dieses Geraffel oftmals viel mehr Code erfordert als sscanf/sprintf.
Wenn du darauf angewiesen bist, bestehende C-Bibliotheken zu benutzen (WinAPI, u.v.a.m), hast du von vornherein verloren, wenn du nur mit C++ Brille diese Bibliotheken versuchst zu bedienen, bspw. den Unterschied zw. Array und Zeiger oder automatic/static storage duration nicht kennst.
-
kaenon schrieb:
Also ist für den schnellen Erfolg C++ besser geeignet?
Nein, C++ ist eher noch weniger für Anfänger geeignet. Man sagt: "In C ist es leicht, sich selber in den Fuß zu schießen. In C++ ist es schwerer, aber wenn man es tut, dann ist gleich das ganze Bein ab". Diese Beschreibung trifft es ziemlich gut. In C++ musst du nicht kämpfen, um ein paar popelige Ausgaben zu machen oder Zeichenketten zu verarbeiten. Aber die Sprache ist ungleich umfangreicher als C. Man kann C komplett in ein paar Tagen bis Wochen lernen. Für C++ muss man ein paar Monate einplanen. Ganz zu schweigen von weiterer Lernzeit, um zu lernen, wie man "gutes" C++ schreibt (was allerdings auch in C der Fall ist), denn bloß weil etwas geht, heißt das noch lange nicht, dass es eine gute Idee ist.
Beide Sprachen sind nicht an Anfänger gerichtet, sondern an Profis. Wenn du damit Programmieren an sich lernen möchtest, dann mach dich darauf gefasst, dass das nicht ganz einfach wird (Ist aber möglich und haben schon viele Leute gemacht). Die Wahl der Sprache hängt davon ab, was man später damit machen möchte. C++ wird vor allem für Programme benutzt, bei denen hohe Rechenleistung eine Rolle spielt. C eigentlich auch, bloß dass es halt weniger mächtig ist. Ehrlich gesagt ist der einzige Grund, der mir einfällt, wieso man als Normalsterblicher heutzutage noch C brauchen könnte, dass es eine Menge C-Code auf der Welt gibt und man eventuell mit diesem arbeiten möchte.
-
Ehrlich gesagt ist der einzige Grund, der mir einfällt, wieso man als Normalsterblicher heutzutage noch C brauchen könnte, dass es eine Menge C-Code auf der Welt gibt und man eventuell mit diesem arbeiten möchte.
Naja, ganz so ist es auch nicht glaub ich. Z.B.: Sind die gängigen Industrieroboter Programmiersprachen alle auf C basiert. Ok, Pointer wurden "zum glück" weggelassen
-
By the Way... Wer kennt ein wirklich gutes Tutorial für C++ ?? Die meisten sind ja eher unterirdisch.....
-
weltmeiser_2014 schrieb:
By the Way... Wer kennt ein wirklich gutes Tutorial für C++ ?? Die meisten sind ja eher unterirdisch.....
Bis jetzt hat sich noch nie ein gutes Tutorial für C++ in diesem Forum gezeigt. Ich wäre eher überrascht, wenn plötzlich eines auftauchen würde. Ist ja auch nachvollziehbar: Wenn man sich hinreichend gut auskennt und es didaktisch drauf hat und den Wunsch verspürt, Anfängern zu helfen, dann schreibt man eher ein Buch, als ein Tutorial. Tutorials sind gut, um kurze Sachverhalte darzustellen. Für eine Sprache wie C++, bei deren Umfang selbst knappe(!) Anfängerbücher locker 1000 Seiten und mehr haben, ist das Medium eher ungeeignet. Es gibt ja auch keine (guten) Latein-Tutorials
.
-
Wutz schrieb:
Das liegt daran, dass C von Profis für Profis entwickelt wurde, was auf C++ nicht zutrifft.
warum nicht?
-
C++ wurde über viele Jahre von einem Theoretiker mit skandinavisch klingendem Namen im stillen Kämmerlein entwickelt, ohne Ahnung von Praxis (viel kann er mit seinen wahrhaften Pratiker-Kollegen an den Bell Labs K&R,Ken Thompson,Rob Pike NICHT geredet haben), sonst wäre ihm beim Design seiner 'neuen modernen' Programmiersprache nicht soviel Unsinn 'eingefallen',
(Auflistung beliebig erweiterbar)
- virtual
- friend
- protected
- fehlender baseclass-Zugriff
- den ganzen Cast-Müll, der auch noch im Rahmen von 'Typsicherheit' verkauft wird
- Konstruktor ohne Rückgabe (wenn ein Return sinnvoll ist, dann genau in diesem Fall nämlich zur Rückgabe der neuen Instanz)
- B.S. hat nie eine Referenzimplementierung eines C++ Compilers angeboten, d.h. er hat nie irgendwas Praktikables angestellt mit 'seiner' neuen Programmiersprache, so wie die 4 o.g. Herrn, die nicht nur eigene Compiler für ihre Sprache entwickelt haben, sondern den Compiler auch in der Praxis eingesetzt haben für komplexe Anwendungen wie Betriebssysteme
u.v.a.m.
B.S. verdient sein Geld mittlerweile (passenderweise) als Professor irgendwo in Texas und lässt sich dort wahrscheinlich von den Erstsemestern bejubeln.
-
Bis jetzt hat sich noch nie ein gutes Tutorial für C++ in diesem Forum gezeigt. Ich wäre eher überrascht, wenn plötzlich eines auftauchen würde. Ist ja auch nachvollziehbar: Wenn man sich hinreichend gut auskennt und es didaktisch drauf hat und den Wunsch verspürt, Anfängern zu helfen, dann schreibt man eher ein Buch, als ein Tutorial. Tutorials sind gut, um kurze Sachverhalte darzustellen. Für eine Sprache wie C++, bei deren Umfang selbst knappe(!) Anfängerbücher locker 1000 Seiten und mehr haben, ist das Medium eher ungeeignet.
Ja, das leuchtet schon ein. Dachte an eine Art "Tutorial" wenn man schon ein paar Programmiersprachen kann und dann ein ibsschen in C++ reinschnuppern will.
Werd dann wohl weitersuchen , evtl. finde ich ja mal was
-
@Wutz: bist du ein C-Profi?
-
Ich halte FAQs und Referenzen auch wertvoller als Tutorials.