Você está na página 1de 54

Estrutura bsica de um programa em C++

Comandos para controle de tela


Manipuladores de tamanho de campos de impresso
Tipos de dados
Leitura de dados do teclado
Operadores aritmticos
Algumas funes matemticas (math.h)
if
FOR
Operador condicional ternrio ? :
while
do while
Switch
Funes
ARRAY
Estruturas
Linguagens de programao:
As linguagens de programao so classificadas em 3 grandes grupos:
- Baixo nvel: Prxima mquina Linguagem de mquina Exemplo:
00111110 00001010
- Alto nvel: Prxima ao ser humano BASIC Exemplo: A=10
- Mdio Nvel: Intermediria Assembly Exemplo: MVI A,0A

A linguagem C++ est classificada como de mdio nvel


Tradutores
Quando fazemos um programa numa linguagem qualquer, ela tem que ser
traduzida para linguagem de mquina. Quem faz isso um programa chamado
tradutor.

Interpretadores e compiladores
Os programas tradutores so divididos em 2 categorias: interpretadores e
compiladores. Os interpretadores traduzem uma instruo e em seguida a
executa e assim sucessivamente at que o programa termine. Os compiladores
traduzem a programa inteiro e depois ele executado.
Existem linguagens que s so interpretadas, um exemplo a MUMPS,
outras s existem compiladas, exemplo: COBOL, outras existem tanto
interpretadas como compiladas, exemplo: BASIC.
A linguagem C++ tradicionalmente compilada.

O processo de compilao:
dividido em 3 etapas:
1-) Edio
2-) Compilao
3-) Execuo
Linguagens de programao http://www.cefetsp.br/edu/mesquita/ling_c/aulas/pi.htm
1 de 24 12/11/2012 19:55

Compiladores para C++:
Existem diversos compiladores para a linguagem C++. Um dos mais
utilizados o Turbo C++, que o que usaremos no nosso curso. O Turbo C++
possui um editor de textos, um compilador e um linkeditor integrados. O processo
de compilao extremamente simples e transparente para o usurio.

Turbo C++
Se ele estiver corretamente instalado, basta abrir uma sesso DOS no
windows e digitar-> c:\TC <enter>

Principais comandos de edio:
CTRL + Y apaga linha sobre o cursor
CTRL + T -> apaga palavra a direita do cursor
Backspace -> apaga caractere esquerda do cursor.
F5 -> ZOOM OUT/IN da janela onde est o cursor

Devemos sempre ter 3 janelas abertas (Window no menu principal): Edio,
Message e Output.

CTRL+F9 -> Compila, linkedita e executa um programa. Os resultados do
programa saem na janela Output.
Introduo ao Borland C++ Builder

C++Builder
Vamos criar programas em C++ para rodar em console e no em
ambiente windows. Para criar esse tipo de programa usando o Borland C++
Builder, devemos agir da seguinte forma:

FILE >> NEW >> OTHER >> CONSOLE WIZARD

Na caixa de dilogo que se abre, devemos deixar setado somente:
C++ e Console Application.

Em seguida aberta uma janela de texto onde digitamos nossos
programas. Essa janela apresenta um texto prvio que deve ser totalmente
descartado.

A princpio, precisamos apenas de dois comandos de edio:

F1 para HELP. O cursor dever estar embaixo da palavra sobre a qual
queremos o HELP

F9 para compilar e executar.

Linguagens de programao http://www.cefetsp.br/edu/mesquita/ling_c/aulas/pi.htm
2 de 24 12/11/2012 19:55


/* Programa exemplo */
#include <conio.h>
#include <iostream.h>
main()
{
clrscr();
cout << "Meu primeiro programa";
getch();
}

Estrutura bsica de um programa em C++
Diretivas de pr-processamento (#)
Corpo do programa
main()
{
---;
---;
}
Dicas
A Linguagem C++ diferencia letras maisculas de minsculas. O programa
deve ser digitado respeitando maisculas e minsculas .
Existe um ponto-e-vrgula ao final de cada linha de instruo da linguagem
C++. No colocar esse smbolo significa escrever erroneamente o
programa.

Linhas de Comentrios
No programa-exemplo digitado podemos encontrar diversas linhas
explicativas. Essas linhas so chamadas linhas de comentrios e so
extremamente importantes para garantir uma boa compreenso do programa e,
automaticamente, sua manuteno.
As linhas de comentrios no influenciam no comportamento do programa e
devem ser colocadas em todos os pontos onde haja qualquer passagem no
bvia do programa.
Uma linha de comentrio deve sempre ser iniciada com a seqncia barra-
asterisco (/*) e terminada com a seqncia asterisco-barra (*/), caso contrrio
ser considerada como parte do programa. Outra alternativa usar //, neste caso
a compilao interrompida at o final da linha.

Dica: Nunca poupe comentrios. Voc sempre vai agradecer quando precisar
mexer novamente no programa !

Comandos para controle de tela
clrscr()
Linguagens de programao http://www.cefetsp.br/edu/mesquita/ling_c/aulas/pi.htm
3 de 24 12/11/2012 19:55
Apaga a tela e coloca o cursor na coluna 1 da linha 1.
A tela dividida em 80 colunas po4 24 linhas.

1,1 80,1

1,24 80,24

gotoxy(col,lin) : Coloca o cursor na coluna col da linha lin

cout << parmetro1 << parmetro2; :Escreve parmetros na tela.
Exemplos:
/* Programa exemplo */
#include <conio.h>
#include <iostream.h>
main()
{
clrscr();
gotoxy(40,12);
cout << "teste" << "muito" << "interessante";
getch();
}

Caracteres de controle
\a -> sinal sonoro
\b -> retrocesso
\n -> nova linha
\r -> retorno de carro
\t -> tabulao
\\ -> \

Exemplos:
#include<conio.h>
#include <iostream.h>
main()
{
clrscr();
cout << "\ateste";
getch();
}

Manipuladores de tamanho de campos de impresso
Os manipuladores de tamanho de campos de impresso esto definidos no
arquivo <iomanip.h>

#include <conio.h>
Linguagens de programao http://www.cefetsp.br/edu/mesquita/ling_c/aulas/pi.htm
4 de 24 12/11/2012 19:55
#include <iostream.h>
#include <iomanip.h>
main()
{
clrscr();
// setw Seleciona o tamanho do prox. campo a ser impresso
cout << 10 << setw(10) << 10 << '\n';
// setfill -> Seleciona o caractere p/ preencher as colunas
// em branco de um campo
cout << setfill ('.');
cout << setw(10) << 10000;
cout << setfill ('b'); // Desabilida setfill
cout << setw(10) << 22;
cout << setprecision(2); // Duas casas decimais
cout << '\n' << 10.146; // Imprime 10.15
cout << setprecision(0); // Desabilita setprecision
cout << '\n' << 10.123456; // Imprime 10.123456
getch();
}

Manipuladores de bases numricas
dec Decimal (modo default)
hex Hexadecimal
oct Octal

cout << hex << 10;
cout << dec << 20; // Volta ao normal

Tipos de dados
TIPO COMP. FAIXA
Char 08 bits -128 a 127
Int 16 bits -32768 a 32767
long 32 bits -2.147483.648 a 2.147.483.647
float 32 bist
3.4x10
-38
a 3.4x10
+38
Double 64 bits
1.7x10
-308
a 1.7x10
+308
long double 80 bits
3.4x10
-4932
a 1.1x10
+4932


Declarao de variveis
#include <stdio.h>
#include <conio.h>
#include <iostream>
main()
{
Linguagens de programao http://www.cefetsp.br/edu/mesquita/ling_c/aulas/pi.htm
5 de 24 12/11/2012 19:55
char s;
float altura;
int idade;
char nome[30];

..... e assim por diante

Leitura de dados do teclado

getchar()
L um caractere do teclado e aguarda return. Exemplo:
#include <stdio.h>
#include <conio.h>
#include <iostream>
main()
{
char a;
clrscr();
cout << "\nDigite um caractere ->";
a=getchar();
fflush(stdin);
cout << a;
cout << "\nDigite outro caractere ->";
fflush(stdin);
a=getchar();
cout << a;
getch();
}

getch()
L um caractere do teclado e no aguarda return.

getche()
L um caractere do teclado e no aguarda return. Ecoa para a tela.

gets()
L uma string.

#include <stdio.h>
#include <conio.h>
#include <iostream>
main()
{
char s[30];
clrscr();
Linguagens de programao http://www.cefetsp.br/edu/mesquita/ling_c/aulas/pi.htm
6 de 24 12/11/2012 19:55
cout << "\nDigite uma string ->";
fflush(stdin);
gets(s);
cout << s;
getch();
}

cin >> varivel
L dados do teclado. prefervel no usar com tipo string.

Exemplo:
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
main()
{
int idade;
float altura;
char nome[30];
cout << "Seu nome:";
gets(nome);
cout << "Sua idade:";
cin >> idade;
cout << "Sua altura:";
cin >> altura;
cout << nome
<< " sua idade "
<< idade
<< " e sua altura "
<< altura;
getch();
}

Operadores aritmticos
Operador Ao
+ Adio
* Multiplicao
/ Diviso
% Resto de Diviso Inteira
- Subtrao
-- Decremento
++ Incremento

Exemplo: Programa que calcula a rea de um tringulo.
#include <stdio.h>
Linguagens de programao http://www.cefetsp.br/edu/mesquita/ling_c/aulas/pi.htm
7 de 24 12/11/2012 19:55
#include <conio.h>
#include <iostream>
main()
{
float base,altura,area;
clrscr();
cout << "Base....:";
cin >> base;
cout << "Altura..:";
cin >> altura;
area = base*altura/2;
cout << "Area = << area;
getch();
}

Algumas funes matemticas (math.h)
abs(x) retorna absoluto de x
pow10(p) retorna 10 elevado a p
pow(x,y) retorna x elevado a y
sqrt(x) retorna a raiz quadrada de x
exp(x) retorna e (no. de neper) elevado a x
log(x) retorna log de x na base e
log10(x) retorna log de x na base 10*
cos(x)
sin(x)
tan(x) (x deve estar en radianos)
acos(x)
asin(x)
atan(x)

Exerccios:
Faa um programa que converta nmeros complexos da forma retangular
para a forma polar:

Faa um programa que converta nmeros complexos da forma polar para a
forma retangular:

Operadores de atribuio compostos
x = x * 5 x * = 5
a = a + 1 a + = 1 ou a ++
x = x / b x / = b
y = y 1 y - = 1 ou --y

goto: Transfere a sequncia de execuo.
Sintaxe: goto <identificador>;
Linguagens de programao http://www.cefetsp.br/edu/mesquita/ling_c/aulas/pi.htm
8 de 24 12/11/2012 19:55
Exemplo:
inicio:
-----;
-----;
goto inicio;

if
Sintaxe 1:
if ( <expresso> ) <comando1>;

Comando1 ser executado se expresso for verdadeira (diferente de zero).

Sintaxe 2:
if ( <expresso> ) <comando1>;
else <comando2>;

Comando1 ser executado se expresso for verdadeira (diferente de zero)
caso contrrio comando2 ser executado.

Operadores relacionais
So usados para comparar expresses. Resultam em falso ou verdadeiro.

= = (igual comparao) - compara se 2 valores so iguais
> (maior que)
< (menor que)
>= (maior ou igual)
<= (menor ou igual)
!= (diferente)

Operadores lgicos
Permitem relacionar duas ou mais expresses.

&& (e) - resulta em verdadeiro se ambas expresses forem verdadeiras
| | (ou) - resulta em verdadeiro se pelo menos uma expresso for
verdadeira
! (no) - resulta em verdadeiro se a expresso for falsa

ex.:
(5 > 2) && (3 != 2) VERDADEIRO
(5 < 2) && (3 != 2) FALSO
(5 < 2) && (3 == 2) FALSO
(3 >= 2) | | (4 != 2) VERDADEIRO
(3 >= 2) | | (4 = = 2) VERDADEIRO
(3 <= 2) | | (4 = = 2) FALSO
!(4 = = 2) VERDADEIRO
Linguagens de programao http://www.cefetsp.br/edu/mesquita/ling_c/aulas/pi.htm
9 de 24 12/11/2012 19:55
!(4 != 2) FALSO

Exerccio: Fazer um programa que leia um nmero inteiro do teclado e diga se ele
par ou impar

Exerccio: Fazer um programa que leia dois nmeros do teclado e diga qual o
maior

Exerccio: Fazer um programa que leia 3 nmeros do teclado e apresente a soma
entre o maior e o menor

Exerccio: Fazer um programa que leia 3 nmeros do teclado e os apresente em
ordem crescente

FOR
Sintaxe:
for ( [<expr1>] ; [<expr2>] ; [<expr3>] ) <comando>;

Comando executado at que expr2 seja falsa (0).

A avaliao de expr1 feita uma nica vez e antes da primeira interao do loop.
Isto usualmente feito para inicializar variveis para o LOOP.

Expr2 uma expresso lgica que avaliada antes de cada interao do loop, e
caso resulte falso, o loop encerrado.

Aps cada interao do LOOP, expr3 avaliada. Isto feito normalmente para
incrementar o contador do LOOP e tornar expr2 falsa sob determinada
circunstncia.

Exemplo:

#include <stdio.h>
#include <conio.h>
#include <math.h>
main()
{
int i;
clrscr();
for (i=1;i<11;i++) cout << i << endl;
getch(); /*espera por uma tecla */
}

Exerccio:Fazer um programa que calcule S para N lido do teclado:
S=1/1+1/2+1/3+1/4+....1/N

Linguagens de programao http://www.cefetsp.br/edu/mesquita/ling_c/aulas/pi.htm
10 de 24 12/11/2012 19:55
Exerccio: Faa um programa que calcule a soma de todos os nmeros
compreendidos entre dois nmeros inteiros lidos do teclado.

Exerccio: Faa um programa para calcular o fatorial de um nmero lido do
teclado.

Exerccio: Faa um programa que leia um nmero inteiro do teclado e a seguir
diga se ele primo.

Exerccio: Faa um programa que some todos os nmeros pares compreendidos
entre dois nmeros inteiros lidos do teclado:

Exerccio: Faa um programa que leia 3 nmeros reais do teclado e a seguir diga
se so lados de um tringulo, se forem, ento dizer qual o tipo do tringulo.

Exerccio: Fazer um programa que some todos os nmeros primos compreendidos
entre dois nmeros inteiros lidos do teclado.

Operador condicional ternrio ? :

Sintaxe: exp1 ? exp2 : exp3

Se exp1 for verdadeira, resulta exp2, se falsa, resulta exp3
Exemplo:
max= (a>b) ? a : b;
max ficar igual ao maior valor entre a e b

while
while (expresso_lgica)
{
-
}

Executa o bloco enquanto a expresso_lgica for verdadeira

EXERCCIO(05-01): Fazer um programa usando while que calcule S para N lido do
teclado:
S=1/1+1/2+1/3+.....+1/N


do while
do
{
-
} while (expresso_lgica);
Linguagens de programao http://www.cefetsp.br/edu/mesquita/ling_c/aulas/pi.htm
11 de 24 12/11/2012 19:55

Executa o bloco enquanto expresso_lgica for verdadeira.


break e continue

So utilizados com os comandos FOR WHILE DO WHILE.
Break: fora a sada do lao:
for (x=1 ; x < 10 ; x++)
{
cout << "\nx=" << x;
if (x==5) break;
}

Continue: fora a prxima interao do lao e pula o cdigo que estiver
abaixo:
for (x=1 ; x < 10 ; x++)
{
if (x==5) continue;
cout << "\nx=" << x;
}

Switch
Sintaxe:
switch <varivel> {
case <constante 1> : <comandos>;
[break;]
case <constante 2> : <comandos>;
[break;]
case <constante 3> : <comandos>;
[break;]
[default : <comandos>;]
}

Observe que break serve para terminar a seqncia de comandos em
execuo, por serem opcionais, se forem suprimidos permitem que o case a
seguir seja executado, sem haver qualquer quebra na seqncia do
processamento

#include<stdio.h>
#include<conio.h>
#include<iostream.h>
main()
{ char nota; clrscr();
do {
Linguagens de programao http://www.cefetsp.br/edu/mesquita/ling_c/aulas/pi.htm
12 de 24 12/11/2012 19:55
cout << "\n\nNota:";
cin >> nota;
switch (nota){
case 'A': cout << "A:Excelente";
break;
case 'B': cout << "B:Muito bom";
break;
case 'C': cout << "C:razovel";
break;
case 'D': cout << "D:precisa melhorar";
break;
case 'E': cout << "B:muito ruim";
break;
default: cout << "essa nota no existe";
nota='0'; }
} while ( nota !='0');
getch();
}


Exerccio: Programa l um nmero, um operador e outro nmero e apresenta o
resultado

Funes

Forma Geral:

Tipo Nome_da_funo (lista de parmetros)
{
corpo
}

Funes que no retornam valores

Ex1:
#include<stdio.h>
#include<conio.h>
#include<iostream.h>

//prottipo da funo desenha()
//esta funo global:pode ser usada por main() e
//por outras funes
void desenha();

main ( )
Linguagens de programao http://www.cefetsp.br/edu/mesquita/ling_c/aulas/pi.htm
13 de 24 12/11/2012 19:55
{
clrscr();
desenha();
cout << "\nusando funes\n";
desenha();
getch();
}
void desenha() // definio da funo desenha()
{
int i;
for (i = 0; i <= 10; i++) cout << '-';
}


Ex2:
#include<stdio.h>
#include<conio.h>
#include<iostream.h>
main ( )
{
//prottipo da funo desenha()
//esta funo local a main()
void desenha();
clrscr();
desenha();
cout << "\nusando funes\n";
desenha();
getch();
}
void desenha() // definio da funo desenha()
{
int i;
for (i = 0; i <= 10; i++) cout << '-';
}

Funes que retornam valores
Exemplo: Calcula fatorial de um nmero lido do teclado
#include<conio.h>
#include<iostream.h>
long fatorial(int i);
main ( )
{
int n;
while(1) {
cout << "\n\n(N<0 = FIM) N=";
Linguagens de programao http://www.cefetsp.br/edu/mesquita/ling_c/aulas/pi.htm
14 de 24 12/11/2012 19:55
cin >> n;
if (n<0) break;
cout << "...................."
<< n
<< "! = "
<< fatorial(n);
}
}
long fatorial(int i)
{
int x,f;
f=1;
for (x=1; x<=i; x++) f*=x;
return(f); }


Funes recursivas
#include<conio.h>
#include<iostream.h>
long fatorial(int i);
main ( )
{
int n;
while(1) {
cout << "\n\n(N<0 = FIM) N=";
cin >> n;
if (n<0) break;
cout << "...................."
<< n
<< "! = "
<< fatorial(n);
}
}

long fatorial(int i)
{
int x,f;
switch(i){
case(0): return(1);
case(1): return(1);
default: return(i*fatorial(i-1));
}
}

Exerccio (08-03): Fazer um programa que calcule S (x,n) para x e n lidos do
Linguagens de programao http://www.cefetsp.br/edu/mesquita/ling_c/aulas/pi.htm
15 de 24 12/11/2012 19:55
teclado. A resoluo dever ter pelo menos duas funes. Usar recurso.
S(x, n) = x
1
/1! + x
2
/2! + x
3
/3! + ... + x
n
/ n!

Exerccio (08-04): Faa um programa que ache o enzimo elemento da seqncia
de Fibonnacci usando funo com recurso.

Exerccio (08-05): Faa um programa que calcule X
Y
utilizando uma funo recursiva
chamada potncia(long i,long y) que aceite dois argumentos longs i e j. A funo
retorna o i elevado potncia j. Use a seguinte definio:
i
0
=1
i
1
=i
i
j
=i*i
j-1


ARRAY
Arrays, tambm conhecidos como vetores ou matrizes, correspondem a
elementos do mesmo tipo agrupados com o mesmo nome e diferenciados entre si
atravs de ndices.
Na linguagem C, todos os vetores consistem em posies de memria
contguas, sendo que o endereo mais baixo corresponde ao primeiro elemento e
o endereo mais alto ao ltimo elemento.

Declarao de Arrays

<tipo> <nome> [<tamanho>];

char nome[20]; int n_teste[10]; float preco[30];

Nos exemplos acima, temos definidos arrays de uma dimenso, unidimensionais.
O ndice comea no nmero zero, portanto:

Int a[5]; teria os seguintes elementos:
a[0] a[1] a[2] a[3] a[4]

Exemplo: programa que l 10 inteiros do teclado e a seguir apresenta os nmeros
lidos de trs para frente:

#include <stdio.h>
#include <conio.h>
#include <iostream.h>
main()
{
int n[10];
register int x;
Linguagens de programao http://www.cefetsp.br/edu/mesquita/ling_c/aulas/pi.htm
16 de 24 12/11/2012 19:55
for (x=0;x<10;x++)
{
cout << "n[" << x << "] = ";
cin >> n[x];
}
for (x=9;x != -1; x--) cout << "\n" << n[x];
getch();
}


Exerccio:Programa que l no mximo 100 nmeros reais do teclado para um
array e a seguir apresenta a soma entre eles.

Exerccio:Programa que l no mximo 100 nmeros reais do teclado para um
array e a seguir apresenta a soma entre o maior e o menor nmero lido.

Exerccio:Programa que l no mximo 100 nmeros inteiros do teclado para um
array e a seguir apresenta o maior nmero par lido:


Inicializao de array unidimensional
Numrico:
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
main()
{
int n[3]={1,2,3};
/* ou
int a[]={5,10,15};
*/
clrscr();
cout << n[1]);
getch();
}

Caracteres:

char c[] = { t,a,l};
Ou
char c[] = tal;


Array como parmetro de funes
Linguagens de programao http://www.cefetsp.br/edu/mesquita/ling_c/aulas/pi.htm
17 de 24 12/11/2012 19:55
Exemplo:
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
/* Repare que o primeiro parmetro da funo maior
um array sem especificar o nmero de elementos */
int maior(int matriz[],int tamanho)
{
int x,m;
m=matriz[0];
for(x=1;x<tamanho;x++)
if (matriz[x]>m) m=matriz[x];
return (m);
}
main()
{
int x,n[100],q;
inicio:
cout << "\n\nQuantos nmeros: ";
cin >> q;
if (q>100) q=100;
for(x=0;x<q;x++){
cout << "n[" << x << "] = ";
cin >> n[x]; }
/* repare que ao chamarmos a funo maior entregamos
somente o nome da matriz */
cout << maior(n,q);
getch();
}
O nome de um array sem colchetes representa o endereo de memria do
primeiro elemento do array.


Exerccio(09-10) Faa uma funo chamada: maior_par(n[],tamanho) que
retorna o maior par do array n[]. Caso no exista pares, ento retorna -1.
Faa um programa que leia no mximo 100 nmeros inteiros do teclado e a
seguir mostre o maior par lido. Usar a funo maior_par(n[],tamanho).


Array Multidimensional
Ns tambm podemos trabalhar com arrays multidimensionais. Exemplos:

int m[10][5]; estamos declarando um array chamado m de duas
Linguagens de programao http://www.cefetsp.br/edu/mesquita/ling_c/aulas/pi.htm
18 de 24 12/11/2012 19:55
dimenses, uma varia de 0 a 9
e a outra de 0 a 4.

m[0][0] m[0][1] ..... m[0][4]
m[1][0] m[1][1] ..... m[1][4]
............. ............. .............
m[9][0] m[9][1] ..... m[9][4]


float preco[10][5][20];
A varivel preco tem 3 dimenses

Exerccio(10-01): Programa que l uma matriz 4x3 de nmeros inteiros e a seguir
mostra o maior nmero lido.

Exerccio(10-02): Programa que l uma matriz 2x3x4 de nmeros inteiros e a seguir
mostra a soma do maior com o menor nmero lido.

Exerccio(10-03): Programa que l duas matrizes 2x3 de nmeros inteiros do teclado
e a seguir apresenta a matriz correspondente soma entre elas.


Inicializao de array multidimensional

Array numrico:

int a[2][3] =
{
{10,3,4},
{10,3,2}
} ou
int a[2][3]={10,3,4,10,3,2}

Array de caracteres

char nome[4][10]=
{
thelmo,
joao,
martins,
mesquita
}

Estruturas
Estruturas so tipos de variveis criados pelo prprio usurio (programador)
Linguagens de programao http://www.cefetsp.br/edu/mesquita/ling_c/aulas/pi.htm
19 de 24 12/11/2012 19:55
que agrupam dados geralmente desiguais. Podem ser criadas pela palavra-chave
struct.
O exemplo abaixo mostra como definir uma estrutura e como acessar os
membros das estrutura:
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
struct pessoa {
char nome[30];
int idade;
float altura; };
main()
{ pessoa p;
p.idade=52;
p.altura=1.7;
strcpy(p.nome,"Thelmo");
cout << p.nome << endl
<< p.idade << endl
<< p.altura;
getch();
}

Observaes:
1-) No exemplo acima, foi definido o tipo pessoa antes de main(), portanto
um tipo global e pode ser usado por todas funes declaradas. Se fosse
definido dentro de main(), ento esse tipo s poderia ser usado dentro de
main().
2-) Eventualmente podemos definir um tipo de dado e ao mesmo tempo
declarar variveis desse tipo, neste caso estaramos combinando
declaraes, exemplo:

struct { // no necessrio o nome
char nome[30];
int idade;
float altura; } p1,p2,p3;


Inicializando estruturas
A inicializao de estruturas semelhante a de matrizes. Exemplo:
struct data
{
int dia;
char mes[10];
int ano;
};
Linguagens de programao http://www.cefetsp.br/edu/mesquita/ling_c/aulas/pi.htm
20 de 24 12/11/2012 19:55
....
main()
{
data aniversario = { 30, "junho", 1995 };
....
}

Atribuio entre estruturas
Atribuio entre estruturas pode ser feita normalmente atravs de uma
atribuio simples.
Exemplo:

#include <stdio.h>
#include <conio.h>
#include <iostream.h>
main()
{
struct {
int idade;
float altura;
} a,b;
a.idade=50;
a.altura=1.70;
b=a;
cout << b.idade << endl << b.altura;
getch();
}

Operaes com estruturas
No se pode fazer operaes diretamente entre as variveis de uma determinada
estrutura e sim
entre os membros das estruturas. Exemplo:

#include <stdio.h>
#include <conio.h>
#include <iostream.h>
struct teste
{
int i;
float f;
};
main()
{
teste a = {10,11.1},
b = {20,22.2},
c;
Linguagens de programao http://www.cefetsp.br/edu/mesquita/ling_c/aulas/pi.htm
21 de 24 12/11/2012 19:55
// c=a+b; ERRADO !!!!!!!!!!!
c.i=a.i+b.i;
c.f=a.f+b.f;
cout << c.i << endl << c.f;
getch();
}

Estruturas aninhadas
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
struct data {
int dia;
char mes[10];
int ano; };
struct pessoa {
char nome[30];
float altura;
data aniversario; };
main()
{
pessoa p={"Thelmo Mesquita" , 1.70 , {29,"julho",1954}};
clrscr();
cout << p.nome << endl;
cout << p.altura << endl;
cout << p.aniversario.dia << " de ";
cout << p.aniversario.mes << " de ";
cout << p.aniversario.ano;
getch();
}

Passando estruturas para funes
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
struct data {
int dia;
char mes[10];
int ano; };
mostra_data(data x)
{
cout << x.dia << " de ";
cout << x.mes << " de ";
cout << x.ano;
}
Linguagens de programao http://www.cefetsp.br/edu/mesquita/ling_c/aulas/pi.htm
22 de 24 12/11/2012 19:55
data ano_mais_um(data x)
{
x.ano++;
return(x);
}
main()
{
data d1,d2;
d1.dia=29;
strcpy(d1.mes,"julho");
d1.ano=1954;
clrscr();
d2=ano_mais_um(d1);
mostra_data(d2);
getch();
}


Exerccio(11-01): Faa um programa que:
Defina uma estrutura contendo dois tipos de dados, um para amarzenar o nome
de uma pessoa e um para conter a sua idade;
Declare um array para conter 100 elementos da estrutura acima;
Leia no mximo 100 nomes de pessoas e suas respectivas idades para o array
criado;
Liste na tela pessoas com idade superior a 18 anos.

Exerccio(11-02): Faa um programa que:
Defina uma estrutura contendo dois tipos de dados, um para amarzenar o
nome de uma pessoa e um para conter a sua idade;
Declare um array para conter 100 elementos da estrutura acima;
Leia no mximo 100 nomes de pessoas e suas respectivas idades para o
array criado;
Ordene o array por ordem crescente de idade ;
Liste na tela o array.

Exerccio(11-03) Faa um programa que:
Defina uma estrutura contendo dois tipos de dados, um para amarzenar o
nome de uma pessoa e um para conter a sua idade;
Declare um array para conter 100 elementos da estrutura acima;
Leia no mximo 100 nomes de pessoas e suas respectivas idades para o
array criado;
Faa pesquisa por substring no campo nome

Linguagens de programao http://www.cefetsp.br/edu/mesquita/ling_c/aulas/pi.htm
23 de 24 12/11/2012 19:55















Linguagens de programao http://www.cefetsp.br/edu/mesquita/ling_c/aulas/pi.htm
24 de 24 12/11/2012 19:55
Ponteiros

Variveis tipo ponteiro ou simplesmente ponteiros, so variveis que contm
o endereo de valores em memria.
Existe um tipo de ponteiro para todo tipo de dado. Podemos usar ponteiros
para inteiros, para caracteres, para reais e assim por diante.


Declarando ponteiros

int *p_idade;
float *p_altura;

e assim por diante....


Operador &

Retorna o endereo de uma varivel. Exemplo:

#include<stdio.h>
#include<conio.h>
#include<iostream.h>
main()
{
int a,b;
clrscr();
cout << hex << &a << endl;
cout << hex << &b;
getch();
}


Operador *

Acessa o contedo de um endereo.

#include<stdio.h>
#include<conio.h>
#include<iostream.h>
main()
{
int idade,*p_inteiro;
p_inteiro=&idade; // p_inteiro contm o endereo da varivel idade
idade=50;
clrscr();
cout << *p_inteiro; // mostra o contedo da varivel idade
Strings http://www.cefetsp.br/edu/mesquita/ling_c/aulas/ponteiros.htm
1 de 4 12/11/2012 19:56
*p_inteiro=30; // altera o contedo da varivel idade
cout << endl << idade;
getch();
}

Exerccio: o que ser escrito na tela?
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
main()
{
int y, *p, x;
y = 0;
p = &y;
x = *p;
x = 4;
(*p)++;
x--;
(*p) = (*p)+x;
cout << "y = " << y;
getch();
}
Exerccio: Programa que calcula o fatorial de um nmero. O acesso a todas as variveis deve
ser feito via ponteiros.


Passando endereos para funes

#include<stdio.h>
#include<conio.h>
#include<iostream.h>
/* a funo troca no retorna nada e depende de dois ponteiros para inteiros
Supondo que ela recebe endereos de variveis, ento os contedos dessas
variveis sero trocados */
void troca( int *a, int *b)
{
int temp;
temp=*a;
*a=*b;
*b=temp;
}
void main()
{
int x,y;
x=10;y=20;
troca(&x,&y);
Strings http://www.cefetsp.br/edu/mesquita/ling_c/aulas/ponteiros.htm
2 de 4 12/11/2012 19:56
clrscr();
cout << "x=" << x << endl;
cout << "y=" << y;
getch();
}


Ponteiros e matrizes

O nome de uma matriz um ponteiro que aponta para para o primeiro
elemento da matriz.

#include<stdio.h>
#include<conio.h>
#include<iostream.h>
void main()
{
int m[5] = {5,4,3,2,1};
clrscr();
cout << *(m); // mostra 5, primeiro elemento
cout << endl << *(m+1); //mostra 4, segundo elemento
getch();
}

#include<stdio.h>
#include<conio.h>
#include<iostream.h>
void main()
{
int x,m[5] = {10,20,30,40,50};
clrscr();
for (x=0;x<5;x++) cout << endl << *(m+x);
getch();
}


Observao:

O nome de uma matriz um ponteiro que aponta para o primeiro elemento
da matriz e portanto uma constante. No podemos escrever coisas do tipo:

++3 ou ++m

tanto 3 como m (nome de matriz) so constantes !!!!

Portanto, seria errado escrever algo do tipo:

Strings http://www.cefetsp.br/edu/mesquita/ling_c/aulas/ponteiros.htm
3 de 4 12/11/2012 19:56
For(x=0;x<5;x++) cout << endl << *(m++)

Poderamos resolver o problema assim:

#include<stdio.h>
#include<conio.h>
#include<iostream.h>
void main()
{
int x,*p_x,m[5] = {10,20,30,40,50};
clrscr();
p_x=m;
for (x=0;x<5;x++) cout << endl << *(p_x++);
getch();
}


Exerccio (13-01): Programa que l no mximo 100 nmeros inteiros para uma
matriz e a seguir apresenta a soma dos elementos pares. O acesso aos elementos da
matriz dever ser feito por ponteiros.

Exerccio (13-02): Programa que utiliza uma funo que recebe como parmetros
um array de nmeros inteiros e a quantidade de elementos do array, e retorna o
maior nmero impar do array.











Strings http://www.cefetsp.br/edu/mesquita/ling_c/aulas/ponteiros.htm
4 de 4 12/11/2012 19:56
OPERADORES BIT-A-BIT
C++ possui 6 operadores bit-a-bit. Estes operadores operam somente em dados do
tipo char ou int.
Os operadores so:
& - E
| - OU
^ - OU EXCLUSIVO
~ - COMPLEMENTO
>> - DESLOC. DIREITA
<< - DESLOC. ESQUERDA
OBS: Lembrem-se que INT ocupa 4 bytes.

OPERADOR & (E)
unsigned int x1=0xf,x2=0xe, z;
z = x1 & x2; // resulta: e
/* x1 = 1111
x2 = 1110
x1 & x2 =1110 */

OPERADOR | (OU)
z = x1 | x2; // resulta: f
/* x1 = 1111
x2 = 1110
x1 | X2 = 1111 */

OPERADOR ^ (OU EXCLUSIVO)
z= x1 ^ x2; // resulta :1
/* x1 = 1111
x2 = 1110
x1 ^ x2 = 0001 */

OPERADOR << (DESLOCAMENTO ESQUERDA)
z = x1 << 2; // resulta: 3c
/* x1 = 1111
x1 << 2=111100 */

OPERADOR >> (DESLOCAMENTO DIREITA)
z = x2 >> 1; // resulta: 7
/* x2 = 1110
x2 >> 1= 0111 */

OPERADOR ~ ( COMPLEMNTO)
z = ~x2;
/* x2 = 0000 0000 0000 0000 0000 0000 0000 1110
~x2 = 1111 1111 1111 1111 1111 1111 1111 0001 */

Exerccio (12-01) Quando lemos um byte da porta paralela, no temos acesso
Operadores bit-a-bit http://www.cefetsp.br/edu/mesquita/ling_c/aulas/bit-a-bit.htm
1 de 2 12/11/2012 20:01
aos trs primeiros bits do byte e alm disso, o bit mais significativo vem invertido.
Faa um programa que leia um byte do teclado e a seguir inverta o bit
mais significativo e zere os trs bits menos significativos.

Exerccio 12-02) Faa um programa que leia um byte do teclado e a seguir
zere os bits 3 e 4, e inverta os bits 0 e 7. O resultado dever ser mostrado
em hexadecimal na tela.












Operadores bit-a-bit http://www.cefetsp.br/edu/mesquita/ling_c/aulas/bit-a-bit.htm
2 de 2 12/11/2012 20:01
Arquivos em disco
Para usar todas as funes citadas abaixo necessrio usar o header fstream.h

OPEN()
Antes de gravar ou ler dados em um arquivo, necessrio abri-lo. Para tanto usamos a
funo open().
Abre um arquivo para gravao ou leitura.

Sintaxe: tipo_fstream.open("nome_do arquivo_em_disco",modo);

Principais modos:

ios::in Abre arquivo para leitura
ios::out Abre arquivo para gravao. Se o arquivo existir, ele destrudo e criado
novamente. Se no existir, ento criado
ios::ate Abre e posiciona no final do arquivo


Exemplo1:
fstream arquivo; // declara a varivel arquivo do tipo fstream
arquivo.open("c:/lixo/dados.dat",ios::out); //abre arq. para gravao

Exemplo2:
fstream arquivo;
arquivo.open(dados.dat,ios::in | ios::out);
// abre arquivo para leitura e escrita

Exemplo3:
fstream arquivo;
arquivo.open(dados.dat,ios::ate | ios::in | ios::out);
// abre arquivo para leitura e escrita posicionando no fim do arquivo)

CLOSE()
Fecha arquivo.
Exemplo:
// fecha arquivo
arquivo.close();
FAI L()
Retorna verdadeiro caso haja erro na abertura ou criao de um arquivo em disco.
Exemplo:
fstream arquivo;
arquivo.open("c:/lixo/dados.dat",ios::out);
// verifica se falhou a criao do arquivo
if (arquivo.fail())
cout << endl << "oops, no consegui criar o arquivo ";
else
{ comandos de operao sobre o arquivo }

CLEAR()
Todas operaes que envolvem arquivos e que resultam em erros, por exemplo: tentar
abrir um arquivo e no conseguir, tentar ler dados de um arquivo e tambm no se conseguir
por talvez j estar no fim do arquivo, etc, ir setar bits para indicar esses erros. Depois
Strings http://www.cefetsp.br/edu/mesquita/ling_c/aulas/arquivos.htm
1 de 8 12/11/2012 20:02
podemos usar funes especficas para se testar esses bits e verificar possveis providncias no
caso de erros. Seja como for, esses bits setados no caso de erros, devem ser resetados para
que possamos operar com o arquivo em que houve erro. Isso feito pela funo clear().
Exemplo:

fstream arquivo;
arquivo.open("c:/lixo/dados.dat",ios::ate|ios::in|ios::out);
if (arquivo.fail()) {
cout << endl << "oops, arquivo no existe" << endl;
arquivo.close();
arquivo.clear();
arquivo.open("c:/lixo/dados.dat",ios::out); // arquivo criado

GETLI NE()
L uma linha do arquivo.
Sintaxe: tipo_fstream.getline(buffer,MAX)

L uma linha do arquivo de no mximo MAX caracteres, ou at que seja lido um \n, e
armazena em buffer.

GRAVANDO E LENDO STRI NGS
#include<iostream.h>
#include<fstream.h>
#include<conio.h>
void main()
{ fstream arquivo;
arquivo.open("c:/lixo/dados.dat",ios::out);
if (arquivo.fail())
cout << endl << "oops, no consegui criar o arquivo ";
else
{
arquivo << "este teste" << endl;
arquivo << " muito" << endl;
arquivo << "interessante mesmo" << endl;
arquivo.close();
}
arquivo.open("c:/lixo/dados.dat",ios::in);
if (arquivo.fail())
cout << endl << "encontrei problemas";
else
{
char linha[80];
/* uma leitura de dados de um arquivo retorna 0 quando se atinge o fim do arquivo e um
nmero qualquer quando no se atinge o fim do arquivo */
while (arquivo.getline(linha,80))
cout << endl << linha;
arquivo.close();
arquivo.clear(); //limpar o bit que indica dim de arquivo
}
getch();
}


Strings http://www.cefetsp.br/edu/mesquita/ling_c/aulas/arquivos.htm
2 de 8 12/11/2012 20:02




GRAVANDO E LENDO CARACTERES
#include<iostream.h> // cout e cin
#include<fstream.h> // operaes com arquivos
#include<conio.h> // getch()
void main()
{
fstream arquivo;
arquivo.open("c:/lixo/dados.dat",ios::out);
if (arquivo.fail())
cout << endl << "oops, no consegui criar o arquivo ";
else
{
arquivo << '1';
arquivo << '2';
arquivo.close();
}
arquivo.open("c:/lixo/dados.dat",ios::in);
if (arquivo.fail())
cout << endl << "encontrei problemas";
else
{
char letra;
clrscr();
while (arquivo >> letra)
cout << letra;
arquivo.close();
arquivo.clear();

}
getch();
}







GRAVANDO E LENDO NMEROS
#include<iostream.h> // cout e cin
#include<fstream.h> // operaes com arquivos
#include<conio.h> // getch()
void main()
{
fstream arquivo;
arquivo.open("c:/lixo/dados.dat",ios::out);
if (arquivo.fail())
cout << endl << "oops, no consegui criar o arquivo ";
else
Strings http://www.cefetsp.br/edu/mesquita/ling_c/aulas/arquivos.htm
3 de 8 12/11/2012 20:02
{
arquivo << 2 << endl;
arquivo << 2.1 << endl;
arquivo << 2.2 << endl;
// fecha arquivo
arquivo.close();
}
arquivo.open("c:/lixo/dados.dat",ios::in);
if (arquivo.fail())
cout << endl << "encontrei problemas";
else
{
float n;
while (arquivo >> n) cout << endl << n*2;
arquivo.clear();
arquivo.close();
}
getch();
}

Gravando e lendo estruturas

write()
Recebe dois argumentos, o primeiro o endereo da varivel a ser gravada (o endereo
dever ser convertido para um ponteiro char), e o segundo, o tamanho da varivel em bytes.

read()
Recebe dois argumentos, o primeiro o endereo da varivel (dever ser convertido
para um ponteiro char) para onde ser enviado o dado lido e o segundo argumento o
tamanho da varivel em bytes.

Exemplo:
#include<iostream.h>
#include<fstream.h>
#include<conio.h>
struct pessoa {
char nome[20];
int idade; };
void main()
{
fstream arquivo;
pessoa p1,p2;
arquivo.open("c:/lixo/dados.dat",ios::out);
if (arquivo.fail())
cout << endl << "oops, no consegui criar o arquivo ";
else
{
strcpy(p1.nome,"thelmo mesquita");
p1.idade=51;
arquivo.write((char *)&p1,sizeof(p1));
arquivo.close();
}
arquivo.open("c:/lixo/dados.dat",ios::in);
Strings http://www.cefetsp.br/edu/mesquita/ling_c/aulas/arquivos.htm
4 de 8 12/11/2012 20:02
if (arquivo.fail())
cout << endl << "encontrei problemas";
else
{
arquivo.read((char *)&p2,sizeof(p2));
cout << p2.nome << endl << p2.idade <<endl;
arquivo.close();
}
getch();
}

SEEKG() e SEEKP()
Para cada arquivo aberto, temos dois ponteiros que indicam a posio corrente de leitura
e a posio corrente de gravao. As funes seekg() e seekp() permitem alterar essas
posies sendo seekg() para a posio de leitura e seekp() para a posio de gravao.
Tanto seekg() como seekp() tem a mesma sintaxe:

arquivo.seekg(nmero_de_bytes,posio);

Nmero_de_bytes o nmero de bytes a ser deslocado a partir da posio estabelecida que
pode ser:

ios::beg a partir do incio do arquivo (default qdo no citado)
ios::cur a partir da posio corrente
ios::end a partir do fim do arquivo

Por exemplo: para colocar o ponteiro de leitura no incio de um arquivo ->
arquivo.seekg(0);

TELLG() e TELLP()
Tellg() retorna a posio corrente de leitura (em bytes), sempre a partir do incio do
arquivo. Tellp() retorna a posio corrente de gravao.

Exerccio: Fazer um programa que monte o seguinte menu:
"0 - Sai do programa"
"1 - Inclui registro"
"2 - Deleta registro"
"3 - Lista todos registros"
"4 - Pesquisa por nome"

Sendo que o registro tem a seguinte estrutura:
struct pessoa {
char nome[20];
int idade; };

#include<iostream.h>
#include<fstream.h>
#include<conio.h>
#include<iomanip.h>
#include<clx.h>
struct pessoa {
char nome[20];
int idade; };
Strings http://www.cefetsp.br/edu/mesquita/ling_c/aulas/arquivos.htm
5 de 8 12/11/2012 20:02
fstream arquivo,temp;
pessoa p1,p2;
void inclui_registro();
void lista_registros();
void pes_nome();
void deleta_reg();
void main()
{
char tecla;
/* Verifica se arquivo existe, se no existe, ento cria */
arquivo.open("c:/lixo/dados.dat",ios::in);
if (arquivo.fail())
{
arquivo.clear();
arquivo.open("c:/lixo/dados.dat",ios::out);
arquivo.close();
}
else arquivo.close();
do {
clrscr();
cout << "0 - Sai do programa";
cout << endl << "1 - Inclui registro";
cout << endl << "2 - Deleta registro";
cout << endl << "3 - Lista todos registros";
cout << endl << "4 - Pesquisa por nome";
cout << endl << "............................SUA ESCOLHA:";
tecla=getchar();
switch(tecla) {
case '0': break;
case '1': inclui_registro();
break;
case '2': deleta_reg();
break;
case '3': lista_registros();
break;
case '4': pes_nome();
break;
}
} while(tecla !='0');
}
void inclui_registro()
{
clrscr();
arquivo.clear();
arquivo.open("c:/lixo/dados.dat",ios::in | ios::out | ios::ate);
cout << "................... INCLUSAO DE REGISTROS .....................";
cout << endl << "Para encerrar digite um nome em branco";
while(1) {
cout << endl << "Nome = ";
fflush(stdin);
gets(p1.nome);
if (strlen(p1.nome) == 0) break;
cout << "Idade = ";
Strings http://www.cefetsp.br/edu/mesquita/ling_c/aulas/arquivos.htm
6 de 8 12/11/2012 20:02
cin >> p1.idade;
arquivo.write((char *)&p1,sizeof(p1));
}
arquivo.close();
}
void lista_registros()
{ int r;
r=0;
clrscr();
cout << setfill('.');
arquivo.clear();
arquivo.open("c:/lixo/dados.dat",ios::in);
while (arquivo.read((char *)&p2,sizeof(p2))) {
r++;
cout << setw(3)
<< r << "...."
<< setw(20) << p2.nome << "...." << p2.idade <<endl; }
arquivo.close();
getch();
cout << setfill(' ');
}
void pes_nome()
{ int r;
r=0;
clrscr();
cout << "Nome = ";
fflush(stdin);
gets(p2.nome);
cout << setfill('.');
arquivo.clear();
arquivo.open("c:/lixo/dados.dat",ios::in);

while (arquivo.read((char *)&p1,sizeof(p1))) {
r++;
if (StrPos(p1.nome,p2.nome) != NULL ) {
cout << setw(3)
<< r << "...."
<< setw(20) << p1.nome << "...." << p1.idade <<endl; }}
arquivo.close();
getch();
cout << setfill(' ');
}
void deleta_reg()
{ int r,reg;
r=0;
clrscr();
cout << "No. do registro a ser deletado = ";
cin >> reg;
arquivo.clear();
temp.clear();
arquivo.open("c:/lixo/dados.dat",ios::in);
temp.open("c:/lixo/temp.dat",ios::out);
while (arquivo.read((char *)&p1,sizeof(p1))) {
Strings http://www.cefetsp.br/edu/mesquita/ling_c/aulas/arquivos.htm
7 de 8 12/11/2012 20:02
r++;
if (r != reg)
temp.write((char *)&p1,sizeof(p1)); }
arquivo.close();
temp.close();
arquivo.clear();
temp.clear();
arquivo.open("c:/lixo/dados.dat",ios::out);
temp.open("c:/lixo/temp.dat",ios::in);
while (temp.read((char *)&p1,sizeof(p1)))
arquivo.write((char *)&p1,sizeof(p1));
arquivo.close();
temp.close();
}
Strings http://www.cefetsp.br/edu/mesquita/ling_c/aulas/arquivos.htm
8 de 8 12/11/2012 20:02
Funes de suporte
Strings


StrPos(STR1,STR2) <vcl.h>
Retorna um ponteiro para a primeira ocorrncia de STR2 em STR1.
Se STR2 no esxistir em STR1 ento StrPos retorna NULL.

Observaes:
- Reparar que o S e o P de StrPos esto em letras maisculas.
- NULL um ponteiro que no aponta para lugar algum.
- StrPos distingui maisculas de minsculas

StrUpper(STR1) <vcl.h>
Retorna STR1 em letras maisculas.


Exemplo:

If (StrPos(StrUpper(Thelmo Mesquita),StrUpper(EL)) == NULL
cout << No existe;
else cout << existe;

StrComp(Str1,Str2) <vcl.h>
Compara a strings Str1 com Str2

Valor de retorno Condio
<0 Str1< Str2
=0 Str1== Str2
>0 Str1 > Str2

strcpy(destino var , fonte str)
Copia a string str para a varivel var.


Sleep (x milisegundos)
Provoca uma pausa na execuo do programa em x milisegundos.















Strings http://www.cefetsp.br/edu/mesquita/ling_c/aulas/func_sup.htm
1 de 2 12/11/2012 20:02

Strings http://www.cefetsp.br/edu/mesquita/ling_c/aulas/func_sup.htm
2 de 2 12/11/2012 20:02
Strings

C++ armazena strings em matrizes do tipo char.
Uma string um conjunto de caracteres que deve ser terminado pelo caractere \0
(NULL)

Exemplo: char nome[40];

A matriz nome poder conter uma string desde que um dos caracteres seja um NULL, que
indicar o fim da string. Portanto, se desejamos criar uma matriz de caracteres para conter
uma string, a matriz dever prever um byte a mais para o caractere NULL. No exemplo acima,
a matriz nome poder conter strings de no mximo 39 caracteres. O ndice da matriz comea
em 0 e termina em 39. Exemplo:

#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#include <string.h>
void main()
{
char nome1[40]="Thelmo",
nome2[]="Thelmo", // equivale a: char nome2[7]
nome3[40];
nome3=Thelmo; // Errado!!. No funciona.
strcpy(nome3,Thelmo);
clrscr();
cout << nome1 << endl
<< nome2 << endl
<< nome3;
getch();
}
A diferente de A
A A \0
A A
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#include <string.h>
void main()
{
char letra,alfabeto[50];
int indice;
for (indice=0,letra='A';letra<='Z'; letra++,indice++)
alfabeto[indice]=letra;
clrscr();
alfabeto[indice]=NULL; // ou '\0'
cout << alfabeto;
getch();
}

Passando strings para funes
#include <stdio.h>
Strings http://www.cefetsp.br/edu/mesquita/ling_c/aulas/strings.htm
1 de 3 12/11/2012 20:04
#include <conio.h>
#include <iostream.h>
#include <string.h>
void mostra_string(char n[])
{
cout << n << endl;
}
void main()
{
char n1[40]="teste";
clrscr();
mostra_string(n1);
mostra_string("muito");
strcpy(n1,"interessante");
mostra_string(n1);
getch();
}

Principais funes para strings

strcpy(destino,fonte)
Copia a string fonte para a string destino.

strcat(destino,fonte)
Adiciona a string fonte string destino.

strupr(string)
Retorna string em letras maisculas.

strlwr(string)
Retorna string em letras minsculas.

strcmp(string1,sctring2)
Retorna:
<0 se string1 menor que string2
>0 se string1 maior que string2
0 se forem iguais

Usando ponteiro para strings
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#include <string.h>
void exibe(char *s)
{ while (*s != NULL) // poderia ser while(*s)
{ cout << *s;
s++; }
}
void main()
{
clrscr();
exibe("teste");
getch();
Strings http://www.cefetsp.br/edu/mesquita/ling_c/aulas/strings.htm
2 de 3 12/11/2012 20:04
}
Exerccio:
Fazer um programa que converta nmeros inteiros de 0 a 255 (00 FF) para binrio.

Strings http://www.cefetsp.br/edu/mesquita/ling_c/aulas/strings.htm
3 de 3 12/11/2012 20:04
O PR-PROCESSADOR C++
um programa que executado antes da compilao. Ele examina o programa-fonte e
faz algumas modificaes com base em instrues chamadas diretivas.
O pr-processador faz parte do compilador e executado automaticamente antes da
compilao.
Antes da compilao, as diretivas de pr-compilao so tiradas do cdigo fonte pelo
pr-processador.
As diretivas so reconhecidas pelo pr-processador quando comeam pelo smbolo #.
Podem ser colocadas em qualquer parte do programa. Apesar de poderem comear em
qualquer coluna, recomendvel que comecem na primeira coluna por uma questo de
compatibilidade.

Principais diretivas:

#include

A diretiva #include causa a incluso de outro arquivo no programa fonte, ou seja, o
pr-processador substitui a diretiva #include pelo contedo do arquivo indicado.
Sintaxe:
#include <arquivo>
#include arquivo
Quando usamos os sinais < e > o arquivo procurado somente no diretrio INCLUDE
previamente configurado no compilador (Options > Directories). Quando usamos aspas duplas
ento o arquivo procurado primeiro no diretrio de trabalho (File > Change dir) e depois no
diretrio INCLUDE.

OBS: Os arquivos de incluso ou arquivos de cabealho so textos escritos em caracteres
ASCII normais e so criados geralmente para conter definies de constantes, macros,
prottipos de funes etc. Seus nomes terminam com a extenso .h

Exerccio:
1-) Crie um diretrio chamado lixo no drive C (se que ele j no existe.
2-) Com um editor de textos qualquer (por ex. o notepad), crie um arquivo texto chamado
teste.txt com o seguinte contedo:
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
void main()
{
3-) Execute o turboC++ e digite o seguinte programa:
#include <c:\lixo\teste.txt>
clrscr();
cout <funcionou;
getch();
}

Reparem que o pr-processador foi executado tanto para analisar o programa fonte
original como o prprio contedo do arquivo teste.txt
Para isso ficar bem claro, provoquem um erro qualquer dentro do arquivo teste.txt

#define

O PR http://www.cefetsp.br/edu/mesquita/ling_c/aulas/pre-pro.htm
1 de 6 12/11/2012 20:05
usada para definir constantes simblicas com nomes apropriados. Embora no
obrigatrio, costuma-se adotar esses nomes em letras maisculas.

Exemplo:


#include<stdio.h>
#include<iostream.h>
#include<conio.h>
#define PI 3.14
#define ERRO cout<<"\a\nraio nao pode ser negativo"
void main()
{
float raio;
clrscr();
cout << "Raio = ";
cin >> raio;
if (raio < 0)
ERRO;
else
cout << "Area = " << PI*raio*raio;
getch();
}

MACROS

So diretivas #define que aceitam argumentos, chamadas macros. Exemplo:
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#define PRN(n) cout << n << \n
void main()
{
int x;
clrscr();
PRN(10);
x=20;
PRN(x);
PRN(interessante);
getch();
}



EXERCCIO:
/* programa que calcula a rea de um tringulo
usando MACRO */


#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#define AREA(b,h) b*h/2
O PR http://www.cefetsp.br/edu/mesquita/ling_c/aulas/pre-pro.htm
2 de 6 12/11/2012 20:05
void main()
{
float x,y;
char tecla;
clrscr();
inicio:
cout<<"\n\nBase = ";
cin >> x;
cout<<"Altura = ";
cin >> y;
cout << "Area = " << AREA(x,y) << '\n';
cout << "\nMais ?";
tecla=getch();
if ((tecla == 's') || (tecla == 'S')) goto inicio;
}

O USO DE PARNTESE EM MACROS
O pr-processador executa uma substituio literal das macros no programa fonte.
Portanto, algumas coisas podem no sair como desejadas. Exemplo:

# define SOMA(x,y) x+y
.....
void main()
{
.
z=10*SOMA(4,5);
Esperava-se que z ficasse igual a 90, no entanto, o pr-processador ao fazer a substituio
literal no programa fonte, nos dar como resultado: z=10*4+5, ou seja, 45. Eh eh eh...

Soluo: parnteses.
#define SOMA(x,y) (x+y)
Assim, a substituio literal resultar em: z=10*(4+5)

Nem sempre os parnteses envolvendo o texto resolve nossos problemas. Exemplo:

#define PRODUTO(x,y) (x * y)
....
void main()
{
....
Z=PRODUTO(2+3,4);
// ser substituido por z=2+3*4 e o resultado no
// o esperado.
Soluo:
#define PRODUTO(x,y) ((x) * (y))

Como regra geral: procure usar e abusar dos parnteses, pois o mximo que pode acontecer
serem suprfluos.


DEFININDO MACROS USANDO OUTRAS MACROS
possvel definir macros atravs de outras macros previamente definidas. Notem:
PREVIAMENTE DEFINIDAS.
O PR http://www.cefetsp.br/edu/mesquita/ling_c/aulas/pre-pro.htm
3 de 6 12/11/2012 20:05
Exemplo: Programa que calcula rea de um crculo em funo do raio lido do teclado:

#include <stdio.h>
#include <conio.h>
#include <iostream.h>
//--------------------
#define PI 3.1416
#define QUAD(x) ((x) * (x))
#define AREA_CIRC(x) ((PI) * QUAD(x))
//--------------------
void main()
{
float raio;
char tecla;
clrscr();
inicio:
cout<<"\n\nRaio = ";
cin >> raio;
cout << "Area = " << AREA_CIRC(raio) << '\n';
cout << "\nMais ?";
tecla=getch();
if ((tecla == 's') || (tecla == 'S')) goto inicio;
}


MACROS EM VRIAS LINHAS

#include <stdio.h>
#include <conio.h>
#include <iostream.h>
//--------------------
#define MAIUSC(ch) ( (ch) >= 'a' && (ch) <= 'z') ? \
( (ch) - 'a' + 'A' ) : (ch)

//--------------------
void main()
{
char tecla;
clrscr();
cout << "Digite 1 para sair";
inicio:
cout<<"\nLetra = ";
tecla=getch();
tecla=MAIUSC(tecla);
cout << tecla;
if (tecla!='1') goto inicio;
}

#undef
A diretiva #undef remove a mais recente definio criada com #define.

Compilao condicional
O pr-processador dispe de diretivas que nos permitem elaborar programas com
O PR http://www.cefetsp.br/edu/mesquita/ling_c/aulas/pre-pro.htm
4 de 6 12/11/2012 20:05
compilao condicional.

#if, #elif, #else e #endif
A diretiva #if deve ser encerrada por #endif. Entre #if e #endif podemos ter qualquer
nmero de #elif. A diretiva #else opcional e s pode aparecer uma vez e quando estiver
presente dever ser a ltima diretiva antes de #endif. Exemplo:

#include <conio.h>
#include <stdio.h>
#include <iostream.h>
#define DEMO 9
void main()
{
#if DEMO == 1
int n=1;
#elif DEMO == 2
int n=2;
#elif DEMO == 3
int n=3;
#else
int n=0;
#endif
clrscr();
cout << n;
getch();
}



#ifdef, #ifndef
#include <conio.h>
#include <stdio.h>
#include <iostream.h>
#define ENORME
void main()
{
#ifdef ENORME
clrscr();
cout << "ENORME definido";
getch();
#else
clrscr();
cout << "ENORME no definido";
getch();
#endif
}

Operador defined
#include <conio.h>
#include <stdio.h>
#include <iostream.h>
#define NORME
void main()
O PR http://www.cefetsp.br/edu/mesquita/ling_c/aulas/pre-pro.htm
5 de 6 12/11/2012 20:05
{
#if defined (ENORME)
clrscr();
cout << "ENORME definido";
getch();
#else
clrscr();
cout << "ENORME no definido";
getch();

#endif
}
O PR http://www.cefetsp.br/edu/mesquita/ling_c/aulas/pre-pro.htm
6 de 6 12/11/2012 20:05
Assembly
Um microprocessador dividido basicamente em 3 partes:
- Unidade de controle
- Unidade lgica e aritmtica
- Um conjunto de registradores de deslocamento

A unidade de controle responsvel pela decodificao e execuo das
instrues. A unidade lgica e aritmtica responsvel pelas operaes aritmticas e
lgicas. Os registradores de deslocamento funcionam como memrias.
Dependendo da arquitetura do microprocessador, os RDs podem ser de 4, 8,
16, 32, 64 bits.
H vrios RDs no microprocessador, exemplos: AX, BX, CX, DX...., que so de
16 bits (2 bytes). Nos processadores mais recentes, temos tambm disponveis os
registradores de 32 bits (4 bytes), EAX, EBX .....
O registrador cujo nome termina com X possui 16 bits (2 bytes), no entanto
eles tambm pode ser acessados como se fossem de 8 bits (1 byte). Cada registrador
dividido em metade alta e metade baixa.

Registrador AH Registrador AL
Registrador AX

O registrador cujo nome comea com a letra E e termina com a letra X de 32
bits (4 bytes).

Quando utilizamos o compilador turbo C++, dispomos de duas funes para
acessar as portas de um microcomputador, como por exemplo a porta paralela
(impressora). Essas funes so:

inportb() e outportb()

inportb(n_da_porta)

L um byte da porta especificada.
Exemplo:

#include <stdio.h>
#include <dos.h>
#include <iostream.h>
#include <iomanip.h>
void main()
{
unsigned char resultado;
int porta = 0; /* serial port 1 */
resultado = inportb(porta);
clrscr();
cout << Foi lido: << hex << resultado;
}
Assembly http://www.cefetsp.br/edu/mesquita/ling_c/aulas/assembly.htm
1 de 5 12/11/2012 20:05

outportb(n_da_porta,valor)

Manda para a porta especificada o valor desejado.
Exemplo:

#include <stdio.h>
#include <dos.h>
Void main()
{
int porta = 0; /* serial port 1 */
char valor = 'C';
outportb(porta, valor);
}

No compilador Borland C++Builder, no dispomos de tais funes e portanto
iremos cri-las em linguagem assembly. Veja o que o prprio C++Builder diz a
respeito de tais funes:

Direct hardware access in 32-bit Windows is generally not allowed. While it can be
done in the Win9x OS by using inline assembly, this is generally discouraged as this
technique is not supported under WinNT..... The hardware port communication family
of functions, such as inportb, inpw, outportb and outpw are now deprecated and are
no longer supported.

inportb() feito em assembly

byte inportb(unsigned int porta)
{
byte valor;
asm { mov edx,porta
in al,dx
mov valor,al }
return valor;
}

outportb()feito em assembly

void outportb(unsigned int porta, byte valor)
{
asm { mov edx,porta
mov al,valor
out dx,al }
}

O windows XP, 2000 ou NT no permitem que se use diretamente as portas do
PC, como por exemplo a porta paralela. Para podermos usar as funes inportb() e
Assembly http://www.cefetsp.br/edu/mesquita/ling_c/aulas/assembly.htm
2 de 5 12/11/2012 20:05
outportb() deveremos usar previamente um programa que libere as portas que
desejamos.

O programa que iremos usar chama-se UserPort e pode ser baixado no meu
site:
http://www.cefetsp.br/edu/mesquita

Veja o que o manual do UserPort diz:
UserPort.SYS is a kernel mode driver for Windows NT/2000 that gives usermode
programs access to I/O Ports. This makes it possible to access hardware directly from
a normal executable in the same way as under Windows 95/98/ME.........

ESCRITA NA PORTA PARALELA
Para enviarmos um byte para a porta paralela, basta usar a seguinte
instruo:
outportb(0x378,byte)

LEITURA DA PORTA PARALELA
Para lermos um byte da porta paralela, basta usar a seguinte instruo:
a=inportb(0x379)

A varivel a dever ser do tipo byte ou unsigned char.

Quando lemos um byte da porta paralela, no temos acesso aos trs primeiros
bits do byte e alm disso, o bit mais significativo vem invertido. Portanto, para
inverter o bit mais significativo e zerar os 3 bits menos significativos, poderamos
proceder da seguinte forma:

a=inportb(0x379);
a = a ^ 0x80;
a = a & 0xf8;

Exerccio: Usando o circuito dos leds/chaves, faa um programa que leia a posio das
chaves e mande para os leds as respectivas posies das chaves.



#include <vcl.h>
#include <conio.h>
#include <iostream.h>
void outportb(unsigned int porta, byte valor)
{
asm { mov edx,porta
mov al,valor
out dx,al }
}
byte inportb(unsigned int porta)
Assembly http://www.cefetsp.br/edu/mesquita/ling_c/aulas/assembly.htm
3 de 5 12/11/2012 20:05
{
byte valor;
asm { mov edx,porta
in al,dx
mov valor,al }
return valor;
}
void main(void)
{ byte a=1;
clrscr();
cout << "Digite uma tecla para comear";
cout << "\nO programa encerra quamdo todas as chaves forem 0";
getch();
while (a!=0)
{ a=inportb(0x379);
a = a ^ 0x80;
a = a & 0xf8;
outportb(0x378,a);
}
cout << "\n\nDetectado chaves iguais a zero.... encerrando em 5s";
Sleep(5000);

}
Trabalho a ser entregue no final do semestre (uma semana antes da prova prtica de
C++)

1-) Montagem do circuito dos leds/chaves conforme layout entregue ao aluno.

2-) O circuito constitudo de 8 leds e 5 chaves (no possvel ler os 3 bits menos
significativos da porta paralela). O comportamento dos leds conforme a posio
das chaves dever ser conforme a seguir:

CHAVES D7 D6 D5 D4 D3 Leds
0 0 0 0 0 Sai do programa

0 0 0 0 1 Pisca FF-00

0 0 0 1 1 Pisca F0-0F

0 0 1 1 1 Pisca da
direita->esquerda

0 1 1 1 1 Pisca da
Esquerda->direita

1 1 1 1 1 Pisca do meio
para as pontas
Assembly http://www.cefetsp.br/edu/mesquita/ling_c/aulas/assembly.htm
4 de 5 12/11/2012 20:05

A ttulo de exemplo, um programa (executvel), poder ser baixado do meu
site para verificao.

Assembly http://www.cefetsp.br/edu/mesquita/ling_c/aulas/assembly.htm
5 de 5 12/11/2012 20:05