Wrong output in C

Asked

Viewed 57 times

0

I’m doing an activity and the result is giving some values that I don’t 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’t see where this 1.0, 3.0 and 0.0 comes from the index 5 elements of each array even running the program by the Debugger several times.

  • 1

    I could raise the question ?

1 answer

1


Greetings! The problem is in the following code snippet:

float passageiros[numeroDePessoas][5];

When you declare an Array of size 5, you should think that the count starts from 0. That is, you have an array of 5 positions, which starts at zero. And an array of 5 positions that starts at zero, goes up 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 an array of 5 positions and call its index number 5, the sixth element, you are probably the victim of the famous junk that were already in that memory position. If you are lucky, your program will even work, as was the case.

Try running this one:

#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;
} 
  • Ah, it was clear now kkkk, thanks for the clarification, now I managed to resolve! In this case then the/Compiler system played whatever value it found to supply this "sixth" index?

  • I consider C a somewhat unpredictable language. Depending on the compiler you were using, or even the IDE, this code of yours would have the expected output. What happens is, when you use a memory position that you haven’t previously stated, you’re dealing directly with junk (unpredictable) that was already there. Or even stealing a memory space from a variable in another program. In this of data input and output, a lot of things get in the way. In a way, what happened is what you said. He threw whatever value he found along the way.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.