我整天都在苦苦挣扎,我得到的输出都是正确的,除了中间结果。如果有人能帮助我,那就太好了。我得到的输出是id [A]而不是id [C],似乎在循环中A的ID被带到C。
int firstA=0, firstS=0, secondS=0, firstC=0, secondC=0;
for (row=0; row<totalSize; row++) {
if (category[row]=='A' && ranking[firstA] < ranking[row]) {
firstA = row;
}
if (category[row]=='C' && ranking[firstC] < ranking[row]) {
secondC = firstC;
firstC = row;
}
else if (category[row]=='C' && ranking[secondC] < ranking[row]) {
secondC = row;
}
if (category[row]=='S' && ranking[firstS] < ranking[row]) {
secondS = firstS;
firstS = row;
}
else if (category[row]=='S' && ranking[secondS] < ranking[row]) {
secondS = row;
}
}
printf("A : %d %.2lf \n", id[firstA], ranking[firstA]);
printf("C : %d %.2lf \n", id[firstC], ranking[firstC]);
printf("C : %d %.2lf \n", id[secondC], ranking[secondC]);
printf("S : %d %.2lf \n", id[firstS], ranking[firstS]);
printf("S : %d %.2lf \n", id[secondS], ranking[secondS]);
return 0;
}
输入文件
10
14 A 447 252 68 34 978
2 C 230 299 597 180 9
27 A 318 220 97 28 1317
32 C 563 450 547 112 28
8 C 669 260 200 36 171
11 S 179 45 1342 732 174
19 S 74 249 861 1165 6
21 A 757 240 97 119 2032
15 S 275 177 588 577 52
6 C 886 401 327 109 48
预期输出
A: 21 1171.00
C: 6 696.70
C: 32 578.00
S: 11 1094.20
S: 19 1046.50
问题出在这里,我明白了
A : 21 1171.00
C : 6 696.70
C : 14 601.10
S : 11 1094.20
S : 19 1046.50
中间C携带其中一个A的ID。我似乎无法弄清楚我的循环中有什么不对。任何帮助将不胜感激!
答案 0 :(得分:1)
将secondS初始化为第0行,即类别“A”。该行的排名小于预期的secondS行,因此secondS保持为0.您需要做一些事情,以便始终将初始值分配给正确的类别,如此
int firstA=-1, firstS=-1, secondS=-1, firstC=-1, secondC=-1;
for (row=0; row<totalSize; row++) {
if (category[row]=='A' && (firstA == -1 || ranking[firstA] < ranking[row])) {
firstA = row;
}
if (category[row]=='C' && (firstC == -1 || ranking[firstC] < ranking[row])) {
secondC = firstC;
firstC = row;
}
else if (category[row]=='C' && (secondC == -1 || ranking[secondC] < ranking[row])) {
secondC = row;
}
if (category[row]=='S' && (firstS == -1 || ranking[firstS] < ranking[row])) {
secondS = firstS;
firstS = row;
}
else if (category[row]=='S' && (secondS == -1 || ranking[secondS] < ranking[row])) {
secondS = row;
}
}
由于所有初始索引均为-1,因此只要您看到相应类别的行,就会分配它们。将索引初始化为-1可能很危险,但这是安全的,因为C应该在看到条件语句时停止评估条件语句。 firstA == -1,由于短路评估,永远不会评估排名[-1]。