Advertisement
Guest User

Datei testing

a guest
Jul 8th, 2018
159
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.61 KB | None | 0 0
  1. #include <stdio.h> // Ein- und Ausgabe Funktionen
  2. #include <string.h> // Fuer Zeichenketten Funktionen
  3.  
  4. char text[1000]; // Text Zeichenkette mit einer maximal Erlaubten Laenge von 1000 Zeichen
  5. char words[100][20]; // Zeichenketten-Feld fuer 100 Zeichenkette mit maximaler Laenge von 20-1=19
  6. int words_freq[100]; // Feld um maximal 100 Woerter Haeufigkeiten einzuspeichern (koennen weniger sein)
  7. int letters_freq[26]; // Feld um das Vorkommen der Alphabet Buchstaben einzuspeichern
  8.  
  9. int word_count = 0; // Wort Zaehler
  10. char *p; // Zeiger fuer char-Funktionen
  11.  
  12. void read_text_from_file(); // Funktion um den Text von der Datei zu lesen
  13. void letter_frequency(); // Buchstaben Vorkommen berechnen
  14. void separate_words(); // Woerter vom Text finden, ohne Wiederholung und mit Haeufigkeiten
  15. void sort_words(); // Woerter Feld alphabetisch sortieren
  16. void print_words_to_file(); // Woerter in Datei schreiben mit ersten und letzen kapitalisiert
  17.  
  18. int main(){
  19.     int i;
  20.     int count;
  21.     char letter; // Buchstaben den wir suchen wollen
  22.    
  23.     read_text_from_file();
  24.     printf("Text:\n%s", text); // Text ausdrucken
  25.     letter_frequency();
  26.    
  27.     separate_words();
  28.     sort_words();
  29.     // Woerter Ausdrucken
  30.     printf("\nWords:\n");
  31.     for(i = 0; i < word_count; i++){
  32.         printf("words[%d] = %s (freq = %d)\n", i, words[i], words_freq[i]);
  33.     }
  34.     print_words_to_file();
  35.    
  36.     // Nach Woertern die mit einen spezifischen Buchstaben anfangen suchen
  37.     printf("\nSearch for words starting with: ");
  38.     scanf("%c", &letter);
  39.     fflush(stdin);
  40.     if(letter <= 'Z'){ // Wenn der Buchstabe grossgeschrieben wurde
  41.         letter = letter + 32;
  42.     }
  43.     count = 0;
  44.     for(i = 0; i < word_count; i++){ // Alle Woerter suchen
  45.         if( words[i][0] == letter ){ // ersten Buchstaben vergleichen
  46.             printf("%s starts with %c\n", words[i], letter);
  47.             count++;
  48.         }
  49.     }
  50.     if(count == 0){ // Wenn nichts gefunden wurde
  51.         printf("No word starts with %c!\n", letter);
  52.     }else{
  53.         printf("%d words start with %c!\n", count, letter);
  54.     }
  55.    
  56.     // Nach Woertern die mit einen spezifischen Buchstaben enden suchen
  57.     printf("\nSearch for words ending with: ");
  58.     scanf("%c", &letter);
  59.     fflush(stdin);
  60.     if(letter <= 'Z'){ // Wenn der Buchstabe grossgeschrieben wurde
  61.         letter = letter + 32;
  62.     }
  63.     count = 0;
  64.     for(i = 0; i < word_count; i++){ // Alle Woerter suchen
  65.         if( words[i][strlen(words[i])-1] == letter ){ // letzten Buchstaben vergleichen
  66.             printf("%s starts with %c\n", words[i], letter);
  67.             count++;
  68.         }
  69.     }
  70.     if(count == 0){ // Wenn nichts gefunden wurde
  71.         printf("No word ends with %c!\n", letter);
  72.     }else{
  73.         printf("%d words end with %c!\n", count, letter);
  74.     }
  75.    
  76.     return 0;
  77. }
  78.  
  79. void read_text_from_file(){
  80.     char buf[80]; // Puffer um den Text Linie-Linie zu lesen
  81.     FILE *fp; // Datei Zeiger
  82.    
  83.     fp = fopen("text.txt", "r"); // Datei zum lesen oefnnen
  84.     if(fp == NULL){ // nach fehler checken
  85.         printf("File not found!\n");
  86.     }
  87.    
  88.     fgets(buf, 80, fp); // linie vom Text lesen
  89.     strcpy(text, buf); // Puffer zu Text initialisieren
  90.     while( fgets(buf, 100, fp) != NULL){ // bis zum Datenende lesen
  91.         strcat(text, buf); // Puffer am ende von "text" anhaengen, verbinden
  92.     }  
  93.     fclose(fp); // datei schliessen
  94. }
  95.  
  96. void letter_frequency(){
  97.     int i, j;
  98.     char letter = 'a';
  99.    
  100.     for(i = 0; i < 26; i++){ // fuer jeden Buchstaben des Alphabets
  101.         letters_freq[i] = 0;
  102.         for(j = 0; j < strlen(text); j++){
  103.             if(text[j] == letter || text[j] == letter - 32){ // Gross und Klein untersuchen
  104.                 letters_freq[i]++;
  105.             }
  106.         }  
  107.         letter++; // zum naechsten Buchstaben gehen
  108.     }
  109.     letter = 'a';
  110.     printf("\nFrequency of Letters:\n");
  111.     for(i = 0; i < 26; i++){
  112.         printf("%c: %d\n", letter, letters_freq[i]);
  113.         letter++;
  114.     }
  115. }
  116.  
  117. void separate_words(){
  118.     int i;
  119.     int number, min_length, same; //flags (Fahnen) fuer die Woerter (diese helfen uns beim ueberpruefen)
  120.    
  121.     p = strtok(text," \"\n\t\r,.-;!"); // p zeigt an die naechste Adresse die nicht im zweiten Parameter vorkommt
  122.     while (p != NULL){ // solange wir nicht am Ende der Datei sind
  123.         number = 0; // 0 heisst keine nummer im Wort
  124.         min_length = 1; // Laenge muss mindestens 2 sein
  125.        
  126.         if(strlen(p) > 1); // Wenn Laenge gross genug ist dann nichts machen
  127.         else min_length = 0; // zu kleines "Wort"
  128.        
  129.         for(i = 0; i < strlen(p); i++){ // Ganzes Wort nach Nummern ueberpruefen
  130.             if(p[i] >= '0' && p[i] <= '9'){ // Die Nummern sind in ASCII-form und sind auch eine nach der anderen abgespeichert
  131.                 number = 1; // wenn eine Nummer gefunden wurde -> 1
  132.             }
  133.         }
  134.        
  135.         // Alle grossgeschriebenen zu kleingeschriebenen Buchstaben umwandeln
  136.         if( p[0] <= 'Z'){ //in ASCII-Code alle Buchstaben sind in einer Reihenfolge sortiert
  137.                 p[0] = p[0] + 32; // die "kleinen" sind 32 Stellen nach den "grossen" gespeichert
  138.         }
  139.        
  140.         if(number == 0 && min_length == 1){  // wenn keine Nummern gefunden wurden und die Laenge ausreicht
  141.             same = 0; // 0 heisst das das Wort noch nicht eingefuegt worden ist
  142.             // Nach dem Wort in den bereits eingefuegten Woertern suchen
  143.             for(i = 0; i <word_count; i++){
  144.                 if( strcmp(p, words[i]) == 0 ){ // wenn p und words[i] gleich sind wird 0 zurueckgegeben
  145.                     same = 1; // Wort schon eingefuegt -> 1
  146.                     words_freq[i]++; // Haeufigkeit des Worts erhoehen
  147.                     break; // For loop abbrechen, das wir das Wort nur ein mal finden koennen
  148.                 }
  149.             }
  150.             if(same == 0){ // Wenn nicht eingefuegt
  151.                 strcpy(words[word_count], p); // Wort in Woerter-Feld einfuegen
  152.                 words_freq[word_count] = 1; // Frequenz/Haeufigkeit auf 1 setzen
  153.                 word_count++; // Wort-Zaehler inkrementieren
  154.             }          
  155.         }
  156.         p = strtok(NULL," \"\n\t\r,.-;!"); // da weiter machen wo wir aufgehoert haben
  157.        
  158.     }
  159. }
  160.  
  161. void sort_words(){
  162.     int i, j;
  163.     char word[20]; // temporaeres Wort zum austauschen
  164.    
  165.     for(i = 0; i < word_count; i++){
  166.         for(j = i; j < word_count; j++){
  167.             if( strcmp(words[i], words[j]) > 0 ){ // wenn > 0 zurueckgegeben wird dann heisst es das das erst alphabetisch groesser ist
  168.                 // Austausch mit hilfe der temporaeren Wort-Variabel
  169.                 strcpy(word, words[i]);
  170.                 strcpy(words[i], words[j]);
  171.                 strcpy(words[j], word);
  172.             }
  173.         }
  174.     }
  175. }
  176.  
  177. void print_words_to_file(){
  178.     FILE *fp; // Datei Zeiger
  179.     int i;
  180.     char word[20]; // temporaeres Wort zum bearbeiten
  181.    
  182.     fp = fopen("words.txt", "w"); // Datei zum schreiben oefnnen (wird eine neue erstellt)
  183.    
  184.     for(i = 0; i < word_count; i++){
  185.         strcpy(word, words[i]);
  186.         if(words[i][0] >= 'a') word[0] = word[0] - 32; // wenn erster Buchstabe klein dan gross machen mit -32
  187.         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
  188.         fprintf(fp, "%s\n", word); // Wort in Datei schreiben
  189.     }
  190.    
  191.     fclose(fp); // Datei schliessen
  192. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement