buchstaben in einer datei abzählen

ja alles klar, ich dachte wenn ich für cmd mein programm aufrufe, dass dann das .c file ausgeführt wird... mein fehler. hatte zwar den c coce geändert, aber vergessen das ich ein neues exe file erstelle.

was mir jetzt aber noch auffällt, wenn ich jetzt mein prim factor tool starte, also nur die exe (keinen parameter übergebe), dan wird mir endlos 2*2*2*2... ausgegeben.
ich denke das hängt mit dem fac = 2 zusammen. kann ich das noch irgendwie abstellen?
 
Hast du am Anfang eine Überprüfung drin, ob es argv[1] überhaupt gibt?
(also ob ein Parameter übergeben wurde?)

C++:
if(argc < 2)
{
    printf("Kein Parameter\n");
    return 0; //Programmende
}

Zur Erklärung:
argc hat die Anzahl der Parameter in argv.
Wenn es zB. 2 ist, gibts argv[0] und argv[1],
wobei argv[0] immer der Dateiname vom Programm ist, egal wieviel Parameter.
Für einen Param + Programmname muss argc also 2 sein.
Wenn <2 Ende
 
soweit so gut! läuft alles!
auch wenn ich einen dateinamen übergebe (für das buchstaben zähl toll)

C++:
int main(int argc, char *argv[])
...
datei = fopen(argv[1], "r")
 
Hallöchen,
Hier bin ich wieder mal. Ich möchte mein Progi etwas erweitern (relative Häufigkeit / sortieren / Buchstaben tauschen).

Was mach mein Programm im Moment:
1) Zählt die Buchstaben in einem .txt File
2) Bestimmt die relativen Häufigkeiten
3) "sollte" diese dann absteigend sortieren (funktioniert leider nicht ganz)

Probleme:
1) Irgend etwas stimmt bei meinem Bubble-Sort nicht - nur was?

C:
#include <stdio.h>
#include <stdlib.h>
 
int main(int argc, char *argv[])
{
    FILE *datei;
    float buchstaben[26][3];
    int i, j, temp;
    char c;
    float t=0;
    
    const int laenge = 26;		// for bubble-sort
    int sortiert = 0;			// for bubble-sort
 
    for(i = 0; i < 26; i++)
    {
		for(j = 0; j < 3; j++)
		{
				buchstaben[i][j] = 0;
		}
		buchstaben[i][0]='a'+i; 
    }
 
    datei = fopen(argv[1], "r");
 
    if(datei == NULL)
    {
        puts("Error");
        system("pause");
        return 1;					// 1 bei fehler; 0 bei alles OK
    }
    else
    {
        // puts("Error-Free");
    }
 
    while(!feof(datei))
    {
        c = fgetc(datei);
 
        if(c >= 'A' && c <= 'Z')
        {
            c = c - 'A' + 'a';		// große buchstaben in kleine umwandeln
        }
        if(c >= 'a' && c <= 'z')
        {
            buchstaben[c - 'a'][1]++;	// position im array bestimmten und buchstaben raufzählen
        }
    }
     
    // puts("End of File");
    
	for(i=0; i<26; i++)
    {
		t=t+buchstaben[i][1];
	}
	
	for(i=0; i<26; i++)
    {
		buchstaben[i][2]=buchstaben[i][1]*100/t;	// prozent berechnen
	}
	
	// bubble-sort
	while(sortiert == 0)
	{
		sortiert = 1;
		
		for(i = 0; i < laenge-1; i++)
		{
			if(buchstaben[i][3] > buchstaben[i+1][3])
			{
				sortiert = 0;
				
				int temp = buchstaben[i][3];
				buchstaben[i][3] = buchstaben[i+1][3];
				buchstaben[i+1][3] = temp;
			}
		}	
	}
		
    for(i = 0; i < 26; i++)
    {
		printf("%c\t %.0f\t %.3f%%\n", (char)buchstaben[i][0], buchstaben[i][1], buchstaben[i][2]);
    }
 
 	fclose(datei);
    system("pause");
    return 0;
}


Danke schon mal und nen schönen Sonntag!
 
Zuletzt bearbeitet:
a)
Warum machst du ein float-Array?
Ein struct wäre da sinnvoller.

C++:
struct probuchstabe
{
    char buchstabe;
    int anz;
    float prozent;
};
 
jetzt stehe ich aber gerade auf der Leitung, wenn ich jetzt ein struct habe, wie befülle ich das?
sind das in der struct dann alles arrays?
wenn ich dann ein array sortieren möchte, wie schaffe ich das, dass die restlichen Einträge mit sortiert werden?

edit: wäre das dann so:

C:
struct probuchstabe
{
    char buchstabe;
    int anz;
    float prozent;
};

struct probuchstabe werte[26];

int main(void)
{
werte[0]. buchstabe = a;
werte[0]. anz = 234;
werte[0].prozent = 12;
}
 
Zuletzt bearbeitet:
Ja, so ungefähr.
Etwas ausgebessert:
C++:
struct probuchstabe
{
    char buchstabe;
    int anz;
    float prozent;
};
 
int main(void)
{
    struct probuchstabe werte[26];
    werte[0].buchstabe = 'a';
    werte[0].anz = 234;
    werte[0].prozent = 12.0;
}

Beim sortieren:
Man kann einfach ein ganzen struct kopieren:
C++:
werte[3] = werte[4];
//usw...

Kannst du die Buchstabenzählerei mal auf das struct (mit anz für die Anzahl) umstellen?
 
Habe den Code jetzt angepasst. Nur jetzt läuft irgendwie nichts mehr. Es sieht alles etwas komisch aus. Was habe ich falsch gemacht?


C:
#include <stdio.h>
#include <stdlib.h>

struct probuchstabe
{
    char buchstabe;
    int anz;
    float prozent;
};
 
int main(int argc, char *argv[])
{
    FILE *datei;
    float buchstaben[26][3];
    int i, j;
    char c;
    float t=0;
    
    const int laenge = 26;		// for bubble-sort
    int sortiert = 0;			// for bubble-sort
    
    struct probuchstabe werte[26];
    struct probuchstabe temp[1];
    
    for(i = 0; i < 26; i++)
    {
		werte[i].buchstabe = 'a'+i;
    	werte[i].anz = 0;
    	werte[i].prozent = 0.0;
    }
    
    temp[i].buchstabe = 'a';
    temp[i].anz = 0;
    temp[i].prozent = 0.0;
		
    datei = fopen(argv[1], "r");
 
    if(datei == NULL)
    {
        puts("Error");
        system("pause");
        return 1;					// 1 bei fehler; 0 bei alles OK
    }
    else
    {
        // puts("Error-Free");
    }
 
    while(!feof(datei))
    {
        c = fgetc(datei);
 
        if(c >= 'A' && c <= 'Z')
        {
            c = c - 'A' + 'a';		// große buchstaben in kleine umwandeln
        }
        if(c >= 'a' && c <= 'z')
        {
			werte[c - 'a'].anz++;		// position im array bestimmten und buchstaben raufzählen	
        }
    }
     
    // puts("End of File");
    
	for(i=0; i<26; i++)
    {
		t=t+werte[i].anz;
	}
	
	for(i=0; i<26; i++)
    {
		werte[i].prozent=werte[i].anz*100/t;	// prozent berechnen
	}
	
	// bubble-sort
	while(sortiert == 0)
	{
		sortiert = 1;
		
		for(i = 0; i < laenge-1; i++)
		{
			if(werte[i].prozent < werte[i+1].prozent)
			{
				sortiert = 0;
				
				temp[1] = werte[i];
				werte[i] = werte[i+1];
				werte[i+1] = temp[1];
			}
		}	
	}
		
    for(i = 0; i < 26; i++)
    {
		printf("%c\t %d\t %.3f%%\n", werte[i].buchstabe, werte[i].anz, werte[i].prozent);
    }
 
 	fclose(datei);
    system("pause");
    return 0;
}
 
Zuletzt bearbeitet:
Zurück