Wrong Output in C

0

I'm doing an activity and the result is giving values that I do not assign anywhere in the code.

int main(){

int numeroDePessoas = 0, tarefa = 0;

scanf("%d %d", &tarefa, &numeroDePessoas);

float passageiros[numeroDePessoas][5];

for(int i = 0; i < numeroDePessoas; i++){
    int classe, idade, numIrmaos, numFilhos;
    char sexo, porto;

    scanf("%d %c %d %d %d %c", &classe, &sexo, &idade, &numIrmaos, &numFilhos, &porto);

    passageiros[i][0] = (float)classe;

    if(sexo == 'f'){
        passageiros[i][1] = 1.0;
    } else {
        passageiros[i][1] = 0.0;
    }

    passageiros[i][2] = (float)idade;

    passageiros[i][3] = (float)numIrmaos;

    passageiros[i][4] = (float)numFilhos;

    if(porto == 'S'){
        passageiros[i][5] = 0.0;
    } else if(porto == 'C'){
        passageiros[i][5] = 1.0;
    } else if(porto == 'Q'){
        passageiros[i][5] = 2.0;
    }

}

// a tarefa 1 imprime a informação em forma númerica de todos os passageiros
if(tarefa == 0){

    for(int rows = 0; rows < numeroDePessoas; rows++){
        for(int cols = 0; cols < 6; cols++){
            printf("%.1f ", passageiros[rows][cols]);

            if(cols == 5){
                printf("\n");
            }
        }
    }

// imprime se o passageiro morreu ou sobreviveu dependendo de sua idade, classe e sexo (elementos 2, 0 e 1 respectivamentes)
} else if(tarefa == 1){

    for(int rows = 0; rows < numeroDePessoas; rows++){
        if( (passageiros[rows][2] > 15 && passageiros[rows][2] <= 45 ) || (passageiros[rows][0] > 1 && passageiros[rows][1] == 1) ){
            printf("Morreu\n");
        } else {
            printf("Sobreviveu\n");
        }
    }

// imprime a média da informação dos passageiros
} else if(tarefa == 2){
    float mClasse = 0.0, mSexo = 0.0, mIdade = 0.0, mNumIrmaos = 0.0, mNumFilhos = 0.0, mPorto = 0.0;

    for(int rows = 0; rows < numeroDePessoas; rows++){
        for(int cols = 0; cols < 6; cols++){


            if(cols == 0){
                mClasse += passageiros[rows][cols];

            } else if(cols == 1){
                mSexo += passageiros[rows][cols]; 

            } else if(cols == 2){
                mIdade += passageiros[rows][cols]; 

            } else if(cols == 3){
                mNumIrmaos += passageiros[rows][cols];

            } else if(cols == 4){
                mNumFilhos += passageiros[rows][cols];

            } else if(cols == 5){
                mPorto += passageiros[rows][cols];
            }
        }
    }

    mClasse /= numeroDePessoas;
    mIdade /= numeroDePessoas;
    mNumIrmaos /= numeroDePessoas;
    mNumFilhos /= numeroDePessoas;
    mSexo /= numeroDePessoas;
    mPorto /= numeroDePessoas;

    printf("%.3f %.3f %.3f %.3f %.3f %.3f", mClasse, mSexo, mIdade, mNumIrmaos, mNumFilhos, mPorto);
}

return 0;

}

With the input:

0 3 3 m 22 1 0 S 1 f 38 1 1 C 3 f 26 0 0 S

It produces the output:

3.0 0.0 22.0 1.0 0.0 1.0 1.0 1.0 38.0 1.0 1.0 3.0 3.0 1.0 26.0 0.0 0.0 0.0

But the desired output would be:

3.0 0.0 22.0 1.0 0.0 0.0 1.0 1.0 38.0 1.0 1.0 1.0 3.0 1.0 26.0 0.0 0.0 0.0

I can not see where this 1.0, 3.0 and 0.0 comes from the index 5 elements of each array even running the program by debugger several times.

    
asked by anonymous 23.04.2018 / 02:10

1 answer

1

Greetings! The problem is in the following code snippet:

float passageiros[numeroDePessoas][5];

When you declare a size 5 Array, you should think that the count starts from 0. That is, you have a 5-position array that starts at zero. And a 5-position array that starts at zero goes to index 4.

Ex:

   passageiros[numeroDePessoas][0] = 2.0;  //São números aleatórios
   passageiros[numeroDePessoas][1] = 1.0;
   passageiros[numeroDePessoas][2] = 3.0;
   passageiros[numeroDePessoas][3] = 4.0;
   passageiros[numeroDePessoas][4] = 4.9;
   passageiros[numeroDePessoas][5] = 3.4; //ERRADO!!!!! ESSA JÁ É A POSIÇÃO 6!!

If you have a 5-position array and call its index number 5, the sixth element, you are probably the victim of the famous sandboxes that were already in that memory location. If you're lucky, your program will even work, as was the case.

Try this:

#include <stdio.h>


int main(){

int numeroDePessoas = 0, tarefa = 0;

scanf("%d %d", &tarefa, &numeroDePessoas);

float passageiros[numeroDePessoas][6]; //ALTEREI AQUI!!!

for(int i = 0; i < numeroDePessoas; i++){
    int classe, idade, numIrmaos, numFilhos;
    char sexo, porto;

    scanf("%d %c %d %d %d %c", &classe, &sexo, &idade, &numIrmaos, &numFilhos, &porto);

    passageiros[i][0] = (float)classe;

    if(sexo == 'f'){
        passageiros[i][1] = 1.0;
    } else {
        passageiros[i][1] = 0.0;
    }

    passageiros[i][2] = (float)idade;

    passageiros[i][3] = (float)numIrmaos;

    passageiros[i][4] = (float)numFilhos;

    if(porto == 'S'){
        passageiros[i][5] = 0.0;
    } else if(porto == 'C'){
        passageiros[i][5] = 1.0;
    } else if(porto == 'Q'){
        passageiros[i][5] = 2.0;
    }

}

// a tarefa 1 imprime a informação em forma númerica de todos os passageiros
if(tarefa == 0){

    for(int rows = 0; rows < numeroDePessoas; rows++){
        for(int cols = 0; cols < 6; cols++){
            printf("%.1f ", passageiros[rows][cols]);

            if(cols == 5){
                printf("\n");
            }
        }
    }

// imprime se o passageiro morreu ou sobreviveu dependendo de sua idade, classe e sexo (elementos 2, 0 e 1 respectivamentes)
} else if(tarefa == 1){

    for(int rows = 0; rows < numeroDePessoas; rows++){
        if( (passageiros[rows][2] > 15 && passageiros[rows][2] <= 45 ) || (passageiros[rows][0] > 1 && passageiros[rows][1] == 1) ){
            printf("Morreu\n");
        } else {
            printf("Sobreviveu\n");
        }
    }

// imprime a média da informação dos passageiros
} else if(tarefa == 2){
    float mClasse = 0.0, mSexo = 0.0, mIdade = 0.0, mNumIrmaos = 0.0, mNumFilhos = 0.0, mPorto = 0.0;

    for(int rows = 0; rows < numeroDePessoas; rows++){
        for(int cols = 0; cols < 6; cols++){


            if(cols == 0){
                mClasse += passageiros[rows][cols];

            } else if(cols == 1){
                mSexo += passageiros[rows][cols]; 

            } else if(cols == 2){
                mIdade += passageiros[rows][cols]; 

            } else if(cols == 3){
                mNumIrmaos += passageiros[rows][cols];

            } else if(cols == 4){
                mNumFilhos += passageiros[rows][cols];

            } else if(cols == 5){
                mPorto += passageiros[rows][cols];
            }
        }
    }

    mClasse /= numeroDePessoas;
    mIdade /= numeroDePessoas;
    mNumIrmaos /= numeroDePessoas;
    mNumFilhos /= numeroDePessoas;
    mSexo /= numeroDePessoas;
    mPorto /= numeroDePessoas;

    printf("%.3f %.3f %.3f %.3f %.3f %.3f", mClasse, mSexo, mIdade, mNumIrmaos, mNumFilhos, mPorto);
}

return 0;
} 
    
23.04.2018 / 04:46