C语言 搜索游戏中得分最高的玩家的功能出现逻辑错误

vqlkdk9b  于 2023-06-21  发布在  其他
关注(0)|答案(3)|浏览(114)

我正在写一个函数来搜索一个数组,该数组存储了一些球员的得分,以寻找得分最高的球员。问题是,我可以搜索和记录的最高分数很容易,但它是当有多个分数,我的逻辑福尔斯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语言还是比较陌生的,所以如果有任何帮助,我将不胜感激。

r7s23pms

r7s23pms1#

您需要在所有情况下添加当前位置,但在发现新的高分时清除先前存储的位置。此外,你应该将players初始化为0,以处理空集玩家的极端情况(在任何情况下,你都应该在最后的players==0情况下打印一条错误消息):

int players = 0;

...
    if (high_num <= score_array[i]) {
        if (high_num < score_array[i]) {
             high_num = score_array[i];
             players = 0;
        }
        position[players++] = i;
    }
...
wpx232ag

wpx232ag2#

你现在做的是为你看到的每一个新的高分添加一个位置索引。players变量只会在看到重复的高分时递增,但不会记录该players索引。
你需要做的是,如果看到一个新的高分(high_num < score_array[i]),那么你应该清除位置数组并将玩家数量重置为0,以清除以前检测到的高分并使用新值重新开始。如果在分配position[j] = i;之前在if中设置j = 0players =1,则应仅显示最高分数值。在else语句中,需要添加

position[j] = i;
j++

以便跟踪所有相同的高分。这时你不需要将玩家作为一个单独的变量,因为玩家总是等于j。

sgtfey8w

sgtfey8w3#

我强烈建议用不同的逻辑来处理这个问题。最简单的解决方案是使用一个循环来找到最高分,然后使用另一个循环来打印出每个得分的球员。类似于下面的伪代码:

for (list of scores):
     if score is new high score:
          store new high score

for (list of players):
     if player has high score:
          print player

如果您仍然想坚持使用现有的代码,我首先要查看的是players值,它存储了得分最高的玩家数量。我认为你应该设置为1每当你找到一个新的高分,然后递增它每当有一个平局,但你似乎跳过了第一部分,只有增加值时 * 有一个平局的高分 *。
希望这能帮上忙。

相关问题