2016-10-28 56 views
0

我已經設法從我的輸入中獲取字母的頻率。我還發現了最大的發生字符。但我不知道如何打印實際的字符。現在我的程序顯示A-Z並顯示每個字母的出現次數。我希望能夠在下一行打印出發生的最大字母以及發生的次數。計算字符的出現並將其打印出來

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <ctype.h> 
#define MAX 200 

int readLine(char string[]); 
void find_frequency(char string[], int count[]); 
int maxArray(int a[]); 

int main(void) 
{ 
    char array[MAX]; 
    int freq[MAX]; 
    int nrOfChar; 
    int i; 
    char c; 
    int max; 

    printf("Command Line Tool\n"); 
    printf("Please enter text here: "); 
    nrOfChar = readLine(array); 

    for(c = 'A'; c<= 'Z'; c++) 
    { 
     printf("%c ", c); 
    } 


    find_frequency(array, freq); 

    printf("\n"); 
    for(i=0;i<26;i++) 
    { 
     printf("%d ", freq[i]); 
    } 
    printf("\n"); 

    max=maxArray(freq); 

    printf("Print letter and how many occurrence.\n"); 
    printf("Finished excuting.\n"); 

    return 0; 
} 

int readLine(char string[]) 
{ 
    int ch; 
    int i=0; 
    while (isspace(ch = getchar())) 
     ; 
    while (ch != '\n' && ch != EOF) 
    { 
     if (i < MAX) 
     { 
      string[i++] = ch; 
      ch = getchar(); 
     } 
    } 
    string[i] = '\0'; 
    return i; 
} 

void find_frequency(char string[], int count[]) 
{ 
    int i; 

    for(i = 0; string[i] != '\0'; i++) 
    { 
     if (string[i] >= 'A' && string[i] <= 'Z') 
     { 
      count[string[i]-'A']++; 
     } 
    } 
} 

int maxArray(int a[]) 
{ 
    int i, max=0; 

    for (i=0; i<26; i++) 
    { 
     if (a[i]>max) 
     { 
      max=a[i]; 
     } 
    } 


    return max; 
} 
+0

獲取'maxArray'將'i'替換爲'max'而不是'max'本身。 – kaylum

+0

從'maxArray()'返回'i'而不是'a [i]'。然後頻率是'freq [i]',人物是'i +'A''。 – Barmar

+0

'string [i] ='\ 0';'是'i == MAX'的問題。 (寫入數組邊界外) – chux

回答

0

在下面,我採納了意見,以及一些其他的修復和風格變化的各種人的建議,你要考慮:

#include <stdio.h> 
#include <string.h> 
#include <ctype.h> 

#define ALPHABET_LENGTH 26 
#define MAXIMUM_CHARACTERS 200 

int readLine(char string[], int maximum); 
void findFrequency(char string[], int count[]); 
int findMaximumIndex(int array[], int length); 

int main(void) 
{ 
    char characters[MAXIMUM_CHARACTERS]; 
    int frequencies[ALPHABET_LENGTH]; 

    printf("Command Line Tool\n"); 
    printf("Please enter text here: "); 
    (void) readLine(characters, MAXIMUM_CHARACTERS); 

    for (char c = 'A'; c <= 'Z'; c++) 
    { 
     printf("%c ", c); 
    } 
    printf("\n"); 

    findFrequency(characters, frequencies); 

    for (int i = 0; i < ALPHABET_LENGTH; i++) 
    { 
     printf("%d ", frequencies[i]); 
    } 
    printf("\n"); 

    int maximum = findMaximumIndex(frequencies, ALPHABET_LENGTH); 

    printf("%c occurred most often (%d times)\n", maximum + 'A', frequencies[maximum]); 
    printf("Finished excuting.\n"); 

    return 0; 
} 

int readLine(char string[], int maximum) 
{ 
    int c, count = 0; 

    while (isspace(c = getchar())) 
     ; 

    while (c != EOF && c != '\n') 
    { 
     if (count < maximum - 1) 
     { 
      string[count++] = c; 
      c = getchar(); 
     } 
    } 

    string[count] = '\0'; 

    return count; 
} 

void findFrequency(char string[], int count[]) 
{ 
    for (int i = 0; string[i] != '\0'; i++) 
    { 
     char c = string[i]; 

     if (c >= 'A' && c <= 'Z') 
     { 
      count[c - 'A']++; 
     } 
    } 
} 

int findMaximumIndex(int array[], int length) 
{ 
    int index = 0; 

    for (int i = 1; i < length; i++) 
    { 
     if (array[i] > array[index]) 
     { 
      index = i; 
     } 
    } 

    return index; 
} 

示例輸出

> ./a.out 
Command Line Tool 
Please enter text here: IN TEACHING OTHERS WE TEACH OURSELVES 
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 
2 0 2 0 6 0 1 3 2 0 0 1 0 2 2 0 0 2 3 3 1 1 1 0 0 0 
'E' occurred most often (6 times) 
Finished excuting. 
> 

尚未思考的問題:如果任何角色發生超過9次,你的輸出將不會很好 - 你如何解決這個問題;您可能需要在readLine()例程中將混合大小寫處理爲大寫輸入;對於最頻繁出現的信函可能會有(多方)的聯繫,你可以處理嗎?你的readLine()返回一個你不會做任何事情的字符數 - 它有多大用處(可能在錯誤檢查中)?

相關問題