Ein Histogramm in C erstellen

cwriter

Erfahrenes Mitglied
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
 

BasicC

Erfahrenes Mitglied
Ich hab es auch über CodeLite ausgegeben und im Terminal erscheint halt auch nur, dass es bis EOF zahlen gelesen hat
 

BasicC

Erfahrenes Mitglied
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:

cwriter

Erfahrenes Mitglied
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
 

BasicC

Erfahrenes Mitglied
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
 

cwriter

Erfahrenes Mitglied
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