我有一个数组,其输入由用户使用键盘给出。所有输入都存储在名为 storeKeys 的数组中。数组的索引由变量 storeKeysIndex 保持初始化为0,当按下某个键时,按下的键的值存储在 storeKeys 数组中,并且值为 storeKeysIndex 会增加。让 storeKeys 具有值
storeKeys = {3,2,5,7,1,1,9,9,9,1,3,1};
我希望lcd显示数组中前三个重复的元素。在上面的数组中,lcd应显示1,9,3,因为值' 1'在上面的数组中重复四次,' 9'重复三次,' 3'重复两次。 lcd不应显示其他值。
我尝试计算每个元素的频率并将频率存储在数组 freq 中。我可以在串行监视器中显示每个元素的频率。但是我没有得到如何在lcd(或串行监视器)中显示前三个重复数字。这是代码:
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("==========");
}
}
以上代码有效,但显示所有元素的频率。我想只显示前三个重复的元素。
以下是模拟器在线的链接:
https://circuits.io/circuits/5073094-the-unnamed-circuit/edit
感谢。
答案 0 :(得分:1)
答案来自here
使用以下函数对频率数组进行排序,然后仅获取已排序数组的最后三个元素。
func calcNewVal(startVal: Float, changerStartVal: Float) -> Float {
let remainingStartVals = globalTotal - changerStartVal
let remainingNewVals = globalTotal - changer.value
let endVal = ((startVal * (100 / remainingStartVals)) / 100) * remainingNewVals
return endVal
}
答案 1 :(得分: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 数组进行了排序,并将前三个结果存储在一个新数组中。我自己拿到了。谢谢你的帮助!