Обновление полей в массиве структур - PullRequest
0 голосов
/ 18 марта 2020

В рамках этой программы мне поручено создать программу списка лидеров. К сожалению, только 4/6 основных функций работают как задумано, то есть функции fillplayer, addplayer и displaystats. Похоже, я не * gr9009 * логики c в обновлении оценок в структуре, а также сортировка их в порядке убывания.

С помощью функции updatescore, он только идентифицирует идентификатор первого Пользователь и обновляет свой счет, эта функция будет обрабатывать другие идентификаторы, как будто они никогда не существовали.

С помощью функции playerranking, она сортирует только оценки, но не соответствующие держатели указанного счета.

Что я делаю не так? Я довольно близок к завершению программы ...

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <math.h>

int number,i,key,newscore,a;
struct playerdata
{
  char init[3];
  int id,score;
}playerstats[6];


void welcome ();

void fillplayer()                                    //read player info//
{

    for(int i=0;i<5;i++)
    {
        printf("\nPlease enter your Initials (3 Letters).");
        scanf("%s", &playerstats[i].init);
        printf("\n Please enter your score");
        scanf("%d",&playerstats[i].score);
        playerstats[i].id = ( rand()%2000 ) + 1;
    }
    welcome();
}


void displaystats()                              //Output player info//
{
    printf("\nInitials\tID\t\tScore\t");
    for(int i=0;i<5;i++)
    {
        printf("\n%s\t\t%d\t\t%d",playerstats[i].init,playerstats[i].id,playerstats[i].score);

    }   
    printf("\n\n");
    welcome();
}

void addplayer()                                    //read one player's info//
{
        printf("\n(This may overwrite the player who is at the bottom of the Leaderboard.)" );
        printf("\n\nPlease enter your Initials (3 Letters).");
        scanf("%s", &playerstats[i+4].init);
        printf("\n Please enter your score");
        scanf("%d",&playerstats[i+4].score);
        playerstats[i+4].id = ( rand()%2000 ) + 1;
        welcome();


}

int searchplayer(void)
{
    for (i=0;i<5;i++)
    {
        printf("\nEnter your player ID");
         scanf("%d", &key);

              if (playerstats[i].id==key)
              {
                  return a;
              }
              else
              {
                return  -1;
              }
    }
}   

void updatescore() 
{
   for (i=0;i<5;i++)
   {

         a=searchplayer();
        if (playerstats[i].id==key)
        {
           printf ("\nYour ID is%d", playerstats[i].id);
           printf("\nEnter your new high score");
           scanf("%d",&newscore);
           if (newscore>playerstats[i].score)
           {
               playerstats[i].score=newscore;
               printf("Score successfully changed to %d", newscore);
           }
               else 
               {
                    printf("\nThis score is less than your current highscore, the high score shall not be changed");
               }
        }       

                else
                {
                printf("\nInvalid ID");
                }
                printf("\n\n");



    }   
    welcome(); 
}








void playerranking()
{
    int temp, swapped;
    while(1)
    {
        swapped=0;
        for (i=0; i<5-1; i++)
        {
             if(playerstats[i].score<playerstats[i+1].score)
             {
                 temp = playerstats[i].score;
                 playerstats[i].score = playerstats[i+1].score;
                 playerstats[i+1].score= temp;
                 swapped = 1;
             }
        }
        if(swapped==0)
        {
            break;
        }


    }
    printf("\n\n");
    displaystats();
    welcome();
}


void exitfunct()
{
    while(1)
    {
        break;
    }
}

void filltest()
{
    for(int i=0;i<2;i++)
    {
        printf("\n Please enter your Initials");
        scanf("%s",&playerstats[i].init);
        printf("\n Please enter your score");
        scanf("%d",&playerstats[i].score);
        playerstats[i].id = ( rand()%2000 ) + 1;
    }
    printf("\n\n");
    welcome();
}





void welcome()
{    
    printf("\nWelcome to the leaderboard, challenger!");
    printf("\nPlease select an option:");
    printf("\n1-Add 5 players at a time\n2-Display all stats\n3-Update score\n4-Show player ranking\n5-Add 1 player\n6-Exit Program");
    printf("\n\n");
    scanf("%d",&number);
    switch(number)
    {
        case 1:
        fillplayer();
        break;

        case 2:
        displaystats();
        break;

        case 3:
        updatescore();
        break;

        case 4:
        playerranking();
        break;

        case 5:
        addplayer();
        break;

        case 6:
        exitfunct();
        break;

        case 7:
        filltest();
        break;

        default:
        printf("\nThis option is invalid");

    }


}





int main()
{
    welcome();    
      return 0;
}

Ответы [ 2 ]

0 голосов
/ 18 марта 2020

Что касается updatescore function, проблема возникает из вашей searchplayer function, также когда вы искали, вы не должны снова использовать key в updatescore function. После поиска вам понадобится if-else in updatescore function:

for (i = 0; i < 5; i++)
    {

        int num = searchplayer();
        if (num == 1)
        {
         statement;
        }
        else
       {
        statement;
        }
}

, посмотрите:

int searchplayer(void)
{

printf("\nEnter your player ID");
    scanf("%d", &key);

    for (i = 0; i < 5; i++)
    {
        if (playerstats[i].id == key)
        {
            return 1;
        }
    }

        return  -1;
}

в вашем коде, если введен первый идентификатор игрока, вы введете if statement и вернуть 1, но, например, если вы введете идентификатор второго игрока, поскольку для i=0 это if (playerstats[i].id == key) неверно, функция всегда будет возвращать -1, и поэтому в вашем updatescore function вы всегда будете заканчиваться invalid id.

также вы должны поставить scanf("%d", &key); из l oop, потому что с одним ключом вы должны проверить if (playerstats[i].id == key), а не 5 ключей.

для вашей playerranking function

для сортировки struct вы должны сделать это вручную следующим образом:

void playerranking()
{
    char inittmp[3];
    int  idtmp;
    int temp, swapped;
    while (1)
    {
        swapped = 0;
        for (i = 0; i < 5 - 1; i++)
        {
            if (playerstats[i].score < playerstats[i + 1].score)
            {
                temp = playerstats[i].score;
                playerstats[i].score = playerstats[i + 1].score;
                playerstats[i + 1].score = temp;

                idtmp = playerstats[i].id;
                playerstats[i].id = playerstats[i + 1].id;
                playerstats[i + 1].id = idtmp;

                strcpy(inittmp , playerstats[i].init);
                strcpy(playerstats[i].init , playerstats[i + 1].init);
                strcpy(playerstats[i + 1].init , inittmp);
                swapped = 1;
            }
        }
        if (swapped == 0)
        {
            break;
        }


    }
    printf("\n\n");
    displaystats();
    welcome();
}

с сортировкой одного члена struct, это не будет автоматически сортировать других участников, вы должны сделать это самостоятельно.

0 голосов
/ 18 марта 2020

Вам следует избегать использования глобальных переменных типа key. Передайте его как параметр: void updatescore(int key) {...}. После исправления searchplayer() используйте его для получения передаваемого параметра.

const int NUM_PLAYERS = 5;

int searchplayer(void)
{
    int key;
    printf("\nEnter your player ID");
    if (1 == scanf("%d", &key)) {
        for (int i = 0; i < NUM_PLAYERS; i++) {
            if (playerstats[i].id == key) {
                return i;
            }
         }
         printf("Player ID not found: %d\n", key);
     }
     else {
         puts("Invalid entry.")
     }
     return -1;
}

void updatescore(int key) 
{
    if (key < 0 || key >= NUM_PLAYERS) return;

    int newscore;
    printf ("\nYour ID is %d", playerstats[key].id);
    printf("\nEnter your new high score");
    if (1 == scanf("%d",&newscore) {
        if (newscore > playerstats[key].score) {
            playerstats[key].score = newscore;
            printf("Score successfully changed to %d", newscore);
        }
        else  {
            printf("\nThis score is less than your current highscore, the high score shall not be changed");
        }
    }
    else {
        puts("Invalid entry.")
    }
}

void welcome()
{    
    // Code removed for brevity
        case 3:
        updatescore(searchplayer());
        break;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...