View
125
Download
0
Category
Preview:
Citation preview
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.
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,
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.
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
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.
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
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
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:
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
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:
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.
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,
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
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();}
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.
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.
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 ;
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.
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
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.
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 é
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:
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
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
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.
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"
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
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.
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
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
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
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{
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.
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
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.
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://---------------------------------------------------------------------------
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
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 )
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
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...");
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";
}
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:
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
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
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,
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.
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' '§' '%' ' ' '*'
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:
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).
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
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
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
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;}
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:
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
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:
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:
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
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
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);
}
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
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:
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
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
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:
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.
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())
{
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.
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
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.
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
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
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 ;
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"
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)
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
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
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 ("");
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
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
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:
5/9/2018 O bit e o byte - slidepdf.com
http://slidepdf.com/reader/full/o-bit-e-o-byte 82/102
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);
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;
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:
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:
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");
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.
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
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 ; //
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.
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 );
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()
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
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.
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));
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
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;
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.
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;
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
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.
Recommended