o bit e o byte

102
 O bit e o byte O tipo de dado mais utilizado pelos chips da família 80x86 não é o  bit, e sim o byte. Um byte equivale a um grupo de oito bits. Para facilitar a leitura e a compreensão, costumam-se adotar algumas convenções: 1ª. completar com zeros os números binários para que eles se tornem um múltiplos de quatro ou de oito bits. Exemplo: 543 = 001000011111; 2ª. cada grupo de quatro bits deve ser separado por espaço. Exemplo: 0010 0001 1111. Um byte pode representar até 256 valores diferentes, pois são oito  bits em potência de dois: 2 8 = 256. Geralmente um byte é usado para representar valores compreendidos entre 0 e 255 não sinalizados ou valores entre -127 a 128 sinalizados.

Upload: neutonribeiro

Post on 07-Jul-2015

125 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 1/102

 

O bit e o byte

O tipo de dado mais utilizado pelos chips da família 80x86 não é o bit, e sim o byte. Um byte equivale a um grupo de oito bits. Parafacilitar a leitura e a compreensão, costumam-se adotar algumasconvenções:

1ª. completar com zeros os números binários para que eles se tornem

um múltiplos de quatro ou de oito bits.

Exemplo: 543 = 001000011111;

2ª. cada grupo de quatro bits deve ser separado por espaço.

Exemplo: 0010 0001 1111.

Um byte pode representar até 256 valores diferentes, pois são oito bits em potência de dois:

28 = 256.

Geralmente um byte é usado para representar valores compreendidosentre 0 e 255 não sinalizados ou valores entre -127 a 128 sinalizados.

Page 2: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 2/102

 

Para os tipos de dados, como os caracteres (letras ou símbolos), quenão possuem mais do que 256 elementos, um byte normalmente ésuficiente.

Embora sejam visualizadas como letras e símbolos, as constantescaracteres são armazenadas internamente pelo computador como umnúmero inteiro entre 0 e 255. O caracter A, por exemplo, tem valor 65; o B, 66; o C, 67; e assim por diante. Os valores numéricos doscaracteres estão padronizados em uma tabela chamada de American

Standard Code for Information Interchange Table ou simplesmentetabela ASCII .

Um grupo de 16 bits denomina-se word, ou palavra. Com 16 bits podemos representar até 65.536 (216) valores diferentes: 0 a 65.535não sinalizados e -32.767 a 32.767 sinalizados. Um dos principaisusos para a palavra são para os valores de inteiros.

Um grupo de 32 bits denomina-se double words. Com 32 bits

 podemos representar uma infinidade de tipos de dados, como por exemplo valores ponto flutuante de 32 bits. São 4.294.967.296 (232)valores diferentes: 0 a 4.294.967.295 não sinalizados e-2.147.483.647 a 2.147.483.647 sinalizados.

Um pouco de história

Ocorreu em junho de 1983, a primeira utilização de C++ fora de umaorganização de pesquisa. Podemos considerar C++ um resultadoevolutivo da linguagem de programação BCPL, criada por MartinRichards e que rodava num computador DEC PDP-7, com sistemaoperacional UNIX. Ken Thompson, em 1970, efetuou algumasmelhorias na linguagem BCPL e a chamou de linguagem "B". Em1972, Dennis M. Ritchie, no Centro de Pesquisas da Beel

Laboratories, implementou diversas melhorias na linguagem "B" que,

Page 3: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 3/102

 

considerada uma sucessora de "B", foi chamada de "C", rodando pela primeira vez num DEC PDP-11, em sistema operacional UNIX.

O poder da linguagem "C" logo foi demonstrado, em sua primeiraaplicação de peso, quando foi usada para reescrever o sistemaoperacional UNIX, até então escrito em linguagem assembly.

Com o tempo, a linguagem "C" tornou-se bastante popular eimportante. Contribuiriam para o sucesso o fato de essa linguagem possuir tanto características de baixo nível quanto de alto nível; a portabilidade da linguagem, ou seja, poder ser usada em máquinas dediferentes portes e diferentes sistemas operacionais; bem como o fatode, em meados de 1970, o sistema operacional UNIX ser liberado para as Universidades, deixando de ficar restrito aos laboratórios. Por volta de 1980, várias empresas já ofereciam diversas versões decompiladores "C", compatíveis com outros sistemas operacionais,além do original UNIX.

Bjarne Stroustrup criou C++. Claramente, como pondera Stroustrup,C++ deve muito a "C" que foi mantida como um subconjunto.Também foi mantida a ênfase de "C" em recursos que sãosuficientemente de baixo nível para enfrentar as mais exigentestarefas de programação de sistemas. Outra fonte de inspiração paraC++ foi Simula67, da qual C++ tomou emprestado o conceito deClasses.

Desde 1980, versões anteriores da linguagem, conhecidas como "Ccom Classes" têm sido utilizadas. O nome C++, criado em 1983 por Rick Mascitti, representa as mudanças evolutivas a partir de "C",onde "++" é o operador de incremento em "C".

Bjarne Stroustrup projetou C++ basicamente para poder programar sem ter de usar Assembler, "C" ou outras linguagens de alto nível.Seu principal objetivo era tornar a escrita de bons programas mais

fácil e mais agradável para o programador individual.

Page 4: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 4/102

 

Em março de 1998, o American National Standards Institute (  ANSI  )

aprovou e publicou um padrão para a linguagem C++. A padronização melhora a portabilidade e a estabilidade dos programas.Usando a biblioteca Standart de C++, podemos, rapidamente,construir aplicações confiáveis, bem como mantê-las com menoscusto e esforço.

Desde seu desenvolvimento por Dr. Bjarne Stroustrup, C++ foiextensamente usado na construção de grandes e complexasaplicações como telecomunicações, finanças, negócios, sistemasembutidos e computação gráfica. A padronização final da bibliotecade C++ torna mais fácil o seu aprendizado, facilitando seu uso por uma grande variedade de plataformas, o que, por outro lado, significagarantia de colocação profissional permanente para os bons programadores da linguagem.

ConceitosPodemos classificar as linguagens de programação em dois grupos:aquelas consideradas de baixo nível e aquelas consideradas de altonível.

1º. Linguagens de baixo nível.

Quando nascemos, à medida que crescemos, nossa percepção e ocontato com a realidade do mundo, nos anexa às coisas como elas jáforam sedimentadas na cultura de um povo. Assim também ocorrecom o idioma e, de um modo geral, com algumas ciências queassimilamos em sequer darmos conta disso.

Por exemplo, quando uma criança conta para outra que possui trintaou quarenta figurinhas, não percebe, mas está fazendo uso do sistema

numérico decimal (base 10). E o sistema numérico decimal estáincrustado em nosso cotidiano. Via de regra, todos os valores que

Page 5: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 5/102

 

usamos e todas as contas que fazemos têm esse sistema numéricocomo base. Por exemplo, quando escrevo 543, você entende 543 enão tem dúvidas, pois sabe o que 543 significa. Raciocinando emsistema numérico decimal, também não é difícil compreender que:

543 = (5 x 10²) + (4 x 10¹) + (3 x 10º)

 pois

543 = (5 x 100) + (4 x 10) + (3 x 1)

 pois

543 = 500 + 40 + 3.

Infelizmente, os sistemas computacionais não representam valoresusando o sistema numérico decimal. Internamente, os computadoresrepresentam valores usando dois níveis de voltagem (normalmente0v e +5v). Com esses dois níveis de voltagem, nós podemosrepresentar dois valores. Por convenção, adota-se o zero e o um.Então, para todos os efeitos, os computadores só conhecem umalinguagem que é constituída por zeros e uns, ou código de máquina,mais conhecida por linguagem binária. Nesse contexto, se quisermosrepresentar o número 543, devemos escrever:

1000011111

Qualquer quantia de dígitos binários com valor igual a zero podeanteceder um número binário sem alterar-lhe o valor. Por exemplo, podíamos representar o número 543 assim:

00000000000000000000000000000000001000011111.

Page 6: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 6/102

 

Ante o exposto, não fica difícil compreender que a menor unidade dedados num computador é um dígito binário. Um dígito binário é omesmo que um bit, abreviatura de binary digits.

Complicado? No início da era dos computadores (aqueles gigantes àválvula), os programas eram escritos basicamente em binário, mas,felizmente, longe se vão os dias em que se precisava programar diretamente em binário, embora ainda exista quem trabalhe nesta base.

O sistema numérico binário tem um modo de funcionamentosemelhante ao sistema numérico decimal, porém com duas diferenças básicas:

1ª. o sistema numérico binário contém apenas os dois valores 0 e 1,em vez de 0, 1, 2, 3, 4, 5, 6, 7, 8 e 9; e

2ª. o sistema numérico binário usa potências de 2, em vez de potências de 10.

Embora um bit seja capaz de assumir apenas dois valores (zero eum), o número de elementos que se pode representar com um único bit é infinitamente grande. Por exemplo, pode-se representar quaisquer dois valores diferentes com um único bit: falso ouverdadeiro, maior ou menor, redondo ou quadrado e assim por diante,numa lista incomensurável. Todavia, esse tipo de construção não éusual.

Um sério problema com o sistema binário é o tamanho de suasrepresentações. Veja bem, enquanto a versão decimal de 543 contémapenas três dígitos: 5, 4 e 3, a representação binária do mesmo valor contém dez dígitos: 1000011111. Disso decorre que, ao se trabalhar 

com valores grandes, os números binários rapidamente se tornamdifíceis de ser controlados. Embora seja possível converter binários

Page 7: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 7/102

 

em decimal e vice-versa, tal tarefa não é simples nem trivial. Mas éessa a linguagem que a máquina entende.

Alternativamente, tentou-se programar em hexadecimal, que poderepresentar dezesseis valores entre 0 e 15 decimais. Os númeroshexadecimais possuem duas características positivas:

1ª. sua conversão para binário é relativamente simples; e

2ª. são razoavelmente compactos.

O sistema hexadecimal é uma base de numeração que começa a ser contado no "0" e termina em "F":

0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F.

O sistema hexadecimal possui uma relação simples com o sistema binário, uma vez que para cada grupo de quatro dígitos bináriostemos um em hexadecimal.

veja a tabela abaixo:

decimal binário hexadecimal

1 0001 1

2 0010 2

3 0011 3

4 0100 45 0101 5

Page 8: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 8/102

 

6 0110 6

7 0111 7

8 1000 8

9 1001 910 1010 A

11 1011 B

12 1100 C

13 1101 D

14 1110 E

15 1111 F

16 0001 0000 1017 0001 0001 11

18 0001 0010 12

19 0001 0011 13

20 0001 0100 14

21 0001 0101 15

22 0001 0110 16

23 0001 0111 1724 0001 1000 18

25 0001 1001 19

26 0001 1010 1A

27 0001 1011 1B

28 0001 1100 1C

29 0001 1101 1D

30 0001 1110 1E31 0001 1111 1F

32 0010 0000 20

Existem algumas convenções que devem ser adotadas para sediferenciar os sistemas numéricos:

Page 9: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 9/102

 

1ª. pode-se colocar um sufixo "d" num valor decimal;

2ª. a letra "b" deve ser colocada no final de todo e qualquer valor 

 binário. Exemplo: 1011 0001b

3ª. a letra "h" deve ser colocada ao final de todo e qualquer valor hexadecimal. Exemplo 4D5Fh;

 Não há necessidade de enfatizar que a programação em hexadecimal,

embora menos complexa que a binária, continuava sendodemasiadamente complicada e demorada.

 Nesse contexto, surge uma nova linguagem de programação: oAssembly, uma linguagem de símbolos designados mnemónicas, quesão instruções Assembly. Cada mnemónica tem a suacorrespondência em um comando elementar inteligível pelocomputador. Nesse tipo de programação, o programador trabalha

diretamente com registradores da CPU e com a memória, entre outrascoisas.

Programar em Assembly significa conversar quase que diretamentecom a CPU, tal qual os sistemas binário e hexadecimal. Ou seja,nesses tipos de programação, o programa é escrito em umalinguagem muito próxima àquela que a máquina entende, e por issosão as linguagens ditas de baixo nível.

Abaixo, exemplo de instrução em Assembly:

a 100

MOV AX, 20

MOV BX, 30

Page 10: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 10/102

 

ADD AX, BX

 NOP

Do exemplo, AX e BX são registradores internos da CPU. Ocomando “a 100” determina o endereço inicial para o programa em0100h; o programa executa o seguinte: move para o registrador AX ovalor 20; move para o registrador BX o valor 30; soma o conteúdo doregistrador AX com o conteúdo do registrador BX e deixa o resultadoem AX; e a instrução NOP finaliza o programa.

2º. Linguagens de alto nível

Quando nos referimos às linguagens de alto nível, estamos falandodaquelas que são escritas em um distanciamento relativo da

linguagem máquina. Ou seja, as linguagens de alto nível são aquelasque se aproximam da linguagem humana, como a Linguagem Basic,C++, Pascal, Java etc.

Por exemplo, Para fazer uma frase aparecer na tela no DarkBASIC, basta digitar:

PRINT " Esta frase que está entre aspas será exibida na tela! "

Veja agora, a mesma frase em linguagem C:

Page 11: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 11/102

 

main()

{

 printf (" Esta frase que está entre aspas será exibida na tela! ");

exit (0);

}

Em Pascal:

 program

 begin

write (" Esta frase que está entre aspas será exibida na tela! ");end

Visualmente, o que diferencia estas linguagens de programaçãodaquelas ditas de baixo nível é justamente o fato de nestas linguagens podermos encontrar algum sentido naquilo que estamos lendo ouescrevendo. Um simples programa como este que foi apresentadonessas linguagens de alto nível, seria praticamente ininteligível paranós, se fosse escrito em binário.

Page 12: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 12/102

 

De uma forma simplista, podemos dizer que nas linguagens de altonível, o próprio programa tradutor (compilador ou interpretador) queusamos se encarrega de conversar com a máquina, transformandotodos os comandos que inserimos no programa para uma linguagem

que a máquina compreenda qual a resposta a ser dada. Ou seja, otradutor converte o código-fonte em um código executável pelamáquina.

Cuidados gerais

Ao escrever um código-fonte em C++, algumas precauções extrasdevem ser adotadas.

1. Deixar o código o mais claro e compreensível possível, inserindo

comentários e usando-os adequadamente, bem como tomar 

bastante cuidado com a grande liberalidade na forma que o

 formato livre admite.

 Documentar o trabalho

Em princípio, comentários são textos que inserimos no programa para esclarecer qual é a tarefa que determinado comando realiza.

Comentários são muito importantes em nossos códigos C++. Alinguagem C++ suporta dois estilos de comentários:

a) comentário no estilo C : /* ...*/

/* Neste tipo de comentário, tudo aquilo que estiver inseridoentre achave de abertura do comentário (barra e asterisco) e a chave

de fechamentodo comentário (asterisco e barra) será desconsiderado pelocompilador,

Page 13: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 13/102

 

independentemente da quantidade de linhas usadas. */ 

 b) comentário no estilo C++: //

// Neste tipo de comentário, tudo aquilo que estiver inseridoà direita// do comentário (barras duplas), até o final da linha// será desconsiderado pelo compilador.// Neste estilo, a cada nova linha,// precisamos iniciar um novo comentário.

Outra aplicação que podemos dar aos comentários, é a de tirar,temporariamente, a validade de uma parte do programa:

cout << " Esta mensagem aparece na tela! \n";// cout << " Esta mensagem não aparece na tela! \n";/* cout << Esta mensagem não aparece na tela! \n"; *

Uma vez iniciado um comentário no estilo C , não podemos inserir outro comentário dentro deste, pois o compilador considerará apenasa primeira chave de fechamento, o quê ocasionará um erro:

/* Abrimos um comentário no estilo C; /* até a primeira chavedefechamento não há problemas, pois a abertura desse novo

comentário,na verdade não ocorreu, sendo considerada parte integrante docomentário inicial */ aqui começa a parte ilegal docomentário, e ocompilador deve acusar o erro */

Cuidado com o formato livre

Page 14: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 14/102

 

Há uma grande liberalidade na forma em que podemos escrever umcódigo C++, o que significa que o posicionamento de algunscomandos ou caracteres dentro do texto, de regra, não influenciarãono resultado da compilação. Esclarecendo melhor, espaços,

tabulações, retornos ou comandos escritos em novas linhas sãocaracteres desconsiderados pelo compilador.

Abaixo transcrevemos um mesmo programa escrito de três formasdiferentes:

 void main( void ){

cout << " C++ possui formato livre!!!\n";getch();}

 void main(

 void 

){cout

 <<" C++ possui formato livre!!!\n";getch();}

 void main( void ){cout << " C++ possui formato livre!!!\n";getch();}

Page 15: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 15/102

 

O resultado apresentado pelo programa acima é rigorosamente omesmo em qualquer das três hipóteses.

Evidentemente, se, quando trabalharmos num projeto, não tivermoscuidado de escrever um bom e legível código, o resultado poderáapresentar-se bagunçado, dificultando sua compreensão e, atémesmo, a localização e conserto de bugs (erros no código que afetamdiretamente o resultado) no programa.

Certamente em pouco tempo você já estará desenvolvendo sua própria técnica para escrever bons programas, usando o formato livrea seu favor.

2. Cuidado com o uso de letras maiúsculas e minúsculas

C++ é Case Sensitive

C++ é Case Sensitive, isto é, letras maiúsculas e minúsculas sãointerpretadas de forma diferente pelo compilador. Dentre outrasimplicações, isso significa que se, por acaso, declararmos umavariável com o nome Temp, os seguintes nomes terão significadosdiferentes: TemP ; TEMP ; temp; tEmp; TeMp. Atenção especialdevemos ter quando escrevemos os comandos da linguagem nasinstruções dos códigos-fontes, bem como com algumas funções pré-

existentes. Boa parte desses comandos são digitados com letrasminúsculas, como por exemplo: cout, cin, if, else, while, do ... while,

 for, switch ... case, include, iostream.h, conio.h, open() , getch() ,define, undef, \n, \t, \a etc. Mas essa regra, dependendo docompilador, não é absoluta e comporta exceções, como algumasfunções ou classes internas do C++ Builder , como ShowMessage()ou AnsiString ou quando, por exemplo no IBM-PC, trabalhamoscom os 128 caracteres adicionais da tabela ASCII , pois neste tipo dedado, trabalhamos com o código do símbolo na base hexadecimal.

Page 16: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 16/102

 

É bastante comum erros de compilação por causa da sensitividade deC++, mas esse não é um erro difícil de se corrigir.

o programa main()

Todo programa C++ deve ter uma função principal denominadamain(), não podendo haver outra função com esse mesmo nome,sendo que a execução do programa sempre será iniciado em main().

O menor programa possivel em C++ é:

main() {}

Ele define a função main, que não recebe nenhum argumento e nãodevolve nada. O programa logo encerra e o máximo que se percebe éuma janela piscando rapidamente na tela.

Em se tratando aplicações tradicionais Windows, necessário far-se-áentendermos a função WinMain. Em capítulos posteriores,estudaremos essa função com detalhes

 primeiro programaDiversos programas-exemplo serão apresentados durante este curso,sendo que os mesmos foram processados no C++Builder 5.02, C+

+Builder 3, C++Builder 4  e no C++Builder 6 , todos da Borland.Alguns desses programas foram escritos com o intuito de ilustrar ostópicos apresentados; outros, para deixar o curso mais interessante.Sendo assim, procuraremos apresentar tutoriais sobre a confecção de programas, que irão se completando aos poucos, à medida queavançamos no curso. No final, tudo deverá fazer sentido.

Page 17: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 17/102

 

O código-fonte de um programa C++ pode ser escrito em qualquer editor de texto simples que possa salvar seu conteúdo em formato detexto puro. Podemos, inclusive, usar o Bloco de Notas do Windows.Porém, no lugar da extensão .txt , devemos salvar os códigos do programa com extensão .cpp. Contudo, a forma mais rápida e sensatade se escrever um programa C++ é usando o próprio editor decódigos que acompanha o ambiente de desenvolvimento C++.Esclarecemos aqui que muitos exemplos deste livro estão redigidoscom fonte formatada (itálica, negrito, colorida etc) apenas para finsdidáticos e para facilitar uma eventual localização no mesmo. Umcódigo-fonte C++ não deverá ser escrito com este formato e sim,conforme já exposto, em formato de texto puro, não formatado. Se

você está procurando um bom editor de códigos para seus programas,nos atrevemos a indicar o ConTEXT . Usamos esse editor grandemente na elaboração destas páginas. Com ele ficou muito fácil padronizar a visualização dos códigos fontes, bem como exportar osmesmos, já formatados, para o padrão .html ou .rtf . Para maioresinformações, consulte http://www.fixedsys.com/context 

Inicialmente, para compreendermos melhor o conceito dos comandos

e das instruções em C++, trabalharemos um programa definido comoaplicação Console Win32, que gera programas parecidos com o DOS

quando estão rodando, mas, na realidade, trata-se de programas de 32 bits executados no ambiente Windows.

Bem, chega de conversa e vamos por as mãos na obra:

1. inicialize o C++Buider ;

Page 18: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 18/102

 

2. dê um clique no menu File;

3. dê um clique em New...

4. Na janela que se abrir, selecione a opção Console Wizard e cliqueem OK ;

5. selecione Console em Window Type e clique em finish.

Page 19: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 19/102

 

O Builder C++, abrirá o editor de textos para você. É nesta janelaque digitaremos o código-fonte de nosso programa.

Observe o próprio BuiderC++, por default (padrão), já digita parte docódigo que usaremos. Porém essa sugestão da Borland, neste tipo de

Page 20: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 20/102

 

aplicação Console Wizard, em princípio, pode ser ignorada,conforme demonstramos abaixo. Você pode optar por qualquer umadas duas formas para desenvolver seus programas:

 Na sugestão da Borland:#pragma hdrstop #include <condefs.h> 

//----------------------------------------------------------------

#pragma argsused int main(int argc, char* argv [])

{return 0;}

devemos digitar o código-fonte de nosso programa imbricando-o nocódigo pré-estabelecido acima.

Outra opção que temos é deletar todo esse código e simplesmenteiniciar nosso programa a partir do código já visto do menor programa possível em C++:

main(){}

Esse modelo é aconselhável, se você estiver usando outro tipo decompilador. Caso haja algum conflito entre o exemplo apresentado eo seu compilador, procure ajuda no manual do mesmo.

 Nosso primeiro programa, ao ser compilado, escreverá na saída devídeo uma string (cadeia de caracteres) com um espaço de tabulaçãona segunda linha da tela, levará o cursor para a terceira linha da tela,emitirá um beep e, por fim, aguardará que uma tecla qualquer seja pressionada para encerrar a aplicação.

Page 21: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 21/102

 

Delete toda a sugestão da Borland e, no editor de textos, digite:

#include <iostream> #include <conio> 

main(){std ::cout << "\n\tEstou fazendo o meu primeiro programa\n\a";getch();}

Se preferir manter a sugestão da Borland, o código deverá ficar assim:

#pragma hdrstop #include <condefs.h> #include <iostream> #include <conio> 

//---------------------------------------------------------------------

------#pragma argsused int main(int argc, char* argv []){std ::cout << "\n\tEstou fazendo o meu primeiro programa\n\a";getch();return 0;}

Para Salvar, clique o menu File, escolha a opção Save e, na pasta desua preferência, salve o programa com o nome PrimProgram.bpr .

Agora vamos rodar o programa para ver o resultado.

Compilar significa converter o código-fonte em linguagem que o processador (CPU) entenda, ou seja, em código de máquina,reunindo todos os comandos em um só arquivo. Linkeditar é

Page 22: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 22/102

 

transformar esse código fonte em um executável - um .exe (programa pronto).

Para executar o programa, nós podemos pressionar a tecla F9, ou podemos dar um clique em Run no menu Run, ou podemos clicar aseta verde (Run F9) sob o botão Open Project.

Feito isso, seu primeiro programa produzirá um executávelsemelhante à figura abaixo:

Page 23: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 23/102

 

Muito bem, salvado o programa, encerre o aplicativo C++Builder .Abra a pasta onde você salvou o projeto PrimProgram.bpr e observeque o compilador colocou lá cinco arquivos:

 PrimProgram.bpr 

 PrimProgram.cpp

 PrimProgram.exe

 PrimProgram.obj 

 PrimProgram.tds

Page 24: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 24/102

 

Ora, mas vejam só, nós já temos um arquivo .exe

( PrimProgram.exe) em nossa pasta! Inicialize-o e perceba que onosso primeiro programa já roda sem auxílio do compilador. Pois bem, pressione uma tecla qualquer para encerrar o aplicativo e dê um

(ou dois) clique(s) em PrimProgram.bpr para ver o que acontece: ...Estamos de volta no ambiente de desenvolvimento do primeiro programa.

A seguir, procuraremos entender como conseguimos criar esse programa. Na explanação, aparecerão nomes como Classes, objetos,

macros, funções etc, que talvez lhe pareçam estranhos eincompreensíveis. Não se preocupe, pois, no momento certo, tudo

ficará claro.

diretivas de pré-processador 

O pré-processador C++ é um programa que fornece mecanismos parainclusão de arquivos-textos, cabeçalhos padrão e compilaçãocondicional baseada em macros. Esse programa também pode ser usado para definir e usar macros.

Talvez você esteja se perguntando: afinal, o quê quer dizer esse

monte de coisas?

Por enquanto, apenas para elucidar nosso primeiro programa semtumultuar nosso entendimento, vamos nos contentar com umaexplicação bem singela:

O pré-processador C++ é um programa que roda antes do compilador e, baseando-se em certas instruções denominadas diretivas de

Page 25: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 25/102

 

compilação, examina o programa fonte e implementa-lhe algumasmodificações.

As diretivas de compilação mais comuns são:

#include

#define

#line

#ifdef 

#ifndef 

#if 

#else

#elif 

#endif 

#undef 

#error 

#pragma

Algumas particularidades:

1ª. todas as diretivas iniciam com #;

2ª. devemos respeitar a regra de colocar somente uma diretiva emcada linha. Ou seja, não podemos colocar outro comando qualquer nalinha em que há uma diretiva.

Page 26: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 26/102

 

a diretiva #include

Imagine que muitos dos resultados que esperamos obter de nossos

 programas já estão, de certa forma, prontos, na biblioteca padrão, para ser inseridos em nosso código-fonte. Ou seja, não temosnecessidade de desenvolver determinados arquivos (classes, funções

ou gabaritos) porque eles já existem e podem ser usados em qualquer momento que precisemos deles.

Quando o pré-processador encontra a diretiva #include em nossocódigo fonte, substitui a mesma pelo conteúdo do arquivo indicado(no nosso exemplo, o conio e o iostream ). O resultado é que ocompilador encontrará e processará o arquivo implementado, e não adiretiva de compilação.

A diretiva #include é um mecanismo de tratamento do código-fonteque reúne, em um único arquivo de compilação, códigos (arquivos decabeçalho ou hearder files, ou arquivos que contenham funções ou

definições de dados) que se encontram dispersos em vários arquivos.

Para incluir os herder files em nosso código-fonte, devemos usar ossímbolos < e > ou " e " para envolver o arquivo de cabeçalho:

#include <iostream>

ou

#include "iostream.h"

Page 27: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 27/102

 

Se deixarmos espaço entre o caracter < e o nome do arquivo decabeçalho, ou entre o caracter " e o nome do arquivo de cabeçalho, ocompilador indicará erro:

< iostream.h> // [C++ Error] Project2.cpp(4): E2209 Unable to open

include file ' iostream'  .

Convencionou-se usar para os arquivos de cabeçalho o sufixo .h e para outros tipos de arquivos que contenham funções ou definiçõesde dados, o sufixo .hpp,  .c, ou .cc , .cpp , .cxx  ,  .C , conforme ocompilador. No caso do C++Builder , o arquivo que se encontraassociado é o .hpp, responsável pela interface com a VCL, que foiescrita em Object Pascal.

Historicamente, o sufixo  .h era padrão para todos os arquivos decabeçalho. Entretanto, para evitar problemas de compatibilidade comcabeçalhos de versões redefinidas de biblioteca padrão, ou comnovos recursos de biblioteca que foram surgindo, resolveu-sesuprimir o sufixo .h dos nomes de cabeçalho padrão (podemos dizer que cabeçalho padrão é o arquivo de cabeçalho definido na biblioteca padrão). A partir de então, nenhum sufixo é necessário paracabeçalhos da biblioteca padrão: <iostream>, <conio>, <map> etc.

A principal diferença entre a biblioteca padrão e a não padrão é que,enquanto uma biblioteca não padrão tem de ser incorporadamanualmente, a padrão é incorporada automaticamente pelo

compilador. É importante saber, ainda, que os recursos da biblioteca padrão estão definidos num ambiente de nomes chamado std  eapresentados como uma série de cabeçalhos.

o arquivo de cabeçalho iostream

Para o nosso programa imprimir a string Estou fazendo o meu primeiro programa no vídeo, nós providenciamos para que a Classe

Page 28: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 28/102

 

iostream fosse chamada à compilação através da diretiva #include. A biblioteca iostream contém as declarações necessárias ao uso de streams de entrada (teclado) e saída (vídeo), como, por exemplo, oobjeto cout  e o operador de inserção <<. Obtém-se o operador de

inserção << digitando-se o caracter "menor que" duas vezes.

O objeto cout é o responsável pela saída, no console ou na tela, da string que digitamos: Estou fazendo o meu primeiro programa.

O operador de inserção << (envie para) escreve o argumento dadireita (a string ) no da esquerda (no cout ).

Além do cout e do operador de inserção << a Classe iostream contémoutras definições de impressão e leitura (I/O), que estudaremos maisadiante.

Você deve ter notado que demonstramos a inclusão dos arquivos de

cabeçalho da Classe iostream de três modos diferentes:

#include <iostream> // Cabeçalho padrão sem sufixo .h

#include "iostream.h" // Cabeçalho de biblioteca não padrão

#include <iostream.h> // Cabeçalho padrão com sufixo .h

 Não há necessidade de inserirmos nenhum sufixo para cabeçalhos da biblioteca padrão, porque os símbolos < > já denotam o chamamentode cabeçalhos padrão. Contudo, as declarações dos cabeçalhos maisantigos, são colocadas no ambiente de nomes global, carecendo dosufixo .h.

Page 29: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 29/102

 

Os cabeçalhos colocados entre aspas " " determinam que o pré- processador procure o cabeçalho primeiro no diretório atual, e depoisna biblioteca padrão ( Include).

Em nosso programa: #include<iostream> instrui o pré-processador aincluir os recursos de entrada e saída de iostream padrão, e std ::cout 

determina a inclusão do cout padrão.

Se quisermos, podemos tornar todos os nomes std globais, o que nos poupa da tarefa de ter que digitar constantemente o prefixo std ::antes de cout :

#include <iostream>

using namespace std;

Se algum dos nossos programas não rodar, podemos usar uma versão

mais tradicional. Para isso colocamos o sufixo .h nos cabeçalhos eremovemos o prefixo std ::. Exemplo:

#include <iostream.h> #include <conio.h> 

main(){cout << "\n\tEstou fazendo o meu primeiro programa\n\a";getch();}

Boa parte dos programadores, talvez por praticidade, parece preferir essa segunda versão. Daqui para frente, escolha é sua!

o arquivo de cabeçalho conio

Page 30: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 30/102

 

 Nosso programa possui outro cabeçalho, o arquivo conio. Trata-se deum arquivo de inclusão necessário à utilização da função getch().Quando descrevemos o que o nosso programa faria, afirmamos que,

 por fim, ele aguardaria que uma tecla qualquer fosse pressionada para encerrar a aplicação. Essa tarefa foi desempenhada pela função getch() que retorna o caracter lido no teclado, sem imprimi-lo novídeo. Se quisermos que o caracter lido seja impresso no vídeo, podemos usar a função getche(), também integrante de a conio.

Lembra-se do menor programa possível em C++, quando afirmamosque tudo o que veríamos seria um breve piscar da janela na tela e oencerramento do programa? Pois bem, poderíamos usar  getch() parasegurar a janela na tela até que uma tecla fosse pressionada!

caracteres especiais

Antes que nossa string fosse imprimida no vídeo, o programa pulouuma linha (caracter de nova linha) e imprimiu uma caracter detabulação horizontal. Depois da string , o programa colocou o cursor na linha de baixo (nova linha) e emitiu um beep (sinal sonoro).

Como fizemos isso?

Alguns caracteres não podem ser inseridos diretamente pelo teclado.Por exemplo, se, durante a elaboração do código-fonte, no meio da

 string , pressionarmos a tecla Enter pensando que estaremosinserindo uma nova linha, faremos com que o compilador apresenteuma mensagem de erro.

A solução é usarmos algumas combinações de caracteres que

realizam essas tarefas. Essas combinações, conhecidas comoseqüência de escape, são representadas por uma barra invertida \ e

Page 31: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 31/102

 

um caracter. Por exemplo, a combinação \n representa nova linha(Enter), \t representa tabulação horizontal (Tab) e \a representa obeep. Essas seqüências de escape, nós já conhecemos. Vejamosoutras:

 Escape Nome Valor ASCII Descrição

\a Bell (alerta) 007 emite um som do computador  

\b Backspace 008 retrocede um caracter  

\n  New Line 010 envia o curso para a próxima linha

\r  Carriagereturn

013 move o cursor para o início da linha

\t  HorizontalTab

009 põe o cursor para a próxima tabulação

\xff  representação hexadecimal

\0   Null 000 exibe um caracter nulo

\"  Aspas duplas 034 exibe aspas duplas (“)

\'  apóstrofe 039 exibe apóstrofe (')

\? Interrogação 063 exibe ponto de interrogação\\ Barra invertida 092 exibe barra invertida

 string(s) de texto

Constante caracter é uma letra ou símbolo colocado entre apóstrofes:' a' , 'b' , ' ~' , '  A' , '  B' , ' \n, ' \r ' , ' \xa0' , '\xa2' , ' xa3' etc.

Uma importante atividade nos programas em geral é a manipulaçãode textos como palavras, frases, nomes etc. Na realidade, esses textossão constantes string (s), que se compõem de um conjunto decaracteres colocados entre aspas: "Estou fazendo o meu 

 primeiro programa", "constante string", "\tOuviram 

do Ipiranga as margens pl\xa0" "cidas\n\tde um povo her\xa2ico o brado retumbante\n\te o sol da

Page 32: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 32/102

 

liberdade em raios f\xa3lgidos,\n\tbrilhou no c\x82u da P\xa0tria nesse instante.\n"

 funções

 Funções são a base de qualquer programa C++. Elas compõem, juntamente com as Classes, os blocos construtivos da linguagem.Dentro das funções, encontramos todos os comandos executáveis,sendo que as mesmas são a maneira típica de se obter algumaexecução em C++.

Vamos reescrever o primeiro programa. Por enquanto, não queiracompreender todos os detalhes da alteração, uma vez que, por ora,nossa preocupação é apenas esclarecer, sem pormenores, quais são oselementos básicos de uma função. Em outra seção deste curso,abordaremos as funções de uma forma mais abrangente e minuciosa.

Inicialize PrimProgram.bpr , caso não esteja com ele aberto. Nocompilador, clique em Edit e depois em Select All; Cliquenovamente em Edit e depois em Delete. Agora copie o códigoabaixo no editor de textos do compilador.

/*Dica: não use o recurso de copiar e colar códigos-fontesquando estiver estudando.

Procure digitar todo o código e entender o resultado que cada. instrução

conhecida produzirá no programa.*/ 

#include <iostream> #include <conio> using namespace std ; // torna todos o nomes std globais

 void ModifPrimProg ( void ); // declara a finção ModifPrimProg 

int main() // estamos em main(){ModifPrimProg (); // chama a função ModifPrimProg return 0;} // fim de main()

 void ModifPrimProg ( void ) // cabeçalho da definição da função{

Page 33: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 33/102

 

cout << "\n\t\tModificando o primeiro programa.""\n\n\n\t\tDigite dois caracteres mas veja ""s\xa2 o primeiro: ";getche(); // retorna e imprime o caracter lido no vídeocout << '\a'; // beep - sinal sonoro

getch(); // retorna o caracter sem imprimi-lo no vídeo

} // fim de ModifPrimProg()

Execute o programa e volte aos estudos.

Com essa pequena alteração no código, podemos visualizar melhor alguns detalhes sobre as funções.

Uma função deve ter a seguinte forma geral:

tipo nome(declaração dos parâmetros)

{

 Primeira_Instrução;

 Segunada_Instrução;

 Etc_instrução;

}

 Nosso programa agora possui quatro funções: main(),ModifPrimProg (), getche() e getch(). O nome delas é: main,ModifPrimProg , getche e getch respectivamente. A função main(),como sabemos, é a principal, é aquela onde a execução do programase inicia; ModifPrimProg () é uma função que não estava em biblioteca alguma, tendo sido criada por nós; getche() e getch() nóstambém já conhecemos do arquivo de cabeçalho conio.

Page 34: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 34/102

 

Precedendo o nome da função main() temos o tipo int, que informaao compilador que main() pode retornar um tipo int. Já a funçãoModifPrimProg () é do tipo void. O tipo void significa que a funçãonão possui valor de retorno. Quando nenhum tipo de retorno for 

especificado, presume-se o valor de retorno int para a função. Asfunções retornam valores por meio do comando return.

Após o nome de qualquer função temos parênteses de abertura "(" ede fechamento ")". Nesses parênteses, informamos ao compilador alista de parâmetros que a função pode receber. Logo,ModifPrimProg (void) não pode receber nenhum parâmetro por causado tipo void.

Entende-se por cabeçalho da definição da função o conjunto tiponome(declaração dos parâmetros) que antecede a chave "{" deabertura do corpo da função. Entre a chave de abertura "{" e a defechamento "}" do corpo da função, encontramos as tarefas(instruções) que a mesma realiza.

Instruções são as tarefas que determinados comandos realizam. Todainstrução é encerrada com um ponto e vírgula ";":

cout << "uma instrução!";

getch();

return 0;

A falta do ponto e vírgula ensejará mensagem de erro pelocompilador. Porém, não se coloca ponto e vírgula após as chaves deabertura e fechamento das funções.

 Não se preocupe em entender, por ora, todos os conceitosapresentados, posto que os abordaremos novamente no correr do

Page 35: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 35/102

 

curso. Até aqui, tivemos apenas a intenção de colocá-los em contadocom o ambiente de programação C++Builder e com os fundamentosda linguagem C++.

 Imprimindo dados nos componentes

Se você ainda não se sente familiarizado com o C++Builder, ou nãose sente seguro para a respeito da forma correta de se colocar componentes nos formulários ( Forms), antes de prosseguir no curso,dê uma olhada nas seguintes lições:

 Introdução ao BCB

 Introdução ao BCB - 2ª parte

Podemos inserir palavras, textos ou frases em diversos componentesatravés códigos ou de suas propriedades no Object Inspector . Essas propriedades, uma vez demarcadas, determinam o modo que o

 programa iniciará a sua execução. Podemos, posteriormente, emtempo de execução, alterar essas propriedades de diversas formas,conforme o caso.

Exemplos: No Object Inspector , mude o texto da propriedadeCaption do Form, de um Label , de um botão, e assim por diante evisualize, já no projeto, o resultado da alteração.

Page 36: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 36/102

 

Outros componentes, derivados de outros ramos, possuem outrasformas de ser alterados. Por exemplo, altere a propriedade Text deum Edit , ou de um MaskEdit ; ou a propriedade Items de um ListBox;ou as propriedades Text e Items de um ComboBox etc.

Vejamos algumas formas de inserir textos em componentes, atravésdo código, em tempo de execução://---------------------------------------------------------------------------

 void __fastcall TForm1::Button1Click(TObject *Sender )

{

Canvas-> TextOut( Canvas-> PenPos.x , Canvas-> PenPos.y ,  "Imprimindo um texto no form com o objeto Canvas" );

Label1 -> Canvas-> TextOut( Canvas-> PenPos.x , Canvas-> PenPos.y ,"Imprimindo um texto no Label com o objeto 

Canvas" );

Canvas-> TextOut( Canvas-> PenPos.x = 100, Canvas-> PenPos.y =100,

"Imprimindo um texto nas coordenadas X = 100 e Y = 100do Form" );

}

Outro exemplo://---------------------------------------------------------------------------

 void __fastcall TForm1::Button1Click(TObject *Sender )

{/* Este exemplo deve ser testado com dois cliques.O primeiro chamará a propriedade Caption; o segundo, o objetoCanvas */ Label1 -> Caption = "Testando o Caption";

/* Na linha de código abaixo, precisamos determinar umacoordenada diferenteda default (0, 0), para que esse texto não venha asobrescrever o Caption de Label */ Label1 -> Canvas-> TextOut( Canvas-> PenPos.x = 100, Canvas-> PenPos.y = 100,

"Imprimindo um texto nas coordenas X = 100 e Y = 100 do Label" );

}

Outro exemplo://---------------------------------------------------------------------------

Page 37: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 37/102

 

 void __fastcall TForm1::Button1Click(TObject *Sender )

{

Label1 -> Caption = "Testando propriedades";

Edit1-> Text = "Continuando o teste ...";ListBox1-> Items-> Add (Label1 -> Caption);ListBox1-> Items-> Add ("Testando ...");ComboBox1 -> Text = "Fala, Grande!";ComboBox1 -> Items -> Add (Label1 -> Caption);ComboBox1 -> Items -> Add ("Fala, Grande...");ComboBox1 -> Items -> Add (Edit1-> Text);

}

Outro exemplo://---------------------------------------------------------------------------

 void __fastcall TForm1::Button1Click(TObject *Sender ){ShowMessage("Alô, Thérbio!");

ShowMessage("Alô, Thérbio!""\nEstou na segunda caixa de mensagem,\n e na

terceira linha");

MessageBox (0, "Agora uma caixa de mensagens\nm\n\ta\n\t\ti\n\t\t\ts\neditada!" ,  "Caixa de Aprendizagem...", 64);

}

 Nota introdutória. No avançar deste curso, você perceberá que, propositadamente, usamos alguns nomes, comandos ou tipos dedados com os quais você poderá não estar habituado a trabalhar. Nãose assuste e nem se preocupe em querer entender imediatamentetodos os detalhes apresentados, pois tudo deverá ficar bastante clarono tempo certo. Concentre-se, basicamente, em entender amanipulação dos dados referentes ao tópico apresentado.

Conhecendo melhor as propriedades que capturam

dados

 Nos exemplos anteriores, conhecemos um modo de inserir textos ou strings nos componentes, sem nos preocuparmos de que modo isso

Page 38: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 38/102

 

nos pode ser útil. Agora aprofundaremos um pouco mais o estudo para podermos entender que essas propriedades não estão limitadas e pode produzir alguns resultados mais úteis:

 void __fastcall TForm1::Button1Click(TObject *Sender )

/* Neste exemplo, iremos corrigir uma falha referente à cor do primeiroexemplo em que usamos o objeto Canvas do Form. Como você deveter notado,as cores da frase sairam com um fundo branco (clWhite),enquento que o formmanteve a cor original clBtnFace, visto que não procedemos anenhuma alteração

nela. Para visualizar melhor essa situação, dê uma olhada na propriedadeColor do Form no Object Inspector. Pois bem, vamos corrigir acor do fundoda frase para igualá-la ao Form.*/ {// Ok. A cor do fundo igual à cor do FormCanvas -> Brush -> Color = clBtnFace;

/* A linha de código abaixo nos mostra como podemos usar  propriedades matemáticas diretamente no Form*/ Canvas-> TextOut( Canvas-> PenPos.x = 10,

Canvas-> PenPos.y = 100, (5 * 4) + (60 -

50) );/* Podemos chamar funções que nos mostrem a data e a hora...*/ Canvas-> TextOut( Canvas-> PenPos.x , Canvas-> PenPos.y , Date()/*+Time()*/ );}

Evidentemente, outros componentes também são férteis paratrabalharmos com dados:

 void __fastcall TForm1::Button1Click(TObject *Sender )

{/*Uma caixa de mensagem que pode nos mostrar a data, a hora ouambas.*/ ShowMessage( Time() /* + Date()*/ );}

Por certo, as operações abaixo já não causam muitas surpresas emvocê:

 void __fastcall TForm1::Button1Click(TObject *Sender )

Page 39: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 39/102

 

{

ShowMessage("Alô, Thérbio!\nVocê sabe qual é o resultado de ""286 multiplicado por 132 somado com 

412?");

ShowMessage((286 * 132 ) + 412 );Label1 -> Caption = (5 * 4) + 13 ; // imprime 33 no labelAnsiString a = 2 + 12 ; // AnsiString pode funcionar comointeiro ou ponto flutuante

/* neste exemplo, o sinal + neste local do código, serve paraconcatenar os dados. Só ocorre a concatenação porque usamos otipo AnsiString. Se tivéssemos usado uma variável inteira ou

 ponto flutuante, o resultado seria diferente*/ Label2 -> Caption = "Multiplicação de 14 X 14 = " + a * a;

/* produz o mesmo resultado no Label. O mesmo resultadoteríamos se

tivéssemos usados variáveis inteiras ou ponto flutuante*/ Edit1 -> Text = "****Elimina os quatro primeiros caracteres" +4;

}

Vamos aproveitar para conhecer a base do código que será usado para construirmos uma calculadora. Usaremos um Label e um Botãoqualquer no Form.

 void __fastcall TForm1::BitBtn1Click(TObject *Sender ){/* O código abaixo determina que o programa coloque no Captionde Label1tudo aquilo que já está nele e mais o número 1. */ Label1 -> Caption = Label1 -> Caption + 1;

Comentários

Quando estamos empenhados na tarefa de escrever uma aplicação, éfundamental tomarmos algumas providências para que não nos percamos nas diversas linhas de código que por ventura utilizaremos.Uma coisa muito útil que podemos, ou melhor, que devemos fazer écolocar comentários que nos esclareçam a utilidade das diversas partes do código. Evidentemente, você já tem percebido que, junto às

linhas de código, nós colocamos algumas frases esclarecedoras

Page 40: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 40/102

 

dentro de um par de barras com asterisco /* */, ou imediatamenteapós duas barras //. Essas frases são os comentários.

C++ aceita esses dois estilos de comentários:

/* Esse estilo de comentário é derivado da linguagem C. Ele éabertocom uma barra seguida de um asterisco. Tudo aquilo que estiver apósessa chave de abertura, até encontrar uma chave de fechamento(umasterisco e uma barra) será desconsiderado pelo compilador */ 

// Essas duas barras significam comentários no estilo C++.// Uma vez aberto, esse comentário não precisa ser fechado.// Mas ele só vale para a linha em que foi aberto,// a partir do ponto em que foi aberto// e até o final da linha nada mais será considerado

Comentários também podem ser úteis para tirar o efeito de

determinadas partes de código, quando estamos fazendoexperiências. Você já viu tal fato, nos exemplos que colocamos ocódigo para apresentar a data ou a hora. Se você retirar as chaves deabertura e de fechamento, perceberá que o resultado do programaserá diferente.

Abaixo apresentamos um exemplo de como podemos usar comentários para retirar efeitos de um código que já usamos

anteriormente. Compile e execute para ver que o resultado do programa será outro:

 void __fastcall TForm1::Button1Click(TObject *Sender ){// Label1 -> Caption = "Testando propriedades";// Edit1->Text = "Continuando o teste ...";/* ListBox1->Items-> Add(Label1 -> Caption);ListBox1->Items-> Add("Testando ..."); */ 

ComboBox1 -> Text = "Fala, Grande!";ComboBox1 -> Items -> Add (Label1 -> Caption);ComboBox1 -> Items -> Add ("Fala, Grande...");

Page 41: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 41/102

 

ComboBox1 -> Items -> Add (Edit1-> Text);

Tipos fundamentais

A linguagem C++ possui tipos fundamentais de dados querepresentam valores como caracteres, inteiros, pontos  flutuantes ebooleanos. Os tipos inteiro (int) e pontos flutuantes (float e double)representam os números de um modo geral. Caracteres (char)representam as letras ou símbolos e o tipo booleano (bool) oscilaentre dois valores, geralmente para representar duas situações

inversas como, por exemplo, falso ou verdadeiro. Podemos, ainda,considerar um tipo básico de dados, o tipo enum, ou enumerados, oqual nos permite definir conjuntos de constantes, normalmente dotipo int, chamados tipos de dados enumerados. As variáveisdeclaradas deste tipo poderão adquirir somente entre os valoresdefinidos.

Coloque um Memo e um Button no Form. No evento OnClick dobotão digite:

 void __fastcall TForm1::BitBtn1Click(TObject *Sender ){char ValChar = 'a';int ValInt = 100;float ValFloat = 100.78; // problemas na precisãodouble ValDoub = 9.9876543;

 bool ValBool = (2.0000 == (20 - 18 )); //Verdade: dois = avinte menos dezoitoMemo1-> Lines-> Strings[0] = ValChar ; // 1ª linha do Memoimprime: aMemo1-> Lines-> Strings[1] = ValInt; // 2ª linha do Memo

imprime: 100Memo1-> Lines-> Strings[2 ] = ValFloat; // 3ª linha do Memoimprime: 100.78...Memo1-> Lines-> Strings[3 ] = ValDoub; // 4ª linha do Memoimprime: 9.9876543

// Se a afirmação feita na declaração de ValBool é verdadeiraif( ValBool == True)/*5ª linha de Memo imprime: Afirmação Verdadeira*/ Memo1-> Lines-> Strings[4] = "Afirmação Verdadeira";else // senão - ou seja, se a afirmação é falsa/* Quinta linha de Memo imprime: Afirmação Mentirosa */ Memo1-> Lines-> Strings[4] = "Afirmação Mentirosa";

}

Page 42: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 42/102

 

 Nota: Se o programa acima não imprimir todas as linhas, pressione a teclaEnter alguma vezes para criar linhas vazias no Memo. Desta forma, as stringsserão colocadas no espaço correto. Depois (no tópico Variáveis) veremosoutra solução mais adequada para o problema!

A linguagem C++ ainda nos oferece um tipo especial que serve paraindicar, justamente a ausência de tipo: o void. No exemplo acima percebemos o uso deste tipo junto à função do evento chamado,indicando que tal função não devolverá nenhum valor. O voidtambém será é usado em funções que não requerem parâmetros.

O tipo inteiro

O tipo inteiro é um número de valor inteiro, ou seja, não fracionário.De um modo geral, trata-se de seqüências de dígitos que representamnúmeros inteiros, que podem ser escritos na base 8 (octal ), na base10 (decimal ) ou na base 16 (hexadecimal ).

Um inteiro decimal é formado pela seqüência de dígitos decimais: 0,1, 2, 3, 4, 5, 6, 7, 8, 9. Exemplos válidos para decimais são:

0 12345 1 - 89

Os números a seguir não são exemplos válidos para decimais:

00 123.4 1,0 89-8 12 34 045

OBS. Embora alguns compiladores aceitem declarações do tipo:

Page 43: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 43/102

 

int i = 123.4;

todos os números colocados depois do ponto fracionário (nesse caso,o 4) serão desconsiderados.

Um inteiro hexadecimal é formado pela seqüência de dígitosdecimais: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 combinados com letras que vão de"A" a "F" ( A, B, C, D, E, F ou a, b, c, d, e, f ). Como não há regrasque impeçam que um hexadecimal possua só valores decimais emsua composição, devemos diferenciá-los dos inteiros decimais

inserindo 0x em seus primeiros dígitos. Exemplos válidos parahexadecimais são:

0x0 0x1234 0x1 0xA 0xaBcD 0x1A9F

Os números a seguir não são válidos para valores hexadecimais:

00x 0x123.4 0x1,0 0xAGB OxaB cD FF12

Um inteiro octal é formado pela seqüência de dígitos decimais: 0, 1,2, 3, 4, 5, 6, 7. Devemos diferenciá-los dos inteiros decimaisinserindo 0 em seu primeiro dígito. Exemplos válidos para octais são:

00 012345 01 - 056

Os números a seguir não são exemplos válidos para octais:

0 0123.4 01,0 08901234

45

Page 44: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 44/102

 

Via de regra, os dados inteiros são devolvidos pelo programa noformato decimal . Desta forma, podemos testar uma aplicação, ondecolocaremos valores inteiros em vários formatos, porém os mesmossempre serão exibidos em formato decimal . Você poderá testar 

valores válidos e valores não válidos para cada base de dados evisualizar os resultados.

Coloque um Label e um Button no Form. No evento OnClick do botão digite:

 void __fastcall TForm1::Button1Click(TObject *Sender ){

// declara um valor inteiro decimal cujo nome será iint i = 43 ; // podemos substituir o 43 por hexadecimais,//octais ou outros valores decimais

Label1 -> Caption = i; // coloca i no Caption de Label1}

Compile e execute a aplicação. O Label imprimirá o número 43.Feche a aplicação e substitua o valor 43 (decimal ) no Editor deCódigos por 0x2b (hexadecimal ). Rode o programa e dê um clique no botão para ver o resultado. Agora faça a mesma experiênciasubstituindo o 0x2b por 053 (octal ). Se você fez tudo direitinho,qualquer dos testes que você executar deverá imprimir o número 43no Label do Form. Isso porque esses valores são equivalentes.Baseando-se nas explicações introdutórias sobre esses valoresinteiros e na tabela abaixo, faça mais alguns testes para compreender melhor o que ocorre a nível equivalência desses dados.

veja uma tabela inicial:

decimais octais hexadecimais

0 00 0x0

1 01 0x1

2 02 0x23 03 0x3

Page 45: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 45/102

 

4 04 0x4

5 05 0x5

6 06 0x6

707 0x7

8 010 0x8

9 011 0x9

10 012 0xA

11 013 0xB

12 014 0xC

13 015 0xD

14 016 0xE

15 017 0xF

16 020 0x10

17 021 0x11

18 022 0x12

19 023 0x13

20 024 0x14

21 025 0x15

22 026 0x16

23 027 0x17

24 030 0x18

25 031 0x19

26 032 0x1A

27 033 0x1B

28 034 0x1C

29 035 0x1D

30 036 0x1E31 037 0x 1F

32 040 0x20

Tudo pode estar parecendo muito complicado, mas não se preocupe porque o uso de valores octais ou hexadecimais não é comum. Alémdo mais, no avançar do curso (ou talvez na seção de tutoriais), nós

aprenderemos a construir uma calculadora que nos apresentará comoresultado o valor de conversão entre esses dados. Por enquanto,

Page 46: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 46/102

 

contentemo-nos com a calculadora do Windows que pode realizar esse tipo de cálculos.

Os tipos ponto flutuante

De um modo geral, podemos afirmar que os tipos ponto flutuante sãorepresentados pelos números fracionários na base decimal . Ou seja,trata-se de números, de regra, constituídos por um ponto fracionárioque não pode ser substituído por uma vírgula.

Um número de ponto flutuante pode apresentar-se na forma denotação científica. Por exemplo: 4.32 vezes dez elevado a quarta. Neste caso, o vezes dez ( X 10) é substituído por e ou E . Logo onúmero supramencionado será representado por 4.32e4, que vale43200.

OBS. Embora o C++Builder aceite a notação científica para inteiros,todos os valores que estiverem situados após um eventual pontofracionário, no resultado, serão desconsiderados.

Exemplos válidos para ponto flutuante são: 

-1.e4 12.345 .1 1.23e-2 1.23E+2

 Não podemos colocar vírgulas para representar  pontos flutuantes:12,345 // ilegal.

Page 47: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 47/102

 

Os números ponto flutuante se dividem basicamente nos tipos float edouble. Posteriormente entenderemos melhor a que se referem essesnomes.

Eis um código para visualizarmos a matéria tratada neste tópico. Paraexecutar esse código, precisaremos de um Button e dois Label (s) no

 Form. De quebra, visualizaremos um problema de precisão com otipo float.

 void __fastcall TForm1::Button1Click(TObject *Sender ){float f = 3.65e-2;double d = 3.65e-2;Label1 -> Caption = f ; // problemas de precisão com o tipofloatLabel2 -> Caption = d ;}

O tipo caracter 

O tipo caracter é uma letra ou um símbolo colocado entre aspassimples. Embora sejam visualizados como letras ou símbolos, éimportante ter em mente que, internamente, os computadoresarmazenam os caracteres como um número inteiro entre 0 e 255. Por exemplo, a letra a é associada ao número 97 , b ao 98, c ao 99, d ao100 e assim sucessivamente. Os valores numéricos dos caracteres

estão padronizados em uma tabela chamada de American Standard

Code for Information Interchange Table ou simplesmente tabela

ASCII. Então concluímos que um char tanto pode ser interpretadocomo um número entre 0 e 255, quanto pode ser interpretado comoum elemento de um conjunto de caracteres da tabela ASCII. O tipochar geralmente tem um byte, o que é suficiente para conter os 256valores mencionados.

Exemplos válidos para caracteres são:

'a' 'A' 'z' '5' '§' '%' ' ' '*'  

Page 48: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 48/102

 

 Seqüências de escape

Certos caracteres da tabela ASCII devem ser representados pelacombinação especial de outros caracteres. Essas combinações,conhecidas como seqüência de escape, são representadas por uma barra invertida ( \ ) e outro caracter . Esse grupo de dois caracteres éinterpretado como uma seqüência simples. Por exemplo, nós jáusamos em exemplo anterior, o '\n' e o '\t'. Essas combinações sãointerpretadas como nova linha ( Enter ) e Tab, respectivamente.

Abaixo, representaremos algumas seqüências de escape:

Controle/Caracter Sequencia de escape Valor ASCII

nulo (null) \0 00

campainha (bell) \a 07  

retrocesso (backspace) \b 08

tabulacao horizontal  \t 09nova linha (new line) \n 10

tabulacao vertical  \v 11

alimentacao de folha (form feed) \f 12

retorno de carro (carriage return) \r 13

aspas (") \" 34

apostrofo (') \' 39

interrogacao (?) \? 63

barra invertida (\) \\ 92

É bom notarmos que, embora alguns desses caracteres possam ser 

compilados sem a barra invertida ( \ ) em algumas aplicações pelo

C++Builder (" , ?), noutras a barra poderá fazer falta.

Coloque um Label no Form e no evento OnClick do Label digite:

Page 49: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 49/102

 

 void __fastcall TForm1::Label1Click (TObject *Sender )

{

/*Declara uma variável int chamada StrInt e atribui a ela o

valor que

será digitado no InputBox pelo usuário*/ int StrInt = StrToInt /*converte AnsiString para int*/ 

(InputBox ("Converte int para char","Digite um valor entre 0 e

255...",""));

Label1 -> Caption = char(StrInt)/*converte int(StrInt) para

char*/ ;

}

Agora rode a aplicação e faça algumas experiências, dando um cliqueem Label para inserir valores entre 0 e 255 e visualizar a

equivalência de valores entre os números e os elementos da tabela

ASCII.

 Modificadores de tipos

Podemos alterar o significado de um tipo básico de dados,adaptando-o a uma necessidade específica, por meio demodificadores de tipos precedendo os tipos na declaração:

signed (com sinal);

unsigned (sem sinal);

long (máxima precisão);

short (menor precisão).

Page 50: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 50/102

 

Tipo bytes possíveis valores

char 1 -128 a 127

unsigned char 1 0 a 255

signed char 1 -128 a 127

int 4 -2147483648 a 2147483647

unsigned int 4 0 a 4294967295

signed int 4 -2147483648 a 2147483647

short int 2 -32768 a 32767unsigned short int 2 0 a 65535

signed short int 2 -32768 a 32767

long int 4 -2147483648 a 2147483647

signed long int 4 -2147483648 a 2147483647

unsigned long int 4 0 a 4294967295

float 4 -(3.4e38) a 3.4e38double 8 1.7e308 a -(1.7e308)

long double 10 1.7e308 a -(1.7e308)

O exemplo a seguir usa um Edit , um Memo e um Button no Form.

Quando o usuário dá um clique no botão, um loop começa a contar uma seqüência de valores numéricos de caracteres para a variávelunsigned char c e só a encerra quando contar o último caracter, o denúmero 254. No corpo desse loop, nós declaramos uma variável dotipo char, que converterá os valores numéricos da variável c para oselementos correspondentes aos números na tabela ASCII, atribuindoesses valores a ch. Feito isso os valores obtidos serão imprimidos no

 Edit , exibindo as correspondências encontradas. Concomitantemente,quando o dedo do usuário deixa de fazer pressão com o mouse sobre

o botão, configurando o evento OnMouseUp, o conteúdo do Edit (no

Page 51: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 51/102

 

caso os valores 0 a 254 da tabela ASCII e mais alguns caracteres para facilitar a visualização e a leitura) é adicionado a Memo1.

 void __fastcall TForm1::BitBtn1Click(TObject *Sender ){/* Declara e inicializa com 0 uma variável do tipo unsigned char dentro de um loop for; estabelece o limite de 254 para o loop;determina o incremento da variável. */ for(unsigned char c = 0; c < 255 ; c++){/*Declara uma variável que converterá osnúmeros para o caracter da tabela ASCII*/ char ch = c;

/* Edit1 imprime os números, os caracteres correspondentes databela ASCII e mais alguns caracteres para facilitar aleitura*/ Edit1 -> Text = Edit1 -> Text + c + ' ' + '=' + ' ' + ch + ' '

+ ' ';}}

//------------------------------------------------------------------

 void __fastcall TForm1::BitBtn1MouseUp(TObject *Sender ,TMouseButton Button, TShiftState Shift, int X , int Y ){// Adiciona o conteúdo de Edit1 a Memo1Memo1-> Lines-> Add (Edit1-> Text);}

O exemplo acima pode ser modificado para exibir somente algunscaracteres ASCII. Por exemplo, após rodar a aplicação, o programaapresentará para você o número de cada caracter. Com base nestasinformações, você poderá, facilmente, montar um programa queimprima somente as letras minúsculas do alfabeto etc.

Construção do Editor de Textos

 Primeira parte

Page 52: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 52/102

 

Vamos dar os primeiros passos na construção de um Editor deTextos.

Clique em File e depois em New Application.

Pegue um componente RichEdit na palleta Win32 (ou Win95) e acoloque no Form.

Altere a propriedade BorderStyle do Form para bsNone (para tirar a barra de títulos e suas propriedades).

Altere a propriedade Align do RichEdit para alCliente (Assim o RichEdit ocupará toda a área cliente do Form).

 Na palleta Standart pegue um componente PopudMenu (paracriarmos alguns menus pop-up), e coloque no Form.

Dê um clique com o botão direito do mouse sobre o componente PopupMenu e escolha a opção Menu Designer ...

Abrir-se-á o Menu Designer ( Editor de Menus). Na propriedadeCaption (no Object Inspector ) do Editor digite:

 Arquivo

Dê um clique na parte selecionada do Menu Designer . Aparecerá a palavra Arquivo selecionada no menu flutuante, e abrir-se-á, logoabaixo, um novo campo para menu.

Dê um clique nesse novo campo (que ficará selecionado) e, na propriedade Caption, digite:

 Editar 

Muito bem, já sabemos criar o Menu Popup.Agora, no Menu Designer , onde tem a palavra Arquivo dê um clique para selecionar o menu correspondente. Depois, com o botão direitodo mouse, dê um clique sobre o menu  Arquivo já selecionado.Aparecerá um menu  Pop-up. Escolha a opção Create Submenu.

 Na propriedade Caption digite:

&Abrir 

Page 53: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 53/102

 

O Símbolo & cria um atalho (tecla de atalho + a letra sublinhada) para o menu. Abaixo do menu  Abrir , Crie o menu  Locali&zar ; abaixodo menu  Localizar crie o menu &Salvar ; abaixo do menu Salvar crieo traço separador de menus digitando apenas um traço: - ;abaixo do

traço, crie o menu Sai&r .

 Nota: quando criamos atalho, tomemos cuidado para não usar as

mesmas teclas de atalho para funções diferentes.

Construção do Editor de Textos

 Segunda parte

Agora dê um duplo clique no menu Sair . Abrir-se-á o Editor  Properties que é o Editor de Códigos do programa. Digite:

Close();

O Código deve ficar assim:

 void __fastcall TForm1::Sair1Click(TObject *Sender ){Close();}

Para ativar o PopupMenu, no evento OnCreate do Form1 digite:

PopupMenu1-> AutoPopup = true;RichEdit1-> PopupMenu = PopupMenu1;

O Código deve ficar assim:

 void __fastcall TForm1::FormCreate(TObject *Sender ){  PopupMenu1 -> AutoPopup = true;

  RichEdit1 -> PopupMenu = PopupMenu1;}

Page 54: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 54/102

 

Rode o Programa (Tecla F9). Você perceberá que criou um Editor de

Textos bem estranho. Digite ou delete letras e palavras.

Para fechar o programa, dê um clique com o botão direito do mouse

sobre o Editor e escolha a opção Sair no menu Arquivo.

Se você seguiu os passos corretamente, e o programa fechou sem problemas, na propriedade WindowState do Form1 escolha a opção:wsMaximized , e rode novamente o programa. Ele ocupará toda a tela

do Windows. Siga o mesmo procedimento para encerrar o programa.Uma outra forma de encerrar o aplicativo é pressionandosimultaneamente as teclas alt + F4 .

Construção do Editor de Textos

Terceira parte

Vamos melhorar nosso Editor.

Dê um duplo clique na propriedade Lines de RichEdit1. No editor que se abrir, delete a palavra RichEdit1 e dê um OK , o que fará queessa string não apareça mais na execução do programa.

 Na palette  Dialogs, pegue um componente OpenDialog  e coloque no

 projeto. Na propriedade InitialDir de OpenDialog   podemos digitar ocaminho do diretório onde queremos que a Caixa de Diálogo Abrir 

inicialize (por exemplo: C:\Meus documentos) e, feito isso, podemoscompletar o caminho e escolher um arquivo inicial na propriedadeFileName (por exemplo: C:\Meus documentos\Tutorial.txt ). Na propriedade Filter , nós podemos escolher os arquivos que o Editor  pode abrir, por meio do Filter Editor .

 No Filter Editor digite:

Page 55: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 55/102

 

Filter Name Filter  

arquivos richtext *.rtf *.rtf  

arquivos de texto *.txt *.txt  

todos os arquivo *.* *.*

e dê um OK .

Abra o MenuDesigner e dê um duplo clique no submenu Abrir paraabrir o Editor Properties .

Entre as chaves { e } digite:

if (OpenDialog1 -> Execute())RichEdit1 -> Lines -> LoadFromFile(OpenDialog1 -> FileName);elseMessageBeep(0);

O código deverá ficar assim:

void __fastcall TForm1:: Abrir1Click ( TObject * Sender ){  if (OpenDialog1 -> Execute())  RichEdit1 -> Lines -> LoadFromFile(OpenDialog1 -> FileName);  else  MessageBeep(0);}

 Nosso Editor já está em condições de abrir documentos. Rode o programa e abra alguns documentos de texto (*.txt ) ou richtext(*.rtf ).

Construção do Editor de Textos

Quarta parte

Page 56: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 56/102

 

Passemos ao submenu Localizar .

Coloque um componente FindDialog no projeto. Em seguida abra oMenu Designer e dê um duplo clique em Localizar . No Editor Properties,entre as chaves { e } que se abrirem, digite:

  FindDialog1-> Execute();  int FoundAt, StartPos, ToEnd ; // declara três variáveis int

//////////////////////////////////////////////////////////////////////// // INICIA A BUSCA A PARTIR DA SELEÇÃO ATUAL

// OU DE OUTRA FORMA // INICIA A PARTIR DO INÍCIO DO TEXTO 

/*SelLength devolve o número de caracteres selecionados*/   if (RichEdit1-> SelLength) /* se há caracteres selecionados em RichEdit1*/ 

/*SelStart devolve a posição do primeiro caracter selecionado no texto*/ /*o código abaixo devolve a posição do último caracter selecionado*/ 

  StartPos = RichEdit1-> SelStart + RichEdit1-> SelLength;  else  StartPos = 0;/////////////////////////////////////////////////////////////////////////// 

/*Length() retorna o número de caracteres de AnsiString*/ 

/*Ou ToEnd será igual a Text.Lengt() ou igual ao número doscaracteres a serem contados após o último caracter selecionado*/ 

  ToEnd = RichEdit1-> Text.Length() - StartPos;  /*FindText busca o texto num controle rich edit para a string 

especificada no parametro SearchStr (no exemplo: FindDialog1->FindText)*/   FoundAt = RichEdit1-> FindText(FindDialog1-> FindText,

StartPos, ToEnd , TSearchTypes());  if (FoundAt != -1) // se a variável for difetente de -1  RichEdit1-> SetFocus(); // coloca o foco em RichEdit1

// coloca o cursor na primeira ocorrência  RichEdit1-> SelStart = FoundAt;  // seleciona a string procurada no texto do RichEdit1  RichEdit1-> SelLength = FindDialog1-> FindText.Length();

 No Object Inspector , no evento ( Events) OnFind de FindDialog1escolha a opção Localizar1Click . Em Properties, dê um duplo cliqueem Options. Altere de false  para true as seguintes opções:

Page 57: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 57/102

 

 frHideMatchCase true

 frHideWholeWord true

 frHideUpDown true

Agora seu editor já se encontra apto para efetuar algumas buscas detextos ou caracteres.

Construção do Editor de Textos 

Quinta parte

Coloque um componente SaveDialog no projeto, abra o Menu Designer e dê um duplo clique em Salvar . No Editor Properties,entre as chaves { e } que se abrirem, digite:

  if (SaveDialog1 -> Execute())  RichEdit1 -> Lines -> SaveToFile(SaveDialog1 -> FileName);  else  MessageBeep(0);

Em SaveDialog , temos funcionando de forma semelhante aofuncionamento em OpenDialog , as propriedades InitialDir ,

 FileName e Filter , com a diferença de que, no presente caso, estamoscuidando de salvar arquivos, e não abri-los.

Como experiência, no Filter Editor digite:

Page 58: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 58/102

 

Filter Name Filter  

arquivos richtext *.rtf *.rtf  

arquivos de texto *.txt *.txt  

todos os arquivo *.* *.*

e escolha um diretório inicial para salvar os arquivos.

Construção do Editor de Textos

 Sexta parte

Pois bem, todos os submenus do menu Arquivo já estão funcionando.Agora vamos criar mais alguns menus e submenus.

Selecione o menu Editar no Menu Designer e crie os seguintessubmenus: Cortar , Copiar , Colar , Deletar e Selecionar Tudo.

Vamos aos códigos:

submenu Cortar :

void __fastcall TForm1::Cortar1Click( TObject * Sender )

{  TComponent * pComponent = PopupMenu1-> PopupComponent;  if ( pComponent)

{  if ( pComponent-> ClassNameIs("TRichEdit"))

((TRichEdit *) pComponent)-> CutToClipboard ();  else  MessageBeep(0);

}}

submenu Copiar 

Page 59: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 59/102

 

void __fastcall TForm1::Copiar1Click( TObject * Sender ){  TComponent * pComponent = PopupMenu1-> PopupComponent;  if ( pComponent)

{  if ( pComponent-> ClassNameIs("TRichEdit"))

((TRichEdit *) pComponent)-> CopyToClipboard ();  else  MessageBeep(0);

}}

submenu Colar 

 void __fastcall TForm1::Colar1Click(TObject *Sender ){  TComponent * pComponent = PopupMenu1-> PopupComponent;  if ( pComponent)

{  if ( pComponent-> ClassNameIs("TRichEdit"))

((TRichEdit *) pComponent)-> PasteFromClipboard ();  else  MessageBeep(0);

}}

Agora vamos trabalhar com um código mais simples nas funções Deletar e Selecionar Tudo.

submenu Deletar 

 void __fastcall TForm1::Deletar1Click(TObject *Sender ){  RichEdit1 -> ClearSelection();}

submenu Selecionar Tudo

Page 60: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 60/102

 

 void __fastcall TForm1::SelecionarTudo1Click(TObject *Sender ){  RichEdit1 -> SelectAll();}

Exercício: Pesquise TComponent no Help do C++Builder e procureentender seu papel nas funções que usaram-no. Depois insiracomentários documentando detalhadamente os códigos acima.

Construção do Editor de Textos

 Sétima parte

Abaixo do menu Editar , crie o menu Formatar com dois submenus: Fontes e Cores.

submenu Fontes

Coloque um componente FontDialog no projeto.

Eis o código:

 void __fastcall TForm1::Fontes1Click (TObject *Sender ){ /*coloca os atributos do texto selecionado no RichEdit1

em FontDialog1*/   FontDialog1-> Font-> Assign(RichEdit1-> SelAttributes);  /*Sendo chamada a caixa de diálogo de fontes*/   if(FontDialog1-> Execute())  /*as fontes selecionadas de RichEdit1 receberão os atributos

da caixa de diálogos de fontes*/   RichEdit1-> SelAttributes-> Assign(FontDialog1-> Font);

}

Page 61: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 61/102

 

Nota: TtextAttributes::Assign

Coloca as propriedades de um objeto TTextAttributes em conformidade com as propriedades especificadas emoutro objeto TTextAttributes ou num objeto TFont .

Use Assign para mudar todos os atributos de texto simultaneamente. Assign pode colocar as características dasfonts selecionadas num texto em conformidade com as características default da font ou vice-versa. Quando oinício é um objeto TTextAttributes, Assign adapta somente Color , Name, Style, e propriedades Pitch. Quandoo início é um objeto TFont , Assign também adapta o Size.

 Nota: Assign somente substitui em tempo de execução quando ´início é um objeto TTextAttributes, um objetoTFont , ou um objeto que tenha implementado um método AssignTo que trate o objeto TTextAttributes. Outrasorigens produzem exceções de erro.

Coloque um componente ColorDialog no projeto.

Eis o código:

 void __fastcall TForm1::Cores1Click(TObject *Sender ){  if (ColorDialog1 -> Execute())  /*a cor de RichEdit1 será a cor escolhida em ColorDialog1*/   RichEdit1 -> Color = ColorDialog1 -> Color ;}

O código de Cores1Click não é subsistente. Ou seja, se você alterar a

cor do editor de textos e fechar o aplicativo, na próxima vez que abrir o editor de textos, ele abrirá na cor padrão, estabelecida inicialmente

Page 62: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 62/102

 

no Object Inspector . Futuramente nós veremos um modo deconservar a cor atrávés de arquivos .INI.

Construção do Editor de TextosOitava parte

Vamos alterar algumas propriedades:

Para colocar uma barra de rolagem vertical, altere a propriedade

ScrollBarss de RichEdit1 para ssVertical .

 Normalmente os componentes Memo e RichEdit têm uma limitaçãona quantidade de dados que podem receber, que é uma quantia padrão. Podemos aumentá-la ou diminui-la bastante. Na verdade,tudo depende da quantidade de dados que trabalharemos. Para alterar essa quantia de dados devemos mudar a propriedade MaxLength (noObject Inspector ou em tempo de execução). Por exemplo, secolocarmos a propriedade MaxLength para 2147483645 (que é umtamanho praticamente incomensurável) tais componentes poderão

receber dois bilhões, cento e quarenta e sete milhões, quatrocentos eoitenta e três mil, seiscentos e quarenta e cinco caracteres.

 No momento, nosso projeto deve estar com esta aparência:

Page 63: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 63/102

 

Exercícios:

1) O submenu Localizar deve ser retirado do menu Arquivo ecolocado no menu Editar ;

2) Falta uma função que ative a impressora para imprimir textos.Providencie a colocação do componente e do código correspondente.

3) Coloque atalhos nos menus. Use as propriedades ShortCut correspondentes.

Construção do Editor de Textos

 Nona parte

Page 64: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 64/102

 

Feito isso, continuemos. Vamos dar ao nosso Editor a possibilidadede alterar seu tamanho.

Abra o MenuDesigner e, abaixo do menu Formatar , crie o menu Janela que deverá conter os seguintes submenus: Maximizar , Normal , Minimizar .

Vamos aos códigos:

 void __fastcall TForm1::Maximizar1Click(TObject *Sender ){BorderStyle = bsNone;

WindowState = wsMaximized ;}

 void __fastcall TForm1::Normal1Click(TObject *Sender ){BorderStyle = bsNone;WindowState = wsNormal;}

 void __fastcall TForm1::Minimizar1Click(TObject *Sender ){BorderStyle = bsSizeable;WindowState = wsMinimized ;}

Execute o programa e experimente todos os menus. Observe se todosos comandos estão obedecendo perfeitamente. Caso haja algum problema, dê uma olhada se não digitou algum código errado.

Agora vamos deixá-lo mais parecido com aqueles editores que

estamos acostumados a trabalhar. Em primeiro lugar, altere o nomedo submenu Salvar para Salvar Como. Feito isso, dê um clique com

Page 65: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 65/102

 

o botão direito do mouse sobre o submenu Salvar Como e, emseguida, um clique em insert . Abrir-se-á um espaço para um novosubmenu. Dê-lhe o nome de Salvar e, como exercício, digite para eleo código que o usuário salva o texto automaticamente sem chamar a

caixa de diálogo Salvar Como (caso o arquivo já esteja gravado emdisco). Caso você não consiga, não se preocupe. Em lições futurasestudaremos esse evento.

Construção do Editor de Textos

 Décima parte

Abra novamente o Menu Designer e crie o menu Visualizar , com osseguintes submenus: Barra de títulos, Barra de Ferramentas e

 Régua. Vamos ao primeiro código:

 void __fastcall TForm1::BarradeTtulos1Click(TObject *Sender ){if(BorderStyle == bsSizeable)BorderStyle = bsNone;elseBorderStyle = bsSizeable;}

Vamos colocar uma Barra de Ferramentas e uma Régua em nossoEditor. Primeiramente coloque um componente TPanel (Panel), da página Standard no Form. Desse componente, no Object Inspector ,delete qualquer caracter da propriedade Caption, altere a propriedade

 Align para alTop e a Propriedade Visible para false. Feito isso, eis ocódigo do menu correspondente:

Page 66: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 66/102

 

 void __fastcall TForm1::BarradeFerramentas1Click(TObject *Sender ){if(Panel1-> Visible == true)Panel1-> Visible = false;elsePanel1-> Visible = true;

}

Após terminar de digitar o código, coloque um segundo TPanel no Form. As Propriedades são rigorosamente as mesmas: Caption = “”;

 Align = alTop e Visible = false. Você perceberá que esse segundo Panel se instalará abaixo do primeiro (de Panel1). Eis o código:

 void __fastcall TForm1::Rgua1Click(TObject *Sender ){if(Panel2-> Visible == true)Panel2-> Visible = false;elsePanel2-> Visible = true;}

O primeiro Panel será usado para construírmos a Barra de

 Ferramentas e o segundo, a régua.

Rode a aplicação e experimente o resultado parcial.

Construção do Editor de Textos

 Décima primeira parte

O C++Builder possui componentes Buttons que podem carregar imagens. Trata-se dos SpeedButtons e BitBtns. Para colocar imagensnesses botões, basta editar sua propriedade Glyph no Object Inspector .As imagens a seguir, tiradas dos próprios exemplos do C++Builder ,sendo que algumas delas podem ser editadas para ser carregadas no

 botão adequado do nosso editor de textos.

Page 67: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 67/102

 

Caso você ainda não tenha providenciado, vamos agora estudar como podemos colocar um botão (ou menu) Salvar em nosso Editor. Antes, porém, certifique-se de ter providenciado a alteração solicitada no finalda seção: Construção do Editor de Textos - Nona parte.

Dificuldade: Quando o botão for pressionado (ou o menu respectivoreceber o evento correspondente), o programa deverá fazer umaverificação para saber se o arquivo já se encontra gravado em disco; emcaso afirmativo, deverá conhecer o caminho completo para salvar oarquivo; em caso negativo, deverá chamar a caixa de diálogos Salvar 

Como. Comecemos trabalhando com os menus. Vá para o Editor deCódigos e lhe dê um clique com o botão direito do mouse. No menu

 pop-up que se abrir, escolha a opção: Open Source/Header File, ou

simplesmente pressione as teclas Ctrl + F6 simultaneamente. Abrir-se-áo arquivo de cabeçalho Unit1.h. Na parte de baixo do arquivo, Depoisda linha que inicia as declarações privadas da classe, declare duas

 AnsiString que servirão para guardar os caminhos dos arquivos queforem abertos ou salvos, respectivamente. Eis as declarações.

 private:  // User declarations  AnsiString Caminho_Abrir ;  AnsiString Caminho_Salvar ;

 public:  // User declarations

Nota: Futuramente entenderemos melhor a finalidade deste arquivo.

Agora vamos implementar algumas modificações nos códigos doseventos Abrir e Salvar Como do nosso Editor de Textos:

 void __fastcall TForm1::Abrir1Click(TObject *Sender ){  if (OpenDialog1 -> Execute())

{

Page 68: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 68/102

 

  RichEdit1 -> Lines -> LoadFromFile(OpenDialog1-> FileName);

  //Caminho_Abrir atribuída com caminho doúltimo arquivo aberto  Caminho_Abrir = OpenDialog1-> FileName;

  //atribui Caminho_Abrir para Caminho_Salvar (para ficarem iguais) Caminho_Salvar = Caminho_Abrir ;

}  else  MessageBeep(0);}//---------------------------------------------------------------------------

 void __fastcall Tform1::Salvar1Click/*atual Salvar Como*/ (TObject *Sender ){

  if (SaveDialog1 -> Execute()){  RichEdit1 -> Lines -> SaveToFile(SaveDialog1 -> FileName);

  // Caminho_Salvar atribuída com caminho do últimoarquivo salvo  Caminho_Salvar = SaveDialog1-> FileName;  // atribui Caminho_Salvar para Caminho_Abrir (paraficarem iguais) 

Caminho_Abrir = Caminho_Salvar ;}

  else

  MessageBeep(0);}//---------------------------------------------------------------------------

Agora basta digitarmos o código para o menu salvar: void __fastcall TForm1::Salvar2Click/*Salvar*/ (TObject*Sender ){

// se o arquivo aberto já foi salvo ...if((Caminho_Abrir == Caminho_Salvar ) && (Caminho_Salvar !

= ""))// o arquivo será salvo sem chamar a caixa Salvar Como

RichEdit1-> Lines-> SaveToFile(Caminho_Abrir );  else // senão

// a caixa de diálogos Salvar Como será ChamadaSalvar1Click(Sender );

}

Vamos agora suspender, por algum tempo, a construção do Editor deTextos, a fim de abordarmos alguns pontos muito importantes.Brevemente retornaremos às lições.

Page 69: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 69/102

 

Variáveis

Podemos entender um microcomputador como um sistema de cincounidades de funcionamento: unidade de entrada (teclado, mouse,drive de CD-ROM, drive de disquetes etc), unidade de saída(impressora, monitor etc), unidade de memória (memória RAM-escrita e leitura-, memória ROM - leitura), e as unidades aritmética elógica que se encontram agrupadas na CPU (Unidade Central deProcessamento, o processador).

O chip responsável pelo controle de todo o computador é o processador. Outro circuito de extrema importância é a memóriaRAM, que podemos imaginar como um grupo de células usadas paraarmazenamento temporário das instruções e dos dados que sãoacessados e processados pelo microprocessador em altíssimavelocidade. Trata de uma memória volátil pois seus dados perdem-seno momento em que são desligadas, o que não chega a ser um problema, visto que esses dados, de regra, após salvos, ficamguardados em algum disco de armazenamento permanente, como osdiscos rígidos ou os disquetes, sendo copiados novamente para amemória na ocasião de seu processamento.

A memória RAM é constituída por uma imensa seqüência de célulasde armazenamento (localizações) com o tamanho de oito bits (um byte) cada, o que permite que cada uma dessas localizações possaassumir um entre 256 valores diferentes. Ressalte-se, ainda, que cada

célula possui um endereço único e inconfundível, expresso por umvalor numérico que define a exata localização desse byte, bem comoque, apesar do limitado tamanho de cada célula, podemos acessar dois bytes consecutivos (word) ou quatro bytes consecutivos(doubleword) simultaneamente com um único endereçamento.

Disso decorre que durante a execução de um programa, as instruçõese os dados processados ficam armazenados na memória do

computador. Cada informação é representada por certo grupo debytes (char - 1 byte, float - 4 bytes, double - 8 bytes etc) e possui um

Page 70: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 70/102

 

local determinado na memória, um endereço que pode ser expressado por um valor hexadecimal. Não há necessidade de o programador conhecer o endereço absoluto de cada dado, pois o compilador relaciona o nome de cada variável com sua posição na memória,

cuidando dessa tarefa da melhor maneira possível.

Para facilitar o entendimento, podemos imaginar a memória docomputador como um enorme armário de gavetas. Cada gaveta(célula de armazenamento) é numerada seqüencialmente e possui otamanho de 1 byte. Esse número seqüencial é o endereço da gaveta.Conforme o tipo de variável declarada (char = 1 byte; int = 4 bytes;

float = 4 bytes; etc), o compilador reservará uma ou mais gavetas

seqüencialmente para armazenar o valor correspondente, pois cadatipo de dado possui um tamanho próprio.

Imagine um armário imenso, com um milhões de gavetas iguais.Seria demasiadamente complicado localizar determinado objetonuma dessas gavetas se não possuíssemos uma forma de diferenciá-las entre si. Então, o nome da variável funciona como uma inscriçãoque individualiza a gaveta (endereço na memória).

Por exemplo, a declaração:

long double LgDbl;

informa ao compilador que ele deverá reservar 10 bytes seqüenciais

(dez gavetas dispostas em seqüência) para uma variável do tipo longdouble cujo nome é LgDbl . Observe que as "gavetas" estãoreservadas, porém nenhum "objeto" foi colocado nelas.

Um ponto bastante importante sobre o tamanho das variáveis é queseu tamanho pode variar de máquina para máquina, ou sistemaoperacional para sistema operacional. O tipo int, por exemplo, ocupa2 bytes no sistema operacional MS-DOS e 4 bytes no Windows.

Page 71: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 71/102

 

Com esses conceitos, já temos informações suficientes para entender o que vem a ser uma variável. Podemos definir uma variável comoum local na memória do computador que a cada momento pode possuir um valor diferente, porém do mesmo tipo de dados.

Por exemplo, a declaração:

char ch;

faz com que o compilador reserve espaço suficiente para um caracter.

Já a declaração abaixo é um pouco mais completa, pois inicializa avariável, colocando um caracter  A no espaço reservado:

char ch = 'A';

O conceito de variáveis decorre justamente do fato de que podemossubstituir o "conteúdo" dessas "gavetas" :

ch = 'b'; // ch agora possui outro valor 

O exemplo a seguir usa um SpeedButton no Form. Declararemosuma variável do tipo char num lugar onde ela será visível tanto peloevento OnMouseDown quanto pelo evento OnMouseUp deSpeedButton1. Quando o botão do mouse for pressionado sobre o botão, o evento OnMouseDown será ativado para atribuir o caracter  A à variável ch, exibindo esse valor no Caption de SpeedButton1.Quando o botão do mouse for liberado, o evento OnMouseUp seráativado para alterar o valor da variável para b, exibindo esse valor noCaption de SpeedButton1.

//---------------------------------------------------------------------------

#include <vcl.h> #pragma hdrstop 

Page 72: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 72/102

 

#include "Unit1.h"//---------------------------------------------------------------------------#pragma package(smart_init)#pragma resource "*.dfm"TForm1 *Form1;

//---------------------------------------------------------------------------// declara uma variável char visível pelos eventos deSpeedButton1char ch;//---------------------------------------------------------------------------

 __fastcall TForm1::TForm1(TComponent* Owner ): TForm(Owner ){}//---------------------------------------------------------------------------

 void __fastcall TForm1::SpeedButton1MouseDown(TObject *Sender ,TMouseButton Button, TShiftState Shift, int X , int Y ){ch = 'A'; // atribui A para a variável chSpeedButton1 -> Caption = ch;}//---------------------------------------------------------------------------

 void __fastcall TForm1::SpeedButton1MouseUp(TObject *Sender ,TMouseButton Button, TShiftState Shift, int X , int Y ){

ch = 'b'; // atribui b para a variável chSpeedButton1 -> Caption = ch;}//---------------------------------------------------------------------------

O C++Builder implementa a função sizeof() que nos permitevisualizar o tamanho, em bytes, de uma variável ou de um tipo dedados:

//---------------------------------------------------------------------------

 void __fastcall TForm1::Button1Click(TObject *Sender ){

double Dbl;Edit1 -> Text = AnsiString (sizeof(Dbl)) + " bytes"; // retorna

 pelo nome da variável

/* retorna o valor pelo tipo de dados*/ 

Edit2 -> Text = AnsiString (sizeof( bool)) + " byte";

RichEdit1 -> Clear (); // apaga o conteúdo de RichEdit1

Page 73: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 73/102

 

for (int linha = 0; linha <= 3 ; linha ++) // Em breveestudadremos o loop for RichEdit1 -> Lines -> Insert(linha, ""); // prepara RichEdit1

 para receber // as quatro linhas

de strings

RichEdit1 -> Lines-> Strings[0] = "Tamanho de char = " +String (sizeof(char));RichEdit1 -> Lines-> Strings[1] = "Tamanho de int = " +String (sizeof(int));RichEdit1 -> Lines-> Strings[2 ] = "Tamanho de String = " +String (sizeof(String ));RichEdit1 -> Lines-> Strings[3 ] = "Tamanho de AnsiString = " +  AnsiString (sizeof(AnsiString ));

ShowMessage(sizeof(long double)); 

}//---------------------------------------------------------------------------

 Atribuição de valores a variáveis

Conforme você já deve ter percebido, para criarmos uma variável, precisamos declarar o seu tipo (char , int , float , ...), seguido pelonome da variável e por um símbolo de ponto e vírgula:

int i; 

Com o operador de atribuição = atribuímos valores às variáveis:

i = 43 ;

 Nada impede que, no momento da declaração, também inicializemosa variável com algum valor:

int i = 43 ;

Page 74: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 74/102

 

Podemos, inclusive, declarar mais de uma variável na mesmainstrução, bem como misturar declarações com inicializações:

// declararamos 5 variáveis das quais inicializamos duas (i3 ei4)int i, i2, i3 = 10, i4 = 15 , i5;

O nome de uma variável deve ser sugestionável, nos indicando o tipode dados com o qual ela trabalhará. Por exemplo, suponhamos um problema onde será calculada a área de um retângulo de 10 metros decomprimento por 7 metros de largura. Poderíamos definir asvariáveis assim:

int compr = 10;int larg = 7 ;int total = compr * larg ; // atribui o resultado damultiplicação a total

Existem algumas regras que devem ser respeitadas: Os nomes dasvariáveis só podem começar com letras (a, A, b, B, c, C , d , D, e, E ,

 f , ...) ou por caracter de sublinhar ( _ ); depois de começado o nome, podemos colocar letras, números ou caracter de sublinhar no nome:

int i, i1, i_, _i, _2, i_2 ; // Ok. Todas as variáveis possuemnomes aceitáveisfloat 7 _i; // nome inválido, pois começa com númerochar _AF $G ; // nome inválido - caracter ilegal $

Coloque um botão BitBtn no Form sem alterar-lhe o tamanho. Oexemplo exibirá o valor área do botão que será ampliada a cada

clique do mouse. Eis o código:

//---------------------------------------------------------------------------#include <vcl.h> #pragma hdrstop 

#include "Unit1.h"//---------------------------------------------------------------------------#pragma package(smart_init)#pragma resource "*.dfm"

Page 75: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 75/102

 

TForm1 *Form1;//---------------------------------------------------------------------------int altr = 25 , larg = 75 ; // declara e inicializa duasvariáveis globais//------------------------------------------------------------

--------------- __fastcall TForm1::TForm1(TComponent* Owner ): TForm(Owner ){/* O código deste bloco será executado imediatamente(e somente) quando o aplicativo for inicializado*/ int total = altr * larg ; // declara e inicializa uma variávellocal

/*Coloca no caption de BitBtn1 o título Área =, mais o valor da variável total convertido em AnsiString*/ BitBtn1 -> Caption = "Área = " + AnsiString (total);}

//--------------------------------------------------------------------------- void __fastcall TForm1::BitBtn1Click(TObject *Sender ){altr = altr + 10; //incrementa a variável altr com + 10,alterando-lhe o valor larg = larg + 30; //incrementa a variável larg com + 30,alterando-lhe o valor BitBtn1 -> Height = altr ; //atribui a BitBtn1 -> Height o novovalor de altr;BitBtn1 -> Width = larg ; //atribui a BitBtn1 -> Width o novovalor de larg;

//atualiza o Caption de BitBtn1BitBtn1 -> Caption = "Área = " + AnsiString (altr * larg );}//---------------------------------------------------------------------------

 Nota: No exemplo acima, essa não é a melhor forma de se conseguir o resultado, pois o exemplo foi apenas didático para ilustrar adeclaração, a inicialização e a substituição de valores em variáveis.

Como exercício, procure conseguir o mesmo resultado sem declarar nenhuma variável, o que poupará memória durante a execução do programa. Você já possui conhecimentos suficientes para tanto!

Variáveis signed e unsigned 

(com e sem sinal)

Page 76: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 76/102

 

Quando tratamos dos modificadores de tipos, tivemos oportunidade

de observar que em C++ os tipos char e int possuem as variedadessigned (com sinal) e unsigned (sem sinal). Tais modificadores permitem-nos filtrar alguns valores que poderão ser desnecessários para determinados tipos de aplicação, como por exemplo os númerosnegativos, ou os valores estendidos da tabela ASCII. Os tiposinteiros (int, short e long) e os char, de regra, podem armazenar valores positivos ou negativos. Todavia se declarados com omodificador de tipos unsigned, ficarão restritos a números iguais oumaiores do que zero.

A tabela abaixo exibe os valores possíveis para os tipos de dados,com ou sem os modificadores de tipo:

Tipo bytes possíveis valores

char 1 -128 a 127

unsigned char 1 0 a 255

signed char 1 -128 a 127

int 4 -2147483648 a 2147483647

unsigned int 4 0 a 4294967295

signed int 4 -2147483648 a 2147483647

short int 2 -32768 a 32767unsigned short int 2 0 a 65535

signed short int 2 -32768 a 32767

long int 4 -2147483648 a 2147483647

signed long int 4 -2147483648 a 2147483647

unsigned long int 4 0 a 4294967295

Page 77: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 77/102

 

Observe que o tipo não tem o seu tamanho alterado (número de bytes) em virtude da presença dos modificadores signed ouunsigned. O resultado direto desse fato é que, para um mesmo tipode dados, o valor máximo que pode ser atribuído a um unsigned é odobro do maior valor positivo que pode ser atribuído a um signed.

O programa abaixo mostra-nos alguns limites de valores:

 void __fastcall TForm1::SpeedButton1Click(TObject *Sender ){for (char ch = -126 ; ch > -127 ; ch++) Memo1-> Lines-> Add (ch);Memo1 -> Lines -> Add ("");

for (signed char Sch = 1 ;Sch > 0; Sch++) Memo1-> Lines-> Add (Sch);Memo1 -> Lines -> Add ("");

for (unsigned char Uch = -1000; Uch > 0; Uch++) Memo1-> Lines-> Add (Uch);Memo1 -> Lines -> Add ("");

for (int i = 2147483600; i > 0; i++) Memo1-> Lines-> Add (i);Memo1 -> Lines -> Add ("");

for (unsigned int ui = 4294967200; ui > 0; ui++) Memo1-> Lines-> Add (ui);Memo1 -> Lines -> Add ("");

for (signed short int SSi = 32768 ; SSi < -32000; SSi++) Memo1-> Lines-> Add (SSi);

}

 Excedendo o limite de uma variável 

Se tentarmos atribuir um valor fora da faixa que a variável podeconter, ela continuará a partir do zero, se for unsigned; porém, se for 

Page 78: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 78/102

 

do tipo signed, continuará a armazenar dados a partir do menor valor negativo.

O Exemplo abaixo leva um SpeedButton e um ComboBox no Form.Quando o usuário clicar o botão, o programa mostrará o resultado dese tentar atribuir valores não contemplados pela variável.

//---------------------------------------------------------------------------

 __fastcall TForm1::TForm1(TComponent* Owner ): TForm(Owner ){ComboBox1 -> Text = "Excedendo limites de variáveis ...";}//---------------------------------------------------------------------------

 void __fastcall TForm1::SpeedButton1Click(TObject *Sender ){ComboBox1 -> Text = "Veja abaixo os novos valores ...";

int i = 2147483647 ;ComboBox1 -> Items -> Add ("Limite para int = " + String (i));ComboBox1 -> Items -> Add ("Limite + 1 = " + String (i + 1));ComboBox1 -> Items -> Add ("Limite + 2 = " + String (i + 2 ));ComboBox1 -> Items -> Add ("");

unsigned int Ui = 4294967295 ;ComboBox1 -> Items -> Add ("Limite para unsigned int = " +String (Ui));

ComboBox1 -> Items -> Add ("Limite + 1 = " + String (Ui + 1));ComboBox1 -> Items -> Add ("Limite + 2 = " + String (Ui + 2 ));ComboBox1 -> Items -> Add ("");

signed int Si = 2147483647 ;ComboBox1 -> Items -> Add ("Limite para signed int = " +String (Si));ComboBox1 -> Items -> Add ("Limite + 1 = " + String (Si + 1));ComboBox1 -> Items -> Add ("Limite + 2 = " + String (Si + 2 ));ComboBox1 -> Items -> Add ("");

char ch = 127 ;ComboBox1 -> Items -> Add ("Limite para char = " +

String (int(char(ch))));ComboBox1 -> Items -> Add ("Limite + 1 = " + String (int(char(ch+ 1))));ComboBox1 -> Items -> Add ("Limite + 2 = " + String (int(char(ch+ 2 ))));ComboBox1 -> Items -> Add ("");

signed char Sch = 127 ;ComboBox1 -> Items -> Add ("Limite para signed char = " +String (Sch));ComboBox1 -> Items -> Add ("Limite + 1 = " +String (int(char(Sch + 1))));ComboBox1 -> Items -> Add ("Limite + 2 = " +

String (int(char(Sch + 2 ))));ComboBox1 -> Items -> Add ("");

Page 79: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 79/102

 

unsigned char Uch = 255 ;ComboBox1 -> Items -> Add ("Limite para unsigned char = " +String (Uch));ComboBox1 -> Items -> Add ("Limite + 1 = " +String (int(char(Uch + 1))));ComboBox1 -> Items -> Add ("Limite + 2 = " +

String (int(char(Uch + 2 ))));ComboBox1 -> Items -> Add ("");

}//---------------------------------------------------------------------------

Operações matemáticas com

unsigned 

Já sabemos que uma variável unsigned não pode ser atribuída com

valores negativos. Se, numa operação matemática, tivermos umresultado menor do que zero para uma variável unsigned, nomomento em que o cálculo atingir o primeiro valor negativo (-1) aoperação é remetida para o maior valor do tipo do dado, de onde o programa dará continuidade aos cálculos com os valores restantes.

O exemplo a seguir usa um Label  e um Timer  no Form. Sãodeclaradas duas variáveis globais do tipo unsigned int, sendo queuma funcionará como base do cálculo da subtração e a outra comovalor a ser subtraído. O Label  ficará piscando no Form, ou melhor, oTimer  fará com que o Label  fique visível e depois de alguns instantesinvisível, e depois visível, e depois invisível e assim sucessivamente.Ajustamos o intervalo de tempo para 500, mas você pode alterar ovalor para mais ou menos, no Code Editor  ou no Object Inspector .Haverá um decremento (diminuição do valor em razão de 1) donúmero apresentado no Label , a cada piscada. Ou seja, o primeirovalor apresentado será 10; o segundo, 9; o terceiro, 7; e assim por 

diante. Observe bem o que acontecerá depois que 0 (zero) for 

Page 80: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 80/102

 

apresentado no Label , onde, equivocadamente, poderíamos estar esperando algum valor negativo:

//------------------------------------------------------------

---------------#include <vcl.h> #pragma hdrstop 

#include "Unit1.h"//---------------------------------------------------------------------------#pragma package(smart_init)#pragma resource "*.dfm"TForm1 *Form1;//---------------------------------------------------------------------------

unsigned int uiBase = 9 ; /* declara e inicializa a variávelbase (observe que poderia ser uma constante)*/ 

unsigned int uiAcresce = 1; /* declara e inicializa a variávelque será

incrementada na subtração */ //---------------------------------------------------------------------------

 __fastcall TForm1::TForm1(TComponent* Owner ): TForm(Owner )

{}//------------------------------------------------------------

---------------

 void __fastcall TForm1::Timer1Timer (TObject *Sender ){

if (Label1-> Visible == true) // se label estiver visivel{Label1-> Visible=false; // Label1 ficará invisível/* e altera-se o Caption de Label1, com o resultado dasubtração,cada vez que ele ficar invisível*/ Label1 -> Caption = uiBase - uiAcresce;/* incrementa a variável uiAcresce (ela vale 1,

depois 2, depois 3, 4, 5, etc)*/ uiAcresce = uiAcresce + 1;}else // ou então ( se Label1 estiver invisível)Label1-> Visible=true; // Label1 ficará visível

}//---------------------------------------------------------------------------

 AnsiString 

Page 81: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 81/102

 

O C++Builder implementa o tipo AnsiString como uma classe.AnsiString é projetado para funcionar como o tipo long string

 Delphi . Adequadamente, AnsiString fornece as seguintescaracterísticas de tratamento de strings que são requeridas quandovocê chama funções do tipo VCL que usam qualquer tipo long

string Delphi :

• reference count 

• string length

• data

• null string terminator 

Se você não fornecer um valor inicial, as variáveis AnsiString sãoiniciadas com instância zero.

Podemos conceituar uma string como um caracter, ou uma seqüênciade caracteres colocados entre aspas duplas:

"Alô, Thérbio!"

"Guarulhos é a terra das Pizzarias..."

"Oba!"

"ô"

A classe AnsiString possui um bom nível de independência eflexibilidade nos controles onde é usada, uma vez que não édescendente de Tobject, permitindo-nos realizar diversas operaçõesúteis com strings. A implementação desse arquivo pode ser visualizada no diretório include/vcl/dstring.h da pasta de instalaçãode seu compilador:

Page 82: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 82/102

Page 83: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 83/102

 

// DSTRING.H - Support for delphi strings in C++// (AnsiString and template<sz> SmallString)// $Revision: 1.25.1.6 $// $Date: 13 Jan 1999 16:32:30 $// // Copyright (c) 1997, 1998 Borland International

#ifndef DSTRING_H #define DSTRING_H 

#pragma delphiheader begin 

#include <sysmac.h> 

namespace System{  class TVarRec;  class RTL_DELPHIRETURN Currency ;

  class RTL_DELPHIRETURN WideString ;

  ///////////////////////////////////////////////////////////////////////////// // AnsiString: String class compatible with Delphi's Native 'string' type///////////////////////////////////////////////////////////////////////////// 

  class RTL_DELPHIRETURN AnsiString   {  friend AnsiString  __fastcall operator +(const char*, const AnsiString & rhs);  public:  // the TStringFloatFormat enum is used by FloatToStrF   enum TStringFloatFormat  {sffGeneral, sffExponent, sffFixed , sffNumber , sffCurrency };  static AnsiString  __fastcall StringOfChar (char ch, int count);

  static AnsiString  __fastcall LoadStr (int ident);  static AnsiString  __fastcall LoadStr (HINSTANCE hInstance, int ident);  static AnsiString  __fastcall FmtLoadStr (int ident, const TVarRec *args,  int size);

  AnsiString & __fastcall LoadString (HINSTANCE hInstance, int ident);

  // Delphi style 'Format'// 

  static AnsiString  __fastcall Format(const AnsiString & format,  const TVarRec *args, int size);

  // C++ style 'sprintf' (NOTE: Target buffer is the string)

//   AnsiString & __cdecl sprintf (const char* format, ...); // Returns *this  int __cdecl  printf (const char* format, ...); // Returns formatted length

  static AnsiString  __fastcall FormatFloat(const AnsiString & format,  const long double& value);  static AnsiString  __fastcall FloatToStrF (long double value,  TStringFloatFormat format, int precision, int digits);  static AnsiString  __fastcall IntToHex (int value, int digits);  static AnsiString  __fastcall CurrToStr (Currency value);  static AnsiString  __fastcall CurrToStrF (Currency value,  TStringFloatFormat format, int digits);

  // Constructors   __fastcall AnsiString (): Data(0) {}   __fastcall AnsiString (const char* src);   __fastcall AnsiString (const AnsiString & src);

Page 84: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 84/102

 

Por enquanto não tente entender os fundamentos deste arquivo, poisnele aparecem muitos termos que nos são novidades ainda. Noavançar do curso, muitos desses fundamentos serão abordados,tornando a compreensão de partes do arquivo mais ou menosintuitiva.

Todavia, vamos verificar alguns tópicos, por dois motivos:

1º - É importante que tenhamos conhecimento de determinadasfacilidades que AnsiString nos proporciona;

2º - aprendermos a operar determinadas funções da classe, por 

intuição.

Nota: Caption é o rótulo que pode ser estampado no componente, suportando mudanças emtempo de execução. Controles que exibem textos, fazem-no através da propriedade Caption

ou da propriedade Text . A propriedade a ser usada dependerá do tipo do controle. De ummodo geral, Caption é usado por textos que aparecem como títulos de uma janela ou umrótulo (estampa), enquanto Text é usado por textos que aparecem como conteúdo de umcontrole. Via de regra, Text podem ser editados pelo usuário, enquanto Caption é uma

 propriedade que não recebe o foco da aplicação, tendo como característica a finalidade básica

de enviar uma informação ao usuário.

Muitos controles usam propriedades da classe AnsiString. Por exemplo, todos os controles que possuem rótulo ( forms , edits ,

 panels , labels) usam AnsiString através da propriedade Caption.Outros controles como o EditBox usam a classe AnsiString como base de seus textos (propriedade Text ). Se repararmos bem,notaremos que nós já temos usado e implementado objetosAnsiString sem qualquer espécie de declaração. Em outra situaçãoqualquer, a declaração e inicialização de uma string sempre seránecessária antes do uso respectivo.

A declaração de uma String é análoga à declaração de um tipo básico, porém usando a palavra AnsiString seguida de um nomeválido C++. Eis um exemplo:

AnsiString Pais;

Page 85: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 85/102

 

Em dstring.h podemos observar que AnsiString é uma classe comseu próprio construtor e destruidor:

  // Constructors

   __fastcall AnsiString (): Data(0) {}   __fastcall AnsiString (const char* src);   __fastcall AnsiString (const AnsiString & src);// __fastcall AnsiString(const char* src, unsigned char len);   __fastcall AnsiString (const char* src, unsigned int len);   __fastcall AnsiString (const wchar_t* src);   __fastcall AnsiString (char src);   __fastcall AnsiString (short);   __fastcall AnsiString (unsigned short);   __fastcall AnsiString (int src);   __fastcall AnsiString (unsigned int);   __fastcall AnsiString (long);

   __fastcall AnsiString (unsigned long);   __fastcall AnsiString ( __int64);   __fastcall AnsiString (unsigned __int64);   __fastcall AnsiString (double src);   __fastcall AnsiString (const WideString &src);

  // Destructor    __fastcall ~AnsiString ();

Logo você também pode declarar uma variável dela com parêntesesvazios, determinando a chamada do construtor da classe. Eis umexemplo:

AnsiString Animal();

Há dois modos principais para você iniciar uma variável AnsiString.Depois de declará-la, pode-se determinar o valor desejado para avariável usando o nome escolhido. Eis um exemplo:

AnsiString Especie;Especie = "Cachorro";

também podemos, tal qual nos tipos básicos, inicializar a variávelString na sua declaração, fornecendo o valor desejado para o nomeescolhido. Eis um exemplo:

AnsiString Raca("Pastor Alemão");

Uma vez definida, a String  poderá ser usada, por exemplo, paraalterar o Caption de controles:

Page 86: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 86/102

 

//---------------------------------------------------------------------------

 void __fastcall TForm1::Button1Click(TObject *Sender ){AnsiString Meu_Cao;

Meu_Cao = " O Tobby é um vira-lata, que só sabe latir, latir elatir...";Label1-> Caption = Meu_Cao;}//---------------------------------------------------------------------------

Também poderá ser usada para preencher um controle Edit :

//---------------------------------------------------------------------------

 void __fastcall TForm1::Button1Click(TObject *Sender ){AnsiString Pre_Hist = "Tiranossauro ou 286???";Edit1-> Text = Pre_Hist;}//---------------------------------------------------------------------------

Um texto introduzido num Edit box, por exemplo, é, por padrão,considerado uma String, visto que o compilador não pode deduzir que espécie de dado ou valor o usuário deseja manipular. Por essa

razão, depois que um valor foi fornecido para um controle quefundamenta-se na classe AnsiString como base de seu conteúdo, para executar qualquer operação matemática com tal String,devemos convertê-la  para o tipo de dado desejado. Para essafinalidade podemos, por exemplo, usar a função StrToInt():

 void __fastcall TForm1::Button1Click(TObject *Sender ){Label1-> Caption = "111";int i = StrToInt(Label1-> Caption) - 11;Edit1-> Text = i;}

Conforme apresentado, a classe AnsiString  provê um grande númerode construtores que nos permitem a criação de strings de qualquer espécie:

Por exemplo, podemos usar:

Page 87: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 87/102

 

um caracter:

AnsiString Simbolo = 'T';

um inteiro

AnsiString Int = 120;

um long int

AnsiString LongoInt = -73495745 ;

um valor ponto flutuante:

AnsiString PtoFlut = 675.15;

Um double:

AnsiString DplPrec = 2.15e28;

um string

AnsiString AloTher = "Alô, Thérbio";

Qualquer dessas variáveis pode ser declarada usando os construtoresequivalentes:

//---------------------------------------------------------------------------

AnsiString Simbolo('T');AnsiString Int(120);AnsiString AloTher ("Alô, Thérbio");

Page 88: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 88/102

 

AnsiString PtoFlut(675.15);AnsiString LongoInt(-73495745 );AnsiString DplPrec(2.15e28);//---------------------------------------------------------------------------

Baseado na configuração dos construtores AnsiString, podemosconverter qualquer valor e torná-lo disponível para um controle queuse as propriedades AnsiString. Por exemplo, podemos converter eexibir:

um caracter:

char Letra = 't';

Edit1 -> Text = AnsiString (Letra);

um inteiro:

Integer Numero = 256 ;Edit1-> Text = AnsiString (Numero);

um long integer:

long Valor = 4949431;

Panel1->Caption = AnsiString(Valor);

um valor ponto flutuante:

Single Distancia = 5698.03;Label1-> Caption = AnsiString (Distancia);

um double:

Double Tamanho = 24588 ;Edit1-> Text = AnsiString (Tamanho);

uma string

AnsiString Servico = "Limpador de Fogões";

Button2-> Caption = AnsiString (Servico);

Nota: Você deve ter notado o uso de nomes de tipos diferentes dosapresentados anteriormente.

Page 89: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 89/102

 

Por exemplo:

chamamos o tipo int de Integer , o tipo float de Single; o tipo double

de Double ...

Por que será?

 No início do arquivo dstring.h vemos a inclusão do arquivo decabeçalho sysmac.h :

#include <sysmac.h> 

 NOTA: Logo abordaremos o uso da palavra typedef  para criar outro nome para um tipo dedados:

Vejamos um trecho do arquivo sysmac.h :

  class PACKAGE TVarArray ;

  typedef TVarArray *PVarArray ;

  typedef bool Boolean; // 

  typedef int Integer ; // 

-2147483648..2147484647 

  typedef char Char ; // 0..255

  typedef wchar_t WideChar ; // Unicodecharacter 

  typedef signed char Shortint; // -128..127 

  typedef short Smallint; // -32768..32767 

  typedef unsigned char Byte; // 0..255

Page 90: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 90/102

 

  typedef unsigned short Word ; // 0..65535

  typedef unsigned long DWord ; // 0..4294967295

  typedef void * Pointer ; // 

  typedef char AnsiChar ; // 

  typedef signed long Longint; // -2147483648..2147484647 

  typedef unsigned int Cardinal; // 0..2147484647 

  typedef long double Extended ; // 10 bytereal

  typedef float Single; // 4 bytereal

  typedef double Double; // 8 bytereal

  typedef char* const Openstring ; // D16 string/D32shortstring formalparm

  typedef void * file; // 

  typedef void * Text; // 

  typedef Text TextFile; // 

  typedef char* PChar ; // 

  typedef char* PAnsiChar ; // 

  typedef wchar_t* PWideChar ; // 

  typedef unsigned char ByteBool; // 

  typedef unsigned short WordBool; // 

  typedef Cardinal LongBool; // 

  typedef AnsiString String ; // 

  typedef SmallStringBase <255 > ShortStringBase; // 

  typedef SmallString  <255 >  ShortString ; // 

  typedef ShortString * PShortString ; // 

  typedef AnsiString * PAnsiString ; // 

Page 91: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 91/102

 

  typedef PAnsiString PString ; // 

  typedef WideString * PWideString ; // 

  typedef Extended * PExtended ; // 

  typedef Currency * PCurrency ; // 

  typedef Variant* PVariant; // 

  typedef __int64 LONG64; // !!obsolete

  typedef GUID TGUID ; // 

  typedef TGUID * PGUID ; // 

  typedef HRESULT HResult; // 

  typedef Integer  __fastcall (*TThreadFunc)(Pointer Parameter );

  typedef void (*TModuleUnloadProc)(HINSTANCE hinstance);

  typedef bool (*TEnumModuleFunc)(HINSTANCE hinstance, void *data);

  typedef struct TVarData *PVarData;

Os nomes à direita representam os sinônimos que podem ser usadosem substituição aos tipos básicos. Por exemplo, Boolean  pode ser usado em substituição ao tipo bool.

 Nas próximas lições abordaremos várias implementações deAnsiString.

Nota: voltamos a insistir para que você não se preocupe quando se deparar com nomes detipos de dados ainda não estudados (como classe, por exemplo) visto que no momentoapropriado do curso abordaremos tais tópicos com a profundidade necessária.

Page 92: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 92/102

 

Funções que modificam strings

Agora conheceremos algumas implementações do tipo AnsiString.Embora tenhamos, para facilidade de compreensão, nos referido àsinstâncias de classes como variáveis, tecnicamente isso estáincorreto. Na verdade, a instância de uma classe (AnsiString, por exemplo) é denominada objeto. E os objetos possuem funções-membro que facilitam sua manipulação. Essas funções-membro podem ser acessadas através do operador ponto “.”.

Vejamos alguma funções-membro utilizadas para modificar strings.

// Modify string   AnsiString &  __fastcall Insert(const AnsiString & str , int index );  AnsiString &  __fastcall Delete(int index , int count);  AnsiString &  __fastcall SetLength(int newLength);

  int __fastcall Pos(const AnsiString & subStr ) const;  AnsiString   __fastcall LowerCase() const;

  AnsiString   __fastcall UpperCase() const;  AnsiString   __fastcall Trim() const;  AnsiString   __fastcall TrimLeft() const;  AnsiString   __fastcall TrimRight() const;  AnsiString   __fastcall SubString (int index , int count) const;

Insert()

AnsiString & __fastcall Insert(const AnsiString & str , int index );

insere uma string especificada dentro de AnsiString, iniciando a inserçãona posição determinada pela variável index .

O exemplo abaixo leva um Label no Form. Quando o usuário dá um cliqueno Label , o programa providencia a inserção de uma string dentro de outra.

 void __fastcall TForm1::Label1Click(TObject *Sender )

{AnsiString test = "O_ _está_feito";Label1-> Caption = test.Insert("grande_teste", 3 );

Page 93: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 93/102

 

}

Delete()

AnsiString &  __fastcall Delete(int index , int count);

Remove um número especificado de caracteres de uma string.Inicia a contagem para a remoção na variável especificada por index , encerrando a exclusão com a remoção do últimocaracter contado para completar count:

 void __fastcall TForm1::Label1Click(TObject *Sender )

{

AnsiString test = "O_grande_teste_está_feito";

Label1-> Caption = test.Delete(3 , 12 );

Label1-> Caption = test.Insert(" ", 3 );

}

SetLength()

AnsiString &  __fastcall SetLength(int newLength);

Determina um novo tamanho para a string, especificado por newLength, desde que esse novo comprimento seja menor doque o tamanho inicial. SetLength não pode aumentar otamanho da string:

 void __fastcall TForm1::Label1Click(TObject *Sender )

{

AnsiString test = "O_grande_teste_está_feito";

Label1-> Caption = test.SetLength(14);

}

Pos()

Page 94: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 94/102

 

int __fastcall Pos(const AnsiString & subStr ) const;

a posição do primeiro caracter de uma substring especificada nastring. Se a substring não for encontrada na string, Pos()retorna “zero”.

 void __fastcall TForm1::Label1Click(TObject *Sender )

{

AnsiString test = "O_grande_teste_está_feito";

Label1-> Caption = test.Pos("está");

}

LowerCase() e UpperCase()

AnsiString   __fastcall LowerCase() const;AnsiString   __fastcall UpperCase() const;

LowerCase() transforma todas as letras da string para letrasminúsculas e UpperCase() transforma todas para maiúsculas:

 void __fastcall TForm1::Label1Click(TObject *Sender )

{

AnsiString test = "O_grande_TESTE_está_FEITO";

Label1-> Caption = test;

Label2-> Caption = test.LowerCase();

Label3-> Caption = test.UpperCase();

}

Funções que modificam strings

 AnsiString ... continuação

Page 95: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 95/102

 

AnsiString   __fastcall Trim() const;AnsiString   __fastcall TrimLeft() const;AnsiString   __fastcall TrimRight() const;AnsiString   __fastcall SubString (int index , int count) const;

Trim(),TrimLeft()eTrimRight() 

AnsiString   __fastcall Trim() const;AnsiString   __fastcall TrimLeft() const;AnsiString   __fastcall TrimRight() const;

Podemos usar essas funções-membro para eliminar caracteres em branco no início (TrimLeft()), no final (TrimRight()) e no inícioe no final da string (Trim()):

 void __fastcall TForm1::Label1Click(TObject *Sender ){Label1-> Color = clYellow ;Label2-> Color = clYellow ;Label3-> Color = clYellow ;Label4-> Color = clYellow ;AnsiString test = " O grande teste estáfeito ";Label1-> Caption = test;Label2-> Caption = test.Trim();Label3-> Caption = test.TrimLeft();Label4-> Caption = test.TrimRight();

}

SubString ()

AnsiString   __fastcall SubString (int index , int count) const;

Retorna uma substring especificada de uma string. A substring iniciaa contagem dos caracteres em index e termina de contá-los em

count.

Page 96: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 96/102

 

O exemplo abaixo possui um Button, um Edit e um Label no Form.Quando o usuário der um clique no botão, a função membroSubString () da classe AnsiString será chamada para acessar uma

 substring (parte da frase) contida na variável Frase:

//---------------------------------------------------------------------------

 void __fastcall TForm1::Button1Click(TObject *Sender ){// Coloca uma string em Edit1Edit1 -> Text = "Meu pai se chama Julio Alves";// Declara e inicializa a variável Frase com a string contidano texto de em Edit1

AnsiString Frase = Edit1 -> Text;/* Declara e inicializa a variável MeuPai com a string quecomeça no caracter 18e termina no 28 de Frase*/ AnsiString MeuPai = Frase.SubString (18 , 28 );// Concatena string com MeuPai, imprimindo no Label1Label1 -> Caption = "Papai se chama " + MeuPai;

}//---------------------------------------------------------------------------

 Nota: Como você deve ter observado, já temos utilizado AnsiString

em diversas oportunidades. Também já utilizamos a denominaçãoString que é análoga ao uso de AnsiString (Lembre-se da palavra-chave typedef ).

Como sabemos, o C++Builder possui várias funções paramanipulação de strings. Veja abaixo um exemplo com AnsiPos(),uma função que retorna a posição de um caracter dentro de umaString:

 void __fastcall TForm1::Button1Click(TObject *Sender ){

AnsiString Teste = "abcdefghijlmnopqrstuvxz";ShowMessage((String )"A posição de 'q' é: " + AnsiPos('q',Teste));

Page 97: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 97/102

 

}

 AnsiString continuação...(dstring.h)

Agora já conheceremos diversas funções-membro de AnsiString.Como exercício tente entender a lógica de alguma funçõeslocalizadas no arquivo dstring.h. Evidentemente você deveráconsultar o HELP do C++Builder . Para tanto, você pode proceder da

seguinte maneira. Escolha uma função-membro. Por exemplo:

static AnsiString  __fastcall IntToHex (int value, int digits);

Copie o nome da função para o Editor de Códigos do C++Builder :

IntToHex 

Dê um clique para que o cursor fique situado sobre o nome da funçãoe tecle F1.

O HELP do BCB deverá abrir-se automaticamente mostrando aseventuais opções para essa função. Eis uma delas:

AnsiString::IntToHex

AnsiString

Description

Converts a number into a string containing the number's hexadecimal (base 16) representation.

static AnsiString  __fastcall IntToHex (int value, int digits);

Value is the number to convert. Digits indicates the minimum number of hexadecimal digits.

Percebemos que a função em questão trata da conversão de valoresinteiros para hexadecimais, devolvendo AnsiString, onde int

Page 98: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 98/102

 

value é o valor a ser convertido e int digits é o número dedígitos devolvido pela função na conversão:

 void __fastcall TForm1::Label1Click(TObject *Sender ){Label1-> Caption = IntToHex (100000, 10);}

Percebeu como é fácil?!? Sem dúvida alguma, a melhor fonte de pesquisas para compreendermos o funcionamento do C++Builder é oseu próprio HELP. Se você realmente ambiciona aprender programar C++ usando esse excelente compilador, entendemos que não existemelhor fonte de pesquisas. Grande problema que parte dos programadores iniciantes encontram diz respeito ao idioma. Nemtodos tem facilidades com inglês. Confesso que eu também não possuo grande facilidade. Procuro supri-la com programas que podem ser baixados na própria NET. Particularmente, eu prefiro o Babylon (considero as versões antigas melhores. Aliás, tenho o ótimohábito de não atualizar aplicativos com os quais eu me identifico.Várias vezes me arrependi de atualizá-los, em face de “pequenasarmadilhas” embutidas nas novas versões do tipo: deixar de ser 

 freeware. Nesses casos, se você não tomou o cuidado de fazer um backup do programa de instalação antigo, a dor de cabeças e o

arrependimento poderá ser considerável).

Um dos trabalhos que estaremos disponibilizando, sempre que possível, neste site é a tradução de partes que consideramosfundamentais no HELP do BCB.

 AnsiString continuação...

(operadores relacionais)

Embora ainda não tenhamos abordado o tema (fato reservado paralições futuras), já tivemos oportunidade de apreciar exemplos com oscomandos if e else. Por enquanto tenhamos em mente que essescomandos são usados basicamente para efetuar comparações do tipo:

Se “ A” é maior do que “ B”, faça isso;

Page 99: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 99/102

 

Senão, faça aquilo.

 No caso acima, o termo maior está representando o operador relacional “>”. Para mais detalhes, dê uma olhadinha no tópico quetrata tal assunto.

Ansistring implementa métodos para tratamento de operadoresrelacionais:

// Comparisons bool __fastcall operator ==(const AnsiString & rhs) const; bool __fastcall operator !=(const AnsiString & rhs) const; bool __fastcall operator <(const AnsiString & rhs) const; bool __fastcall operator >(const AnsiString & rhs) const; bool __fastcall operator <=(const AnsiString & rhs) const; bool __fastcall operator >=(const AnsiString & rhs) const;

int __fastcall AnsiCompare(const AnsiString & rhs) const;int __fastcall AnsiCompareIC (const AnsiString & rhs) const; //ignorecase

Vejamos outra implementação de AnsiString:

// Query attributes of string int __fastcall Length() const;

Length() retorna o número de caracteres de um AnsiString. Logo podemos escrever um código mesclando operadores relacionais comessa função:

 void __fastcall TForm1::Button1Click(TObject *Sender ){AnsiString Str  = "Esta é a primeira string";AnsiString Str2 = "Esta é a segunda string";

if(Str .Length() > Str2.Length())ShowMessage((String )"A primeira string é maior. Ela possui " +  Str .Length() + " caracteres");elseShowMessage((String )"A segunda string é maior. Ela possui " +  Str2.Length() + "caracteres");

}

Depois que você estudar os comandos if e else, e os operadoresrelacionais, procure fazer alguns exercícios implementando outros

tipos de comparações suportadas por AnsiString , com outrosoperadores relacionais.

Page 100: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 100/102

 

 AnsiString continuação...

(concatenation)

// ConcatenationAnsiString  __fastcall operator +(const AnsiString & rhs) const;

Podemos usar o operador  + para concatenar  strings (colocar umaapós a outra):

 void __fastcall TForm1::Label1Click(TObject *Sender ){AnsiString AS1 ("\tTestando");AnsiString AS2 ("\n\tAnsiString");String S1 ("\n\nTestando");String S2 ("\nString");Label1 -> Caption = AS1 + AS2 + "\n\t\t\tOutro teste" + S1 +S2 + " !!!!";}

A partir de agora assumimos que você já conhece razoavelmente aclasse AnsiString. Porém ainda há muito mais a conhecer sobrestrings. Dedique algumas horas ao estudo, sempre procurandodocumentar os estudos.

 A palavra-chave typedef 

Podemos usar a palavra-chave typedef para criar um sinônimo paraum tipo de dados existente qualquer. Isso poderá nos auxiliar quandoestivermos lidando com nomes de tipos muito longos e, portanto,sujeito a erros de digitação. Por exemplo, na área dos cabeçalhos,digitamos:

typedef signed short int ssint;

Page 101: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 101/102

 

e, a partir daí, todas as vezes que quisermos declarar uma variávelsigned short int poderemos fazê-lo através da declaração: ssint :

 void __fastcall TForm1::Button1Click(TObject *Sender ){// cria um sinônimo (ssint) para signed short inttypedef signed short int ssint;// declara e inicializa variáveis ssintssint Altura = 15 , Largura = 20, Comprimento = 26 ;ssint Volume;Volume = Altura * Largura * Comprimento;// centraliza o caption de Label1Label1 -> Alignment = taCenter ;// altera o estilo da font de Label1 para negrito, itálico esublinhadoLabel1-> Font-> Style = Label1-> Font-> Style <<fsBold  <<fsItalic <<fsUnderline;

Label1 -> Caption = "******Cálculo do volume de um cubo******\n""Altura = " + String (Altura) + "\n""Largura = " + String (Largura) + "\n""Comprimento = " + String (Comprimento) + "\n""Volume = " + String (Volume);

}

 A diretiva #define

Podemos criar um nome para definir valores constantes através dadiretiva de preprocessador #define. Esse nome é conhecido por constante simbólica.

#define Kelvin -273

Embora Kelvin não tenha sido declarado como nenhum tipo em particular (char, float, AnsiString etc), o compilador saberá lidar 

Page 102: O bit e o byte

5/9/2018 O bit e o byte - slidepdf.com

http://slidepdf.com/reader/full/o-bit-e-o-byte 102/102

 

com os dados da melhor forma possível em virtude do estilo dadeclaração. Por exemplo:

 void __fastcall TForm1::Button1Click(TObject *Sender )

{#define Kelvin -273 #define Frase "Ibirarema é uma pequena cidade do Estado de São Paulo!"#define pi 3.141592653589 #define letra 'A'

/* Essas constantes não são tão constantes afinal.Se, mantendo a declaração anterior, fizéssemos umanova declaração para pi:

#define pi 10

o compilador aceitaria esse novo valor desconsiderando oanterior!!!!!*/ 

Label1 -> Caption = Frase "\n" + AnsiString (Kelvin * pi) +"\n" + letra;

}

Além da habilidade de definir constantes simbólicas, a diretiva#define pode ser usada para definir macros, desde que se lhe forneçaalgum argumento:

#define SOMA(X, Y) (X + Y)

Em capítulos posteriores, estudaremos essa diretiva com detalhes.