You are on page 1of 732

Introduo Programao

Apresentao da Disciplina e Conceitos Bsicos de Computadores

Objetivos
Aprender tcnicas de programao que aumentem a qualidade de software e a produtividade no desenvolvimento
Discutir conceitos de programao, ilustrando como os mesmos so representados na linguagem de programao C Discutir como programas podem ser adequadamente escritos, estruturados e documentados Explorar o ambiente de suporte a C, incluindo ferramentas e bibliotecas Discutir princpios de engenharia e qualidade de software. Desenvolver, documentar e avaliar uma aplicao de mdio porte em C

Resultados de Semestres Anteriores


Resultados 2010-1

24 39%

25 41%

Reprovados Reprovados por falta Aprovados Aprovados por Media

10 17%

2 3%

Resultados de Semestres Anteriores


Resultados 2010-2
15 21% 35 48% Reprovados

Reprovados por falta Aprovados


Aprovados por Mdia

20 28%
2 3%

Anlise de Resultados
No ltimo ano, 133 alunos cursaram a disciplina
69 aprovados (52% de aprovao) Apenas 39 aprovados por mdia (29%) 64 reprovados (48% de reprovao)

Consequncias
Dificuldade de conseguir vagas para cursar a disciplina de novo Vria disciplinas dependem de IP Atraso significativo no curso de EC Para os que conseguiram passar com dificuldade, problemas para acompanhar a disciplina de Algoritmos Alm de vrias outras disciplinas que exigem que o aluno desenvolva programas (Infra de SW, Infra de Comunicao, etc)
5

Como Ter Sucesso na Disciplina?


Estudo dirio
So 6 horas de aula por semana Nenhuma disciplina tem tantas aulas por semana

Programao no se aprende somente olhando o livro e exemplos


Deve-se praticar exaustivamente Programao no trivial para muitos, pois envolve raciocnio lgico para resolver problemas complexos e codificar a soluo em uma linguagem de programao Facilidade de acesso a computadores

Aproveitar as aulas prticas e de exerccios


Escrever programas com algum para esclarecer dvidas ajuda muito
6

Tpicos da Aula
Antes de aprender a programar, precisamos ver conceitos bsicos de Computao
Componentes de um computador Como os diferentes componentes interagem Representao das informaes em computadores

Hardware e Software
Computador = Hardware + Software
Hardware
Parte fsica do computador Chips, monitores, teclado, etc

Software
Programas (conjunto de instrues)

e dados
Editores de texto, navegadores, sistemas operacionais, etc
8

Modelo de um computador
Unidade Central de Processamento Memria Principal (RAM)

CPU
Canal de Comunicao (Barramento)

Armazenamento Secundrio Disco Rgido (HD), CD,DVD, Pen Drive,etc

Dispositivos de Entrada/Sada

Perifricos
9

CPU e RAM
Executa as instrues presentes nos programas Armazena os programas e dados que esto sendo usados pela CPU Memria Principal (RAM)

CPU

CPU busca primeiramente programas e dados residentes na memria CPU tambm armazena dados na memria
10

Unidade Central de Processamento (1)


A CPU o crebro do computador Implementado em um chip chamado de microprocessador Faz continuamente 3 aes:
Busca instruo na memria principal

Busca
Processa a instruo

Determina o que a instruo

Executa

Decodifica
11

Unidade Central de Processamento (2)


Os componentes principais de uma CPU so:
Faz clculos e toma decises Coordena as etapas do processamento

Unidade de Lgica/Aritmtica

Unidade de Controle

Registradores

reas pequenas de armazenamento

12

Unidade Central de Processamento (3)


A velocidade de processamento de uma CPU dado pelo relgio (clock) do sistema O clock gera um pulso eletrnico em intervalos regulares

Estes pulsos coordenam as atividades da CPU


Velocidade da CPU medida geralmente em Hertz (Hz)

13

Armazenando Dados (1)

9278 9279 9280 9281 9282 9283 9284 9285 9286

Memrias so divididas em vrias clulas de tamanhos iguais

Cada clula identificada unicamente por um valor numrico chamado de endereo

14

Armazenando Dados (2)

9278 9279 9280 9281 9282 9283 9284 9285 9286

10011010

Cada clula pode armazenar um valor de tamanho mximo fixo

Valores que ultrapassam o tamanho mximo de uma clula so armazenados em mais de uma clula (clulas consecutivas)

15

Memria Principal
Tambm chamada de memria RAM Random Access Memory
Acesso aos endereos de memria podem ser feita de forma direta sem ter que passar por endereos anteriores

Armazena

dados

programas

utilizados

pelo

processador num dado instante


Quando o computador possui sistema operacional, este carregado na memria geralmente na hora em que o
16

computador ligado

Memria Principal
CPU
Cache Memria Principal (RAM)

Computadores atuais utilizam tambm pequenas memrias cache para armazenar partes dos dados e programas que esto na memria principal Memria cache utiliza tecnologia que torna acesso aos dados mais rpida Evita acesso pelo barramento
17

Armazenamento Secundrio
Memria Principal (RAM)

CPU
CPU procura programa/dados na RAM No encontrando, CPU procura na memria secundria Programa/dados so transferidos para RAM Tipos de memria para armazenamento de longa durao de dados/programas
18

Armazenamento Secundrio

Armazenamento Secundrio
(Disco Rgido)

Dispositivo magntico Partes que so gravadas so magnetizadas


19

Armazenamento Secundrio
(Disco Rgido)

setor

trilha

Informaes so gravadas em setores Uma trilha composta por um conjunto de setores


20

Armazenamento Secundrio
(CD/DVD )

Dispositivo ptico Pequenos furos quando lidos por laser refletem

diferentemente do resto do CD Furos representam 0s e espaos representam 1s


21

Memria RAM x Memria Secundria


Memria RAM mais rpida do que memrias secundrias Memria RAM voltil
Informao perdida quando no h corrente eltrica

Memrias secundrias no so volteis Memrias secundrias geralmente so mais baratas que a memria RAM
Por serem mais baratas, geralmente a capacidade de
armazenamento maior (Ex: Disco Rgido)
22

Dispositivos de Entrada/Sada
Memria Principal (RAM)

CPU

Interao do usurio pode mudar o fluxo de execuo na CPU


Armazenamento Secundrio

Dispositivos para facilitar a interao do usurio

Dispositivos de Entrada/Sada

23

Representao de Informao
Existem, basicamente, 2 formas de representar uma informao: Modo Analgico
Contnua, diretamente proporcional aos dados que constituem a informao Termmetro de mercrio Mercrio sobe em um tubo proporcionalmente ao aumento da temperatura fora do tubo

Modo Digital
Informao quebrada em pedaos e cada pedao representado separadamente Msica em um CD o disco armazena nmeros que representam amostras regulares (no tempo) de nveis de voltagens especficas do som
24

Analgico x Digital
volt

Analgico
11 8 7 4 3 1 2 3 4 5 tempo 11 8 7 4 3

Digital

1 2

3 4

25

Informao Digital
Computadores armazenam toda informao de forma digital
Nmeros Texto Grficos e Imagens Vdeo udio Instrues de programas

Para isto o computador digitaliza as informaes, ou seja quebra a informao em pedaos

26

Representando Texto Digitalmente


Em um texto, cada caractere armazenado como um nmero, incluindo espaos, dgitos e pontuao Caracteres maisculos e minsculos tm numeraes diferentes

O i , M u n d o!
79 105 44 32 77 117 110 100 111 33

27

Nmeros Binrios
Quando a informao digitalizada, ela representada e armazenada em memria usando o sistema de numerao binria
Um dgito binrio (0 ou 1) chamado de bit
Um bit pode representar 2 estados possveis (0 ou 1), assim como uma lmpada que pode estar ligada (1) ou desligada (0)

Dispositivos que armazenam e manipulam informao com representao binria (com 2 estados possveis) so mais confiveis e baratos
28

Sistema de Numerao Binria (1)


No sistema de numerao decimal utilizamos os dgitos de 0 at 9 para representar qualquer nmero No sistema binrio, s podemos utilizar os dgitos 0 e 1 para representar um nmero Exemplo: Para representar o nmero nove em decimal utilizamos o dgito 9, em binrio ficaria 1001

1 0 0 1
1x 23 + 0 x 22 + 0 x 21 + 1 x 20

29

Sistema de Numerao Binria (2)


Sistema Decimal 10 9 8 7 6 5 4 3 2 1 Sistema Binrio (4 bits) 1010 1001 1000 0111 0110 0101 0100 0011 0010 0001
30

Unidades de Medida
Um byte corresponde a 8 bits Capacidade de armazenamento de dados de uma memria medida em termos de bytes que ela pode guardar

Unidade

Smbolo KB MB GB TB

Nmero de Bytes 2
10

kilobyte
megabyte gigabyte

= 1024

220 (>1 milho) 230 (>1 bilho) 240 (>1 trilho)


31

terabyte

Categorias de Software
Sistema Operacional
Controla todas as atividades do computador Fornece uma interface para que o usurio interaja com o computador Gerencia recursos computacionais tais como CPU, memria, dispositivos de E/S, etc Windows , Unix, Linux, Mac OS

Aplicativos
Termo genrico para qualquer outro tipo de software Editores de texto, jogos, navegadores, sistemas de controle areo, etc

Maioria dos softwares possuem uma interface grfica (GUI)


32

Aplicativos e Sistema Operacional

Aplicativos

Sistema Operacional

Gerencia recursos do computador

CPU
33

Usurios e Sistema Operacional

CPU

Fornece uma interface para que o usurio acesse os recursos de um computador

Sistema Operacional

34

Resumindo
Componentes bsicos de um sistema computacional
Hardware

CPU
Memria Perifricos

Software
Categorias de software

35

Introduo Programao

Conceitos Bsicos de Programao

Tpicos da Aula
Antes de aprender a programar, precisamos saber o que um algoritmo
Definio de algoritmo Usando algoritmos para resolver problemas

Depois precisamos saber o que programao


Definio de Programa Linguagens de Programao Como o computador consegue entender um programa

Conceito de Algoritmo

Um algoritmo um conjunto ordenado finito de passos executveis, no ambguos , definindo um processo que tem um trmino
Um algoritmo representa a sequncia de passos necessrios para realizar uma tarefa Para realizar uma mesma tarefa podemos ter diferentes algoritmos
3

Algoritmo de Converso de Celsius para Farenheit


Um algoritmo um conjunto ordenado finito de passos executveis, no ambguos , definindo um processo que tem um trmino 1. Divida o nmero 9 pelo nmero 5 2. Multiplique o resultado do passo 1 pela temperatura em graus Celsius dada 3. Some o nmero 32 ao resultado obtido no passo 2 1. Multiplique 9 pela temperatura em graus Celsius dada 2. Divida o resultado do passo 1 por 5 3. Some o nmero 32 ao resultado obtido no passo 2

Ordem diferente dos passos Algoritmos diferentes


4

Contra-exemplo de Algoritmo
Um algoritmo um conjunto ordenado finito de passos executveis, no ambguos , definindo um processo que tem um trmino
1.Retire uma moeda do bolso e coloque sobre mesa 2.Volte ao passo 1 Processo chega ao fim quando acaba as moedas do bolso

Nenhum passo indica sobre o procedimento a ser adotado quando acaba as moedas Ambigidade
5

Algoritmo para Preparar um Bolo


Misture os ingredientes Unte forma com manteiga Despeje a mistura na forma Sim

Diferentes formas de apresentar um algoritmo


Despeje coco na mistura

Tem coco ralado?


No Deixe a forma no forno

No

Dourou? Sim Tire do forno

Pode necessitar decises ou repetir passos


6

Usando Algoritmos para resolver problemas

Deve-se transportar todos os discos da primeira haste at a ltima obedecendo as seguintes regras: 1. S pode ser deslocado um disco por vez (o do topo de uma haste) 2. Em nenhum momento um disco maior pode estar sobre um menor
7

Problema: Torre de Hanoi

Usando Algoritmos para resolver problemas


Algoritmo para torre de Hanoi com 4 discos

Algoritmo para a Torre de Hanoi com 4 Discos


1 2 3

1.Mova disco 1 para haste 2


1 2 3

Algoritmo para a Torre de Hanoi com 4 Discos


2.Mova disco 2 para haste 3

3.Mova disco 1 para haste 3

10

Algoritmo para a Torre de Hanoi com 4 Discos


4.Mova disco 3 para haste 2

5.Mova disco 1 para haste 1

11

Algoritmo para a Torre de Hanoi com 4 Discos


6.Mova disco 2 para haste 2

7.Mova disco 1 para haste 2

12

Algoritmo para a Torre de Hanoi com 4 Discos


8.Mova disco 4 para haste 3

9.Mova disco 1 para haste 3

13

Algoritmo para a Torre de Hanoi com 4 Discos


10.Mova disco 2 para haste 1

11.Mova disco 1 para haste 1

14

Algoritmo para a Torre de Hanoi com 4 Discos


12.Mova disco 3 para haste 3

13.Mova disco 1 para haste 2

15

Algoritmo para a Torre de Hanoi com 4 Discos


14.Mova disco 2 para haste 3

15.Mova disco 1 para haste 3

16

Programao de Computadores
Programao consiste no ato de indicar como o computador (hardware) deve trabalhar ou realizar servios Quais so os servios que um computador pode realizar?
Enviar mensagens eletrnicas, armazenar e recuperar dados, realizar exames e cirurgias, jogar e muito outras coisas

Para que o computador consiga realizar de fato estes servios, deve-se escrever um programa

17

Programas
Programa pode ser definido como uma srie de instrues que indicam como o computador ir realizar os servios O programa deve definir a ordem em que as instrues devem ser executadas pelo computador Um computador, geralmente, possui muitos programas, que podem estar sendo executados ao mesmo tempo Como vimos, programas constituem o grupo de softwares de um computador
Programa Software
18

Algoritmos X Programas
Algoritmo abstrato
Independe de mquina e de linguagem de programao Pode ser representado de vrias formas Pode ser feito por uma mquina ou um humano

Programa uma implementao real do algoritmo utilizando uma linguagem de programao


executado por um computador
19

Algoritmos X Programas

20

Atores e computadores

Do mesmo jeito que um ator de cinema precisa do roteiro de um filme para poder encen-lo, um computador precisa de um programa para poder realizar algum servio.

21

Roteiro de Matrix

Instrues, falas, a serem executadas pelos atores

Personagens, papis

Fonte: http://whatisthematrix.warnerbros.com

22

Roteiro de Matrix
Um roteiro pode ser executado mais de uma vez

Um ator pode exercer mais de um papel no mesmo filme, executando as instrues de cada um deles
Fonte: http://whatisthematrix.warnerbros.com

23

Roteiro de Matrix

Alm do texto em linguagem natural (ingls, portugus, etc.) o roteirista pode usar gravuras...

linguagem grfica
Fonte: http://whatisthematrix.warnerbros.com

24

Roteiro de Matrix

...o que importa que a linguagem usada pelo roteirista possa ser entendida pelos atores
Fonte: http://whatisthematrix.warnerbros.com

25

Roteiro de Matrix

O roteiro define a ordem em que as aes, falas e instrues devem acontecer...

Fonte: http://whatisthematrix.warnerbros.com

26

Roteiros e programas
As observaes sobre roteiros valem tambm para programas...
Um programa contm instrues a serem executadas por um computador Quando solicitado, um computador executa as instrues de um dado programa
O computador executa o programa

Um programa pode ser executado mais de uma vez Um programa pode se comportar de maneira diferente nas vrias execues...
dependendo do comportamento programas, hardware, etc. dos usurios, outros
27

Roteiros e programas
Um computador pode executar vrios programas ao mesmo tempo Cpias de um mesmo programa podem ser executadas em vrios computadores ao mesmo tempo Para executar um programa, o computador tem que ter uma cpia do programa
O programa tem que ser instalado ou carregado no computador

Um programa define a ordem de execuo das suas instrues pelo computador

28

Roteiros e programas

As observaes sobre roteiros valem tambm para programas...

Mas, na verdade, um roteiro pode ser visto como vrios programas, um para cada personagem, deixando claro como os personagens devem interagir.
29

Filmes e sistemas
Do mesmo jeito que a encenao de um roteiro por vrios atores gera um filme, a execuo de um ou mais programas que interagem constitui, junto com o hardware associado, um sistema computacional.
Sistema = Programas em execuo, interagindo + Hardware

30

Linguagens de Programao
Os programas tm que ser linguagem de programao:
10010010 10001110

escritos

em

uma

uma linguagem que pode ser entendida pelo computador

uma linguagem que pode ser traduzida para a linguagem entendida pelo computador a = 10; a = a + 1;

10010010 10001110

31

Sintaxe e Semntica
Uma linguagem de programao define as palavras e smbolos que se pode usar para escrever um programa Uma linguagem de programao emprega um conjunto de regras (sintaxe) que estabelece como palavras e smbolos podem ser agrupados de maneira a formar instrues vlidas de um programa

A semntica de uma instruo define o significado desta instruo no programa


Um programa que sintaticamente correto no necessariamente logicamente (semanticamente) correto
32

Nveis de Abstrao de Linguagens


Linguagens de programao variam de acordo com o seu nvel de abstrao
conhecimento da mquina onde programa ser executado nvel de abstrao conhecimento da mquina onde programa ser executado nvel de abstrao

Linguagens podem ser classificadas em 4 nveis:


Linguagem de mquina
Linguagem de montagem (assembly) Linguagem de alto nvel (Java, C, Pascal, C++, etc) Linguagem de 4 gerao (PL/SQL, NATURAL, MATLAB, etc)
33

Nveis de Abstrao de Linguagens


Cada tipo de CPU tem sua linguagem de mquina especfica
Instrues codificadas em binrio Dependente da mquina

Linguagem assembly dependente da mquina, porm utiliza palavras reservadas para codificar instrues (mnemnicos) Outros nveis so independentes de mquina e facilitam leitura e escrita dos programas por parte do ser humano
Complexidade atual de programas exigem cada vez mais o emprego destas linguagens
34

Como o computador entende um programa?


Cada tipo de CPU executa apenas uma linguagem de mquina particular
Deve-se traduzir um programa para a linguagem de mquina Um compilador um programa que traduz um programa escrito (cdigo fonte) em uma determinada linguagem de programao para outra linguagem (linguagem destino)

Se a linguagem destino for a de mquina, o programa pode, depois de compilado, ser executado

Um interpretador um programa que traduz instruo por instruo de um programa em linguagem de mquina e imediatamente executa a instruo 35

Compilao x Interpretao
Compilao
Cdigo- fonte
a = 10; a = a + 1;
Compilador

Cdigo de mquina
10010010 10001110

Interpretao
Cdigo- fonte
a = 10; a = a + 1; Interpretador

Cdigo de mquina
10010010 10001110
36

Compilao x Interpretao
Existem vrios exemplos tanto de linguagens interpretadas como de linguagens compiladas
A linguagem C um exemplo de linguagem compilada Java uma linguagem de programao que utiliza um processo hbrido de traduo
O compilador Java traduz o cdigo-fonte em um formato intermedirio independente de mquina chamado bytecode Interpretador Java especfico da mquina onde ir rodar o programa ento traduz os bytecodes para linguagem de mquina e executa o cdigo

37

Resumindo...
Conceitos Bsicos de Programao
Algoritmos Programa Linguagens de Programao Compilao x Interpretao

38

Introduo Programao

Introduo a Linguagem C
Construes Bsicas

Programa em C
#include <stdio.h> #include int main int main ( ) {

Palavras Reservadas

float celsius ; celsius E ainda float farenheit ; farenheit celsius = 30; expresses... farenheit = 9.0/5 *celsius + 32; printf (30 graus celsius = %f graus farenheit,farenheit); return 0;

Identificadores criados por terceiros (chamadas de funes)

Identificadores criados pelo programador


2

Tpicos da Aula
Hoje aprenderemos a escrever um programa em C, para isto veremos
Caractersticas da linguagem Estrutura de um programa Ciclo de construo de um programa em C

Estruturas bsicas de uma linguagem de programao


Identificadores,Variveis,Tipos de dados, Atribuio

Conceito de funes

Depois escreveremos um programa em um ambiente de programao


Apresentao de um ambiente de programao

Executando um programa

Linguagem C - Caractersticas
Linguagem de programao de finalidade geral criada por Dennis Ritchie em 1972

Criada para desenvolver o sistema operacional Unix Padronizada em 1989 pela ANSI Tornou-se muito popular

Ela faz parte das linguagens denominadas imperativas

Aes que o computador deve executar so especificadas como comandos que alteram o estado da memria
4

Linguagem C - Caractersticas
Combina o alto nvel com o baixo nvel, permitindo a manipulao direta de bits, bytes e endereos de memria Possui fluxos de controle e estruturas de dados presentes na maioria das linguagens imperativas
Agrupamento de comandos Tomadas de decises (if-else) Laos para permitir a repetio de comandos

Linguagem C - Caractersticas
Possui apenas 32 palavras-chaves (reservadas) Permite economia de expresso e gera cdigos reduzidos Possibilita alocao dinmica de memria Permite estruturar o software em mdulos, arquivos fontes, bibliotecas

Linguagem C - Crticas
D-se muita liberdade ao programador Programas ininteligveis, acesso direto memria No h verificao de tipos e nem de limites de arrays (veremos depois)
Simplifica o projeto do compilador C

Mensagens de erro muito vagas (limitao do compilador )

Estrutura de um Programa
Em C, a construo fundamental a funo:
Uma destas funes deve ser a funo main O programa inicia sua execuo na funo main Um programa constitudo de uma ou mais funes

Mas, o que uma funo?


um conjunto de instrues para realizar uma ou mais tarefas que so agrupadas em uma mesma unidade e que pode ser referenciada por um nome nico
8

Estrutura de um Programa
Dentro de uma funo pode haver:
Declaraes, expresses, chamadas de outras funes, comandos, etc

Uma funo em C pode retornar algum valor, assim


como acontece com funes matemticas
Inteiro, real, caractere, etc

Porm, uma funo no precisa necessariamente retornar um valor


Quando no retorna um valor, dizemos que a funo do tipo void
9

Estrutura de um Programa
funo 1

funo 2
. . .

funo n int main () { .


. . Comandos, declaraes, chamada de funes, etc

return 0;
}
10

Exemplo de um Programa em C
#include <stdio.h> int main() { Declarao de variavel int resultado; Expresso aritmtica resultado = 6 + 7; printf(%d,resultado); return 0 ; } Chamada de funo
Comando

11

Estrutura de uma Funo


Assinatura da funo

int multiplicacao (int p1, int p2) { int produto; produto = p1 * p2; return produto; } Uma funo deve conter:
Uma assinatura Um corpo

Corpo da funo

12

Estrutura de uma Funo


Tipo retornado Nome Lista de parmetros

int multiplicacao (int p1, int p2) { int produto; produto = p1 * p2; return produto; Parnteses obrigatrios } Assinatura de uma funo deve informar:
Tipo de valor retornado (se for o caso) Nome Lista de parmetros formais (se houver) Nome do parmetro e tipo do parmetro
13

Estrutura de uma Funo


int multiplicacao (int p1, int p2) { int produto; produto = p1 * p2; return produto; }

Corpo da funo dentro das chaves { }

Instrues devem ser separadas por ponto e vrgula (;)

Corpo de uma funo contm:

Instrues Declaraes, comandos, expresses, etc

O comando return, caso o tipo de retorno seja diferente de


void
14

Funes de Bibliotecas
A linguagem C oferece um conjunto de funes j definidas que so organizadas em bibliotecas
Programador pode utilizar (chamar) estas funes no programa Reduzem o tempo de desenvolvimento do programa

Algumas das funes oferecidas permitem:


realizar operaes de E/S manipulao de caracteres (strings) aplicaes matemticas, etc.

15

Funes de Bibliotecas
Informaes sobre as funes de bibliotecas so encontradas em vrios arquivos
header files ou arquivos com extenso .h

Para usar estas bibliotecas, o programa deve indicar os nomes dos arquivos que as contm Estas bibliotecas so adicionadas ao programa usando a diretiva de pr-processamento # include
Por exemplo: # include < stdio.h > No possui ponto_e_vrgula ( ; ) stdio.h uma biblioteca que contm funes de entrada/sada, tal como a funo printf que permite mostrar alguma mensagem no monitor 16

Outro Exemplo de Programa em C


#include <stdio.h>
Inclui a biblioteca stdio int multiplicacao (int p1, int p2) { int produto; produto = p1 * p2; return produto; Chama a funo multiplicacao }

int {

main

( )
Argumentos da funo

int resultado; resultado = multiplicacao(6,7); printf(6 vezes 7 eh %d,resultado); return 0 ; }


Chama funo da biblioteca stdio

17

Diretivas de Pr-Processamento
O pr-processador um programa que examina o programa fonte em C e executa certas modificaes com base em instrues chamadas de diretivas
Exemplos: include, define, etc

Uma diretiva deve vir precedida de #


Deve ser escrita em uma nica linha Se passar de uma linha deve-se usar a barra invertida (\) ao final da linha e contiunuar na seguinte

Diretivas no fazem parte da linguagem C


Servem para auxiliar o desenvolvimento do programa fonte
18

Exemplo da Diretiva include


#include <stdio.h>
Inclui a biblioteca stdio

int multiplicacao (int p1, int p2) { int produto; produto = p1 * p2; return produto; }

int {

main

( )

int resultado; resultado = multiplicacao(6,7); printf(6 vezes 7 eh %d,resultado); return 0 ; }


Chama funo da biblioteca stdio
19

Variveis
Programas manipulam dados (valores) e esses dados so armazenados em variveis Uma varivel uma posio na memria referenciada por um identificador (nome) Uma varivel deve ser declarada informando o tipo de dado que ela armazenar e o nome dela
tipo nome int total; int count, temp, result; Muitas variveis podem ser criadas em uma declarao
20

Variveis
Uma declarao compilador: de varivel instrui o

a reservar um espao de memria suficiente para armazenar o tipo de dado declarado o nome ao qual iremos referenciar esta posio de memria

S aps a declarao da varivel, que esta pode ser referenciada (utilizada) Quando uma varivel referenciada no programa, o valor armazenado nela utilizado
21

Variveis
Onde se declara variveis?
No corpo de uma funo (varivel local) Recomenda-se que as declaraes de variveis sejam as primeiras instrues da funo Na lista de parmetros de funes Parmetros formais Fora das funes (varivel global)

22

Declarao de Variveis
#include <stdio.h>
int resultado;

Declarao de varivel global Declarao de variveis nos parmetros formais

int multiplicacao (int p1, int p2) { int produto; Declarao de varivel local produto = p1 * p2; return produto; }

int

main () { resultado = multiplicacao(6,7); printf(6 vezes 7 eh %d,resultado); return 0 ;

23

Atribuio
Um comando de atribuio modifica o valor armazenado na varivel O operador de atribuio o sinal de =
int total; total = 55; Valor 65 sobrescreve o total = 65; valor armazenado antes Varivel total armazena valor 55

S se deve atribuir a uma varivel valores compatveis com o tipo declarado da varivel
24

Inicializao de Variveis
Uma varivel pode ser inicializada com o comando de atribuio na hora de sua declarao
Declara varivel total do tipo int int total = 55; Inicializa total com valor 55

Em C, variveis locais no so inicializadas automaticamente

25

Constantes
Uma constante um identificador semelhante a uma varivel, exceto pelo fato de s poder armazenar o mesmo valor durante toda sua existncia Uma constante declarada usando a palavra reservada const Deve-se inicializar a constante no ato da sua declarao
const float PI = 3.1416; Esse comando gera um PI = 3.141618; erro de compilao

No se pode mudar o valor de uma constante

26

Constantes
So teis para dar um significado compreensvel a determinados valores
Exemplo : PI mais compreensvel que o valor 3,1416

mais

Facilitam a manuteno do programa


Caso uma alterao no programa seja necessria que acarrete uma mudana no valor da constante e esta constante seja referenciada em vrios lugares do programa, s precisamos alterar o programa em um lugar

Explicitam formalmente que um determinado valor no pode ser alterado Evitam erros de outros programadores

27

Constantes
comum utilizar-se tambm a diretiva de prprocessamento define para definir constantes
#define PI 3.1416 int main() { float raio = 5; float area = PI*raio*raio; float comp = 2*PI*raio; return 0; } No pr-processamento, ocorre a substituio

int main() { float raio = 5; float area = 3.1416*raio*raio; float comp = 2*3.1416*raio; return 0; }

28

Linguagem C - Tipos de Dados


Cada dado possui associado a ele um tipo e pode possuir um qualificador C possui 5 tipos bsicos de dado
char: tipo caractere (tamanho de um byte) int: tipo inteiro (nmeros sem parte decimal) float: tipo ponto flutuante de preciso simples double: tipo ponto flutuante de preciso dupla void: no possui valor Mais utilizado para indicar que uma funo no retorna nenhum valor

Qualificadores: short, long, unsigned, signed


Precedem o tipo na declarao do tipo Ex: unsigned int valor ;
29

Linguagem C - Tipos de Dados


O tipo de dado define o tamanho do dado e a forma de armazenamento

Valores Inteiros e suas Representatividades


Tipo char unsigned char short int unsigned short int long int (ou int) em ambientes de 32 bits Tamanho
1 byte 1 byte 2 bytes 2 bytes 4 bytes

Representatividade
-128 a 127 0 a 255 -32768 a 32767 0 a 65535 -2147483648 a 2147483647

unsigned long int

4 bytes

0 a 4294967295

30

Linguagem C - Tipos de Dados


Valores Reais e suas Representatividades
Tipo float double long double Tamanho
4 bytes 8 bytes 10 bytes

Representatividade
3.4 X10-38 a 3.4 X1038 1.7 X 10-308 a 1.7X10308 3.4 X 10-4932 a 3.4X104932

31

Tipos de Dados Numricos


Nmeros com e sem sinal
C permite que o programador defina se uma varivel de tipo numrico deva ou no reservar o bit de sinal (nmeros negativos) Notao signed tipo unsigned tipo Se nenhum modificador for indicado, o compilador C reservar o bit de sinal

32

Tipo de Dados Caractere


Representado pelo tipo char
a,b 1, \n etc , internamente representa um cdigo da tabela ASCII

ASCII: na verdade aceita at 255 caracteres (unsigned char)


char letra = A; char letra = 65;

Instruo equivalente

33

Identificadores
Identificadores so palavras que programador utiliza em programas Consiste de um ou mais caracteres. o

o primeiro caractere deve ser letra ou "_ demais so uma combinao de letras, nmeros e "_" Identificadores no podem comear com um dgito
Exemplo de identificadores vlidos: _a, a3_,bom_dia Exemplo de identificadores invlidos: 2a, a-b, a_ b

C case-sensitive
Os identificadores casa e CASA so diferentes
34

Identificadores
Identificadores podem ser:
Nomes que o programador escolheu
Exemplo: nome de uma varivel, funo, constante, etc

Nomes que terceiros escolheram


Exemplo: nome de uma funo de uma biblioteca utilizada

Palavras reservadas da linguagem


No podem ser usadas de outra forma Exemplo: main, const, int, etc

35

Identificadores em C
#include <stdio.h> #include int main int main ( ) {

Palavras Reservadas

float celsius ; celsius E ainda float farenheit ; farenheit celsius = 30; expresses... farenheit = 9.0/5 *celsius + 32; printf (30 graus celsius = %f graus farenheit,farenheit); return 0;

Identificadores criados por terceiros (chamadas de funes)

Identificadores criados pelo programador


36

Executando de um Programa em C
Escrever o programa em um arquivo texto (cdigo fonte)
Salvar o arquivo com a extenso .c

Compilar o programa fonte para gerar o cdigo executvel (*.exe)


Um programa em C pode ser composto de vrios cdigos fontes (vrios arquivos .c) comum a gerao de um cdigo objeto (*.obj ou *.o) para cada cdigo fonte e a posterior gerao do cdigo executvel (linkedio)
37

Construo de Programas em C
Editor Codigo, Palavras reservadas Programa fonte Programa Fonte Modificado

Edio

Programa Fonte

Prprocessador

Pr-processamento

Programa Fonte

Compilador

Programa Objeto

Compilao Link-Edio
38

Programas Objeto

Programa Executvel

Adio /Localizao de cdigos objetos das bibliotecas

Ambiente de Programao
Para acelerar o desenvolvimento de programas, comum utilizar ambientes de programao ou IDEs (Integrated Development Environment)
Integra vrias ferramentas em um nico ambiente Editores de texto Compiladores Bibliotecas E muito mais ... CodeBlocks, DevC++, Visual Studio, Eclipse etc

39

Resumindo ...
Caractersticas da linguagem Estrutura de um programa Ciclo de construo de um programa em C Estruturas bsicas de uma linguagem de programao
Identificadores,Variveis,Tipos de dados, Atribuio

Conceito de funes

40

Introduo Programao

Operadores, Expresses Aritmticas e Entrada/Sada de Dados

Programa em C
#include <stdio.h> #include main int main ( ) {

Palavras Reservadas

float celsius ; celsius E ainda float farenheit ; farenheit expresses celsius = 30; aritmticas... farenheit = 9.0/5 *celsius + 32; printf (30 graus celsius = %f graus farenheit,farenheit);

Identificadores criados por terceiros (chamadas de funes)

Identificadores criados pelo programador


2

Tpicos da Aula
Hoje aprenderemos a escrever um programa em C que pode realizar clculos
Conceito de expresso Tipos de Operadores em C Operador de atribuio Operadores aritmticos Operadores especiais

Depois aprenderemos como utilizar funes entrada/sada para escrever um programa


Funes de entrada Funes de sada

de

Expresses
Uma expresso uma combinao de um ou mais operadores e operandos que geralmente realiza um clculo A avaliao ou clculo da expresso se faz obedecendo regras de associao e precedncia estabelecidas na linguagem
int total = 3 + 4/2 ; Diviso (/ ) tem precedncia sobre soma (+) Expresso avaliada e o resultado atribudo a total que armazena agora o valor 5

O valor calculado pode no ser necessariamente um nmero Pode ser um caractere, cadeia de caracteres, etc
4

Operadores em C
Categorias de operadores em C Atribuio Hoje veremos estes Aritmticos 3 tipos de Especiais operadores Relacionais Lgicos

Operador de Atribuio
Operador de Atribuio
Pode ser usado em qualquer expresso vlida em C Representado por = Forma geral: <nome_da_varivel> = <expresso> ; Ex.: x = 5 ; Ao executada da direita para a esquerda

5 5
6

Operador de Atribuio
Atribuio (Cont.)
usado para atribuir valores s variveis No igual ao operador = de matemtica 5 = a no faz sentido em C! Valor da expresso armazenado fisicamente em <nome_da_varivel> Mltiplas atribuies Ex: x = y = z = 0

0
7

Operadores Aritmticos
Operadores aritmticos unrios Um s operando operador operando Sinal ++ Ao Troca de sinal Incremento de 1 Precedncia 1 1

--

Decremento de 1

1
8

Ex.: -(a)

Operadores Aritmticos
Operadores aritmticos binrios
Dois operandos operando operador operando

Sinal + * / %

Ao Adio Subtrao Multiplicao Diviso Resto da Diviso (s para inteiros)

Precedncia 3 3 2 2 2
9

Operadores de Incremento e Decremento


Operadores de incremento e decremento so operadores unrios (usam um s operando) O operador de incremento (++) soma 1 ao seu operando O operador de decremento (--) subtrai 1 de seu operando

A instruo
contador++; funcionalmente equivalente a contador = contador + 1;
10

Operadores de Incremento e Decremento


Estes operadores podem ser empregados de forma ps-fixada ou pr-fixada contador++; ou ++ contador;

Quando isolados equivalentes

tm

comportamentos

Quando fazem parte de expresses maiores, eles podem ter comportamentos diferentes
11

Operadores de Incremento e Decremento


Pr-fixado : ++a ou --a
Incrementa (decrementa) de 1 o valor de a. Se aparece em uma expresso, o valor incrementado (decrementado) antes do clculo da expresso

Pr:

int soma = ++a


65 a + 2

+ b
= 8

soma
12

Operadores de Incremento e Decremento


Ps-fixado: a++ ou a-Incrementa (decrementa) de 1 o valor de a. Se aparece em uma expresso, o valor incrementado (decrementado) aps o clculo da expresso Ps: int soma = ( a++) + b 65 a

2 b

7 soma
13

Operadores de Incremento e Decremento


Devem ser utilizadas com cuidado em expresses maiores!
int contador contador++; = 3; contador agora armazena 4 contador agora armazena 5 valor agora armazena 5 e
depois contador incrementado para 6

++contador;
int valor

= contador++;

valor

= ++ contador;

contador incrementado
para 7 e agora valor armazena 7

14

Diviso e Resto da Diviso


Se ambos operandos da expresso aritmtica forem valores inteiros, o resultado ser um inteiro (a parte decimal ser descartada) Portanto 14/3 8/12 14%3 8%12
4 0 2 8
15

Operadores Aritmticos de Atribuio


comum fazermos algum tipo de operao com uma varivel e depois armazenar o valor da operao na prpria varivel
Operadores aritmticos de atribuio facilitam codificao de expresses do tipo a = a op b Forma geral variavel op = expresso

x += 1; x -= 2; x *= k;

x = x + 1; x = x - 2; x = x * k;

x /= 3;
x %= 3;

x = x / 3;
x = x % 3;
16

Expresses Aritmticas
Uma expresso aritmtica computa resultados numricos e utiliza operadores aritmticos combinados com operandos numricos
Variveis, constantes, funes numricas Ordem de precedncia Operadores unrios (- , -- , ++ ) e Funes Multiplicao ( *), Diviso ( / ) e Mdulo (% ) Adio ( + ) e Subtrao ( - ) Comandos Equivalentes a = a + 1; a += 1 ; a++ ; ++a ;

17

Operadores Aritmticos
Quais sero os valores das variveis declaradas aps a avaliao das expresses abaixo?
int a , r ; double b , c ; a = 3.5 ; b = a / 2.0 ; c = 1/2 + b ; r = 10 % a ; a=3 b=1.5 c=1.5 e r=1
18

Atribuio de Expresses aritmticas


Numa atribuio, a expresso aritmtica avaliada primeiro, para depois se atribuir o resultado da expresso varivel
Primeiro, a expresso do lado direito do operador = avaliado

answer

=
4

sum / 4 + MAX * lowest;


1 3 2

Depois, o resultado armazenado na varivel


19

Atribuio de Expresses aritmticas


O lado direito e esquerdo de um comando de atribuio podem conter a mesma varivel
int contador = 3;

Primeiro, 1 adicionado ao valor original de contador contador = contador + 1;

Depois o resultado armazenado em contador (sobrescrevendo o seu valor original)


20

Operadores Especiais
O operador & utilizado para se obter o endereo da memria que a varivel representa
Forma geral &varivel

Um endereo de memria visto como um nmero inteiro sem sinal

21

Converso de Tipos
Existem converses automticas de valores em uma avaliao de uma expresso quando operandos possuem tipos diferentes

Operando de tipo de menor tamanho convertido automaticamente para o tipo de maior tamanho Converso feita em rea temporria da memria antes da avaliao da expresso Resultado novamente convertido para o tipo da varivel a esquerda da atribuio
1. O inteiro 3 convertido para real

int a

3/2.0 + 0.5;
2. Expresso avaliada como 2.0,

3. Valor convertido para um inteiro e atribudo a varivel

Valor de a 2

22

Operadores Especiais (Cast)


Algumas vezes a converso automtica d resultados no desejados Devemos ento usar o operador de cast

Forma geral (tipo desejado) varivel ou (tipo desejado) (expresso) Armazenamento de um valor real em um tipo de dado inteiro gera erro ou perde-se preciso

int a = 3/2 + 0.5; printf("a = %d",a);

Usando cast
int a = ((float)3)/2 +0.5; printf("a = %d",a);

a=1

a=2

23

Entrada de Dados
A funo scanf
Usada para a entrada formatada de dados Para cadeia de caracteres, a leitura feita at o primeiro espao em branco, ou o return, ou o tab. Est definida na biblioteca stdio.h

Forma Geral: Tem duas partes:


scanf (expresso de controle, lista de argumentos) Expresso de controle Cdigos de formatao, precedidos por %

24

Entrada de Dados
Cdigos de Formatao

Cdigo
%c %d %u %f %e %g %lf %le %lg %l %s

Funo
ler um nico caractere ler um nmero inteiro ler um inteiro sem sinal ler um nmero real (tipo float) ler um nmero real (tipo double) ler um inteiro longo ler uma cadeia de caracteres
25

Entrada de Dados
Lista de Argumentos Cada cdigo de formatao deve corresponder a uma varivel de entrada, que deve ser representada com o operador de endereo Operador de Endereo Utilizado para permitir que o dado lido do dispositivo de entrada seja armazenado na varivel correspondente. Ele retorna o endereo da varivel.

int a ; &a endereo da varivel a scanf ( % d , &a ) ;


26

Entrada de Dados
Exemplo:
int main() { char a, b, c ; int n ; double x ; scanf (%c%c%c%d%lf ,&a,&b,&c,&n,&x); }

27

Entrada de Dados
#include stdio.h int main ( ) /* ler um valor numrico */ { float a; scanf(%f,&a); 15.2 ..... } a
15.2
28

Sada de Dados
A Funo printf
Permite a impresso formatada de nmeros e cadeias de caracteres

Forma Geral
printf(estruturas de controle, lista de parmetros) Estruturas de Controle Caracteres especiais Cdigos de formatao precedidos por %

29

Sada de Dados
Formato %c %d %u %e %E %f %g %G %s %% Significado caracter inteiro inteiro sem sinal notao cientfica com e (7.12300e+00) notao cientfica com E (7.12300E+00) ponto flutuante decimal (7.12300) escolhe %e ou %f ,o menor dos 2 formatos escolhe %E ou %f ,o menor dos 2 formatos cadeia de caracteres imprime o caracter %
30

Exemplo E/S de Dados


Escreva um programa em C para ler 2 valores para as variveis A e B, efetuar a troca dos valores de forma que a varivel A passe a possuir o valor da varivel B e que a varivel B passe a possuir o valor da varivel A. Apresentar os valores trocados.

31

Exemplo E/S de Dados


#include stdio.h int main( ){ int a , b, aux; printf (\nTroca de valores entre variveis\n); printf (\nEntre com o valor de A: ); scanf (%d, &a ); printf (\nEntre com o valor de B: ) ; scanf (%d, &b ); aux = a ; a = b ; b = aux ; printf (A varivel A agora vale: %d, a ) ; printf ( \n) ; printf ( A varivel B agora vale: %d, b ) ; }
32

Resumindo ...
Conceito de expresso Tipos de Operadores em C Operador de atribuio Operadores aritmticos Operadores especiais

Entrada/Sada
Funes de entrada Funes de sada

33

Introduo Programao

Expresses Booleanas e Comandos Condicionais

Comandos Condicionais
Misture os ingredientes Unte forma com manteiga Despeje a mistura na forma Sim

Algoritmo para preparao de bolo

Tem coco ralado?


Deixe a forma no forno

Despeje coco na mistura

Instruo executada se uma determinada condio for verdadeira

Comandos Condicionais
2

Tpicos da Aula
Hoje vamos acrescentar comportamentos mais complexos a programas
Tomada de deciso e Mudana de fluxo de controle Expresses booleanas (lgicas) Comandos Condicionais if-else switch Operador condicional

Instrues de Controle
Toda linguagem de programao precisa oferecer pelo menos trs formas bsicas de controle:
executar uma sequncia de instrues realizar testes para decidir entre alternativas repetir uma sequncia de instrues
Hoje, aprenderemos a realizar testes para decidir quais instrues executar
4

aes

Modificando Fluxo de Controle


A ordem de execuo de um programa denominado fluxo de controle Exceto quando especificado de outra forma, a ordem de execuo linear, isto uma instruo aps a outra em seqencia Alguns comandos em programao nos permitem: Decidir se a execuo de uma instruo deve ou no ser feita til para que certas instrues s sejam executadas sob determinadas condies Esta tomada de deciso baseada em expresses booleanas
5

Expresso Booleana
O resultado da avaliao de uma expresso booleana ou verdadeiro ou falso
Em C, NO existe o tipo de dado boolean Verdadeiro representado como 1 Falso representado como 0

Uma expresso booleana composta de operandos booleanos (lgicos) e operadores relacionais e/ou lgicos
6

Operadores Relacionais
So usados para fazer comparaes
Operador < > <= Ao menor que maior que menor ou igual que Resultado de Comparao

Falso ou Verdadeiro
4 < 5 verdadeiro ( valor 1) 3 >= 10 falso (valor 0)

>=
== !=

maior ou igual que


igual a diferente de

Operadores Lgicos (Booleanos)


So usados para combinar comparaes
Operam sobre valores booleanos (0 ou 1)
Operador && || Ao E Ou

Negao

Resultado da Avaliao int a , b ; int c = 23 ; int d = 27 ; a = ( c < 20 ) || ( d > c ) ; b = (c < 20 ) && ( d< c ) ;

Qual ser o valor de a e b? a = 1 b = 0


8

Expresses Booleanas
Operadores lgicos e expresses:
x && y x || y !x Operandos da direita s so avaliados, se necessrio Existem os operadores bit a bit & e I As expresses resultantes x e y so so booleanas, gerando expresses verdadeiro (1) ou falso (0) booleanas como resultado da avaliao 9

Operadores && e || so ditos short-circuited

Tabela Verdade
Uma tabela verdade contm combinaes verdadeiro-falso expresso booleana
a verdadeiro verdadeiro falso falso b verdadeiro falso verdadeiro falso a && b verdadeiro falso falso falso a || b verdadeiro verdadeiro verdadeiro falso

todas as de uma
!a falso falso verdadeiro verdadeiro

10

Expresses Booleanas
Exemplos 3 < 4 && 5 > 2 v v

! (3 > 7) f

v
5< 4 f v || 7>2 v

v
! (7 >= 10) f v
11

Expresses Booleanas

... int b = c = c = b = ...

b, c; 1; !b; !(1 || b) && c; c || !(!b);

Parnteses so usados para evitar ambigidades

}
1 (verdadeiro)

Qual o valor de b neste ponto?


12

Expresses Booleanas

int b, c; b = 1 || 0; c = 1 && b; b = b == c; 1 (verdadeiro)


13

Qual o valor de b aqui?

Comandos Condicionais
Um comando condicional nos permite escolher qual deve ser a prxima instruo executada em um programa A execuo de uma determinada instruo depende de uma condio (expresso booleana) A linguagem C oferece 3 tipos de comandos condicionais:
if else switch comando ternrio
14

O comando if-else

if (expressaoBooleana) { comandos } else { outros comandos }

Se a avaliao de expressaoBooleana retornar verdadeiro, comandos so executados , caso contrrio, executa-se outros comandos
15

Exemplo do if-else
#include <stdio.h> int main ( ) { float n1, n2, n3, m; printf (\nEntre com 3 notas ) ; scanf (%f %f %f, &n1, &n2, &n3); m = (n1 + n2 + n3 ) / 3 ; if (m >= 7.0) { printf (\n Aluno aprovado. ) ; printf ( Mdia igual a %f , m) ; }else { printf (\n Aluno reprovado. ); printf ( Mdia igual a %f , m) ; } return 0; }

16

Variaes do comando if-else


if (expressaoBooleana) { comandos } if (expressaoBooleana) comando;

Se a avaliao da expresso retornar falso, no executa-se nada


O uso do bloco s necessrio caso queira-se executar mais de um comando
17

if (expressaoBooleana) comando; else outroComando;

Exemplo if sem else


#include <stdio.h> int main ( ) { int resposta ; printf (\n Qual o valor de 10 + 14? ); scanf (%d, &resposta); if (resposta == 10 + 14) printf (\n Resposta correta ! ); return 0; }

else no obrigatrio

18

#include <stdio.h> int main ( ) { int num ; printf (\nDigite um nmero: ); scanf (%d, &num); if (num < 0) printf (\n Nmero negativo ! ); else printf (\n Nmero positivo ! ); return 0; }

Exemplo if-else com nico comando

19

Aninhando if-else
if (expressaoBooleana) if (expressaoBooleana) comando; else outroComando;

if-else aninhado

O comando dentro do if ou else pode ser outro if

Num aninhamento, o else associado ao mais recente if sem else


20

Exemplo if-else Aninhado


Exerccio: O que est errado neste programa?
#include <stdio.h > int main () { int temp ; printf (\n Digite a temperatura: ) ; scanf (%d, &temp) ; if (temp < 30) if (temp > 20) printf (\n Temperatura agradvel ) ; else printf (\n Temperatura muito quente ) ; return 0 ; }
21

Exemplo if-else Aninhado


Exerccio: Corrigindo o programa
#include <stdio.h > int main () { int temp ; printf (\n Digite a temperatura: ) ; scanf (%d, &temp) ; if (temp < 30) { if (temp > 20) printf (\n Temperatura agradvel ) ; } else printf (\n Temperatura muito quente ) ; return 0 ; }
22

else associado ao if certo

Encadeando comandos if-else

if (expressaoBooleana) { comandos } else if (expressaoBooleana) { comandos } else { comandos }

23

Tomando Mltiplas Decises


O comando if-else til para a escolha de uma entre duas alternativas Quando mais de duas alternativas so necessrias, pode ficar deselegante utilizar vrios if-else encadeados
Para estes casos o comando switch pode ser a melhor opo

24

O Comando switch
switch(expressao) { Para executar um switch case rotulo1: Avalia-se expressao Comandos1 break; Executa-se os comandos case rotulo2: do case cujo rtulo igual ao valor resultante Comandos2 da expresso break; ... Executa-se os comandos default: de default caso o valor Comandos resultante no seja igual a } nenhum rtulo

Restries do Comando switch


switch(expressao) { case rotulo1: Comandos1 break; case rotulo2: Comandos2 break; ... default: Comandos }

O tipo de expressao s pode ser :


Inteiro ou caractere

Os rtulos so constantes diferentes Existe no mximo uma clusula default ( opcional) Os tipos dos rtulos tm que ser o mesmo de expressao

Variaes do Comando switch


switch(expressao) { case rotulo1: Comandos1 break; case rotulo2: Comandos2 break; ... default: Comandos }

Vrios rtulos podem estar associados ao mesmo comando Os comandos break so opcionais:
Sem o break a execuo dos comandos de um rtulo continua nos comandos do prximo, at chegar ao final ou a um break

Exemplo de switch
Calcular a diferena, o produto, o quociente ou a soma de dois nmeros, dependendo da operao escolhida e imprimir o resultado.
# include stdio.h int main () { char x; float a, b ; float result = 0.0; printf (\n Informe os 2 nmeros e a operao ); scanf (%f %f %c, &a, &b, &x);

28

Exemplo de switch (cont..)


switch (x) { case +: result = a + b; break; case -: result = a - b; break; case *: result = a * b; break; case /: result = a / b; break; default : printf(\nOperador invalido);

} printf (\nResultado igual a %f , result); return 0 ; }


29

Operador Condicional - ?
Forma Geral do ?
condio ? expresso1 : expresso2

Substitui construes do tipo:


if ( a > b ) { maximo = a; } maximo = else { maximo = b; }

a > b ? a: b;

30

Comando Ternrio de Deciso - ?


Exerccio: Considere as seguintes declaraes
char a = a, b = b ;/* b tem valor 98*/ int i = 1, j = 2 ; double x = 7.07 ;

Expresso i == j ? a - 1 : b + 1
j % 3 == 0 ? i + 4 : x j>1? j -1: j+1

Valor
c 7.07 1 5
31

j % 3 != 0 ? i + 4 : x

Resumindo ...
Necessidade de Mecanismos de Tomadas de Deciso em um Programa Mudana de Fluxo de Controle Expresses Booleanas Comandos Condicionais em C
if-else switch Operador Condicional

32

Introduo Programao

Funes e Escopo de Variveis

Funes em C

Funes constituem programas em C


2

Tpicos da Aula
Hoje vamos detalhar funes em C
Importncia

Escrevendo funes
Comando return Passagem de argumentos por valor

Execuo de uma funo

Depois iremos discutir o escopo de variveis


Conceito de escopo

Diferentes tipos de variveis


Local, global e esttica
3

Importncia de Funes para Desenvolver Programas


Desenvolvimento de uma soluo se torna mais fcil

quando

quebramos

esta

soluo

em

mdulos

gerenciveis Quando estamos programando, podemos desenvolver

mdulos separados, onde cada um responsvel por


uma certa parte da soluo
Programao Modular

Em C, um mdulo pode representado por uma funo ou um grupo de funes logicamente relacionadas
4

Funes em C
Relembrando...
Uma funo um conjunto de instrues para realizar uma ou mais tarefas que so agrupadas em uma mesma unidade e que pode ser referenciada por um nome nico
Permitem a construo de programas constitudos de mdulos independentes So trechos de programas que podem ser ativados Pelo programa principal (funo main) Por outra funo
5

Estrutura de uma Funo


Tipo retornado Nome Lista de parmetros (pode ser vazia)

int multiplicacao (int p1, int p2) { int produto; Corpo da produto = p1 * p2; funo return produto; }

Omitindo o Tipo Retornado

multiplicacao (int p1, int p2) { int produto; produto = p1 * p2; return produto; }

Em C, caso o tipo retornado seja omitido, o compilador assume que a funo retorna o tipo int
7

Omitindo o Tipo Retornado


multiplicacaoReal (float p1, float p2) { float produto; produto = p1 * p2; return produto; }

No vai retornar uma multiplicao de nmeros reais!

Evitar omitir tipo retornado dificulta entendimento


8

Retorno de uma Funo


Uma funo em C pode retornar algum valor, assim como acontece com funes matemticas
Inteiro, real, caractere, etc

Porm, uma funo no precisa necessariamente retornar um valor


Quando no retorna um valor, dizemos que a funo do tipo void

Funes que Retornam Valores

int segundos(int hora, int min) { return 60 *(min + hora*60); }


double porcetagem(double val,double tx) { double valor = val*tx/100; return valor; }

Funes que retornam valores como resultado usam o comando return


10

Comando return
return expresso

Uma funo que no tem valor para retornar tem o tipo de retorno void
Neste caso, o uso do comando return opcional
void imprimir(int valor) { printf(%d,valor); return; Pode ser omitido }

Para executar este comando o computador:


avalia expresso, obtendo um valor devolve este valor como resultado, terminando a execuo da funo no qual ele se encontra
11

Consideraes sobre Funes


Uma definio de uma funo especifica a seqncia de instrues que sero executadas (fluxo de controle) quando esta funo for chamada (invocada) Quando uma funo chamada, o fluxo de controle do programa pula para a funo e executa o cdigo que est nela

12

Consideraes sobre Funes


Quando a funo termina de ser executada, o fluxo de controle do programa volta para a instruo logo aps a chamada da funo Uma chamada a uma funo pode ou no retornar um valor
Depende da definio da funo

13

Fluxo de Controle de uma Funo


Programa
main minhaFuncao

minhaFuncao();

14

Fluxo de Controle de uma Funo


Programa
main minhaFuncao outraFuncao

minhaFuncao();

outraFuncao();

15

Parmetros e argumentos
Os parmetros so nomes que aparecem na declarao de uma funo
void imprimir(int valor) Os argumentos so expresses que aparecem na expresso de invocao da funo

imprimir(10);
16

Parmetros de uma Funo


Quando uma funo chamada por outra, os argumentos da chamada so copiados para os parmetros (formais) presentes no assinatura da funo
int main() { float valor = media (30,40); }

float media (float num1, float num2) { float result = (num1 + num2)/2; return result; }
17

Passagem de Argumentos

C permite a passagem de argumento por valor: o valor da expresso avaliado primeiro e depois passado para a funo chamada

18

Passagem de Argumento por Valor


void incrementa(int x) x = x + 1; printf(%d,x); } {
Comunicao de dados entre funes feita atravs de passagem de argumentos

no altera o valor de y

int main() { int y = 1; printf(%d,y); sada:1 incrementa(y); sada:2 printf(%d,y); sada:1 ... }

19

Ordem de Definio das Funes


Onde uma funo deve ser definida?

Antes da funo main OU Depois da funo main desde que se declare sua assinatura antes da main

20

Definindo a Funo Antes da main


#include <stdio.h> int segundos(int hora, int min) { return 60 *(min + hora*60); } Definio antes da main

int main() { int minutos,hora, seg ; printf(Digite a hora:minutos\n); scanf (%d:%d,&hora,&minutos) ; seg = segundos(hora,minutos); printf(\n%d:%d tem %d segundos.,hora,minutos,seg); return 0 ; }

21

Definindo a Funo Depois da main


#include <stdio.h> int segundos(int hora, int min);

int main() { int minutos,hora, seg ; printf(Digite a hora:minutos\n); scanf (%d:%d,&hora,&minutos) ; seg = segundos(hora,minutos); printf(\n%d:%d tem %d segundos.,hora,minutos,seg); return 0 ; } Definio depois da main int segundos(int hora, int min) { return 60 *(min + horas*60); }

Deve-se declarar antes a assinatura da funo Modo alternativo int segundos (int,int)

22

Escopo de Variveis
O escopo de uma varivel define a rea do programa onde esta varivel pode ser referenciada

Variveis que so declaradas fora das funes


(inclusive da funo main), podem ser referenciadas por todas as funes do programa
So chamadas de variveis globais

Variveis que so declaradas dentro de uma funo s podem ser referenciadas dentro desta funo
So chamadas de variveis locais
23

Escopo de Variveis
Pode existir uma varivel local a uma funo com mesmo nome e tipo de uma varivel global, neste caso ao se referir ao nome da varivel dentro da funo, estar-se- acessando a varivel local
#include <stdio.h>

int

numero = 10;
Declarao de varivel local Referncia varivel local

int main(){ int numero = 4; }

printf(%d,numero);
Ser impresso o valor 4

24

Variveis Globais
Podem ser usadas em qualquer parte do cdigo
Se no inicializadas explicitamente, inicializa com valores padres
0 para tipos numricos

Existem durante todo o ciclo de vida do programa (ocupando memria)

25

Variveis Globais
Normalmente so declaradas no incio do
programa ou em arquivos do tipo header (*.h) So declaradas uma nica vez

Deve-se evitar o uso abusivo delas


Pode penalizar o consumo de memria Pode dificultar a legibilidade do cdigo

26

Uso de Variveis Globais


#include <stdio.h> int minutos,hora; Todas as funes enxergam as variveis minutos e hora Comunicao de dados entre funes agora feita atravs de variveis globais

int segundos() { return 60 *(minutos + horas*60); }

int main() { int seg ; printf(Digite a hora:minutos\n); scanf (%d:%d,&hora,&minutos) ; seg = segundos(); printf(\n%d:%d tem %d segundos.,hora,minutos,seg); return 0 ; }

27

Variveis Locais
Tm a mesma capacidade de armazenamento que as variveis globais mas
So declaradas dentro de uma funo S existem durante a execuo da funo
No ocupam a memria durante toda a execuo do programa

No so inicializadas automaticamente S so visveis dentro da funo


Outras funes no podem referenci-las

28

Variveis Locais
Caso uma funo declare uma varivel local, esta criada a cada execuo da funo
int funcao( ) { int a= 100; a = a + 23; return a; } Sempre retorna 123

29

Modificador static
Caso a varivel local venha com o modificador static, a varivel criada uma nica vez
Armazena seu valor em vrias execues da mesma funo Evita uso de variveis globais
int funcao( ) { static int a= 100; a = a + 23; return a;
} 2 vez retorna 146

Inicializa apenas uma vez


1 vez que funo for chamada retorna 123

30

Armazenamento das Variveis


Onde so armazenados na memria os diferentes tipos de variveis?
Cdigo do programa Variveis Globais e Estticas Quando acaba a execuo da funo, espao ocupado pelas suas variveis liberado Pilha de execuo armazena variveis locais das funes

Pilha de execuo de funes


Memria livre
31

Pilha de Execuo de Funes


Considere o seguinte cdigo:
#include <stdio.h> int segundos(int hora, int min) { int seg; seg = 60 *(min + hora*60); return seg; } int main() { int minutos = 30,hora = 1, seg ; seg = segundos(hora,minutos); printf(\n%d:%d tem %d segundos.,hora,minutos,seg); return 0 ; }
32

Pilha de Execuo de Funes


1 Incio do programa: pilha vazia

2 Declarao de variveis: minutos, hora,seg

3 Chamada da funo: cpia do argumento


min hora seg hora minutos

<main

seg hora minutos

1 30

<main

30 1 1 30

<segundos <main

4 Declarao da varivel local: seg


seg min hora seg hora minutos 30 1 1 30 <segundos

5 Final da avaliao da expresso


seg min hora seg hora minutos 4500 30 1 1 30

6 Retorno da funo: desempilha

<main

<segundos seg hora minutos <main

4500 1 30

<main 33

Macros Semelhantes a Funes


Pr-processador e Macros
Diretiva de Definio com Parmetros So chamadas de Macros Exemplo

define MAX(a,b) ((a) > (b) ? (a):(b)) int main() { float v = 4.5 ; float c = MAX(v,3.0) ;

O compilador ver:
int main() { float v = 4.5 ; float c = ((v)>(3.0)?(v):(3.0)) ;

34

Macros Semelhantes a Funes


Pr-processador e Macros
Macros definidas incorretamente Uso de macros deve ser feito com cautela!

#define DIF(a,b) a - b int main(){ printf(%d,4 * DIF(5,3)); return 0 ; }

Sada 17 e no 8

#define PROD(a,b)( a * b ) int main(){ printf(%d,PROD(3 + 4,2)); Sada 11 e no 14 return 0; }


35

Resumindo ...
Funes Importncia

Escrevendo funes
Comando return Passagem de argumentos por valor

Execuo de uma funo

Escopo de variveis
Conceito de escopo

Diferentes tipos de variveis


Local, global, esttica
36

Introduo Programao

Estruturas de Repetio

Repetio de Comandos

i
i 0
int somatorio(int n) { int soma = 0; int i = 0; soma = soma + i; i++; soma = soma + i; i++; soma = soma + i; ... }

Faz esta seqncia de comandos n vezes

E haja

copy&paste!
2

Tpicos da Aula
Hoje, aprenderemos a usar estruturas de repetio para programas mais complexos
Necessidade de estruturas de repetio Apresentao do conceito de lao (loop) O comando for O comando while

O comando do-while
Diferenas entre os comandos de repetio

Veremos tambm, como podemos alterar o fluxo de laos


Comandos break e continue
3

Necessidade de Estruturas de Repetio


Na resoluo de problemas em programao, uma mesma freqentemente, precisamos repetir

seqncia de comandos vrias vezes


Na maioria dos casos, no sabemos de antemo quantas vezes a seqncia de comandos ser repetida

A linguagem de programao deve fornecer uma


estrutura (comando) que permita a execuo repetida de mesma seqncia de comandos
Evita esforo do programador Permite que o programador no tenha que saber quantas vezes o comando ser executado
4

Estruturas de Repetio
Permite repetir diversas vezes um comando ou seqncia de comandos
Cada repetio de um comando ou seqncia de comandos denominada de iterao

So geralmente conhecidos como loops(laos) Da mesma forma que comandos condicionais, so controladas por expresses booleanas C oferece 3 tipos de estruturas(comandos) de repetio:
O lao for O lao while O lao do-while
5

O Comando for
for (i = 0; i < valor; i = i+1) corpo
Executa corpo um nmero especfico de vezes: valor vezes Neste exemplo, na primeira execuo de corpo, o valor de i 0 O valor de i incrementado aps cada execuo de corpo Varivel i deve ser declarada antes de se utilizar o comando for
Varivel de controle
6

A Forma Geral do Comando for


for(inicializao;condio;incremento) corpo
inicializao e incremento praticamente quaisquer comandos inicializao geralmente de controle do for podem ser

condio pode ser qualquer expresso booleana inicializa a varivel

incremento geralmente incrementa a varivel for


7

Fluxo de Controle do Lao for


inicializao condio avaliada

true
comando incremento

false

Examinando o Comando for

A inicializao executada uma s vez antes do lao comear

O comando executado enquanto condio for verdadeira

for ( inicializao ; condio ; incremento ) comando; O incremento executado ao fim de cada iterao

Cabealho do for
9

Entendendo o Comando for


Varivel valor inicializada com 0

int somatorio(int n) { int valor; int soma = 0; for (valor = 0; valor <= n; valor++) soma = soma + valor; return soma; }
Comando ser realizado enquanto valor for menor ou igual a n

A cada iterao, valor incrementado em 1


10

Entendendo o Comando for


Se n for menor do que 0, no se executa o corpo do for

int somatorio(int n) { int valor; int soma = 0; for (valor = 0; valor <= n; valor++) soma = soma + valor; return soma; }
executado depois do for
11

Entendendo o Comando for


int somatorio(int n) { int soma = 0; int valor; for (valor = 0; valor <= n; valor++){ soma = soma + valor; printf(Soma Parcial:%d\n,soma); } printf(Soma Total:%d,soma); Corpo do for return soma; pode ser } composto por
bloco de comandos

12

Modificando o Incremento do for


int somatorio(int n) { int soma = 0; int valor; for (valor = n; valor>= 0; valor--){ soma = soma + valor; printf(Soma Parcial:%d\n,soma); } printf(Soma Total:%d,soma); return soma; }
valor agora decrementado

13

Modificando o Incremento do for


int somatorioPares(int n) { int soma = 0; int valor; for (valor = 0; valor <= n; valor = valor + 2){ soma = soma + valor; printf(Soma Parcial:%d\n,soma); } printf(Soma Total:%d,soma) valor agora return soma; incrementado } em 2

Pode-se colocar qualquer tipo de expresso na parte de incremento do comando for


14

Variaes do Comando for


Cada expresso no cabealho de um lao for loop opcional Se a inicializao omitida, nenhuma inicializao feita Se a condio omitida, a condio considerada sempre verdadeira e o lao continua para sempre (lao infinito) Se o incremento omitido, nenhuma operao realizada ao final da iterao do lao

15

O Comando for sem Condio, etc.


for(;valor < n; valor++) corpo for(;;valor++) corpo for(;;) corpo
Repetio infinita: cuidado!

16

Mais Variaes do Comando for


Teste condicional no precisa ser baseado na varivel de controle #include <stdio.h> #include <conio.h> int main ( ) { int i ; /* atribui um valor inicial a ch*/ char ch = a ; for(i = 0; ch != q;i++){ printf (\nPasso:%d,i) ; ch = getche() ; condio no baseada na } varivel de 17 } controle

Mais Variaes do Comando for


Parte de incremento no precisa incrementar varivel de controle Comando for pode vir sem corpo
No tem corpo #include <stdio.h> #include <conio.h> int main ( ) { char ch; for(ch = getche(); ch!=q;ch = getche()); printf (\nValor q encontrado) ; } Incremento pode ser outro tipo de 18 expresso

O comando while
while (condio) corpo Executa corpo vrias vezes at que a avaliao da expresso retorne falso A condio avaliada de novo aps cada execuo de corpo No executa corpo nenhuma vez, se de incio a avaliao da condio retorna falso
19

Fluxo de Controle do Lao while

condio avaliada

true
comando

false

20

Entendendo o comando while


int somatorio(int n) { int soma = 0; Se n for int valor = 0; negativo, no se while ( valor <= n ){ executa o corpo soma = soma + valor; do while valor++; } return soma; } executado quando o while termina, quando a condio for falsa

21

Entendendo o comando while


int somatorio(int n) { Inicializao da int soma = 0; varivel de int valor = 0; controle feita while ( valor <= n ){ fora do lao soma = soma + valor; while valor++; } return soma; } Incremento da varivel de controle feita no corpo do lao while

22

Lao Infinito com o Comando while


int somatorio(int n) { int soma = 0; int valor = 0; while ( valor <= n ){ soma = soma + valor; } return soma; } Se valor no incrementado, este comando ser executado infinitas vezes
23

O Comando for e o Comando while


for(inicializao;condio;incremento) corpo

equivale a ...

inicializao; while(condio) { corpo; incremento; }


24

O Comando for e o Comando while


for(;;) corpo

while(1) { corpo; } equivale a ...


25

O Comando do-while
do { corpo } while(condio)

Executa corpo, pelo menos uma vez, at que a avaliao da condio retorne falso A condio avaliada de novo aps cada execuo de corpo
26

Fluxo de Controle do Lao do-while

comando true condio avaliada false

27

Entendendo o comando do-while


int somatorio(int n) { int soma = 0; Se n for int valor = n; negativo, o corpo do { do do-while soma = soma + valor; executado pelo valor--; menos uma vez } while ( valor >= 0 ) return soma; } executado quando o do-while termina, quando a condio for falsa Comportamento alterado: cuidado!
28

Os Comandos do-while e while


do { corpo } while(condio)

Equivalente a ...
corpo; while(condio) corpo;

29

Laos Aninhados
Laos podem ser aninhados da mesma forma que comandos condicionais
O corpo de um lao pode conter outro lao

Para cada iterao do lao externo, o lao interno completamente executado

30

Laos Aninhados
int somatorioDoSomatorio(int n, int vezes) { int soma = 0, somatorio =0; int valExt; for (valExt = 0; valExt < vezes; valExt++ ){ int valInt = 0; while (valInt <= n) { soma = soma + valInt; valInt++; } somatorio = somatorio + soma; } return somatorio; A cada iterao do for, }

o lao while executado

31

Consideraes sobre Laos


Os 3 tipos de laos so funcionalmente equivalentes
Portanto podem ser usados indiscriminadamente

Os laos for e while so executados 0 ou muitas vezes O lao do-while executado 1 ou muitas vezes

32

O Comando break
Forma Geral do comando break

break;
Tem dois usos distintos
Para forar o trmino de um lao de repetio (do-while, for ou while) Para terminar um case do comando switch

Quando o comando break encontrado dentro de um lao de repetio:


instruo imediatamente finalizada prxima instruo aps a estrutura de repetio executada

Deve ser usado com cautela


Reduz legibilidade Pode levar a erros de lgica
33

O Comando break
int somatorio(int n) { int soma = 0; int valor; for (valor = 0; ; valor++){ soma = soma + valor; if (valor == n) break; printf(Soma Parcial:%d\n,soma); } printf(Soma Total:%d,soma) return soma; }
34

Este comando no ser executado quando valor = = n

O Comando continue
Forma Geral do comando continue

continue
Termina a execuo da iterao atual de um loop (for,while,do-while) e volta ao comeo deste loop Todos os comandos que seriam executados aps o continue so descartados

35

Comando de Desvio - continue


Para os comandos continue causa: while e do-while, o

a realizao imediata do teste da condio correspondente continuidade do processo de repetio dependendo do resultado do teste

Para o comando for , o continue causa:


incremento da varivel de controle do lao de repetio execuo do teste para verificao da condio continuidade do processo de repetio dependendo do resultado do teste
36

O Comando continue
void imprimeNumerosAteCinco() { int valor; for (valor = 0; valor <= 5; valor++){ if (valor == 4) continue; printf(%d ,valor); Controle pula para } }
o incremento e este comando no ser executado quando valor = = 4

A sada desta funo ser: 0 1 2 3 5


37

O Comando continue
void imprimeNumerosAteCinco() { int valor = 0; while (valor <= 5){ if (valor == 4) continue; printf(%d,valor); valor++; Controle pula para } o teste e funo }
tem execuo infinita quando valor = = 4

A sada desta funo ser: 0 1 2 3 ... lao infinito

38

Resumindo ...
Estruturas de Repetio
Necessidade de estruturas de repetio Conceito de lao (loop) Tipos de lao em C O comando for O comando while

O comando do-while
Laos Aninhados Diferenas entre os comandos de repetio

Comandos para alterar o fluxo de laos


break e continue
39

Introduo Programao

Recurso

Recurso
decorao Substantivo feminino. 1.Ato ou efeito de decorar

decorar Verbo transitivo direto. 1.Guarnecer com adorno(s); dispor formas e cores em; ornamentar, embelezar; 2.Realar, avivar, adornar;

Recurso

Fonte: Dicionrio Aurlio

Tpicos da Aula
Hoje, aprenderemos a usar uma tcnica de programao chamada de recurso
Conceito de Recurso Definies Recursivas Casos Base e Geral Programando Recursivamente Recurso X Lao

Recurso
Uma definio recursiva de um conceito consiste em utilizar o prprio conceito na definio
Ex: fat(n) = n * fat(n-1)

Definies recursivas em linguagem natural no so, geralmente, muito teis Contudo, em outras situaes, uma definio recursiva pode ser a mais apropriada para explicar um conceito Recurso uma tcnica de programao que pode fornecer solues elegantes para determinados problemas

Mas, antes, deve-se aprender a pensar recursivamente!


4

Definies Recursivas: Lista


Considere a seguinte lista de nmeros

24, 88, 40, 37


Podemos definir uma lista de nmeros como:
Uma LISTA um: nmero ou um: nmero vrgula LISTA

Resumindo: uma LISTA definida ou como um nico nmero, ou como um nmero seguido de uma vrgula seguida de uma LISTA Utilizamos LISTA para sua prpria definio
5

Definies Recursivas: Lista


A parte recursiva da definio de LISTA utilizada diversas vezes, at que se possa utilizar a parte no recursiva
nmero vrgula LISTA

24

88, 40, 37 88 , 40, 37

Parte recursiva da definio de LISTA

Parte no recursiva da definio de LISTA

40, 37 37
6

Definies Recursivas: Fatorial


Fatorial de um nmero N (N!), que inteiro e positivo, definido como a multiplicao de todos os inteiros compreendidos entre 1 e N (inclusive) Podemos definir fatorial recursivamente:
0! = 1 N! = N x (N-1)!

Mais uma vez, utilizamos fatorial para sua prpria definio


7

Definies Recursivas: Fatorial

5! 5 * 4! 4 * 3!

120 24 6

3 * 2! 2 * 1!

2
1

1 * 0! 1

Caso Base e Caso Geral


Toda definio recursiva deve ter uma parte recursiva e outra no recursiva
Se no houver a parte no recursiva, o caminho recursivo nunca termina
Gera uma recurso infinita Similar a um lao infinito

Denomina-se de caso base, a parte no recursiva da definio, enquanto o caso geral a parte recursiva
9

Programao Recursiva
Uma funo em C pode chamar ela mesma
Funo recursiva

O cdigo de uma funo recursiva deve tratar o caso base e o caso geral Cada chamada da funo cria novos parmetros e variveis locais
Cria-se uma nova instncia da funo

Como em qualquer chamada de funo, assim que a funo termina sua execuo, o controle retorna para a funo que a chamou (que neste caso, outra instncia da mesma funo)

Exemplo de Funo Recursiva: Fatorial

int fatorial(int n) { int resultado; if (n == 0) resultado = 1; else resultado = n * fatorial(n - 1);

Caso Base

return resultado;
}

Caso Geral
11

Chamando Funo Recursiva: Fatorial

int main() { int fat = fatorial(2); printf(Fatorial de 2 %d,fat); return 0; }

12

Pilha de Execuo de Funes Recursivas


1 Chamada da funo: cpia do argumento 2 Chamada recursiva: cpia do argumento 3 Chamada recursiva: clculo da expresso
1 0 1 2 resultado n resultado n <fatorial resultado n <fatorial fat <main

resultado n fat

2 -

resultado n resultado n <fatorial fat <main

1 2 -

<fatorial <fatorial <fatorial <main

4 Retorno da 3a chamada: clculo da expresso


resultado n resultado n fat

5 Retorno da 2a chamada: clculo da expresso

5 Retorno da 1a chamada

1 1 2 -

<fatorial <fatorial <main

resultado n fat

2 2 -

<fatorial <main

fat

<main 13

Usando Recursividade para resolver problemas

Deve-se transportar todos os discos da primeira estaca at a ltima obedecendo as seguintes regras: 1. S pode ser deslocado um disco por vez (o do topo de uma estaca) 2. Em nenhum momento um disco maior pode estar sobre um menor
14

Problema: Torre de Hanoi

Resolvendo Recursividade o Problema da Torre de Hanoi

1. Mover n 1 discos da estaca Origem para a Temporria 2. Mover o disco n da estaca Origem para a Destino 3. Mover n 1 discos da estaca Temporria para a Destino

Soluo: Torre de Hanoi

15

Torre de Hanoi
Caso Base
void mover(int n, char orig, char temp, char dest) { if (n == 1) printf("Mova o disco 1 da estaca %c para a estaca %c\n",orig,dest); else { mover (n-1,orig,dest,temp); printf("Mova o disco %d da estaca %c para a estaca %c\n",n,orig,dest); mover(n-1,temp,orig,dest); } }

Caso Geral
16

Pontos Chave de uma Soluo Recursiva


Definir o problema em termos recursivos
Definir o caso geral

Determinar o caso base


Definir uma soluo de modo que a cada chamada recursiva, podemos nos aproximar do caso base

17

Recurso x Lao
No porque existe uma soluo recursiva, que sempre devemos us-la Solues iterativas (com lao) so geralmente mais eficientes
Solues recursivas geralmente demandam mais poder de processamento e memria

Porm, solues utilizando recurso podem ser mais elegantes e mais compreensveis que solues iterativas equivalentes Programador deve analisar caso a caso qual a melhor tcnica a aplicar para a resoluo do problema
18

Resumindo ...
Recurso
Conceito Exemplos de definies recursivas Casos Base e Geral Programando Recursivamente Recurso X Lao

19

Introduo Programao

Armazenamento de Grande Quantidade de Informao Usando Vetores

Armazenando Grande Quantidade de Informao


Como armazenar tanta informao?

Vetores !
2

Tpicos da Aula
Hoje, aprenderemos como armazenar grande quantidade de informao
Necessidade de armazenamento Utilizao de muitas variaveis Manipulao incremental das informaes

Aprenderemos a utilizar vetores


Conceito Criao Inicializao Acesso Limites de um vetor Passagem de vetores como argumentos Vetores bidimensionais (matrizes)

Necessidade de Armazenamento
Sistemas armazenam informaes para que possam posteriormente acess-las e manipul-las Maioria dos sistemas requer o armazenamento de grande quantidade de valores do mesmo tipo
Mesmas operaes para manipular estes valores Ex: processamento de imagens Milhes de imagens e cada imagem composta de milhes de pixels

No desenvolvimento de um programa, devemos definir estruturas e mecanismos para armazenar e manipular esta grande quantidade de informao

Calculando a Mdia Aritmtica


A mdia aritmtica de um conjunto de valores dada pela seguinte expresso

x
i 1

n
5

Como Armazenar Grande Quantidade de Informaes?


At agora, vimos construes de programao que permitem guardar uma nica informao de cada vez
Varivel e constante

Neste caso, a soluo seria criar uma varivel para cada valor que desejamos armazenar
No uma boa soluo, porm hoje veremos como podemos trabalhar com esta alternativa

Tentativa com Muitas Variveis


2 variveis para armazenar nmeros

#include <stdio.h> int main() { float numero1, numero2; float media;


printf(Digite 2 numeros:\n); scanf(%f %f, &numero1,&numero2); media = (numero1 + numero2)/2; printf(\nA media eh %f\n,media); return 0; }

Limitao: S permite mdia de 2 nmeros

Tentativa com Muitas Variveis


3 variveis para armazenar nmeros

#include <stdio.h> int main() { float numero1, numero2, numero3; float media;
printf(Digite 3 numeros:\n); scanf(%f %f %f, &numero1,&numero2,&numero3); media = (numero1 + numero2 + numero3)/3; printf(\nA media eh %f\n,media); return 0; Trecho de cdigo depende } da quantidade de nmeros suportados Limitao: S permite mdia

de 3 nmeros

Problemas com Uso de Muitas Variveis

Dificuldade de lidar com mudana do nmero de informaes que devem ser armazenados
Acrescentar ou remover varivel Muitas vezes requer modificaes em vrias linhas de cdigo

Outra Estratgia: Manipulao Incremental da Informao


#include <stdio.h> Varivel que guarda a int main() { quantidade de nmeros int qtdNumeros; entrados int contador = 0; float numero; float media = 0.0; printf(Digite quantidade de numeros:\n); scanf(%d, &qtdNumeros); while (contador < qtdNumeros) { scanf(%f,&numero); Cada nmero entrado media = media + numero; armazenado na contador++; varivel numero } media = media/qtdNumeros; printf(\nA media eh %f\n,media); return 0; Permite mdia de quantidade }

10

variada de nmeros

Outra Estratgia: Manipulao Incremental da Informao


#include <stdio.h> int main() { Cdigo independe da quantidade int qtdNumeros; de nmeros que sero utilizados int contador = 0; na mdia float numero; float media = 0.0; printf(Digite quantidade de numeros:\n); scanf(%d, &qtdNumeros); while (contador < qtdNumeros) { scanf(%f,&numero); media = media + numero; contador++; } media = media/qtdNumeros; printf(\nA media eh %f\n, media); return 0; 11 Contudo perdemos informao sobre cada }

nmero digitado!

Problemas com Manipulao Incremental de Informao


Perda de informao sobre os individuais que foram armazenados valores

No exemplo, sabemos apenas qual foi o somatrio dos valores inseridos e no quais valores foram inseridos

Limita a utilizao da informao armazenada


No exemplo, se quisssemos utilizar os mesmos dados para uma operao diferente (ex: multiplicao), no conseguiramos

12

Necessidade de Vetores
Precisamos de alguma armazenamento que: estrutura de

armazene vrios valores de um determinado tipo permita que os valores sejam acessados de forma simples

9.0 7.5 6.3

8.8

9.8 10.0

Vetores !

13

Vetores
Vetor ou array um tipo de dado utilizado para representar um conjunto de valores homogneos utilizando um nico nome Define uma estrutura que armazena valores de um determinado tipo Um vetor declarado usando tipo nome[tamanho]; No ato da declarao, devemos especificar o tamanho (dimenso) do vetor
Vetores tm tamanho fixo depois de criados
14

Vetores
float notas[10]; ndices do vetor 0 1 4 9 2 3 8 6 4 3 5 7 6 8 7 2 8 9 9 5

notas

notas[0] notas[1] ... notas[9] Cada elemento do vetor referenciado atravs do ndice do vetor ndice comea em 0 e vai at tamanho -1

Acessando Elementos de Vetores


Um determinado elemento do vetor pode ser acessado usando o nome do vetor seguido do ndice do elemento entre colchetes ([ ]) A expresso notas[2] se refere ao valor 8 (3 elemento do array)

notas

10 9

notas[2]
A expresso notas[2] representa um local para armazenar um inteiro e pode ser utilizada da mesma forma que uma varivel do tipo inteiro
16

Calculando a Mdia com Vetores


#include <stdio.h> int main() { int qtdNumeros,contador = 0; Vetor que guarda nmeros float numeros[2000]; entrados float media = 0.0; do{ printf(Quantidade de numeros? (< 2000):\n); scanf(%d, &qtdNumeros); } while (qtdNumeros <= 0 || qtdNumeros > 2000); while (contador < qtdNumeros) { scanf(%f,&numeros[contador]); media = media + numeros[contador]; contador++; } media = media/qtdNumeros; Nmeros podem ser printf(\nA media eh %f\n,media); acessados return 0; individualmente 17 }

Vetores na Memria
int v[10];
144

Aloca espao para 10 valores inteiros, referenciados por v reservado um espao de memria contnuo
v[0]

Acessa o primeiro elemento de v Acessa o ltimo elemento de v Est errado !

v[9] v
104

Mas: v [10]

18

Checando os Limites dos Vetores


Ao utilizar o ndice para referenciar um elemento do vetor, este ndice deve permitir o acesso a um elemento vlido ( em um endereo da memria alocado para o vetor)
ndice deve variar de 0 a tamanho -1

C no avisa quando o limite de um vetor excedido!


Se o programador transpuser o fim do vetor durante a operao de atribuio, os valores sero armazenados em outros dados ou mesmo no cdigo do prprio programa

O programador tem a responsabilidade de verificar o limite do vetor!


19

Checando os Limites dos Vetores


So comuns, erros de programao no uso de vetores dentro de laos
Deve-se prestar ateno na parte de teste do lao int main() { int pares[20]; int i,somaPares = 0; for (i = 0; i <= 20; i++) { pares[i] = 2 * i ; somaPares = somaPares + pares[i]; } ... Teste deveria ser i < 20 } Por causa do teste errado,
esta linha gerar um erro
20

Inicializando Vetores
Inicializadores de vetores so representados da seguinte forma: {expresses},onde expresses representam expresses de tipos vlidos separadas por vrgulas Vetores podem ser inicializados na declarao
int int v[5] = {5,10,15,20,25} ; v[]= {5,10,15,20,25};

ou simplesmente:
Vetores s podem ser inicializados no ato da declarao!

21

Opes de Inicializao de Vetores


No caso de utilizar inicializadores de vetores, note que:
Quando no especificado o tamanho, o compilador aloca espao suficiente para armazenar todos os valores contidos na inicializao Quando o tamanho for especificado e houver a lista de inicializao Se h menos inicializadores que o tamanho especificado, os outros sero zero Mais inicializadores que o necessrio implica em um warning Quando o vetor no for inicializado, o tamanho deve ser especificado na declarao !

22

Passando Vetores como Argumentos de Funes


Um vetor pode ser passado como argumento para uma funo
Parmetro da funo deve ser do tipo tipo[]

Ao passar um vetor para uma funo podemos modificar o contedo deste vetor dentro da funo
Passa-se na verdade o endereo do vetor na memria (veremos em breve!) Modificar um elemento do vetor ou incluir um novo elemento

Podemos passar tambm um elemento em particular de um vetor para uma funo


Parmetro deve ser to tipo tipo
23

Passando Vetores como Argumentos para Funes


#include <stdio.h> float media(int n, float num[]){ int i; float s = 0.0; Parmetro do tipo vetor for(i = 0; i < n; i++) de float s = s + num[i] ; return s/n ; } int main(){ Passando o vetor numeros float numeros[10] ; como argumento float med; int i ; for(i = 0; i < 10; i++) scanf (%f, &numeros[i]) ; med = media(10, numeros ) ; ... }

24

Passando Vetores como Argumentos para Funes


#include <stdio.h> void incrementar(int n,float num[], float valor){ int i; for(i = 0; i < n; i++) num[i] = num[i] + valor ; } Modificando o contedo do int main(){ vetor passado como float numeros[10] ; argumento int i ; for(i = 0; i < 10; i++) scanf (%f, &numeros[i]) ; incrementar( 10,numeros,1.5) ; ... }

25

Passando Elementos de Vetores como Argumentos


#include <stdio.h> int reprovado(float nota, float media){ if ( nota < media) return 1; else Passando um nico return 0; elemento do vetor para } uma funo int main(){ float notas[] = {6.5,5.0,7.5,9.4,3.8}; int i ; for(i = 0; i < 5; i++){ if (reprovado(notas[i],7.0) == 1) printf(Aluno %d: REPROVADO\n,i); else printf(Aluno %d: aprovado\n,i); } ... 26 }

Vetores Bidimensionais
Um vetor unidimensional armazena uma lista de elementos

Um vetor bidimensional pode ser visto como uma matriz com linhas e colunas
int matriz[9][6];
uma dimenso

Em C, um vetor bidimensional um vetor de vetores


duas dimenses

27

Inicializando Matrizes
A inicializao de uma matriz tambm pode ser feita das seguintes formas:
float mat[4][3]={{5.0,10.0,15.0},{20.0,25.0,30.0} , {35.0,40.0,45.0},{50.0,55.0,60.0}}
float mat[4][3] = {5.0, 10.0, 15.0, 20.0, 25.0, 30.0, 35.0, 40.0,45.0, 50.0,55.0,60.0} float mat [][3]= {5.0, 10.0, 15.0, 20.0, 25.0, 30.0, 35.0,40.0,45.0,50.0,55.0,60.0} Deve ser passada a segunda dimenso

28

Percorrendo Matrizes
int main() { int i,j; int matriz[2][2]={{1,2},{5,6}}; for (i=0;i<2;i++){ for (j=0;j<2;j++){ printf("%d ",matriz[i][j]); } printf("\n"); } return 0; Laos aninhados para } percorrer matriz Sada: 1 2 5 6

Passando Matrizes como Argumentos de Funes


Uma matriz pode ser passada argumento para uma funo
Parmetro da funo deve tipo[][tamanho colunas] ser

como
do tipo

A linguagem C exige que a segunda dimenso seja especificada

30

Passando Matrizes como Argumentos


void imprimeMatriz(int linhas, int mat[][2]) { int i,j; for (i=0; i < linhas; i++){ for (j=0;j < 2; j++){ printf("%d ",mat[i][j]); } printf("\n"); } Deve ser especificada pelo menos a segunda dimenso }

Resumindo ...
Armazenamento de grande quantidade de informao
Necessidade de armazenamento Problemas Utilizao de muitas variaveis Manipulao incremental das informaes

Vetores
Conceito Declarao Inicializao Acesso Limites de um vetor Passagem de vetores como parmetros Vetores bidimensionais (matrizes)

32

Introduo a Programao

Strings (Vetor de Caracteres)

Tpicos da Aula
Hoje aprenderemos a manipular vetores de caracteres (Strings)
Caracteres em C Entrada/Sada de caracteres Funes que manipulam caracteres Vetores de caracteres (Strings) Inicializao Strings constantes Entrada/Sada de Strings Funes de Manipulao de Strings
2

Caracteres
Em C, o tipo char :
usado para representar caracteres pode armazenar valores inteiros (em 1 byte), representando assim, 256 valores distintos Uma constante char escrita entre aspas simples
char letraA = A; char letraC; letraC = C; printf ( %c %c , letraA , letraC) ;

Caracteres
So representados internamente na memria do computador por cdigos numricos
A correspondncia entre os caracteres e os seus cdigos numricos feita por uma tabela ASCII Na tabela ASCII: os dgitos so codificados em seqncia as letras minsculas e maisculas tambm formam dois grupos sequenciais
char letraA = 65; /* letra A*/ char letraC; letraC = 67; printf ( %c %c , letraA , letraC) ;
4

Tabela ASCII
0
30 40 50 60 70 80 ( 2 < F P

90 100 110 120

Z d n x

2 sp ) * 3 4 = > G H Q R [ \ e f o p y z

3 ! + 5 ? I S ] g q {

4 5 6 # $ , . 6 7 8 @ A B J K L T U V ^ _ ` h i j r s t | } ~

7 8 % & / 0 9 : C D M N W X a b k l u v

9 1 ; E O Y c m w
5

Impresso de Caracteres
Podem ser impressos diferentes usando o printf:
char lc = 97 ; printf(%d %c,lc,lc);

de

duas

formas

char la = a ; printf(%d %c,la,la );

Sada: 97 c

Sada: 95 a

Existe a funo putchar da biblioteca stdio.h que permite a impresso de um caractere


char la = a; /* ou la = 97; */ putchar(la);
6

Leitura de Caracteres
Leitura de caracteres com a funo scanf
char a ; scanf(%c,&a );

OU

char a ;
/* sem brancos */

scanf( %c,&a );

Existe a funo getchar da biblioteca stdio.h que permite a leitura de um caractere


char a ; a = getchar();
7

Leitura de Caracteres
Funo scanf e getchar obriga que a tecla <enter> seja pressionada aps a entrada dos dados Existem funes para ler dados sem esperar pelo <enter> em C para ambientes Windows:
Funo getche definida em conio.h

L um caractere e o exibe na tela

char letra ; letra = getche();


Funo getch definida em conio.h L um caractere e no o exibe na tela (invisvel)

char letra ; letra = getch();

Escrevendo Funes que Manipulam Caracteres


Pode-se tirar proveito da codificao seqencial da tabela ASCII
Escrevendo programas que usam a tabela A funo abaixo verifica se um dado caractere um dgito entre 0 e 9 int digito (char c){ int ehDigito; if(( c >= 0)&&(c <= 9)) { ehDigito = 1; } else{ ehDigito = 0; } return ehDigito; }

Escrevendo Funes que Manipulam Caracteres


Funo para converter uma letra em maiscula
char maiuscula(char c){ Testa se minscula char maiusc; if((c >= a)&&(c <= z)) { maiusc = c a + A ; } return maiusc ; }

Diferena entre qualquer caracter minsculo e a letra a a mesma do equivalente maisculo e a letra A
10

Vetor de Caracteres (String)


representada por um vetor do tipo char e terminada obrigatoriamente, pelo caractere nulo \0 O especificador de formato %s da funo printf permite imprimir uma cadeia de caracteres A partir do endereo para o primeiro caractere, as funes processam caractere a caractere at que \0 seja encontrado int main(){ char cidade[4]; cidade[0]=R; cidade[1]=I; cidade[2]=O; cidade[3]=\0; printf(%s,cidade); }

11

Inicializao de Strings
Inicializao do vetor de caracteres na declarao

int main(){ char cidade[]={R,I,O,\0} ; printf (%s\n,cidade ); }


Inicializao do vetor na declarao atravs da escrita dos caracteres entre aspas duplas int main(){ char cidade[]= RIO; printf(%s\n,cidade); } Caractere nulo representado implicitamente

12

Declarando Strings
char s2[] = Rio de Janeiro;

Representa um vetor com 15 elementos char s3[81];

Representa um vetor de no mximo, 80 elementos char s4[81] = Rio; Representa um vetor de no mximo 80 elementos, mas com um valor inicial j atribudo

13

Constantes do Tipo String


printf("Uma string constante!\n"); printf(Eu moro em %s ",Recife");
106 105

\0

e
f i c e R

So criados strings contantes na memria

104
103 102 101 100

Constantes do Tipo String


ERRADO char capital[7]; capital = Recife";

Declarao da constante do tipo vetor de caracteres capital


J foi atribuido um endereco constante capital (endereo inicial do vetor)

Tentativa de atribuir endereo da constante Recife constante capital

Constantes do Tipo String


Declarao da constante do tipo vetor de caracteres capital Vetor de caracteres inicializado com as letras que fazem parte de Recife \0 e

CORRETO char capital[7] = Recife";

106 105 104 103 102 101 100

A constante capital armazena o valor inicial da String (100)

f
i

c
e R

Impresso de Strings
Especificador %s na funo printf deve ser utilizado
char cidade [81] = Recife; printf(%s, cidade );

Funo puts de stdio.h pode ser utilizado tambm para imprimir strings
char cidade [81] = Recife; puts(cidade);

17

Leitura de Strings
Especificador %s na funo scanf captura somente uma seqncia de caracteres no brancos
Limitao: somente nomes simples podem ser lidos
& no necessrio pois cidade j armazena um endereo (endereo inicial do vetor)

char cidade [81]; scanf (%s, cidade ); Um caracter branco pode ser um: espao ( ) caractere de tabulao ( \ t ) caractere de nova linha ( \ n )

18

Permitindo Ler Mais de um Nome com o scanf


char cidade [81] ; scanf( %[^\n], cidade) ;
O caracter ^ informa que o caracter \n no pode ser lido

A funo acima l uma seqncia de caracteres at que seja digitado um <enter> A incluso do espao antes de % descartam espaos em brancos que precedem o nome
19

Limitando Tamanho da String com o scanf


Cuidado! Leitura de uma string maior do que a capacidade declarada invadir espao de memria no reservada

Para limitar o nmero mximo de caracteres capturados:


char scanf cidade [81] ; ( %80[^\n], cidade ) ; No mximo, 80 caracteres so lidos
20

Usando gets para Leitura


A funo gets de stdio.h pode tambm ser utilizada para ler strings
L a string at encontrar um \n
char cidade [81]; gets(cidade); Vantagens L nomes compostos Sintaxe mais simples Desvantagem No tem como limitar quantidade de caracteres lidos

21

Funes de Manipulao de Strings


void imprime (char s[]) { int i; for (i = 0; s[i] != \0; i++) { printf (%c,s[i]) ; } printf (\n); Imprime caracter a caracter

Funo anloga
void imprime (char s[]) printf ("%s,s); printf (\n); } {

22

Funes de Manipulao de Strings


Calcula o comprimento da cadeia
int comprimento (char s[]) { int i ; int n = 0 ; for (i = 0 ; s[i] != \0; i++) { n++ ; } return n ;

Funo anloga definida em string.h: strlen (char* str) ;

Equivalente a char[]
23

Funes que Fazem Cpias de Strings


void copia (char dest[], char orig[] ){ int i; for ( i = 0 ; orig[i] != \0; i++) { dest[i] = orig[i]; } /* fecha a cadeia copiada */ dest[i] = \0; Funes que manipulam Strings } assumem que toda String termina com o \0

Funo anloga definida em string.h: strcpy (char* dest , char* orig) ;


Copia os elementos do 2 parmetro no 1 Supe que o 2 parmetro tem espao suficiente
24

Copiando Strings
ERRADO char capital[7]; capital = Recife"; No se usa atribuio para copiar uma String na constante do tipo String capital

CORRETO char capital[7]; char cidade[7]; strcpy(capital,Recife); strcpy(cidade,capital); Para copiar Strings devese utilizar uma funo que faz a cpia!

Cadeia Concatenam Strings Funes que de Caracteres


void concatena (char dest[], char orig[]) { int i = 0 ; int j ; while (dest[i] != \0){ Acha o final da i++ ; String destino } for (j = 0; orig[j] != \0 ; j++){ dest[i] = orig[j]; Copia elementos i++; } dest[i] = \0; } Fecha a String destino

Funo anloga definida em string.h: strcat (char* dest , char* orig) ;


Concatena as duas cadeias e o resultado atribudo ao 1 parmetro
26

Outras Funes para Strings


Definidas em string.h:
strcmp(char *str1,char *str2); Retorna um inteiro positivo se str1 lexicamente posterior que str2; zero se as duas so idnticas; e negativo se str1 lexicamente anterior que str2 strncpy(char *dest,char *origem, int n) Copia n caracteres de origem para destino strncat(char *dest,char *origem, int n); Concatena n caracteres da origem em destino

Vetor de Strings
Vetor de Strings equivale a um vetor de vetores
Matriz Cada linha da matriz corresponde a uma string

til quando queremos armazenar uma coleo de strings

28

Exemplo de Vetor de Strings


#define MAX 50 ; int main (){ int i , numAlunos ; char alunos[MAX][121] ; do { printf( Digite o numero de alunos:\n) ; scanf (%d,&numAlunos); } while ( numAlunos > MAX ); for (i = 0; i < numAlunos; i++) { gets(alunos[i]) ;/* L uma string*/ } return 0 ; } Cada posio do vetor guarda uma String

29

Resumindo ...
Caracteres em C Entrada/Sada Funes que manipulam caracteres Vetores de caracteres (Strings) Inicializao Strings constantes Entrada/Sada Funes de Manipulao de Strings

30

Introduo Programao

Programao e Fatores de Qualidade

Qualidade de Software
Quero que voc escreva rapidamente um sistema de folha de pagamento que funcione corretamente, que seja robusto e que seja rpido. Ah! Pretendo lanar uma outra verso deste mesmo programa, daqui a uns 6 meses.

Ferrou!
Sem problema, chefe.

Tpicos da Aula
Hoje aprenderemos qualidade de software alguns fatores de

Fatores de qualidade externos


Fatores de qualidade internos

Depois aprenderemos algumas tcnicas para melhorar alguns fatores de qualidade de um programa
Comentrios Padres de Codificao Papel da endentao em um programa Algumas dicas para melhorar a eficincia de um programa 3

Impacto econmico e social do software de qualidade


Disponibilidade de servios essenciais home banking telefonia Segurana de pessoas sistemas de monitoramento de pacientes sistemas de controle de trfego areo freios ABS

O impacto na prtica
Competitividade das empresas Melhores produtos a um menor custo Atrao de novas empresas para a regio Investimentos na regio Arrecadao de impostos

Crise de Software
Nas 3 primeiras dcadas da Computao, a preocupao maior era hardware
Custo de processamento e armazenamento de dados

Desafio atual melhorar qualidade e custo do software Problemas


25% dos projetos so cancelados O tempo e custo de desenvolvimento bem maior do que o estimado em 53% dos projetos 75% dos sistemas no funcionam como planejado A manuteno e reutilizao so difceis e custosas

A produtividade dos profissionais da rea de software no tem acompanhado a demanda por seus servios
6

Causas da Crise de Software

Essncias
Complexidade crescente dos sistemas Dificuldade e custos de formalizao Uma linha de cdigo do sistema de controle de lanamento do nibus espacial da NASA custa 1.000 dlares!

Essncias no podem ser evitadas


7

Dificuldade de Formalizao

Causas da Crise de Software


Acidentes
M qualidade das linguagens, ferramentas e metodologias Problemas gerenciais (pessoas, riscos, etc.), polticos, e organizacionais Pouca comunicao entre o cliente e o desenvolvedor Manuteno de software, geralmente no considerada como parte do ciclo de software

Acidentes PODEM ser evitados!!!

Fatores de Qualidade de Software


Qualidade de software uma combinao de vrios fatores Estes fatores podem ser classificados em:
Fatores Externos
Qualidades percebidas pelos usurios de um software Usurios incluem: usurio final e aquela pessoa que contratou o desenvolvimento do software Ex: corretude, eficincia, reusabilidade, etc

Fatores Internos
Qualidades percebidas somente por profissionais de software que tm acesso ao cdigo do software Ex: modularidade, legibilidade, etc
10

Alguns Fatores Externos


Corretude a capacidade do software executar de forma correta todas as tarefas que foram pedidas nos requisitos e especificao do software Robustez a capacidade do software funcionar, mesmo em situaes no previstas na especificao
o complemento de corretude

Especificao Corretude Robustez


11

Alguns Fatores Externos


Extensibilidade a facilidade em que o software pode ser alterado para que atenda novas exigncias da especificao

Software est em constante mudana 70% de custo do software a fase de manuteno Mudanas de requisitos so responsveis por 50% das atividades de manuteno

Reusabilidade a capacidade que o software tem de ser usado em novas aplicaes.

Este uso pode ser de partes do software ou dele todo Grande impacto no tempo de desenvolvimento de software Menor tempo de desenvolvimento importante para sucesso do software
12

Alguns Fatores Externos


Eficincia a capacidade do software de otimizar a utilizao dos recursos de hardware
Muitas vezes requer um bom conhecimento do hardware onde o software ser executado Pode tornar a implementao do software dependente demais da plataforma alvo

Facilidade de Uso uma qualidade que diz respeito a facilidade com que usurios com diferentes perfis conseguem aprender a utilizar o software e resolver os problemas desejados
Engloba tambm o aprendizado de instalao, operao e monitoramento Representa economia para a empresa que utiliza o software em relao aos custos de treinamento
13

Outros Fatores Externos

Portabilidade Escalabilidade Integridade e segurana Compatibilidade Testabilidade

14

Alguns Fatores Internos


Um software modular se ele construdo partir de elementos autnomos conectados
Modularidade Reusabilidade e Extensibilidade

Legibilidade de um programa a facilidade com que profissionais de software conseguem entender o cdigo do programa
Documentao importante Padres de codificao devem ser seguidos Legibilidade Reusabilidade e Extensibilidade
15

Algumas Consideraes sobre Qualidade


Fatores internos Fatores externos Softwares so utilizados em aplicaes dos mais diversos domnios Freqentemente, no se pode obter todos os fatores de qualidade Diferentes fatores podem ser conflitantes
Ex: Freqentemente para aumentar a eficincia, cdigo do programa deve ser mais especfico a uma plataforma, o que diminui a reusabilidade e/ou portabilidade do cdigo

16

Algumas Consideraes sobre Qualidade


Eu ouvi dizer que este sistema novo de controle de freio, pelo menos, mais reusvel O que foi que aconteceu? Eu pisei no freio e ele demorou um sculo para ser acionado

Cabe ao desenvolvedor avaliar quais fatores so mais importantes de acordo com a aplicao

17

Comentando um Programa
Um programa deve ser bem documentado
Documentao externa para usurios Documentao no prprio programa Aumenta a legibilidade Comentrio um mecanismo oferecido pelas linguagens de programao que permite que o programador expresse em linguagem natural a lgica pensada para escrever um programa ou um trecho de programa

18

Comentando um Programa
Usa-se o termo inline documentation para comentrios em um programa Devem ser includos para explicar o propsito do programa e algumas partes dele Comentrios no afetam o funcionamento do programa
So ignorados na hora da execuo Dica: Comente o cdigo enquanto o estiver escrevendo, seno h uma forte probabilidade de no o fazer depois
19

Comentrios em C
Em C para incluir comentrios:
Usa-se /* e */
Pode conter mltiplas linhas
/* Este tipo de comentrio s termina quando o asterisco barra encontrado */

No se pode colocar os smbolos comentrio dentro de um comentrio


/* Este tipo de comentrio /*s termina*/ quando o asterisco barra encontrado */

de

20

Comentrios em C
Comentrios de uma linha usando // so aceitos pela maioria dos ambientes de programao (IDEs)
Precedido de // // Este um comentrio de uma linha

Isto ocorre porque a maioria das IDEs suportam C++ Este tipo de comentrio aceito em C++

21

Reuso de Cdigo
Reusabilidade um fator importante para acelerar o desenvolvimento de um sistema Reuso pode se dar de vrias formas:
Funo inteira Uma funo chama outra funo Trechos de programa ou funes

22

Reuso de Cdigo
Existem muitas tcnicas existentes para reutilizar cdigo ou pelo menos aumentar o potencial de reuso Uma tcnica infelizmente muito difundida o copy & paste
Soluo rpida e boa para quem no quer pensar Soluo pssima para a manuteno do sistema
Se uma alterao for requerida, esta tambm dever ser propagada por todos os trechos repetidos Se um bug for encontrado, ter de ser corrigido em todos os outros cdigos repetidos

Melhor do que isto usar Refactoring


23

Refactoring
Refactoring consiste em uma srie de tcnicas que reestruturam o cdigo do software, aumentando o potencial de reuso, extensibilidade e legibilidade
O comportamento do software continua o mesmo, s muda a estrutura Muito difundido entre metodologias de desenvolvimento de software orientadas a objetos Porm, muitas tcnicas podem ser aplicadas a programas desenvolvidas em linguagens como C Exemplos de refactoring: Generalizar uma funo com parmetros Transformar um trecho de codigo em uma funo

24

Padronizao de Codificao
Quanto mais fcil for o entendimento (legibilidade) do cdigo do sistema, mais produtiva ser a equipe de desenvolvimento Freqentemente as pessoas que escrevem o cdigo no so as mesmas que o mantm
Pode haver dificuldades de entendimento entre as diferentes pessoas que trabalham sobre o mesmo cdigo Atrasa o desenvolvimento do sistema

25

Padronizao de Codificao
Um padro de codificao visa minimizar esses problemas
Estabelece regras, definindo como o cdigo deve ser escrito para favorecer a impessoalidade do programa Facilita a integrao de novos desenvolvedores ao ambiente de desenvolvimento

Em C, no existe um padro internacional aceito de codificao


Empresas geralmente estabelecem um prprio Porm, veremos os padres mais utilizados em C
26

Nomenclatura de Contantes e Variveis


A princpio, identificadores no devem ser abreviados
Quando o fizer, usar bom senso para que no se perca expressividade Usar bom senso para que nome da varivel ou constante no fique grande demais Focar no que a varivel ou a constante representam

Recomenda-se colocar o identificador de uma constante em letras maisculas


Se houver mais de uma palavra, as palavras seguintes devem ser separadas com o caracter de underscore ( _) 27

Nomenclatura de Contantes e Variveis


Recomenda-se colocar o identificador de uma varivel comeando com letra minscula
Se houver mais de uma palavra, as palavras seguintes devem comear com maiscula ou serem separadas com o caracter de underscore (_)

Para nome de variveis locais que representam contadores, pode-se colocar apenas uma letra do alfabeto
for (i = 0; i < 5; i++) /*Aceitvel */

28

Exemplos de Constantes e Variveis


Varivel para representar a quantidade de autores de um livro
quantidadeAutores /*Bom */ qtdAutores /* Aceitvel */ qtdAut /* Inaceitvel */

variavelQueArmazenaQuantidadeDeAutores /*Ruim*/

Constante para representar o nmero de vagas da disciplina de IP


VAGAS_IP = 60 /*Bom */ Vg_Ip = 60 /*Inaceitvel */
29

Nomenclatura de Funes
Identificadores no devem ser abreviados Recomenda-se colocar o nome comeando letra minscula

Se houver mais de uma palavra, as palavras seguintes devem comear com maiscula ou serem separadas com o caracter de underscore (_)

No se deve colocar nomes misturando palavras de lnguas diferentes Muitas vezes, coloca-se na primeira palavra um verbo no infinitivo representando a utilidade da funo
Ex: imprimirPrimos(int comeco, int fim)

Muitas vezes se coloca um nome igual ao nome de uma funo matemtica


Ex: fatorial(int n)
30

Importncia da Endentao
Como sabemos, o compilador C ignora espaos e tabulaes Porm, para aumentar a legibilidade do cdigo muito importante se preocupar com sua endentao
Torna mais claro o que ser feito dentro de comandos condicionais e laos Torna mais claro o limite de funes if (total > MAX) printf ("Erro!!"); contador++;

if (total > MAX) printf ("Erro!!"); contador++;

31

Que trecho de cdigo mais claro?


int divisao(int dividendo, int divisor){int i, resultado = 0;
if (divisor != 0) for(i = dividendo; i >= divisor ; i = i - divisor) resultado++; return resultado; }

int divisao(int dividendo, int divisor){ int i, resultado = 0; if (divisor != 0)

for(i = dividendo; i >= divisor ; i = i - divisor)


resultado++; return resultado; }
32

Algumas Dicas para Melhorar Eficincia


Evitar o uso de variveis globais
Ocupam memria durante toda a execuo do programa

No declarar variaveis que no sero utilizadas No declarar variveis com tipos que ocupam mais memria quando a aplicao no trabalha com valores muito grandes
Aritmtica de inteiros mais rpida do que aritmtica de ponto flutuante (reais)

33

Algumas Dicas para Melhorar Eficincia


Sempre que puder privilegiar iterativas sobre as recursivas solues

Pode diminuir uso da memria Pode economizar tempo de processamento

Evitar executar todas as iteraes de um lao quando no necessrio


Economiza tempo de processamento

34

Exemplo de Melhoria de Eficincia


int existeNumeroPrimoEntre(int inicio, int fim){

int i, existe = 0;
for(i = inicio; i <= fim;i++){ /*Considere que exista uma funo que diz se um num primo*/ if (numeroPrimo(i) == 1) {

existe = 1;
} } return existe;

Evita um teste desnecessario se o numero for maior do que 100

Mesmo achando um numero primo, continua lao


35

Exemplo de Melhoria de Eficincia


int existeNumeroPrimoEntre(int inicio, int fim){
int i, existe = 0; for(i = inicio; i <= fim && existe == 0;i++){ /*Considere que exista uma funo que diz se um num primo*/ if (numeroPrimo(i) == 1) { existe = 1; } } return existe; }

Evita continuao do lao quando encontra numero primo

36

Algumas Dicas para Melhorar Eficincia


Quando usar comandos condicionais, analisar se certos caminhos podem realmente ser executados
Elimine caminhos executados que nunca podem ser

Quando o programa tiver muitos if testando uma mesma variavel, verificar se no melhor colocar alguns else para evitar testes desnecessrios

37

Exemplo de Melhoria de Eficincia


void maiorQue100(int numero){
if (numero > 100){ printf(%d eh maior que 100,numero); } if (numero <= 100) { printf(%d nao eh maior que 100,numero); } } void maiorQue100(int numero){ if (numero > 100){ } else { printf(%d nao eh maior que 100,numero); } }
38

Evita um teste desnecessario se o numero for maior do que 100

printf(%d eh maior que 100,numero);

Referncias Adicionais
Crise do software
Softwares Chronic Crisis

http://www.cin.ufpe.br/~if669/files/MaterialDeEnsino/Referencias/SoftwareChronicsCrisis/SciAmSept1994.html

Fatores de Qualidade

Bertrand Meyer. Object-Oriented Software Segunda Edio. Prentice Hall, 1988

Construction.

Otimizao de cdigo C
http://www.abarnett.demon.co.uk/tutorial.html#ARRAY

Prticas que NO devem ser seguidas


Programao Orientada a Gambiarra
http://desciclo.pedia.ws/wiki/Programao_Orientada_a_Gambiarras

39

Resumindo ...
Fatores de qualidade de software
Fatores de qualidade externos Fatores de qualidade internos

Tcnicas para melhorar alguns fatores de qualidade de um programa


Comentrios Refactoring Endentao Melhorando a eficincia

40

Introduo a Programao

Ponteiros e Passagem de Argumentos por Referncia

Tpicos da Aula
Hoje aprenderemos a manipular endereos de memria ou ponteiros
Variveis e Endereos Conceito de Ponteiro Operadores de Ponteiros Ponteiros e Funes Passagem de Argumentos por Referncia Importncia de uso de ponteiros Aritmtica de Ponteiros

Variveis e Endereos
Memria abstrata (Como vemos a memria): IdValor {x5, y9, za} Memria concreta: Associaes: {x13, y72, z00} IdEndereo Memria de fato: {00a,...,135, EndereoValor 729,...,99undefined}

Ponteiros
Toda varivel tem um endereo ou uma posio associados na memria Este endereo visto como um ponteiro (ou apontador), uma referncia para a posio de memria de uma varivel Ponteiros fornecem um modo de acesso varivel sem referenci-la diretamente Um endereo pode ser armazenado em uma varivel do tipo ponteiro (ponteiro varivel)

Ponteiro Varivel
Um ponteiro varivel uma varivel que contm o endereo de outra varivel
Memria
V

valor1

P aponta para V P endereo4

endereo5 endereo4 endereo3 endereo2 endereo1

P = endereo da varivel V

Declarando Variveis do Tipo Ponteiro em C


int b;
Declara uma varivel de nome b que pode armazenar valores inteiros

Para declarar uma varivel do tipo ponteiro: Forma Geral: tipo* variavel int* p;
Declara uma varivel de nome p que pode armazenar um endereo de memria para um inteiro

Operador &
Operador unrio que fornece o endereo de uma varivel Forma Geral: &variavel
int *p; int v; p = &v;
Varivel p de tipo ponteiro para inteiro recebe endereo da varivel v de tipo inteiro

No pode ser aplicado a expresses ou constantes


Ex: x = &3; ERRADO!

Operador de Indireo *
Quando aplicado a uma varivel do tipo ponteiro, acessa o contedo do endereo apontado por ela Forma Geral: *variavel
int *p; int v = 3; p = &v; *p = 4; endereo5 endereo4 endereo3 endereo2 endereo1

4 3

endereo4

Usando Ponteiros
int i, j; int *ip;
i = 12; O endereo de i armazenado em ip

A varivel ip armazena um ponteiro para um inteiro

ip = &i; j = *ip; *ip = 21;

O contedo da posio apontada por ip armazenado em j O contedo da posio apontada por ip passa a ser 21

Usando Ponteiros
1)
int i,j ; int *ip ; ip j i

2) 112 108 104 i = 12 ; ip j i

12

112 108 104

3)
ip = &i ; ip j i 104 112 108 104

4)
j = *ip;

*ip = 21;

ip j i

12

104 12 12 21

112 108 104

Manipulando Ponteiros
int main () { /* funo int a , *p ; p = &a ; *p = 2 ; printf (%d,a); return 0 ; } principal */

Imprime o valor 2

int main () { int a,b,*p ; a = 2 ; *p = 3 ; b = a +( *p ); printf(%d,b); return 0; }

/* funo principal*/

Erro tpico de manipulao de ponteiros ponteiro no inicializado!

Funes e Ponteiros
Retorno explcito de valores no permite transferir mais de um valor para a funo que chama
# include <stdio.h> void somaprod(int a, int b, int c, int d) { c = a + b ; d = a * b ; } int main () { int s,p ; somaprod(3,5,s,p) ; printf(Soma = %d e Produto = %d \n,s,p); return 0 ; }

Esse cdigo no funciona como esperado !


12

A Passagem de Argumentos em C por valor... int a,b; a = 8; b = 12; swap(a,b);


A chamada da funo no afeta os valores de a e b

Copia os valores que esto em a e b para parmetros x e y

void swap(int x, int y){ int temp; temp = x; x = y; y = temp; }

Mas C Permite a Passagem por Referncia int a,b; a = 8; b = 12; swap(&a,&b);


A chamada da funo afeta os valores de aeb

Copia os endereos de a e b para parmetros px e py

void swap(int* px, int* py){ int temp; temp = *px; *px = *py; *py = temp; }

Passagem por Referncia em C


1)
int a,b ; a = 8; b b = 12 a main>

2) 12 8 112 108 104

temp py swap(&a,&b) ; px swap> b main> a

108 104 12 8 112 108 104

temp py temp = *px; px swap> b main> a

3)

8 108 104 12 8 112 108 104

4)

temp py *px = *py; px swap> b *py = temp; a main>

8 108 104 8 12 8 12 112 108 104

Passando endereos para uma funo


Como uma funo pode alterar variveis de quem a chamou?
1) funo chamadora passa os endereos dos valores que devem ser modificados 2) funo chamada deve declarar os endereos recebidos como ponteiros

16

Usando Passagem por Referncia para Funo SomaProd


# include stdio.h void somaprod(int a,int b,int* p, int* q){ *p = a + b ; *q = a * b ; } Passagem por Referncia int main (){ int s , p ; somaprod (3 , 5 , &s , &p) ; printf(Soma= %d e Produto = %d \n,s,p); return 0 ; }
17

Por que ponteiros so usados ?


Possibilitar que funes argumentos que recebem modifiquem os

Manipular vetores e strings - til para passar vetores como parmetro Criar estruturas de dados mais complexas, como listas encadeadas, rvores binrias etc.

18

Operaes com Ponteiros


int main( ) { px e py armazenam int x=5, y=6; endereos para int *px, *py; inteiros px = &x; py = &y; if (px < py) printf(py-px = %u\n,py-px); else printf(px-py = %u\n,px-py); return 0; }

Resultado: diferena entre endereos dividido pelo tamanho em bytes de um inteiro

Operaes com Ponteiros


Testes relacionais >=, <=, <, >, ==, so aceitos em ponteiros

Se px = 65488 e py = 65484
Sada ser: px - py = 1

A diferena entre dois ponteiros ser dada na unidade do tipo de dado apontado

Operaes com Ponteiros


int main( ) { int x=5, y=6; int *px, *py; px = &x; py = &y; printf(px = %u\n,px); printf(py = %u\n,py); py++; printf(py = %u\n,py); py = px+3; printf(py = %u\n,py); }

Podemos utilizar operador de incremento com ponteiros Podemos fazer aritmtica de ponteiros

Operaes com ponteiros


O incremento de um ponteiro acarreta na movimentao do mesmo para o prximo valor do tipo apontado
Ex: Se px um ponteiro para int com valor 3000, depois de executada a instruo px++, o valor de px ser 3004 e no 3001 !!! Obviamente, o deslocamento varia de compilador para compilador dependendo do nmero de bytes adotado para o referido tipo

22

Resumindo...
Ponteiros
Conceito Operadores de Ponteiros Ponteiros e Funes Passagem de Argumentos por Referncia Quando usar ponteiros Operaes com Ponteiros

23

Introduo a Programao

Ponteiros e Vetores

Tpicos da Aula
Hoje aprenderemos que existe uma forte relao entre ponteiros e vetores
Associao entre ponteiros e vetores Ponteiros constantes x Ponteiros variveis Passagem de ponteiros invs de vetores para funes Comando sizeof

Associao entre Vetores e Ponteiros


Considere a declarao:
int v [10] ;

O smbolo v Representa o vetor uma constante que representa seu endereo inicial Aponta para o primeiro elemento do vetor

Ponteiros e Vetores (matrizes)


Em C existe um relacionamento muito forte entre ponteiros e vetores
O compilador entende todo vetor e matriz como ponteiros, pois a maioria dos computadores capaz de manipular ponteiros e no vetores Qualquer operao que possa ser feita com ndices de um vetor pode ser feita com ponteiros O identificador de um vetor representa um endereo, ou seja, um ponteiro

Ponteiros e Vetores
Como vimos, C permite aritmtica de ponteiros Se tivermos a declarao
int v [10] ;

Podemos acessar elementos do vetor atravs de aritmtica de ponteiros


v + 0 v + 1

Aponta para (igual ao endereo do) primeiro elemento do vetor Aponta para o segundo elemento do vetor
Aponta para o ltimo elemento do vetor v[i] *(v + i)
5

v + 9

Portanto: &v[i](v + i)

Representando Ponteiros e Vetores na Memria Memria


int v[] = {6,10,7};
111 110 109

*(v + 2) v[2] 7 v + 2 &v[2] 108

108 107
106

10

*(v + 1) v[1] 10 v + 1 &v[1] 104

105 104 103


102 101 100

*v v[0] 6 v

&v[0] 100

Ponteiros e Vetores
Vetores podem ser tratados como ponteiros em C!
*pa a[0] pa[0] int a[10]; *(pa+i) a[i] int *pa; pa = &a[0]; pa[i] *(a+i) pa = a; a+i &a[i]
Expresses Equivalentes!

Usando Notao de Ponteiros para Vetores


Verso com Vetor int main( ) { int nums[ ] = {1, 4, 8}; int cont; for(cont=0; cont < 3; cont++) { printf(%d\n,nums[cont]); } }
int main( ) { int nums[ ] = {1, 4, 8}; int cont; for(cont=0; cont < 3; cont++) { printf(%d\n,*(nums + cont)); } }

Verso com Ponteiro

Ponteiros Constantes x Ponteiros Variveis


Declarao de uma constante do tipo int main( ) { ponteiro para inteiros int nums[ ] = {1, 4, 8}; (ponteiro constante) int cont; for(cont=0; cont < 3; cont++) { printf(%d\n,*(nums++)); } Errado! }

Tenta incrementar endereo armazenado na constante nums e atualizar a constante com novo endereo
9

Ponteiros Constantes x Ponteiros Variveis


Declarao de uma int main( ) { varivel do tipo int nums[ ] = {1, 4, 8}; ponteiro para inteiros int* pnums = nums; (ponteiro varivel) int cont; for(cont=0; cont < 3; cont++) { printf(%d\n,*(pnums++)); } Certo! }

Incrementa endereo armazenado na varivel pnums e atualiza a varivel com novo endereo
10

Ponteiros Constantes x Ponteiros Variveis


int a[10]; int *pa; pa = a;
Atribui a uma varivel um novo endereo: CERTO!

int a[10]; int *pa; a = pa;


Atribui a uma constante um novo endereo: ERRADO!

11

Passando Vetores como Argumentos para Funes


#include <stdio.h> float media(int n, float num[]){ int i; float s = 0.0; Parmetro do tipo vetor for(i = 0; i < n; i++) de float s = s + num[i] ; return s/n ; } int main(){ Endereo inicial do vetor float numeros[10] ; passado como argumento float med; int i ; for(i = 0; i < 10; i++) scanf (%f, &numeros[i]) ; med = media(10, numeros ) ; ... }

12

Passando Ponteiros invs de Vetores como Argumentos para Funes


#include <stdio.h> float media(int n, float* num){ int i; float s = 0.0; Parmetro do tipo ponteiro for(i = 0; i < n; i++) para float s = s + num[i] ; return s/n ; } int main(){ Endereo inicial (ponteiro) float numeros[10] ; do vetor passado como float med; argumento int i ; for(i = 0; i < 10; i++) scanf (%f, &numeros[i]) ; med = media(10, numeros ) ; ... }

13

Passando Ponteiros como Argumentos de Funes


Considere a seguinte assinatura de funo:
void incrementa(int n, int* v) Pergunta: Parmetro v um ponteiro para um vetor de inteiros ou para uma varivel do tipo inteiro?

Resposta 1: No tem como saber Resposta 2: indiferente. Podemos considerar um ponteiro para uma varivel do tipo inteiro como um ponteiro para um vetor com um s elemento

14

Comando sizeof
Forma Geral:
sizeof(tipo) ou sizeof(variavel)

Informa o nmero de bytes de um dado tipo ou varivel em tempo de compilao Exemplo:


int d = sizeof(float); d armazena o valor 4

15

Usando sizeof para Determinar Tamanho de Ponteiros e Vetores


Qual o o numero de elementos?

int main() { int num[ ]={1,2,3}; int numElementos = sizeof(num)/sizeof(int); printf ("Tamanho = %d\n", sizeof(num)); printf ("Num elementos = %d\n", numElementos); }

Qual o o numero de elementos?

int main() { int num[ ]={1,2,3}; int* num2 = num; int numElementos = sizeof(num2)/sizeof(int); printf ("Tamanho = %d\n", sizeof(num2)); printf ("Num elementos = %d\n", numElementos); }
16

Resumindo ...
Relao entre ponteiros e vetores
Ponteiros constantes x Ponteiros variveis Passagem de ponteiros invs de vetores para funes Comando sizeof

17

Introduo a Programao

Ponteiros e Strings, Alocao Dinmica

Tpicos da Aula
Hoje aprenderemos ponteiros e strings que a relao entre

Ponteiros para strings X Vetores de Caracteres Vetores de ponteiros para strings Tambm veremos como alocar espao de memria em tempo de execuo Conceito de Alocao Dinmica Importncia Funes em C para alocao dinmica Usando alocao dinmica para criar vetores e matrizes dinmicas
2

Ponteiros e Strings
Uma string um vetor de caracteres
char s [10] ;

Vimos que s armazena o endereo inicial do vetor Portanto, podemos manipular strings com ponteiros

Ponteiros e Strings
ERRADO char capital[7]; capital = Recife";

Declarao da constante do tipo vetor de caracteres capital


J foi atribuido um endereco constante capital (endereo inicial do vetor)

Tentativa de atribuir endereo da constante Recife constante capital

Ponteiros e Strings
Declarao da constante do tipo vetor de caracteres capital Vetor de caracteres inicializado com as letras que fazem parte de Recife

CORRETO char capital[7] = Recife"; char* cidade; cidade = Recife; Atribuio do endereo da constante Recife varivel cidade

Inicializao de Strings Atravs de Ponteiros


int main() { char *salute=saudacoes; puts(++salute); return 0; } int main() { char salute[] =saudacoes; puts(++salute); return 0; }

Estes dois cdigos executariam da mesma forma? Imprime audacoes (sem s): ponteiro varivel Erro de compilao: tentativa de modificar ponteiro constante
6

Passando Ponteiros para Strings para Funes


Na biblioteca string.h, existem vrias funes que tm como parmetros ponteiros para strings
Exemplos: char* strcpy(char* dest, char* origem); int strcmp(char* s1, char* s2);

Podemos passar como argumentos, tanto ponteiros para strings ou vetores de caracteres(strings) int main() { char *salute=saudacoes; char saudacao[10]; strcpy(saudacao,salute); return 0; }
7

Vetores de Strings x Vetores de Ponteiros para Strings


Quando queremos armazenar um conjunto de strings podemos:
Usar um vetor de strings Vetor bidimensional (matriz) de caracteres Usar um vetor de ponteiros para strings

Usando Vetor de Strings (Matriz de


Caracteres)
int main(){ Programa verifica se um nome int cont; entrado pelo usurio pertence a um int entra=0; vetor inicializado de strings char nome[40]; char list[4][7]= {Carlos, Ana, Pedro, Andre}; Cuidado para que as printf (Digite seu nome:); strings no excedam as gets(nome); colunas da matriz! for (cont=0; cont < 4; cont++){ if (strcmp(list[cont],nome) == 0) entra=1; } if (entra == 1) printf (Voc pode entrar.); else printf (Voc no pode entrar.); return 0; }

Usando Vetores de Ponteiros para Strings


int main(){ Programa verifica se um nome entrado int cont; pelo usurio pertence a um vetor int entra=0; char nome[40]; inicializado de ponteiros para strings char* list[4]= {Carlos, Ana, Pedro, Andre}; printf (Digite seu nome:); Despreocupao com gets(nome); tamanho das strings for (cont=0; cont < 4; cont++){ if (strcmp(list[cont],nome) == 0) entra=1; } if (entra == 1) printf (Voc pode entrar.); else printf (Voc no pode entrar.); return 0; }

Inicializao de um Vetor de Strings x Vetor de ponteiros para Strings


Verso Vetor de Strings 0 1 2 3 4 5 6 C a r l o s\0 Desperdcio de A n a \0 P e d r o\0 Memria! A n d r e\0

list[0] list[1] list[2] list[3]

Verso Vetor de Ponteiros list[0] C a r l o s \0 list[1] A n a \0 list[2] P e d r o\0 list[3] A n d r e \0


11

Outro Exemplo Usando Vetor de Strings


int main(){ Programa pede para o usurio int cont; preencher um vetor de strings int entra=0; char nome[40]; char list[4][10]; for (cont=0; cont < 4; cont++){ printf(\nEntre com mais um convidado:\n); gets(list[cont]); } Cuidado para que as return 0; strings no excedam as colunas da matriz! }

Outro Exemplo Usando Vetor de Ponteiro de Strings


int main(){ Programa pede para o usurio int cont; prencher um vetor de ponteiro para int entra=0; strings char nome[40]; char* list[4]; for (cont=0; cont < 4; cont++){ printf(\nEntre com mais um convidado:\n); gets(list[cont]); ERRADO! }
}

Tenta armazenar string em endereo (INVLIDO) apontado por list[cont]

Alocao de Memria
Quando declaramos uma varivel, o compilador reserva (aloca) um espao na memria suficiente para armazenar valores do tipo da varivel
Alocao esttica (em tempo de compilao) int var ; char s1 [10]; char* s2; Aloca espao para 1 int Aloca espao para 10 char Aloca espao para 1 endereo

14

Alocao Dinmica
Modos de alocar espao em memria:
Estaticamente Variveis globais (e estticas): O espao reservado para a varivel existe enquanto o programa estiver sendo executado Variveis locais: O espao existe enquanto a funo, que declarou a varivel, estiver sendo executada. Dinamicamente Requisitar memria em tempo de execuo: O espao alocado dinamicamente permanece reservado at que seja explicitamente liberado pelo programa 15

Alocao Dinmica em C
Funo bsica para alocar memria malloc presente na biblioteca stdlib.h
void* malloc(unsigned qtdBytes); Recebe como argumento um nmero inteiro sem sinal que representa a quantidade de bytes que se deseja alocar Retorna o endereo inicial da rea de memria alocada.

16

Alocao Dinmica em C com malloc


Aloca somente a quantidade de memria necessria
Exemplo:
int v = *v ; malloc (10 * 4) ;

Se a alocao for bem sucedida, v armazenar o endereo inicial de uma rea contnua de memria suficiente para armazenar 10 valores inteiros (4O bytes)
17

Alocao Dinmica em C com malloc


Uso do comando sizeof para ter independncia de plataforma de desenvolvimento
Exemplo:

int *v ; v = malloc(10 * sizeof (int)) ; Funo malloc retorna um ponteiro genrico, para qualquer tipo, representado por *void
Faz-se a converso para o tipo apropriado usando o operador de molde de tipo (cast)

v = (int *) malloc(10 * sizeof(int));


18

Erro na Alocao
Se no houver espao livre suficiente para realizar a alocao, a funo malloc retorna um endereo nulo
representado pelo smbolo NULL

uma boa prtica de programao testar se a alocao foi bem sucedida para evitar erros de execuo

19

Liberando Espao Alocado


Uso da funo free para liberar espao de memria alocada dinamicamente
void free(void* endereco);
Recebe como parmetro o ponteiro da memria a ser liberada O espao de memria fica livre para ser alocado futuramente pelo prprio programa ou outro programa Recomenda-se liberar espao de memria previamente alocado que no mais necessrio Evita desperdcio
20

Memria e Alocao Dinmica


1) Declarao: int

*v ;

2) v=(int*)malloc(10*sizeof (int));
Reserva-se o espao de memria da rea livre e atribui o endereo v
Cdigo do programa Variveis Globais e Estticas 40 bytes Memria livre 504

Abre-se espao na pilha para o ponteiro (varivel local)


Cdigo do programa Variveis Globais e Estticas

Memria livre

504
21

Usando Alocao Esttica para Calcular Mdia com Vetores


#include <stdio.h> int main() { int qtdNumeros,contador = 0; Declarao esttica do float numeros[2000]; tamanho do vetor limita float media = 0.0; aplicao do{ printf(Quantidade de numeros? (< 2000):\n); scanf(%d, &qtdNumeros); } while (qtdNumeros <= 0 || qtdNumeros > 2000); while (contador < qtdNumeros) { scanf(%f,&numeros[contador]); media = media + numeros[contador]; contador++; } Tamanho pode ser media = media/qtdNumeros; insuficiente ou grande printf(\nA media eh %f\n); demais (desperdcio) return 0; 22 }

Vetores Dinmicos
Declarao de vetores implicam em alocao esttica de memria
Com alocao dinmica, podemos criar algo como um vetor cujo tamanho decidido em tempo de execuo, ou seja um vetor dinmico Para tal, usaremos variveis do tipo ponteiro que recebero os endereos iniciais do espao alocado dinamicamente
Com o endereo inicial, podemos navegar pelo vetor
23

Usando Alocao Dinmica para Calcular Mdia com Vetores Dinmicos


int main() { Ponteiro recebe int qtdNumeros,contador = 0; endereo de espao float* numeros; alocado dinamicamente float media = 0.0; do{ (vetor dinmico) printf(Quantidade de numeros?:\n); scanf(%d, &qtdNumeros); } while (qtdNumeros <= 0); numeros = (float*) malloc(qtdNumeros*sizeof(float)); if (numeros == NULL) { printf(Memoria insuficiente);exit(1); } while (contador < qtdNumeros) { scanf(%f,&numeros[contador]); media = media + numeros[contador]; contador++; Tamanho do vetor } /* continua */ determinado pelo usurio 24 }

Funo Realloc
Podemos mudar o espao de memria alocado previamente de forma dinmica Para isso, podemos utilizar a funo realloc void* realloc(void* ptr,unsigned qtdBytes);
Recebe endereo do bloco de memria alocado previamente Recebe como argumento um nmero inteiro sem sinal que representa a quantidade de bytes que se deseja alocar Retorna o endereo inicial da rea de memria alocada Se endereo retornado for diferente do passado como parmetro, contedo do bloco original copiado para novo endereo
25

Usando Realloc
int main() { int qtdNumeros = 5,contador = 0; Vetor alocado char resposta; dinamicamente float media = 0.0; float* nums; nums = (float*) malloc(qtdNumeros*sizeof(float)); if (nums == NULL) { printf(Memoria insuficiente);exit(1); } printf(Programa calcula media de 5 numeros.); printf(Deseja mais/menos? (s/n)\n); scanf(%c,&resposta); Tamanho do vetor muda if (resposta == s) { dinamicamente do { printf(Quantidade de numeros?:\n); scanf(%d, &qtdNumeros); } while (qtdNumeros <= 0); nums = (float*) realloc(nums,qtdNumeros*sizeof(float)); /* continua */ 26 }

Vetores e Alocao Dinmica


Vetores Locais e Funes
float* prod_vetorial float p[3] ; p[0] = u [ 1 ] * p[1] = u [ 2 ] * p[2] = u [ 0 ] * return p ; (float* v [ 2 ] v [ 0 ] v [ 1 ] u , float* v [ 1 ] v [ 2 ] v [ 0 ] v) { * u [ 2 ] ; * u [ 0 ] ; * u [ 1 ] ;

ERRADO! Endereo local retornado


A varivel retornada declarada localmente. Por isso, sua rea de memria deixa de ser vlida quando a funo termina.

27

Vetores e Alocao Dinmica


Vetores Locais e Funes
Forma Correta:
float* prod_vetorial (float* u , float* v) { float* p = (float*) malloc(3 * sizeof(float)) ; p[0] = u [ 1 ] * v [ 2 ] v [ 1 ] * u [ 2 ] ; p[1] = u [ 2 ] * v [ 0 ] v [ 2 ] * u [ 0 ] ; p[2] = u [ 0 ] * v [ 1 ] v [ 0 ] * u [ 1 ] ; return p ;

CERTO! Endereo alocado dinamicamente fica disponvel at que seja liberado explicitamente
28

Criando Matrizes Dinmicas


Deve-se usar um ponteiro para ponteiro
int** matriz;

Pode-se pensar em uma matriz dinmica como um vetor de ponteiros


Cada elemento do vetor contm o endereo inicial de uma linha da matriz (vetor-linha) Para alocar uma matriz com malloc, preciso fazer a alocao do vetor de ponteiros e, em seguida, de cada vetor-linha Da mesma forma, a liberao da memria feita em partes
29

Ponteiro para ponteiro

30

Representando Matrizes Dinmicas na Memria


int** m;
Matriz m

6
7

10
11

Memria
m
100 107 106 105 104 103 102 101 100 300 408

412

408

11

Vetor Linha
300
304

10

Ponteiro (endereo inicial do vetor linha) 31

Alocando uma Matriz Dinmica


int main () {

int linhas, colunas,i,j; printf(Numero de linhas e colunas da matriz:\n"); scanf("%d %d",&linhas,&colunas); float** mat ; mat = (float**) malloc(linhas * sizeof(float*)); for (i = 0 ; i< linhas ; i++) { mat[i]= (float*) malloc(colunas * sizeof(float)) ; } printf("\n Digite os elementos da matriz:\n"); for(i=0; i< linhas; i++) { for(j=0; j< colunas; j++) { printf("Elemento [%d][%d] = ",i,j); scanf("%f",&mat[i][j]); Alocando vetor printf("\n"); } de ponteiros Alocando } vetores-linha /* continua */

Liberando uma Matriz Dinmica


void liberaMatriz (int** mat, int linhas) { int i,j; for(i=0; i< linhas; i++) { free(mat[i]); } Libera primeiro free(mat); cada vetor linha } Libera depois vetor de ponteiros

Passando Matrizes Dinmicas como Argumentos


void imprimeMatriz(int linhas, int** mat) { int i,j; for (i=0; i < linhas; i++){ for (j=0;j < 2; j++){ printf("%d ",mat[i][j]); } Parmetro do tipo ponteiro printf("\n"); para ponteiro de int } }
Acesso usando notao de ponteiro: *(*(mat+i)+j)

Cuidado na Assinatura da Funo


void imprimeMatriz(int linhas, int** mat) { int i,j; for (i=0; i < linhas; i++){ for (j=0;j < 2; j++){ printf("%d ",mat[i][j]); } Parmetro do tipo ponteiro printf("\n"); de ponteiro de int } } int main() { int matriz[][2] = {{6,10},{7,11}}; imprimeMatriz(2,matriz); return 0; Endereo da matriz esttica passada como argumento }

Erro de Execuo!

Cuidado na Assinatura da Funo


void imprimeMatriz(int linhas, int mat[][2]) { int i,j; for (i=0; i < linhas; i++){ for (j=0;j < 2; j++){ printf("%d ",mat[i][j]); } Parmetro do tipo vetor printf("\n"); de vetores de int } } int main() { int matriz[][2] = {{6,10},{7,11}}; imprimeMatriz(2,matriz); return 0; Parmetro deve indicar nmero de colunas } Certo!

Resumindo ...
Relao entre ponteiros e strings
Ponteiros para strings X Vetores de Caracteres Vetores de ponteiros para strings Alocao Dinmica Uso Funes em C para alocao dinmica Usando alocao dinmica para criar vetores e matrizes dinmicas
37

Introduo a Programao

Tipos Estruturados de Dados

Tpicos da Aula
Hoje aprenderemos a trabalhar com tipos de dados mais complexos
Tipos Primitivos x Tipos Estruturados Conceito de Tipos Estruturados Importncia Tipos Estruturados em C (struct) Declarao de structs Variveis do tipo struct Operaes com estruturas Comando typedef Passando Estruturas para Funes Estruturas Aninhadas

Tipos Estruturados
C oferece tipos primitivos que servem para representar valores simples Reais (float, double), inteiros (int), caracter (char) C oferece tambm mecanismos para estruturar dados complexos nos quais as informaes so compostas por diversos campos
Tipos Estruturados !

Tipos Estruturados
Agrupa conjunto de tipos de dados distintos sob um nico nome Podemos criar varios objetos na memria de um determinado tipo estruturado Nome do tipo Estruturas ou Registros estruturado Cadastro Pessoal string Nome string Endereo inteiro Telefone Membro do tipo inteiro Idade estruturado inteiro Data de Nascimento float Peso float Altura

Tipos Estruturados em C (struct)


Forma Geral:
struct nome_do_tipo { declarao de varivel 1 ; declarao de varivel n ; }; Cadastro Pessoal Nome Endereo Telefone Idade
Data de Nascimento struct cadastro_pessoal { char nome[50]; char endereo[100]; int telefone; int idade; int nascimento; float peso; float altura; };

Peso Altura

Importncia de Tipos Estruturados


Considere um ponto representado por duas coordenadas: x e y Sem mecanismos para agrupar as duas coordenadas:
int main() {
float float x ; y ; No d para saber que estas variveis representam coordenadas de um ponto

}
6

Importncia de Tipos Estruturados


Uma estrutura em C serve para agrupar diversas variveis dentro de um nico contexto
struct ponto x ; {

float

float
};

y ;

Declarando Variveis do Tipo Ponto


A estrutura ponto passa a ser um tipo Ento, podemos declarar uma varivel deste tipo da seguinte forma:
struct ponto { A varivel do tipo struct ponto float x ; float y ; }; int main() { struct ponto p ; ... }
8

Acessando Membros do Tipo Ponto


Membros de uma estrutura so acessados via o operador de acesso ( . )
Para acessar as coordenadas: struct ponto { float x ; float y ; }; int main() { struct ponto p ; p . x = 10.0 ; p.x = 0.0; p . y = 5.0 ; p.y = 7.5; ... }
O nome da varivel do tipo struct ponto deve vir antes do .

Utilizando oTipo Estruturado Ponto


*/ programa que captura e imprime coordenadas*/ #include <stdio.h> struct ponto { float x ; float y ; } ; int main (){ struct ponto p ; printf(\nDigite as coordenadas do ponto (x,y)) ; scanf (%f %f, &p.x , &p.y ) ; printf(O ponto fornecido foi:(%f,%f)\n,p.x, p.y); return 0 ; } varivel p no

precisa de parnteses

10

Onde Declarar um Tipo Estruturado?


Geralmente, declara-se um tipo estruturado fora das funes
Escopo da declarao engloba todas as funes no mesmo arquivo fonte

Pode-se, tambm, declarar tipos estruturados dentro de funes


Neste caso, escopo do tipo estruturado na funo

11

Declarando oTipo Estruturado Fora das Funes


struct ponto { float x ; float y ; } ;

Declarado fora das funes

struct ponto alteraPonto(float x, float y){ struct ponto q; q.x = x; Funes podem q.y = y; usar o tipo return q; estruturado } declarado acima int main (){ struct ponto p ; printf(\nDigite as coordenadas do ponto (x,y)) ; scanf (%f %f, &p.x , &p.y ) ; p = alteraPonto(8,9); ... 12 }

Declarando oTipo Estruturado Dentro de uma Funo


void leCoordenadas(float* x, float* y){ struct ponto { Declarado dentro float x ; da funo float y ; alteraPonto }; struct ponto q; scanf (%f %f, &q.x , &q.y ) ; Outra funo NO *x = q.x; *y = q.y; } int main (){ struct ponto p ; printf(\nDigite as coordenadas do ponto (x,y)) ; leCoordenadas(&p.x , &p.y ) ; ... }

enxerga a declarao do tipo estruturado

Errado !

13

Outras Formas de Declarar Tipos Estruturados e Variveis


Pode-se declarar um tipo estruturado e uma varivel deste tipo de diferentes formas
struct ponto x ; y ; { float float } p; struct { Declara-se tipo SEM NOME e varivel numa expresso s Declara-se tipo e varivel numa expresso s

float
float } p;

x ;
y ;

Cuidado com legibilidade !

14

Inicializando Variveis de Tipos Estruturados


Uma varivel de um tipo estruturado pode ser inicializada com uma estrutura com o auxlio do abre-fecha parnteses( { e } )
Inicializao da struct pessoa { varivel p do tipo char nome[60] ; struct pessoa int idade ; }; int main() { struct pessoa p = {Ana, 30}; ... } Deve-se inicializar os membros na 15 ordem correta

Atribuio de Estruturas
A estrutura armazenada por uma varivel de um tipo estruturado pode ser atribuda a outra varivel deste mesmo tipo estruturado struct pessoa { Atribuio de uma char nome[60] ; estrutura para a int idade ; varivel p1 }; (Errado) int main() { struct pessoa p1,p2; p1 = {Ana, 30}; p2 = p1; ... } Atribuio da estrutura contida em p1 para p2

16

Outras Operaes com Estruturas


Como escrever um programa que imprime a soma das coordenadas de dois pontos?
struct ponto { float x ; No podemos somar float y ; estruturas inteiras }; int main() { struct ponto p3; struct ponto p1 = {0.0, 4.5}; struct ponto p2 = {1.0,2.5}; Errado ! p3 = p1 + p2; printf(O x e y do novo ponto :%f,%f,p3.x,p3.y); return 0; }
17

Outras Operaes com Estruturas


Como escrever um programa que imprime a soma das coordenadas de dois pontos?
struct ponto { float x ; Temos que somar float y ; membro a membro }; int main() { struct ponto p3; struct ponto p1 = {0.0, 4.5}; struct ponto p2 = {1.0,2.5}; Certo ! p3.x = p1.x + p2.x; p3.y = p1.y + p2.y; printf(O x e y do novo ponto :%f,%f,p3.x,p3.y); return 0; } 18

Usando typedef
O comando typedef permite criar novos nomes para tipos existentes
Criao de sinnimos para os nomes de tipos til para abreviar nomes de tipos ou tipos complexos Forma Geral:

typedef tipo_existente sinonimo;

19

Usando typedef
Aps a definio de novos nomes para os tipos, podese declarar variveis usando estes nomes

struct pessoa { char nome[60] ; Tipo existente int idade ; }; typedef struct pessoa Pessoa; int main() { Pessoa p = {Ana, 30}; ...
} Novo nome Simplificou declarao do tipo de varivel

20

Usando typedef
Podemos combinar typedef com declarao do tipo estruturado
typedef struct pessoa { char nome[60] ; int idade ; } Pessoa; int main() { Pessoa p = {Ana, 30};
... Criao de tipo e criao de sinnimo
21

Passagem de Estruturas para Funes


Considere a funo abaixo:
void imprimePonto ( struct ponto p ){ printf(O ponto fornecido foi:(%f,%f)\n,p.x,p.y); }

Assim como podemos passar tipos primitivos como argumentos para uma funo, podemos passar estruturas

22

Passagem de Estruturas para Funes


*/ programa que captura e imprime coordenadas*/ #include <stdio.h> Passa a estrutura typedef struct ponto { armazenada em p float x ; como argumento float y ; } Ponto; void imprimePonto(Ponto q) { printf(O ponto fornecido foi:(%f,%f)\n,q.x, q.y); int main (){ Ponto p ; printf(\nDigite as coordenadas do ponto (x,y)) ; scanf (%f %f, &p.x , &p.y ) ; imprimePonto(p); return 0 ; }

23

Retornando Estruturas
Considere a funo abaixo:
struct ponto alteraPonto(float x, float y ){ struct ponto q; q.x = x; q.y = y; return q; }

Assim como uma funo pode retornar um valor de um tipos primitivo, uma funo pode retornar uma estrutura

24

Retornando Estruturas
typedef struct ponto float x ; float y ; } Ponto; {

Ponto alteraPonto(float x, float y){ Ponto q; q.x = x; Varivel p recebe q.y = y; a estrutura return q; retornada por } alteraPonto int main (){ Ponto p ; printf(\nDigite as coordenadas do ponto (x,y)) ; scanf (%f %f, &p.x , &p.y ) ; p = alteraPonto(8,9); ... 25 }

Tipos Estruturados Mais Complexos


Aninhamento de estruturas Membros de uma estrutura podem ser outras estruturas previamente definidas Exemplo:
typedef struct ponto float x ; float y ; } Ponto; {

Tipo estruturado Circulo tem como um dos membros um Ponto

typedef struct circulo { Ponto centro; float raio; } Circulo;


26

Usando os Tipos Ponto e Circulo


Funo que calcula a distncia entre 2 pontos
float distancia ( Ponto p , Ponto q ){ float d = sqrt((q.x p.x )*(q.x p.x)+ (q.y p.y)*(q.y p.y)) ; return d ; } d ( x2 x1 ) 2 ( y2

y1 ) 2

Funo que determina se um ponto est no crculo


int interior ( Circulo c , Ponto float d = distancia ( c.centro , return ( d <= c.raio ) ; } p ){ p ) ;

Passa para distancia uma estrutura Ponto que membro da estrutura Circulo

27

Resumindo
Tipos Estruturados Structs Operaes com Estruturas Comando typedef Passando Estruturas para Funes Estruturas Aninhadas

28

Introduo a Programao

Ponteiros para Estruturas, Outros Tipos de Estruturas

Tpicos da Aula
Hoje aprenderemos a trabalhar com ponteiros para estruturas
Ponteiros para estruturas Alocao dinmica de estruturas Passagem por referncia de estruturas Vetores de estruturas x Vetores de ponteiros para estruturas

Aprenderemos tambm que existe formas de tipos estruturados em C


Tipo Unio (Union) Tipos Enumerados (Enum)

outros

Usando Ponteiro para Estruturas


Podemos ter variveis do tipo ponteiro para estruturas
struct ponto { float x ; float y ; }; int main() { struct ponto q; struct ponto* p = &q ... }

A varivel p armazena o endereo de uma estrutura p ;

Acessando os Membros Atravs do Ponteiro


Os membros de uma estrutura so acessados usando seu nome seguido do operador ponto
Podemos acessar os membros do mesmo jeito utilizando ponteiros?
struct ponto { float x ; No ! float y ; }; int main() { No podemos struct ponto q; acessar membros struct ponto* p = &q; de uma estrutura p.x = 7.0; via ponteiro desta ... } forma

Acessando os Membros Atravs do Ponteiro


Para acessar os membros de uma estrutura por meio de um ponteiro, existem 2 formas:
Usando o operador * seguido da varivel dentro de parnteses Precisa de parnteses para varivel p, seno (*p).x = 7.0; o compilador entenderia como *(p.x)- Errado! Usando o operador ->

p->x = 7.0;
5

Alocao Dinmica de Estruturas


A alocao dinmica de estruturas feita de forma similar a como feito com tipos primitivos
struct pessoa { char nome[32] ; int idade ; double peso; };

Aloca espao na memria para uma estrutura que contm um vetor de 32 caracteres (32 bytes), um inteiro (4 bytes) e um double (8 bytes)

int main() { struct pessoa* p; p = (struct pessoa*) malloc(sizeof(struct pessoa)); strcpy(p->nome,Ana); p->idade = 30; ... } 6

Alocao Dinmica de Estruturas


struct paciente { Aloca espao na float* vTemperatura ; struct pessoa individuo; memria para um vetor com 5 inteiros }; typedef struct paciente Paciente; int main() { Paciente* p; p = (Paciente*) malloc(sizeof(Paciente)); p->individuo.idade = 30; strcpy(p->individuo.nome,Ana); p->vTemperatura = (float*) malloc(5 * sizeof(float)); p->vTemperatura[0] = 37.5; }

Aloca espao na memria para uma estrutura que contm um ponteiro para float (4 bytes), e uma estrutura pessoa (44 bytes)

Passagem de Estruturas para Funes


void captura ( struct ponto p ) { printf( Digite as coordenadas do ponto (x,y): ) ; scanf ( %f %f , &p.x, &p.y ) } int main() { struct ponto p; captura(p); ... } ;

Valores da estrutura no podem ser modificados

Cpia da estrutura na pilha no eficiente mais conveniente passar apenas o ponteiro da estrutura 8

Uma funo para imprimir as coordenadas


void imprime ( struct ponto* p ){ printf(O ponto fornecido foi:(%f,%f)\n,p->x,p->y); }

Passagem de Ponteiros para Estruturas para Funes

Uma funo para ler as coordenadas


void captura ( struct ponto *p ) { printf( Digite as coordenadas do ponto (x,y): ) ; scanf ( %f %f , &p->x, &p->y ) } ;

Permite modificar o valor da varivel p


9

Passagem de Ponteiros para Estruturas para Funes


struct ponto { float x ; float y ; } ; void imprime ( struct ponto* p ){ printf(O ponto fornecido foi:(%f,%f)\n,p->x,p->y); } void captura ( struct ponto* p ) { printf( Digite as coordenadas do ponto (x,y): ) ; scanf ( %f %f , &p->x, &p->y ) ; } int main (){ struct ponto p ; captura(&p); imprime(&p); } 10

Vetores de Estruturas
Podemos utilizar vetores de estruturas Considere o clculo de um centro geomtrico de um conjunto de pontos
x

x
i 1

e y

y
i 1

struct ponto centrogeometrico(int n,struct ponto* v){ int i ; struct ponto p = { 0.0 , 0.0 } ; for ( i = 0 ; i < n ; i++ ){ p.x += v[i].x ; Endereo inicial do p.y += v[i].y ; vetor de pontos } p.x /= n ;p.y /= n ; return p ; Acessando coordenada x do i- 11 }

simo ponto do vetor v

Vetores de Ponteiros para Estruturas


So teis quando temos de tratar um conjunto de elementos complexos
Exemplo: Vetores de alunos
Matricula: nmero inteiro ; Nome: cadeia com 80 caracteres ; Endereo: cadeia com 120 caracteres ; Telefone: cadeia com 20 caracteres ;

Em C podemos representar aluno:


struct aluno { int mat ; char nome [81] ; char end [121] ; char tel [ 21 ] ; } ; typedef struct aluno ALUNO ;

12

Vetores de Ponteiros para Estruturas


Se usarmos um vetor com um nmero mximo de alunos:
#define MAX 100 ALUNO tab[MAX];
Tipo ALUNO ocupa pelo menos 227(=4+81+121+21) bytes Se for usado um nmero de alunos inferior ao mximo estimado, a declarao de um vetor dessa estrutura representa um desperdcio significativo de memria Uma soluo : #define MAX 100 ALUNO* tab[MAX];
13

Usando Vetores de Ponteiros para Estruturas


#define MAX 100 struct aluno { int mat ; char nome [81]; char end [121] ; char tel [21] ; } ; typedef struct aluno ALUNO* tab[MAX];

ALUNO;

void inicializa (int n,ALUNO** tab){ int i ; Todas as posies do for(i=0 ;i< n;i++) vetor de ponteiros tab [i] = NULL ; } guardam endereos

nulos

14

Usando Vetores de Ponteiros para Estruturas


void preenche(int n,ALUNO **tab ){ int i; for ( i = 0; tab[i]!= NULL && i < n; i++ ); if (i < n) { tab[i]= ( ALUNO*) malloc (sizeof(ALUNO)); printf (\nEntre com a matricula:); scanf (%d, &tab[i]->mat) ; printf (\nEntre com o nome:) ; scanf (%80[^\n], tab[i]->nome) ; printf (\nEntre com o endereco:) ; scanf (%120[^\n], tab[i]->end) ; printf (\nEntre com o telefone:) ; scanf (%20[^\n], tab[i]->tel) ; } else { printf(Vetor cheio\n); } Espao alocado para um novo aluno e }

endereo armazenado no vetor

15

Usando Vetores de Ponteiros para Estruturas


void retira(int n,ALUNO** tab,int if ( i >= 0 && i < n) { if (tab[i] != NULL) { free(tab[i]); tab[i] = NULL; } i ) {

} else {
printf(Indice fora do limite do vetor\n); } }
16

Usando Vetores de Ponteiros para Estruturas


void imprime(int n,ALUNO** tab,int i ){ if ( i >= 0 && i < n) { if (tab[i]!= NULL){ printf (Matricula: %d\n,tab[i]->mat); printf (Nome: %s\n,tab[i]->nome); printf (Endereo: %s\n,tab[i]->end); printf (Telefone: %s\n,tab[i]->tel); } } else { printf(Indice fora do limite do vetor\n); } }

17

Usando Vetores de Ponteiros para Estruturas

void imprime_tudo(int n,ALUNO** tab){ int i; for(i = 0; i < n; i++) imprime(n,tab,i); }

18

Usando Vetores de Ponteiros para Estruturas


int main(){ ALUNO *tab[10]; inicializa(10,tab); preenche(10,tab); preenche(10,tab); preenche(10,tab); imprime_tudo(10,tab); retira(10,tab,0); retira(10,tab,1); retira(10,tab,2); return 0 ; }

19

Tipos Estruturado enum


O tipo estruturado enum (enumerao) consiste de um conjunto de constantes inteiras, em que cada uma delas representada por um nome Uma enumerao uma forma mais elegante de organizar constantes
D-se um contexto ao conjunto de constantes Uma varivel de um tipo enumerado pode assumir qualquer valor listado na enumerao

20

Definindo uma enum


Forma Geral :
enum nome_do_tipo { constante1, constante2,constante n }; Exemplo: enum dias_semana { domingo, segunda, terca, quarta, quinta, sexta, sabado };
21

Valores das Constantes Definidas em uma enum


Internamente, o compilador atribui valores inteiros a cada constante seguindo a ordem em que elas so definidas, comeando de 0, depois 1, etc
Portanto: enum dias_semana { domingo, segunda, terca, quarta, quinta, sexta, sabado }; domingo == 0 segunda == 1 sabado == 6
22

Valores das Constantes Definidas em uma enum


No entanto, o programador pode atribuir diretamente os valores inteiros desejados

enum dias_semana { domingo = 1, segunda, terca, quarta, quinta, sexta, sabado }; domingo == 1 segunda == 2 sabado == 7
23

Usando enums
enum dias_semana { domingo, segunda, terca, quarta, quinta, sexta, sabado }; typedef enum dias_semana DIAS; int dia_util(DIAS dia) { int ehUtil = 0; if (dia >= segunda && dia <= sexta) { ehUtil = 1; } return ehUtil; }

Funo verifica se um dia passado como argumento til ou no


24

Tipo Estruturado Union


Assim como uma struct, uma union agrupa um conjunto de tipos de dados (que podem ser distintos) sob um nico nome Diferentemente de uma struct, uma union armazena valores heterogneos em um mesmo espao de memria

Apenas um nico membro de uma union pode estar armazenado em um determinado instante
A atribuio a um membro da union sobrescreve o valor anteriormente atribudo a qualquer outro membro

Utiliza-se em casos onde se quer otimizar uso de memria

25

Definindo uma Union


Forma Geral :
union nome_do_tipo { declarao de varivel 1 ; declarao de varivel n ; }; Exemplo: union numero { char str[32]; int inteiro ; double real; };
26

Union x Struct
struct pessoa { char nome[32]; int idade ; double peso; };
44 bytes na memria (soma do tamanho das variveis)
peso - 8 bytes idade -4 bytes

union numero { char str[32]; int inteiro ; double real; };


32 bytes na memria (maior varivel - str)

4 bytes
nome -32 bytes

str, inteiro e real -32 bytes


27

Manipulando uma Union


Declarao de varivel
union numero num;

Acesso aos membros de uma union


Diretamente ( Operador . ): num.inteiro = 60; Via um ponteiro (Operador -> ): union numero num; union numero* pnum = &num; pnum->real = 60.5;
28

Cuidado ao Acessar Membros de Unions


union numero { char str[32]; O que ser impresso nas 3 linhas int inteiro ; da rea demarcada? double real; }; num.inteiro = 70 typedef union numero NUMERO; int main(){ NUMERO num; strcpy(num.str,"Joao"); Comportamento num.real = 45.7; imprevisvel! num.inteiro = 70; printf("num.inteiro = %d\n",num.inteiro); printf("num.real = %lf\n",num.real); printf(num.str = %s\n",num.str); return 0; }

num.real = ????? num.str = ??????

29

Introduo a Programao

Arquivos

Tpicos da Aula
Hoje aprenderemos a persistir dados
Conceito de arquivos Importncia de persistncia Modos de acesso de arquivos em C Operaes em arquivos Funes de leitura/escrita em modo binrio

Arquivos
Um arquivo representa um elemento de informao armazenado em memria secundria (disco) Caractersticas:

Informaes so persistidas Atribui-se nomes aos elementos de informao (arquivos e diretrios),em vez de endereos de memria Acesso s informaes so mais lentos

Persistncia... pra qu?


No perder os dados no fim da execuo de um programa
Memria temporria(volatil) principal Mais rpida e cara Memria permanente secundria mais lenta e barata

Para melhorar velocidade de acesso, a cada acesso, transfere-se trechos maiores do arquivo para espaos da memria (buffers)
4

Modos de Acesso a Arquivos em C


Dois modos de acesso:
Texto e Binrio String Informao persistida
Arquivo Texto: Arquivo Binario:

0 1 2 3 4

0 1 2 3 4

Inteiros

Modo Texto
interpretado como uma seqncia de caracteres agrupadas em linhas Linhas so separadas por um caractere de nova linha Vantagens:
Pode ser lido facilmente por uma pessoa Editado por editores de texto convencionais

Desvantagens

Codificao dos caracteres pode variar (ASCII, UTF8, ISSO-8859, etc) Arquivos tendem a ser maiores (todas os dados so convertidos para caracteres)
6

Modo Binrio
Dados so armazenados da mesma forma que so armazenados na memria principal

Vantagens:

Facilmente interpretados por programas Maior velocidade de manipulao Arquivos so, geralmente, mais compactos Difcil de serem entendidos por pessoas Dependentes da mquina onde foram gerados

Desvantagens:

Operaes em Arquivos
Abertura
Sistema Operacional (SO) encontra arquivo pelo nome Prepara buffer na memria

Leitura
SO recupera trecho solicitado do arquivo Parte ou todo trecho pode vir do buffer

Operaes em Arquivos
Escrita
SO altera contedo do arquivo Alterao feita primeiro no buffer para depois ser transferida para o disco

Fechamento
Informao do buffer atualizada no disco rea do buffer utilizada na memria liberada

Abertura de Arquivos em C
Operaes de manipulao de arquivos em C se encontram, geralmente, na stdio.h Funo de Abertura
FILE* fopen(char* nome,char* modo);
Nome Nome do arquivo FILE Tipo estruturado que representa uma abstrao do arquivo modo r - Indica leitura w Indica escrita a Indica escrita ao final do existente t Indica modo texto b Indica modo binrio
10

Abrindo arquivos
FILE *fptr; /* ponteiro para arquivo */ fptr = fopen(arqtext.txt, w);

nome do arquivo
Tipo de abertura

Modo t pode ser omitido

r Abrir arquivo texto para leitura. O arquivo deve estar presente no disco w Abrir arquivo texto para gravao. Se o arquivo existir ele ser destrudo e reinicializado. Se no existir, ser criado a Abrir um arquivo texto para gravao. Os dados sero adicionados no fim do arquivo existente, ou cria um novo
11

Abrindo arquivos
FILE *fptr; /* ponteiro para arquivo */ fptr = fopen(arqtext.txt, w+); Tipo de abertura
r+ Abrir arquivo texto para leitura e gravao. O arquivo deve existir e pode ser atualizado. w+ Abrir arquivo texto para leitura e gravao. Se o arquivo existir ele ser destrudo e reinicializado. Se no existir, ser criado. a+ Abrir um arquivo texto para atualizao e para adicionar dados no fim do arquivo existente, ou cria um novo
12

Abrindo arquivos
FILE *fptr; /* ponteiro para arquivo */ fptr = fopen(arqtext.txt, wb);
Tipo de abertura

rb Abrir arquivo binrio para leitura. O arquivo deve estar presente no disco wb Abrir arquivo binrio para gravao. Se o arquivo existir ele ser destrudo e reinicializado. Se no existir, ser criado ab Abrir um arquivo binrio para gravao. Os dados sero adicionados no fim do arquivo existente, ou cria um novo

13

Abrindo arquivos
FILE *fptr; /* ponteiro para arquivo */ fptr = fopen(arqtext.txt, wb+); Tipo de abertura

rb+ Abrir arquivo binrio para leitura e gravao. O arquivo deve existir e pode ser atualizado. wb+ Abrir arquivo binrio para leitura e gravao. Se o arquivo existir ele ser destrudo e reinicializado. Se no existir, ser criado. ab+ Abrir um arquivo binrio para atualizao e para adicionar dados no fim do arquivo existente, ou cria um novo
14

Observaes sobre Abertura de Arquivos em C


SO mantm um cursor que indica a posio de trabalho no arquivo Se no for possvel a abertura, a funo fopen retorna NULL

15

Fechamento de Arquivos
Aps leitura/escrita do arquivo, devemos fechlo Funo de fechamento
int fclose(FILE* fp); Retorna 0 se o arquivo foi fechado com sucesso

16

Leitura (Modo Binrio)


int fread(void* p,int tam,int nelem,FILE* fp);
p o endereo de memria em que vai ser armazenado o que for lido tam o tamanho em bytes de cada elemento lido nelem o nmero de elementos de tamanho tam lidos Retorna a quantidade de bytes lidos com sucesso (tam * nelem)

17

Escrita (Modo Binrio)


int fwrite(void* p,int tam,int nelem,FILE* fp);
p o endereo de memria cujo contedo deseja-se salvar em arquivo tam o tamanho em bytes de cada elemento escrito nelem o nmero de elementos de tamanho tam escritos Retorna a quantidade de bytes escritos com sucesso (tam * nelem)

18

Verificando o Final do Arquivo


Em operaes de leitura do arquivo, comum verificarmos se o final do arquivo j foi atingido Funo de verificao de fim de arquivo
int feof(FILE* fp); Retorna 1 se o fim do arquivo foi atingido Retorna 0 caso contrrio

19

Usando fwrite na Escrita


#include <stdio.h> typedef struct ponto { float x,y; } Ponto;

Programa que salva n pontos em um arquivo binrio

Gravando cada ponto entrado int main () { int i,n; pelo usuario usando fwrite Ponto p; FILE* fp = fopen(arquivo, wb); if (fp == NULL) { printf(Erro na abertura do arquivo.\n); exit(1); } printf(Digite numero de pontos a gravar\n); scanf(%d,&n); for (i = 0; i < n; i++) { scanf(%d %d,&p.x,&p.y); fwrite(&p, sizeof(Ponto), 1, fp); } fclose(fp); 20 }

Usando fread na Leitura


#include <stdio.h> int main () { int i,n; Ponto p; FILE* fp = fopen(arquivo, rb); if (fp == NULL) { printf(Erro na abertura do arquivo.\n); exit(1); Testa se o fim do arquivo j } foi atingido while(!feof(fp)){ fread(&p, sizeof(Ponto), 1, fp); printf(Ponto lido: (%d,%d),p.x,p.y); } fclose(fp); }

Programa que l todos os pontos armazenados em um arquivo binrio

L cada ponto e guarda na varivel p

21

Leitura/Escrita de Blocos de Dados


As funes fread/fwrite permitem ler/escrever grandes blocos de dados em um arquivo

Um dos parmetros indica qual a quantidade de dados de um determinado tipo a ser lido/escrito

Portanto podem ser teis para ler/escrever estruturas ou vetores em um arquivo numa nica chamada de funo

22

Usando fwrite na Escrita


#include <stdio.h> typedef struct ponto { float x,y; } Ponto; Nmero de pontos do vetor

void salva (char* arquivo, int n, Ponto* vet) { FILE* fp = fopen(arquivo, wb); if (fp == NULL) { printf(Erro na abertura do arquivo.\n); exit(1); } fwrite(vet, sizeof(Ponto), n, fp); fclose(fp); } Funo que salva um vetor de pontos em um arquivo binrio
23

Usando fread na Leitura


void carrega (char* arquivo, int n, Ponto* vet) { FILE* fp = fopen (arquivo, rb); if (fp == NULL) { printf(Erro na abetura do arquivo.\n); exit(1); } fread (vet, sizeof(Ponto), n, fp); fclose(fp); } Funo que recupera um vetor de pontos de um arquivo binrio

24

Usando as Funes Definidas Anteriormente


int main() { Ponto *entrada, *saida; int nPontos, cont,pos ; FILE *arquivo; char nome_arquivo[121]; printf(Digite o nome do arquivo:\n); scanf(%120s,nome_arquivo); printf(\nDigite o nmero de pontos:\n); scanf(%d,&nPontos); entrada = (Ponto *) malloc(nPontos*sizeof(Ponto)); for (cont = 0; cont < nPontos;cont++) { printf(Digite coordenadas x,y:\n); scanf(%f%f,&entrada[cont].x,&entrada[cont].y); } Programa que salva e recupera um vetor de /* continua */ pontos em um arquivo binrio
25

Usando as Funes Definidas Anteriormente


salva(nome_arquivo, nPontos, entrada); do { printf(Digite agora a posio do ponto que deseja ver: \n); Gravando os pontos no arquivo scanf(%d,&pos); } while (pos > nPontos || pos<=0 ); saida = (Ponto *) malloc (nPontos*sizeof(Ponto)); carrega(nome_arquivo, nPontos, saida); printf(O ponto na posicao %d {%f,%f}\n, pos, saida[pos-1].x, saida[pos-1].y); } Lendo os pontos do arquivo
26

Introduo a Programao

Manipulando Arquivos em Modo Texto

Tpicos da Aula
Hoje aprenderemos funes de manipulao de arquivos texto
Funes de leitura em modo texto Funes de escrita em modo texto Consideraes sobre a utilizao de operaes de leitura/escrita em modo texto e binrio

Aprenderemos tambm algumas funes que servem para posicionar o cursor no arquivo
Exemplos de uso

Leitura (Modo Texto)


A cada operao de leitura, os dados correspondentes so transferidos para a memria e o cursor avana e aponta para o prximo dado Existe em C a funo fscanf para leitura formatada de dados de um arquivo modo texto
Similar a scanf

L de um arquivo passado como parmetro em vez de somente da entrada padro (teclado) Pode ler tambm da entrada padro (arquivo stdin)

Leitura com fscanf

int fscanf(FILE* fp, char* formato,end_variaveis)


Retorna nmero de dados lidos com sucesso fp o ponteiro para o arquivo formato equivale aos cdigos de formatao (iguais ao do scanf) end_variaveis corresponde a lista de endereos de variveis que armazenaro os dados lidos do arquivo

Leitura com fscanf


A cada operao de leitura, os dados correspondentes so convertidos de caracteres para o tipo (formato) especificado em fscanf Portanto, arquivo deve ter sido previamente gravado em modo texto
Se gravado em modo binrio, a funo tenta mapear os dados lidos para caracteres para depois fazer a converso para o tipo especificado

Usando fscanf para Leitura (Modo


Texto)
#include <stdio.h> L uma string do arquivo apontado por int main() { fp de at 120 caracteres e armazena em primeiraPalavra FILE *fp; char primeiraPalavra[121]; fp = fopen(teste.txt,r); if (fp == NULL) { printf(Impossvel abrir arquivo); exit(1); } fscanf(fp, %120s,primeiraPalavra); printf(A primeira palavra do arquivo teste.txt : %s\n,primeiraPalavra); fclose(fp); return 0; 6 }

Constante EOF
A constante (simblica) EOF indica o fim de arquivo
Definida no arquivo stdio.h

Ela NO um caracter
um inteiro que indica fim de arquivo Geralmente um valor negativo

NO um valor presente no arquivo um valor retornado por funes de leitura indicando fim de arquivo ou erro de leitura
7

Outras Funes de Leitura (Modo Texto)


int fgetc(FILE* fp);
L um caractere de um arquivo Retorna o cdigo do caractere lido Retorna EOF se fim do arquivo for alcanado

char* fgets(char* s, int n, FILE* fp);


s a cadeia de caracteres que armazenar o que for lido n o nmero mximo de caracteres a serem lidos L uma seqencia de caracteres at que \n seja encontrado ou que n caracteres tenham sido lidos Retorna ponteiro para a cadeia s

Usando fgetc para a Leitura


#include <stdio.h> int main() { FILE *fp; int c;int nCaracteres = 0, nLinhas = 0; fp = fopen(teste.txt,r); if (fp == NULL) { printf(Impossvel abrir arquivo); exit(1); L caractere e ainda } verifica se chegou no while ((c = fgetc(fp)) != EOF) { fim do arquivo if (c == \n) nLinhas++; else nCaracteres++; } printf(Caracteres:%d,Linhas:%d\n,nCaracteres,nLinhas); fclose(fp); return 0; } 9

Programa conta nmero de caracteres e conta o nmero de linhas de um arquivo

Usando fgets para a Leitura


int main() { Programa informa linha da ocorrncia de uma palavra FILE *fp; em um arquivo com linhas (maximo 120 caracteres) int achou = linhaOcorrencia = 0; char palavra[121], linha [121]; printf (Digite a palavra:\n); scanf( %120[^\n],palavra); fp = fopen(teste.txt,r); if (fp == NULL) { printf(Impossvel abrir arquivo);exit(1); } while (fgets(linha,121,fp) != NULL && !achou) { linhaOcorrencia++; L uma linha e if (strstr(linha,palavra) != NULL) armazena em linha achou = 1; Utiliza funo strstr de string.h para } saber se palavra substring de linha fclose(fp); printf(Ocorrncias de %s = %d\n, palavra,nOcorrencias); 10 }

Escrita (Modo Texto)


A cada operao de escrita, os dados so gravados na memria e posteriormente no disco, e o cursor avana apontando para a proxima posio do arquivo: Existe em C a funo fprintf para escrita formatada de dados em um arquivo modo texto

Similar a printf Escreve em um arquivo passado como parmetro em vez de somente na sada padro (monitor) Pode escrever tambm na sada padro (arquivo stdout)

11

Escrita com fprintf

int fprintf(FILE* fp, char* formato,variaveis)


Retorna nmero de dados escritos com sucesso fp o ponteiro para o arquivo formato equivale aos cdigos de formatao (iguais ao do printf) variaveis corresponde a lista de variveis, cujos contedos sero escritos no arquivo

12

Escrita com fprintf


A cada operao de escrita, os dados correspondentes so convertidos do tipo (formato) especificado em fprintf para caracteres Se arquivo aberto em modo binrio , dados so gravados tambm como caracteres

13

Usando fprintf para Escrita (Modo


Texto)
Programa escreve uma palavra de no #include <stdio.h> mximo 120 caracteres em um int main() { arquivo FILE *fp; char palavra[121]; fp = fopen(teste.txt,w); if (fp == NULL) { printf(Impossvel abrir arquivo); exit(1); } printf (Digite a palavra:\n); scanf( %120[^\n],palavra); fprintf(fp,%s\n,palavra); fclose(fp); return 0; } 14

Outras Funes de Escrita (Modo Texto)


int fputc(FILE* fp, char c);
Escreve um caractere em um arquivo Retorna o cdigo do caractere escrito

char* fputs(char* s,FILE* fp);


s a cadeia de caracteres que ser escrita Retorna ponteiro para a cadeia s

15

Usando fputs e fputc para Escrita


int main() { Programa l um arquivo e gera outro com FILE *e; FILE *s; todas as letras convertidas para maiusculas int caractere; char nome_entrada[121]; printf (Digite o nome do arquivo de entrada:\n); scanf(%120s, nome_entrada); Usurio fornece o nome e = fopen(nome_entrada,r); do arquivo if (e== NULL) { printf(Impossvel abrir arquivo de entrada);exit(1); } s = fopen(strcat(nome_entrada,_maiuscula),w); if (s== NULL) { printf(Impossvel abrir arquivo de saida);exit(1); } while ((caractere = fgetc(e)) != EOF) Converte caractere a fputc(toupper(caractere),s); caractere e escreve no arquivo fputs(\nArquivo Convertido!,s); fclose(e); fclose(s); 16 return 0;}

Operaes de Leitura/Escrita (Modo Texto x Modo Binrio)


As operaes de leitura/escrita em modo texto permitem uma visualizao melhor do resultado Para operaes que envolvem estruturas ou vetores, operaes em modo binrio so menos trabalhosas Considere a estrurura abaixo:

struct aluno { char nome [60]; int mat; char sexo; };

17

Usando Operaes de Leitura/Escrita (Modo Texto)


int main() { Programa escreve e l uma estrutura em/de FILE *arq; um arquivo struct aluno aluno1, copia; strcpy(aluno1.nome,Jose); Escreve membro a aluno1.mat = 1; membro da estrutura aluno1.sexo = M; arq = fopen(arquivoAluno1.txt,w+); if (arq== NULL) { printf(Impossvel abrir arquivo de entrada);exit(1); } fprintf(arq,%s\n%d\n%c,aluno1.nome,aluno1.mat,aluno1.sexo); rewind(arq);

Volta para inicio do arquivo

fscanf(arq,"%s %d %c", copia.nome,&copia.mat,&copia.sexo); return 0; L membro a membro

da estrutura

18

Usando Operaes de Leitura/Escrita (Modo Binrio)


int main() { Programa escreve e l uma estrutura em/de FILE *arq; um arquivo struct aluno aluno1, copia; strcpy(aluno1.nome,Jose); Escreve toda a aluno1.mat = 1; estrutura aluno1.sexo = M; arq = fopen(arquivoAluno1.bin,wb+); if (arq== NULL) { printf(Impossvel abrir arquivo de entrada); exit(1); } fwrite(&aluno1,sizeof(Aluno),1,arq); rewind(arq); fread(&copia,sizeof(Aluno),1,arq); return 0;

L toda a estrutura

19

Funes Utilitrias
long ftell(FILE* fp);
Retorna a posio atual do cursor do arquivo Corresponde a distancia em bytes em relao ao comeo do arquivo

Devem ser utilizadas com cautela em arquivos no modo texto, pois nem sempre o posicionamento do cursor vai ser o desejado
Certas plataformas podem colocar caracteres de formatao no visveis que podem alterar o tamanho do arquivo (nmero de bytes)

20

Funes Utilitrias
long fseek(FILE* fp,long dist,int origem);
Utilizada para posicionamento do cursor em um arquivo dist o nmero de bytes em relao a origem origem uma posio do cursor do arquivo em bytes (SEEK_CUR posio corrente; SEEK_SET incio do arquivo; SEEK_END final do arquivo) Retorna a nova posio do cursor

void rewind(FILE* fp);


Utilizada para posicionamento do cursor no incio do arquivo

21

Funes Utilitrias
Funo que recupera o i-simo ponto armazenado em um arquivo Ponto le_ponto (FILE* fp, int i) { Ponto p; fseek (fp, i*sizeof(Ponto), SEEK_SET); fread(&p, sizeof(Ponto), 1, fp); return p; } Funo que retorna o tamanho do arquivo em bytes int tamanho_arquivo (FILE *fp) { int tamanho; fseek (fp, 0, SEEK_END); tamanho =ftell (fp); return tamanho; }
22

Resumindo ...
Funes de leitura em modo texto fscanf fgets fgetc Funes de escrita em modo texto fprintf fputs fputc Quando utilizar operaes de leitura/escrita em modo texto e binrio Posicionamento dos cursores em arquivos
23

Introduo a Programao

Listas Encadeadas

Tpicos da Aula
Hoje aprenderemos que existem, alm de vetores, estruturas de dados dinmicas que podem armazenar colees de dados
Estruturas Dinmicas e Vetores Conceito de listas encadeadas Listas Encadeadas x Vetores Funes de manipulao de listas encadeadas Variaes de listas encadeadas

Vetores
Declarao de vetor implica na especificao de seu tamanho
No se pode aumentar ou diminuir tamanho

Outra alternativa no uso de vetores alocar dinamicamente o espao necessrio e guardar endereo inicial do vetor Porm, depois de determinado o tamanho do vetor, no podemos liberar posio de memria arbitrria Possvel desperdcio ou falta de memria!
3

Estruturas Dinmicas
Uma estrutura de dado dinmica consiste em uma estrutura que pode aumentar ou diminuir de tamanho de acordo com a necessidade da aplicao (do programador)
Evita desperdcio e/ou falta de memria

Programador encarregado de requisitar e liberar espaos de memria explicitamente


Uso de alocao dinmica Requer mais esforo por parte do programador!
4

Listas Encadeadas
Uma lista encadeada uma estrutura dinmica que pode ser utilizada para armazenar um conjunto de dados Junto a cada elemento deve-se armazenar o endereo para o prximo elemento (elementos encadeados)
Elemento + ponteiro = n da lista Diferentemente de vetores, elementos geralmente no so armazenados em espaos contguos de memria Caso no exista prximo elemento, o ponteiro para o prximo elemento NULL

Listas Encadeadas
Para cada novo elemento inserido na lista, aloca-se um espao de memria para armazen-lo Para remover elemento deve-se liberar o endereo de memria reservado para armazenar o elemento O acesso aos elementos sempre seqencial
No se pode garantir que os elementos ocuparo um espao de memria contguo (no se pode localizar elementos com base em um deslocamento constante)

Listas Encadeadas x Vetores


Listas Encadeadas
+ Uso eficiente da memria - Complexidade de manipulao da estrutura - Informao deve ser guardada em uma estrutura que guarda tambm um endereo (requer mais memoria por informao armazenada)

Vetores
+Simplicidade no acesso (manipulao) elementos da estrutura - Desperdcio ou falta de memria - Menor Flexibilidade aos

Representao de Listas Encadeadas


Informao armazenada no n da lista
p r o x

primeiro

Armazena o endereo do prximo n


p r o x

Armazena endereo nulo

info1

info2

info3

fim
struct lista { int info ; /* info pode ser de qualquer tipo */ struct lista* prox; } ; typedef struct lista Lista ;
8

Representando Listas Encadeadas na Memria


Lista* inicio;

inicio
100 128 124 120 116 112 108 104 100

Memria
112 info2
info1

inicio

NULL info3 124 info1 prox info

p r o x

info2

p r o x

info3

Insero de Elementos em Listas Encadeadas


Diferentes formas de inserir um elemento na lista:
No comeo Mais simples No fim Neste caso deve-se percorrer a lista toda

10

Inserindo Elementos no Incio de Listas Encadeadas


Novo

inicio
info1 info2 info3 info4

/* insero incio da lista */ Lista* lst_insere(Lista* inicio,int i){ Lista* novo = (Lista*) malloc(sizeof(Lista)); novo->info = i ; novo->prox = inicio ; return novo ; Endereo do } comeo da Retorna endereo lista inicial atualizado
11

Inserindo Elementos no Fim de Listas Encadeadas


/* insero fim da lista */ Lista* lst_insere(Lista* inicio,int i){ Lista* novo = (Lista*) malloc(sizeof(Lista)); novo->info = i ; novo->prox = NULL ; Se lista estiver vazia, if (inicio == NULL){ inicio vai guardar inicio = novo; endereo de novo } else { Lista* p = inicio; while (p->prox != NULL){ p = p->prox; } p->prox = novo; } Seno temos que percorrer lista return inicio ; at ltimo n, para faz-lo } 12 apontar para novo

Usando Funo de Insero de Listas Encadeadas


int main() { Lista* inicio; inicio = NULL; inicio = lst_insere(inicio,23); /* insere 23 */ inicio = lst_insere(inicio,45); /* insere 45 */ ... return 0 ; }

Variavel que armazena endereo inicial da lista deve ser inicializada com NULL! No esquecer de atualizar a varivel que guarda endereo inicial da lista a cada insero!

13

Imprimindo Listas Encadeadas


void lst_imprime(Lista* inicio){ Lista* p; /*varivel auxiliar para percorrer a lista */ for(p = inicio; p != NULL; p = p->prox){ printf ( info = %d\n , } } p->info ) ;

Lao para percorrer todos os ns da lista

14

Verificando se a Lista Est Vazia


/* funo vazia: retorna 1 se vazia ou 0 se no vazia */ int lst_vazia(Lista* inicio){ if (inicio == NULL) return 1; else return 0; }

/* verso compacta da funo lst_vazia */ int lst_vazia ( Lista* inicio ){ return(inicio == NULL) ; }
15

Buscando um Elemento em Listas Encadeadas


Lista* lst_busca(Lista* inicio,int v){ int achou = 0; Lista* p = inicio ; while (p != NULL && !achou) { if (p->info == v) achou = 1 ; else p = p->prox; Se no achou } elemento, retorna return p; } o endereo nulo!

Retorna o endereo do primeiro n que contm o elemento buscado


16

Removendo Elementos de Listas Encadeadas


Dois casos devem ser tratados para a remoo de um elemento da lista inicio
info1 info2 info3 info4

Remoo do primeiro elemento da lista

inicio
info1 info2 info3 info4

Remoo de um elemento no meio da lista


17

Removendo Elementos de Listas Encadeadas


Lista* lst_retira(Lista* inicio,int v){ Lista* ant = NULL; /* guarda elemento anterior */ Lista* p = inicio; Procura elemento while(p != NULL && p->info != v){ na lista,guardando ant = p ; endereo do p = p->prox ; anterior } /* verifica se achou o elemento */ if (p != NULL) { Elemento no inicio, retira if (ant == NULL) elemento do incio inicio = p->prox; else ant->prox = p->prox; free(p) ; } Retira elemento do meio return inicio ; } 18 Retorna endereo inicial da lista

Liberando Listas Encadeadas


void lst_libera(Lista* inicio){ Lista* p = inicio ; while(p != NULL ) { Lista* t = p->prox; free(p); /* libera a memria apontada por p*/ p = t; /* faz p apontar para o prximo */ } }

Guarda o endereo do prximo n para poder libera-lo na prxima iterao


19

Comparando Listas Encadeadas


int lst_igual(Lista* lst1,Lista* lst2){ Lista* p1 ; Lista* p2 ; int igual = 1 for(p1 = lst1,p2 = lst2; p1!=NULL && p2!=NULL && igual; p1=p1->prox,p2=p2->prox){ if(p1->info!= p2->info ) igual = 0; } return(p1 == p2 && igual) ; }

Se os elementos testados forem iguais, deve-se ainda ver se p1 e p2 apontam para NULL (tamanhos das listas iguais)

20

Utilizando Funes de Manipulao de Lista de Inteiros


#include <stdio.h> #include lista.h int main() { Lista * ls ; /* declara uma lista no iniciada */ ls = NULL; /*inicia lista vazia */ ls = lst_insere(ls,23); /* insere o elemento 23 */ ls = lst_insere(ls,45); /* insere o elemento 45 */ ls = lst_insere(ls,56); /* insere o elemento 56 */ ls = lst_insere(ls,78); /* insere o elemento 78 */ lst_imprime(ls); /* imprime: 78 56 45 23 */ ls = lst_retira(ls,78); lst_imprime(ls); /* imprime: 56 45 23 */ ls = lst_retira(ls,45); lst_imprime(ls); /* imprime: 56 23 */ lst_libera(ls); return 0 ; } 21

Variaes de Listas Encadeadas


Listas podem variar quanto ao:
Tipo de encadeamento Simples Circulares Duplas Circulares e Duplas Contedo Tipos Primitivos Tipos Estruturados
J vimos anteriormente

22

Listas Circulares
Estrutura do n da lista idntica a da lista simplesmente endadeada No h noo de primeiro e ltimo n da lista Para saber se toda lista foi percorrida deve-se guardar o endereo do primeiro n a ser lido e comparar com o endereo do n que est sendo lido
lista

info1

info2

info3

23

Imprimindo uma Lista Circular


void lcirc_imprime (Lista* inicio) { Lista* p = inicio; /* faz p apontar para o n inicial */ /* testa se lista no vazia*/ if (p != NULL){ do { printf(%d\n,p->info); p = p->prox; } while (p != inicio); }
A condio de parada do lao quando o n a ser percorrido for igual ao n inicial
24

Lista duplamente encadeada


Permite percorrer a lista em dois sentidos Cada elemento deve guardar os endereos do prximo elemento e do elemento anterior Facilita percorrer a lista em ordem inversa Retirada de elemento cujo endereo conhecido se torna mais simples
Acesso ao n anterior para ajustar encadeamento no implica em percorrer a lista toda
inicio

info1

info2

info3

info4
25

Estrutura de Listas Duplamente Encadeadas


inicio
Armazena o endereo do n anterior
p r o x

Armazena o endereo do prximo n


p r o x

fim
a n t

info1

a n t

info1

info1

struct lista2 { int info ; struct lista2* prox;

struct lista2* ant; } ; typedef struct lista2

Lista2 ;
26

Inserindo Elementos no Incio de Listas Duplamente Encadeadas


novo inicio

Insero no comeo da lista

info1

info2

info3

Lista2* lst2_insere (Lista2* inicio, int v) { Lista2* novo = (Lista2*) malloc(sizeof(Lista2)); novo->info = v; novo->prox = inicio; novo->ant = NULL; /* verifica se lista no est vazia */ if (inicio != NULL) inicio->ant = novo; return novo; }

27

Inserindo Elementos no Fim de Listas Duplamente Encadeadas

novo
inicio

info1

info2

info3

Insero no fim da lista


28

Inserindo Elementos no Fim de Listas Duplamente Encadeadas


Lista2* lst2_insere (Lista2* inicio, int v) { Lista2* novo = (Lista2*) malloc(sizeof(Lista2)); novo->info = v; novo->prox = NULL; if (inicio == NULL) { novo->ant = NULL; Se lista estiver vazia, inicio = novo endereo do n anterior a } else { novo NULL Lista2* p; while (p->prox != NULL) [ p = p->prox; } p->prox = novo; novo->ant = p; } Seno temos que fazer com que o ltimo return inicio; n aponte para novo e n anterior de 29 }

novo seja o antigo ltimo n

Buscando um Elemento em Listas Duplamente Encadeadas


Mesma lgica aplicada a listas simplesmente encadeadas
Lista2* lst_busca (Lista2* lista, int v) { Lista2* p; int achou = 0 for (p = lista; p != NULL && !achou; p = p->prox) if (p->info == v) achou = 1; return p; }
30

Removendo Elementos de Listas Duplamente Encadeadas


Trs casos devem ser tratados para a remoo de um elemento da lista inicio
info1 info2 info3 info4

Remoo do primeiro elemento da lista

inicio
info1 info2 info3 info4

Remoo de um elemento no meio da lista

inicio
info1 info2 info3 info4
31

Remoo de um elemento do fim da lista

Removendo Elementos de Listas Duplamente Encadeadas


Lista2* lst2_retira (Lista2* inicio, int v) { Lista2* p = busca(inicio, v); Usando a funo if (p != NULL){ de busca if (inicio == p) Retira elemento do inicio = p->prox; comeo da lista else p->ant->prox = p->prox; if (p->prox != NULL) p->prox->ant = p->ant; Retira do meio free(p); } return inicio; S acerta o encadeamento do ponteiro } para o anterior se NO for o ltimo 32 elemento

Lista Circular Duplamente Encadeada


Permite percorrer a lista nos dois sentidos, a partir de um ponteiro para um elemento qualquer
lista

info1

info2

info3

33

Imprimindo no Sentido Inverso com um Lista Circular Duplamente Encadeada


void l2circ_imprime_inverso (Lista2* lista){ Lista2* p = lista; if (p != NULL) Avana para o n do { anterior p = p->ant; printf(%d\n, p->info); } while (p != lista); }

34

Lista de Tipos Estruturados


Uma lista pode ser composta de elementos estruturados Considere o tipo Retangulo
typedef struct retangulo { float b; /* base */ float h; /* altura */ } Retangulo;

Podemos definir uma lista cujos ns contenham ou um retngulo ou um ponteiro para um retngulo
typedef struct lista { Retangulo info; struct lista *prox; } Lista; typedef struct lista { Retangulo* info; struct lista *prox; } Lista;
35

OU

Inserindo um N em uma Lista de Tipos Estruturados


N da lista contm um retngulo
Lista* insere (Lista* inicio,float b, float h) { Lista *novo; novo = (Lista*)malloc(sizeof(Lista)); novo->info.b = b; novo->info.h = h; novo->prox = inicio return novo; }

36

Inserindo um N de uma Lista de Tipos Estruturados


N da lista contm um ponteiro para um retngulo
Lista* insere (Lista* inicio,float b, float h){ Retangulo *r; r = (Retangulo*) malloc(sizeof(Retangulo)); Lista* novo = (Lista*)malloc(sizeof(Lista)); r->b = b; r->h = h; novo->info = r; novo->prox = inicio; Espao para a estrutura return novo; Retangulo deve tambm ser } alocado

37

Introduo a Programao

Tipos Abstratos de Dados Implementando Pilha e Fila

Abstrao
Abstrao o processo ou resultado de generalizao por reduo do contedo da informao de um conceito ou fenmeno observvel, normalmente para reter apenas a informao que relevante para um propsito particular. Fonte: Wikipedia

Tpicos da Aula
Hoje aprenderemos que existe uma forma de definir um tipo de dado pelas suas operaes
Conceito de Tipo Abstrato de Dado Dois Tipos Abstratos de Dados: Pilha e Fila Depois aprenderemos como implementar Pilhas e Filas Implementao de Pilha usando Vetor Implementao de Pilha usando Lista Implementao de Fila usando Lista

Tipo Abstrato de Dado


Um Tipo Abstrato de Dado (TAD) um conjunto organizado de informaes e as operaes que podem atuar sobre estas informaes
Define um novo tipo de dado

Um TAD definido indiretamente pelas operaes que podem atuar nele e os efeitos destas operaes

Exemplo de TAD: Pilha


Remoo Insero

Operaes sobre Pilha (Livros) : insero no topo e remoo no topo Tipo definido pelo comportamento
Conjunto de operaes sobre o tipo
5

Exemplo de TAD: Fila


Insero

Remoo

Operaes sobre Fila (Pessoa) : insero no fim e remoo no comeo


6

TAD x Estrutura de Dado


O TAD a descrio lgica de um dado e a estrutura de dado a descrio real

TAD (Tipo Abstrato de Dados) a figura lgica dos dados e operaes que manipulam os elementos componentes dos dados Estrutura de Dados a implementao real dos dados e algoritmos que manipulam os elementos dos dados
TAD descrio das funcionalidades Estrutura de Dado implementao
7

Objetivos deTADs
Abstrair (esconder) de quem usa um determinado tipo, a forma concreta com que ele foi implementado
O cliente utiliza o TAD de forma abstrata, apenas com base nas funcionalidades oferecidas pelo tipo (interface)
Desacoplar a implementao do uso, facilitando a manuteno e aumentando o potencial de reuso do tipo criado

Implementando um TAD

As operaes definem a interface de um TAD

Um cdigo implementa corretamente um TAD desde que obedea o que est sendo definido na interface do TAD

Tipos Abstratos de Dados em C


Em C:
Arquivos-fontes que agrupam funes afins so geralmente denominados de Mdulos Em programas modulares, cada mdulo deve ser compilado separadamente e depois linkados para gerar executvel Quando mdulo define um novo tipo de dado e o conjunto de operaes para manipular dados deste tipo, dizemos que o mdulo representa um Tipo Abstrato de Dado (TAD)

10

Implementando TADs em C
Geralmente a interface de um TAD descrita em C nos arquivos .h O cliente s precisa dar um include no .h que contm a interface do TAD
Esconde (Abstrai) a implementao

Ao cliente tambm dado o arquivo objeto (.o) com a implementao do TAD

A interface de um TAD contm as assinaturas das funes que ele oferece e contm a definio do tipo de dado

Funciona como um manual de uso do tipo que est sendo definido


11

Definio de Pilha
Pilha um tipo abstrato de dados onde:
Insero e remoo de elementos no topo da pilha O primeiro elemento que sai o ltimo que entrou (LIFO) Operaes bsicas: push (empilhar) e pop (desempilhar)

12

Funcionamento da pilha
empilha(a)
empilha(b) empilha(c) desempilha()

c b a topo a topo b a

topo

c b a topo

13

Exemplo de Uso: Pilha de Execuo de Funes


#include stdio.h int fat ( int n ) ; int main () { int n = 5, r ; r = fat(n) ; printf ( Fatorial return 0 ; } int fat ( int n ){ int f=1 ; while(n != 0) { f *= n ; n-- ; } return f ; }

= %d \n ,

r ) ;

14

Pilha de Execuo
1 Incio do programa: pilha vazia 2 Declarao de variveis: n,r 3 Chamada da funo: empilha variveis

main>

main>

r n

n r n main>
fat>

5 5

4 Final do lao Acesso s variveis que esto na funo do topo

5 Retorno da funo: desempilha

f fat> n r n main>

120 0 5

fat>

r n main>

120 5 15

Interface do tipo Pilha


Criar pilha vazia; Inserir elemento no topo (push) Remover elemento do topo (pop) Verificar se a pilha est vazia Liberar a estrutura de pilha
Em C
/* pilha.h */ typedef struct pilha Pilha; Pilha* pilha_cria(); void pilha_push(Pilha* p,float v); float pilha_pop(Pilha* p); int pilha_vazia(Pilha* p); void pilha_libera(Pilha* p);

16

Implementao do tipo Pilha


Existem vrias implementaes possveis de uma pilha. Podem diferir da natureza dos elementos, maneira como so armazenados e operaes disponveis Iremos estudar 2 tipos de implementao:
Utilizando Vetor Utilizando Lista Encadeada

17

Implementando Pilha com Vetor


Estrutura que representa pilha deve ser composta por um vetor para armazenar os elementos e o nmero de elementos armazenados Vantagem
Simplicidade #define N 50 struct pilha { int n; float vet[N]; };

Desvantagens
Deve-se saber de antemo o nmero mximo de elementos Desperdcio de espao de memria

18

Implementando Pilha com Vetor


Funo de Criao
Aloca estrutura dinamicamente

Pilha* pilha_cria () { Pilha* p = (Pilha*) malloc(sizeof(Pilha)); p->n = 0; return p; }

Inicializa com 0 elementos

19

Implementando Pilha com Vetor


Funo de Insero
void pilha_push (Pilha* p, float v) { if (p->n < N) { p->vet[p->n] = v; p->n++; } else {/* capacidade esgotada */ printf(Capacidade da pilha estourou.\n); } }

Verifica se tem espao disponvel

Insere na prxima posio livre e incrementa o nmero de elementos da pilha


20

Implementando Pilha com Vetor


Funo de Remoo
float pilha_pop (Pilha* p) { float v; if (pilha_vazia(p)) { printf(Pilha vazia.\n); exit(1); } v = p->vet[p->n-1]; p->n--; return v; }

Verifica se a pilha est vazia

Topo est na posio n - 1

Remoo se d pelo decremento do nmero de elementos (prximo push sobrescrever antigo topo) 21

Implementando Pilha com Vetor


Funo que testa se pilha est vazia
int pilha_vazia (Pilha* p) { return (p->n==0); }

Funo que libera memria alocada para a pilha


void pilha_libera (Pilha* p) { free(p); }

22

Implementando Pilha com Vetor


Outras Funes Utilitrias
/* Funo que informa o elemento do topo */ float pilha_topo (Pilha* p) { return (p->vet[p->n 1]); } /* Funo que imprime os elementos da pilha void pilha_imprime (Pilha* p) { int i; for (i=p->n-1; i>=0; i--) printf(%f\n, p->vet[i]); }
23

Implementando Pilha com Lista


Estrutura que representa pilha deve ser composta por um ponteiro para o primeiro n da lista que armazena os elementos Vantagens
Otimizao da memria Tamanho irrestrito typedef struct lista{ float info; struct lista *prox; } Lista; struct pilha { Lista *topo; };

Desvantagem
Complexidade na manipulao de listas
24

Implementando Pilha com Lista


Funo de Criao
Lista(topo) inicializada com NULL

Pilha* pilha_cria () { Pilha* p = (Pilha*) malloc(sizeof(Pilha)); p->topo = NULL; return p; }

25

Implementando Pilha com Lista


Funo de Insero
void pilha_push (Pilha* p, float v) { Lista* novo = (Lista*) malloc(sizeof(Lista)); novo->info = v; novo->prox = p->topo; p->topo = novo; } Elemento inserido no

comeo da lista topo aponta para o comeo da lista

26

Implementando Pilha com Lista


Funo de Remoo
float pilha_pop (Pilha* p) { Lista* t; float v; if (pilha_vazia(p)) { printf(Pilha vazia.\n); exit(1); /* aborta programa */ } t = p->topo; Elemento realmente v = t->info; removido, topo p->topo = t->prox; atualizado free(t); return v; }

27

Implementando Pilha com Lista


Funo que testa se pilha est vazia
int pilha_vazia (Pilha* p) { return (p->topo == NULL); }

Funo que libera memria alocada para a pilha


void pilha_libera (Pilha* p) { Lista* q = p->topo; while (q!=NULL) { Deve-se liberar Lista* t = q->prox; todos os elementos free(q); da lista primeiro q = t; } free(p); }

28

Implementando Pilha com Lista


Outras Funes Utilitrias
/* Funo que informa o elemento do topo */ float pilha_topo (Pilha* p) { return (p->topo->info); } /* Funo que imprime os elementos da pilha void pilha_imprime (Pilha* p) { Lista* q; for (q=p->topo; q!= NULL; q = q->prox) printf(%f\n, q->info); }
29

Definio de Fila
Fila um tipo abstrato de dados onde: Insero de elementos se d no final e a remoo no incio O primeiro elemento que entra o primeiro que sai (FIFO) Ex de uso : fila de impresso

30

Funcionamento da Fila
1- insere(a)
fim
a incio

3- insere(c)
fim a
incio

2- insere(b)
fim a incio b

4- retira( )
fim a b incio c

31

Interface do tipo Fila


Criar uma fila vazia Inserir um elemento no fim Retirar o elemento do incio Verificar se a fila est vazia Liberar a fila Em C
/* fila.h */ typedef struct fila Fila; Fila* fila_cria(); void fila_insere(Fila* f,float v); float fila_retira(Fila* f); int fila_vazia(Fila* f); void fila_libera(Fila* f);

32

Implementando Fila com Lista


Estrutura que representa fila deve ser composta por 2 ponteiros para a lista que armazena os elementos.
Um aponta para o primeiro elemento e o outro para o ltimo elemento
ini fim

typedef struct lista{ float info; struct lista *prox; } Lista; struct fila { Lista *ini; Lista *fim };

info1

info2

info3 33

Implementando Fila com Lista


Funo de Criao

Fila* fila_cria ( ) { Fila* f = (Fila*) malloc(sizeof(Fila)); f->ini = f->fim = NULL; return f; ini e fim so }

inicializados com NULL

34

Implementando Fila com Lista


Funo de Insero
void fila_insere (Fila* f, float v) { Lista* novo = (Lista*) malloc(sizeof(Lista)); novo->info = v; novo->prox = NULL; /* novo n passa a ser o ltimo */ if (!fila_vazia(f)) /* verifica se a fila no estava vazia */ f->fim->prox = novo; Se a fila estava vazia else novo elemento passa a f->ini = novo; ser o comeo da fila f->fim = novo; }

Novo elemento sempre o ltimo da fila

35

Implementando Fila com Lista


Funo de Remoo
float fila_retira (Fila* f) { Lista* t; float v; if (fila_vazia(f)) { printf("Fila vazia.\n"); exit(1); } Se a fila ficou vazia, t = f->ini; deve-se atualizar v = t->info; ponteiro para o fim f->ini = t->prox; if (f->ini == NULL) f->fim = NULL; free(t); return v; 36 }

Implementando Fila com Lista


Funo que testa se a fila est vazia
int fila_vazia (Fila* f) { return (f->ini == NULL); }

Funo que libera memria alocada para a fila


void fila_libera (Fila* f) { Lista* q = f->ini; while (q!=NULL) { Deve-se liberar Lista* t = q->prox; todos os elementos free(q); da lista primeiro q = t; } free(f); }

37

Implementando Fila com Lista


Outras Funes Utilitrias
/* Funo que informa o primeiro elemento da fila */ float fila_primeiro (Fila* f) { return (f->ini->info); } /* Funo que imprime os elementos da fila void fila_imprime (Fila* f) { Lista* q; for (q=f->ini; q!=NULL; q =q->prox) printf(%f\n, q->info); }
38

Introduo Programao

Conceitos Bsicos de Orientao a Objetos

Tpicos da Aula
Aprenderemos fundamentos do paradigma orientado a objetos, mas antes veremos o que paradigma
Conceito de paradigma Diferentes paradigmas na computao

Depois veremos o que orientao a objetos


Conceitos de orientao a objetos Programao orientada a objetos x Programao imperativa Estrutura de um programa orientado a objetos em C++ Construtores Criao de objetos Exemplo de aplicao orientada a objetos
2

Paradigmas de Programao
Linguagens de programao so baseadas em vrios conceitos:
Tipos de dados, variveis e armazenamento, controle, abstrao de dados, abstrao procedural, sistema de tipos,etc

Diferentes selees dos conceitos definem o estilo de programao ou Paradigma


Afeta a forma de pensar em como escrever um programa

A forma como estes conceitos so agrupados em uma linguagem de programao definem que paradigma suportado por esta linguagem

Paradigmas de Programao
Podemos encontrar 6 grandes paradigmas suportados pelas linguagens de programao:
Imperativo Uso de comandos, variveis e procedimentos Primeiras linguagens de programao so deste paradigma Ex: Fortran, Pascal, C, etc Orientao a Objetos Uso de classes, objetos, herana, polimorfismo, maior abstrao de dados, encapsulamento (implementao) Evoluo do paradigma imperativo Ex: Smalltalk, C++, Eiffel, Java, C#, etc

Paradigmas de Programao
Funcional Uso de expresses e funes, ausncia de variveis e comandos Ex: ML, Haskell
-- Exemplo em Haskell -- type factorial :: Integer -> Integer -- using recursion factorial 0 = 1 factorial n = n * factorial (n - 1)

Paradigmas de Programao
Lgico Relaes lgicas entre asseres Ex: Prolog, Mercury
/* Exemplo em Prolog */ mother_child(trude, sally). /* fato */ father_child(tom, sally). father_child(tom, erica). sibling(X, Y) :- parent_child(Z, X), parent_child(Z, Y). parent_child(X, Y) :- father_child(X, Y). /* clausula*/ parent_child(X, Y) :- mother_child(X, Y).

entradas

sadas,

?- sibling(sally, erica). Yes

Paradigmas de Programao
Concorrente Execuo concorrente de processos, abstrao de controle de sincronizao (inter-processos, acesso a recursos, etc) Ex: Occam, Java, Concurrent C, etc Scripting Sistema de tipos dinmica, abstrao de processamento de Strings, suporte a interfaces grficas Ex: Python, Java Script, Tcl, HTML

O que Orientao a Objetos?


considerar que tudo um objeto:
Os sistemas so objetos Os dados manipulados e comunicados entre os sistemas so objetos Cada parte de um sistema (sub-sistema) um objeto Os dispositivos eletrnicos so objetos A interface com o usurio um objeto, composto de vrios outros objetos...

Objeto
Podemos definir objeto como uma entidade que possui:
Estado
Caractersticas ou propriedades do objeto

Comportamento
Operaes que o objeto pode realizar

O comportamento pode examinar ou alterar o estado de um objeto

Objeto DVD
As operaes que o DVD pode executar

O estado atual do DVD; o que ele est fazendo...

Fonte: http://www.amazon.com

10

Objeto Conta Bancria

Crdito

Saldo

Nmero

Comportamento

875,32

21.342-7

O estado atual da conta

Dbito

Operaes que uma conta pode executar

11

Estados do Objeto Conta


Comportamento neste caso mudou o estado do objeto conta
Crdito(20)
Crdito

Crdito

Crdito

Crdito

Saldo

Saldo

Nmero

Nmero

Saldo

Saldo

Nmero

Nmero

875,32

875,32

21.342-7

21.342-7

895,32

875,32

21.342-7

21.342-7

Dbito

Dbito

12

Classe
Classe um agrupamento de objetos que tm propriedades comuns e podem realizar as mesmas operaes uma definio que descreve como objetos pertencentes classe so estruturados internamente (quais propriedades e operaes o objeto possui) Classe um conceito e o objeto uma instncia deste conceito Portanto, podemos ter vrios objetos pertencentes a mesma classe
13

Classe x Objeto
Mltiplos objetos podem ser criados partir da mesma classe Classe Conta
Saldo Nmero

Crdito

Objeto conta1
Crdito

Dbito

Objeto conta2
Crdito

Crdito
Nmero Saldo

Crdito
Nmero

Saldo

Saldo

Nmero

Saldo

Nmero

1000,32 11.056-x

875,32

875,32

21.342-7

875,32

21.342-7

21.342-7
14

Dbito

Dbito

Classe e Tipo
Tipo um conjunto de valores relacionados que so capazes de realizar as mesmas operaes
Ex: inteiro, caractere, Conta, Banco, etc

Uma classe define um tipo: o tipo cujos elementos so objetos com as mesmas propriedades e comportamento

15

Atributo e Mtodo (1)


Atributo representa alguma propriedade do objeto O conjunto de atributos de um objeto determina o estado do objeto Um atributo pode conter um valor simples tal como um nmero real ou at outro objeto Mtodo representa uma operao que um objeto pode fazer O conjunto de mtodos de um objeto determina o comportamento do objeto
16

Atributo e Mtodo (2)

Crdito

Saldo

Nmero

Comportamento

875,32

21.342-7

Atributos da conta
Dbito

Mtodos de uma conta

17

Relaes entre Objetos


Geralmente, um software construdo a partir de vrios objetos (classes) que se relacionam As relaes de Cliente e Herana so essenciais para a construo de programas Classe B Cliente de classe A, se todo objeto de tipo B contiver informao sobre um ou mais objetos do tipo A Classe B Herdeira de classe A, se B representa uma verso especializada de A
Mtodos e os atributos da classe A se tornam, tambm, parte da classe B Caractersticas e comportamento de A so passadas para B

18

Relao Cliente
Objeto do tipo Banco tm vrios objetos do tipo Conta Banco cliente de Conta
Objeto Banco1
Cria nova Conta

Objeto Conta1
Crdito

Crdito

Crdito

Nome

Banco doSaldo Brasil

Conta Conta Conta Nmero

Saldo

Saldo

Nmero

Nmero

875,32

Conta1 Conta1 Conta1 21.342-7

895,32

875,32

21.342-7

21.342-7

Transferncia

Dbito

19

Relao Herana
Classe Poupana uma verso especializada de Conta Mtodos e atributos so herdados Classe Conta
Saldo Nmero

Crdito

Dbito

Classe Poupana
Saldo Nmero Juros

Crdito

Dbito

20

Utilizando OO para Desenvolver Programas


Desenvolvimento de uma soluo se torna mais fcil quando quebramos esta soluo em mdulos gerenciveis Quando estamos programando, podemos desenvolver mdulos separados, onde cada um responsvel por uma certa parte da soluo
Programao Modular

OO facilita modular

programao

Mdulos so as classes e objetos


21

Algumas Consideraes sobre OO


Orientao a Objetos Modularidade
Reusabilidade Extensibilidade

Classe uma entidade que combina 2 conceitos: Mdulo e Tipo


Mdulo um conceito sinttico, pois a decomposio do sistema em mdulos afeta somente a forma como o programa escrito, no a funcionalidade dele Tipo um conceito semntico, pois o tipo influencia diretamente a execuo do sistema, definindo a forma dos objetos que so criados e manipulados pelo sistema em tempo de execuo

22

OO e Linguagens de Programao
Linguagens OO tm em objetos e classes seus elementos fundamentais para construo de programas
Estruturas da linguagem permitem mapeamento direto dos conceitos de OO

Porm, possvel fazer um programa OO em uma linguagem no OO


possvel, tambm, fazer um programa que no seja OO em uma linguagem OO

Conceito de Orientao a Objetos independente da linguagem de programao


23

Linguagem C++
Criada por Bjarne Stroustrup em 1983 Pode ser vista quase como uma extenso da linguagem C para dar suporte a OO
Embora quase tudo escrito em C seja compatvel com C++, certos comandos podem ter comportamento diferente em C++

D suporte a vrios conceitos de OO:


Classe, Herana,Polimorfismo, Encapsulamento

Ainda oferece suporte a tratamento de excees e tipos genricos Sintaxe da linguagem Java foi inspirada em C++
24

Um Programa Imperativo...
Contm
Uma funo principal, por onde comea a execuo do programa

Vrias funes auxiliares, para modularizar, dividir o cdigo em partes Importao de bibliotecas de funes

Pode ainda conter:


Definio de tipos estruturados

Um Programa Orientado a Objetos ...


Tem a classe fundamental : como a sua construo

Um programa constitudo de uma ou mais classes Que podem ter sido importadas de uma biblioteca de classes
Uma classe contm um ou mais atributos e mtodos

Um mtodo composto de instrues

26

Ao Invs de Estruturas, Classes!


Classe
Estrutura Funo 1
Funo 2 Funo 3
Define um tipo, com funes que operam sobre este tipo

Estrutura

Funo 1
Funo 2

Funo 3

Programao Imperativa x Programao OO


Programao Imperativa tem como elementos principais os procedimentos (funes) Programao OO tem como elementos principais as classes
Estrutura + funes = classe

Programao OO ainda utiliza :


Herana Encapsulamento Polimorfismo

Veremos depois!

28

Implementando o Tipo Conta com Programao Imperativa


struct Conta{ double saldo; char numero[11]; char agencia[11]; };
Primeiro passo definir um tipo estruturado Conta

29

Implementando as Funes do Tipo Conta


Passa-se estrutura (ou endereo de estrutura) como parmetro void creditar(struct Conta *c ,double v){ c->saldo = c->saldo + v; }

Depois se define as funes que operam sobre o tipo Conta


creditar debitar getSaldo criaConta

30

Implementando as Funes do Tipo Conta


void debitar(struct Conta *c,double v){ if (v <= c->saldo) c->saldo = c->saldo - v; }

double getSaldo(struct Conta *c){ return c->saldo; }

31

Implementando as Funes do Tipo Conta


struct Conta* criaConta(char *num, char* ag) { struct Conta *retorno; retorno = (struct Conta *) malloc (sizeof(struct Conta)); if (retorno == NULL){ printf(Erro na alocao de memria!) } else { strcpy(retorno->numero, num); strcpy(retorno->agencia, ag); retorno->saldo = 0; } return retorno; }

Alocando dinamicamente uma estrutura

32

Usando o Tipo Conta em Programao Imperativa


int main() { struct Conta *conta1; conta1 = criaConta(1234-5,007-x); if (conta1 == NULL){ printf(Erro na alocao de memria!) } else { creditar(conta1,300); printf(Saldo da conta = %lf\n,getSaldo(conta1)); debitar(conta1,200); printf(Saldo da conta = %lf\n,getSaldo(conta1)); } return 0; }

33

Implementando o Tipo Conta com Programao OO (C++)


class Conta{ Atributos private: double saldo; char numero[11]; Mtodos char agencia[11]; public: void creditar(double v); void debitar(double v); double getSaldo(); Conta(char* num, char* ag); }; Atributos e Mtodos Construtor

Primeiro passo definir a classe Conta


34

Implementando os Mtodos do Tipo Conta


Indica que mtodo faz parte da classe Conta void Conta::creditar(double v){ saldo = saldo + v; } saldo um atributo que foi definido na classe Conta

No precisa passar objeto como parmetro!


35

Implementando os Mtodos do Tipo Conta


void Conta::debitar(double v){ if (v <= saldo) saldo = saldo - v; }

double Conta::getSaldo(){ return saldo; }

36

Construtor
Tipo especial de mtodo que chamado no ato de criao de um objeto da classe desejada
Importante para fazer algumas inicializaes no objeto

Uma classe pode ter mais de um construtor


O que diferencia um construtor do outro a ordem e/ou tipo e/ou quantidade de parmetros

Em C++, deve ter o mesmo nome da classe No possui tipo de retorno No obrigatrio definir um construtor
Existe em C++ um construtor default sem parmetros

37

Implementando o Construtor do Tipo Conta


Conta::Conta(char *num, char* ag) { strcpy(numero, num); strcpy(agencia, ag); saldo = 0; }

38

Usando o Tipo Conta em Programao OO


#include <iostream> uma classe em tempo de using namespace std; execuo (dinamicamente) int main() { Conta *c; c = new Conta(1234-5,007-x); Comando para if (c == NULL){ imprimir na printf(Erro na criao do objeto!) tela } else { c->creditar(300); cout<<"Conta tem saldo = " << c->getSaldo() << endl; c->debitar(200); cout<<"Conta tem saldo = " << c->getSaldo() << endl; } return 0; }

Comando para criar objeto de

Para chamar mtodo a partir de uma referncia para um objeto

39

Criao Dinmica de Objetos


Em linguagens OO, escrevemos programas utilizando objetos Mas, primeiro, temos que cri-los... Para criar um objeto em C++ dinamicamente utilizamos o comando new

new Conta(...);
Palavra reservada ordenando a criao de um objeto Construtor do objeto a ser criado
40

Avaliao do operador new


Para avaliar uma expresso do tipo

o computador...

new NomeDaClasse();

Cria um objeto da classe NomeDaClasse e armazena na sua memria Inicializa os atributos deste objeto usando o construtor desta classe Devolve como resultado da avaliao uma referncia (endereo da memria) para o objeto criado

41

Criando um objeto dinamicamente...


new Conta(12-3,11-2);

12-3

11-2

12-3

11-2

id275

1. Cria o objeto na memria

2. Inicializa o objeto

3. Associa um endereo ao objeto

4. Devolve o endereo como resultado da avaliao

42

Construtores e new
Podemos ter mais de um construtor para um determinado objeto A escolha do construtor para inicializar os atributos determinada pela lista de argumentos, entre parnteses

new NomeDaClasse(argumentos)
O nmero, ordem e tipos dos argumentos determina o construtor

43

Referncias para objetos


Todo acesso e manipulao feito indiretamente, atravs de uma referncia (endereo) para o objeto Quando declaramos uma varivel do tipo de um determinado objeto, ela no armazena o objeto e sim uma referncia para um objeto daquele tipo
Conta* conta1 = new Conta(12-3,11-2); A referncia para o objeto O objeto

conta1 armazena este valor

id305 A referncia funciona como a identidade do objeto

44

Referncias e identidade de um objeto

id305

12-3

11-2

Objetos diferentes, mas com o mesmo contedo (clones)

id309

12-3

11-2

id312

11-5

12-4

Referncias diferentes objetos diferentes


45

Consideraes sobre Criao de Objetos


Os valores dos atributos (estado) de um objeto podem mudar durante a execuo de um programa, mas isso no afeta a identidade do objeto O ato de criar um objeto chamado de instanciar um objeto de uma determinada classe

46

Criao Esttica de Objetos


C++ permite tambm a criao esttica (em tempo de compilao) de objetos No ato da declarao de uma varivel do tipo de uma classe, objeto criado
Na declarao deve-se passar argumentos do construtor

Conta c(12-3,11-2);
Tipo da varivel c Conta Argumentos do construtor
47

Usando Criao Esttica de Objetos do Tipo Conta


#include <iostream> objeto em tempo de compilao using namespace std; int main() { Conta c(1234-5,007-x); c.creditar(300); cout<<"Conta tem saldo = " << c.getSaldo() << endl; c.debitar(200); cout<<"Conta tem saldo = " << c.getSaldo() << endl; return 0; }

Declarao para instanciar

Utiliza-se operador . para utilizar os mtodos do objeto criado estaticamente


48

Introduo Programao

Encapsulamento e Herana

Tpicos da Aula
Hoje, aprenderemos conceitos mais avanados de Orientao a Objetos
Encapsulamento Usando modificadores de acesso em C++ Herana Importncia Utilizao em C++ Herana mltipla

Encapsulamento (Information Hiding)


Um objeto pode ser visto de duas formas diferentes:
Internamente Detalhes de atributos e mtodos da classe que o define Externamente Servios que um objeto fornece e como este objeto interage com o resto do sistema (a interface do objeto)

Encapsulamento (Information Hiding)

A viso externa de um objeto encapsula o modo como so fornecidos os servios

Isto , esconde os detalhes (internos) de


implementao do objeto (information hiding)

Encapsulamento (Information Hiding)


Um objeto (chamado neste caso de cliente) pode usar os servios fornecidos por um outro objeto
Contudo, um cliente no deve precisar saber os detalhes de implementao destes mtodos

Mudanas no estado (atributos) de um objeto devem ser feitas pelos mtodos do objeto Para permitir uma maior independncia entre os objetos,o acesso direto aos atributos de um objeto por um outro objeto deve ser restrito ou quase impossvel

Encapsulamento (Information Hiding)


Um objeto pode ser visto como uma caixa preta, onde os detalhes internos so escondidos dos clientes

Clientes acessam o estado do objeto, atravs dos mtodos oferecidos

Cliente

Mtodos

Dados

Modificadores de Acesso
Em C++, o encapsulamento possvel atravs do uso apropriado de modificadores de acesso
Modificadores so palavras reservadas que especificam caractersticas particulares de um conjunto de mtodos ou de atributos

Modificadores de acesso variam de acordo com a visibilidade que se quer oferecer ao cliente Podem ser: public,protected ,private,friend

Modificadores de Acesso
Membros da classe que recebem o modificador public, podem ser acessados por qualquer outra classe
Devem ser utilizados para mtodos que definem a interface da classe No deve ser utilizado para os atributos, excetuando-se o caso onde queremos declarar uma constante

Membros que recebem o modificador private, s podem ser acessados por membros da classe ou classes (ou funes) amigas (friends)
Devem ser utilizados para atributos e mtodos auxiliares

Modificadores de Acesso
public Atributos Violam encapsulamento Fornecem servios para os clientes private Preservam encapsulamento Auxiliam outros mtodos da classe

Mtodos

Classe Conta e Modificadores de Acesso


class Conta {

private: string numero; string agencia; double saldo;

Parte privada

public: void creditar (double valor); void debitar(double valor); double getSaldo(); string getNumero(); string getAgencia(); Conta(string num, string ag); protected: void setSaldo(double valor);
}

Parte pblica

Parte protegida
10

Modificadores de Acesso
Membros de uma superclasse que recebem o modificador private, no podem ser acessados nem pelas subclasses
Se colocar public e o membro for um atributo, o princpio do encapsulamento violado

Membros com o modificador protected so visveis pelas subclasses e pelas classes (ou funes) amigas

Modificadores de Acesso
Em C++, o modificador friend pode ser colocado antes de um mtodo ou (uma classe) declarado dentro de uma classe
O mtodo amigo (ou classe amiga) no pertence a classe na qual est declarado Informa que o mtodo amigo (ou classe amiga) pode acessar os membros privados e protegidos da classe na qual est declarado

Classe Conta e Modificador de Acesso Friend


class Conta {

private: string numero; string agencia; double saldo;

Parte privada

public: void creditar (double valor); ... friend void creditarBonus(Conta* c,double v);
};

Funo (mtodo) amiga

void creditarBonus(Conta* c, double v) { if (c->saldo > 10000) c->saldo = c->saldo + v; }

Funo amiga que no pertence classe acessa parte privada da classe

13

Modificadores de Acesso
Membros de uma classe, que no recebem modificador de acesso, tem visibilidade private

Na redefinio de mtodos herdados, o modificador de acesso no deve ser trocado por um mais restrito No entanto, podem ser trocados por modificadores menos restritos

Classes de Poupanas e Contas: Descries


class PoupancaD { private: string numero; string agencia; Partes idnticas double saldo; das descries public: void creditar (double valor); void debitar(double valor); void renderJuros(double taxa); } Parte diferente class Conta{ das descries private: string numero; string agencia; double saldo; public: void creditar (double valor); void debitar(double valor); 15 }

Classe de Bancos: Assinatura


class BancoD { public: void cadastrarConta(Conta* c){} void cadastrarPoupanca(PoupancaD* p){} ... }

Mtodos diferentes para manipular contas e poupanas

16

Problemas
Duplicao desnecessria de cdigo:
A definio de PoupanaD uma simples extenso da definio de Conta Clientes de Conta que precisam trabalhar tambm com PoupanaD tero que ter cdigo especial para manipular poupanas

Falta refletir relao entre tipos do mundo real

17

Subtipos e Subclasses Poupana

Conta
18

Herana
Necessidade de estender classes
Alterar classes j existentes e adicionar propriedades ou comportamentos para representar outra classe de objetos Criar uma hierarquia de classes que herdam propriedades e comportamentos de outra classe e definem novas propriedades e comportamentos

19

Herana
Herana permite que novas classes possam ser derivadas de classes existentes A classe existente chamada de classe pai (me) ou superclasse A classe derivada chamada de classe filha ou subclasse Subclasse herda as caractersticas da superclasse
Herda os atributos e mtodos

Estabelece a relao de - um
A subclasse uma verso especializada da superclasse

20

Importncia de Herana
Comportamento
Objetos da subclasse comportam-se como os objetos da superclasse

Substituio
Objetos da subclasse podem ser usados no lugar de objetos da superclasse

Reuso de Cdigo
Descrio da superclasse pode ser usada para definir a subclasse

Extensibilidade
algumas operaes da superclasse podem ser redefinidas na subclasse

21

Classe de Poupanas: Assinatura


Indica que a classe Poupanca herda de Conta
#include Conta.h class Poupanca: public Conta { public: void renderJuros(double taxa); Poupanca(string num,string ag):Conta(num,ag){} }

Indica que o construtor de Poupanca utiliza o construtor de Conta para inicializar atributos

22

Classes de Poupanas: Implementao


#include Poupanca.h void Poupanca::renderJuros(double taxa) { creditar(getSaldo() * taxa); }

So precisa implementar o mtodo renderJuros, o resto herdado!


23

Herana e Construtores
Construtores no so herdados
Embora, freqentemente, precisamos do construtor da superclasse para a definio dos construtores das subclasses Necessrios para inicializar os atributos que so herdados da superclasse

Devemos portanto definir construtores para as subclasses

24

Herana Mltipla
Herana mltipla permite que uma classe seja derivada de mais de uma classe
Carro
puxarFreiodeMao() acelerar()

Barco
jogarAncora() acelerar()

CarroAnfibio

Qual verso do mtodo acelerar herdada por CarroAnfibio?

25

Herana Mltipla e C++


Herana mltipla faz com que subclasses herdem atributos e mtodos das suas superclasses
Pode haver colises de nomes de atributos e mtodos

Ao contrrio de Java, C++ d suporte a herana mltipla


Na hora de utilizar o mtodo, usamos o operador de resoluo de escopo para dizer a qual mtodo estamos nos referindo

26

Herana Mltipla em C++


class CarroAnfibio: public Carro,Barco { ... };

Herda das superclasses Carro e Barco

int main() { CarroAnfibio ca; ca.Carro::acelerar(); ca.Barco::acelerar(); ... }

Usando operador de resoluo de escopo para determinar qual verso do mtodo 27 acelerar deve ser usado

Introduo Programao

Polimorfismo, Cast e Dynamic Binding

Tpicos da Aula
Hoje, aprenderemos conceitos mais avanados de Orientao a Objetos
Polimorfismo Conceito Obtendo polimorfismo atravs de Herana Cast Redefinio e sobregarga de mtodos Dynamic Binding (Ligao Dinmica)

Polimorfismo
A palavra polimorfismo significa assumir muitas formas

Uma referncia polimrfica uma varivel que pode armazenar referncias (ponteiros) para objetos de tipos diferentes em intervalos de tempo diferentes

Polimorfismo
Um mtodo chamado atravs de referncia polimrfica pode comportamentos diferentes entre chamada e outra uma ter uma

Polimorfismo em C++ pode se dar atravs de herana

Polimorfismo via Herana


Polimorfismo
Uma conta pode ser
Uma poupana Uma conta especial

Herana permite a substituio do supertipo pelo subtipo no cdigo


Onde permitido o supertipo, o subtipo pode ser utilizado Varivel de supertipo pode em um determinado instante do tempo guardar uma referncia (ponteiro) para uma instncia de um subtipo

Classe de Bancos: Assinatura


public class Banco { ... public: void cadastrar(Conta* conta); ... }

Subtipos: Substituio
Podemos cadastrar contas

... Banco banco; banco.cadastrar(new Conta("21.345-7,123-4)); banco.cadastrar(new Poupanca("1.21.345-9,123-4));

Podemos cadastrar poupanas Mesmo mtodo pode ser aplicado a Conta e Poupanca

Subtipos: Substituio
Herana permite a substituio do supertipo pelo subtipo no cdigo

Onde permitido o supertipo, o subtipo pode ser utilizado ... Conta* conta; conta = new Poupanca(21.342-7,123-4); conta->creditar(500.87); conta->debitar(45.00);

...

Subtipos: Substituio

... Poupanca* p; p = new Conta(21.342-7,123-4); p->creditar(500.87); p->debitar(45.00); ...

Cuidado! A recproca no verdadeira.

Substituio e Casts
Nos contextos onde objetos do tipo Conta so usados pode-se usar objetos do tipo Poupanca Nos contextos onde objetos do tipo Poupanca so usados pode-se usar variveis do tipo Conta que armazenam referncias (endereos) para objetos do tipo Poupanca, desde que se faa o uso explcito de casts dinmicos

10

Subtipos: Utilizando Casts Dinmicos

... Conta* c; c = new Poupanca("21.342-7,123-4); ... Gera erro de c->renderJuros(0.01); compilao


(dynamic_cast<Poupanca*>(c))->renderJuros(0.01); ...

Cast

11

Redefinio de Mtodos
Uma subclasse pode redefinir (override) um mtodo herdado da superclasse O novo mtodo deve ter a mesma assinatura do mtodo da superclasse, mas pode ter um corpo diferente Semntica dos mtodos redefinidos deve ser preservada
12

Classe ContaEspecial: Redefinindo debitar


class ContaEspecial: public Conta { private: Mtodo existente em double limiteCredito; public: Conta redefinido em void debitar(double valor); ContaEspecial ContaEspecial(string num,string ag, double taxa): Conta(num,ag){limiteCredito = taxa;} ... }; void ContaEspecial::debitar(double valor) { double saldo = getSaldo(); if (valor <= (saldo + limiteCredito)) { setSaldo(saldo valor); } }

13

Redefinio de Mtodos
Visibilidade dos mtodos redefinidos deve ser preservada
Em C++, possvel aumentar a visibilidade de um mtodo
Diminuir a visibilidade pode gerar um erro de compilao

possvel acessar a definio dos mtodos da superclasse usando operador de resoluo de escopo
class Pai { public: void x(){ ... }; } class Filha:public Pai{ public: // Redefinindo x void x(){ Pai::x(); ... }; }

14

Sobrecarga de Mtodos
Sobrecarga (overloading) de mtodo o processo de dar a um mtodo mltiplas definies Isto quer dizer que somente o nome do mtodo no suficiente para determinar qual o mtodo que se deseja utilizar A assinatura de cada mtodo overloaded deve ser nica
O que vai diferenciar os mtodos o nmero, tipo e ordem dos parmetros
No podem somente ser diferenciados pelo tipo de retorno 15

Sobrecarga de Mtodos
Construtores so comumente overloaded
til para permitir vrias formas de inicializao de um objeto

O compilador checa qual o mtodo que est sendo chamado, analisando os parmetros
Chamada class Conta{ ... Conta* conta = new Conta(2,3, 50); public: Conta(string num, string ag, double valor); Conta(string num, string ag); } Conta::Conta(string num, string ag) { numero = num; agencia = ag; } Conta::Conta(string num,string ag, double valor) { numero = num; agencia = ag; saldo = valor; 16 }

Sobrecarga x Redefinio
Sobrecarga trata mltiplos mtodos com o mesmo nome, mas assinaturas diferentes Redefinio trata de dois mtodos, um na superclasse e outro na subclasse, que possuem a mesma assinatura Sobrecarga permite que se defina uma operao similar em diferentes formas para diferentes parmetros Redefinio permite que se defina uma operao similar em diferentes formas para diferentes tipos de objeto
17

Binding de Mtodos: debitar de Conta e ContaEspecial


class Conta { ... public: void debitar(double valor); Duas verses ... de debitar }; void Conta::debitar(double valor) { if (valor <= saldo) { saldo valor; } class ContaEspecial: public Conta { } ... public: void debitar(double valor); }; void ContaEspecial::debitar(double valor) { double saldo = getSaldo(); if (valor <= (saldo + limiteCredito)) { setSaldo(saldo valor); } 18 }

Binding de Mtodos
... Conta* ca; ca = new ContaEspecial(21.342-7,123-4,1000); ca->creditar(500); Qual verso de ca->debitar(600); debitar cout << ca->getSaldo()<<endl; utilizada? ca = new Conta(21.111-7,123-4); ca->creditar(500); ca->debitar(600); cout << ca->getSaldo()<<endl; ...

19

Binding
Uma chamada de um mtodo dentro do cdigo deve ser ligada (associada) definio do mtodo chamado Associa-se o mtodo chamado ao endereo de memria que contm a definio do mtodo Se esta ligao (binding) feita em tempo de compilao, ento sempre a chamada do mtodo ser ligada ao mesmo mtodo
Static Binding
20

Dynamic Binding
Se a ligao da chamada de mtodo a sua definio correspondente for em tempo de execuo, ento o mtodo chamado depende do objeto referenciado
Dynamic Binding ou Late Binding

Portanto, se existir dois mtodos com o mesmo nome e tipo(definio e redefinio), em Java, o cdigo escolhido dinamicamente
Escolha feita com base na classe do objeto associado varivel destino da chamada do mtodo

Linguagens como Java, Eiffel e Smalltalk utilizam dynamic binding como padro 21

Binding em C++
C++, C# e Delphi utilizam static binding como padro
Para se utilizar dynamic binding deve-se informar explicitamente que um mtodo pode ser ligado em tempo de execuo

22

C++: Padro Static Binding


... Conta* ca; ca = new ContaEspecial(21.342-7,123-4,1000); ca->creditar(500); Qual verso de ca->debitar(600); debitar cout << ca->getSaldo()<<endl; utilizada? ca = new Conta(21.111-7,123-4); ca->creditar(500); ca->debitar(600); cout << ca->getSaldo()<<endl; ... Ser utilizada o mtodo debitar definido em Conta

23

Dynamic Binding em C++


class Conta { ... public: virtual void debitar(double valor); ... Deve-se utilizar a }; palavra virtual void Conta::debitar(double valor) { ... antes do mtodo } da superclasse que class ContaEspecial: public Conta { vai ter dynamic ... binding public: void debitar(double valor); }; void ContaEspecial::debitar(double valor) { ... } 24

Dynamic Binding em C++


... Conta* ca; ca = new ContaEspecial(21.342-7,123-4,1000); ca->creditar(500); Qual verso de ca->debitar(600); debitar cout << ca->getSaldo()<<endl; utilizada? ca = new Conta(21.111-7,123-4); ca->creditar(500); ca->debitar(600); cout << ca->getSaldo()<<endl; ... Em tempo de execuo decidida qual verso de debitar deve ser utilizada

25