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 monkeypuke, 12 de Março de 2009. (Respostas: 14; Visualizações: 1347)

  1. monkeypuke

    monkeypuke Power Member

    Boas, o meu problema é o seguinte:
    Tenho de fazer um trabalho em que exite um paralelipipedo e duas esferas.
    Umas das esfera está colocada no interior do paralelipipedo e a outra fora dele.
    O objectivo é calcular a àrea do paralelipipedo e subtrair-lhe a àrea da esfera que está no interior.
    No fim, soma-se a àrea da esfera que está no exterior para obter a área total.
    Temos de pedir todos os valores ao utilizador no "main()".
    O meu problema é que temos de utilizar uma cena chamada "sobrecarga de operadores" (que eu pouco ou quase nada) e criar as classes esfera e paralelipipedo.

    Para poder ser mais fácil de explicar deixo a página do caderno com as coisas que o professor escreveu no quadro.
    http://www.box.net/shared/m6pn1knhy2

    Obrigado pela atenção.
     
  2. Granadafeup

    Granadafeup Power Member

  3. monkeypuke

    monkeypuke Power Member

    Obrigado Granadafeup

    Se eu for postando os pedaços de código que for fazendo, podem ir dando as vossas opiniões/correcções?

    Obrigado
     
  4. monkeypuke

    monkeypuke Power Member

    Classes:

    class Csphere {
    int r;
    public:
    void set_values (int);
    int volume () {return ((4/3)*3.1415*(r*r*r));}
    };

    class Cparalelipipedo {
    int x, y, h;
    public:
    void set_values (int,int,int);
    int volume () {return (x*y*h);}
    };
     
  5. Granadafeup

    Granadafeup Power Member

    Esta no caminho certo. Tenta agora criar um classe abstracta que implementa o método virtual volume (ou mais correctamente get_volume), e faz com que as classes que crias-te herdem o a nova classe abstracta.
     
  6. monkeypuke

    monkeypuke Power Member

    Código:
    //definir valores
    void Csphere::set_values (int a) {
      r = a;
    }
    
    void Cparalelipipedo::set_values (int a,int b,int c) {
      x = a;
      y = b;
      h = c;
    }
    
    
    main()
    {
     int tmp; int tmp1; int tmp2;
     //criar objectos
     Csphere sphereout;
     Csphere spherein;
     Cparalelipipedo paral;
     
     //pedir valores da esfera de fora
     cout << "Insira o valor do raio de esfera que está fora do paralelipipedo";
     cin >> tmp;
     sphereout.set_values (tmp);
         //cout << "volume: " << sphereout.volume();
    
     //pedir valores da esfera de dentro
     cout << "Insira o valor do raio de esfera que está dentro do paralelipipedo";
     cin >> tmp;
     spherein.set_values (tmp);
         //cout << "volume: " << spherein.volume();
    
     //pedir valores do paralelipipedo 
     cout << "Insira o valor do comprimento do paralelipipedo";
     cin >> tmp;
     cout << "Insira o valor da largura do paralelipipedo";
     cin >> tmp1;
     cout << "Insira o valor da altura do paralelipipedo";
     cin >> tmp2;
     paral.set_values (tmp,tmp1,tmp2);
         //cout << "volume: " << paral.volume();
    }
    Agora é a parte de overload dos operadores, certo? é parte em que não pesco nada...
     
    Última edição: 13 de Março de 2009
  7. monkeypuke

    monkeypuke Power Member

    Pois, este gajo é da minha turma. não lhe vou chamar nomes porque não quero ser banido :x2:
     
  8. monkeypuke

    monkeypuke Power Member

    Ainda não consegui entender bem entender a parte do overload de operadores. Já vi imensos tutoriais mas, ainda não sei ao certo, qual é a vantagem de fazer overload a um operador..

    Se me pudessem ajudar, agradecia...
     
  9. monkeypuke

    monkeypuke Power Member

    Agora tenho o seguinte:

    Código:
    #include <cstdlib>
    #include <iostream>
    
    using namespace std;
    //Criação das Classes
    
    class Csphere {
        int r;
      public:
        void set_values (int);
        double volume () {return ((4/3)*3.1415*(r*r*r));}
    };
    
    class Cparalelipipedo {
        int x, y, h, vol;
      public:
        Cparalelipipedo () {};
        void set_values (int,int,int);
        int volume () {return (x*y*h); vol=x*y*h;}
    
    };
    
    //definir valores
    void Csphere::set_values (int a) {
      r = a;
    }
    
    void Cparalelipipedo::set_values (int a,int b,int c) {
      x = a;
      y = b;
      h = c;
    }
    
    //overload de operadores
    [B][COLOR=Red]Cparalelipipedo Cparalelipipedo::operator+ (Cparalelipipedo param) {[/COLOR][/B]
      Cparalelipipedo temp;
      temp.vol = vol + param.vol;
      return (temp);
    }
    
    main()
    {
     int tmp; int tmp1; int tmp2;
     //criar objectos
     Csphere sphereout;
     Csphere spherein;
     Cparalelipipedo paral;
     
     //pedir valores da esfera de fora
     cout << "Insira o valor do raio de esfera que está fora do paralelipipedo";
     cin >> tmp;
     sphereout.set_values (tmp);
         //cout << "volume: " << sphereout.volume();
    
     //pedir valores da esfera de dentro
     cout << "Insira o valor do raio de esfera que está dentro do paralelipipedo";
     cin >> tmp;
     spherein.set_values (tmp);
         //cout << "volume: " << spherein.volume();
    
     //pedir valores do paralelipipedo 
     cout << "Insira o valor do comprimento do paralelipipedo";
     cin >> tmp;
     cout << "Insira o valor da largura do paralelipipedo";
     cin >> tmp1;
     cout << "Insira o valor da altura do paralelipipedo";
     cin >> tmp2;
     paral.set_values (tmp,tmp1,tmp2);
         //cout << "volume: " << paral.volume();
         
     [B][COLOR=Red]cout << paral + sphereout.volume();[/COLOR][/B]
    }
    
    Dá-me os seguintes erros:
    35 no `Cparalelipipedo Cparalelipipedo: operator+(Cparalelipipedo)' member function declared in class `Cparalelipipedo'

    71 no match for 'operator+' in 'paral + (&sphereout)->Csphere::volume()'
     
    Última edição: 13 de Março de 2009
  10. Ronnie_03

    Ronnie_03 Power Member

    Vou dar-te um exemplo de overloading de um operador para ver se percebes a ideia.
    Imagina o seguinte codigo:
    Código:
    string str1 = "qualquer";
    string str2 = " coisa";
    str1+str2;//a soma neste caso é a concatenação de strings
    
    Confesso que não vi o teu código, mas se por exemplo para cada classe tens o volume dos sólidos, podes fazer um overloading da soma:

    esfera+paralelepipedo;//esfera e paralelepipedo são objectos das classes e a soma poderia por exemplo devolver a soma dos volumes

    Tens de ver que operações é que queres fazer e com que dados dos objectos, mas a ideia é sempre a mesma.


    Cumps
     
  11. monkeypuke

    monkeypuke Power Member

    Então, tipo:
    Duas classes (ex):

    Class esfera {int volume};

    Class paralelipipedo {int volume};

    Depois de fazer o overload do operador +, posso fazer o seguinte (ex):

    Código:
    main(){ esfera a; paralelipipedo b;
     cout << a+b \\apresenta a soma dos volumes
    }
    ??
     
  12. Granadafeup

    Granadafeup Power Member

    Para te ajudar nesse caso tens de criar um classe abstracta (CFiguraGeometrica) que depois as tuas classes vão herdar

    Código:
    
    class CFiguraGeometrica{
    
    public:
        double volume() =0;     
    }
    
    class Csphere:CFiguraGeometrica{
        int r;
      public:
        void set_values (int);
        double volume () {return ((4/3)*3.1415*(r*r*r));}
    };
    
    class Cparalelipipedo:CFiguraGeometrica{
        int x, y, h, vol;
      public:
        Cparalelipipedo () {};
        void set_values (int,int,int);
        double volume () {return (x*y*h); vol=x*y*h;}
    
    };
    
    
    Depois lê a parte de polimorfismo no site que meti a cima. A resposta é fácil mas tens de chegar la sozinho :P
     
  13. monkeypuke

    monkeypuke Power Member

    Ah bom.. pensava que tinha somar as duas classes diferentes
     
  14. OubeLa

    OubeLa Power Member

    Se fizeres overloading do operador +, por exemplo, sim, podes somar duas instâncias de duas classes, para por exemplo somar os volumes ou outra coisa qualquer.
     
  15. monkeypuke

    monkeypuke Power Member

    Já consegui fazer!
    Obrigado a todos. Estou a dever-vos um café xD
    Código:
    #include <cstdlib>
    #include <iostream>
    
    using namespace std;
    //BCriação das Classes
    
    class Csphere {
        double r;
      public:
        void set_values (int);
        double volume () {return ((4/3)*3.1415*(r*r*r));}
    };
    
    class Cparalelipipedo {
        double x, y, h, vt;
       public:
        Cparalelipipedo () {};
        void set_values (int,int,int);
        double volume () {return (x*y*h);};
        //Roverload de operadores
        double operator + (Csphere);
        Cparalelipipedo operator - (Csphere);
        
    };
    
    //Udefinir valores
    void Csphere::set_values (int a) {
      r = a;
    }
    
    void Cparalelipipedo::set_values (int a,int b,int c) {
      x = a;
      y = b;
      h = c;
    }
    
    //Noverload de operadores
    double Cparalelipipedo::operator+ (Csphere param) {
      return( vt + param.volume());
    }
    
    Cparalelipipedo Cparalelipipedo::operator- (Csphere param) {
      Cparalelipipedo temp;
      temp.vt = volume() - param.volume();
      return( temp );
    }
    
    
    main()
    {
     int tmp; int tmp1; int tmp2;
     //Ocriar objectos
     Csphere sphereout;
     Csphere spherein;
     Cparalelipipedo paral;
     
     //Cpedir valores da esfera de fora
     cout << "Insira o valor do raio de esfera que está fora do paralelipipedo";
     cin >> tmp;
     sphereout.set_values (tmp);
         cout << "volume: " << sphereout.volume() <<"\n";
    
     //Apedir valores da esfera de dentro
     cout << "Insira o valor do raio de esfera que está dentro do paralelipipedo";
     cin >> tmp;
     spherein.set_values (tmp);
         cout << "volume: " << spherein.volume() <<"\n";
    
     //Mpedir valores do paralelipipedo 
     cout << "Insira o valor do comprimento do paralelipipedo";
     cin >> tmp;
     cout << "Insira o valor da largura do paralelipipedo";
     cin >> tmp1;
     cout << "Insira o valor da altura do paralelipipedo";
     cin >> tmp2;
     paral.set_values (tmp,tmp1,tmp2);
         cout << "volume: " << paral.volume () <<"\n";
         
     cout << " O valor total da fogura será : " << (paral - spherein) + sphereout  <<"\n";
     
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    
    
     
    Última edição: 14 de Março de 2009

Partilhar esta Página