LCDディスプレイのトップ3の繰り返し要素の印刷

入力がキーパッドを使ってユーザーによって与えられる配列を持っています。すべての入力は storeKeys という名前の配列に格納されます。配列のインデックスは変数 storeKeysIndex によって保持され、キーが押されると押されたkeyの値が storeKeys 配列に格納されます。 storeKeysIndex が増えます。 storeKeys に値を持たせます

storeKeys = {3,2,5,7,1,1,9,9,9,1,3,1};

私は、液晶ディスプレイに、配列内の上位3つの繰り返し要素を表示させます。上記の配列では、値 '1'が4回繰り返され、 '9'が3回繰り返され、 '3'が2回繰り返されるため、lcdは1,9,3を表示します。他の値は、lcdによって表示されるべきではありません。

各要素の頻度を数え、その頻度を freq の配列に格納しようとしました。シリアルモニタで各要素の周波数を表示できます。しかし、私はどのように液晶ディスプレイ(またはシリアルモニタ)にトップ3の繰り返し番号を表示するかを得ていません。これがコードです:

for(int i=0; i<12; i++)
{
    freq[i] = -1;
}
for(int i=0; i<12; i++)
{
    count = 1;
    for(int j=i+1; j<12; j++)
    {
        if(storeKeys[i] == storeKeys[j])
        {
            count++;
            freq[j] = 0;
        }
    }

    if(freq[i]!=0)
    {
        freq[i] = count;
    }
}
for(int i=0; i<12; i++)
{
    if(freq[i]!=0 && storeKeys[i] != NULL)
    {
        Serial.println(storeKeys[i]);
        Serial.println(freq[i]);
        Serial.println("==========");
    }
}

上記のコードは機能しますが、すべての要素の頻度を表示します。上位3つの繰り返し要素のみを表示します。

これがシミュレータオンラインのリンクです。

https://circuits.io/circuits/5073094-the-unnamed-circuit/編集

ありがとう。

0
追加された 編集された
ビュー: 1
ru de
「上位3回の繰り返し要素」とはどういう意味ですか?最も多い繰り返し、最も高い数字、最も高いインデックス? 3桁以上の繰り返し数字がある場合は、それを明確にする必要があります。あなたの例では、それらは遭遇した順序で示されています。
追加された 著者 Weather Vane,
「上位3回の繰り返し要素」とはどういう意味ですか?最も多い繰り返し、最も高い数字、最も高いインデックス? 3桁以上の繰り返し数字がある場合は、それを明確にする必要があります。あなたの例では、それらは遭遇した順序で示されています。
追加された 著者 Weather Vane,
追加された 著者 LPs,

4 答え

The answer is from here

下記の関数で周波数配列をソートしてから、ソートされた配列の最後の3つの要素だけを取ります。

 void sort(int a[], int size)
 {
   for(int i=0; i<(size-1); i++) 
   {
    for(int o=0; o<(size-(i+1)); o++) 
       {
            if(a[o] > a[o+1]) 
            {
                int t = a[o];
                a[o] = a[o+1];
                a[o+1] = t;
            }
        }
    }

  }
1
追加された
返信いただきありがとうございます。頻度配列には、 storeKeys 配列の値の頻度が含まれています。リンクを参照して、リンク内のコードを実行してください。
追加された 著者 Sri Harsha,

The answer is from here

下記の関数で周波数配列をソートしてから、ソートされた配列の最後の3つの要素だけを取ります。

 void sort(int a[], int size)
 {
   for(int i=0; i<(size-1); i++) 
   {
    for(int o=0; o<(size-(i+1)); o++) 
       {
            if(a[o] > a[o+1]) 
            {
                int t = a[o];
                a[o] = a[o+1];
                a[o+1] = t;
            }
        }
    }

  }
1
追加された
返信いただきありがとうございます。頻度配列には、 storeKeys 配列の値の頻度が含まれています。リンクを参照して、リンク内のコードを実行してください。
追加された 著者 Sri Harsha,

私は答えを得ました!助けてくれてありがとう

for (int i = 0; i < 10; i++) //Loop to sort the storeKeys array according to freq array
{   
   if(freq[i]!=0 && storeKeys[i] != NULL){
    for (int j = i + 1; j < 10; j++)
    {
        if (freq[i] < freq[j])
        {
            a = freq[i];
            freq[i] = freq[j];
            freq[j] = a;
            b = storeKeys[i];
            storeKeys[i] = storeKeys[j];
            storeKeys[j] = b;
        }
    }
   }
}
for(int i=0;i<10;i++) {  
  if(storeKeys[i] != NULL && freq[i] != 0){
   //Serial.println(storeKeys[i]);
    while(c<3){
      mostPressed[c] = storeKeys[i];
      c=c+1;
      break;
    }
  }
  if(c==3){
    break;
  }
}

ここでは storeKeys 配列を頻度配列に従ってソートし、上位3つの結果を新しい配列に格納しました。私はそれを自分で手に入れました。助けてくれてありがとう!

0
追加された

私は答えを得ました!助けてくれてありがとう

for (int i = 0; i < 10; i++) //Loop to sort the storeKeys array according to freq array
{   
   if(freq[i]!=0 && storeKeys[i] != NULL){
    for (int j = i + 1; j < 10; j++)
    {
        if (freq[i] < freq[j])
        {
            a = freq[i];
            freq[i] = freq[j];
            freq[j] = a;
            b = storeKeys[i];
            storeKeys[i] = storeKeys[j];
            storeKeys[j] = b;
        }
    }
   }
}
for(int i=0;i<10;i++) {  
  if(storeKeys[i] != NULL && freq[i] != 0){
   //Serial.println(storeKeys[i]);
    while(c<3){
      mostPressed[c] = storeKeys[i];
      c=c+1;
      break;
    }
  }
  if(c==3){
    break;
  }
}

ここでは storeKeys 配列を頻度配列に従ってソートし、上位3つの結果を新しい配列に格納しました。私はそれを自分で手に入れました。助けてくれてありがとう!

0
追加された