Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h> // Ein- und Ausgabe Funktionen
- #include <string.h> // Fuer Zeichenketten Funktionen
- char text[1000]; // Text Zeichenkette mit einer maximal Erlaubten Laenge von 1000 Zeichen
- char words[100][20]; // Zeichenketten-Feld fuer 100 Zeichenkette mit maximaler Laenge von 20-1=19
- int words_freq[100]; // Feld um maximal 100 Woerter Haeufigkeiten einzuspeichern (koennen weniger sein)
- int letters_freq[26]; // Feld um das Vorkommen der Alphabet Buchstaben einzuspeichern
- int word_count = 0; // Wort Zaehler
- char *p; // Zeiger fuer char-Funktionen
- void read_text_from_file(); // Funktion um den Text von der Datei zu lesen
- void letter_frequency(); // Buchstaben Vorkommen berechnen
- void separate_words(); // Woerter vom Text finden, ohne Wiederholung und mit Haeufigkeiten
- void sort_words(); // Woerter Feld alphabetisch sortieren
- void print_words_to_file(); // Woerter in Datei schreiben mit ersten und letzen kapitalisiert
- int main(){
- int i;
- int count;
- char letter; // Buchstaben den wir suchen wollen
- read_text_from_file();
- printf("Text:\n%s", text); // Text ausdrucken
- letter_frequency();
- separate_words();
- sort_words();
- // Woerter Ausdrucken
- printf("\nWords:\n");
- for(i = 0; i < word_count; i++){
- printf("words[%d] = %s (freq = %d)\n", i, words[i], words_freq[i]);
- }
- print_words_to_file();
- // Nach Woertern die mit einen spezifischen Buchstaben anfangen suchen
- printf("\nSearch for words starting with: ");
- scanf("%c", &letter);
- fflush(stdin);
- if(letter <= 'Z'){ // Wenn der Buchstabe grossgeschrieben wurde
- letter = letter + 32;
- }
- count = 0;
- for(i = 0; i < word_count; i++){ // Alle Woerter suchen
- if( words[i][0] == letter ){ // ersten Buchstaben vergleichen
- printf("%s starts with %c\n", words[i], letter);
- count++;
- }
- }
- if(count == 0){ // Wenn nichts gefunden wurde
- printf("No word starts with %c!\n", letter);
- }else{
- printf("%d words start with %c!\n", count, letter);
- }
- // Nach Woertern die mit einen spezifischen Buchstaben enden suchen
- printf("\nSearch for words ending with: ");
- scanf("%c", &letter);
- fflush(stdin);
- if(letter <= 'Z'){ // Wenn der Buchstabe grossgeschrieben wurde
- letter = letter + 32;
- }
- count = 0;
- for(i = 0; i < word_count; i++){ // Alle Woerter suchen
- if( words[i][strlen(words[i])-1] == letter ){ // letzten Buchstaben vergleichen
- printf("%s starts with %c\n", words[i], letter);
- count++;
- }
- }
- if(count == 0){ // Wenn nichts gefunden wurde
- printf("No word ends with %c!\n", letter);
- }else{
- printf("%d words end with %c!\n", count, letter);
- }
- return 0;
- }
- void read_text_from_file(){
- char buf[80]; // Puffer um den Text Linie-Linie zu lesen
- FILE *fp; // Datei Zeiger
- fp = fopen("text.txt", "r"); // Datei zum lesen oefnnen
- if(fp == NULL){ // nach fehler checken
- printf("File not found!\n");
- }
- fgets(buf, 80, fp); // linie vom Text lesen
- strcpy(text, buf); // Puffer zu Text initialisieren
- while( fgets(buf, 100, fp) != NULL){ // bis zum Datenende lesen
- strcat(text, buf); // Puffer am ende von "text" anhaengen, verbinden
- }
- fclose(fp); // datei schliessen
- }
- void letter_frequency(){
- int i, j;
- char letter = 'a';
- for(i = 0; i < 26; i++){ // fuer jeden Buchstaben des Alphabets
- letters_freq[i] = 0;
- for(j = 0; j < strlen(text); j++){
- if(text[j] == letter || text[j] == letter - 32){ // Gross und Klein untersuchen
- letters_freq[i]++;
- }
- }
- letter++; // zum naechsten Buchstaben gehen
- }
- letter = 'a';
- printf("\nFrequency of Letters:\n");
- for(i = 0; i < 26; i++){
- printf("%c: %d\n", letter, letters_freq[i]);
- letter++;
- }
- }
- void separate_words(){
- int i;
- int number, min_length, same; //flags (Fahnen) fuer die Woerter (diese helfen uns beim ueberpruefen)
- p = strtok(text," \"\n\t\r,.-;!"); // p zeigt an die naechste Adresse die nicht im zweiten Parameter vorkommt
- while (p != NULL){ // solange wir nicht am Ende der Datei sind
- number = 0; // 0 heisst keine nummer im Wort
- min_length = 1; // Laenge muss mindestens 2 sein
- if(strlen(p) > 1); // Wenn Laenge gross genug ist dann nichts machen
- else min_length = 0; // zu kleines "Wort"
- for(i = 0; i < strlen(p); i++){ // Ganzes Wort nach Nummern ueberpruefen
- if(p[i] >= '0' && p[i] <= '9'){ // Die Nummern sind in ASCII-form und sind auch eine nach der anderen abgespeichert
- number = 1; // wenn eine Nummer gefunden wurde -> 1
- }
- }
- // Alle grossgeschriebenen zu kleingeschriebenen Buchstaben umwandeln
- if( p[0] <= 'Z'){ //in ASCII-Code alle Buchstaben sind in einer Reihenfolge sortiert
- p[0] = p[0] + 32; // die "kleinen" sind 32 Stellen nach den "grossen" gespeichert
- }
- if(number == 0 && min_length == 1){ // wenn keine Nummern gefunden wurden und die Laenge ausreicht
- same = 0; // 0 heisst das das Wort noch nicht eingefuegt worden ist
- // Nach dem Wort in den bereits eingefuegten Woertern suchen
- for(i = 0; i <word_count; i++){
- if( strcmp(p, words[i]) == 0 ){ // wenn p und words[i] gleich sind wird 0 zurueckgegeben
- same = 1; // Wort schon eingefuegt -> 1
- words_freq[i]++; // Haeufigkeit des Worts erhoehen
- break; // For loop abbrechen, das wir das Wort nur ein mal finden koennen
- }
- }
- if(same == 0){ // Wenn nicht eingefuegt
- strcpy(words[word_count], p); // Wort in Woerter-Feld einfuegen
- words_freq[word_count] = 1; // Frequenz/Haeufigkeit auf 1 setzen
- word_count++; // Wort-Zaehler inkrementieren
- }
- }
- p = strtok(NULL," \"\n\t\r,.-;!"); // da weiter machen wo wir aufgehoert haben
- }
- }
- void sort_words(){
- int i, j;
- char word[20]; // temporaeres Wort zum austauschen
- for(i = 0; i < word_count; i++){
- for(j = i; j < word_count; j++){
- if( strcmp(words[i], words[j]) > 0 ){ // wenn > 0 zurueckgegeben wird dann heisst es das das erst alphabetisch groesser ist
- // Austausch mit hilfe der temporaeren Wort-Variabel
- strcpy(word, words[i]);
- strcpy(words[i], words[j]);
- strcpy(words[j], word);
- }
- }
- }
- }
- void print_words_to_file(){
- FILE *fp; // Datei Zeiger
- int i;
- char word[20]; // temporaeres Wort zum bearbeiten
- fp = fopen("words.txt", "w"); // Datei zum schreiben oefnnen (wird eine neue erstellt)
- for(i = 0; i < word_count; i++){
- strcpy(word, words[i]);
- if(words[i][0] >= 'a') word[0] = word[0] - 32; // wenn erster Buchstabe klein dan gross machen mit -32
- if(words[i][ strlen(words[i])-1 ] >= 'a') word[strlen(words[i])-1] = word[strlen(words[i])-1] - 32; // wenn letzer klein das selbe machen
- fprintf(fp, "%s\n", word); // Wort in Datei schreiben
- }
- fclose(fp); // Datei schliessen
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement