Почему мои переменные не рассчитываются должным образом? - PullRequest
0 голосов
/ 17 февраля 2019

Я делаю простую программу для класса, чтобы можно было узнать нового мэра / президента на основе системы избирательных колледжей. Вход в мой массив и последующий вывод таблицы результатов работают отлично, но...Мои переменные aStatesWon, bStatesWon, cStatesWon и dStatesWon (для кандидатов A, B, C и D соответственно) не рассчитываются должным образом, хотя я думал, что они правильно их вычислили.Я получаю цифры, похожие на -2324252 или 62341, а не на 2 или 3, как я ожидаю.Вот код:

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

#define STATES 5
#define CANDIDATES 4


void declareNewMayor(int aStatesWon,int bStatesWon,int cStatesWon, int dStatesWon);

void main() {

    int votes[STATES][CANDIDATES];
    int StateWon = -1;
    int StateWinner;
    int aStatesWon = 0;
    int bStatesWon = 0;
    int cStatesWon = 0;
    int dStatesWon = 0;
    int newMayor;

    FILE* open;

    int i,j;


    for (i = 0; i < STATES; i++)
    {
        StateWinner = 0;
        StateWon = -1;

        for (j = 0; j < CANDIDATES; j++)
        {
            printf("Please enter the votes for candidate %d for state %d\n",(j+1),(i + 1));
            scanf("%d",&votes[i][j]);
            if (votes[i][j] > StateWon)
            {
                StateWon = votes[i][j];
                StateWinner = j;
            } //see if the won that state
        }
        printf("Winner of State %d is Candidate %d\n",i,j);
        if (StateWinner = 0)
        {
            aStatesWon++;
        }
        else if (StateWinner = 1)
        {
            bStatesWon++;
        }
        else if (StateWinner = 2)
        {
            cStatesWon++;

        }
        else if (StateWinner = 3)
        {
            dStatesWon++;

        }//increase number of states won by that candidate if the won that state

        printf("States Won  A:%d  B:%d   C:%d   D:%d", aStatesWon, bStatesWon, cStatesWon, dStatesWon);

    }//enter in votes for each candidate for each state
    open = fopen("votes.txt", "w");
    if (open == NULL)
    {
        printf("\nFile could not be opened\n");
    }
    else
    {

        printf("STATES CANDIDATE A    CANDIDATE B    CANDIDATE C    CANDIDATE D\n");
        fprintf(open,"STATES CANDIDATE A    CANDIDATE B    CANDIDATE C    CANDIDATE D\n");
        for (i = 0; i < STATES; i++)
        {
            printf("STATE %d", (i + 1));
            fprintf(open,"STATE %d", (i + 1));

            for (j = 0; j < CANDIDATES; j++)
            {
                printf("          %d       ", votes[i][j]);
                fprintf(open,"          %d       ", votes[i][j]);
            }
            printf("\n");




        }//print out table
    }

    declareNewMayor(aStatesWon,bStatesWon,cStatesWon,dStatesWon);





}//main
void declareNewMayor(int aStatesWon, int bStatesWon, int cStatesWon, int dStatesWon)
{

    char winner;
    int statesWon;

    if (aStatesWon > bStatesWon&&aStatesWon > cStatesWon&&aStatesWon > dStatesWon)
    {

        statesWon = aStatesWon;
        winner = "A";
    }
    else if (bStatesWon > aStatesWon&&bStatesWon > cStatesWon&&bStatesWon > dStatesWon) {


        statesWon = bStatesWon;
        winner = "B";
    }
    else if (cStatesWon > aStatesWon&&cStatesWon > bStatesWon&&cStatesWon > dStatesWon) {


        statesWon = cStatesWon;
        winner = "C";
    }
    else if (dStatesWon > aStatesWon&&dStatesWon > cStatesWon&&dStatesWon > aStatesWon) {


        statesWon = dStatesWon;
        winner = "C";
    }


    printf("The new Mayor is candiate %c with %d states won!", winner,statesWon);



}//calculate new mayor and declare it

1 Ответ

0 голосов
/ 17 февраля 2019

В вашей функции есть некоторая логическая ошибка declareNewMayor.

1> Вы присвоили строковый литерал символовой переменной winner.Это приведет к неопределенному поведению

 winner = "A";
 winner = "B";
 winner = "C";

Поэтому его следует заменить на:

 winner = 'A';
 winner = 'B';
 winner = 'B';

2> if ... else в функции declareNewMayor.Вы не проверяете другие случаи.Например: aStatesWon == bStatesWon == cStatesWon == dStatesWon.Как результат в этом случае?если вас не волнуют другие случаи, вы можете инициализировать 2 переменные winner, statesWon с некоторым значением, которое позволяет избежать неопределенного поведения с неинициализированной переменной (именно поэтому ваши выходные данные странны с -2324252 или 62341).Вот мое решение

void declareNewMayor(int aStatesWon, int bStatesWon, int cStatesWon, int dStatesWon)
{

char winner = '?';
int statesWon = 0;

if (aStatesWon > bStatesWon&&aStatesWon > cStatesWon&&aStatesWon > dStatesWon)
{

    statesWon = aStatesWon;
    winner = 'A';
}
else if (bStatesWon > aStatesWon&&bStatesWon > cStatesWon&&bStatesWon > dStatesWon) {


    statesWon = bStatesWon;
    winner = 'B';
}
else if (cStatesWon > aStatesWon&&cStatesWon > bStatesWon&&cStatesWon > dStatesWon) {


    statesWon = cStatesWon;
    winner = 'C';
}
else if (dStatesWon > aStatesWon&&dStatesWon > cStatesWon&&dStatesWon > aStatesWon) {


    statesWon = dStatesWon;
    winner = 'D';
}


printf("The new Mayor is candiate %c with %d states won!", winner,statesWon);



}//calculate new mayor and declare it
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...