Você está na página 1de 135

SUMRIO

Unidade I
1.0 Itens fundamentais......................................................................pg8
1.1

Dados

Numricos.........................................................................pg-8
1.2

Dado

literal...................................................................................pg-8
2.0
Varivel.........................................................................................pg-8
2.1

Formao

de

Identificadores........................................................pg-9
2.2

Declarao

de

variveis.................................................................pg-9
2.3

Modificadores

de

tipos

oferecidos

por

c+

+...................................pg-9
3.0
Operadores.....................................................................................pg-10
3.1

Operadores

de

atribuio...............................................................pg-10
3.2

Operadores

aritmticos...................................................................pg-10
4.0

Funes

de

entrada

sada..............................................................pg-11
4.1
Entrada.............................................................................................pg-11
3

4.2
Sada..................................................................................................pg-11
5.0

Manipuladores

de

tamanho

de

campos

na

impresso.....................pg-12
6.0

Funes

aritmticas..........................................................................pg-14
7.0

Operadores

relacionais.....................................................................pg-14
8.0

manipuladores

de

bases

numricas..................................................pg-17
9.0

Imprimindo

caracteres

grficos.......................................................pg-17
10.0

Cdigos

Especiais............................................................................pg-18
11.0Comentrios.....................................................................................
pg-18

12

Estruturas

condicionais.....................................................................pg-19
13.0

Estruturas

de

repeties.................................................................pg-22
13.1

Estrutura

For..................................................................................pg-22
13.2

Estrutura

While..............................................................................pg-23
13.3

Estrutura

While.......................................................................pg-25
14.0
Commandos:......................................................................................pg-28

Do-

14.1
Break..............................................................................................pg-28
14.2
Continue..........................................................................................pg-29
14.3
Switch..............................................................................................pg-29
Unidade II
1.0
Matrizes...........................................................................................pg-31
1.1

Matriz

Unidimensional....................................................................pg-31
1.2

Matriz

Multidimensional.................................................................pg-33
Unidade III
1.0
Funes.............................................................................................pg-34
1.1Chamando

um

funo........................................................................pg-35
1.2

Funes

simples................................................................................pg-35
1.3

Prottipo

funes..........................................................................pg-35

de

1.4

Tipos

de

funes................................................................................pg-36
1.5

comando

Return............................................................................pg-36
1.6

Definio

da

funo...........................................................................pg-36
1.7

Parmetros

da

funo.......................................................................pg-36
1.8

Passagem

por

valor...........................................................................pg-37
1.9

Passagem

vrios

argumentos............................................................pg-38
1.10

operador

unrio

de

referncia:&...............................................pg-39
1.11

Passagem

por

referncia.................................................................pg-40
1.12

Referncia

constantes.....................................................................pg-41
1.13

Classes

de

argumentos....................................................................pg-41
1.14

operador

de

escopo.....................................................................pg-42
1.15

Funes

recursivas.........................................................................pg-43
Unidade IV

1.0
Estruturas.......................................................................................pg-45
1.1

Definindo

estrutura......................................................................pg-45
1.2

Acessando

os

membros

da

estrutura...............................................pg-46
1.3

Combinando

declaraes..................................................................pg-46
1.4

Inicializando

estruturas....................................................................pg-46
1.5

Operaes

entre

estruturas..............................................................pg-46
1.6

Estruturas

aninhadas........................................................................pg-47
1.7

Passando

estruturas

para

funes....................................................pg-47
1.8

Matrizes

de

estruturas......................................................................pg-48
1.8.1declarando

matriz

de

estruturas..................................................pg-49
1.9.0
Arquivos.........................................................................................pg-53
1.9.1

Classes

iostream.............................................................................pg-53
1.9.2

Detectando

fim

arquivo..........................................................pg-54
1.9.3- Lendo e gravando um caracter por vez no arquivo.

de

1.9.4

funo

Open().............................................................................pg-55
1.9.5

Gravando

Objetos..........................................................................pg-55
1.9.6

Lendo

Objetos................................................................................pg-57
1.9.7

Gravando

lendo

objetos

de

um

mesmo

arquivo.........................pg-57
1.9.8

As

funes

seekg(),

tellg(0,

seekp()

tellp()...................................pg-59
1.9.9

Calculando

nmero

de

registros

do

arquivo..............................pg-59
1.10

Exemplos

adicionais

de

arquivos...................................................pg-62
Unidade V
1.0
Ponteiros............................................................................................pg-69
1.1

Por

que

os

ponteiros

so

usados.......................................................pg-69
1.2

Ponteiros

variveis............................................................................pg-70
1.3

Endereos

de

memria......................................................................pg-70
1.4

Operador

de

endereos.....................................................................pg-70
1.5

Passando

argumentos

ponteiros.......................pg-71
8

por

referncia

com

1.6

variveis

que

armazena

endereos...................................................pg-72
1.7

operador

indireto..........................................................................pg-72
1.8

Passando

endereos

para

funo...................................................pg-72
1.9

Ponteiros

sem

funes.......................................................................pg-72
1.10

Ponteiros

variveis

apontadas.....................................................pg-73
1.11
atribuio.........................................................................................pg-73
1.12

Operao

indireta...........................................................................pg-73
1.13

Trazendo

endereo

do

ponteiro...................................................pg-74
1.14

Incremento

em

ponteiro..................................................................pg-74
1.15

Ponteiro

no

lugar

de

matrizes.........................................................pg-74
1.16

Ponteiros

constantes

ponteiros

variveis.....................................pg-74
1.17

Passando

matrizes

como

argumento

para

funes........................pg-75
1.18
Precedncia.....................................................................................pg-76
1.19

Ponteiros

strings...........................................................................pg-76
9

1.20

Matrizes

de

ponteiros......................................................................pg-77
1.21

rea

de

alocao

dinmica:

Heap.................................................pg-77
1.22

Retornado

ponteiro

This..............................................................pg-79
1.23

dimensionando

matrizes

execuo...........................pg-79

10

em

tempo

de

LINGUAGEM C++

UNIDADE - I
1.0 - Itens Fundamentais
1.1 - Dados Numricos
representado pelo sistema decimal ingls.
Obs.: A separao da parte inteira da fracionria feita pelo ponto decimal.
Ex.:

0.19
0.298

I . FF E n
expoente
potncia de dez
parte fracionria
ponto decimal
parte inteira
Ex.:

a) 2.98E3

= 2,98 X 103

b) 0.45E-4

= 0,45 X 10-4

1.2 - Dado Literal


formado por qualquer seqncia de caracteres e vem entre aspas duplas.
Ex.

a) " 2040"

11

b) " "
c) " No Fume"
2.0 - Varivel
o endereo de memria (RAM) reservado para armazenar certo tipo de
dado.
Obs.: RAM - Memria dinmica de acesso aleatrio a leitura e escrita e
voltil.

12

Ex.:

1
0

n
ota

1
00

exo
2.1 - Formao de identificadores formada por apenas uma letra ou ento
uma letra seguido de letras e dgitos nunca smbolos especiais.
Obs.: A letra maiscula diferente de letra minscula.
Ex.:

1) funcao

3) media

2) d

4) m200

Cuidado - MEDIA media


2.2 - Declarao de variveis
Tipo da varivel <nome-do-identificador>;
O ponto-e-vrgula manda o computador executar a prxima instruo.
Nome-do-identificador so os nomes das variveis separadas por vrgula.
Tipo da varivel pode ser do tipo int, float, double, char, etc.
Ex.:

int x,y;
float med;

Tabela de tipos

13

Tipo
int
char
float
double

Bytes
2
1
4
8

void

Escala
-32768 a 32767
-128 a 127
3.4E-38 a 3.4E38
1.7E-308
a
1.7E308
Nenhum valor

2.3 - Modificadores de tipos oferecidos por C++ so:


1 - long
2 - short
3 - unsigned
Obs.: O modificador de tipo pode ser utilizado sem que seja especificado o
tipo da varivel, por default assume o tipo INT.
A tabela de tipo utilizando os modificadores.
Tipo
unsigned char
unsigned
short
long

Bytes
1
2
2
4

unsigned long
long double

4
10

Escala
0 a 255
0 a 65535
-32768 a 32767
-2147483648
2147483647
0 a 42949667295
3.4E-4932

1.1E+4932

Obs.:
int tem sempre o tamanho da palavra da mquina, isto , em computadores
de 16 bits ele ter 16 bits de tamanho.
Short tem tamanho diferente do tipo int, geralmente metade do tamanho de
um int.

14

STRINGS so declaradas da seguinte maneira


char nome[n];
Onde: n o numero de caracteres da string.
Ex.:
int id,nm;
float alt,peso;
char nome[25];
char sexo;
3.0 - Operadores
3.1 - Operador de atribuio: =
Representa a atribuio da expresso a sua direita a varivel a sua
esquerda.
Ex.:

1) x = 200;
2) y = 5;

3.2 - Operadores aritmticos

soma

subtrao

multiplicao

diviso
resto da diviso de 2 nmeros inteiros

Prioridade
Prioridade
1.
2.

operadores
*, /, %
+, 15

Ex: 1. x+y;
2. x-y;
3. 2*nota + 10;
4. tot/k - 40;
5. y=9 % 4;
4.0 - Funes de entrada e sada
Funes:
i) cin >> nome-da-varivel >> nome-da varivel >> . . .
Transfere os dados externos via teclado para as variveis especificadas.
Obs.: >> significa OPERADOR DE EXTRAO
Ex.: cin >> anos;
Cuidado os dados so separados de uma varivel para outra atravs do
espao em branco.
Ex.: cin >> anos >> altura
Tela
26 1.70

anos

26

altura

1.70

ii) gets (nome-da-varivel);


Ler uma cadeia de caracteres do teclado enquanto no for pressionada a tecla
ENTER.
Ex.: gets(nome);
16

Tela
nome
a
A

n
n

a
a

u
u

l
l

a
a

iii) getche( ) e getch( )


Transferem um caracter para a varivel sem esperar pressionar <ENTER>.
Ex.:

ch = getche( );
ch = getch( );

Tela
A

ch

4.2 - Sada
cout << identificador << . . .
Onde: Identificadores so os nomes das variveis e/ou mensagem.
<< operador de insero.
Exibe na tela o contedo de variveis e/ou mensagens.
Obs: A mensagem vem entre aspas duplas.
Ex.: cout <<"A sua idade : " << id;
Tela
id 18

A sua idade : 18

17

5 - Manipuladores de tamanho de campos na impresso.


O tamanho do campo definido pelo arquivo iomanip.h e so os seguintes:
1 - setw - seleciona o tamanho do prximo campo a ser impresso.
2 - setprecision - define o numero de casas decimais a serem impressas para
o nmero ponto flutuante (float).
3 - setfill - seleciona o caractere que dever preencher as colunas em branco
de um campo.
Exemplos:
1) com nmeros inteiros
#include <iostream.h>
main( )
{
int lap,bor,can,cad,fit;
lap=45; bor=2345; can=420; cad=8; fit=13050;
cout << "\n\n\n" // insere linhas
cout << '\n' << "Borracha" << bor;
cout << '\n' << "Lapis" << lap;
cout << '\n' << "Canetas" << can;
cout << '\n' << "Cadernos" << cad;
cout << '\n' << "fitas" << fit;
}
#include <iostream.h>
#include <iomanip.h>
main( )

18

{
int lap=45,bor=2345, can=420, cad=8, fit=13050;
cout << "\n\n\n" // insere linhas
cout << '\n' << "Borracha" << setw(12) << bor;
cout << '\n' << "Lapis" <<setw(12) << lap;
cout << '\n' << "Canetas" <<setw(12) << can;
cout << '\n' << "Cadernos" <<setw(12) << cad;
cout << '\n' << "fitas" <<setw(12) << fit;
{}
2) Preencher as colunas em branco com o caracter (.).
- acrescentar:
cout << setfill(' . ');
cout << '\n'<<"lapis"<<setw(12)<<lap;
.
.
.
.
Ex.: Tamanho de campos com pontos flutuantes.
#include <iostream.h>
#include <iomanip.h>
main( )
{
float lap=4.875,bor=234.542,can=42.036,cad=8.0,fit=13.05;
cout << "\n\n\n";
cout << setprecision(2);
cout <<'\n'<<"lapis"<<setw(12) << lap;
.
.

19

.
.
}
Ex.: Tamanho de campos com cadeias de caracteres
.
.
.
{
cout << "\n\n\n";
cout << "objeto"<<setw(12)<<"codigo"<<'\n';
cout <<'\n'<< "lapis"<<setw(12)<<"WQR";
cout << '\n'<< "borracha"<<setw(12)<<"ASO";
.
.
.
}

#include <iostream.h>
#include <iomanip.h>
#include <conio.h>
void main(void)
{
float lap=4.875, bor = 234.542;
cout<<"\n\n\n";
cout<<setprecision(2)<<setfill('.');
cout<<"\nlapis "<<setw(12)<<lap;
cout<<"\nborracha "<<setw(12)<<bor;
cout<<"\nAperte enter ";
getch( );

20

return;
}
6.0 - Funes Aritmticas
1) sin(x)
2) cos(x)
3) atan(x) - arco-tangente de x
4) sqrt(x) - raiz quadrada de x
5) exp(x) - N. e elevado a x
6) abs(x) - valor absoluto inteiro
7) fabs(x) - valor absoluto real
8) log(x) logaritmo
9) log10 - logaritmo na base 10
10) pow(x,y) - elevar x a y
7.0 - Operadores relacionais
1) = =

3) >

5) > =

2) ! =

4) <

6) < =

7.1 - O resultado de uma operao de dois valores pode ser:


- 0 (falso) ou 1 (verdadeiro)
7.2

O resultado de uma operao lgica um valor cujos bits so

operados um a um de acordo com a lgebra de proposies.


7.3 - Operadores lgicos
!

(negao)

21

&&

(conjuno)

||

(disjuno)

OBS: 1. PORTA LGICA AND(&&)


TABELA VERDADE:
X
0
0
1
1

Y
0
1
0
1

Z
0
0
0
1

Analogia De Um Circuito Em Srie, Basta Uma Chave Desligada Para A Lmpada


Desligar.
2. PORTA OR ( | | )
TABELA VERDADE:
X
0
0
1
1

Y
0
1
0
1

Z
0
1
1
1

Analogia De Um Circuito Em Paralelo, Basta Uma Chave Ligada Para A Lmpada


Acender.

7.4 - Operadores aritmticos de atribuio


1) + =

4) / =

2) - =

5) % =

3) * =

22

Ex.:

1) t + = 2; ------> t=t+2;
2) x * = y+1; -- > x = x * (y + 1)
3) t / = 25; -- > t = t / 25
4) p % = 5; -- > p = p % 5

7.5 - Operadores de incremento (+ +) e de decremento (- -)


- O Operador de incremento pode ser usado de 2 formas:
a) Prefixado quando aparece antes do nome da varivel
b) Ps-fixado aparece em seguida ao nome da varivel
Ex.:

1) x = x + 1; // adiciona 1 a x
2) + + x;

// adiciona 1 a x

3) x + +;

// adiciona 1 a x

Obs.: A diferena entre as operaes executadas pelo operador prefixado e o


ps-fixado aparece em instrues que fazem mais do que somente incrementar a varivel
operando.
1) O operador de incremento prefixado incrementa a varivel operando
antes de executar a instruo em que ele aparece.
Ex.:

n = 5;
x = + + n;
cout << "\n N= " << n <<" X = "<< x;
A sada ser
N = 6;

X=6

2) O operador de incremento ps-fixado incrementa a varivel operando


logo aps a execuo da instruo em que ele aparece.

23

Ex.:

n = 5; x = n++;
cout << "\n N = "<< n <<" X = "<< x;
A sada ser
N = 6;
3)

X=5

A sintaxe do operador de decremento idntica a do operador de

incremento.
7.6 - Operador condicional ternrio: ? :
Sintaxe:
exp1 ? exp2 : exp3;
A exp1 avaliada, se for verdadeira a exp2 executada; caso contrrio, se a
exp1 for falsa a exp3 executada.
Ex1.: max = (a > b) ? a: b;
A varivel max receber o maior valor.
Ex2.: abs = (x > 0) ? x : -x;
Ex3.: cout << ( (x % 2) ? "Impar " : "Par");
// Calcula a mdia aritmtica de 4 notas
#include <iostream.h>
main( )
{

24

float nota,media;
media = 0;
cout<<"\nDigite a primeira nota : ";
cin >> nota;
media + = nota;
cout<<"\nDigite a segunda nota : ";
cin >> nota

media + = nota;
cout<<"\nDigite a terceira nota : ";
cin >> nota;
media + = nota;
cout<<"\nDigite a quarta nota : ";
cin >> nota;
media + = nota;
media / = 4;
cout << "\n Media = "<<media;
}

#include <iostream.h>
main()
{
int verdadeiro,falso
verdadeiro = (15<20);
falso = (15 = = 20);
cout << "\n Verdadeiro "<<verdadeiro;
cout << "\n Falso "<<falso;
}

#include <iostream.h>
main( )

25

{
cout << "\n"<<(4+1<3);
cout << "\n"<<(2<1+3);
}

8 - Manipuladores de bases Numricas


Os manipuladores de bases numricas esto definidos no arquivo iostream.h e
so os seguintes:
dec - decimal (default)
hex - hexadecimal
oct - octal
Ex.:
#include <iostream.h>
main( )
{
int n=65
cout<<'\n'<<"Hexadecimal"<<hex<<n;
cout<<'\n'<<"Octal"<<oct<<n;
cout<<'\n'<<"Hexadecimal"<<dec<<n;
}
Sada:

41
101
65

9 - Imprimindo caracteres grficos


O cdigo ASCII dispe de nmeros de 0 a 127 (decimal) abrangendo letras,
dgitos, caracteres de pontuao, etc. Os computadores IBM-PC usam 128 caracteres

26

adicionais, com cdigos de 128 a 255, que consistem em smbolos de lnguas estrangeiras e
caracteres grficos
A forma de representar um caractere de cdigo acima de 127 : \xdd;
onde: \xdd um caractere e pode ser contido por uma cadeia de caracteres
entre aspas duplas.

Ex.:
#include <iostream.h>
main( )
{
cout<<"\n\n";
cout<<"\n\xDC\xDC\xDB\xDB\xDB\xDB\xDC\xDC";
cout<<"\n\xDFO\xDF\xDF\xDF\xDFO\xDF";
cout<<"\n\n";
cout<<"\n\xDC\xDC\xDB\xDB\xDB\xDB\xDB\xDB\xDB";
cout<<"\n\xDFO\xDF\xDF\xDF\xDF\xDFO\xDF";
cout<<"\n\n";
}
10 - Cdigos especiais
Cdigos Especiais
\n
\t
\b
\f
\a
\r
\\
\0
\'
\"
\xdd

Significado
Nova linha
Tab
Retrocesso
Salta pgina de formulrio
Beep - toca o alto falante
CR - Cursor para o inicio da linha
\ - Barra invertida
Null - zero
' - Aspa simples
" - Aspa dupla
Representao hexadecimal

27

11 - Comentrios
Podem ser colocadas em qualquer lugar do programa e so tratados pelo
compilador como espaos em branco e vem entre /*

............................. */

ento // ..................
obs.:

// s uma linha

Ex.:
#include <iostream.h> // diretiva do pr-processador
#include <conio.h> // necessrio p/ o getche( )
// incio do programa
main( )
{
char ch; /* declarao de varivel */
cout<<"\nPressione uma tecla ";
ch=getche( ); // solicita uma tecla
cout<<"\nA tecla sucessora ASCII "<<char(chr+1);
}
12 -Estruturas Condicionais
12.1 - Estrutura condicional simples:
1) S uma instruo
if (expresso de teste)
instruo;
Ex1.:
if (a = = b)

28

ou

x = x + 1;
Ex2.:
if (a>b+c | | a>20)
y = y + 2;
2) Mais de uma instruo
if (expresso de teste)
{
instruo;
instruo;
}

Ex1.:
if (ch = = '0')
{
cout<<"\n Zero detectado";
cont = cont+1;
}
12.2 - Estrutura condicional composta
1) S uma instruo:
if (expresso de teste)
instruo a;
else instruo b;
Ex1.:
if (a > 10)
k = k+2;

29

else y = y+3;

2) Mais de uma instruo


if (expresso de teste)
{
instruo1a;
...
instruo na;
}
else

{
instruo1b;
...
instruo nb;
}

Ex2.:
if (sexo = ='f')
{
nm = nm + 1;
k = k+i;
}
else {
nh = nh +1;
y = y+i;
}
Ex:

30

1) Fazer um programa em C+ + que leia valores distintos. Determine e


escreva o menor deles.
#include <conio.h>
#include <iostream.h>
void main(void)
{
float a,b,c,men;
clrscr();
cout <<"\nDigite trs valores distintos ";
cin >> a >> b >> c;
if (a<b && a<c)
men=a;
else if (b<c)
men=b;
else men = c;
cout<<\n menor = <<men;
cout <<"\n Aperte quqlquer tecla ";
getch( );
return;
}
2) Fazer um programa em C+ + que leia os coeficientes de uma equao do
2. Grau. Calcule escreva as razes reais se houver.

#include <conio.h>
#include <math.h>
#include <iostream.h
void main(void)
{
float x1,x2,a,b,c,d;

31

cout<<"\nDigite os coeficientes da equao do 2. Grau";


cin>>a>>b>>c;
d = pow(b,2)-4*a*c;
if (d>=0)
{
x1=(-b+sqrt(d))/2*a;
x2=(-b-sqrt(d))/2*a;
cout<<'\n x1= "<<x1<<" x2= "<<x2;
}
else cout<<"\n No existem razes reais ";
cout<<"\n Aperte qualquer tecla ";
getch( );
return;
}
3 - fazer um prog. em c++ que leia os lados de um tringulo. Determine se os lados
formam um tringulo se houver indique atravs de uma mensagem o tipo (eqiltero,
issceles ou escalenos); caso contrrio informe que no existe tringulo.

#include <conio.h>
#include <iostream.h>
#include <math.h>
void main(void)
{
int x,y,z;
cout<<"\nDigite os lados do tringulo ";
cin >> x >> y >> z;
if (x<y+z && y<x+z && z<x+y)
if (x = = y && x = = z)
cout<<"\n Tringulo eqiltero ";
else if (x = = y | | x = = z | | y = = z)

32

cout<<"\n Tringulo issceles ";


else cout <<"\n Tringulo escaleno";
else cout<<\n no existe tringulo;
cout << "\n Aperte qualquer tecla";
getch( );
return;
}
13 - Estruturas de repeties
13.1 - A estrutura for:
1. s uma instruo:
for (inicializao; teste; incremento)
instruo;
2. Mais de uma instruo:
for (inicializao; teste; incremento)
{
instruo;
instruo;
}
Obs.: i) for usado quando sabemos o nmero de vezes a repetir.
ii) S pode usar for se a varivel de controle for do tipo inteira e variando de
um em um.
iii) Todas as variveis que estiverem dentro da estrutura de repetio tem que
atribuir valores iniciais, exceto as lidas.

33

Ex.:

1) Fazer um programa em C+ + que leia a altura e o sexo de 10 pessoas.

Calcule e escreva a maior e a menor altura com os respectivos sexos.

Dados: alt

sexo
10 pessoas (np)
#include <stdio.h>

#include <conio.h> // diretiva limpa tela


#include <iostream.h>
void main(void)
{
char sexo,aux1,aux2;
float alt,ma,me;
int np;
ma = 0; me =4;
for (np=1; np<=10; np++)
{
cout<<"\nDigite o sexo : "<<np<< ? ;
cin >>sexo;
cout<<"\nDigite a altura : "<<np<< ? ;
cin >> alt;
if (alt > ma)
{
ma = alt;
aux1 = sexo;
}
if (alt < me)
{
34

me = alt;
aux2 = sexo;
}
clrscr( );
}
cout<<"\n ma = "<<ma<<" aux1 = "<<aux1;
cout<<"\n me = "<<me<<" aux2 = "<<aux2;
cout<<"\nAperte qualquer tecla ";
getch( );
return;
}
13.2 - Estrutura while
Sintaxe:
1- uma instruo:
i) while (expresso de teste)
instruo;
2- mais de uma instruo:
ii) while (expresso de teste)
{
instruo;
instruo;
}
Obs.:
i) O lao while apropriado em situaes em que o lao pode ser terminado
inesperadamente, por condies desenvolvidas dentro do lao.
ii) while executa as instrues enquanto a expresso de teste for verdadeira.

35

Ex. 1) Fazer um programa em C+ + que leia a idade de um grupo de pessoas.


O ltimo dado que no entrar nos clculos tem idade igual a 0 (zero). Calcule e escreva:
-

a idade mdia do grupo

Dado:

id
idm = sid/np

#include <iostream.h>
#include <stdio.h>
#include <conio.h>
void main(void)
{
int id;
unsigned long np,sid;
float idm;
np = 0; sid = 0;
cout<<"\nDigite a idade ; ";
cin>>id;
while (id!=0)
{
sid=sid + id;
np = np + 1;
cout<<"\nDigite a idade e idade = 0 para ";
cin >> id;
clrscr( );
}
if (np!=0)
{
idm = sid/np;

36

cout<<"\nA mdia : "<<idm;


}
else cout<<"\nNo existe ";
cout<<"\n Aperte qualquer tecla ";
getch( );
return ;
}
Ex: 2 Fazer um prog. em c++ que leia o nome,idade e o sexo.O ltimo dado que no
entrar tem nome igual a fim. Calcule e escreva:
- o nmero de mulheres de idade entre 18 e 30 anos e nome igual Luciane;
- a idade mdia dos homens.
#inclcude <stdio.h> // Para a funo gets()
#include <string.h> // Para a funo strcmpi(s1,s2)
#include <iostream.h>
#include <conio.h>
void main(void)
{
char no[25],sexo;
int id,nh,nm,sid;
clrscr();
sid=0;nm=0;nh=0;
cout<<\n digite o nome;
gets(no);
while(strcmpi(no,fim)) //executa enquanto o nome diferente de fim
{
cout<<\n digite a idade e o sexo;
cin>>id>>sexo;
if(sexo==m)
{
nh=nh+1;

37

sid=sid+id;
}
if(sexo==f && id>18 && id<30 && strcmpi(no,luciane)=0)
nm++;
cout<<\n digite o nome e nome igual a fim interrompe o lao;
gets(no);
clrscr();
}
if(nh!=0)
cout<<\n A media e: <<(sid/nh);
cout<<\n nm= <<nm;
cout<<\n aperte qualquer tecla;
getch();
return;
}
Obs: A funo strcmpi(s1,s2) compara duas strings, se forem diferentes
verdadeiro(1); caso contrrio falso(0).

13.3 - A estrutura do-while


Sintaxe do lao do-while
do
{
instruo;
instruo;
} while (expresso de teste);
Obs.: i) do-while utilizado em situaes em que necessrio executar o
corpo do lao uma primeira vez e depois avaliar a expresso de teste e criar um ciclo
repetido.

38

ii) Este ciclo de execuo do bloco e teste repetido at que a


expresso de teste se torne falsa (igual zero), ento o lao termina e o controle do
programa passa para a linha seguinte ao lao.
Ex.1) Fazer um programa em C+ + que leia a nota e o cdigo. O ltimo dado
que entrar tem cdigo igual a 3020. Calcule e escreva:
- As duas maiores notas, com os respectivos cdigos.
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
void main(void)
{
float no,m1,m2,cod,aux1,aux2;
m1=0;m2=0;aux1=0;aux2=0;
do
{
cout<<"\nDigite a nota e o cdigo : ";
cin>>no>>cod;
if (no>m1)
{
m2=m1;
aux2=aux1;
m1=no;
aux1=cod;
}
else if (no>m2 && no!=m1)
{
m2=no;
aux2=cod;
}
clrscr( );

39

} while (cod!=3020);
cout<<"\nm1 = "<<m1<<"aux1 = "<<aux1;
cout<<"\nm2 = "<<m2<<"aux2 = "<<aux2;
cout<<"\n Aperte qualquer tecla";
getch( );
return;
}
ex.2 Fazer um prog. em c++ que calcule e escreva o nmero de anos necessrios
para que a populao de A seja maior ou igual de B. Sabendo que a populao de A
90000000 milhes de habitantes com uma taxa de crescimento constante de 3% ao ano e
que B tem 200000000 de habitantes com uma taxa constante de 1.5% ao ano.

#include <conio.h>
#include <stdio.h>
#include <iostream.h>
void main(void)
{
long popa,popb;
int na;
popa=9E7; popb=2E8; na=0;
do
{
na = na+1;
popa=popa+0.03*popa;
popb=popb+0.015*popb;
}
while (popa<popb);
cout<<"\nO numero de anos : "<<na;
cout<<"\n Aperte qualquer tecla ";
getch( );

40

return;
}
Ex.3 Fazer um prog. em c++ que leia o salrio e o nome. O ltimo dado que entrar
tem o nome igual a Joo. Calcule e escreva:
- o maior salrio com o respectivo nome.
#include <conio.h>
#include <iostream.h>
#include <string.h>
#include <stdio.h>
void main(void)
{
char no[25],aux[25];
float sal,mas;
clrscr();
mas=0;
do
{
cout<<\n digite o nome e nome igual a joo para;
gets(no);
cout<<\n digite o salrio: ;
cin>>sal;
if(sal>mas)
{
mas=sal;
strcpy(aux,no); // copia o contedo da string no na string aux.
}
clrscr();
}
while(strcmpi(no,joao));
cout<<\n mas = <<mas<< nome e : <<aux;
cout<<\n aperte qualquer tecla ;
getch();

41

return;
}
Obs: A funo strcpy(s1,s2) copia o contedo da string s2 na string s1.

14 - Comandos:
14.1 - break
O comando break causa a sada imediata do lao; o controle passa para a
prxima instruo aps o lao. Se a instruo break pertencer a uma estrutura de laos
aninhados afetar somente os laos internos a ele.
Ex1) Fazer um programa em C+ + para calcular a soma dos 20 primeiros
termos da srie:

S = x - x2/3! + x4/5! - x6 /7! + . . .


onde: x lido.
Resoluo:
i=i+2
d = d * (i-1) * i
e = e +2
sinal = (-1)*sinal
s = s + pow(x,e)*sinal/d
#include <conio.h>
#include <math.h >
#include <iostream.h>
void main (void)
{
int sinal,e,cont,i;

42

long d;
float s,x;
cont << "\ndigite X ";
cin >> x;
s=0; i=3; d=6; e=2; sinal = -1;
for (cont=1;cont<=19;cont++)
{
if (x<0)
break;
s = s + pow(x,e)*sinal/d;
i = i+2;
d = d*(i-1)*i;
sinal = (-1)*sinal;
e = e + 2;
}
cout << "\nO valor de X = "<<(s+x);
cout <<"\n Aperte qualquer tecla ";
getch( );
return;
}
14.2 - Continue
Continue faz com que o controle do programa avalie imediatamente a
expresso de teste e depois continua o processo do lao.
exemplo: imprima os caracteres diferentes dos dgitos.
#include <iostream.h>
#include <conio.h>
void main( )
{
char ch;

43

while ((ch=getch( ))!='x')


{
if (ch>='0' && ch <='9')
continue;
cout << ch;
}
cout<<"\n Aperte qualquer tecla";
getch( );
return;
}
14.3 - switch
switch permite selecionar uma entre vrias aes alternativas.

Sintaxe:
switch (varivel seletora)
{
case constante1 :

instruo;
instruo;
break;

case constante2 :

instruo;
instruo;
break;

default : instruo;
instruo;
}

44

onde: varivel seletora do tipo enumervel (inteira ou char).


Ex1) Fazer um programa que leia o canal e o nmero de pessoas que esto
assistindo. O ltimo dado que no entrar tem canal igual a 0 (zero). Calcule e escreva:
- As porcentagens de audincia dos principais canais de televiso.
dados: { canal, npas }
p4 = n4*100/tot
.
.
.
p12 = n12*100/tot

#include <conio.h>
#include <iostream.h>
void main(void)
{
long tot,n4,n5,n6,n7,n12;
int canal,npas;
float p4,p5,p6,p7,p12;
n4=0; n5=0; n6=0; n7=0; n12=0;
cout<<"\n Digite o canal ";
cin>>canal;
while (canal!=0)
{
cout<<"\nDigite o numero de pessoas";
cin >> npas;

45

switch(canal)
{
case 4 :

n4=n4+npas;
break;

case 5 : n5=n5+npas;
break;
case 6 : n6=n6+npas;
break;
case 7 :

n7=n7+npas;
break;

case 12 : n12=n12+npas;
break;
default : cout<<"\nDigitou o canal errado ";
}
clrscr();
cout<<"\nDigite outro canal e canal = 0 para ";
cin>>canal;
}
tot=n4+n5+n6+n7+n12;
if (tot!=0)
{
p4 = n4*100/tot;
.
.
.
p12 = n12*100/tot;
cout<<"\np4 = "<<p4<< . . . <<"p12 = "<<p12;
}
cout<<"\n Aperte qualquer tecla ";
getch( );
return;
}

46

47

UNIDADE - II
1.0 - Matrizes
Matriz um tipo de dado em C+ + usado para representar uma coleo de
variveis de mesmo tipo.
1.1 - Matriz Unidimensional
um conjunto de dados do mesmo tipo, referenciados por um nico nome,
onde cada elemento referenciado por um nico ndice.
1.1.1 - Declarao de varivel
tipo nome-da-varivel[n];
onde: n o nmero de elementos.
Ex1) Fazer um programa que leia 10 notas. Calcule e escreva:
- A mdia das notas;
#include <conio.h>
#include <iostream.h>
void main(void)
{
int nota[10],i;
float media;
media = 0;
for(i=0;i<10;i++)
{
cout<<"\nDigite a nota "<<(i+1)<<": ";

48

cin>>nota[i];
media=media+nota[i];
clrscr( );
}
cout<<"\nA media = "<<(media/10);
cout<<"\n Aperte qualquer tecla";
getch( );
return;
}
Ex2) Fazer um programa em C+ + que leia uma varivel composta contendo
n (n<=100) elementos inteiro, onde n lido.
Calcule e escreva:
- O maior elemento par e indique a posio;
- Uma 2. varivel composta contendo os elementos divisveis por 3.

#include <iostream.h>
#include <conio.h>
#include <math.h>
void main(void)
{
int a[100],i,b[100],map,p,j,n;
map = 0; p=0; j =0;
cout<<"\nDigite o numero de elementos n<=100";
cin>>n;
for (i=0;i<n;i++)
{
cout<<"\nDigite um numero inteiro "<<(i+1)<<" : ";
cin>>a[i];
if (a[i]>map && a[i]%2= =0)

49

{
map=a[i];
p=i;
}
if (a[i]%3= =0)
{
b[j]=a[i];
j++;
}
clrscr( );
}
for(i=0;i<j;i++)
cout<<"\nOs elementos de B so :"<<b[i];
cout<<"\nO maior elemento par = "<<map <<"p = "<<p;
cout<<"\n Aperte qualquer tecla";
getch( );
return;
}
1.2 - Matrizes multidimensionais
So as que necessitam de mais de um ndice para individualizar um elemento
no conjunto de dados.
1.2.1 - Declarao de variveis
tipo nome-da-varivel [nl] [nc];
onde:
- nl : o nmero de linhas
- nc : o nmero de colunas

50

Ex1) Fazer um programa que leia uma matriz A3 x 3 de elementos numricos.


Calcule e escreva:
- A mdia dos elementos
#include <iostream.h>
#include <conio.h>
void main(void)
{
float a[3][3], med;
int i,j;
med=0;
for(i=0;i<3;i++)
for(j=0;j<3;j++)
{
cout<<"\nDigite um valor "<<i<<" "<<j;
cin>>a[i][j];
med=med+a[i][j];
clrscr( );
}
cout<<"\nA mdia = "<<(med/9);
cout<<"\n Aperte qualquer tecla";
getch( );
return;
}
Ex2) Fazer um programa que leia uma matriz Am x n (m<=20, n<=25) onde m
e n so lidos. Calcule e escreva:
- a matriz transposta de A

51

#include <iostream.h>
#include <conio.h>
void main(void)
{
float a[20][25], b[25][20];
int i,j,m,n;
cout<<"\nDigite a ordem (m<=20, n<=25) ";
cin>>m >>n;
for (i=0;i<m;i++)
for (j=0;j<n;j++)
{
cout<<"\nDigite um valor : "<<i<<" "<<j;
cin>>a[i][j];
b[j][i]=a[i][j];
clrscr( );
}
for (i=0;i<n;i++)
for(j=0;j<m;j++)
cout<<"\nA matriz : "<<b[i][j];
cout<<"\nAperte enter ";
getch( );
return;
}
UNIDADE - III
1.0 - Funes
Uma funo um conjunto de instrues desenhadas para cumprir uma
tarefa particular e agrupadas numa unidade com um nome para referenci-la.

52

1.1 - Chamando uma funo


o meio pelo qual solicitamos que o programa desvie o controle e passe para
a funo, executar suas instrues e depois volte instruo seguinte a da chamada da
funo.
1.2 - Funes simples
Exemplo: converter a temperatura de graus Fahrenheit para Celsius
#include <conio.h>
#include <iostream.h>
#include <iomanip.h>
int Celsius (int f)
{
int c;
c=(f-32)*5/9;
return c;
}
void main(void)
{
int c,f;
cout<<"\nDigite a temperatura em graus Fahrenheit ";
cin>>f;
c=Celsius(f);
cout<<"\n Celsius = "<<c;
cout<<"\n Aperte qualquer tecla";
getch( );
return;

53

54

1.3 - Prottipo de funes


A declarao de uma funo chamada prottipo e uma instruo, geralmente
colocada no incio do programa, que estabelece o tipo da funo e os argumentos que ela
recebe.
O prottipo de uma funo deve preceder a sua definio e a sua chamada.

Ex.: 1 - int Celsius (int fa); // prottipo


2 - int Celsius (int);

// prottipo

1.4 - Tipos de funes


O tipo de uma funo determinado pelo valor que ela retorna via comando
return e no pelo tipo de argumentos que ela recebe.

1.5 - O comando return


Termina a execuo da funo e retorna o controle para a instruo seguinte
do cdigo de chamada. Se aps a palavra return houver uma expresso, o valor da
expresso retornado funo que chama.
A sintaxe de uma instruo return tem uma das 3 formas:

return;

return expresso;

return (expresso);

Ex.: int Celsius (int f)

55

{
return (f-32)*5/9;
}
Obs.: No permitido o retorno de mais de um valor por meio do comando
return.
1.6 - Definio da funo
Tipo nome (declarao dos parmetros)
{
instrues;
}
1.7 - Parmetros da funo
So as informaes transmitidas para a funo.
A funo deve declarar essas informaes entre parnteses, no cabealho de
sua definio.
Ex: int Celsius (int f)
{
int c;

// c uma varivel local

c=(f-32)*5/9;
return c;
}

1.8 - Passagem por valor

56

Sua declarao indica que o valor enviado ser armazenado na varivel


indicada e criada quando a funo inicia a sua execuo e destruda quando a funo
termina.
Exemplo1: Fazer um programa que leia uma matriz AM*N (M<=20,N<=10).
Onde M e N so lidos. Calcule e escreva: a matriz transposta de A.
#include <conio.h>
#include <iostream.h>
void matriz(int m, int n)
{
float a[20][10], at[10][20];
int i,j;
for (i=0;i<m;i++)
for (j=0;j<n;j++)
{
cout<<"\n Digite um elemento "<<i<<" "<<j;
cin>>a[i][j];
at[j][i]=a[i][j];
clrscr( );
}
for (i=0;i<n;i++)
for(j=0;j<m;j++)
cout<<"\n at["<<i<<" "<<j<<"] = "<<at[i][j];
return:
}
void main(void)
{
int m,n;
cout<<"\nDigite a ordem, M<=20 e N<=10 ";
cin>>m>>n;
matriz(m,n);

57

cout<<"\nAperte enter ";


getch( );
return;
}
Exemplo2: 1. Fazer uma funo que calcule a soma da srie abaixo:
2

8 13 14 19 . . .

2. Fazer um programa que leia o nmero de termos da srie. Calcule e


escreva a soma dos n primeiros termos da srie.
#include <conio.h>
#include <iostream.h>
long soma(int n)
{
long so,cont,nu;
so=0; nu=2;
for (cont=1;cont<=n;cont++)
if (nu % 2 = =0)
{
so=so+nu;
nu=nu+5;
}
else {
so=so+nu;
nu=nu+1;
}
return so;
}
void main(void)
{
int n;
long so;

58

cout<<\n digite o nmero de termos da srie;


cin>>n;
so=soma(n);
cout<<\n a soma da srie : <<so;
cout<<\n aperte qualquer tecla;
getch();
return;
}

59

1.9 - Passando vrios argumentos


Ex: Funo que desenha retngulos
#include <iostream.h>
#include <conio.h>
void retangulo(int l, int alt)
{
int i,j;
l=l/2;
alt=alt/4;
for(i=1;i<=alt;i++)
{
cout<<"\t\t";
for(j=1;j<=l;j++)
cout<<'\XDB';
cout<<'\n';
}
}
void main(void)
{
cout<<"\nSala\n";
retangulo(22,12);
cout<<'\nCozinha\n";
retangulo(16,16);
cout<<"\nBanheiro\n";
retangulo(6,8);
cout<<"\nQuarto\n";
retangulo(12,12);
cout<<"\nAperte enter";

60

getch( );
return;
}

1.10 - O operador unrio de referncia: &


O operador de referncia cria outro nome para uma varivel j criada.
Ex.: int n;
int& n1 = n;
onde: n1 o outro nome para n. A operao em qualquer dos nomes
tem o mesmo resultado.
Uma referncia no uma cpia da varivel a que se refere. a mesma
varivel sob nomes diferentes.
Ex.:

int n;

int& n1=n;
n=5;
cout<<n1;
n1=8;
cout<<n;
sadas:

5 e 8

Obs: O operador unrio &, quando usado na criao de referncia, faz parte do tipo:

61

int& um tipo de dado.


Toda referncia deve obrigatoriamente ser inicializada.
int n;
int& n1; //errado
int& n1=n; // certo

1.11 - Passagem por referncia


A principal vantagem da passagem por referncia a de que a funo pode
acessar as variveis da funo que chamou. Este mecanismo, possibilita que uma funo
retorne mais de um valor para a funo que chama.
Exemplo: Mostra passagem de argumentos por referncia
#include <conio.h>
#include <iostream.h>
void reajusta (float& p, float& r ) // reajusta o preo em 20%
{
r=p*0.2;
p=p*1.2;
}
void main(void)
{
float preco,valreaj;
do
{
cout<<"\n Entre com o preo ";
cin>preco;

62

reajusta(preco,valreaj);
cout<<"\n Preco novo = "<<preco;
cout<<"\n Valreaj = "<<valreaj;
}
while (preco !=0);
cout<<"\n Aperte qualquer tecla";
getch( );
}
Ex.2
// ordena uma lista de 3 nmeros
#include <conio.h>
#include <iostream.h>
void troca(float& n, float& m)
{
float aux;
aux=n;
n=m;
m=aux;
}
void main(void)
{
float n1,n2,n3;
cout<<"\nDigite 3 nmeros ";
cin>>n1>>n2>>n3;
if(n1>n2)
troca(n1,n2);
if(n1>n3)
troca(n1,n3);
if(n2>n3)
troca(n2,n3);
cout<<"\nn1 = "<<n1<<" n2 = "<<n2<<" n3 = "<<n3;

63

cout<<"\n Aperte qualquer tecla";


getch( );
}

64

1.12 - Referncias Constantes


Voc pode combinar a palavra chave const com a declarao de uma
referncia para uma varivel.
Ex.: int n = 456;
const int &n1 = n;
Estas declaraes fazem de n1 um nome "read-only" para n. Voc no poder
fazer nenhuma modificao em n1, somente em n.
1.13 - Classes de armazenamento
So quatro as classes de armazenamento em C ++:
1 - auto - automticas (default)
2 - extern - externas
3 - static - estticas
4 - register - em registradores
1) Classe auto
Podem ser acessadas somente pelas instrues do mesmo bloco e
escritas aps a sua declarao.
Quando uma varivel automtica criada, o programa no a inicializa
com nenhum valor especfico. Variveis automticas contero um valor inicial aleatrio,
chamado " lixo ".
2) Classe extern
So declaradas fora de qualquer funo. O acesso a elas permitido a
todas as funes definidas aps a sua declarao, e elas existiro enquanto o programa
estiver sendo executado.

65

Ex.:
#include <conio.h>
#include <iostream.h>
int i;

// externa

int j=234;

// externa

void func( )
{
i=25; j=48;
}
void main(void)
{
cout<<"\n i = "<<i<<"j = "<<j;
func( );
cout<<"\n i = "<<i<<"j = "<<j;
cout<<"\nAperte enter ";
getch( );
return;
}
sada:

i=0

j = 234

i = 25

j = 48

1.14 - O Operador de escopo : :


Em C ++, as variveis automticas tm precedncia sobre variveis externas.
Voc pode solicitar ao compilador que utilize a varivel externa em vez da automtica
colocando o operador : : antes do nome da varivel.
Ex.:

66

#include <iostream.h>
#include <conio.h>
int i;

// inicializa com zero

int j=234;

// inicializa com 234

void main( )
{
int i=5, j=10; // variveis automticas
cout<<: : i<<: : j<<"\n"; // externas
cout<<i<<j<<"\n";
cout<<"\n Aperte qualquer tecla";
getch( );
}
1.15 - Funes recursivas
Uma funo dita recursiva se for definida em termos dela mesma. Isto ,
uma funo recursiva quando dentro dela est presente uma instruo de chamada a ela
prpria.
Ex: 1 - Escrever uma funo que calcula o fatorial de um nmero.
#include <conio.h>
#include <iostream.h>
long fatorial (int n)
{
if (n<=1)
return (1);
else return (n*fatorial(n-1));
}
void main(void)

67

{
int n;
cout<<"\nDigite um numero inteiro";
cin>>n;
cout<<"\nFat = "<<fatorrial(n);
cout<<"\nAperte enter";
getch( );
return;
}
Quando o programa for executado a funo fatorial ser acessada
repetidamente, uma vem em main e (n-1) vezes dentro dela mesma apesar do usurio no se
preocupar com isso. Quando um programa recursivo executado, as chamadas das
funes recursivas no so executadas imediatamente. Elas so colocadas em uma pilha
(stack) at que a condio de trmino da recurso seja encontrada. As chamadas da funo
so executadas, ento, em ordem inversa, medida que forem retiradas (popped off) da
pilha. Quando uma expresso fatorial for avaliada recursivamente, as chamadas de funo
sero executadas da seguinte ordem:
n! = n*(n-1)!
(n-1)! = (n-1)*(n-2)!
(n-2)! = (n-2)*(n-3)!
2! = 2*1!
Os valores sero ento devolvidos na seguinte ordem:
1! = 1
2! = 2*1! = 2*1 = 2
3! = 3*2! = 3*2 = 6
4! = 4*3! = 4*6 = 24
Ex.2 - Imprime uma frase de ordem inversa a que foi lida.

68

#include <iostream.h>
#include <conio.h>
void invert( )
{
char ch;
if ((ch=getche( ) )!= '\r')
invert( );
cout<<ch;
}
void main(void)
{
cout<<"\n";
inverte( );
cout<<"\n Aperte qualquer tecla";
getch( );
return;
}
1.16 - O conjunto das diretivas mais comuns reconhecidas pelo pr-processador o
seguinte:
1 - #define
2 - #undef
3 - #include
4 - #if
5 - #ifdef
6 - #ifndef
7 - #else
8 - #elif
9 - #endif

69

10 - #error
1.16.1

- #define usada para definir constantes simblicas com nomes

apropriados
Ex.: #define PI 3.14
1.16.2 - #undef remove a mais recente definio criada com #define
1.16.3 - #include causa a incluso de outro arquivo em nosso programa
fonte.
1.16.4 - #error provoca uma mensagem de erro do compilador em tempo de
compilao.

UNIDADE - IV
1.0 - Estruturas
H cinco tipos de dados simples que esto pr-definidos no compilador e que
nos j conhecemos e j utilizamos. So eles: char, int, float, double e void.
Estruturas so tipos de variveis que agrupam dados geralmente desiguais.
Os itens de dados de uma estrutura so chamados membros.
1.1 - definindo a estrutura
struct nome-do-tipo

70

{
membros
};
onde: struct indica que um novo tipo de dado est sendo definido.
Ex.:

struct aluno
{
int idade;
float altura;
char sexo, nome[25];
};

1.2 - Acessando os membros da estrutura. Seus membros podem ser


acessados por meio do operador ponto.
nome-da-estrutura.membro

Ex.: aluno.idade
1.3 - Combinando declaraes
struct
{
membros;
} nome-das-variveis;

71

Ex.: struct
{
int nmat;
float nota[3];
float media;
} Ana, Jose, joo; // declarao de diversas variveis

1.4 - Inicializando estruturas


semelhante inicializao de uma matriz
Ex.: struct data
{
int dia;
char mes[10];
int ano;
};
data natal = {25,dezembro,1.994},
aniversario={30,julho,1.978};
Obs.: As variveis esto sendo inicializada na mesma instruo de suas
declaraes.
1.5 - Operaes entre estruturas
struct venda
{
int pecas;
float preco;

72

};
venda a={20,110.0}, b= {3,16.5}, total;
Operaes simples como a soma no est definida para tipos criados
com a palavra struct. A soma deve ser efetuada membro a membro:
total.pecas=a.pecas+b.pecas;
total.preco=a.preco+b.preco;
1.6 - Estruturas aninhadas
exemplo:
//mostra estruturas aninhadas
#include <conio.h>
#include <iostream.h>
struct data
{
int dia;
char mes[10];
int ano;
};
struct venda
{
int pecas;
float preco;
data diavenda;
};

73

void main( )
{
venda a={20,110.0,{7,novembro,1.993}};
cout<<\npecas: <<a.pecas;
cout<<\npreco: <<a.preco;
cout<<\ndata: <<a.diavenda.dia<<de<<a.diavenda.ano;
getch( );
return;
}
Eis a sada:
pecas: 20
preco: 110
data: 7 de novembro de 1.993.
1.7 - Passando estruturas para funes.
As estruturas podem ser passadas como argumentos de funes de
mesma forma que variveis simples.
Exemplo:
// mostra passagem de estruturas para funes por valor.
#include <iostream.h>
#include <conio.h>
struct venda
{
int pecas;
float preco;
};

74

void listavenda (venda c, venda d)


{
cout<<\nVenda total = ;
cout<<\nTotal de peas: <<(c.pecas+d.pecas);
cout<<\nPreco total: <<(c.preo+d.preco);
getch( );
}
struct data
{
int dia;
char mes[10];
int ano;
};
struct venda
{
int pecas;
float preco;
data diavenda;
};
void main( )
{
venda a={20,110.0,{7,novembro,1,993}};
cout<<\npecas: <<a.pecas;
cout<<\nprecos: <<a.preco;
cout<<\ndata: <<a.diavenda.dia<<de<<a.diavenda.ano;
getch( );
return;
}

75

1.8 - Matrizes de Estruturas


um conjunto de registros referenciveis por um mesmo nome e
individualizados por ndices.
1.8.1 - Declarando a matriz de estruturas
O processo de declarao de uma matriz de estruturas perfeitamente
anlogo declarao de qualquer outro tipo de matriz.
A instruo: vendas[50];
Declara vendas como sendo uma matriz de 50 elementos, cada
elemento da matriz uma estrutura do tipo venda. Ento venda[0] a primeira estrutura do
tipo venda, veda[1] a segunda estrutura do tipo venda e assim por diante.
Exs.: 1 - Declara a seguinte estrutura de dados.
contas

cliente

0
1
2

nome
r
ua

3
4
5

n
mero
saldo

c
pf

struct cliente
{
char nome[25];
char rua[40];
int numero;
char cpf[14];
float saldo;
};
cliente contas[6];

76

2.0 - Dada tabela abaixo


C

Nome

10

Alfaiate

10

Analista

10

Vendedo

digo
0
00
1
20
2
30

.
.
.
9
9

10

Mdico

99

Fazer um programa que, dados 500 cdigos de profisso, emita o nome das
profisses correspondentes. A tabela acima tambm deve ser lida do dispositivo de entrada.
Estrutura de dados
0
1
2

c
digo

n
ome

3
.
.
.
9
9
#include <conio.h>
#include <iostream.h>
#include <string.h>
77

#include <stdio.h>
void main(void)
{
struct tabela
{
char no[25];
long codigo;
};
tabela tab[100];
int i,k;
long codigodesejado;
clrscr( );
for (i=0;i<=99;i++)
{
cout<<\ndigite o nome<<i;
gets(tab[i].no);
cout<<\ndigite o cdigo<<i;
cin>>tab[i].codigo;
clrscr( );
}
for (k=1;k<=500;k++)
{
cout<<\nDigite o codigo desejado;
cin>>codigodesejado;
i=0;
while (tab[i].codigo != codigodesejado && i<99)
i++;
if (tab[i].codigo = = codigodesejado)
cout<<\nCodigo<<codigodesejado<<tab[i].no;
else cout<<\nInvalido<<codigodesejado;

78

}
cout<<\nAperte qualquer tecla;
getch( );
return;
}
3 - Em certo municpio vrios proprietrios de imveis esto em atraso com o
pagamento do imposto predial. Escrever um programa que calcule e escreva o valor da
multa a ser paga por estes proprietrios considerando que:
- Os dados de cada imvel: identificao (literal), valor do imposto e nmero de
meses em atraso, esto disposio numa unidade de entrada;
- As multas devem ser calculadas a partir do valor do imposto e de acordo com a
seguinte tabela.
Valor

do

% por ms em

imposto
atraso
at R$ 5000
1
de 5000 a
2
18000
de 180001 a

de

de

10

50000
50001

120000
acima
120000

- O ltimo registro lido, que no deve ser considerado, contm identificao do


imvel igual a vazio.
- Na sada devero ser impressos: identificao do imvel, valor do imposto,
meses em atraso e a multa a ser paga.
As estruturas de dados a serem adotadas para a soluo do problema so:

79

Limites
de

at

0
5.001

5.000
18.00

1
2

50.00

120.0

perce
ntual

0
18.001
0
50.001
00
120.001

10

Para os dados de cada imvel, ser adotado o seguinte registro (varivel


composta heterognea)

identifi
c

impo
sto

literal

meses
at

numrico

numrico

#include <conio.h>
#include <string.h>
#include <stdio.h>
#include <iostream.h>
void main(void)
{
float tab[5][3];
struct imvel
{
char ident[8];
float imposto;
int meseat;
};
80

int i,j;
float multa;
clrscr( );
cout<<\nLeitura da tabela;
for (i=0;i<=4;i++)
for (j=0;j<=2;j++)
{
cout<<\nDigite um valor <<i<< <<j;
cin>>tab[i][j];
clrscr( ):
}
cout<<\nDigite a identificao;
gets(imovel.ident);
while(strscmpi(imovel.ident, ))
{
cout<<\nDigite o imposto;
cin>>imovel.imposto;
cout<<\nDigite o mes;
cin>>imovel.meseat;
i=4;
while (imovel.imposto<tabe[i][0] && i>=0)
i=i-1;
if(imovel.imposto>=tab[i,][1]
{
multa=tab[i][2]*(imovel*imposto)*(imovel*meseat/100);
cout<<\nIdent = <<imovel.ident;
cout<<\nImposto<<imovel.imposto;
cout<<\nMulta<<multa;
}
cout<<\nDigite a identificao;
gets(imovel.ident);

81

}
cout<<\nAperte qualquer tecla;
getch( );
return;
}

82

1.9 Arquivos
1.9.1- As classes iostream:
As classes istream e ostream so derivadas de ios e so dedicadas a leitura e
impresso, respectivamente.
A classe istream contm funes como get(), getline(), read(), alm de outras.
Contm ainda a sobrecarga do operador de extrao >>.
A classe ostream contm funes como put(), write(), alm de outras. Contm a
sobrecarga do operador de insero <<.
Ex:
Gravando linha a linha em arquivos em discos.
// Cria um arquivo e grava nele uma string por vez.
#include <fstream.h> // diretiva para as funes de arquivos.
void main()
{
ofstream fout(teste.txt); //cria arquivo para gravao em modo texto
fout<<\n Um grande antdoto contra o egoismo e a generosidade;
fout<<\n D mesmo que isso requeira de voc um esforo.;
}
Obs: inicializamos este objeto com o nome do arquivo teste.txt. Esta inicializao
associa o objeto fout ao arquivo em disco teste.txt para gravao.
Ex2: Lendo uma linha por vez em arquivos em disco.

83

Este exemplo pelo programa teste.txt criado pelo programa anterior l uma string
por vez.
// L strings de arquivo
#include <fstream.h>
#include <conio.h>
void main()
{
const int max=80;
char buff[max];
ifstream fin(teste.txt); //cria arquivo p/leitura em modo testo
while(fin) // enquanto nao termina o arquivo
{
fin.getline(buff,max); // L linha de texto
cout<<buff<<\n;
}
cout<<\n aperte enter p/continuar;
getch();
return;
}
No exemplo, getline() l caracteres enquanto no encontrar o caracter \n e coloca
os caracteres lidos no buffer especificado como argumento. O tamanho mximo do buffer
informado no segundo argumento. O contedo do buffer impresso aps cada leitura.
1.9.2- Detectando o Fim-de-Arquivo.
O objeto fin ter o valor zero se o sistema operacional enviar ao programa o sinal
de fim-de-arquivo e um valor no- zero caso contrrio.
Exemplo: Podemos verificar o fim de arquivo ao mesmo tempo em que lemos uma
linha.Esta uma forma mais composta.

84

#include <fstream.h>
#include <conio.h>
void main()
const int max=80;
char buff[max];
ifstream fin(teste.txt); // cria arquivo para leitura em modo texto.
while(fin.getline(buff,max)) // enquanto nao eof
cout<<buff<<\n;
cout<<\n aperte enter;
getch();
return;
}
1.9.3- Lendo e gravando um caracter por vez no arquivo.
Para trabalhar com um nico caracter por vez, usamos as funes put() e get(),
membros das classes ostream e istream respectivamente.
Ex:
// Grava um caracter por vez num arquivo
#include <fstream.h>
void main()
{
ofstream fout(teste1.txt);
char ch;
while(cin.get(ch)) // L um caracter do teclado
fout.put(ch);
}
Obs:1. O lao while verifica se o caractere que indica fim-de-arquivo foi digitado no
teclado. Este caractere tem cdigo \x1a e inserido pressionando-se tecla ctrl-z.

85

2. A instruo fout.put(ch) grava o caractere contido em ch no arquivo


associado fout.
Ex: L um caractere por vez de um arquivo.
#include <conio.h>
#include <fstream.h>
void main()
{
ifstream fin(teste1.txt);
char ch;
while (fin.get(ch)) // L um caractere do arquivo
cout<<ch;
cout<<\n aperte enter;
getch();
return;
}
1.9.4- A funo open()
Tanto o construtor como a funo open() aceitam a incluso de um segundo
argumento indicando o modo de abertura do arquivo. Este modo definido por bits de um
byte, onde cada um especifica certo aspecto de abertura do arquivo.
A lista de modos definida na classe ios por meio do tipo enum open-mode.
Modos
ios::ou
ios::ate

Descrio
abre para gravao
abre e posiciona

no

fim

do

arquivo.Este modo trabalha com leitura e


ios::in
ios::app
ios::trunc

gravao.
abre para leitura
grava a partir do fim do arquivo
abre e apaga todo o contedo do

ios::nocreate

arquivo
erro de abertura se o arquivo no
86

existir.
ios::noreplace
ios::binary

erro de abertura se o arquivo existir


abre em binrio(default texto).

1.9.5-Gravando Objetos.
As funes apropriadas para o processo de gravao e leitura de objetos so as
funes write() e read().
Exemplo: Para mostrar o seu uso, primeiramente criaremos um programa para
gravar registros de livros de uma biblioteca.
// Grava objetos em disco.
#include <fstream.h>
#include <stdio.h>
#include <conio.h>
class livro
{
private :
char titulo[50];
char autor[50];
int numreg;
double preco;
public :
void novonome();
};
void livro::novonome()
{
cout<<\n digite titulo;
gets(titulo);
cout<<\n digite o autor;
gets(autor);
cout<<\n digite o numero do registro;

87

cin>>numreg;
cout<<\n digite o preco;
cin>>preco;
clrscr();
}
void main()
{
ofstream fout(lista.dat);
livro li;
do
{
li.novonome();
fout.write((char * )&li,sizeof(livro));
cout<<\n mais um livro (s/n)?;
}
while(getche()!=n);
}
onde: - A funo membro novonome() chamada das informaes dos registros.
gravado no arquivo lista.dat por meio da funo write().
- A funo write() recebe 2 argumentos:- o primeiro o endereo do objeto a
ser gravado;
- o segundo o tamanho do objeto deve ser convertido para um ponteiro char.
1.9.6- Lendo Objetos
Para ler os objetos gravados pelo programa anterior, usaremos a funo read().
Ex: L objetos do disco.
#include <fstream.h>

88

#include <stdio.h>
#include <conio.h>
class livro
{
private :
char titulo[50];
char autor[50];
int numreg;
double preco;
public : void print();
};
void livro::print()
{
cout<<\n titulo: <<titulo;
cout<<\n autor: <<autor;
cout<<\n no. reg :<<numreg;
cout<<\n preco: <<preco;
}
void main()
{
ifstream fin(lista.dat);
livro li;
clrscr();
while(fin.read((char *)&li,sizeof(livro)))
li.print();
cout<<\n aperte qualquer tecla;
getch();
return;
}
onde: - A funo read() membro da classe istream e recebe 2 argumentos:- o
primeiro o endereo do objeto para onde iro os dados lidos;

89

- o segundo, tamanho do objeto deve ser convertido para um ponteiro char.


1.9.7- Gravando e Lendo Objetos de um mesmo arquivo.
Ex: grava e l objetos de disco.
#include <fstream.h>
#include <stdio.h>
#include <conio.h>
class livro
{
private :
char titulo[50];
char autor[50];
int numreg;
double preco;
public : void novonome();
void print();
};
void livro::novonome()
{
cout<<\n digite titulo;
gets(titulo);
cout<<\n digite o autor;
gets(autor);
cout<<\n digite o nmero do registro;
cin>>numreg;
cout<<\n digite o preco;
cin>>preco;
clrscr();
}
void livro::print()

90

{
cout<<\n titulo: <<titulo;
cout<<\ autor : <<autor;
cout<<\nno. reg. : <<numreg;
cout<<\n preco : <<preco;
}
void main()
{
fstream fio; // Cria objeto de leitura e gravao.
livro li; // Cria objeto livro
fio.open(lista.dat,ios::ate || ios::out || ios::in);
do
{
li.novonome();
fio.write((char *)&li,sizeof(livro));
cout<<\n Mais um livro (s/n) ? ;
}
while(getche()!=n);
fio.seekg(0); // Coloca o ponteiro no incio do arquivo.
cout<<\n lista de livros do arquivo;
cout<<\n ===================================;
while(fio.read((char * )&li,sizeof(livro)))
li.print();
cout<<\n aperte enter;
getch();
return;
}
onde: - A instruo fstream fio cria um objeto para leitura e gravao.
- Na instruo fio.open(lista.dat,ios::ata | ios::out | ios::in)
vrios modos podem ser aplicados simultaneamente por meio do operador OR (||).

91

- Usamos ate para preservar os objetos que j existem no arquivo e


acrescentar novos objetos ao final dele. Usamos out e in pois queremos executar as duas
operaes de gravao e de leitura.
- A instruo fio.seekg(0) modifica a posio corrente do arquivo para o seu
incio.
1.9.8- As funes seekg(),tellg(),seekp() e tellp().
Cada objeto stream est associado a dois valores inteiros chamados ponteiro de
posio corrente de leitura e ponteiro de posio corrente de gravao.
A fonao seekg() permite movimentar a posio corrente de leitura do arquivo
para uma posio escolhida.
A funo seekp() executa a mesma tarefa para a posio corrente de gravao.
A funo seekg() tem o seguinte prottipo:
istream&seeg(long pos,sek-dir posio=ios::beg);
O primeiro argumento indica o deslocamento em bytes a partir da posio
escolhida. Quando a funo chamada com um nico argumento, a posio assumida
como sendo o incio do arquivo (ios::beg).
O segundo argumento quando usado, deve ser um dos modos seguintes:
ios::beg A partir do incio do arquivo
ios::cur A partir da posio corrente
ios::end A partir do fim do arquivo.
Como a leitura do nosso arquivo deve comear no seu incio, queremos deslocar o
byte a partir do incio do arquivo.
A funo tellg() tem o seguinte prottipo:
long tellg();
Esta funo retorna a posio corrente de leitura(em bytes), sempre a partir do
incio do arquivo.
1.9.9- Calculando o nmero de registros do arquivo.
Exemplo: O exemplo mostra o uso das funes seekg() e tellg().

92

#include <fstream.h>
#include <iostream.h>
#include <stdio.h> // para exit()
#include <conio.h>
class livro
{
private :
char titulo[50];
char autor[50];
int numreg;
double preco;
public : void novonome();
void print();
};
void livro::novonome()
{
cout<<\n digite titulo;
gets(titulo);
cout<<\n digite autor;
gets(autor);
cout<<\n digite o nmero de registros;
cin>>numreg;
cout<<\n digite o preco;
cin>>preco;
clrscr();
}
void livro::print()
{
cout<<\n titulo: <<titulo;
cout<<\n autor: <<autor;
cout<<\n No. reg. :<<numreg;
cout<<\n preco : <<preco;

93

}
void main()
{
ifstream fin;
livro li;
fin.seekg(0,ios::end); //aponta para fim do arquivo, deslocamento zero
long nrec=(fin.tellg())/sizeof(livro);
cout<<\n numero de registros=<<nrec;
cout<<\n insira o numero do registro:;
cin>>nrec;
int posicao=(nrec-1)*sizeof(livro);
fin.seekg(posicao);
fin.red(char *)&li,sizeof(livro));
fin.seekg(posicao);
fin.read((char *)&li,sizeof(livro));
li.print();
cout<<\n aperte enter;
getch();
return;
}
A sada ser :
Numero de registros=3
insira o nmero de registro: 1
Titulo : Helena
Autor : Machado de Assis
No. Reg. : 102
Preco : 70.50
Observe que o usurio escolheu o registro 1 indicando o primeiro registro do
arquivo, entretanto para o programa o primeiro registro o de numero 0. Assim, na
instruo:

94

int posicao=(nrec-1)*sizeof(livro);
usamos nrec-1 para corrigir o nmero do registro.

95

1.10 Exemplos extras de arquivos.


// ------------------------------ Programa inicial para uma agenda
//
// PUC - Minas - Departamento de Cincia da Computao - 02/96
//
// Programa para exercitar conceitos bsicos sobre arquivos.
//
//
// ------------------------------ Bibliotecas necessrias
#include <conio.h>
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include <fstream.h>
#include <iostream.h>
// ------------------------------ Definicoes globais
#define BOOLEAN int
#define TRUE

#define FALSE

#define nl
#define FDA

'\n'
'.'

// ------------------------------ Biblioteca basica


char GetOption(int X, int Y, char * Valida)

// GetOption()

{
// objetivo :
// colher uma resposta do teclado, posicionando-a na tela
// nas coordenadas (X,Y) e verificando sua validade
//
// parmetros :
// X

- coluna (ate' 80)

// Y

- linha (ate' 24)

// Valida - cadeia de caracteres com as opes validas

96

//
// definies locais
char C;

// opo que ser' lida do teclado

do
{
gotoxy(X,Y); clreol();
gotoxy(X,Y); C=getche();

// posicionar e limpar ate' o fim da linha


// posicionar, ler e ecoar o caractere

}
while(! memchr(Valida,C,strlen(Valida)));
return(toupper(C));

// voltar maiscula correspondente

}
void PutStr(int X, int Y, char * Str)

// PutStr()

{
// objetivo :
// colocar uma mensagem na tela nas coordenadas (X,Y)
//
// parmetros :
// X

- coluna (ate' 80)

// Y

- linha (ate' 24)

// Str

- cadeia de caracteres com a mensagem a ser mostrada

//
gotoxy(X,Y); cout << Str;
return;
}
void Pausa()

// Pausa()

{
// objetivo :
// fazer uma pausa, esperando pela digitao de uma tecla
PutStr(1,24,"Digite <Enter> para continuar.");
getch();
return;
}
void Terminar()

// Terminar()

97

{
// objetivo :
// informar o termino do processamento
clrscr();
cout << "Terminar ...";
Pausa();
return;
}
BOOLEAN Existir (const char * Nome)

// Existir()

{
// objetivo
// verificar a existncia de um arquivo,
// cujo nome ser' passado como parmetro
//
// parmetros :
// Nome - nome externo do arquivo que se quer testar a existncia
//
return ((int) (fopen(Nome,"r")));
}
// ------------------------------ Definies de tipos globais
class Agendas
{
public:
typedef struct SData

// data completa

{
int Dia, Mes, Ano;
}
Datas;
// descrio do registro bsico
char Agenda[30];

// nome externo da agenda

char Pessoa[30];
char Endereo[60];
char Telefone[13];

98

char Aniversario[10];
Agendas(const char * Nome);

// construtor padro

void Ler(void);
void Mostrar(void);
void Criar();
void Listar();
void Procurar();
void Acrescentar();
};
// ------------------------------ Biblioteca especifica
void Agendas::Agendas(const char * Nome)

// construtor padro

{
// objetivo :
// designar um nome externo `a agenda
//
strcpy(Agenda, Nome);
return;
}
void Agendas::Ler(void)

// GetReg()

{
// objetivo :
// ler do teclado os campos do registro de uma pessoa
//
clrscr();
PutStr(1, 2, "Ler os dados de uma pessoa : ");
PutStr(1, 4, "Nome

: "); gets(Pessoa);

if(Pessoa[0] != '.')
{
PutStr(1, 5, "Endereco
PutStr(1, 6, "Telefone

: "); gets(Endereco);
: "); gets(Telefone);

PutStr(1, 7, "Aniversario : "); gets(Aniversario);


}
else

99

{
strcpy(Endereco , "");
strcpy(Telefone , "");
strcpy(Aniversario, "");
}
Pausa();
return;
}
void Agendas::Mostrar(void)

// PutReg()

{
// objetivo :
// mostrar na tela os campos do registro de uma pessoa
//
if(Pessoa[0] != '.')
{
clrscr();
PutStr(1, 2, "Mostrar os dados de uma pessoa : ");
PutStr(1, 4, "Nome

: "); cout << Pessoa;

PutStr(1, 5, "Endereco
PutStr(1, 6, "Telefone

: "); cout << Endereco;


: "); cout << Telefone;

PutStr(1, 7, "Aniversario : "); cout << Aniversario;


}
Pausa();
return;
}
FILE *Agenda;

// definio global da varivel arquivo


// pois nao pode ser passada como parmetro

void Agendas::Criar(void)

// Criar()

{
// objetivo :
// criar um arquivo em disco,
// com o nome externo que receber como parmetro
//
// parmetros :
// Nome - nome externo do arquivo que se quer criar

100

//
// condies especiais :
// - se um arquivo de mesmo nome j' existir,
// ser' dada opo de nao altera'-lo;
// - se o arquivo nao existir, nao haver' problemas
char

Opo = 'S';

long

N=-1;

ofstream Txt(Agenda);
clrscr();
if(Existir(Agenda))
{
PutStr(1,3, "Agenda j\' existe\n\n");
PutStr(1,5, "Quer apagar e comear outra [S,N] ? ");
Opcao = GetOption(36,5,"SNsn");
if(Opcao == 'S')
{
cout << "Os dados atuais sero apagados.";
}
else
{
cout << "Os dados atuais sero mantidos.";
}
}
if(Opcao == 'S')
{
cout << "Criar ...";
do
{
Ler();
Txt << Pessoa
Txt << Endereco
Txt << Telefone
Txt << Aniversario
N++;

<< nl; // writing


<< nl;
<< nl;
<< nl;
// register counter

101

while(Pessoa[0] != FDA);
clrscr();
PutStr(1, 2, "Agenda criada.\n");
cout << N << " registros gravados.\n";
}
Pausa();
return;
}
void Agendas::Listar(void)

// Listar()

{
// objetivo :
// mostrar os contedos de cada registro um arquivo,
// cujo nome ser' passado como parmetro
//
// parmetros :
// Nome - nome externo do arquivo que se quer mostrar o contedo
//
long

N=-1;

ifstream Txt(Agenda);
clrscr();
cout << "Listar ...";
if(Existir(Agenda))
{
cout << "Listando ...";
do
{
Txt.getline(Pessoa

,30);

// lendo

Txt.getline(Endereco ,60);
Txt.getline(Telefone ,13);
Txt.getline(Aniversario,10);
N++;
Mostrar();

// contando
// mostrando

}
while(Pessoa[0] != FDA);
clrscr();
PutStr(1, 2, "Termino da leitura.");
cout << nl << N << " registros lidos.\n";

102

getch();
}
else
{
PutStr(1,3, "Erro : Agenda nao existe. \n\n");
}
Pausa();
return;
}
void Agendas::Procurar(void)

// Procurar()

{
// objetivo :
// procurar no arquivo,
// cujo nome ser' passado como parmetro,
// pelo registro que contenha um determinado nome de pessoa
//
// parmetros :
// Nome - nome externo do arquivo onde se quer procurar um registro
//
long

N=1,P;

char

Opo;

char

Procurado[30];

fstream Txt;
BOOLEAN Achar=FALSE;
clrscr();
cout << "Procurar ...\n\n";
cout << "Digite o nome a ser procurado : ";
gets (Procurado);
strcpy(Pessoa, Empty);
Txt.open(Agenda, ios::in | ios::out);
while(Pessoa[0] != FDA && ! Achar)
{
Txt.getline(Pessoa

,30);

// lendo

Txt.getline(Endereco ,60);
Txt.getline(Telefone ,13);
Txt.getline(Aniversario,10);

103

if(strcmp(Pessoa, Procurado) == 0)
Achar = TRUE;
else
{
N++;

// contando

P = Txt.tellg();

// guardando onde estava

}
}
if(Achar)
{
Mostrar();

// mostrando

PutStr(1, 10, "Quer alterar (S/N) ?");


Opcao = GetOption(22,10,"SsNn");
if(Opcao == 'S')
{
Ler();

// ler os dados novos

Txt.seekg(P, ios::beg);
Txt << Pessoa
Txt << Endereco
Txt << Telefone
Txt << Aniversario

// determinar a posio

<< nl;

// gravar um novo

<< nl;
<< nl;
<< nl;

}
}
else
{
cout << "Registro nao encontrado. \n";
}
clrscr();
PutStr(1, 2, "Termino da procura.");
cout << nl << N << " registros lidos.\n";
// realizada a procura
Pausa();
return;
}
void Agendas::Acrescentar(void)

// Acrescentar()

{
// objetivo :

104

// acrescentar registros ao arquivo,


// cujo nome externo ser' passado como parmetro
//
// parmetros :
// Nome - nome externo do arquivo no qual se quer acrescentar registros
//
long

N=-1;

char

S[80];

fstream Txt;
clrscr();
cout << "Acrescentar ...\n\n";
Txt.open(Agenda, ios::ate | ios::out);
Txt.seekg(-3, ios::end);

// retirar a marca FDA

do
{
Ler();
Txt << Pessoa
Txt << Endereco
Txt << Telefone

<< nl; // gravar um novo


<< nl;
<< nl;

Txt << Aniversario

<< nl;

N++;

// contar mais um gravado

}
while(Pessoa[0] != FDA);
clrscr();
PutStr(1, 2, "Agenda alterada.\n");
cout << N << " registros novos gravados.\n";
Pausa();
return;
}
void Menu()

// Menu()

{
// objetivo :
// mostrar as opes bsicas do programa,
// e receber a escolha da funo desejada pelo usurio
char

Opo;

105

Agendas Minha ("Agenda.DAT");


do
{
clrscr();
PutStr(25, 5, "PROGRAMA PARA TRATAR UMA AGENDA");
PutStr(35, 7, "OPCOES :");
PutStr(35, 9, "0 - Terminar");
PutStr(35,10, "1 - Criar");
PutStr(35,11, "2 - Listar");
PutStr(35,12, "3 - Procurar");
PutStr(35,13, "4 - Acrescentar");
PutStr(30,16, "Digite sua opo : ");
Opcao = GetOption(50,16,"01234");
switch(Opcao)
{
case '0' : Terminar();
break;
case '1' : Minha.Criar();
break;
case '2' : Minha.Listar();
break;
case '3' : Minha.Procurar();
break;
case '4' : Minha.Acrescentar();
break;
default:
PutStr(1,22, "Opo invalida\n");
Pausa();
}
}
while (Opcao != '0');
return;
}
// ------------------------------ Programa principal

106

void main(void)
{
Menu();
return;
}

5 - UNIDADE V
1- Ponteiros
um endereo de memria. Seu valor indica onde uma varivel est armazenada. Um ponteiro
proporciona um modo de acesso a uma varivel sem referenci-la diretamente.
1-1 Por que os ponteiros so usados?
Os ponteiros so usados em situaes em que o uso de uma varivel difcil ou indesejvel.
Algumas razes para o uso de ponteiros so:

manipular elementos de matrizes;

receber argumentos em funes que necessitam modificar o argumento original;

passar strings de uma funo para outra; us-los no lugar de matrizes;

criar estruturas de dados complexos, como listas encadeadas e rvore binrias, onde um

item deve referncias a outro;

alocar e deslocar memria do sistema.

1-2 Ponteiros variveis


Um ponteiro varivel armazena um endereo de memria. Este endereo a
localizao de uma outra varivel. Dizemos que uma varivel aponta para outra varivel
quando a primeira contm o endereo da segunda.
1-3 Endereos de memria

107

A memria de seu computador dividida em bytes, e estes bytes so numerados


de o at o limite de memria de sua mquina. Estes nmeros so chamados endereos de
bytes. Um endereo a referncia que o computador usa para localizar variveis. Toda
varivel ocupa certa localizao na memria, e seu endereo o do primeiro byte ocupado
por ela.
1-4 Operador de endereos &
Este operador um operador unrio e seu operando deve ser o nome de uma
varivel, e o resultado o seu endereo.
Exemplo: Mostra o uso do operador de endereos.
#include <iostream.h>
#include <conio.h>
void main()
{
int i,k,j;
clrscr();
cout<<\n <<&i;
cout<<\n<<&j;
cout<<\n<<k;
cout<<\n aperte enter;
getch();
return;
}
Eis a sada:
0xfff4 ----------endereo de i
0xfff2 ----------endereo de j
0xfff0 ----------endereo de k

108

Obs.: 1.O operador << imprime endereos hexadecimal, precedidos pelo prefixo 0x.
2. O operador de endereo(&) s pode ser usado com nomes de variveis.
Exs: .1- &(i+1) ; // errado
2- &5 ;

// errado

1-5 Passando argumentos por referncia com ponteiros.


H trs maneiras de passar argumentos para uma funo:
- por valor
- por referncia
- por ponteiro.
Se uma funo deseja alterar variveis da funo chama dora estas variveis
no podem ser passadas por valor.
Em situaes como esta, podem usar referncias ou ponteiros. Para usar ponteiros
como argumentos devemos seguir dois passos:

Primeiro, a funo chama dora,em vez de passar valores para a funo

chamada, passa endereos usando o operador de endereos. Estes endereos so de


variveis de funo chamadora onde queremos que a funo coloque novos valores.

Segundo lugar, a funo chamada deve criar variveis para armazenar os

endereos enviados pela funo chamadora. Estas variveis so ponteiros.


Exemplo:
#include <conio.h>
#include <iostream.h>
void reajusta(float *p, float *r)
{
*r=*p*0.2;
*p=p*1.2;

109

}
void main()
{
float preco,valoreaj;
do
{
cout<<\n digite o preco;
cin>>preco;
reajusta(&preco, &valoreaj);
cout<<\n preco novo <<preco;
cout<<\n aumento =<<valoreaj;
}
while(preco!=0.0);
cout<<\n aperte enter;
getch();
return;
}

1-6 Variveis que armazena endereos.


Os endereos so armazenados de modo semelhante as variveis. Semelhante as
variveis. Uma varivel que armazena um endereo chamado de ponteiro. Observe que um
ponteiro para um float no do tipo float, mas sim do tipo float *. O asterisco faz parte do
nome do tipo e indica ponteiro para.
A declarao dos argumentos da funo reajusta() so float *p,float *r indica
que *p e *r sp do tipo float e que p e r so ponteiros para variveis float. Na verdade, usar
a *p uma maneira indireta de usar a varivel preco de main(). Toda alterao feita em *p
afetar diretamente preco.
1-7 O operador indireto(*)

110

um operador unrio que tem como operando um endereo ou ponteiro e resulta


no contedo da varivel localizada no endereo(ponteiro) operando. Em outras palavras,
resulta da varivel apontada.
1-8 Passando endereos para a funo.
A funo main() chama a funo reajusta() por meio da seguinte instruo:
reajust(&preco,&valoreaj);
Os endereos das variveis preco e valoreaj so enviados como argumentos. O
operador de endereos (&) usado para obter estes endereos.
A funo reajusta() recebe estes valores em ponteiros. Para que esta funo
possa acessar as variveis apontadas, deve no somente conhecer o endereo da varivel
como tambm o seu tipo, o qual indica o tamanho em bytes e a forma de armazenamento. O
tipo da varivel apontada dado na declarao do ponteiro.
1-9 Ponteiros sem funes.
Exemplo: Mostra o uso de ponteiros automticos.
#include <conio.h>
#include <iostream.h>
void main()
{
int x,y;
x=4; y=7;
cout<<\n &x=<<&x<<x=<<x;
cout<<\n&y=<<&y<<y=<<y;
int *px,*py;
px=&x;
py=&y;
cout<<px=<<px<<*px=<<*px;
cout<<<<py=<<py<<*py=<<*py;

111

cout<<\naperte enter:
getch();
return;
}
Eis a sada:
&x= 0xfff4

x=4

&y= 0xfff2

x=7

px= 0xfff4 *px=4


py= 0xfff2 *py=7
Obs.: Quando um ponteiro no inicializada na instruo de sua declarao, o
compilador inicializa-o com o endereo zero(null). C++ garante que null no um endereo
vlido, ento antes de us-los devemos atribuir a eles algum endereo vlido.
1-10 Ponteiros e variveis apontadas.
Exemplo: Mostra o uso de ponteiro automticos.
#include <iostream.h>
#include <conio.h>
void main()
{
int x,y;
int *px=&x; // inicializa p com o endereo de x
*p=14; // o mesmo que x=14
y=*p; // o mesmo que y=x
cout<<\n y=<<y ;
cout<<\n aperte enter;
getch();

112

return;
}
Observao: A instruo y=*p; indica o valor da varivel apontada.
1-11 Atribuio
Um endereo pode ser atribudo a um ponteiro.
Exemplo:
px=&x; //Atribumos o endereo de x a px
py=&y;
1-12 Operao Indireta
O operador indireto (*) precedendo o nome do ponteiro resulta no valor da
varivel apontada.
1-13 Trazendo o endereo do ponteiro.
Como as variveis, os ponteiros tem um endereo e um valor. O ponteiro (&)
precedendo o nome do ponteiro resulta na posio de memria onde o ponteiro est
localizado.
O nome do ponteiro indica o valor contido nele, isto , o endereo para o
qual ele aponta( o endereo da varivel apontada).
1-14 Incremento em ponteiro.
Incrementar um ponteiro acarreta sua movimentao para o prximo tipo
apontado; isto , se px for um ponteiro para uma varivel int, depois de executar a instruo
px++ o valor de px ser incrementado de um int(dois bytes). Cada vez que px

113

incrementado, apontar para o prximo int da memria. A mesma idia verdadeira para
decrementar.
1-15 Ponteiro no lugar de matrizes.
Exemplo: Imprimir os valores dos elementos de uma matriz.
#include <conio.h>
#include <iostream.h>
void main()
{
int m[5]={92,81,70,69,58};
int i;
for(i=0;i<5:i++)
cout<<\n <<*(m+i);
cout<<\n aperte enter;
getch();
return;
}
Onde: *(m+i) tem o mesmo valor de m[i]. Voc j sabe que m um ponteiro int e
aponta para m[0], conhecendo tambm a aritmtica com ponteiros. se somarmos 1 a m,
obtemos o endereo de m[1], m+2 o endereo de m[2] e assim por diante.Em regra geral,
temos que: m+i equivalente a &m[i], portanto *(m+i) equivalente a m[i].
1-16 Ponteiros constantes e ponteiros variveis.
Na instruo cout<<\n<<*(m+i); no pode ser substituda pela instruo
cout\n<<*(m++); pois no podemos incrementar uma constante.
O nome de uma matriz um ponteiro constante e no pode ser alterado.
Um ponteiro varivel um lugar na memria que armazena um endereo. Um ponteiro
constante um endereo, uma simples referncia.

114

Exemplo: Imprimir os elementos de uma matriz.


#include <conio.h>
#include <iostream.h>
void main()
{
int m[5]={92,81,70,69,58};
int *p=m;
int i;
for (i=0;i<5;i++)
cout<<\n<<*(p++);
cout<<aperte enter;
getch();
return;
}
Onde: - A instruo int *p=m inicializa o ponteiro com o nome da matriz m. Agora
podemos usar p em todo lugar do programa que sua m e, como p um ponteiro varivel e
no uma constante, podemos usar a expresso como: *(p++); onde p contm inicialmente o
endereo do primeiro elemento da matriz.

1-17 - Passando matrizes como argumento para funes.


Exemplo:
#include <conio.h>
#include <iostream.h>
int media(int *lista,int tamanho)
{
int i,m;
m=0;

115

for(i=0;i<tamanho;i++)
m=m+*lista++;
return (m/tamanho);
}
void main(void)
{
const maxi=20;
int i,notas[maxi],m;
for(i=0;i<maxi;i++)
{
cout<<\n digite a nota :<<i;
cin>>*(notas+i);
if(*(notas+i)<0)
break;
clrscr();
}
m=media(notas,i);
cout<<\n media : <<media;
cout<<\n aperte enter;
getch();
return;
}
Obs: 1. Na instruo int *lista equivalente a original int lista[]
2. visto que o nome da matriz um endereo, no h necessidade de usar o
operador(&0 na instruo int m=media(notas,i).
1-18 Precedncia
O operador ponteiro e o de incremento tem a mesma precedncia> Os
operadores da mesma precedncia so resolvidos por associao.

116

1-19 Ponteiros e strings.


Exemplo: Procurar um caracter numa mesma cadeia de caracteres.
#include <conio.h>
#include <iostream.h>
#include <stdio.h>
char *procura(char *s,char ch)
{
while(*s!=ch && *!=\o)
s=s+1;
if(*s!=\o)
return s;
else return(char *)0;
void main(void)
{
char ch, str[81],*ptr;
cout<<\n digite uma frase : ;
gets(sr);
ptr=procura(str,h);
cout<<\n a frase comea no endereo << unsigned(ptr);
if(ptr)
{
cout<<\n primeira ocorrncia do caracter h :<<unsigned(ptr);
cout<<\n A sua posio : <<unsigned(ptr-str);
}
else cout<<\n No existe o caracter h;
cout<<\n aperte enter;
getch();
return;
}

117

1-20 Matrizes de ponteiros.


Exemplo: Imprime o dia da semana a partir de uma data.
#include <conio.h>
#include <iostream.h>
int dsemana(int dia, int mes, int ano)
{
int f = ano+dia+3*(mes-1) - 1;
if(mes<3)
ano=ano-1;
else f=f-int(0.4*mes+2.3);
f=f+int(ano/4) - int((ano/100 +1)*0.75);
f=f%7;
return (f);
}const char esc=27;
void main()
{
char
*diasemana[7]={domingo,segunda,tera,quarta,quinta,sexta,sabado};
int dia,mes,ano,i;
do
{
cout<<\n digite a data dd mm aaaa : ;
cin>>dia>>mes>>ano;
i=(dsemana(dia,mes,ano);
cout<<\n <<diasemana[i];
}
while(getch()!=esc);
cout<<\n aperte enter;
getch();
return;

118

1-21 rea de alocao dinmica: HEAP.


area de alocao dinmica tambm chamada HEAP. Consiste em toda
memria disponvel que no foi usada para outro propsito. Em outras palavras, o HEAP
simplesmente o resto da memria.
C++ oferece dois operadores que permitem a alocao ou a liberao
dinmica de memria de HEAP, new e delete.
O operador new obtm memria do sistema operacional e retorna um
ponteiro para o primeiro byte do novo bloco de memria que foi alocado.Uma vez alocada,
esta memria continua ocupada at que seja deslocada explicitamente pelo operador delete.
Uma varivel criada pelo operador new existir e poder ser acessada por qualquer parte do
programa enquanto no for destruda pelo operador delete e seu retorno ao banco de
memria disponvel.
Exemplo: Mostra a classe string modificada.
#include <conio.h>
#include <iostream.h>
#include <string.h>
class string
{
private : char *str;
public : string()
{
str=new char;
*str=\0;
}
string(char *s)
{

119

str=new(char[strlen(s) + 1];
strcpy(str,s);
}
~string()
{
if(str)
delete str;
}
void print()
{
cout<<str;
}
};
void main()
{
string s= A vida uma longa estrada na qual
corremos contra o tempo;
strins s1;
cout<<\n;
s. print();
cout<<\n;
s1. print();
}
sada:
A vida uma longa estrada na qual corremos contra o tempo.
Onde: A instruo str = new char[ strlen(s) +1 ];
retorna um ponteiro p/ um bloco de memria do tamanho exato p/ armazenar a
cadeia s mais o \a. strcpy() copia a cadeia s p/ a nova memria reservada, apontada por str.
st = new char reserva um nico byte de memria.
se no houver memria suficiente o operador new devolver um ponteiro
com o valor zero (NULL).
120

~ string ()
{
if (str)
delete str;
}
Verifica se a memria foi alocada por new antes de liberar; caso contrrio aponte
para endereo zero.
A funo testa se o endereo do objeto o mesmo do contido no ponteiro this.
1-22 Retornando o ponteiro this
Retorna um valor de uma funo membro ou de uma funo que sobrecarrega um
operador.
Exemplo:
string & operator = (const string & s )
{
if (&s = = this)
return * this;
int tamanho = strlen ( s.str );
delete str;
str = new char [ tamanho +1 ];
strcpy (str, s.str);
return;
}
1-23 Dimensionando matrizes em tempo de execuo
Exemplo:
# include <iostream.h>
# include <conio.h>
int media (int *lista, int tamanho)
{
int m, i;

121

for(i = 0;i < tamanho; i++)


m=m + *lista++;
return( m/ tamanho);
}
void main()
{
int tamanho, *notas, i, m;
cout<<\n Digite o n de notas ;
cin>>tamanho;
notas = new int [tamanho];
notas = new int [tamanho][3];
.
.
.
.
delete[] notas;
Obs.: Voc pode alocar uma matriz multidimensional com new, mas somente a
primeira dimenso pode ser definida em tempo de execuo; as outras de um ser constantes.
int (*notas)[3];

122

EXERCCIOS PROPOSTOS

1 - Faa um programa que some os nmeros pares de 0 (zero) at 100 e imprima o


resultado.
2 - Fazer um programa que leia um nmero indeterminado de cartes contendo
cada um a idade de um indivduo. O ltimo carto, que no entrar nos clculos, contm o
valor de idade igual zero. Calcule e imprima a idade mdia deste grupo de indivduos.
3 - Tem-se um conjunto de dados contendo a altura e o sexo (masculino ou
feminino) de 50 pessoas. Fazer um programa que calcule e imprima:
- A maior e a menor altura do grupo;
- A mdia de altura das mulheres;
- O nmero de homens
4 - Um comerciante deseja fazer o levantamento do lucro das mercadorias que ele
comercializa. Para isto, mandou perfurar em cares (um para cada mercadoria) o nome,
preo de compra e preo de venda das mesmas. Fazer um programa que:
- Determine e escreva quantas mercadorias proporcionam:
lucro < 10%
10% < = lucro < = 20%
lucro > 20%
- Determine e escreva o valor total de compra e de venda de todas as
mercadorias assim como o lucro total.
obs.: O aluno deve adotar um flag.
5 - Uma firma fez uma pesquisa de mercado para saber se as pessoas gostaram ou
no de um novo produto lanado no mercado. Para isto, perfurou-se em cartes o sexo do
entrevistado e sua resposta (sim ou no). Sabendo-se que foram entrevistadas 200 pessoas,
fazer um programa que calcule e imprima;

123

- O nmero de pessoas que responderam sim;


- O nmero de pessoas que responderam no;
- A porcentagem de homens que responderam no;
- A porcentagem de mulheres que responderam sim;
6 - Deseja-se fazer um levantamento a respeito da ausncia de alunos primeira
prova de programao de computadores para cada uma das 14 turmas existentes. Para cada
turma foi perfurado um conjunto de cartes, sendo que o primeiro carto do conjunto
contm a identificao da turma (a,b,c) e o numero de alunos matriculados, e os demais
cartes contm o nmero de matrcula do aluno e a letra A ou P para o caso do aluno estar
ausente ou presente, respectivamente. Fazer um programa que:
- Para cada turma, calcule a porcentagem de ausncia e escreva a
identificao da turma e a porcentagem calcula;
- Determine e escreva qtas turmas tiveram porcentagem de ausncia superior
a 5%.
7 - Fazer um programa que calcule e escreva o seguinte somatrio
S = 1 + 3/2 + 5/3 + 7/4 + . . . +99/50;
8 - Fazer um programa que calcule e escreva o seguinte somatrio:
S = 1 + 3 + 5 + 7 + 9 + 11 + . . . + 199
9 - Uma companhia de teatro planeja dar um srie de espetculos. A direo calcula
que, a R$50,00 o ingresso, sero vendidos 120 ingressos, e as despesas montaro em
R$200,00. A diminuio de R$5,00 no preo do ingresso, espera-se que haja um aumento de
26 ingressos vendidos. Fazer um programa que escreva uma tabela de valores do lucro
esperado em funo do preo do ingresso, fazendo variar este preco de R$5,00 a R$1,00 de
R$0,50 em R$0,50. Escreva ainda, o lucro mximo esperado, o preo e o nmero de
ingressos correspondentes.
10 - Uma determinada fbrica de rdios possui duas linhas de montagem distintas:
Standard e luxo. A linha de montagem Standard comporta no mximo 32 operrios; cada
rdio luxo d um lucro de Y reais e gasta dois homens por dia para sua confeco. A fbrica

124

possui 40 operrios. O mercado capaz de absorver toda a produo, e o fabricante deseja


saber qual esquema de produo adotar de modo a maximizar seu lucro dirio.
Fazer um programa que leia os valores de X e Y e escreva, para esse esquema
de lucro mximo, o nmero de operrios na linha Standard e na linha de luxo, o nmero de
rdios Standard e luxo produzidos e o lucro.
11 - Uma empresa deseja calcular os salrios de seus empregados, e para isto,
perfurou em cartes magnticos os seguintes dados:

matrcula;

nome do empregado;

valor de horas normais;

nmero de horas normais;

nmero de horas extras;

nmero de dependentes;

convnio (1 - tem convnio, 2 - no tem convnio);


Faa um programa que leia um nmero indeterminado de cartes, usando

como FLAG o carto com matrcula igual a 0 (zero), e calcule:


salrio bruto = (vr. hora normal * n. de horas normais) +
(vr. hora norma * 1.20) * n. de horas extras +
(n. de dependentes * 500);
descontos:
IMPOSTO

DE

sal. bruto < 1000,00

isento

1000,00 <= sal. bruto < 2000,00


2000,00 <= sal. bruto < 4000,00
sal. bruto >= 4000,00

5%
8%
10%

INSS:

sal. bruto < 1000,00


1000,00 <= sal. bruto < 2000,00
sal. bruto >= 2000,00

8%
9%
10%

DESCONTO

75,00.

RENDA:

CONVNIO

125

Obs.: Se o empregado fez mais de 50 horas extra e trabalhou s 240 horas


normais, receber um prmio de 2000,00, que ser somado ao seu salrio lquido. (sal.
lquido = sal. bruto - descontos).
O programa dever imprimir para cada empregado: matrcula, nome, salrio
bruto, imposto de renda, INSS, vr. do convnio e salrio lquido.
Dever tambm imprimir os seguintes totais: total de salrio bruto, total
salrio lquido, total INSS, total imposto de renda.
12 - Fazer um programa que calcule o imposto de renda de um grupo de
contribuintes:
a) os dados de cada contribuinte, nmero do CPF, nmero de dependentes e
renda anual, esto perfurados em carto.
b) para cada contribuinte ser feito um desconto de 70,00 por dependente.
c) os valores da alquota para o clculo do imposto so:
Renda
at 10000,00
de
10000,00

Alquota
isento
5%

15000,00
de

15000,00

10%

30000,00
de

30000,00

15%

50000,00
acima de 50000,00

20%

Obs.: a ltima pessoa que no entrar nos clculos tem CPF igual a 0 (zero).
13 - Elabore um programa para ler do teclado um nmero inteiro e positivo n e um
nmero real x, calcular e escrever a soma dos n prime rios termos da serie:
0

12

15

Z = X/1! - X/2! + X/4! - X/6! + X/8! - X/10! + . . .


14 - Fazer um programa que calcule e escreva o valor de S:

126

S = 1/1 + 3/2 + 5/3 + 7/4 + . . . + 99/50


15 - Fazer um programa que calcule e escreva o valor da soma:
1

50

S = 2/50 + 2/49 + 2/48 + 2/47 + . . . + 2/1


16 - Fazer um programa que calcule e escreva o valor de S onde:
S = 37*38/1 + 36*37/2 + 35*36/3 + . . . +1*2/37
17 - Fazer um programa que calcule e escreva o valor de S onde:
S = 1/1 - 2/4 + 3/9 - 4/16 + . . . + 10/100

18 - Fazer um programa que calcule e escreva a soma dos 30 primeiros termos da


srie:
S = 1000/1 - 997/2 + 994/3 - 991/4 + . . .
19 - Fazer um algoritmo que calcule e escreva a soma dos 50 primeiros termos da
srie:
S = 480/10 - 470/11 + 460/12 - 450/13 + . . .
20 - Escreva um programa para gerar e escrever uma tabela com os valores do seno
de um ngulo em radianos, utilizando a srie de Mca-Laurin truncada, apresentada a seguir:
3

127

Sen = - /6 + /120 - /5040


Obs.: Os valores dos ngulos devem variar de 0,0 a 6,3 inclusive 0 e 6,3 de 0,1 em
0,1.
21 - Fazer um programa para calcular e escrever o valor do nmero (pi), com
preciso de 0.0001, usando a srie:
PI = 4 - 4/3 + 4/5 - 4/7 + 4/9 - . . .
Para obter a preciso desejada, adicionar apenas os termos cujo valor
absoluto seja maior ou igual a 0.0001.
22 - Fazer um programa que:
- leia o valor de x de uma unidade de entrada;
- calcule e escreva o valor do seguinte somatrio:
25

24

23

22

S = X/1 - X/2 + X/3 - X/4 + . . . + X/25


23 - Fazer um programa que calcule e escreva o valor de S no seguinte somatrio:
S = 1/225 - 2/196 + 4/169 - 8/144 + . . . + 16384/1
24 - Fazer um programa que calcule e escreva a soma dos 30 primeiros termos da
srie:
100/0! + 99/1! + 98/2! + 97/3! + . . .
25 - Fazer um programa que:
- calcule e escreva o valor da srie abaixo com preciso menor que um
dcimo de milsimo (0.0001);
128

- indique quantos termos forma usados.


S = 63+61/1! + 59/2! + 57/3! + . . .

26 - Fazer um programa que calcule e escreva a soma dos 50 primeiros termos da


srie:
S = 1!/1 - 2!/3 + 3!/7 - 4!/15 + 5!/31 - . . .
27 - Fazer um programa para determinar e escrever soma dos n primeiros termos da
srie:
2

S = X - X/3! + X/5! - X/7! + . . .


onde: x e n so lidos.
28 - Fazer um programa que:
- calcule o valor do co-seno de X atravs de 20 termos da srie abaixo:
2

Cassino X = 1 - X/2! + X/4! - X/6! + X/8! - . . .


- calcule a diferena entre o valor calculado no item anterior e o valor
fornecido pela funo Cos(X);
- escreva o que foi calculado nos itens anteriores.
29 - Fazer um programa que:
- leia um conjunto de linhas contendo cada uma um nmero inteiro, na base
10 de at cinco dgitos. A ltima linha contm o valor zero.
- transforme esse nmero da base 10 para a base 2;
- escreva o nmero na base 10 e na base 2.

129

Varivel Composta
1 - Fazer um programa que:
- Leia 100 valores numricos e armazene numa varivel composta
unidimensional A;
- Calcule e escreva:
100

S = i/a[i], onde i o i-simo valor armazenado na varivel A;


i=1

- Calcule e escreva quantos termos da srie tem o valor do numerador


inferior ao denominador.
Exemplo:
A
2
5

5
6

7
7

.
..

8
8
3

100

somatrio = 1/25 + 2/56 + 3/77 + . . . + 100/88


2 - Fazer um programa que:
- Leia duas variveis compostas unidimensional, contendo, cada uma 200
elementos numricos;
- Intercale os elementos destes dois conjuntos formando uma nova varivel
composta unidimensional de 400 elementos;
- Escreva o novo conjunto, assim obtido.
3 - Em uma cidade do interior, sabe-se que de janeiro a abril de 1.976 (121 dias)
no ocorreu temperatura inferior a 15 graus centgrados nem superior a 40 graus
centgrados. As temperaturas verificadas em cada dia esto disponveis em uma unidade de
entrada de dados.

130

- Fazer um programa que calcule e imprima:

a menor temperatura ocorrida;

a maior temperatura ocorrida;

a temperatura mdia;

o numero de dias nos quais a temperatura foi inferior a temperatura

mdia.
4 - Fazer um programa que:
a) leia uma frase de 80 caracteres, incluindo brancos;
b) conte quantos brancos existem na frase;
c) conte quantas vezes letra aparece;
d) conte quantas vezes ocorre um mesmo par de letras na frase e quais so
elas
e) imprima o que foi calculado nos itens b, c e d.
5 - Fazer um programa que:
a) leia o valor de N (N < = 1000) e os n valores de uma varivel A composta
de valores numricos, ordenados de forma crescente;
b) determine e imprima para cada nmero que se repete no conjunto
quantidade de vezes que ele aparece repetido;
c) elimine os elementos repetidos formando um novo conjunto;
d) imprima o conjunto obtido no item C.
6 - Dado um conjunto de 100 valores numricos disponveis num meio de
entrada qualquer, fazer um a programa para armazen-los numa varivel composta B,
calcular e imprimir o valor do somatrio dado a seguir:
Exemplo:
B
2
10

1
60
1

.
..

3
3

9
7
3

131

100

S = (210-97) + (160-33) + . . .
7 - Fazer um programa que:
- leia o valor de M (M < = 30) e os M valores de uma varivel composta A;
- leia o valor de N (N < = 20) e os N valores de uma varivel composta B;
- determine o conjunto C=A B (unio de A com B), onde C no dever
conter elementos repetidos (A e B no contm elementos repetidos);
- escreva os elementos contidos em A, B e C.

7 - Seja
P = anxn + an-1xn-1 + an-2xn-2 + . . . + a1x + a0
Escrever um programa que:
- leia o valor de n, sendo n < = 20;
- leia os coeficientes ai, i = 0,1,2, . . ., n;
- calcule o valor de p para 10 valores de x, lidos em cartes;
- escreva o valor de x e o valor de p correspondente.
8 - Fazer um programa que:
a) leia um conjunto de valores inteiros correspondentes a 80 notas dos alunos
de uma turma, notas estas que variam de 0 a 10;
b) calcule a freqncia absoluta e a freqncia relativa de cada nota;
c) imprima uma tabela contendo os valores das notas (de 0 a 10) e suas
respectivas freqncias absoluta e relativa;
Obs.: 1 - freqncia absoluta de uma nota e o nmero de vezes que ela aparece no
conjunto de dados;
2 - freqncia relativa a freqncia absoluta dividida pelo numero total de
dados.

132

9 - Uma grande firma deseja saber quais os trs empregados mais recentes. Fazer
um programa para ler um nmero indeterminado de cartes no mximo de 300, contendo o
numero do empregado e o nmero de meses de trabalho deste empregado e escrever os trs
mais recentes.
10 - Fazer um programa que:
- leia uma varivel composta A com 30 valores numricos;
- leia outra varivel composta B com 30 valores numricos;
- leia o valor de X;
- verifique qual elemento de A que igual a X;
- escreva o elemento de B de posio correspondente a do elemento de A
igual a X;
11 -Dados as variveis compostas A e B abaixo:
A
2 5 7
5 1 6

9
9
B

0 2 3
2 6 8

7
9

Calcular o conjunto C=A+B


12 - Fazer um prog. em c++ que leia duas variveis compostas de dimenso
m*n(m<=20,n<=30). Onde os valores de m e n so lidos. Calcule e escreva:
- a soma dos elementos das matrizes.
13 - Fazer um prog. em c++ que leia uma matriz numrica Am*n(m<=20,n<=10).
Onde m e n so lidos. Calcule e escreva:

133

- a matriz transposta de A.
14 - Fazer um prog. que leia uma matriz numrica Am*n(m<=20,n<=10). Onde m e
n so lidos. Calcule e escreva uma matriz modificada B(m*n+1), sendo que os elementos de
(n+1)-s ima coluna so formados com o produto dos elementos da mesma linha.
Exemplo:
A
2
4

3
5
B

2 3
4 5

6
2
0
15 - Fazer um prog. em c++ que leia uma matriz inteira Am*m(m<=30). onde m

lido. Calcule e escreva:


- o maior elemento par da diagonal secundria;
- a mdia dos elementos divisveis por 3 da penltima coluna da matriz;
- o produto dos elementos mpares abaixo da diagonal principal da matriz.
Registros:
1 - Declarar o registro cuja representao grfica dada a seguir.
reg
nom
e
salr
io
idad
e

s
exo

134

2- Uma indstria faz a folha mensal de pagamentos de seus empregados


baseada no seguinte:
Existe uma tabela com os dados de 10 funcionrios.
cadastro

ficha
insc
rio

n
ome

hora
normais

h.
extras

Fazer um prog. que processe a tabela e emita para cada funcionrio, seu
contracheque, cujo formato dado a seguir:
nmero de inscrio:

nome:

salrio horas normais:


salarrio horas extras:
deduo INSS:
salrio lquido:
O salrio de referncia dever ser lido previamente.
O salrio referente as horas extras calculado acrescentando 30% ao salrio
hora

normal. O desconto do INSS de 8% do salrio bruto(salrio bruto

correspondente as horas normais + salrio horas extras).


Para o clculo do salrio, considerar que existem duas classes de funcionrios, a
classe 1, cujo salrio 1.3 vez o salrio de referncia e a classe 2, cujo salrio 1.9 vez
o salrio de referncia.
Arquivos:

135

1 - Fazer um programa que l do teclado um valor inteiro n. Em seguida l,


tambm do teclado e grava, num arquivo binrio, de nome interno binrio e de nome
externo dados.bin, o nome e a idade em de n pessoas.
2 - Fazer um programa que mostra no vdeo todos os valores de nome e idade
que foram gravados, pelo exemplo anterior, no arquivo binrio de nome interno
binrio e de nome externo dados.bin.
3- Supondo-se a existncia de um arquivo binrio A, cujos registros tm campos
nome, com 15 caracteres e idade, inteiro, que pode ter sido criado pelo programa 1
proposto, o programa proposto criar outro arquivo binrio B, copiando A, registro
por registro.
4 - O programa abaixo recebe os dados de uma agenda, digitados no teclado e
cria um arquivo binrio, cujos registros possuem os seguintes campos:
nome,telefone,logradouro, nmero,cidade e estado.
5- Fazer um programa que l o valor do salrio mnimo de um arquivo que s
tem um valor real e depois l um arquivo com o cadastro geral de uma empresa,
copiando num novo arquivo os registros dos funcionrios que recebem mais que 30
salrios mnimos. Os campos dos registros do cadastro so:
nome do funcionrio, cargo e salrio.
6 - Uma instituio de pesquisa recolheu amostras em trs regies a respeito do
nvel de vida de suas populaes. Cada amostra constitui um registro com os seguintes
campos: sexo, idade, salrio, estado civil, nmero de dependentes, valor do
patrimnio, quantidade de calorias absorvidas por dia e grau de instruo.
Em cada regio, os dados foram armazenados em um arquivo binrio, com os
registros colocados em ordem crescente de idade. O programa abaixo intercala estes
arquivos, criando um quarto arquivo tambm em ordem crescente de idade.

136

7 - Deseja-se fazer um prog. que grave, por acesso direto, um arquivo


relacionado com uma turma de at n alunos. Cada registro deste arquivo
corresponder a um aluno e ser formado por:
- um campo com o seu nmero de chamada;
- um campo, contendo 30 caracteres, com outras informaes.
8 - No arquivo gravado no programa proposto anterior, pode-se ter acesso
direto s informaes de um aluno qualquer com o programa seguinte. Repetidamente
este programa:
- l no teclado o numero de um aluno;
- ignora-o, escrevendo uma mensagem, se o nmero for maior que o nmero de
registros do arquivo ou se o aluno no teve informaes gravadas pelo programa
anterior;
- seno, acessa as informaes do aluno diretamente no arquivo e mostra-as no
vdeo, se nmero for positivo;
- interrompe a repetio se nmero for menor ou igual a zero.
9 - Cada registro de um arquivo binrio contm a parte numrica da placa, o
tipo e o nome do proprietrio de um veculo. A partir deste arquivo, criar um outro
arquivo em que estas informaes possam ser acessadas diretamente pela parte
numrica da placa, que pode valor de 1 a 9999.
10 - O programa seguinte pressupe a existncia de um arquivo contendo, em
cada registro, o nome, o nmero da conta e o saldo de um cliente de um banco; o
nmero da conta coincide com o nmero de ordem de um registro ou nulo se a conta
no existir. O programa permite que se digite o nmero da conta e se obtenha o nome
e o saldo correspondente.

137

Você também pode gostar