0

私は C の初心者です。最大 10 文字の中で最も一般的な文字を検出するプログラムを作成しようとしています。これが私がこれまでに得たものです:

char one = 'a'; //0110 0001
char check[10];

scanf("%s", &check);
char *ptr;
int a = 0;int b = 0;int c = 0;int d = 0;int e = 0;int f = 0;int g = 0;int h = 0;int i = 0;int j = 0;int k = 0;int l = 0;int m = 0;int n = 0;int o = 0;int p = 0;int q = 0;int r = 0;int s = 0;int t = 0;int u = 0;int v = 0;int w = 0;int x = 0;int y = 0;int z = 0;


if (check[0]=='a'){
    a += 1;
    if (a> b && a> c && a> d && a> e && a> f && a> g && a> h && a> i && a> j && a> k && a> l && a> m && a> n && a> o && a> p && a> q && a> r && a> s && a> t && a> u && a> v && a> x && a> y ){
        printf("A is the most common letter);
    }
}

「if」ステートメントは、入力された最初の文字のみを対象としており、文字 a のみをチェックしています。ここで助けが必要です。それを最適化するにはどうすればよいですか? a>b && a>c ... などをすべて持つ代わりに、どうすればループを作成できますか? 一般的に、どうすれば手短にできますか?何か間違ったことをしていますか?

ありがとうございました。

4

4 に答える 4

2

あなたは確かにそれをあなたのやり方で行い、すべての文字を他の文字と比較することができます. ただし、通常はこれを 2 段階で行います

  • 文字が出現する頻度を数える

    int letters[26];
    int i, n = strlen(check), max;
    memset(letters, 0, sizeof(letters));
    for (i = 0; i < n; ++i) {
        char c = tolower(check[i]);
        letters[c - 'a']++;
    }
    
  • 一番高いものを選ぶ

    max = 0;
    for (i = 1; i < 26; ++i)
        if (letters[i] > letters[max])
            max = i;
    
    printf("%c is the most common letter\n", max + 'a');
    
于 2013-03-13T17:22:45.660 に答える
2

はい、あなたは多くのことを間違っています。

コードのこの部分

int a = 0;int b = 0;int c = 0;int d = 0;int e = 0;int f = 0;int g = 0;int h = 0;int i = 0;int j = 0;int k = 0;int l = 0;int m = 0;int n = 0;int o = 0;int p = 0;int q = 0;int r = 0;int s = 0;int t = 0;int u = 0;int v = 0;int w = 0;int x = 0;int y = 0;int z = 0;

恐ろしいことです。

次のように配列を使用します。 int letter[25];

letter[0]あなたになる、あなたaletter[1]なるb…あなたにletter[49]なるz

コードのこの部分

if (check[0]=='a'){
    a += 1;

あなたが望むことをする悪い方法です。

次のようにする必要があります。

int i;

for(i = 0; i < 10; ++i)
{
    if(check[i] >= 'A' && check[i] <= 'Z') // Check if letter is uppercase.
        ++letter[check[i] - 'A']; // 'A' == 65, But our array is from 0 to 49.

    if(check[i] >= 'a' && check[i] <= 'z') // Check if letter is lowercase.
        ++letter[check[i] - 'a']; // 'a' == 97. Note that 'A' is not 'a'.
}

これにより、最も一般的な文字が確認され、letter配列に格納されます。

于 2013-03-13T16:59:06.240 に答える
0

印象的な仕事:)

int counts[26]; // We are expecting 26 letters
char check[10];
char *ptr;
scanf("%s", check);

memset(counts, 0, sizeof(counts)); // zero all array values
for (ptr = check; *ptr; ptr++)
{
   char ch = *ptr;
   if (isalpha(ch)) // ignore non-alphas
   {
      ch = tolower(ch);
      counts[ch - 'a']++;
   }
}

dreamzor回答から最適なインデックス検索コードを追加できます

于 2013-03-13T16:39:45.530 に答える
-1

ループと配列を使用する必要があります。取得した文字の量を配列に保存し、現在の文字の量を最適な量と比較するだけです。

char check[10];
scanf("%s", &check);
const int checkSize = strlen(check);

int numberOfLetters[26]; 
for(int i = 0; i < 26; ++i) 
    numberOfLetters[i] = 0;

int bestLetterIndex = -1;

for(int i = 0; i < checkSize; ++i) {
    int letterIndex = check[i] - 'a'; // getting index from ASCII code
    numberOfLetters[letterIndex]++;

    if(i == 0 || // first letter, index not found yet 
       numberOfLetters[letterIndex] > numberOfLetters[bestLetterIndex]) {
        bestLetterIndex = letterIndex;
    }
}

printf("Most common letter is %c", (char)(bestLetterIndex + 'a'));
于 2013-03-13T16:33:23.120 に答える