Gast Tikorz Geschrieben 4. Dezember 2017 Teilen Geschrieben 4. Dezember 2017 (bearbeitet) #include <stdio.h> #include <stdlib.h> #include <math.h> int main() { int array[10000]; int i=0, z=0, n=0; double avg=0,zahl; int minimum,maximum; FILE *fp; if((fp=fopen("/Users/**********/Desktop/INF 1/A4-2_Beispieldaten/random_uniform.txt", "r"))==NULL) { fprintf(stderr, "Konnte Datei nicht finden\n"); return 1; } while(fscanf(fp, "%d",&array[i])==1) { if ( array[i] < 0 || array[i] > 9999 ) { printf("ERROR\n"); return 1; } z+=array[i]; i++; n++; } avg=(double)z/n; minimum=maximum=array[0]; for (i=0;i<n;i++) { zahl=array[i]; if (zahl<minimum) { minimum=zahl; } if(zahl>maximum){ maximum=zahl; } } double oben=pow(array[i]-avg,2); double summe=0; for(i=0;i<n;i++) { summe+=sqrt(oben/n); } int k = ceil((float)(maximum - minimum) / 25.f); printf("Es wurden 10000 Zahlen eingelesen.\n"); printf("Histogramm - Anzahl Werte je Intervall\n"); printf("---------------------------------------\n"); printf("---------------------------------------\n"); printf("Intervallgroesse ist %d\n", k); printf("Nr.(von-bis) Anzahl:\n"); printf("----------------------\n"); int elcount[1000]; for(size_t j = 0; j < 25; j++) { int elcount = 0; int classmin = j * k; int classmax = (j+1) * k; printf("%4zu. (%3d - %4d): %d \n", j,classmin+1,classmax,elcount); for(size_t elcount = 0; elcount < n; elcount++) { if(array[elcount] > classmin && array[elcount] > classmax) ++elcount; } } } Schreiben Sie das Programm aus der o. g. 2. Aufgabe so um, dass ein Histogramm der eingelesenen Zahlen ausgegeben wird. Klassifizieren sie die eingelesenen Werte dazu in z. B. 25 gleich große Intervalle und geben Sie die Anzahl der in jedem Intervall gelege- nen Eingabewerte aus. Visualisieren Sie die Anzahlen zusätzlich durch '*'-Reihen pro- portionaler Länge, so dass Sie in etwa folgende Ausgabe erzeugen: Es wurden 10000 Zahlen eingelesen. Histogramm - Anzahl Werte je Intervall ====================================== Intervallgroesse = 40 Nr.(von - bis): Anzahl ------------------------ 0. (. 0 - 40) : 2 * 1. ( 41 - 80): 3 * 12.( 481- 520): 1295 13.( 521- 560): 1272 14.( 561- 600): 1022 : 23.( 921- 960): 1 24.( 961-1000): 1 Kontrollsumme: 10000 Ich kriege die Anzahl nicht hin und die Sternchen -.- Bearbeitet 4. Dezember 2017 von Tikorz Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Mttkrb Geschrieben 4. Dezember 2017 Teilen Geschrieben 4. Dezember 2017 (bearbeitet) Hi, du hast ein paar Logikfehler drin: in deiner Schleife mit der Ausgabe setzt du in jeder runde elcount=0 dann gibst du mit printf dein Ergebnis aus und führst dann deine Berechnung für elcount durch. Die Reihenfolge solltest du nochmal überarbeiten. Dann setzt du in der einen Zeile int elcount[1000]; und später int elcount = 0; Für eins musst du dich schon entscheiden, oder zumindest die variablen unterschiedlich benennen. Bearbeitet 4. Dezember 2017 von Mttkrb Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Mttkrb Geschrieben 4. Dezember 2017 Teilen Geschrieben 4. Dezember 2017 (bearbeitet) Ich hab gerade etwas gegooglet und das hier gefunden: https://www.tutorials.de/threads/ein-histogramm-in-c-erstellen.406083/page-2 Der Post #26 beinhaltet schon fast die Lösung. Zumindest hat in dieser Variante die variable elcount im jeweiligen Schleifendurchlauf brauchbare Werte. Edit: Ach das bist ja du.... :-D Bearbeitet 4. Dezember 2017 von Mttkrb Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Rienne Geschrieben 5. Dezember 2017 Teilen Geschrieben 5. Dezember 2017 (bearbeitet) Hallo, erst einmal solltest du die Aufgabenstellung verstehen und dir dann überlegen, wie das sinnvoll lösen kann und nicht einfach drauf los coden. Dein Coding sieht sehr zusammengewürfelt aus und du scheinst gar nicht zu verstehen, was du da genau machst. Das wird auch von dem, was man in deinem Thread, den @Mttkrb gepostet hat, lesen kann, deutlich. Du hast eine Reihe an Zahlen, die in ein Array gelesen werden. Daraus sollst du ein Histogramm erstellen. D.h. du sollst den Bereich, in dem sich die eingelesenen Zahlen befinden, in x Intervalle (hier ist als Beispiel 25 angegeben) unterteilen und schauen, wieviele deiner zuvor eingelesenen Werte in den jeweiligen Intervallen liegen. Dann solltest du dir klar machen, was du brauchst und was du bereits hast. Was du aktuell hast: ein Array der Größe 10.000, in dem Zahlen stehen Den kleinsten und größten Wert dieser Zahlen die Anzahl der Intervalle, die du bilden sollst die Intervallgröße, die du mit vor 15 Stunden schrieb Tikorz: int k = ceil((float)(maximum - minimum) / 25.f); berechnet hast. Was gesucht wird: Die Menge der Werte, die sich im jeweiligen Intervall befinden Jetzt kommt die Denkarbeit! Du musst also alle Werte des zuvor eingelesenen Arrays darauf prüfen, in welchem Intervall sie sich befinden (das klingt sehr nach einer Schleife) und für jeden Wert den "Counter" des entsprechenden Intervalls hochzählen (dazu bietet sich wohl ein Array an). Deine Intervalle sollten übrigens so aussehen: 1. Intervall von Minimalwert bis Minimalwert + Intervallgröße 2. Intervall von (Minimalwert + Intervallgröße)+1 bis Minimalwert + 2 * Intervallgröße 3. Intervall von (Minimalwert + 2 * Intervallgröße)+1 bis Minimalwert + 3 * Intervallgröße ... 25. Intervall von (Minimalwert + 24 * Intervallgröße)+1 bis Maximalwert (= Minimalwert + 25 * Intervallgröße) Hier sollte dir eine Regelmäßigkeit auffallen, die du nutzen kannst, um die Werte des eingelesenen Arrays den passenden Intervallen zuzuordnen (Tipp: ganzzahlige Division). Die Ausgabe später sollte dann recht banal sein. Bearbeitet 5. Dezember 2017 von Rienne Mttkrb reagierte darauf 1 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Gast Tikorz Geschrieben 7. Dezember 2017 Teilen Geschrieben 7. Dezember 2017 Sorry.. für die späte Antwort. ich muss zugeben ich habe nicht viel verstanden von der Aufgabe und zum letzten Teil habe ich mir von meinem Prof hilfe geholt. @Rienne hab ich es besser verstehen können danke nochmal. Und ja ich hole mir gerne hilfe von zwei Seiten, weil es im Endeffekt zwei verschiedene Meinungen geben kann. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.