Universidade do Vale do Paraíba Colégio Técnico Antônio Teixeira Fernandes Disciplina Programação Orientada a Objetos - II Material III-Bimestre Manipulação de Arrays, Funções e Procedimentos Ponteiros, Barra de Progressão, Barra de rastro, Timer , Gráficos e Imagens site : http://www1.univap.br/~wagner Prof. Responsáveis Wagner Santos C. de Jesus Array(Vetores) Array vem a ser a forma de criar uma variável que pode representar uma coleção de elementos. Onde cada item de dado especifica um elemento que deve ser associado a um índice. Exemplo : <tipo> <variável> [<indice>][...][...]... = <valor>; Onde o índice representa o número de elementos que o vetor irá possuir, Um vetor poderá possuir mais de um índice. Onde o índice representa o número de elementos que o vetor irá possuir, Um vetor poderá possuir mais de um índice. Exemplo da utilização de um Array com os elementos fixos. int k[] = { 50, 22, 38 }; Um Array poderá ser criado da seguintes Maneiras. Exemplo : int k[3]; k[0] = 50; k[1] = 22; k[2] = 38; int m[3][4]; // Este exemplo cria um Array de três linhas e quatro colunas. Exemplo : Programa que preenche o vetor m com elementos. int v1[3][4]; int k = 30; for(int i=0;i<=2;i++){ for(int j=0;j<=3;j++){ v1[i][j] = k; k+=5; } } O programa irá preencher na memória o vetor v1 da seguinte forma. Obs : Todo o vetor em C++ será iniciado na posição (0). Portanto um vetor de três elementos irá ter o índices de zero à dois. Funções e Procedimentos Uma função vem a ser uma rotina externa ao programa principal que está sendo executado, normalmente uma função retorna um valor já um procedimento possui o mesmo comportamento da função mas não sendo possível retorna valor. Declarando procedimentos e funções em C++. Para se declarar um procedimento deve-se usar a palavra void em antes do nome do mesmo. Sintaxe : void <nome-procedimento>([<parâmetros>]) { : : <Instruções> } Exemplo declaração Procedimento Exemplo void teste(char letras[]) { ShowMessage(letras); } : : teste("Teletubbies dizem Oi..."); Criando uma Função Para declarar uma função usa-se a seguinte notação. O tipo de dados que esta função irá retornar seguindo do nome da função e logo após os parâmetros que serão passados. Sintaxe : <tipo> <nome-função>([<parâmetros>]) { : : <Instruções> return <valor> } Importante : Toda função deverá possuir a instrução return após Ter sido encerrado seu processamento. Exemplo : int soma(int a, int b){ int v = a + b; return v; } : : int c = 45; int d = 2; int s = soma(c, d); ShowMessage(s); Atenção : O local onde devem ser declaradas as funções e procedimentos é análogo ao das variáveis globais ou seja uma função ou procedimento será sempre global ao formulário que estará sendo executado. #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------#pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; void teste( char letras[] ) { ShowMessage(letras); } int soma( int a, int b ){ int v = a + b; return v; } Unidade para funções Para que uma função possa ser chamada em qualquer formulário de um projeto devemos criar uma unidade (Unit) de funções e procedimentos. Criando uma unidade (unit) Basta selecionar File, New e Unit. Será mostrada a seguinte estrutura //--------------------------------------------------------------------------#pragma hdrstop #include "Unit2.h" //--------------------------------------------------------------------------#pragma package(smart_init) int soma(int a, int b){ int v = a + b; return v; } Para vincular a unidade nova ao formulário. Selecione a opção File, Include Unit ou pressione a tecla Alt+F11. Em seguida a função deve ser declarada no formulário a ser usado. Exemplo da inclusão e definição de uma função no formulário corrente. //--------------------------------------------------------------------------#include <vcl.h> #pragma hdrstop #include "Unit1.h" #include "Unit2.h" //--------------------------------------------------------------------------#pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; int soma(int n,int y); //--------------------------------------------------------------------------__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } Ponteiros Um ponteiro é uma variável que representa a localização de um item de dados na memória ou seja ele aponta para um endereço de memória na qual existe um dado para ser processado. Os ponteiros são usados para otimizar e aumentar performance de memória em uma aplicação. A memória de um computador é dividida em células adjacentes que são numeradas consecutivamente, do inicio para o fim a área de memória associada com seu número e sua respectiva célula denominamos endereço. Que em sua grande maioria os computadores usam o sistema de numeração hexadecimal. Abaixo encontramos a ilustração de endereço. Armazenamento da informação na memória RAM Ponteiro *p 0012F588 num = 80 0012F580 *j x = RAM 123.89 Variável inteira (int) Variável dupla precisão (double) Ponteiro vem a ser a variável que aponta para um desses endereços. Usando um ponteiro. Para declarar um ponteiro devemos usar o símbolo de asterisco na frente da variável. Exemplo: int *j; Obs: Neste caso a variável j será um ponteiro de inteiro. Para que j aponte para um endereço devemos indicar para que endereço de memória desejamos que j aponte. Para fazer isso usamos o símbolo de (e comercial) &. Exemplo : int *j; int k = 3; j = &k; Veja a ilustração do que irá ocorrer na memória. Se o valor do ponteiro j alterada o valor de k. for alterado logo será Ou seja : int *j; int k = 3; j = &k; *j = 6; Obs : Logo o novo valor da variável k será 6 pelo simples motivo de j estar apontando para o endereço da variável k. Visualizando o endereço de memória onde o ponteiro esta. #include <stdio.h> // Deverá ser colocada void __fastcall TForm1::Button1Click(TObject *Sender) { int *p; char buffer[8]; int num = 123; p = # sprintf(buffer,"%p",p); ShowMessage(buffer); // O resultado Será buffer=0063F2B8 } Aplicações como ponteiros. Um exemplo da aplicação com ponteiros é o caso do evento OnKeyPress que pega o valor da tecla pressionada. void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key) { char *j = &Key; ShowMessage(*j); } Este exemplo captura o valor ASCII da tecla pressionada. void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key) { char *j = &Key; int k = *j; ShowMessage(k); } Exemplo usando ponteiro para usar a caixa de texto aceitando somente números. void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key) { char *j = &Key; if(*j < '0' || *j > '9') { ShowMessage("Digito Não Permitido..."); Edit1->SetFocus(); Edit1->Clear(); } } Exemplo de Ponteiro na manipulação de caracteres. void __fastcall TForm1::Button1Click(TObject *Sender) { char *a = "As Poderosa dizem oi para Teletubbies"; int x = strlen(a); int i = 1; while(i <= x ) { char y = *a++; if(y=='o') ShowMessage(y); i++; } } Operadores de deslocamento de bits Para realizarmos o deslocamento em uma variável que contém 1 byte podemos realizar operações matemática binária ou utilizar recursos da linguagem para efetuar as operações de maneira mais rápida e com segurança. Esses operadores sãos denominados shift. E são representados da seguinte forma >> << Onde : >> - deslocamento para direita. << - deslocamento para esquerda. Sintaxe : Variável >> num-bits; // para direita Variável << num-bits; // para esquerda Observação Os operadores de deslocamento de bits devem ser usados para tipos de dados char, int(correspondente) e byte; que é o mais recomendado. São muito eficientes para decodificar input de dispositivos internos, como conversor A/D. Exemplo de operação 128 1 0 0 0 64 0 1 0 0 32 0 0 0 0 16 0 0 1 0 8 0 0 0 1 4 0 0 0 0 byte nbit = 128; nbit = nbit >> 1; // Desloca um bit para direita nbit = nbit >> 2; // Desloca dois bit para direita nbit = nbit >> 1; // Desloca dois bit para direita 2 0 0 0 0 1 0 0 0 0 Exemplo de deslocamento de bits à esquerda bit a bit 128 0 0 0 0 0 0 0 1 64 0 0 0 0 0 0 1 0 32 0 0 0 0 0 1 0 0 16 0 0 0 0 1 0 0 0 8 0 0 0 1 0 0 0 0 4 0 0 1 0 0 0 0 0 2 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 Programa Exemplo byte a = 1; int x = 1; while( x <= 8){ ShowMessage(a); a = a << 1 ; x++; } Passando Parâmetros por Valor e por Referencia. Para passarmos parâmetros para uma função podemos usar duas formas muito comuns uma é a passagem de parâmetros por valor que já foi vista no inicio da abordagem de funções e procedimentos, a outra é a passagem por intermédio de referencia no que é passado endereço e não o valor de conteúdo da variável. Exemplo de passagem por valor. int soma( int a, int b ){ int v = a + b; return v; } : : int c = 45; int d = 2; int s = soma(c, d); ShowMessage(s); Exemplo de passagem por referencia. void soma(int &a, int &b){ int *pont = &b; b = a + b; } : int h = 3; int y = 2; soma(h,y); ShowMessage(y); Obs : Ao final da execução desse programa o valor da variável y será igual a cinco que corresponde a soma de h e y.b Objetos Especiais. Em Builder C++ temos a palheta win32 na qual podemos observar alguns componentes para fazermos representações estatísticas de dados. ProgressBar : Permite criar uma barra de progressão onde o usuário da aplicação pode verificar a porcentagem da operação que estará sendo realizada. Palheta win32. Propriedade importantes : Position - que captura o ascendente onde a barra de rolagem esta posicionada. Max - permite atribuir o valor máximo onde a barra deverá alcançar Min - permite atribuir o valor mínimo onde será iniciada a contagem. Exemplo : for(int i=0;i<=100;i++){ for(int j=0;j<=200000000;j++); ProgressBar1->Position++; } O exemplo acima preenche a barra de rolagem em 100% contando para cada valor Position aproximadamente 20 segundo. Onde Max = 100 e Min = 0. TrackBar - Permite criar uma barra de rastro Barra de Rastro possibilitando o usuário da aplicação escolher a escala em que deseja trabalhar. Palheta win32. Propriedade importantes : Position - que captura o ascendente onde a barra de rolagem esta posicionada. Max - permite atribuir o valor máximo onde a barra deverá alcançar Min - permite atribuir o valor mínimo onde será iniciada a contagem. Exemplo : void __fastcall TForm1::TrackBar1Change(TObject *Sender) { Label1->Font->Size = TrackBar1->Position; } Timer - Permite executar uma operação recursivamente em um determinado intervalo de tempo de 1000 milisegundo que equivale a um segundo. Palheta system. Propriedade importantes : Enabled - Habilita ou desabilita o timer o padrão é true habilitado. Interval - Determina o intervalo de espera para execução do evento. Exemplo : void __fastcall TForm1::Timer1Timer(TObject *Sender) { AnsiString linha[] = {"Abacaxi","Laranja","Banana"}; Label1->Caption = linha[i]; i++; if(i= =3) i = 0; } Exemplo : Para carregar uma figura na tela. void __fastcall TForm1::Button6Click(TObject *Sender) { Image1->Picture->LoadFromFile("c:/windows/lixo.bmp"); } VtChart - O objeto VtChart permite a criação de gráficos para realização de estatística de valores e visualização de dados, esse objeto se encontra na palheta ActiveX. Sintaxe : VtChart1.<propriedade>=valor | [<método>]; Propriedade Principais para a configuração de visualização do gráfico. ChartType : determina qual o tipo de gráfico será desenhado. VtChart1->ChartType = <valor>; O valor deverá ser instânciado de acordo com a tabela abaixo: Valor 0 1 2 3 4 5 10 11 13 14 21 22 Tipo Barras em três dimensões Barras em duas dimensões Linhas em três dimensões Linhas em duas dimensões Área em três dimensões Área em duas dimensões Barras horizontais em três dimensões Barras horizontais em duas dimensões Tortas em três dimensões Tortas em duas dimensões Gráfico de Gantt em duas dimensões Gráfico de Gantt em três dimensões ShowLegend : Permite mostrar ou não a legenda de um gráfico. Booleano (true/false) Exemplo : VtChart1->ShowLegend = true; TitleText : Exibe um título para o gráfico. Exemplo : VtChart1->TitleText = "Rendimeto Bimestral 2 Anos de Informática"; TitleText ColumnCount : Determina o número de colunas ou setores que o gráfico terá. Exemplo: VtChart1->ColumnCount = 2; ColumnCount RowCount : Determina o número de linhas de dados que o gráfico irá ter.(Número de divisões do eixo x). Exemplo : VtChart1->RowCount = 3; RowCount Column : Seta em que coluna do gráfico será alterado por uma informação ou dado. VtChart1->Column = 1; Column =1 Column =2 ColumnLabel : Determina um título para a coluna setada por Column(Título da Legenda). Exemplo : VtChart1->ColumnLabel = "1-Trim-2004"; ColumnLabel Column =1 Column =2 FootnoteText : Coloca uma mensagem no rodapé do gráfico. VtChart1->FootnoteText = "Acompanhamento Trimestral de vedas"; FootnoteText Row : Determina o número da linha que receberá os dados . VtChart1->Row = 1; Row =1 Row =2 Row =3 RowLabel : Determina o título para o eixo x. Exemplo : VtChart1->RowLabel = "JAN"; RowLabel = “2J2D – 4.5/5.0” Data : Propriedade mais importante do objeto gráfico, permite atribuição do valor que irá desenhar o gráfico. Atenção : Mesmo sendo um valor numérico para o desenho do gráfico essa informação deverá ser sempre uma string, como o exemplo abaixo. Exemplo : VtChart1->Data = "5.5"; Data = “5.5” DrawMode : Desenha o gráfico na tela por intermédio dos valores (0 ou 1). 0 - Desenha o gráfico com a cor de fundo padrão. 1 - Desenha o gráfico com cor de fundo branca. DrawMode : Desenha o gráfico na tela por intermédio dos valores (0 ou 1). 0 - Desenha o gráfico com a cor de fundo padrão. 1 - Desenha o gráfico com cor de fundo branca. Exemplo : VtChart1->DrawMode = 0;