Вы находитесь на странице: 1из 159

Conceitos bsicos

A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Introduo Programao em C
Afrnio Melo Junior
afranio@peq.coppe.ufrj.br
Laboratrio de Modelagem, Simulao e Controle de Processos
Programa de Engenharia Qumica, COPPE
Universidade Federal do Rio de Janeiro

06/2015

1 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++
1

Conceitos bsicos
Programao
Linguagens de programao
Erros de programao
A linguagem C
Hello World!
Bibliotecas
Variveis
Constantes
Operadores
Input/Output bsico
Estruturas de Controle
Programao modular
Funes
Escopo
Recursividade
Gerenciamento de memria
Ponteiros
Passagem de argumentos por valor ou referncia
Arrays
Memria dinmica
Tipos de dados definidos pelo usurio
structs
unions

2 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Programao
Linguagens de programao
Erros de programao

O que programao?

Definies
Computadores so mquinas projetadas para
realizar operaes aritmticas e lgicas
seguindo uma srie de instrues pr-definidas.
Um conjunto de instrues destinadas a serem
seguidas por um computador conhecido
como programa.
Portanto, a programao pode ser definida
como a arte de se escrever cdigos que contm
instrues para determinadas tarefas a serem
realizadas por um computador.
Figura 1: Computador.

3 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Programao
Linguagens de programao
Erros de programao

Programando

Comunicao com o computador


Computadores s entendem linguagem binria. Ou seja, todas as instrues que
desejarmos passar a um computador devem estar expressas em termos de 0 ou 1.
Exemplo de uma instruo entendida por um computador: 000101010101.
O problema que seres humanos (normais) no entendem binrio! Como efetuar
a comunicao entre o homem e o computador?
Com o objetivo de resolver este problema, foram criadas as linguagens de
programao.

4 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Programao
Linguagens de programao
Erros de programao

Programando

Nvel de abstrao
As primeiras linguagens de programao que surgiram foram as de baixo nvel de
abstrao. Estas apresentam sintaxes relacionadas diretamente s instrues que
devem ser seguidas por um processador (apresentando pouco comprometimento
em relao legibilidade por humanos). Um exemplo a Assembly.
Mais tarde, foram aparecendo linguagens de alto nvel, que tm mais relao com
os objetivos gerais do programador do que com as tarefas especficas do
processador (sendo muito mais prticas, porm menos eficientes). Exemplos so
Fortran, C, Python ou Matlab.

5 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Programao
Linguagens de programao
Erros de programao

Rodando o programa
Linguagens compiladas X Linguagens interpretadas
Imagine que voc escreveu um programa em
alguma linguagem de alto nvel. Como fazer
para rod-lo?
Em primeiro lugar, preciso traduzir o cdigo
da linguagem de programao (que voc
entende) para a linguagem binria (que a
mquina entende). Isto pode ser feito de duas
maneiras:
Compilao: neste caso, traduz-se todo o
programa de uma s vez para o cdigo binrio,
gerando um arquivo chamado executvel. Este
executvel ento pode ser rodado. Exemplos de
linguagens compiladas: C/C++, Fortran.
Interpretao: aqui, o programa traduzido e
executado linha por linha. O desempenho
menor em relao aos programas compilados.
Exemplos de linguagens interpretadas: Python,
Matlab, Octave.

Figura 2: Ilustrao da necessidade da


compilao ou interpretao.

6 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Programao
Linguagens de programao
Erros de programao

Erros de programao
Os famosos bugs!
preciso ter em mente que existem trs tipos
de erros de programao:
Erro de sintaxe: este erro ocorre quando
escrevemos algo que no est definido na
linguagem, ou seja, que o interpretador no
entende. A execuo do programa
interrompida e uma mensagem de erro emitida.
Erro de lgica: este erro aparece quando o
programa funciona, mas no do jeito planejado,
fornecendo resultados esprios (talvez por
alguma frmula errada, etc) . o mais difcil de
ser encontrado.
Erro de estilo: o menos grave de todos, no
sentido de que no prejudica a execuo do
programa. Muitos nem consideram este como
um tipo de erro. Ocorre quando o programador
desenvolve o seu cdigo de maneira bagunada
e ilegvel, o que dificulta sua manuteno,
desenvolvimento e extenso.

Figura 3: Fuja destes insetos!.

7 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Hello World!
Bibliotecas
Variveis
Constantes
Operadores
Input/Output bsico
Estruturas de Controle

A linguagem C

A Linguagem
O C uma linguagem compilada, de mdio a
alto nvel e de uso geral, inicialmente
desenvolvida por Dennis Ritchie no AT&T Bell
Labs no comeo da dcada de 70.
uma das linguagens mais influentes e bem
sucedidas da histria da computao, tendo
servido como base para o desenvolvimento de
outras linguagens importantes, como C++ e
C#.
Figura 4: Dennis Ritchie.

8 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Hello World!
Bibliotecas
Variveis
Constantes
Operadores
Input/Output bsico
Estruturas de Controle

Hello World!

O programa Hello World!


# include < stdio .h >
int main ()
{
printf ( " Hello World !\ n " ) ;
return 0;
}

Nosso primeiro programa em C


Vamos comear analisando linha
por linha o exemplo clssico do
programa Hello World!
Compile o cdigo ao lado e o rode.
Qual o efeito que ele produz?

9 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Hello World!
Bibliotecas
Variveis
Constantes
Operadores
Input/Output bsico
Estruturas de Controle

Hello World!

#include <stdio.h>
O programa Hello World!
# include < stdio .h >
int main ()
{
printf ( " Hello World !\ n " ) ;
return 0;
}

Linhas iniciadas com # so


diretrizes para o pr-processador.
Neste estgio preliminar, voc pode
entender as diretrizes como tarefas
preliminares que o compilador
precisa cumprir antes da compilao
em si.
Neste caso, a diretriz #include
inclui no nosso programa a
biblioteca stdio.h, que contm as
definies bsicas para realizar
entrada e sada de dados em C.

10 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Hello World!
Bibliotecas
Variveis
Constantes
Operadores
Input/Output bsico
Estruturas de Controle

Hello World!

int main ()

O programa Hello World!


# include < stdio .h >
int main ()
{
printf ( " Hello World !\ n " ) ;
return 0;
}

Esta linha o incio da funo


main. Todo cdigo em C deve ter
uma funo main; ela marca o
ponto em que o programa comea
sua execuo.
Uma funo em C pode aceitar
uma certa quantidade de
parmetros e retornar um valor.
Neste caso, a funo main retorna
um valor (do tipo inteiro, int) e no
aceita nenhum parmetro (devido
ao parnteses vazio).
Dentro das chaves est o bloco que
corresponde ao corpo da funo.

11 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Hello World!
Bibliotecas
Variveis
Constantes
Operadores
Input/Output bsico
Estruturas de Controle

Hello World!

O programa Hello World!


# include < stdio .h >
int main ()
{
printf ( " Hello World !\ n " ) ;
return 0;
}

O corpo da funo main


No corpo da main h dois
comandos (ordens que passamos ao
computador). Um comando uma
expresso, simples ou composta,
que pode produzir algum efeito.
Todos os comandos em C
necessariamente terminam em
ponto-e-vrgula!

12 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Hello World!
Bibliotecas
Variveis
Constantes
Operadores
Input/Output bsico
Estruturas de Controle

Hello World!

printf(Hello World!);
O programa Hello World!
# include < stdio .h >
int main ()
{
printf ( " Hello World !\ n " ) ;
return 0;
}

O comando printf que est


definido na biblioteca stdio.h,
includa no incio do nosso
programa serve para imprimir
dados em tela.
No nosso caso, o comando imprime
na tela o conjunto de caracteres
Hello World!, e pula uma linha
(devido ao caractere de escape \n).

13 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Hello World!
Bibliotecas
Variveis
Constantes
Operadores
Input/Output bsico
Estruturas de Controle

Hello World!

O programa Hello World!


# include < stdio .h >
int main ()
{
printf ( " Hello World !\ n " ) ;
return 0;
}

return 0;
O comando return indica o fim da
funo (no caso da main, o fim do
programa) e nele especificado o
valor que esta deve retornar.
O valor 0, retornado pela funo
main, avisa ao sistema operacional
que o programa terminou
normalmente.

14 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Hello World!
Bibliotecas
Variveis
Constantes
Operadores
Input/Output bsico
Estruturas de Controle

Bibliotecas

Ferramentas alem da linguagem em si


Uma biblioteca em C um conjunto de funes e declaraes definidas para
serem utilizadas por outros programas.
A biblioteca padro contem as ferramentas mais usadas pelo programador no dia
a dia.
Para us-las, precisamos incluir por meio de uma diretriz do tipo include seus
cabealhos (headers) explicitamente no comeo do programa. Ex:
#include<stdio.h> ou #include<math.h>
Muitas vezes precisamos, alm da incluso no corpo do cdigo, informar ao
compilador as bibliotecas utilizadas no programa.
Uma lista com todos os cabealhos da biblioteca padro de C pode ser
encontrada em http://www.cplusplus.com/reference/

15 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Hello World!
Bibliotecas
Variveis
Constantes
Operadores
Input/Output bsico
Estruturas de Controle

O que so variveis?

Variveis
Variveis so pores da memria que armazenam algum valor.
Toda varivel em C precisa ter um identificador (nome que a distingue das outras
variveis) e um tipo (que indica sua natureza).
Tipos de dados
Exemplos de alguns tipos: int (nmero inteiro), float (nmero decimal), double
(decimal com preciso dupla), char (caractere simples), etc.
Cada tipo de dado ocupa um determinado espao na memria. Por exemplo, uma
varivel int ocupa 4 bytes, geralmente.
A linguagem C tambm permite a criao de tipos definidos pelo usurio.

16 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Hello World!
Bibliotecas
Variveis
Constantes
Operadores
Input/Output bsico
Estruturas de Controle

Tipos de dados bsicos

Figura 5: Tipos de dados bsicos em C.

17 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Hello World!
Bibliotecas
Variveis
Constantes
Operadores
Input/Output bsico
Estruturas de Controle

Declarao X Definio
Declarao de variveis
Antes da utilizao de uma varivel pelo programa, precisamos dizer ao
compilador que ela existe. Isto feito atravs da declarao desta varivel.
A sintaxe para se declarar uma varivel em C : tipo_da_variavel identificador;
Exemplos: int a; float nome; double minha_variavel;
Definio de variveis
Quando declaramos uma varivel, como se estivssemos apenas dizendo ao
compilador: h uma varivel com este tipo, e que tem este nome. Mas ela no
armazena nenhum valor til (apenas lixo de memria).
Para atribuir um valor uma varivel, podemos defini-la.
A definio feita atravs do operador de atribuio (=).
Ex: a = 3; nome = 5.7; minha_variavel = 10.89;
Podemos definir uma varivel ao mesmo tempo em que a declaramos: int a = 4;
Erro comum: tentar definir uma varivel sem t-la declarado.
18 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Hello World!
Bibliotecas
Variveis
Constantes
Operadores
Input/Output bsico
Estruturas de Controle

Exemplo (certo)
# include < stdio .h >
// este eh um c o m e n t a r i o . c o m e n t a r i o s sao i g n o r a d o s pelo c o m p i l a d o r
int main ()
{
// d e c l a r a n d o v a r i a v e i s
int a ;
double b ;
int c ;
double d , e ;
// d e f i n i n d o v a r i a v e i s ao mesmo tempo em que d e c l a r a m o s
double f = 1.5; float g = 0.5;
// d e f i n i n d o as v a r i a v e i s d e c l a r a d a s no inicio do codigo
c = 4;
d = e = 2.5;
// o perando com as v a r i a v e i s
a = 3*( c +2) ;
// " a " foi antes declarada , mas nao definida !
b = f *( g *( d + e ) ) ;
// " b " foi antes declarada , mas nao definida !
c = c+a;
// r e d e f i n i n d o " c "
// m o s t r a n d o r e s u l t a d o s na tela
printf ( " \ nOs resultados sao : %d , %f , % d \ n \ n " , a , b , c ) ;
}
19 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Hello World!
Bibliotecas
Variveis
Constantes
Operadores
Input/Output bsico
Estruturas de Controle

Exemplo (errado)

# include < stdio .h >


/* este eh um bloco de c o m e n t a r i o s
q u a i s q u e r linhas que sejam escritas aqui
serao c o n s i d e r a d a s c o m e n t a r i o s */
int main ()
{
// d e c l a r a n d o v a r i a v e i s
float a , b ;
// c a l c u l a n d o
a = 2;
float c = a / b ;
// m o s t r a n d o r e s u l t a d o na tela
printf ( " \ nO resultado eh : % f \ n \ n " , c ) ;
}

20 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Hello World!
Bibliotecas
Variveis
Constantes
Operadores
Input/Output bsico
Estruturas de Controle

Converso de tipos

Type casting
A converso de tipos, mais conhecida pelo nome em ingls type casting, permite
que convertamos dados de um tipo para outro. Ela pode ser explcita ou implcita.
A converso explcita feita com a sintaxe:
(type_name) expression;
Note que o parnteses no comando acima no opcional.
A converso implcita realizada automaticamente pelo compilador quando
algumas operaes com tipos de dados diferentes so realizadas.

21 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Hello World!
Bibliotecas
Variveis
Constantes
Operadores
Input/Output bsico
Estruturas de Controle

Converso de tipos

Converses implcitas
Cuidado com as converses implcitas! Muitas vezes, seu resultado pode no ser
o esperado ou o mais intuitivo.
Regras gerais:
float para int causa truncamento (remoo da parte decimal);
double para float causa arredondamento (remoo de alguns dgitos);
long to int causa remoo de bits em excesso.

Cuidado tambm com a diviso de inteiros!

22 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Hello World!
Bibliotecas
Variveis
Constantes
Operadores
Input/Output bsico
Estruturas de Controle

Hirarquia das converses implcitas

Figura 6: Quando, em uma operao, os operandos tm diferentes tipos, todos so convertidos


para o tipo que aparece mais acima nessa hierarquia.
23 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Hello World!
Bibliotecas
Variveis
Constantes
Operadores
Input/Output bsico
Estruturas de Controle

Exemplo converso explcita

# include < stdio .h >


int main ()
{
int a , b ;
printf ( " Entre com uma fracao ( numerador e denominador ) : " ) ;
scanf ( " % d % d " , &a , & b ) ;
printf ( " A fracao em decimal eh

% f \ n " , ( float ) a / b ) ;

24 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Hello World!
Bibliotecas
Variveis
Constantes
Operadores
Input/Output bsico
Estruturas de Controle

Exemplo converso implcita

# include < stdio .h >


int main ()
{
int i = 17;
char c = c ; /* ascii value is 99 */
float sum ;
sum = i + c ;
printf ( " Value of sum : % f \ n " , sum ) ;
}

25 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Hello World!
Bibliotecas
Variveis
Constantes
Operadores
Input/Output bsico
Estruturas de Controle

Exemplo diviso de inteiros

# include < stdio .h >


int main ()
{
int a , b , c ;
float d , e ;
a = 1; b = 2;
c = a/b;
d = a/b;
e = ( float ) a / b ;
printf ( " c = % d \ n " ,c ) ;
printf ( " d = % f \ n " ,d ) ;
printf ( " e = % f \ n " ,e ) ;
}

26 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Hello World!
Bibliotecas
Variveis
Constantes
Operadores
Input/Output bsico
Estruturas de Controle

Constantes

No se pode mudar o valor


As constantes so expressoes que tm valor fixo.
Ja fomos apresentados a algumas constantes h pouco: em um comando de
atribuio do tipo a = 2, o valor 2 do lado direito da equao uma constante.
Constantes podem tambm no serem numricas. Ex: z, oi, tudo bom?. O
primeiro exemplo um caractere constante (denotado com aspas simples), e o
segundo um conjunto de caracteres (ou string) constante (denotado com aspas
duplas).
Constantes tambm podem ser do tipo bool (booleano), podendo assumir o valor
de true ou false. Ateno: o tipo bool eh exclusivo do C++. Na definio
original da linguagem C, usa-se o inteiro 0 para valores falsos e 1 para verdadeiros.
Constantes podem ser declaradas de maneira idntica s variveis, sendo a
declarao precedida da palavra-chave const. Ex: const int a = 200; const char
= a;

27 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Hello World!
Bibliotecas
Variveis
Constantes
Operadores
Input/Output bsico
Estruturas de Controle

Operadores

Operando com as variveis e constantes


Um operador um smbolo que faz com que o programa execute manipulaes
matemticas ou lgicas especficas.
Os operadores mais comuns da linguagem C podem ser classificados em:
aritmticos;
relacionais;
lgicos;
de atribuio.

Cuidado com a precedncia dos operadores! Na dvida, sempre use parnteses.

28 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Hello World!
Bibliotecas
Variveis
Constantes
Operadores
Input/Output bsico
Estruturas de Controle

Operadores aritmticos

Figura 7: Fonte: http://www.tutorialspoint.com/cprogramming


29 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Hello World!
Bibliotecas
Variveis
Constantes
Operadores
Input/Output bsico
Estruturas de Controle

Operadores relacionais

Figura 8: Fonte: http://www.tutorialspoint.com/cprogramming


30 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Hello World!
Bibliotecas
Variveis
Constantes
Operadores
Input/Output bsico
Estruturas de Controle

Operadores lgicos

Figura 9: Fonte: http://www.tutorialspoint.com/cprogramming

31 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Hello World!
Bibliotecas
Variveis
Constantes
Operadores
Input/Output bsico
Estruturas de Controle

Operadores de atribuio

Figura 10: Fonte: http://www.tutorialspoint.com/cprogramming


32 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Hello World!
Bibliotecas
Variveis
Constantes
Operadores
Input/Output bsico
Estruturas de Controle

Entrada e sada de dados

Comandos
Os comandos mais simples para entrada e sada de dados em C, respectivamente,
so scanf e printf (este ltimo, j apresentado).
Em ambos os comandos, dois recursos so muito utilizados: os especificadores de
formato e os caracteres de escape.
Como ilustrao, podemos analisar a seguinte linha de um dos exemplos dados
anteriormente:
printf("\nOs resultados so: %d, %f, %d \n \n", a, b, c);
No caso, %d e %f so os especificadores de formato para variveis inteiras e de
ponto flutuante, respectivamente, e \n o caractere de escape, que serve para
pular uma linha.
O scanf utilizado de maneira anloga ao printf.

33 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Hello World!
Bibliotecas
Variveis
Constantes
Operadores
Input/Output bsico
Estruturas de Controle

Especificadores de formato

Figura 11: Especificadores de formato em C.


34 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Hello World!
Bibliotecas
Variveis
Constantes
Operadores
Input/Output bsico
Estruturas de Controle

Caracteres de escape

Figura 12: Caracteres de escape em C.

35 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Hello World!
Bibliotecas
Variveis
Constantes
Operadores
Input/Output bsico
Estruturas de Controle

Exemplo - Input/output

# include < stdio .h >


int main ()
{
int myvariable ;
printf ( " Enter a number : " ) ;
scanf ( " % d " ,& myvariable ) ;
printf ( " % d " , myvariable ) ;
return 0;
}

36 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Hello World!
Bibliotecas
Variveis
Constantes
Operadores
Input/Output bsico
Estruturas de Controle

Estruturas de controle

Importncia
O corao da arte de se programar encontra-se
nas estruturas de controle.
Digitar uma linha para cada operao feita ou
deciso tomada pelo computador seria
cansativo, concorda?
Atravs das estruturas de controle, podemos
com poucas linhas de cdigo ordenar ao
computador o que ele realmente foi designado
para fazer, ou seja, tarefas repetitivas e
automticas.
Dividem-se em dois tipos.
Estruturas condicionais;
Estruturas iterativas.

Figura 13: Exemplo de um algoritmo que


utiliza estruturas condicionais e
iterativas.

37 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Hello World!
Bibliotecas
Variveis
Constantes
Operadores
Input/Output bsico
Estruturas de Controle

Estruturas Condicionais

Expresses lgicas
As estruturas condicionais avaliam expresses lgicas para decidir se executam ou
no algum comando ou conjunto de comandos.
Expresses lgicas, construidas com operadores condicionais e logicos, s podem
resultar em dois valores: verdadeiro ou falso.
A ideia simples: se o resultado da expresso for verdadeiro, o(s) comando(s)
so executado(s). Se for falso, no so executado(s).
As expresses lgicas so construdas de acordo com a lgebra booleana.

38 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Hello World!
Bibliotecas
Variveis
Constantes
Operadores
Input/Output bsico
Estruturas de Controle

Estruturas Condicionais
o bloco if
Executa um ou mais comandos sob determinada condio, representada por uma
expresso lgica. A sintaxe :
if (condicao)
{
lista de comandos;
}
else if (outra condicao)
{
outra lista de comandos;
}
else
{
ultima lista de comandos;
}
Exemplo
Escreva um programa que pea ao usurio um valor de temperatura, em C, e
indique em qual estado fsico, ao nvel do mar, se encontra a gua.

39 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Hello World!
Bibliotecas
Variveis
Constantes
Operadores
Input/Output bsico
Estruturas de Controle

Exemplo - if

# include < stdio .h >


int main ()
{
double T ;
printf ( " Insira a temperatura , em graus Celsius \ n " ) ;
scanf ( " % lf " , & T ) ;
if (T < -273.15)
{
printf ( " Temperatura abaixo do zero absoluto ! \ n " ) ;
}
else if (T > -273.15 & T <0)
{
printf ( " Agua no estado solido \ n " ) ;
}
else if ( T ==0)
{
printf ( " Agua no equilibrio S - L \ n " ) ;
}

40 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Hello World!
Bibliotecas
Variveis
Constantes
Operadores
Input/Output bsico
Estruturas de Controle

Exemplo - if (cont.)

else if (T >0 & T <100)


{
printf ( " Agua no estado liquido \ n " ) ;
}
else if ( T ==100)
{
printf ( " Agua no equilibrio L - V \ n " ) ;
}
else
{
printf ( " Agua no estado vapor \ n " ) ;
}
}

41 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Hello World!
Bibliotecas
Variveis
Constantes
Operadores
Input/Output bsico
Estruturas de Controle

Estruturas Iterativas

o bloco while
Executa, enquanto uma dada condio permanece satisfeita, um ou mais
comandos. A sintaxe :
while (condicao)
{
lista de comandos;
}
Exemplo
Mostre a lista dos nmeros naturais em tela, desde o 5000, em ordem decrescente.

42 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Hello World!
Bibliotecas
Variveis
Constantes
Operadores
Input/Output bsico
Estruturas de Controle

Exemplo - while

# include < stdio .h >


int main ()
{
int i = 1000;
while (i >0)
{
printf ( " % d " ,i ) ;
i = i -1;
}
printf ( " acabou ! " ) ;
}

43 / 159

Hello World!
Bibliotecas
Variveis
Constantes
Operadores
Input/Output bsico
Estruturas de Controle

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Estruturas Iterativas
o bloco for
Executa, enquanto uma dada condio permanece satisfeita, um ou mais
comandos enquanto um contador percorre valores em passos definidos. A sintaxe
:
for (inicializacao; condicao; passo)
{
lista de comandos;
}
Exemplo
Calcule a soma:

6
X

3i+1

i=1

44 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Hello World!
Bibliotecas
Variveis
Constantes
Operadores
Input/Output bsico
Estruturas de Controle

Exemplo - for

# include < stdio .h >


# include < math .h >
int main ()
{
int i ;
int soma = 0;

// contador
// valor da soma

for ( i =1; i <=6; i ++)


// novo operador (++) : i ++ s i g n i f i c a i = i +1
{
soma = soma + pow (3 ,( i +1) ) ;
}
printf ( " \ nO resultado eh : % d \ n \ n " , soma ) ;
}

45 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Funes
Escopo
Recursividade

Funes
O que uma funo?
Uma funo um grupo de comandos que executado quando chamado de
algum ponto do programa. A sintaxe :
tipo_retornado nome_da_funcao (parametro1, parametro2,...)
{
lista de comandos;
}
Funes so extremamente teis no sentido em que podemos organizar nosso
programa de uma maneira modular, aproveitando-nos assim de todo o potencial
que o paradigma de programao estruturada do C pode nos oferecer.
Chamando as funes
Para chamar as funes no cdigo, devemos usar seu nome, seguido de
parnteses contendo os argumentos que sero passados. Ex: soma (3,5);
Se a funo no tiver argumentos, o parnteses deve ser mantido, mesmo que
vazio! Ex: soma();
46 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Funes
Escopo
Recursividade

Funes

Exemplos
1) Escreva um programa que contenha uma funo que compute a soma de dois
nmeros inteiros. Demonstre o uso da funo.
2) Escreva um programa que resolva a equao x cos(x) = 0 pelo mtodo da
bisseo.

47 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Funes
Escopo
Recursividade

Exemplo 1 - funes

# include < stdio .h >


int adicao ( int a , int b )
{
int r ;
r = a+b;
return r ;
}
int main ()
{
int z = adicao (2 ,3) ;
printf ( " \ nO resultado eh : % d \ n \ n " , z ) ;
}

48 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Funes
Escopo
Recursividade

Exemplo 2 - funes

# include < stdio .h >


# include < stdlib .h >
# include < math .h >
// p r o t o t i p o das funcoes :
// as funcoes f e bissecao sao d e c l a r a d a s como p r o t o t i p o s ; suas d e f i n i c o e s
// so virao no final do codigo
double f ( double x ) ;
// equacao a ser r e s o l v i d a
double bissecao ( double a , double b , double tol , int it_max ) ; // metodo
int main ()
{
double z = bissecao (0 , 10 , 1e -4 , 50) ;
printf ( " \ nO resultado eh : % e \ n \ n " , z ) ;
}
double f ( double x )
{
double y = x - cos ( x ) ;
return y ;
}

49 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Funes
Escopo
Recursividade

Exemplo 2 - funes (cont.)

double bissecao ( double a , double b , double tol , int it_max )


{
double c ;
// usado na iteracao
int it ;
// contador
printf ( " \ nResolvendo equacao transcedental pelo metodo da Bissecao :\ n \ n " ) ;
if ( f ( a ) * f ( b ) >0)
{
printf ( " \ nAtencao ! A raiz nao encontra - se no intervalo dado .\ n \ n
**** ERRO FATAL **** INTERROMPENDO **** " ) ;
exit ( -1) ;
}
else
{
printf ( " it \ t a \ t b \ t c \ t f ( c ) \ t \ n " ) ;

50 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Funes
Escopo
Recursividade

Exemplo 2 - funes (cont.)


for ( it =1; it <= it_max ; it ++)
{
c =0.5*( a + b ) ;
if ( f ( a ) * f ( c ) <0)
b=c;
else
a=c;
printf ( " % d \ t % e \ t % e \ t % e \ t % e \ n \ n " , it , a , b ,c , f ( c ) ) ;
if ( fabs ( f ( c ) ) <= tol )
{
return c ;
break ;
}
if ( it >= it_max )
{
printf ( " \ n METODO DIVERGIU \ n \ n *****
ERRO FATAL ***** INTERROMPENDO ***** " ) ;
exit ( -1) ;
}
}
}
}
51 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Funes
Escopo
Recursividade

Escopo

De onde as variveis podem ser vistas?


Variveis definidas dentro do corpo de uma funo ou bloco s so vlidas, e
portanto, s podem ser utilizadas, dentro da funo ou bloco.
A poro do cdigo de onde a varivel pode ser enxergada chamada de escopo
da varivel.
Variveis definidas dentro de uma funo ou bloco, portanto, tm como escopo a
prpria funo ou bloco.

52 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Funes
Escopo
Recursividade

Escopo

Figura 14: Variveis locais e globais em C.


53 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Funes
Escopo
Recursividade

Exemplo de funo recursiva

// f a c t o r i a l c a l c u l a t o r
# include < stdio .h >
long factorial ( long a )
{
if ( a > 1)
return ( a * factorial (a -1) ) ;
else
return 1;
}
int main ()
{
long number = 4;
printf ( " \ n % d ! = % d \ n \ n " , number , factorial ( number ) ) ;
return 0;
}

54 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Ponteiros
Passagem de argumentos por valor ou referncia
Arrays
Memria dinmica

Ponteiros

Um ponteiro aponta!
Um ponteiro uma varivel que guarda o endereo de outra varivel.
Ponteiros so declarados da mesma maneira que as variveis comuns, porm com
um asterisco (*) precedendo seu nome. Ex: int * ptr;
No caso, ptr um ponteiro que aponta para uma varivel do tipo int, ou seja, ptr
uma varivel que armazena o endereo de uma outra varivel do tipo int.

55 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Ponteiros
Passagem de argumentos por valor ou referncia
Arrays
Memria dinmica

Operador referncia

Obtendo o endereo de uma varivel


Para obter o endereo de uma varivel, podemos usar o operador referncia, &.
Por exemplo, se definirmos uma varivel do tipo int:
int var;
e um ponteiro que aponta para uma varivel do tipo int:
int * ptr;
podemos fazer com que o ponteiro ptr armazene o endereo da varivel var com
o comando:
ptr = &var;
O operador referncia pode ser lido como o endereo de.

56 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Ponteiros
Passagem de argumentos por valor ou referncia
Arrays
Memria dinmica

Exemplo - operador referncia

/* Example to d e m o n s t r a t e use of r e f e r e n c e operator in C p r o g r a m m i n g . */


# include < stdio .h >
int main ()
{
int var =5;
printf ( " Value : % d \ n " , var ) ;
printf ( " Address : % d " ,& var ) ;
return 0;
}

// Notice , the a m p e r s a n d (&) before var .

57 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Ponteiros
Passagem de argumentos por valor ou referncia
Arrays
Memria dinmica

Operador derreferncia

Obtendo a varivel de um endereo


O operador derreferncia * serve para acessar o valor da varivel para a qual um
ponteiro aponta.
Por exemplo, se temos um ponteiro ptr, que aponta para uma varivel var, como
no caso do slide anterior, o comando:
var2 = *ptr;
associa varivel var2 o valor apontado pelo ponteiro ptr, ou seja, o valor da
varivel var.
O operador derreferncia pode ser lido como o valor apontado por.

58 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Ponteiros
Passagem de argumentos por valor ou referncia
Arrays
Memria dinmica

Exemplo 1 - ponteiros

/* Source code to demonstrate , handling of pointers in C program */


# include < stdio .h >
int main ()
{
int * pc ;
int c ;
c =22;
printf ( " Address of c :% d \ n " ,& c ) ;
printf ( " Value of c :% d \ n \ n " ,c ) ;
pc =& c ;
printf ( " Address of pointer pc :% d \ n " , pc ) ;
printf ( " Content of pointer pc :% d \ n \ n " ,* pc ) ;
c =11;
printf ( " Address of pointer pc :% d \ n " , pc ) ;
printf ( " Content of pointer pc :% d \ n \ n " ,* pc ) ;
* pc =2;
printf ( " Address of c :% d \ n " ,& c ) ;
printf ( " Value of c :% d \ n \ n " ,c ) ;
return 0;
}

59 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Ponteiros
Passagem de argumentos por valor ou referncia
Arrays
Memria dinmica

Exemplo 2 - ponteiros

# include < stdio .h >


int main ()
{
int firstvalue , secondvalue ;
int * mypointer ;
mypointer = & firstvalue ;
* mypointer = 10;
mypointer = & secondvalue ;
* mypointer = 20;
printf ( " firstvalue is % d \ n " , firstvalue ) ;
printf ( " secondvalue is % d \ n " , secondvalue ) ;
return 0;
}

60 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Ponteiros
Passagem de argumentos por valor ou referncia
Arrays
Memria dinmica

Exemplo 3 - ponteiros

# include < stdio .h >


int main ()
{
int firstvalue = 5 , secondvalue = 15;
int * p1 , * p2 ;
p1 = & firstvalue ;
p2 = & secondvalue ;
* p1 = 10;
* p2 = * p1 ;
p1 = p2 ;
* p1 = 20;

//
//
//
//
//
//

p1 = address of f i r s t v a l u e
p2 = address of s e c o n d v a l u e
value pointed to by p1 = 10
value pointed to by p2 = value pointed by p1
p1 = p2 ( value of pointer is copied )
value pointed by p1 = 20

printf ( " firstvalue is % d \ n " , firstvalue ) ;


printf ( " secondvalue is % d \ n " , secondvalue ) ;
return 0;
}

61 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Ponteiros
Passagem de argumentos por valor ou referncia
Arrays
Memria dinmica

Aritmtica de ponteiros
Contas com ponteiros
As nicas operaes aritmticas vlidas
para ponteiros so a adio e a subtrao.
Como os ponteiros representam posies
na memria, sua aritmtica respeita o
espao que cada tipo de dado ocupa. Se
declaramos os ponteiros:
char *mychar;
short *myshort;
long *mylong;
e escrevemos:
++ mychar;
++ myshor;
++ mylong;

Figura 15: Ilustrao da aritmtica de


ponteiros.

as contas so feitas como ilustrado ao lado.


62 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Ponteiros
Passagem de argumentos por valor ou referncia
Arrays
Memria dinmica

Ponteiros constantes

Ponteiros que no podem mudar o valor apontado


Para se declarar um ponteiro que nao tem capacidade de mudar o valor da
varivel para a qual aponta, devemos preceder sua declarao pela palavra-chave
const. Ex:
int x;
int y = 10;
const int * p = &y;
x = *p;
// ok: reading p
*p = x;
// error: modifying p, which is const-qualified

63 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Ponteiros
Passagem de argumentos por valor ou referncia
Arrays
Memria dinmica

Ponteiros genricos

Ponteiros que podem apontar para qualquer lugar


Um ponteiro genrico um ponteiro sem tipo, ou seja, que pode apontar para
qualquer endereo da memria, independente do tipo de dado ali armazenado.
Declaramos um ponteiro genrico da mesma maneira que os tradicionais, com a
palavra-chave void no lugar do tipo:
void * ponteiro;
Ao se desreferenciar um ponteiro genrico (ou seja, obter o valor por ele
apontado), obrigatrio fazer um type casting explcito.

64 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Ponteiros
Passagem de argumentos por valor ou referncia
Arrays
Memria dinmica

Exemplo - ponteiros genricos

# include < stdio .h >


int main ()
{
int valor = 20;
float valor2 = 5.23;
void * ponteiro ; // ponteiro generico
ponteiro = & valor ; // aponta para um inteiro
printf ( " % d \ n " , *( int *) ponteiro ) ;
ponteiro = & valor2 ; // aponta para um float
printf ( " %0.2 f \ n " , *( float *) ponteiro ) ;
return 0;
}

65 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Ponteiros
Passagem de argumentos por valor ou referncia
Arrays
Memria dinmica

Ponteiros indeterminados

Ponteiros que no sabemos para onde apontam


Ponteiros podem apontar para qualquer lugar. Por exemplo:
int * p; // uninitialized pointer (local variable)
int myarray[10];
int * q = myarray+20; // element out of bounds
Nesse caso, p e q apontam para locais especficos da memria, ainda que seus
contedos sejam indefinidos. No podemos prever o que vai acontecer ao se
tentar acessar esses endereos, j que no sabemos o que est armazenado neles.

66 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Ponteiros
Passagem de argumentos por valor ou referncia
Arrays
Memria dinmica

Ponteiros nulos

Ponteiros que no apontam para lugar algum


s vezes necessrio que se defina explicitamente que um ponteiro no aponta
para lugar algum. Quando isso acontece, temos um ponteiro nulo.
A sintaxe para se declarar um ponteiro nulo :
int * p = 0;
importante no confundir os conceitos de ponteiros constantes, genricos,
indeterminados e nulos!!

67 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Ponteiros
Passagem de argumentos por valor ou referncia
Arrays
Memria dinmica

Passagem de argumentos por valor ou referncia

Como passamos os argumentos para as funes?


At agora, em todas as funes que vimos, os argumentos foram fornecidos s
funes por valor.
Isso significa que, ao chamar as funes, o que passamos a elas foram meras
cpias de seus valores, mas nunca as variveis em si.
Mas h casos em que precisamos manipular, de dentro de uma funo, o valor de
uma varivel externa. Para isso passamos os argumentos por referncia.

68 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Ponteiros
Passagem de argumentos por valor ou referncia
Arrays
Memria dinmica

Passagem de argumentos por valor ou referncia

Passagem de argumentos por referncia


Quando passamos os argumentos por referncia, informamos para a funo,
atravs de um ponteiro, o endereo da varivel, e no uma cpia de seu valor.
Sendo assim, a varivel para a qual o ponteiro passado como argumento aponta
pode ser manipulada diretamente de dentro da funo (obs: isso significa uma
vantagem ou desvantagem? Por qu?)
Alm do mais, em relao a velocidade e espao na memria, o que voc
considera mais eficaz, passar uma varivel como argumento por valor ou por
referncia?

69 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Ponteiros
Passagem de argumentos por valor ou referncia
Arrays
Memria dinmica

Exemplo 1 - Passagem de argumentos por referncia

# include < stdio .h >


void duplicate ( int *a , int *b , int * c )
{
* a *=2;
* b *=2;
* c *=2;
}

int main ()
{
int x =1 , y =3 , z =7;
duplicate (& x ,& y ,& z ) ;
printf ( " %d , %d , % d " ,x ,y , z ) ;
return 0;
}

70 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Ponteiros
Passagem de argumentos por valor ou referncia
Arrays
Memria dinmica

Exemplo 2 - Passagem de argumentos por referncia


# include < stdio .h >
void increment_all ( int * start , int * stop )
{
int * current = start ;
while ( current != stop )
{
++(* current ) ; // i n c r e m e n t value pointed
++ current ;
// i n c r e m e n t pointer
}
}
void print_all ( const int * start , const int * stop )
{
const int * current = start ;
while ( current != stop )
{
printf ( " % d \ n " ,* current ) ;
++ current ;
// i n c r e m e n t pointer
}
}
int main ()
{
int numbers [] = {10 ,20 ,30};
increment_all ( numbers , numbers +3) ;
print_all ( numbers , numbers +3) ;
return 0;
}

71 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Ponteiros
Passagem de argumentos por valor ou referncia
Arrays
Memria dinmica

Arrays

Guardando vrios valores sob um nome s


Um array uma srie de elementos do
mesmo tipo, dispostos em posies
adjacentes da memria e que podem
ser referenciados individualmente,
adicionando-se um ndice a um nico
identificador.
A sintaxe para a declarao de um
array :

Figura 16: Array do exemplo ao lado.

tipo identificador [no. de elementos];


Ex: int billy [5];

72 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Ponteiros
Passagem de argumentos por valor ou referncia
Arrays
Memria dinmica

Arrays

Referindo-se a cada valor individual


Podemos nos referir a cada valor individual do array utilizando um ndice em
colchetes. Por exemplo, o comando:
billy[3] = 77;
atribui o valor 77 ao quarto (!) elemento do array billy. O comando:
int var = billy[3];
atribui o valor armazenado na quarta posio do array billy (no caso, 77)
varivel recm-criada var.
Atente s duas funes diferentes dos colchetes:
especificar o tamanho do array, no momento da declarao;
especificar o ndice de um array que j existe.

Atente-se tambm peculiar numerao dos elementos de arrays em C, que


comea do zero!

73 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Ponteiros
Passagem de argumentos por valor ou referncia
Arrays
Memria dinmica

Arrays

Definir no momento de declarar


Podemos definir um array diretamente
no momento da declarao. Por
exemplo, poderamos ter definido o
array billy com o comando:
int billy [ ] = { 16, 2, 77, 40, 12071 };
Figura 17: Array do exemplo ao lado.

Os elementos devem vir dentro de


chaves, aps um operador de
atribuio (=). Note que esta forma
de definio do array s vlida no
momento da declarao.

74 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Ponteiros
Passagem de argumentos por valor ou referncia
Arrays
Memria dinmica

Exemplo - arrays

// arrays example
# include < stdio .h >
int foo [] = {16 , 2 , 77 , 40 , 12071};
int n , result =0;
int main ()
{
for ( n =0 ; n <5 ; ++ n )
{
result += foo [ n ];
}
printf ( " % d " , result ) ;
return 0;
}

75 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Ponteiros
Passagem de argumentos por valor ou referncia
Arrays
Memria dinmica

Arrays multidimensionais
Construindo matrizes
Um array multidimensional
construdo adicionando-se mais ndices
no momento de sua definio. Por
exemplo, o seguinte comando:
int jimmy [3][5];
cria uma matriz do tipo int 3x5, ou
seja, separa 15 espaos consecutivos na
memria para elementos do tipo int,
identificados com o nome comum
jimmy.

Figura 18: Array multidimensional do exemplo ao


lado.

Acessamos os elementos individuais da


mesma maneira que para o caso
unidimensional:
jimmy [1][3] = 4;

76 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Ponteiros
Passagem de argumentos por valor ou referncia
Arrays
Memria dinmica

Arrays de caracteres

Armazenando caracteres
Arrays tambm podem armazenar
elementos do tipo char (caracteres).
O comando:
char foo [20];
cria um array (ainda no definido) de
20 caracteres, ou seja, separa 20
espaos consecutivos na memria para
elementos do tipo char, identificados
com o nome comum foo.

Figura 19: Array de caracteres foo no momento


de sua declarao.

77 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Ponteiros
Passagem de argumentos por valor ou referncia
Arrays
Memria dinmica

Strings

Palavras!
Um string um array de caracteres
cujo ltimo elemento definido o
caractere de escape nulo \0.

Figura 20: Array foo armazenando os strings


Hello! e Merry Christmas!, respectivamente.

Podemos armazenar um string em um


array de caracteres, desde que aquele
tenha no mximo o mesmo nmero de
elementos que este. O compilador
reconhece o fim do string atravs do
caractere de escape nulo, \0. Ex:
foo[1] = H; foo[2] = e;
foo[3] = l; foo[4] = l;
foo[5] = o; foo[6] = \0;

78 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Ponteiros
Passagem de argumentos por valor ou referncia
Arrays
Memria dinmica

Strings

Definindo no momento da declarao


Podemos definir um string, no momento da declarao, maneira tradicional dos
arrays:
char foo [ ] = { H, e, l, l, o, \0 };
ou usando aspas duplas:
char foo [ ] = "Hello";
Nesse ltimo caso, no h a necessidade de adicionar o caractere nulo \0 (as
aspas duplas j sinalizam ao compilador que trata-se de um string e o \0
adicionado automaticamente).

79 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Ponteiros
Passagem de argumentos por valor ou referncia
Arrays
Memria dinmica

Relao entre ponteiros e arrays

Um array um tipo especial de ponteiro


Ponteiros e arrays em C esto intimamente relacionados. Na verdade, um array
pode ser encarado como um ponteiro que sempre aponta para seu primeiro
elemento.
Diferena para ponteiros tradicionais: uma vez declarados, os arrays no podem
mais ser apontados para outro endereco na memria.

80 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Ponteiros
Passagem de argumentos por valor ou referncia
Arrays
Memria dinmica

Relao entre ponteiros e arrays

Um array um tipo especial de ponteiro


Sendo equivalentes os conceitos de arrays e ponteiros, os seguintes comandos so
vlidos:
int myarray [20];
int * mypointer;
mypointer = myarray;
Note que, ao longo do cdigo, outro endereo de memria pode ser atribuido a
mypointer, enquanto myarray sempre vai apontar para o mesmo lugar.
O comando
myarray = mypointer;
no seria vlido nesse caso. Por qu?

81 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Ponteiros
Passagem de argumentos por valor ou referncia
Arrays
Memria dinmica

Relao entre ponteiros e arrays

Operador offset
O operador [ ], que foi apresentado como sendo um smbolo que especifica a
posio de um elemento em um array, na verdade um tipo de operador
derreferncia, chamado de operador offset.
O que ele faz simples: derreferencia a varivel que o precede, assim como o
operador *, mas adicionando o nmero entre as chaves ao endereo da varivel
derreferenciada.
Por exemplo, os comandos:
a[5] = 0;
*(a+5) = 0;

// a [offset of 5] = 0
// pointed by (a+5) = 0

so equivalentes.

82 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Ponteiros
Passagem de argumentos por valor ou referncia
Arrays
Memria dinmica

Exemplo - relao entre ponteiros e arrays

# include < stdio .h >


int main ()
{
int numbers [5];
int * p ;
int n ;
p = numbers ; * p = 10;
p ++; * p = 20;
p = & numbers [2]; * p = 30;
p = numbers + 3; * p = 40;
p = numbers ; *( p +4) = 50;
for ( n =0; n <5; n ++)
printf ( " %d , " , numbers [ n ]) ;
return 0;
}

83 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Ponteiros
Passagem de argumentos por valor ou referncia
Arrays
Memria dinmica

Exemplo 2 - relao entre ponteiros e arrays


# include < stdio .h >
int main ()
{
// D e c l a r i n g / I n i t i a l i z i n g three c h a r a c t e r s pointers
char * ptr1 = " Himanshu " ;
char * ptr2 = " Arora " ;
char * ptr3 = " TheGeekStuff " ;
// D e c l a r i n g an array of 3 char pointers
char * arr [3];
// I n i t i a l i z i n g the array with values
arr [0] = ptr1 ;
arr [1] = ptr2 ;
arr [2] = ptr3 ;
// P r i nting
printf ( " \ n
printf ( " \ n
printf ( " \ n

the values stored in array


[% s ]\ n " , arr [0]) ;
[% s ]\ n " , arr [1]) ;
[% s ]\ n " , arr [2]) ;

return 0;
}

84 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Ponteiros
Passagem de argumentos por valor ou referncia
Arrays
Memria dinmica

Indo alm dos limites

Olha o perigo
Em C, sintaticamente correto exceder o tamanho de um array. Ou seja, se
criarmos um array de 5 elementos e no meio do cdigo tentarmos acessar o
dcimo elemento, o compilador no ir reclamar e o executvel ser gerado
normalmente.
Ou seja, exceder os limites de um array em C no um erro de sintaxe e sim de
lgica.

85 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Ponteiros
Passagem de argumentos por valor ou referncia
Arrays
Memria dinmica

Indo alm dos limites - exemplo

# include < stdio .h >


u n s i g n e d int count = 1;
int main ( void )
{
int b = 10;
int a [3];
a [0] = 1;
a [1] = 2;
a [2] = 3;
printf ( " \ n b = % d \ n " ,b ) ;
a [3] = 12;
printf ( " \ n b = % d \ n " ,b ) ;
return 0;
}

86 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Ponteiros
Passagem de argumentos por valor ou referncia
Arrays
Memria dinmica

Memria dinmica

E quando no sabemos de quanto espao precisamos?


Muitas vezes, no sabemos a priori (a tempo de compilao) o tamanho da
memria que precisamos para dada operao. Por exemplo, quando temos um
array cujo nmero de elementos um input a ser dado pelo usurio.
Nesses casos, so utilizadas tcnicas de alocao dinmica de memria.
Ao utilizarmos tais tcnicas, alocamos a memria necessria para dada operao
a tempo de execuo.
Na definio da linguagem em si, no ha nenhuma tcnica do tipo, mas na
biblioteca padro (cabecalho stdlib.h) temos quatro funes implementadas com
esse fim: malloc, calloc, free e realloc.

87 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Ponteiros
Passagem de argumentos por valor ou referncia
Arrays
Memria dinmica

Memria dinmica

Figura 21: Funes disponveis na biblioteca padro de C para alocao dinmica de memria.

88 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Ponteiros
Passagem de argumentos por valor ou referncia
Arrays
Memria dinmica

Funo malloc
malloc
A funo malloc aloca um bloco de bytes consecutivos na memria do
computador e retorna o endereo desse bloco, na forma de um ponteiro genrico.
O nmero de bytes alocados especificado no argumento da funo. A sintaxe :
ptr = malloc (tamanho-em-bytes);
Caso queiramos que o ponteiro ptr no seja genrico e sim tenha um tipo
definido, podemos fazer um type casting explcito no momento da declarao:
ptr = (tipo*) malloc (tamanho-em-bytes);
Exemplo:
ptr = (int*) malloc (100*sizeof(int));
Nesse caso, a funo malloc aloca um espao na memria correspondente a 100
variveis do tipo int e retorna um ponteiro que aponta para o endereo do
primeiro byte.
Note o uso da funo sizeof, que garante a portabilidade do cdigo.

89 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Ponteiros
Passagem de argumentos por valor ou referncia
Arrays
Memria dinmica

Funo malloc - exemplo


# include < stdio .h >
# include < stdlib .h >
int main ()
{
int n ,i ,* ptr , sum =0;
printf ( " Enter number of elements : " ) ;
scanf ( " % d " ,& n ) ;
ptr =( int *) malloc ( n * sizeof ( int ) ) ; // memory a l l o c a t e d using malloc
if ( ptr == NULL )
{
printf ( " Error ! memory not allocated . " ) ;
exit (0) ;
}
printf ( " Enter elements of array : " ) ;
for ( i =0; i < n ;++ i )
{
scanf ( " % d " , ptr + i ) ;
sum +=*( ptr + i ) ;
}
printf ( " Sum =% d " , sum ) ;
free ( ptr ) ;
return 0;
}
90 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Ponteiros
Passagem de argumentos por valor ou referncia
Arrays
Memria dinmica

Funo calloc

calloc
A funo calloc parecida com a malloc. A diferena que esta aloca um bloco
simples de memria, enquanto aquela aloca blocos contguos, todos de mesmo
tamanho, e os inicializa como zero. A sintaxe :
ptr = (tipo*) calloc (no-de-elementos, tamanho-em-bytes-por-elemento);
Exemplo:
ptr = (float*) calloc (25, sizeof(float));

91 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Ponteiros
Passagem de argumentos por valor ou referncia
Arrays
Memria dinmica

Funo calloc - exemplo


# include < stdio .h >
# include < stdlib .h >
int main ()
{
int n ,i ,* ptr , sum =0;
printf ( " Enter number of elements : " ) ;
scanf ( " % d " ,& n ) ;
ptr =( int *) calloc (n , sizeof ( int ) ) ;
if ( ptr == NULL )
{
printf ( " Error ! memory not allocated . " ) ;
exit (0) ;
}
printf ( " Enter elements of array : " ) ;
for ( i =0; i < n ;++ i )
{
scanf ( " % d " , ptr + i ) ;
sum +=*( ptr + i ) ;
}
printf ( " Sum =% d " , sum ) ;
free ( ptr ) ;
return 0;
}
92 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Ponteiros
Passagem de argumentos por valor ou referncia
Arrays
Memria dinmica

Funo free

free
Para liberar o espao alocado pelas funes malloc ou calloc, precisamos usar a
funo free, cuja sintaxe bem simples:
free (ptr);
sendo ptr o endereo da memria que se deseja desalocar.

93 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Ponteiros
Passagem de argumentos por valor ou referncia
Arrays
Memria dinmica

Funo realloc

realloc
Se o tamanho da memria alocada for insuficiente, podemos usar o comando
realloc para realocar a memria. A sintaxe bem simples:
ptr = realloc (ptr,newsize);

94 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

structs
unions
enumerations
typdefs

structs

Estruturas
Uma estrutura de dados, ou mais simplesmente struct, um tipo de dado, criado
pelo usurio, que contm vrios elementos agrupados sob um mesmo nome. Os
elementos, chamados de membros, podem ter diferentes tipos ou comprimentos.
A sintaxe para a declarao :
struct nome
{
tipo_do_membro1 nome_do_membro1;
tipo_do_membro2 nome_do_membro2;
tipo_do_membro3 nome_do_membro3;
.
.
.
} nomes_dos_objetos;

95 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

structs
unions
enumerations
typdefs

structs

Estruturas
A utilidade das estruturas fica clara ao analisarmos um exemplo concreto:
struct product
{
int weight;
double price;
} apple, banana, melon;
Os trs objetos tambm poderiam ser declarados aps a declarao do struct, em
qualquer ponto do cdigo, maneira tradicional de declarao de variveis:
struct product apple;
struct product banana, melon;

96 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

structs
unions
enumerations
typdefs

structs

Estruturas
importante diferenciarmos entre um struct (que representa um tipo de dado,
definido pelo usurio) e um objeto dessa struct (ou seja, uma varivel que tem
como tipo a struct).
No caso anterior, o novo tipo criado foi a struct product e os trs objetos
(variveis cujos tipos so struct) foram apple, banana e melon. Note que
podemos criar quantos objetos quisermos do tipo product.

97 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

structs
unions
enumerations
typdefs

structs

Estruturas
Aps criada a struct e seus objetos, podemos operar com os membros de cada
objeto utilizando o operador ponto. Ex:
apple.weight
apple.price
banana.weight
banana.price
melon.weight
melon.price
Note que cada objeto tem seu prprio conjunto de membros.

98 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

structs
unions
enumerations
typdefs

structs - exemplo

struct database {
int id_number ;
int age ;
float salary ;
};
int main ()
{
struct database employee ;

/* There is now an employee variable that has


m o d i f i a b l e v a r i a b l e s inside it . */

employee . age = 22;


employee . id_number = 1;
employee . salary = 12000.21;
}

99 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

structs
unions
enumerations
typdefs

structs - exemplo 2
# include < stdio .h >
# include < string .h >
struct Books
{
char title [50];
char author [50];
char subject [100];
int
book_id ;
};
/* f u n c t i on d e c l a r a t i o n */
void printBook ( struct Books book ) ;
int main ( )
{
struct Books Book1 ;
struct Books Book2 ;

/* Declare Book1 of type Book */


/* Declare Book2 of type Book */

/* book 1 s p e c i f i c a t i o n */
strcpy ( Book1 . title , " C Programming " ) ;
strcpy ( Book1 . author , " Nuha Ali " ) ;
strcpy ( Book1 . subject , " C Programming Tutorial " ) ;
Book1 . book_id = 6495407;

100 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

structs
unions
enumerations
typdefs

structs - exemplo 2 (cont.)

/* book 2 s p e c i f i c a t i o n */
strcpy ( Book2 . title , " Telecom Billing " ) ;
strcpy ( Book2 . author , " Zara Ali " ) ;
strcpy ( Book2 . subject , " Telecom Billing Tutorial " ) ;
Book2 . book_id = 6495700;
/* print Book1 info */
printBook ( Book1 ) ;
/* Print Book2 info */
printBook ( Book2 ) ;
return 0;
}
void printBook ( struct Books book )
{
printf ( " Book title : % s \ n " , book . title ) ;
printf ( " Book author : % s \ n " , book . author ) ;
printf ( " Book subject : % s \ n " , book . subject ) ;
printf ( " Book book_id : % d \ n \ n " , book . book_id ) ;
}

101 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

structs
unions
enumerations
typdefs

structs - exemplo 3

// array of s t r u c t u r e s
# include < stdio .h >
# include < stdlib .h >
struct movies_t {
char title [20];
int year ;
};
void printmovie ( struct movies_t movie ) ;
int main ()
{
int i , n ;
struct movies_t * films ;
printf ( " Enter the number of movies : " ) ;
scanf ( " % d " , & n ) ;
films = ( struct movies_t *) malloc ( n * sizeof ( struct movies_t ) ) ;

102 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

structs
unions
enumerations
typdefs

structs - exemplo 3 (cont.)

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


{
printf ( " \ nEnter title : " ) ;
scanf ( " % s " , films [ i ]. title ) ;
printf ( " Enter year : " ) ;
scanf ( " % d " ,& films [ i ]. year ) ;
}
printf ( " \ nYou have entered these movies :\ n " ) ;
for ( i =0; i < n ; i ++)
printmovie ( films [ i ]) ;
return 0;
}
void printmovie ( struct movies_t movie )
{
printf ( " % s " , movie . title ) ;
printf ( " (% d ) \ n " , movie . year ) ;
}

103 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

structs
unions
enumerations
typdefs

structs

Operador seta ->


Podemos ter ponteiros que apontem para variveis (objetos) cujos tipos so
structs.
Se temos um ponteiro que aponta para algum objeto, podemos acessar os
membros desse objeto atravs do ponteiro. Para isso utilizamos um tipo especial
de operador derreferncia, chamado operador seta (->). Ex:
struct product orange;
struct product * ptr;
ptr = &orange;
ptr->price = 5;
Acessamos o membro price do objeto orange, indiretamente, atravs do ponteiro
ptr.

104 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

structs
unions
enumerations
typdefs

Operador seta - exemplo


# include < stdio .h >
struct student
{
int id ;
char name [30];
float percentage ;
};
int main ()
{
int i ;
struct student record1 = {1 , " Raju " , 90.5};
struct student * ptr ;
ptr = & record1 ;
printf ( " Records of STUDENT1 : \ n " ) ;
printf ( " Id is : % d \ n " , ptr - > id ) ;
printf ( " Name is : % s \ n " , ptr - > name ) ;
printf ( " Percentage is : % f \ n \ n " , ptr - > percentage ) ;
return 0;
}

105 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

structs
unions
enumerations
typdefs

structs

Figura 22: Combinaes entre operadores de ponteiros e de membros de estruturas.

106 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

structs
unions
enumerations
typdefs

unions

Um nico endereo com vrios tipos


Unions permitem que uma nica poro da memria tenha ao mesmo tempo
vrios tipos.
A sintaxe para criar um union semelhante a do struct:
union nome
{
tipo_do_membro1 nome_do_membro1;
tipo_do_membro2 nome_do_membro2;
tipo_do_membro3 nome_do_membro3;
.
.
.
} nomes_dos_objetos;

107 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

structs
unions
enumerations
typdefs

unions

Um nico endereo com vrios tipos


Exemplo:
union mix_t
{
int l;
struct
{
short hi;
short lo;
} s;
char c[4]
} mix;

108 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

structs
unions
enumerations
typdefs

unions

Figura 23: Memria reservada pelo union do slide anterior.

109 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

structs
unions
enumerations
typdefs

unions - exemplo 1

# include < stdio .h >


# include < string .h >
union Data
{
int i ;
float f ;
char str [20];
};
int main ( )
{
union Data data ;
printf ( " Memory size occupied by data : % d \ n " , sizeof ( data ) ) ;
return 0;
}

110 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

structs
unions
enumerations
typdefs

unions - exemplo 2
# include < stdio .h >
# include < string .h >
union Data
{
int i ;
float f ;
char str [20];
};
int main ( )
{
union Data data ;
data . i = 10;
data . f = 220.5;
strcpy ( data . str , " C Programming " ) ;
printf ( " data . i : % d \ n " , data . i ) ;
printf ( " data . f : % f \ n " , data . f ) ;
printf ( " data . str : % s \ n " , data . str ) ;
return 0;
}

111 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

structs
unions
enumerations
typdefs

unions - exemplo 3
# include < stdio .h >
# include < string .h >
union Data
{
int i ;
float f ;
char str [20];
};
int main ( )
{
union Data data ;
data . i = 10;
printf ( " data . i : % d \ n " , data . i ) ;
data . f = 220.5;
printf ( " data . f : % f \ n " , data . f ) ;
strcpy ( data . str , " C Programming " ) ;
printf ( " data . str : % s \ n " , data . str ) ;
return 0;
}

112 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

structs
unions
enumerations
typdefs

enumerations

Constantes nomeadas
Um enumeration um tipo que consiste de um conjunto de constantes inteiras,
cada uma com um nome.
A sintaxe para criar um enumeration familiar:
enum nome
{
nome_do_membro1;
nome_do_membro2;
nome_do_membro3;
.
.
.
} nomes_dos_objetos;

113 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

structs
unions
enumerations
typdefs

enumerations

Constantes nomeadas
Note que, na declarao de um enumeration, no usamos nenhum outro tipo
pr-definido. Portanto, um enumeration pode ser visto como um tipo criado do
zero, totalmente novo.
A cada membro de um enumeration est associado um inteiro constante. Por
default, ao primeiro membro est associado 0, ao segundo membro 1, e assim
sucessivamente. Mas o programador pode mudar essa configurao. Ex:
enum clubes
{
vasco=0;
flamengo=10;
};

114 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

structs
unions
enumerations
typdefs

enumerations - exemplo

# include < stdio .h >


enum week { sunday , monday , tuesday , wednesday , thursday , friday , saturday };
int main ()
{
enum week today ;
today = wednesday ;
printf ( " % d day \ n " , today +1) ;
return 0;
}

115 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

structs
unions
enumerations
typdefs

typedefs

Atalhos para tipos


Um typedef simplesmente um nome diferente pelo qual um tipo pode ser
identificado.
A sintaxe para criar um typedef simples:
typedef tipo_existente novo_nome ;
Por exemplo, aps definirmos o typedef:
typedef char C;
podemos criar uma varivel mychar, do tipo char, com o comando:
C mychar;

116 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

A linguagem C++
Classes
Composio
Amizade
Herana
Polimorfismo

A linguagem C++

A Linguagem
O C++ uma extenso da linguagem C,
desenvolvida por Bjarne Stroustrup com o
objetivo de incorporar nesta o paradigma de
programao orientada a objetos.

Figura 24: Bjarne Stroustrup.

O sucesso da linguagem no mundo da


computao pode ser verificado com os vrios
softwares nela escritos, como Windows, Mac
OS X, Mozilla Firefox, Microsoft Office, Adobe
Acrobat, etc.

117 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

A linguagem C++
Classes
Composio
Amizade
Herana
Polimorfismo

A linguagem C++

Diferenas menores para o C


Alm da orientao a objetos, existem algumas diferenas menores entre o C++
e o C:
uma biblioteca padro mais poderosa, a STL (Standard Template Library ), que contm
por exemplo uma classe nova para input/output de dados (iostream);
novos operadores para gerenciamento de memria dinmica (new e delete);
presena de um novo tipo de dado (bool) para operaes lgicas;
suporte a tratamento de excees, uma ferramenta til para debug,

entre outras.
Para mais diferenas, consulte:
http://www.cprogramming.com/tutorial/c-vs-c++.html

118 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

A linguagem C++
Classes
Composio
Amizade
Herana
Polimorfismo

A linguagem C++

Figura 25: Diagrama mostrando a relao entre o C e o C++.

119 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

A linguagem C++
Classes
Composio
Amizade
Herana
Polimorfismo

Classes

Estendendo a ideia de estruturas


A ideia inicial da orientao a objetos o conceito de classes.
Uma classe um tipo de dado personalizado, parecido com o struct, s que com
duas diferenas:
seus membros podem ser funes;
h mecanismos de controle de acesso aos membros.

120 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

A linguagem C++
Classes
Composio
Amizade
Herana
Polimorfismo

Classes

Estendendo a ideia de estruturas


A sintaxe para a declarao de uma classe :
class nome
{
especificador_de_acesso:
membro1;
especificador_de_acesso:
membro2;
...
} nomes_dos_objetos;
Note a presena dos especificadores de acesso, palavras-chave que controlam o
acesso aos membros por entidades de fora da classe.

121 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

A linguagem C++
Classes
Composio
Amizade
Herana
Polimorfismo

Classes

Especificadores de acesso
So trs os especificadores de acesso que podemos usar:
private: membros privados so acessveis apenas por membros da mesma classe ou por
seus amigos.
protected: membros protegidos so acessveis por membros da mesma classe, por seus
amigos ou por membros de classes derivadas.
public: membros pblicos so acessveis de qualquer lugar do cdigo em que o objeto
seja visvel.

Quando no especificado, o acesso default dos membros o privado.

122 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

A linguagem C++
Classes
Composio
Amizade
Herana
Polimorfismo

Classes

Exemplo
Observe o seguinte exemplo:
class Rectangle
{
int x,y;
public:
void set_values (int,int);
int area (void);
} rect;
Declaramos uma classe chamada Rectangle, com dois membros privados (x e y) e
dois membros pblicos (set_values e area), e criamos um objeto (rect) dessa
classe.
O processo de criar um objeto (varivel) de uma classe (tipo) chama-se instanciar
a classe.

123 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

A linguagem C++
Classes
Composio
Amizade
Herana
Polimorfismo

Classes - exemplo 1
// classes example
# include < iostream >
using n a m e s p a c e std ;
class Rectangle {
int width , height ;
public :
void set_values ( int , int ) ;
int area () { return width * height ;}
};
void Rectangle :: set_values ( int x , int y ) {
width = x ;
height = y ;
}
int main () {
Rectangle rect1 , rect2 ;
rect1 . set_values (3 ,4) ;
rect2 . set_values (5 ,8) ;
cout << " area 1: " << rect1 . area () << endl ;
cout << " area 2: " << rect2 . area () << endl ;
}
124 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

A linguagem C++
Classes
Composio
Amizade
Herana
Polimorfismo

Classes

Operador de escopo
No exemplo anterior, ao definirmos a funo membro set_values fora da classe a
qual ela pertencia (Rectangle), foi preciso preceder seu nome pelo nome da classe
e o operador :: (chamado operador de escopo). Ou seja, foi preciso escrever
Retangle::set_values no lugar onde estaria normalmente apenas set_values, o
nome da funo.
Isso sempre necessrio quando definimos membros de classe fora do corpo da
classe em si.

125 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

A linguagem C++
Classes
Composio
Amizade
Herana
Polimorfismo

Classes - exemplo 2
# include < iostream >
using n a m e s p a c e std ;
class temp
{
private :
int data1 ;
float data2 ;
public :
void int_data ( int d )
{
data1 = d ;
cout < < " Number : " << data1 ;
}
float float_data ()
{
cout < < " \ nEnter data : " ;
cin > > data2 ;
return data2 ;
}
};
int main ()
{
temp obj1 , obj2 ;
obj1 . int_data (12) ;
cout < < " You entered " << obj2 . float_data () ;
}

126 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

A linguagem C++
Classes
Composio
Amizade
Herana
Polimorfismo

Classes - exemplo 2

Figura 26: Objetos do exemplo (instncias da classe temp) e seus membros.

127 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

A linguagem C++
Classes
Composio
Amizade
Herana
Polimorfismo

Classes

Construtor
No nosso primeiro exemplo, criamos uma funo chamada set_values que servia
para inicializar os membros de um dado objeto.
Na verdade, o C++ possui uma funo especial, o construtor, que tem
justamente esse objetivo: inicializar os membros de um objeto. O construtor
chamado automaticamente toda vez que um novo objeto de uma classe
declarado.
O construtor uma funo cujo nome o mesmo nome da classe, que no
retorna nenhum tipo (nem mesmo void) e pode aceitar argumentos normalmente.

128 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

A linguagem C++
Classes
Composio
Amizade
Herana
Polimorfismo

Classes - exemplo 3 (construtor)


// example : class c o n s t r u c t o r
# include < iostream >
using n a m e s p a c e std ;
class Rectangle {
int width , height ;
public :
Rectangle ( int , int ) ;
int area () { return ( width * height ) ;}
};
Rectangle :: Rectangle ( int a , int b ) {
width = a ;
height = b ;
}
int main () {
Rectangle rect1 (3 ,4) ;
Rectangle rect2 (5 ,8) ;
cout << " area 1: " << rect1 . area () << endl ;
cout << " area 2: " << rect2 . area () << endl ;
return 0;
}
129 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

A linguagem C++
Classes
Composio
Amizade
Herana
Polimorfismo

Classes

Construtor
Quando definimos um construtor para uma classe, todos os objetos dessa classe
tm que ser declarados de acordo com a sintaxe do construtor (ou seja, com o
mesmo nmero de argumentos especificado no construtor).
Se no definimos um construtor para uma classe, o compilador assume que a
classe possui um construtor padro (sem argumentos). Sendo assim, podemos
declarar os objetos dessa classe da mesma maneira que definimos variveis
comuns (sem argumentos).
Tambm podemos nos prevenir para o caso do objeto ser declarado sem
argumentos, mesmo quando seu construtor os exige: definimos para isso, no
parnteses do prprio construtor, valores-padro para as variveis a serem
inicializadas.

130 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

A linguagem C++
Classes
Composio
Amizade
Herana
Polimorfismo

Classes - exemplo 4
# include < iostream >
using n a m e s p a c e std ;
class Box
{
public :
// C o n s t r u c t o r d e f i n i t i o n
Box ( double l =2.0 , double b =2.0 , double h =2.0)
{
cout <<" Constructor called . " << endl ;
length = l ;
breadth = b ;
height = h ;
}
double Volume ()
{
return length * breadth * height ;
}
private :
double length ;
// Length of a box
double breadth ;
// Breadth of a box
double height ;
// Height of a box
};

131 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

A linguagem C++
Classes
Composio
Amizade
Herana
Polimorfismo

Classes - exemplo 4 (cont)


int main ( void )
{
Box Box1 (3.3 , 1.2 , 1.5) ;
Box Box2 (8.5 , 6.0 , 2.0) ;
Box Box3 ;
Box * ptrBox ;

// Declare box1
// Declare box2
// Declare box3
// Declare pointer to a class .

// Save the address of first object


ptrBox = & Box1 ;
// Now try to access a member using member access operator
cout << " Volume of Box1 : " << ptrBox - > Volume () << endl ;
// Save the address of second object
ptrBox = & Box2 ;
// Now try to access a member using member access operator
cout << " Volume of Box2 : " << ptrBox - > Volume () << endl ;
// Try to access directly a member using member access operator
cout << " Volume of Box3 : " << Box3 . Volume () << endl ;
return 0;
}

132 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

A linguagem C++
Classes
Composio
Amizade
Herana
Polimorfismo

Classes

Inicializao de membros no construtor


Quando um construtor usado para inicializar membros, estes podem ser
inicializados sem a necessidade de escrevermos comandos no corpo do construtor.
Isso feito incluindo-se dois pontos, :, antes do corpo do construtor, seguidos de
uma lista das inicializaes pretendidas. Por exemplo, o construtor:
Rectangle::Rectangle (int x, int y) { width=x; height=y; }
poderia ser escrito como:
Rectangle::Rectangle (int x, int y) : width(x), height(y) { }
Note como o corpo do construtor est vazio.

133 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

A linguagem C++
Classes
Composio
Amizade
Herana
Polimorfismo

Classes - exemplo 5
# include < iostream >
using n a m e s p a c e std ;
class Circle {
double radius ;
public :
Circle ( double r ) : radius ( r ) { }
double area () { return radius * radius *3.14159265;}
};
class Cylinder {
Circle base ;
double height ;
public :
Cylinder ( double r , double h ) : base ( r ) , height ( h ) {}
double volume () { return base . area () * height ;}
};
int main () {
Cylinder foo (10 ,20) ;
cout << " foo s volume : " << foo . volume () << \ n ;
return 0;
}

134 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

A linguagem C++
Classes
Composio
Amizade
Herana
Polimorfismo

Classes

Filosofia da orientao a objetos


Depois de vrios exemplos, podemos finalmente entender a filosofia da orientao
a objetos: dados (variveis) e mtodos que lidam com essas variveis (funes)
so encapsulados em uma s entidade chamada classe.
Na OO, no mais criamos conjuntos de variveis globais que passamos de uma
funo para outra como parmetros, mas sim manipulamos objetos que tm seu
prprio conjunto de dados e funes.
Esse conceito cria poderosas ferramentas de abstrao, em especial a
composio, a herana e o polimorfismo.

135 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

A linguagem C++
Classes
Composio
Amizade
Herana
Polimorfismo

Classes

Composio
A relao entre classes conhecida como composio, ou relao has-a, ocorre
quando uma instncia de uma dada classe membro de outra.
J vimos isso no nosso ltimo exemplo: uma instncia (objeto) da classe Circle
era membro da classe Cylinder.

136 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

A linguagem C++
Classes
Composio
Amizade
Herana
Polimorfismo

Amizade

Classes e funes tambm amam


A princpio, membros privados ou protegidos de uma classe no podem ser
acessados de fora da classe. Essa regra, no entanto, no se aplica aos amigos.
Amigos so funes ou classes declaradas com a palavra-chave friend.
Muito cuidado com o uso da amizade, pois ela quebra a ideia bsica da
orientao a objetos: o encapsulamento de dados!
Via de regra, tente programar com o menor nmero de amigos possveis. Se
possvel, no faa nenhum amigo.

137 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

A linguagem C++
Classes
Composio
Amizade
Herana
Polimorfismo

Funo amiga - exemplo


// friend f u n c t i o n s
# include < iostream >
using n a m e s p a c e std ;
class Rectangle {
int width , height ;
public :
Rectangle () {}
Rectangle ( int x , int y ) : width ( x ) , height ( y ) {}
int area () { return width * height ;}
friend Rectangle duplicate ( const Rectangle &) ;
};
Rectangle duplicate ( const Rectangle & param )
{
Rectangle res ;
res . width = param . width *2;
res . height = param . height *2;
return res ;
}
int main () {
Rectangle foo ;
Rectangle bar (2 ,3) ;
foo = duplicate ( bar ) ;
cout << foo . area () << \ n ;
return 0;
}
138 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

A linguagem C++
Classes
Composio
Amizade
Herana
Polimorfismo

Classe amiga - exemplo


// friend class
# include < iostream >
using n a m e s p a c e std ;
class Square ;
class Rectangle {
int width , height ;
public :
int area ()
{ return ( width * height ) ;}
void convert ( Square a ) ;
};
class Square {
friend class Rectangle ;
private :
int side ;
public :
Square ( int a ) : side ( a ) {}
};
void Rectangle :: convert ( Square a ) {
width = a . side ;
height = a . side ;
}
139 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

A linguagem C++
Classes
Composio
Amizade
Herana
Polimorfismo

Classe amiga - exemplo (cont)

int main () {
Rectangle rect ;
Square sqr (4) ;
rect . convert ( sqr ) ;
cout << rect . area () ;
return 0;
}

140 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

A linguagem C++
Classes
Composio
Amizade
Herana
Polimorfismo

Herana

Derivando classes a partir de classes


Na OO, classes novas podem ser criadas a
partir de antigas, aproveitando todo o cdigo
nesta implementado e adicionando novas
funcionalidades. Esse mecanismo conhecido
como herana, ou relao is-a.
Figura 27: Ilustrao do mecanismo da
herana.

Classes representando modelos genricos,


portanto, podem ser implementadas, e delas
serem derivados modelos especficos.
Note a possibilidade de alto reaproveitamento
de cdigo j implementado!

141 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

A linguagem C++
Classes
Composio
Amizade
Herana
Polimorfismo

Herana

Derivando classes a partir de classes


A sintaxe para a declarao de classes derivadas :
class derived_class_name: public base_class_name
{ /*...*/ };
O especificador de acesso limita o nvel mais acessvel para membros derivados;
membros com nvel mais acessvel do que o especificado so herdados com o nvel
especificado.
Via de regra, quando no desejamos modificar os nveis de acesso, usamos o
especificador public.

142 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

A linguagem C++
Classes
Composio
Amizade
Herana
Polimorfismo

Herana - exemplo
// derived classes
# include < iostream >
using n a m e s p a c e std ;
class Polygon {
protected :
int width , height ;
public :
void set_values ( int a , int b )
{ width = a ; height = b ;}
};
class Rectangle : public Polygon {
public :
int area ()
{ return width * height ; }
};
class Triangle : public Polygon {
public :
int area ()
{ return width * height / 2; }
};

143 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

A linguagem C++
Classes
Composio
Amizade
Herana
Polimorfismo

Herana - exemplo (cont.)

int main () {
Rectangle rect ;
Triangle trgl ;
rect . set_values (4 ,5) ;
trgl . set_values (4 ,5) ;
cout << rect . area () << \ n ;
cout << trgl . area () << \ n ;
return 0;
}

144 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

A linguagem C++
Classes
Composio
Amizade
Herana
Polimorfismo

Figura 28: Mecanismo de herana no exemplo anterior.

145 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

A linguagem C++
Classes
Composio
Amizade
Herana
Polimorfismo

Polimorfismo

Vrias formas
Uma das principais caractersticas da herana
entre classes que um ponteiro para uma
classe derivada compatvel em tipo com um
ponteiro para a classe me.
O polimorfismo a arte de tirar vantagem
dessa situao.
Com o polimorfismo, podemos programar
utilizando ponteiros que apontam para classes
base genricas, que so substitudas, a nvel
apropriado, por classes derivadas especficas.

Figura 29: Ilustrao do mecanismo do


polimorfismo.

146 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

A linguagem C++
Classes
Composio
Amizade
Herana
Polimorfismo

Polimorfismo - exemplo
// p o i n t e rs to base class
# include < iostream >
using n a m e s p a c e std ;
class Polygon {
protected :
int width , height ;
public :
void set_values ( int a , int b )
{ width = a ; height = b ; }
};
class Rectangle : public Polygon {
public :
int area ()
{ return width * height ; }
};
class Triangle : public Polygon {
public :
int area ()
{ return width * height /2; }
};

147 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

A linguagem C++
Classes
Composio
Amizade
Herana
Polimorfismo

Polimorfismo - exemplo (cont.)

int main () {
Rectangle rect ;
Triangle trgl ;
Polygon * ppoly1 = & rect ;
Polygon * ppoly2 = & trgl ;
ppoly1 - > set_values (4 ,5) ;
ppoly2 - > set_values (4 ,5) ;
cout << rect . area () << \ n ;
cout << trgl . area () << \ n ;
return 0;
}

148 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

A linguagem C++
Classes
Composio
Amizade
Herana
Polimorfismo

Polimorfismo

Membros virtuais
Um membro virtual uma funo membro que pode ser redefinida nas classes
derivadas, preservando as propriedades polimrficas (chamada da funo atravs
de ponteiros).
Uma funo virtual tem sua declarao precedida pela palavra-chave virtual.
importante ter em mente que funes membro no virtuais tambm podem ser
redefinidas nas classes derivadas, porm no podem ser mais acessadas atravs de
referncias para a classe-me (ou seja, perdem suas propriedades polimrficas).
Uma classe que declara ou herda uma funo virtual chamada de classe
polimrfica.

149 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

A linguagem C++
Classes
Composio
Amizade
Herana
Polimorfismo

Membros virtuais - exemplo


// virtual members
# include < iostream >
using n a m e s p a c e std ;
class Polygon {
protected :
int width , height ;
public :
void set_values ( int a , int b )
{ width = a ; height = b ; }
virtual int area ()
{ return 0; }
};
class Rectangle : public Polygon {
public :
int area ()
{ return width * height ; }
};
class Triangle : public Polygon {
public :
int area ()
{ return ( width * height / 2) ; }
};

150 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

A linguagem C++
Classes
Composio
Amizade
Herana
Polimorfismo

Membros virtuais - exemplo (cont.)

int main () {
Rectangle rect ;
Triangle trgl ;
Polygon poly ;
Polygon * ppoly1 = & rect ;
Polygon * ppoly2 = & trgl ;
Polygon * ppoly3 = & poly ;
ppoly1 - > set_values (4 ,5) ;
ppoly2 - > set_values (4 ,5) ;
ppoly3 - > set_values (4 ,5) ;
cout << ppoly1 - > area () << \ n ;
cout << ppoly2 - > area () << \ n ;
cout << ppoly3 - > area () << \ n ;
return 0;
}

151 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

A linguagem C++
Classes
Composio
Amizade
Herana
Polimorfismo

Polimorfismo
Classes abstratas
Classes abstratas so classes que contm pelo menos uma funo puramente
virtual.
Uma funo puramente virtual uma funo sem implementao. A sintaxe para
sua declarao :
virtual tipo nome () = 0;
As implementaes para as funes puramente virtuais vm apenas nas classes
derivadas.
Classes abstratas no podem ser instanciadas. No h objetos cujos tipos sejam
classes abstratas. Elas apenas fornecem a base a partir da qual outras classes
sero derivadas.
As classes abstratas, apesar de no poderem ser instanciadas, no so inteis!
Podemos programar fazendo referncias a elas, tirando proveito de todo o poder
do polimorfismo.

152 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

A linguagem C++
Classes
Composio
Amizade
Herana
Polimorfismo

Classes abstratas - exemplo


// a b s t r a ct base class
# include < iostream >
using n a m e s p a c e std ;
class Polygon {
protected :
int width , height ;
public :
void set_values ( int a , int b )
{ width = a ; height = b ; }
virtual int area ( void ) =0;
};
class Rectangle : public Polygon {
public :
int area ( void )
{ return ( width * height ) ; }
};
class Triangle : public Polygon {
public :
int area ( void )
{ return ( width * height / 2) ; }
};

153 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

A linguagem C++
Classes
Composio
Amizade
Herana
Polimorfismo

Classes abstratas - exemplo (cont.)

int main () {
Rectangle rect ;
Triangle trgl ;
Polygon * ppoly1 = & rect ;
Polygon * ppoly2 = & trgl ;
ppoly1 - > set_values (4 ,5) ;
ppoly2 - > set_values (4 ,5) ;
cout << ppoly1 - > area () << \ n ;
cout << ppoly2 - > area () << \ n ;
return 0;
}

154 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

A linguagem C++
Classes
Composio
Amizade
Herana
Polimorfismo

Classes abstratas - exemplo 2


// pure virtual members can be called
// from the abstract base class
# include < iostream >
using n a m e s p a c e std ;
class Polygon {
protected :
int width , height ;
public :
void set_values ( int a , int b )
{ width = a ; height = b ; }
virtual int area () =0;
void printarea ()
{ cout << this - > area () << \ n ; } /* this : keyword r e p r e s e n t i n g a pointer
to the object whose member function is being executed */
};
class Rectangle : public Polygon {
public :
int area ( void )
{ return ( width * height ) ; }
};
class Triangle : public Polygon {
public :
int area ( void )
{ return ( width * height / 2) ; }
};
155 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

A linguagem C++
Classes
Composio
Amizade
Herana
Polimorfismo

Classes abstratas - exemplo 2 (cont.)

int main () {
Rectangle rect ;
Triangle trgl ;
Polygon * ppoly1 = & rect ;
Polygon * ppoly2 = & trgl ;
ppoly1 - > set_values (4 ,5) ;
ppoly2 - > set_values (4 ,5) ;
ppoly1 - > printarea () ;
ppoly2 - > printarea () ;
return 0;
}

156 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

A linguagem C++
Classes
Composio
Amizade
Herana
Polimorfismo

Exemplo aplicado engenharia qumica

Figura 30: Diagrama UML de um programa bsico para clculo de equilbrio de fases.
157 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Bibliografia

Stephen G. Kochan Programming in C Sams Pulishing;


Herbert Schildt C Completo e Total Makron Books;
Bartotz Milewski C++ In Action Industrial Strength Programming
Techniques RO Release;
Daoqi Yang - C++ and Object Oriented Numeric Computing for Scientists and
Engineers Springer;
Julian Souli - C++ Language Tutorial - Disponvel em www.cplusplus.com;
www.cprogramming.com

158 / 159

Conceitos bsicos
A linguagem C
Programao modular
Gerenciamento de memria
Tipos de dados definidos pelo usurio
Programao orientada a objetos: o C++

Obrigado!

159 / 159

Вам также может понравиться