2017-01-18 12 views
-1

普通の文字を文字列で見つけ出し、その文字を印刷するつもりのプログラムと、次によく使われる文字を書いたのですが、どのように達成できますか?文字列に次の共通要素を印刷するにはどうすればよいですか?

#include <stdlib.h> 
#include <stdio.h> 
#include <math.h> 
#include <time.h> 

#define MAX 10 
#define MAX_FREQ 256 
int main() 
{ 
    char string[MAX] = {0}; 

    int i = 0; 
    int freq[MAX_FREQ] = {0}; 

    printf("Enter a String: "); 
    fgets(string, MAX, stdin); 
    if(string[strlen(string)-1] == '\n') {string[strlen(string)-1] = 0;} 

    for(i = 0; string[i]; i++) 
    { 
     freq[string[i]]++; 
    } 

    for(i = 0; i < MAX_FREQ; i++) 
    { 
     if(freq[i]) 
     { 
      printf("Most common: %c, 2nd most common: %c\n", i, i-1); 
     } 
    } 
    return (0); 
} 

ありがとう:

は、ここに私のコードです。 1以下のような

+0

(https://stackoverflow.com/questions/41664603/)[文字列の2つの最も頻度の高い文字を入れ替え]について、この質問のためのコード - 実際には全く別のタイトルを持っている問題が、客観的これと密接に関連しています(それは、2番目に一般的な手紙で最も一般的なすべての出現と、最も一般的な手紙で2番目に多い出現のすべての出現を交換しますが、それはトリビアです)。最大値と2番目の最大値を見つけるコードは、[Xzenon](https://stackoverflow.com/users/2491551/xzenon)に非常によく似ています。 –

答えて

0

利用コード: -

int max = INT_MIN , max2 = INT_MIN,maxi,max2i; //using <limits.h> 
for(i = 0; i < MAX_FREQ; i++) 
{ 

    if(max<=freq[i]) 
    { 
     max = freq[i]; 
     maxi =i; 
    } 

    if(freq[i]<=max && freq[i]=>Max && max1i! =i) 
    {max2 = freq[i]; 
     max2i = i; 
    } 
} 

は今、あなたは簡単にそれらの文字を印刷するmax1iとmax2iインデックスを使用することができますが

+0

私はあなたが質問を正しく読んだとは思わないが、彼は出現回数ではなく文字を求めている。 – Xzenon

+0

彼はそれらの文字を簡単に得るために最大1または最大2を使用することができます。私はちょうどそれらの最大値を得る方法を教えました –

+0

まず、私は私のコメントを投稿した後それらを追加しました。次に、ソリューションに欠陥があります。例:freq ['a'] = 5、freq ['b'] = 2; freq ['c'] = 6は、max = 6とmax2 = 2(5ではない)を与えます。 – Xzenon

2

私は、コード内のコメントは、あなたが理解するために十分になると思います。

// max - most common, snd - second most common 
int max_freq = 0, snd_freq = 0; 
char max_char, snd_char; 

// iterate through frequency array 
for (int i = 0; i < MAX_FREQ; i++) 
{ 
    if (freq[i] > max_freq) 
    { 
     /* 
     * we had a previous max_freq that satisfied max_freq > snd_freq 
     * since we found a new freq > max_freq, we'll change snd_freq as well 
     * to max_freq 
     * order: freq[i] > max_freq > snd_freq 
     */ 

     snd_freq = max_freq; 
     max_freq = i; //it'll be converted, don't worry 

     snd_char = max_char; 
     max_char = str[i]; 
    } 
    else if (freq[i] > snd_freq) 
    { 
     snd_freq = freq[i]; 
     snd_char = i; 
    } 
} 

// print most and second most common characters 
printf("%c %c", max_char, snd_char); 
関連する問題