Ein Histogramm in C erstellen

Nun, du hast k nirgends definiert...
Aber der Fehler sollte sicher nicht im for-loop sein, sondern halt darunter.

Also die Shell gibt nur
Zahlen wurden bis EOF gelesen und darunter ist so was
(11db)
Die shell?

Ich arbeite nicht mit XCode, aber hast du nicht ein Fenster der Compilerausgabe? (Ich traue den Zeilennummern nicht so...). Und wenn du schon in XCode bist: Lass dir den Code doch pretty-printen...

cwriter
 
C:
#include <stdio.h>

#include <stdlib.h>

#include <math.h>





int main() {

  

  

    int array[10000]={0};

    int i=0, z=0, n=10000;

    double avg=0,zahl,minimum,maximum;

  

  

  

  

    FILE *fp;

  

    if((fp=fopen("/Users/<name>/Desktop/INF 1/A4-2_Beispieldaten/random_uniform.txt", "r"))==NULL) {

        fprintf(stderr, "Konnte Datei nicht finden\n");

        return 1;

    }

    printf("Zahlen wurden bis EOF gelesen\n");

  

    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;

          

        }

      

    }

  

    printf("Der Durchnitt ergibt: %lf\n",avg);

    printf("Minimum: %d\n", (int)minimum);

    printf("Maximum: %d\n", (int)maximum);

    printf("Anzahl n: %d\n",n);

  

    (double)n;

  

    double oben=pow(array[i]-avg,2);

    double summe=0;

    for(i=0;i<n;i++) {

        summe+=sqrt(oben/n);

      

    }

    printf("Standardabweichung: %lf\n",summe);



    //Iteration über Klassen

    int k = 0;

  

  

    size_t j; for(j = 0; j < 25; j++)

    {

      

        printf("\nKlasse %2zu: ", j);

        int elcount = 0;

        int classmin = j * k;

        int classmax = (j+1) * k;

        //Iteration über alle (unsortierten) Elemente

        for(size_t i = 0; i < 10000; ++i)

        {

            //Wenn im Klassenbereich, zähle aktuelle Klasse hoch (und gebe Sternchen aus)

            if(array[i] >=  classmin && array[i] < classmax) {

                ++elcount;

              printf("*");

            }

        }

        return 0;

    }



}


Da wird nichts weiter berechnet außer Zahlen wurden bis EOF gelesen
 
Zuletzt bearbeitet von einem Moderator:
Da wird nichts weiter berechnet außer Zahlen wurden bis EOF gelesen
C:
#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("input.txt", "r"))==NULL) {

        fprintf(stderr, "Konnte Datei nicht finden\n"); 
        return 1;
    }

    printf("Zahlen wurden bis EOF gelesen\n");

    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;
        }
    }
    printf("Der Durchnitt ergibt: %lf\n",avg);

    printf("Minimum: %d\n", (int)minimum);

    printf("Maximum: %d\n", (int)maximum);

    printf("Anzahl n: %d\n",n);


    double oben=pow(array[i]-avg,2);

    double summe=0;

    for(i=0;i<n;i++) {

        summe+=sqrt(oben/n);

    }

    printf("Standardabweichung: %lf\n",summe);

    //Iteration über Klassen

    int k = ceil((float)(maximum - minimum) / 25.f);
   
    printf("Klassenbreite ist %d\n", k);

    for(size_t j = 0; j < 25; j++)
    {
        printf("\nKlasse %2zu: ", j);

        int elcount = 0;

        int classmin = j * k;

        int classmax = (j+1) * k;

        //Iteration über alle (unsortierten) Elemente

        for(size_t i = 0; i < n; ++i)
        {
            //Wenn im Klassenbereich, zähle aktuelle Klasse hoch (und gebe Sternchen aus)

            if(array[i] >= classmin && array[i] < classmax) {

                ++elcount;

              printf("*");

            }

        }

    }

    return 0;

}

Die Inputdatei darfst du selbst wieder anpassen.
Und doch noch ein ernstes Wort: Deine Eigenleistung hier ist bestenfalls mangelhaft. Ich weiss ja nicht, ob und wie das bei dir geprüft wird, aber falls es eine Prüfung gibt, solltest du dich ein bisschen mehr ins Zeug legen:

- n war 10000 und wurde dann hochgezählt. Ich nehme an, im Template stand n=0 und du hast es geändert?

- minimum und maximum haben ints, nicht doubles zu sein (grösster und kleinster Wert)

- Formatierung ist miserabel. Mehr als 3 Leerzeilen solltest du niemals haben, und schon 2 sind grenzwertig. Ich habe mal das Schlimmste behoben, aber es ist noch immer nicht "gut".

- Die Ausgabe erfolgte bei mir sehr wohl. Hast du auch gewartet, bis die Datei gelesen war? Debugger benutzt?

Gruss
cwriter
 
Hey nochmal ,
sorry für die späte Rückmeldung : es hat einigermaßen geklappt doch im Terminal soll es ungefähr so aussehen ..

Es wurden 10000 Zahlen eingelesen.
Histogramm - Anzahl Werte je Intervall
======================================
Intervallgroesse = 40
Nr.(von - bis): Anzahl
------------------------
0.( 1- 40): 2- *
page2image5824

1.( 41- 80): 3 - *
2.( 81- 120): 7 - *
3.( 121- 160): 11 - *
4.( 161- 200): 42 - **
5.( 201- 240): 100 - *****
6.( 241- 280): 184 - **********
:
12.( 481- 520): 1295 - ************************************************************
13.( 521- 560): 1272 - ***********************************************************
14.( 561- 600): 1022 - ************************************************
:
23.( 921- 960): 1 - *
24.( 961-1000): 1 - *
Kontrollsumme: 10000
 
Du sagtest, du hast noch ungelöste Probleme? Geht es um dieses Thema oder ein anderes?
(Und bitte spezifisch sein, nicht nur die Aufgabe angeben, die gelöst werden soll, sondern vor allem die Teilschritte, die du nicht verstehst, und was du bis jetzt hast)

cwriter
 
Zurück