sábado, 8 de março de 2008

Lógica2 - Primeiro Projeto OOP em C++

 

Projeto desenvolvido na aula de sexta-feira 22/02/2008.

 

Foi testado com o compilador GCC no ambiente Linux e com o Borland C Compiler v.5.5 em ambiente Windows XP.

 

Download do BCC32 free: http://www.codegear.com/downloads/free/cppbuilder

 

Notar alguns detalhes no código:

1) ao declarar a "visibilidade" do atributo/método, usar ":" como no exemplo:

private: int atributo;

public: float Metodo( int, int, int );

 

2) usando a notação '->' para referir-se a um atributo/método desse objeto, é requerido declará-lo com alocação dinâmica de memória, através de ponteiros, como no exemplo:

Veiculo *meriva;            // declaração

Veiculo *civic;             // declaração

meriva = new Veiculo( );    // instanciamento

civic = new Veiculo( );     // instanciamento

meriva->cor = 1;            // fixar valor em atributo do objeto

civic->cor = 2;             // fixar valor em atributo do objeto

delete meriva;              // destruição do objeto

delete civic;               // destruição do objeto

 

3) para usar a outra  forma de referir-se a um atributo/método com a notação ".", é necessário declará-lo com alocação estática de memória:

Veiculo meriva = Veiculo( );     // declaração e instanciamento

Veiculo civic = Veiculo( );     // declaração e instanciamento

meriva.cor = 1;            // fixar valor em atributo do objeto

civic.cor = 2;             // fixar valor em atributo do objeto

/* Observar: não requer o comando "delete", já que a alocação é estática, e sendo assim, somente quando o escopo do código encerrar é que serão liberados os recursos de memória para objetos estáticos; */

 

A seguir, códigos em C++ para:

Aplicativo.cpp

Estatisticas.h

Estatisticas.cpp

 

//---------<Aplicativo.cpp>----------------------------------------------

// Aplicativo.cpp

/*

    CEFET-SP :: TADS :: LG2

    Prof. Josimar Nunes de Oliveira - 2008

    0) Ambiente (GNU/Linux :: Fedora 7):

        # c++ -v
        Using built-in specs.
        Target: x86_64-redhat-linux
        Configured with: ../configure
                --prefix=/usr
                --mandir=/usr/share/man
                --infodir=/usr/share/info
                --enable-shared
                --enable-threads=posix
                --enable-checking=release
                --with-system-zlib
                --enable-__cxa_atexit
                --disable-libunwind-exceptions
                --enable-languages=c,c++,objc,obj-c++,java,fortran,ada
                --enable-java-awt=gtk
                --disable-dssi
                --enable-plugin
                --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-1.5.0.0/jre
                --enable-libgcj-multifile
                --enable-java-maintainer-mode
                --with-ecj-jar=/usr/share/java/eclipse-ecj.jar
                --with-cpu=generic
                --host=x86_64-redhat-linux
        Thread model: posix
        gcc version 4.1.2 20070925 (Red Hat 4.1.2-27)

    1) Arquivos fontes:

        Aplicativo.cpp
        Estatisticas.h
        Estatiscas.cpp

    2) Compilação & Linkagem:

        # c++ Aplicativo.cpp Estaticas.cpp -o Apl

    3) Arquivo binário executável:

        ./Apl

    4) Arquivo de dados:

        Dados.txt

    5) Execução do programa binário:

        # ./Apl < Dados.txt

       Observação: o programa utiliza os métodos 'std::cin' e 'std::cout' que acessam respectivamente a entrada e a saída padrão do sistema; logo, usando o redirecionador da entrada padrão '<', os dados serão lidos do arquivo, facilitando os testes.


    6) Ambiente MS Windows XP/SP2:

        Compilador:     BORLAND C COMPILER 5.5

        Comando:        bcc32 Aplicativo.cpp Estatisticas.cpp

        Executável:     Aplicativo.exe

        Teste:          Aplicativo < Dados.txt

*/

#include "Estatisticas.h"

#include <iostream>

using std::cin;
using std::cout;

// declaração global de objetos:

Estatisticas *ba;

int main( )
{
    // declaração local de variáveis:

    int uf, valor;
    bool fim_arq = false;

    // declaração local de objetos:

    Estatisticas *sp;
    Estatisticas *rj;
    Estatisticas *mg;
    Estatisticas *es;

    // instanciamento de objetos:

    sp = new Estatisticas( );
    rj = new Estatisticas( );
    mg = new Estatisticas( );
    es = new Estatisticas( );

    while ( ! fim_arq )
    {
        // Ler dados da entrada padrão (teclado):

        cin >> uf;
        cin >> valor;

        // Executar método 'Acumular( int )' para o respectivo objeto:

        switch ( uf )
        {
            case 1:               
                sp->Acumular( valor );        // SP
                break;
            case 2:       
                rj->Acumular( valor );        // RJ
                break;
            case 3:       
                mg->Acumular( valor );        // MG
                break;
            case 4:       
                es->Acumular( valor );        // ES
                break;
            case 0:       
                fim_arq = true;            // fim de arquivo
                break;
        }
    }

    // Executar método 'Medias()' de cada objeto:

    sp->Medias( );   
    rj->Medias( );   
    mg->Medias( );   
    es->Medias( );
   

    // Imprimir atributo 'media' de cada objeto:

    cout << "\n\n";

    cout << "\nSP: " << sp->media;
    cout << "\nRJ: " << rj->media;
    cout << "\nMG: " <<
mg->media;
    cout << "\nES: " << es->media;

    cout << "\n\n";

    // Destruir objetos:

    delete sp;
    delete rj;
    delete mg;
    delete es;

    // fim do aplicativo:

    return 0;

}

//---------</Aplicativo.cpp>---------------------------------------------

 

//---------<Estatisticas.h>----------------------------------------------

// Estatisticas.h

class Estatisticas {

    public: int cnt;
    public: int somatoria;
    public: int media;

    Estatisticas( );         // Construtor

    public: void Acumular( int );
    public: void Medias( );

    ~Estatisticas( );        // Destrutor

};

//---------</Estatisticas.h>---------------------------------------------

 

//---------<Estatisticas.cpp>--------------------------------------------

// Estatisticas.cpp

#include "Estatisticas.h"

Estatisticas :: Estatisticas( )            // Construtor
{
    cnt = 0;
    somatoria = 0;
    media = 0;
}

void Estatisticas :: Acumular( int a )
{
    cnt ++;
    somatoria += a;
    return;
}

void Estatisticas :: Medias( )
{
    media = somatoria / cnt;
    return;
}

Estatisticas :: ~Estatisticas( )        // Destrutor
{
}

//---------</Estatisticas.cpp>-------------------------------------------

 

//---------<Dados.txt>---------------------------------------------------

1 2000
2 4000
3 3500
4 3600
5 1200
3 500
2 800
2 3800
4 1250
5 540
1 6500
3 420
1 8700
3 9500
2 1240
1 370
5 850
3 1230
2 3290
1 4320
0 0

//---------</Dados.txt>--------------------------------------------------

 

//---------<Resultado_Linux>---------------------------------------------

[root@localhost projetos_lg2]# ./Apl < Dados.txt

SP: 4378
RJ: 2626
MG: 3030
ES: 2425

[root@localhost projetos_lg2]#

//---------</Resultado_Linux>--------------------------------------------

 

//---------<Resultado_Windows_XP>----------------------------------------

C:\projetos_lg2>Aplicativo.exe < Dados.txt

SP: 4378
RJ: 2626
MG: 3030
ES: 2425

C:\projetos_lg2>

//---------</Resultado_Windows_XP>---------------------------------------

 

Nenhum comentário: