Zum Inhalt springen

Ein Einfaches Histogramm erstellen


Gast Tikorz

Empfohlene Beiträge

 
	#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 von Tikorz
Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von Mttkrb
Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von Mttkrb
Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von Rienne
Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...