Ir ao conteúdo
  • Cadastre-se
flee

C++ problema com vector em c++

Posts recomendados

Boa noite pessoal, 

 

sou novo aqui e recentemente comecei a estudar sobre POO, atualmente estou com um problema no código abaixo, no exercicio eu devo criar uma classe "Aluno" com seus atributos e métodos, outra classe chamado "turma" onde deve ser possivel acrescentar um aluno em um vector e outra classe "grade curricular", onde devo ter um vector para incluir uma turma. Porém, percebi que a funcionalidade de incluir um aluno na turma não está funcionando, acredito que seja algum erro de logica, mas nao consigo encontrar. 

 

Agradeço desde já pela atenção.

Codigo: 

#include <iostream>
#include <string>
#include <vector>
#include <iterator>
#include <algorithm>
using namespace std;


class Aluno{
    private:
        string nome;
        string matricula;
        int periodo;
        int idade;
        
        
    public:
        Aluno(string nome, string matricula, int periodo, int idade){
            this->nome = nome;
            this->matricula = matricula;
            this->periodo = periodo;
            this->idade = idade;

        }
        Aluno(){
        }
        ~Aluno(){

        }
        void setnome(string nome){
             nome = nome;
        }
        string getnome(){
             return this->nome;
        }

        void setmatri(string matricula){
             matricula = matricula;
        }
        string getmatri(){
             return this->matricula;
        }
        void setperiodo(int periodo){
             periodo = periodo;
        }
        int getperiodo(){
             return this->periodo; 
        }
        void setidade(int idade){
             idade = idade;
        }
        int getidade(){
             return this->idade; 
        }

         

    

};

class Turma{
    private:
    string nomeT;
    string codigo;
    vector<Aluno*>v_aluno;

    public:
        Turma(){

        }
        Turma(string nomeT, string codigo, vector<Aluno*> v_aluno){
            this->nomeT = nomeT;
            this->codigo = codigo;
            this->v_aluno = v_aluno;
        }
        ~Turma(){}
        
        string getNomeT(){
            return this->nomeT;
        }
        string getCodigo(){
            return this->codigo;
        }
        vector <Aluno*> getV_aluno(){
            return this->v_aluno;
        }

        void novoAluno(){
            string nome,  matricula;
            int periodo, idade;
            bool AlunoExiste = false;
            vector<Aluno*> v_aluno;// vetor do tipo da classe Aluno
            cout << "Digite o nome: "<< endl;
            getline(cin, nome);
            cout << "Digite a matricula: "<< endl;
            getline(cin, matricula);
            cout << "Digite o periodo: "<< endl;
            cin >> periodo;
            cout << "Digite a idade: "<< endl;
            cin >> idade;

            Aluno *novoalu= new Aluno(nome, matricula, periodo, idade);
            for (Aluno *it : v_aluno){
                
                if(it->getnome() == novoalu->getnome()){
                    cout << "Aluno ja cadastrado" << endl;
                    AlunoExiste = true;
                }
            }

            if (!AlunoExiste)
            {
                    v_aluno.push_back(novoalu);
                    cout <<"Aluno cadastrado com sucesso " <<endl;
            }
    }

};
class GradeCurricular{
    private:
        vector<Turma*> v_turma;

    public:
        GradeCurricular(vector<Turma*> v_turma){//construtor parametrizado
            this->v_turma = v_turma;
        }
        GradeCurricular(){}//construtor padrão

        ~GradeCurricular(){}// descontrutor 

        void addTurma(){
            string nomeT;
            string codigo;
            vector<Aluno*> v_aluno;
            vector<Turma*> v_turma;
            bool turmaexiste = false;

            cout << "Digite o nome da turma\n" << endl;
            getline(cin, nomeT);
            cout << "Digite o codigo da turma\n" << endl;
            getline(cin, codigo);
            Turma *novaTurma = new Turma(nomeT, codigo, v_aluno);
            for(Turma *it : v_turma){
                if(it->getNomeT() == novaTurma->getNomeT()){
                    cout << "Turma ja existente \n"<< endl;
                    turmaexiste = true;
                }
            }
            if(!turmaexiste){
                v_turma.push_back(novaTurma);
                cout << "Turma criada com sucesso !\n"<< endl; 
            }

        }
        void addAluno(){
            string nomeT;
            string codigo;
            vector<Aluno*> v_aluno;
            vector<Turma*> v_turma;
            bool turmaExiste = true;

            cout << "Digite o nome da turma que deseja adicionar o aluno\n" << endl;
            getline(cin, nomeT);
            cout << "Digite o codigo da turma que deseja adicionar o aluno\n" << endl;
            getline(cin, codigo);
            Turma *novaT = new Turma(nomeT, codigo, v_aluno);
            for(Turma *it : v_turma){
                cout << "entrou no for" << endl;
                if(it->getNomeT() == novaT->getNomeT()){
                    cout << "Turma encontrada\n"<< endl;
                    turmaExiste = false;
                }
            }
            if(!turmaExiste){
                cout << "teste" << endl;
                novaT->novoAluno();

            }


        }

};

int main(){
    int op=5;
    GradeCurricular materia; //objeto da classe grade curricular
    
    
    
    while(op !=0){
        cout << "Digite 1 para adicionar uma nova turma a grade curricular \n"<< endl;

        cout << "Digite 2 para adicionar um aluno a uma turma \n"<< endl;  
        cin >> op;
        if(op == 1){
            materia.addTurma();
        }
        if(op == 2){
            materia.addAluno();
        }
        if(op == 0){
            break;
        }

}


    return 0;
        
}

 


 

Compartilhar este post


Link para o post
Compartilhar em outros sites

@flee Olá. Ao que parece a lógica que você está usando não está ok com respeito a chamada dos métodos e o que cada método faz exatamanete

Só dei uma revisada no código para fazer o mesmo rodar. As partes que tirei é por não ter conseguido ajustar:
 

#include <iostream>
#include <string>
#include <vector>
using namespace std;


class Aluno {
private:
    string nome;
    string matricula;
    int periodo;
    int idade;


public:
    Aluno(string nome, string matricula, int periodo, int idade) {
        this->nome = nome;
        this->matricula = matricula;
        this->periodo = periodo;
        this->idade = idade;
    }
    Aluno() {
    }
    ~Aluno() {

    }
    void setnome(string nome) {
        nome = nome;
    }
    string getnome() {
        return this->nome;
    }

    void setmatri(string matricula) {
        matricula = matricula;
    }
    string getmatri() {
        return this->matricula;
    }
    void setperiodo(int periodo) {
        periodo = periodo;
    }
    int getperiodo() {
        return this->periodo;
    }
    void setidade(int idade) {
        idade = idade;
    }
    int getidade() {
        return this->idade;
    }
};

class Turma {

private:
    string nomeT;
    string codigo;
    vector<Aluno*> v_aluno;

public:
    Turma() {

    }
    Turma(string nomeT, string codigo, vector<Aluno*> v_aluno) {
        this->nomeT = nomeT;
        this->codigo = codigo;
        this->v_aluno = v_aluno;
    }
    ~Turma() {}

    string getNomeT() {
        return this->nomeT;
    }
    string getCodigo() {
        return this->codigo;
    }
    vector <Aluno*> getV_aluno() {
        return this->v_aluno;
    }

    void novoAluno() {
        string nome,  matricula;
        int periodo, idade;
        bool AlunoExiste = false;
        vector<Aluno*> v_aluno;// vetor do tipo da classe Aluno
        cout << "Digite o nome: "<< endl;
        getline(cin, nome);
        cout << "Digite a matricula: "<< endl;
        getline(cin, matricula);
        cout << "Digite o periodo: "<< endl;
        cin >> periodo;
        cout << "Digite a idade: "<< endl;
        cin >> idade;

        v_aluno.push_back(new Aluno(nome, matricula, periodo, idade)); // adiciona o aluno ao vetor de alunos
    }
};


class GradeCurricular {
private:
    vector<Turma*> v_turma;
    vector<Aluno*> v_aluno;

public:
    GradeCurricular(vector<Turma*> v_turma) { //construtor parametrizado
        this->v_turma = v_turma;
    }
    GradeCurricular() {} //construtor padrão

    ~GradeCurricular() {} // descontrutor

    void addTurma() {
        string nomeT;
        string codigo;
        bool turmaexiste = false;

        cout << "Digite o nome da turma: ";
        getline(cin, nomeT);

        cout << "Digite o codigo da turma: ";
        getline(cin, codigo);


        v_turma.push_back(new Turma(nomeT, codigo, v_aluno)); // aqui adiciona uma turma ao vetor Turma...
    }

    void addAluno() {
        string nomeT;
        string codigo;
        bool turmaExiste = true;

        cout << "Digite o nome da turma que deseja adicionar o aluno\n" << endl;
        getline(cin, nomeT);

        cout << "Digite o codigo da turma que deseja adicionar o aluno\n" << endl;
        getline(cin, codigo);

        v_turma.push_back(new Turma(nomeT, codigo, v_aluno)); //... aqui adiciona novamente uma turma (!/?)
    }

};

int main() {

    // aqui é ajustar a lógica para a chamada dos métodos

    return 0;

}

Roda o código e faz os ajustes que achar necessário (claro)

Vejo que planejar melhor o seu projeto seria uma ótima coisa a se fazer

 

Qualquer dúvida é só perguntar, ok?

Compartilhar este post


Link para o post
Compartilhar em outros sites

@r_Tray Muito obrigado pela resposta, eu notei que a parte que você tirou do código foi o "for" usando "iterator", como nesse caso:

for(Turma *it : v_turma){
                if(it->getNomeT() == novaTurma->getNomeT()){
                    cout << "Turma ja existente \n"<< endl;
                    turmaexiste = true;
                }
            }

essa parte no código deve ser usado para percorrer o vector e procurar se ja existe alguma turma ou aluno com esse nome, caso exista, o programa nao deve adicionar ao vector e exibir uma mensagem dizendo que o aluno ou turma ja esta cadastrado, entende? pode ser usado com outra sintaxe também, porém quando uso outra sintaxe da erro e nao compila. 

 

Já no caso do main, eu nao entendi muito bem... você acha que é melhor eu usar o switch para capturar a opção do usuario e criar o loop?

obrigado novamente.

Compartilhar este post


Link para o post
Compartilhar em outros sites
void addAluno(){
            string nomeT;
            string codigo;
            vector<Aluno*> v_aluno;
            vector<Turma*> v_turma;            
(...)
 void addTurma(){
            string nomeT;
            string codigo;
            vector<Aluno*> v_aluno;
            vector<Turma*> v_turma

Esses vetores que você declarou são locais, só existem dentro do método. Após o fim do método, eles são deletados da memória. Bote eles como membros da class. você inclusive faz isso com o v_turma, mas declara novamente dentro do método, o que está errado.

 

OBS.: Lembre-se que C++ não tem garbage collection ok? Para cada "new" você tem que chamar o "delete" correspondente, caso contrário você enche a memória. 

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@flee Olá. A questão principal em seu código é justamente o que o @Flávio Pedroza mencionou

Para esse projeto, você só precisa de uma vetor de turmas e outro de alunos

Em cada turma criada você insere um vetor de alunos para essa turma (que são os alunos dessa turma) para depois inserir na grade curricular essa turma

Inclusive fiquei de editar o código mas não deu tempo

Os vetores turma e aluno devem ser atributos da classe e só devem ser criados uma vez cada um

 

Creio que um loop seria interessante, pois assim, você deixa a critério do usuário definir a quantidade de turmas e a quantidade de alunos para cada turma

 

Quanto a usar o for normalmente poderia ser isso:

for (int i = 0; i < v_aluno.size(); i++) {
    if (v_aluno.at(i)->get_nome() == nome) { // ou v_aluno[i]->get_nome() == nome
        cout << "Aluno ja cadastrado" << endl;
        AlunoExiste = true;
    }
}

if (!AlunoExiste) {
    v_aluno.push_back(new Aluno(nome, matricula, periodo, idade));
    cout << "Aluno cadastrado com sucesso!" << endl;
}                

Caso tiver problemas com a sujeira do buffer use o método ignore():

cout << "Digite o nome: ";
getline(cin, nome);
cin.ignore(); // exemplo

Mas isso apenas quando for necessário

 

E também tem a questão de que em C++, ao criarmos um objeto, fica de nossa responsabilidade liberar esse objeto da memória com o comando delete, tal como o @Flávio Pedroza comentou

Ex:

Aluno *aluno = new Aluno();
    
//...
    
delete aluno; // depois de fazer uso desse objeto libera o mesmo da memória

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

GRÁTIS: minicurso “Como ganhar dinheiro montando computadores”

Gabriel TorresGabriel Torres, fundador e editor executivo do Clube do Hardware, acaba de lançar um minicurso totalmente gratuito: "Como ganhar dinheiro montando computadores".

Você aprenderá sobre o quanto pode ganhar, como cobrar, como lidar com a concorrência, como se tornar um profissional altamente qualificado e muito mais!

Inscreva-se agora!