1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Ajuda C++

Discussão em 'Programação' iniciada por OubeLa, 22 de Novembro de 2007. (Respostas: 6; Visualizações: 829)

  1. OubeLa

    OubeLa Power Member

    Estou a realizar um projecto para gestão de cantinas

    Na primeira parte do trabalho fiz uma class Trabalhador, Pratos e Cantina.

    O que eu queria fazer era atribuir uma data à cantina, e um turno. Inicialmente apenas os Trabalhadores tinham turnos de funcionamento, por isso tinha uma variavel turno na class Trabalhador, e outra na class Cantina. Assim, quando a cantina estivesse num determinado turno, ia buscar os trabalhadores.

    Agora os pratos também têm turno, ou seja, posso ter um prato que apenas esteja disponíve, p.e, ao almoço. Também existem datas. Ou seja, a cantina funciona num determinado dia, num determinado turno. Os trabalhadores e os pratos também passam a terem datas. Ou seja, o trabalhador X pode apenas trabalhar no dia 22/11/2007 no turno do almoço, e o prato Y também a mesma coisa.

    Para tal, resolvi criar uma class Data, que tinha dava informações da data. Também pensei em criar uma classe turno.

    Depois tenho uma função, dentro da class Cantina, que permite modificar a data da cantina, e que permite chamar a função mostraData() da class Data.

    Código:
    void Cantina::dataCantina()
    {
    if (op == 1)
    {
     int dia, mes, ano;
    //(fazer os cout's e cin's a pedir o dia, mes, e ano)
    Data data (dia, mes, ano); //chama o construtor data
    }
    
    else if (op == 2)
    {
    //aqui devia chamar a função mostraData()
    }
    }
    
    Depois, se eu escolher no menu a opção para mostrar a data, tenho um problema: nao consigo chamar a função mostraData() da class Data, onde está a data actual da cantina. Eu estava a fazer data.mostraData(), só que ele diz-me que a parte esquerda de .mostraData() deve ser um objecto da class Data. Se voltar a chamar o construtor, a informação que está lá desaparece evidentemente.

    Como é que resolvo isto?

    Já pensei em chamar o construtor Data dentro do contrutor da classe Cantina, mas não funciona na mesma.

    Isto é tipo as variaveis globais ou locais. Eu precisava de chamar o construtor globalmente, porque a ideia era saber sempre a Data, para depois a conseguir comparar com a data dos trabalhadores e pratos, para depois poder ter acesso aos trabalhadores e pratos desse dia e turno.

    Acham que estou a pensar bem? Acham que devo ter uma classe Data e Turno para poder usa-la nos pratos, trabalhadores e cantina?

    Eu sei que isto é bem simples de resolver, mas já começo a estar cansado e já não acerto uma :lol:

    EDIT: peço desculpa se o texto não estiver bem escrito, mas infelizmente foi escrito à pressa.
     
    Última edição: 22 de Novembro de 2007
  2. AragTey

    AragTey Power Member

    Epa eu nos meus trabalho prefiro ter sempre o minimo de classes possiveis (mariquices minhas :-D ) penso que na tua situação podias resolver o problema com uma variável do tipo time_t, para susbituir toda essa classe Data.
     
  3. OubeLa

    OubeLa Power Member

    Já agora, alguém me consegue explicar este erro?

    Código:
                    string d, m, a;
                    bool flag;
                    cout << "Escolha uma data" << endl << "Dia: ";
                    cin >> d;
                    cout << endl << "Mes: ";
                    cin >> m;
                    cout << endl << "Ano: ";
                    cin >> a;
                    cout << endl;
                   
                    try{
                        if (valid(d) == true && valid(m) == true && valid (a) == true) {
                            unsigned int d1 = stoi(d);
                            unsigned int m1 = stoi(m);
                            unsigned int a1 = stoi(a);
                            flag = true;
                        }
    
                        else  {
                            flag = false;
                            throw DataErrada();
                        }
                    }
    
                    catch (DataErrada) {
                        cout << "Data invalida" << endl;
                    }
    
                    if (flag == true)
                    {
                        try {
                            if (a1 > 0) //aqui está o 1º erro
                            {
                                if (m1 > 0 && m1 <= 12)
                                {
                                    if (m1 == 1 || m1 == 3 || m1 == 5 || m1 == 7 || m1 == 8 || m1 == 10 || m1 == 12)
                                    {
                                        if (d1 > 0 && d1 <= 31) {
                                            dia = d1;
                                            mes = m1;
                                            ano = a1;
                                        }
    
                                        else
                                            throw ErroDia();
                                    }
    
                                    else if (m1 == 4 || m1 == 6 || m1 == 9 || m1 == 11)
                                    {
                                        if (d1 > 0 && d1 <= 30){
                                            dia = d1;
                                            mes = m1;
                                            ano = a1;
                                        }
    
                                        else
                                            throw ErroDia();
                                    }
    
                                    else if (m1 == 2)
                                    {
                                        if (d1 > 0 && d1 <= 28){
                                            dia = d1;
                                            mes = m1;
                                            ano = a1;
                                        }
    
                                        else throw ErroDia();
                                    }
                                }
    
                                else
                                    throw ErroMes();
                            }
    
                            else
                                throw ErroAno();
                        }
    
                        catch (ErroDia) {
                            cout << "Dia invalido" << endl;
                        }
    
                        catch (ErroMes) {
                            cout << "Mes invalido" << endl;
                        }
    
                        catch (ErroAno) {
                            cout << "Ano invalido" << endl;
                        }
                    }
    
    
                }
    Notas: a função valid foi implementada por mim, e verifica se uma string é um numero valido.
    A função stoi foi implementada por mim e permite converter uma string em integer

    Código:
    1>------ Build started: Project: Cantina 2, Configuration: Debug Win32 ------
    1>Compiling...
    1>Visualizacao.cpp
    1>c:\documents and settings\*****\cantina 2\cantina 2\visualizacao.cpp(226) : error C2065: 'a1' : undeclared identifier
    1>c:\documents and settings\*****\cantina 2\cantina 2\visualizacao.cpp(228) : error C2065: 'm1' : undeclared identifier
    1>c:\documents and settings\*****\cantina 2\cantina 2\visualizacao.cpp(232) : error C2065: 'd1' : undeclared identifier
    Eu percebo o erro, só não consigo perceber o porquê... A verdade é que eu defini a variavel.
     
    Última edição: 22 de Novembro de 2007
  4. OubeLa

    OubeLa Power Member

    Esqueçam, ja consegui.

    Foi só passar a definição das variaveis para fora da do try.
     
  5. Baderous

    Baderous Banido

    Existe uma função na cstdlib (stdlib.h) chamada atoi que converte uma string num integer, por isso não precisavas de definir uma tua.
     
  6. jahred

    jahred Power Member

    boas! tb tou a fazer esse projecto, mas ainda nem olhei pro enunciado... talvez com apontadores desse pra fazeres o que queres... ias enviando sempre de uma classe para outra a posição de memória do membro Data (um apontador para Data), e ias desreferenciando sempre que precisasses, do género, apontador=&data; depois vais enviando de classe para classe e quando precisares é só (*apontador).getData() ou apontador->setData()...

    e aquele erro que te tava a dar era um bocado óbvio, porque se o If onde eram declaradas as variáveis desse falso então as variáveis não eram declaradas, mas eram usadas depois :P
     
    Última edição: 22 de Novembro de 2007
  7. OubeLa

    OubeLa Power Member

    Eu sei, mas quando se passa uma tarde inteira a olhar para isto dá nestas coisas :lol: hoje estou num daqueles dias em que não consigo andar com as coisas mais simples. Enfim, amanhã é outro dia :lol:
     

Partilhar esta Página