我正在写一个函数来搜索一个数组,该数组存储了一些球员的得分,以寻找得分最高的球员。问题是,我可以搜索和记录的最高分数很容易,但它是当有多个分数,我的逻辑福尔斯appart。
我的代码附在下面:
/* Function display_highest_score() searches the player score array for the highest value and
any repetitions before printing the results to the screen.
Parameters: The player array, score array, and number of players.
Returns: Nothing.*/
void display_highest_score(char player_array[][STRING_LENGTH], int score_array[], int num_players) {
int high_num = 0; /* Stores the highest player score. */
int position[MAX_PLAYERS] = { 0 }; /* Stores the position of the player(s) with the highest score. */
int players = 1; /* Stores the number of players that have that score. */
int j = 0; /* A looping variable. */
/* Loop to find and store the highest scoring player(s). */
for (int i = 0; i < num_players; i++) {
if (high_num < score_array[i]) {
high_num = score_array[i];
position[j] = i;
j++;
}
else if (high_num == score_array[i]) {
players = players++;
}
}
/* Print to screen code. */
printf("\nPlayers with the highest score of %d are:\n\n", high_num);
for (j = 0; j < players; j++) {
printf("--> %s\n", player_array[position[j]]);
}
}
如果该函数正在搜索一个数组,比如score_array[10] = { 3, 1, 0, 10, 4, 8, 10, 0, 3, 16 }
,那么它会将最大得分改为16
,但它会将得分为10
的球员打印为16
。
我尝试将position[j] = i; j++;
段交换到else if
语句,但仍然不起作用
我对c语言还是比较陌生的,所以如果有任何帮助,我将不胜感激。
3条答案
按热度按时间r7s23pms1#
您需要在所有情况下添加当前位置,但在发现新的高分时清除先前存储的位置。此外,你应该将
players
初始化为0,以处理空集玩家的极端情况(在任何情况下,你都应该在最后的players==0
情况下打印一条错误消息):wpx232ag2#
你现在做的是为你看到的每一个新的高分添加一个位置索引。players变量只会在看到重复的高分时递增,但不会记录该players索引。
你需要做的是,如果看到一个新的高分(
high_num < score_array[i]
),那么你应该清除位置数组并将玩家数量重置为0,以清除以前检测到的高分并使用新值重新开始。如果在分配position[j] = i;
之前在if中设置j = 0
和players =1
,则应仅显示最高分数值。在else语句中,需要添加以便跟踪所有相同的高分。这时你不需要将玩家作为一个单独的变量,因为玩家总是等于j。
sgtfey8w3#
我强烈建议用不同的逻辑来处理这个问题。最简单的解决方案是使用一个循环来找到最高分,然后使用另一个循环来打印出每个得分的球员。类似于下面的伪代码:
如果您仍然想坚持使用现有的代码,我首先要查看的是
players
值,它存储了得分最高的玩家数量。我认为你应该设置为1每当你找到一个新的高分,然后递增它每当有一个平局,但你似乎跳过了第一部分,只有增加值时 * 有一个平局的高分 *。希望这能帮上忙。