Ein Histogramm in C erstellen

BasicC

Erfahrenes Mitglied
So das Problem ist ich habe es hinbekommen
Bis jetzt die intervallgroesse hinzuschreiebn
Darubter von bis Anzahl
Und darunter soll er ja zählen das weiss ich leider nicht wie es geht die Spalten 1-40, 41-80 u.s.w habe ich nicht hinbekommen bei mir steht überall 1-40 und die nummerierung ist niht vor den Klammern (1-40) 0. so siehts aus bei mir.
Ich hoffe kannst mir einige Tipps geben.
Danke
 

cwriter

Erfahrenes Mitglied
Und darunter soll er ja zählen das weiss ich leider nicht wie es geht die Spalten 1-40, 41-80 u.s.w habe ich nicht hinbekommen bei mir steht überall 1-40 und die nummerierung ist niht vor den Klammern (1-40) 0. so siehts aus bei mir.
Ich hoffe kannst mir einige Tipps geben.
Du kennst printf()? Die Wertbereiche sind ja ohnehin schon ausgerechnet, du müsstest sie also nur noch einsetzen...?

Ansonsten kann ich deinem Text wenige Informationen entnehmen.

cwriter
 

cwriter

Erfahrenes Mitglied
Leider weiß ich nicht was da rein soll -.-
Ok, gehen wir es durch:
Du sagtest, es solle so aussehen (am Beispiel der Zeile 1):
1.( 41- 80): 3 - *

Das Format ist also "%d. (%d - %d): %d - ".
Die erste Zahl ist die Klassen- /Zeilennummer, also j.
Die zweite und dritte Zahl sind die Wertbereiche, also classmin und (classmax-1). Die letzte Zahl ist die Anzahl der Elemente, also elcount.

Die Sternchen sind nun etwas problematischer, da sie im bestehenden Code ausgegeben werden, bevor elcount bekannt ist. Die Lösung ist ein eigener Loop für die Sternchen, aber das solltest du dann wirklich hinkriegen.

Gruss
cwriter
 

BasicC

Erfahrenes Mitglied
Code:
#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/<name>/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)==1) {

         if ( array < 0 || array  > 9999 ) {

             printf("ERROR\n");

            return 1;

        }

        z+=array;    

        i++;

        n++;

    }

    avg=(double)z/n;

    minimum=maximum=array[0];

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

        zahl=array;

        if (zahl<minimum) {

            minimum=zahl;

        }

        if(zahl>maximum){

            maximum=zahl;

        }

    }

    double oben=pow(array-avg,2);
    double summe=0;

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

      summe+=sqrt(oben/n);    

    }

    //Iteration über Klassen

    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");

 

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

    {

        printf(" %4d. (%d - %d): %d \n", 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 >= classmin && array < classmax) {

            

                ++elcount;  

            }
        }
    }

    return 0;

}

So sieht mein Code zur Zeit aus der gibt nicht die Intervalle an so wie ich sie möchte 1-40 , 41-80.. wie könnte ich das eingrenzen ?
 
Zuletzt bearbeitet von einem Moderator:

cwriter

Erfahrenes Mitglied
So sieht mein Code zur Zeit aus der gibt nicht die Intervalle an so wie ich sie möchte 1-40 , 41-80..
Naja, wenn du nur mal die Dokumentation von printf lesen würdest... Für jedes %d musst du einen Wert als Parameter übergeben (das heisst für dich auch, dass das printf zu hoch steht, da es ja classmin und classmax ausgeben muss).

Und warum hast du wieder überall so grässlich viele Zeilen hingemacht? Scrollst du sehr gerne oder wird die Aufgabe nach Zeilen bewertet?

cwriter
 

BasicC

Erfahrenes Mitglied
Also zum ersten Teil deines Textes kann ich nur no comment sagen

Zum zweiten ich habe versucht zu kürzen ich wusste, dass du es bemängeln würdest ^^
 

cwriter

Erfahrenes Mitglied
Für jedes %d musst du einen Wert als Parameter übergeben (das heisst für dich auch, dass das printf zu hoch steht, da es ja classmin und classmax ausgeben muss

Den Teil vielleicht nochmal anders erklären
Also printf() solltet ihr schon gehabt haben...
Du übergibst nur ein j an das printf, hast aber 4 %d. Als wird printf 4 Argumente (neben dem String selbst) brauchen. Das %d ist ja ein Platzhalter. wenn du printf nicht sagst, womit es die Platzhalter füllen soll, hat es ein Problem.
Wenn du aber nun einfach classmin und classmax-1 und elcount an die Funktion übergibst und die Ausgabe nicht verschiebst, dann würdest du classmin, classmax und elcount verwenden, ohne, dass die Variablen gesetzt worden wären. Also gibt es einen Compilererror.

cwriter
 

BasicC

Erfahrenes Mitglied
Code:
#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");

  

    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 i = 0; i < n; i++)

        {

  

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

              

                ++elcount;

              

              

            }

        }

    }

  

    return 0;

}

So bis hier her erstmal weiter komme ich nicht .
Das Ergebnis fehlt + die Sterne
 
Zuletzt bearbeitet: