Jump to content

Ein Einfaches Histogramm erstellen

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

Diesen Beitrag teilen


Link zum Beitrag
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

Diesen Beitrag teilen


Link zum Beitrag
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

Diesen Beitrag teilen


Link zum Beitrag
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

Diesen Beitrag teilen


Link zum Beitrag
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.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Erstelle ein Benutzerkonto oder melde dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde dich hier an.

Jetzt anmelden


×