Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

FabricioAC

Apagar informações de um vetor que esta em outra classe C++

Recommended Posts

Olá, sou novo aqui no fórum e tenho uma duvida em relação a classes em C++, espero que alguém possa me ajudar. Desde já obrigado!

 

Estou desenvolvendo um trabalho pra faculdade em que preciso cadastrar alunos, disciplinas e notas e no final exibir alguns relatórios, tudo isso usando o conceito de classes e orientação a objetos. O programa esta 99% pronto só encontrei problemas para implementar o seguinte:

 

Tenho 6 classes implementadas (Não vou postar o codigo da Disciplina pois não vem ao caso):

 

Alunos

#ifndef ALUNOS_HPP_INCLUDED
#define ALUNOS_HPP_INCLUDED

#include "Bibliotecas.hpp"

class Aluno {
public:
    Aluno();

    string nome;
    string cpf;
    string bairro;
    string cidade;
    string endereco;
    string identidade;
    string estadoCivil;
    string dataNascimento;
    int numeroMatricula;
};

#endif // ALUNOS_HPP_INCLUDED

Cadastro Alunos

#ifndef CADASTROALUNOS_HPP_INCLUDED
#define CADASTROALUNOS_HPP_INCLUDED

#include "Alunos.hpp"
#include "CadastroNotas.hpp"

//class CadastroNotas;

class CadastroAlunos {
public:
    CadastroNotas cadNotas;

    Aluno alunos[100];
    int indice;

    CadastroAlunos() {indice = 0;}

    void cadastrarAlunos();
    void alterarAlunos();
    void excluirAlunos(CadastroNotas cadNotas);
    void listarAlunos();
    int pesquisar(int numMatricula);
};

#endif // CADASTROALUNOS_HPP_INCLUDED

Notas

#ifndef NOTAS_HPP_INCLUDED
#define NOTAS_HPP_INCLUDED

#include "Bibliotecas.hpp"
class Nota {
public:
    Nota();

    int codigoNota;
    int codigoMatricula;
    int codigoDisciplina;
    double media1;
    double media2;
    double media3;
    double media4;
    double mediaFinal;
    string nomeAluno;
    string nomeDisciplina;
};

#endif // NOTAS_HPP_INCLUDED

Cadastro Notas

#ifndef CADASTRONOTAS_HPP_INCLUDED
#define CADASTRONOTAS_HPP_INCLUDED

#include "Notas.hpp"
//#include "CadastroAlunos.hpp"
#include "CadastroDisciplinas.hpp"

class CadastroAlunos;

class CadastroNotas {
public:
    //CadastroAlunos cadAlunos;
    CadastroDisciplinas cadDisciplinas;

    Nota notas[100];
    int indice;

    CadastroNotas() {indice = 0;}

    void cadastrarNotas(CadastroAlunos cadAlunos, CadastroDisciplinas cadDisciplinas);
    void alterarNotas();
    void excluirNotas();
    void listarNotas();
    void excluirNotas(int numMatricula);
    int pesquisarMatricula(int pos);
    int pesquisarDisciplina(int pos);
    int comparaPosicao(int matricula, int disciplina);
    string aprovado_reprovado(int pos);
};

#endif // CADASTRONOTAS_HPP_INCLUDED

Nelas eu declaro meus vetores, as variaveis que tenho dentro de cada vetor e os prototipos da funções.

 

O programa funcionam 100%, mas falta implementar uma função que ao excluir um aluno do vetor de alunos que esta na classe Cadastro Alunos também tenho que excluir todas as notas cadastradas para este mesmo aluno, mas as notas estão em um vetor dentro de outra classe, a classe Cadastro Notas. Consigo excluir o aluno e as notas separadamente pois em cada classe tenho uma função excluir, mas de dentro da classe Cadastro Aluno não consigo apagar as notas na classe Cadastro Notas.

 

Minha função para exclur as notas (Ela esta no Notas.cpp onde estão minhas funções referentes as notas):

void CadastroNotas::excluirNotas(int numMatricula) {
    int pos = 0;
    do {
        pos = pesquisarMatricula(numMatricula);
        if(pos >= 0){
            for(int i = pos; i < indice; i++) {
                notas[pos] = notas[pos + 1];
                indice--;
            }
        }
    } while(pos >= 0);
}

Chamo esta função no meu arquivo Alunos.cpp em que tenho minhas funçoes para classe Aluno e Cadastro Aluno, consigo obter as informações do vetor mas não consigo altera-las. Se eu chama-la dentro do Notas.cpp onde estão minhas funçoes referentes as notas ele apaga as notas corretamente.

 

Como devo proceder para que consiga chamar de dentro do meu Alunos.cpp esta função e ela apague os dados do vetor de notas que esta na classe Cadastro Notas?

 

Se não entenderem alguma coisa ou precisarem de mais informações e só dizer.

 

Obrigado novamente!

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

 

usando o conceito de classes e orientação a objetos.

 

O que aconteceu com o encapsulamento? Por que tudo está public?

 

A função na classe CadastroAluno vai ter que chamar a que exclui as notas na classe CadastroNotas e depois excluir o aluno.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O que aconteceu com o encapsulamento? Por que tudo está public?

 

O professor disse que neste trabalho não precisaríamos usar encapsulamento, esqueci de dizer isto.

 

Consegui resolver em parte o problema, não necessariamente como você disse mas me ajudou a achar uma outra forma, fiz o seguinte:

 

Alterei minha função de "void excluirAluno()" para "int excluirAluno()" me retornando depois do aluno excluído o numero da matricula e dentro do arquivo Menu.cpp onde ficam todos os menus que uso no programa, no "case 3" chamei duas funções a "excluirAluno()" que me retorna a matricula que uso na "excluirNotas()".

 void Menu::menuAluno() {

    Principal principal;

    int op = 0;
    int numMatricula = 0;

    do {
        cout << endl;
        principal.alinhaTexto("Escolha a opção desejada:\n\n", 8, 240);
        principal.alinhaTexto("1. Cadastrar  \n\n", 10);
        principal.alinhaTexto("2. Alterar    \n\n", 10);
        principal.alinhaTexto("3. Excluir    \n\n", 10);
        principal.alinhaTexto("4. Listar     \n\n", 10);
        principal.alinhaTexto("5. Voltar     \n\n", 10);
        principal.alinhaTexto("Opção: ", 10);
        cin >> op;

        system("cls");

        switch(op) {
            case 1:
                cadAlunos.cadastrarAlunos();
            break;
            case 2:
                cadAlunos.alterarAlunos();
            break;
            case 3:
                numMatricula = cadAlunos.excluirAlunos();
                cadNotas.excluirNotas(numMatricula);
            break;
            case 4:
                cadAlunos.listarAlunos();
            break;
            case 5:
                //Voltar
            break;
        }

    } while(op!= 5);
}

Funciona só que minha função "excluirNotas()" que achei estar funcionando corretamente não está.

void CadastroNotas::excluirNotas(int numMatricula) {
    int pos = 0;
    do {
        pos = pesquisarMatricula(numMatricula);
        if(pos >= 0){
            for(int i = pos; i < indice; i++) {
                notas[pos] = notas[pos + 1];
            }
            indice--;
        }
    } while(pos >= 0);
}

Acontece o seguinte:

 

No meu vetor de notas tenho em cada posição a matricula, nomeAluno, codigoDisciplina, nomeDisciplina, media1..., essa função teria que varrer todo o vetor e onde a matricula fosse igual a pesquisada (função "pesquisarMatricula()" logo abaixo) ele copiaria as informações das posições seguintes uma posição acima e decrementaria meu índice, e voltaria a pesquisar se ainda existe uma outra posição com a matricula (posso ter mais de uma disciplina cadastrada e nota cadastrada para cada matricula).

 

Ela exclui todas as notas da matricula pesquisada, mas as outras matriculas ficam com dados duplicados.

Por exemplo tenho 2 alunos/matriculas com 3 disciplinas com notas cadastradas para cada um (6 posições do vetor de notas ocupadas), se eu mandar excluir o aluno/matricula 1 ele exclui todas as informações mas o aluno/matricula 2 fica com duas notas repetidas e a ultima nota cadastrada some, e ficam 4 posições ocupadas onde deviam ser só 3.

 

Se alguém achar onde estou errando, já fiz varias alterações mas todas geram os mesmos resultados ou muito parecidos.

 

 

Pesquisar Matricula:

int CadastroNotas::pesquisarMatricula(int pos) {
    for(int i = 0; i < indice; i++) {
        if (notas[i].codigoMatricula == pos)
            return i;
    }
    return -1;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu diria pra você usar list ou vector ao invés de fazer isso na mão.

http://en.cppreference.com/w/cpp/container/list

http://en.cppreference.com/w/cpp/container/vector

 

Estava lendo sobre aqui e para utilizar uma dessas opções que citou terei que mudar grande parte do meu código, e no momento não tenho tempo para tal.

 

Terei que fazer na mão mesmo mas obrigado mesmo assim, se tiver qualquer sugestão do que posso tentar modificar também agradeceria muito.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Resolvi o problema da função "excluirNotas()" depois de muito quebrar a cabeça; acho que está correta agora (pelo menos nos meus testes estava funcionando), se alguem achar algum erro comente q eu corrigo pra ficar aqui como referência para futuras pesquisas.

 

void CadastroNotas::excluirNotas(int numMatricula) {
    for(int i = 0; i < indice; i++) {
        if(notas[i].codigoMatricula == numMatricula) {
            for(int j = i; j < indice; j++) {
                notas[j] = notas[j + 1];
            }
            i--;
            indice--;
        }
    }
}

Muto obrigado a todos!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.