Object orientation and meaningless values in c++

Asked

Viewed 70 times

1

Hello, I’m starting programming in c++ and I decided to do a struct to learn and such... except that the compiler shows no error and at the end the program shows me a completely meaningless value,I mean, while the expected value for "maiorprec" is 7 the program shows me 1878038440. I wanted the help of some charitable soul because I was banging my head for a long time and I couldn’t find the reason.

#include<iostream>
#include<cstdlib>
using namespace std;

struct Apart{
    int preco;     // variáveis utilizadas no código
    string nome;
    string local;
    int quartos;
    int area;
    float pedireito;
    bool mobilhado;
    int tamprec,tamnome,tamarea;  // aramazenam o numero de algarismos (ou letras) de preco nome e local

    void insere(int precoin,string nomein,string localin,int quartosin,int areain,float pedireitoin,bool mobilhadoin){
        precoin=preco;
        nomein=nome;
        localin=local;
        quartosin=quartos;     // função utilizada para armazenar os valores mais facilmente
        areain=area;
        pedireitoin=pedireito;
        mobilhadoin=mobilhado;
    }

    void tamanho(){
    while(preco){
        preco=preco/10;
        tamprec++;
     }                        // conseguindo e aramazenando o numero de algarismos em tamprec tamarea e tamnome

     while(area){
        area=area/10;
        tamarea++;
     }
     while(nome[tamnome]!='/0'){
        tamnome++;
     }

   }
};

int main(){
    int qtap=5; //quantidade de aparttamentos
    Apart ap[qtap];
    ap[0].insere(1000000,"tremenda","goiania",3,300,3.5,1);
    ap[1].insere(2000000,"rosas","sao paulo",4,500,4,0);
    ap[2].insere(150000,"tricola","fortaleza",2,275,2,1);    // inserindo os valores
    ap[3].insere(300000,"art4","palmas",4,290,2.5,0);
    ap[4].insere(40000,"aurelia","rio de janeiro",1,100,2,1);
    for(int i;i<qtap;i++){ap[i].tamanho();}  // chamando a funçao tamanho para cada objeto


    int maioprec=ap[0].tamprec;
    int maioarea=ap[0].tamarea;
    int maionome=ap[0].tamnome;

    for(int i=1;i<qtap;i++){          // comparando os valores de tamprec e imprimindo o maior deles
    if(maioprec<ap[i].tamprec){
        maioprec=ap[i].tamprec;
        }
    }
    cout<<maioprec;  // porém eu acabo com um valor completamente sem sentido, alguém sabe o por quê?
}

NOTE: I used dev-c++ and code Blocks (nsei, maybe it has something to do)

1 answer

2


Lucas, the mistake you are making is to start the attributes of your structure.

Note that instead of starting attributes like preco, nome and local, you are reassigning the function arguments (precoin, nomein, localin) with the uninitiated values of its structure.

Another thing: although it "works", the way you calculate the sizes of the price, area and name is terrible, because you are not starting these values with 0, you are changing the values of preco and area during the process, and these values are only calculated if you remember to invoke the method tamanho, which is counterintuitive and makes your code error-prone.

Ideally you should use methods to calculate these values, so it doesn’t matter when the values of preco, nome and area are changed, the size of these values will always match the value of the attribute, as such size is calculated at the time you search for it in your structure.

So, fixing the "builder" of its structure:

void insere(int precoin, string nomein, string localin, int quartosin, int areain, float pedireitoin, bool mobilhadoin) {
    preco = precoin;
    nome = nomein;
    local = localin;
    quartos = quartosin;
    area = areain;
    pedireito = pedireitoin;
    mobilhado = mobilhadoin;
}

And working out how to calculate attribute size:

int tamprec() {
    return to_string(preco).length();
}

int tamarea() {
    return to_string(area).length();
}

int tamnome() {
    return nome.length();
}

You would have the complete code working correctly:

#include<iostream>
#include<cstdlib>
using namespace std;

struct Apart {
    // atributos utilizadas no código
    int preco;
    string nome;
    string local;
    int quartos;
    int area;
    float pedireito;
    bool mobilhado;

    // função utilizada para armazenar os valores mais facilmente
    void insere(int precoin, string nomein, string localin, int quartosin, int areain, float pedireitoin, bool mobilhadoin) {
        preco = precoin;
        nome = nomein;
        local = localin;
        quartos = quartosin;
        area = areain;
        pedireito = pedireitoin;
        mobilhado = mobilhadoin;
    }

    int tamprec() {
        return to_string(preco).length();
    }

    int tamarea() {
        return to_string(area).length();
    }

    int tamnome() {
        return nome.length();
    }
};

int main() {
    //quantidade de apartamentos
    int qtap = 5;
    Apart ap[qtap];

    // inserindo os valores
    ap[0].insere(1000000, "tremenda", "goiania",        3, 300, 3.5, 1);
    ap[1].insere(2000000, "rosas",    "sao paulo",      4, 500, 4,   0);
    ap[2].insere(150000,  "tricola",  "fortaleza",      2, 275, 2,   1);
    ap[3].insere(300000,  "art4",     "palmas",         4, 290, 2.5, 0);
    ap[4].insere(40000,   "aurelia",  "rio de janeiro", 1, 100, 2,   1);

    int maioprec = ap[0].tamprec();
    int maioarea = ap[0].tamarea();
    int maionome = ap[0].tamnome();

    // comparando os valores de tamprec e imprimindo o maior deles
    for (int i = 1; i < qtap; i++) {
        if (maioprec < ap[i].tamprec()) {
            maioprec = ap[i].tamprec();
        }
    }

    cout << maioprec;
}

Browser other questions tagged

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