You are on page 1of 266

Instituto Federal de Educ.

Tecnolgica - Maranho (IFET-MA) Departamento Acadmico de Informtica Curso Tcnico em Programao de Computadores

(com Linguagem C)
60 horas Prof. Msc. Gentil Cutrim Serra Jnior
gentil@cefet-ma.br Jun/2008

Algoritmos

Plano de Ensino da Disciplina

EMENTA: Algoritmos, Tcnicas bsicas de programao, Tipos de dados e Instrues primitivas, Estruturas de seleo, Estruturas de repetio, Estruturas de dados homogneas, Aplicaes prticas do uso de vetores e matrizes, Estruturas de dados heterogneas, Programao Estruturada em Linguagem C, Utilizao de Subrotinas (Procedimentos e Funes).

Plano de Ensino da Disciplina

OBJETIVOS: Apresentar aos alunos os conceitos bsicos de programao estruturada, levando-os a criar programas em uma linguagem de programao que manipulem tipos de dados homogneos e heterogneos. Mostrar o conceito de modularizao com passagem de parmetros.

Plano de Ensino da Disciplina


I - INTRODUO A ALGORITMOS

Conceitos bsicos sobre algoritmos Fases da elaborao de um algoritmo Lgica de Programao Fluxograma Portugus Estruturado

Plano de Ensino da Disciplina


II - CONSTRUO DE ALGORITMOS

Variveis, constantes e tipos de dados Operaes de entrada e sada de dados Uso do ponto e vrgula Operadores e expresses

Plano de Ensino da Disciplina


III - ESTRUTURAS DE DECISO

Estruturas de seleo simples Estruturas de seleo composta

IV - ESTRUTURAS DE REPETIO

Estrutura de repetio Enquanto Estrutura de repetio Repita Estrutura de repetio Para

Plano de Ensino da Disciplina


V NOES DA LINGUAGEM C

Estrutura de um programa em C Tipos de dados Expresses Comandos de entrada e sada de dados Comandos de deciso Comandos de Repetio Matrizes Funes

Plano de Ensino da Disciplina


VI - ESTRUTURAS DE DADOS HOMOGNEOS

Declarao de vetores/matrizes Operaes bsicas com vetores/matrizes Mtodos de pesquisa em vetores Classificao de elementos em vetores

Plano de Ensino da Disciplina


VII - MODULARIZAO

Utilizao de sub-rotinas Procedimentos Escopo de variveis Parmetros Passagem de parmetros por valor e referncia Funes

Bibliografia
MANZANO, Jos, OLIVEIRA, Jayr. Algoritmos: Lgica para Desenvolvimento de Programao. So Paulo: RICA, 1996. SALIBA, Walter. Tcnicas de Programao. So Paulo: Makron Books, 1992. FERNANDES, Antnio, BOTINI, Joana. Construo de Algoritmos, Rio de Janeiro, SENAC Nacional, 1998. SCHILDT, Herbert. C Completo e Total. 3 Ed. So Paulo: Makron Books, 1995.

Introduo a Algoritmos
Unidade I

Conceitos Bsicos

Para que programao? Conceito de sistema

Entrada Processamento Sada


Um algoritmo uma seqncia de instrues ordenadas de forma lgica para a resoluo de uma determinada tarefa ou problema.

Conceito de algoritmos

Conceito de algoritmos em administrao de uma empresa

Algoritmo no computacional
Incio 1. Introduzir o carto; 2. Tirar o fone do gancho; 3. Ouvir o sinal de linha; 4. Teclar o nmero desejado; 5. Se ocupado 5.1 Colocar o telefone no gancho; 5.2 Ir para o passo 2; 6. Seno ocupado 6.1 Se atender 6.1.1 Conversar; 6.1.2 Colocar o fone no gancho; 6.1.3 Retirar o carto; 6.2 Seno atender 6.2.1 Colocar o fone no gancho; 6.2.2 Retirar o carto; Fim.

Algoritmos

Narrativa Fluxograma Pseudo-cdigo (Portugol)

Exemplo da linguagem narrativa: Trocar pneu de um carro

Algoritmo Troca de pneu


1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.

Verificar existncia das ferramentas e estepe Folgar porcas com chave de rodas Colocar macaco Levantar carro at pneu sair do cho Retirar porcas com chave de rodas Retirar pneu Colocar estepe Colocar porcas apertando um pouco Abaixar carro Retirar macaco Apertar porcas Guardar ferramentas e pneu furado

Algoritmo Troca de pneu


se h ferramentas (macaco e chave de rodas) e estepe ento faa 4 vezes girar uma porca no folgada 60 (anti-horrio) colocar macaco em posio adequada usar o macaco para levantar o carro at pneu furado sair do cho faa 4 vezes girar uma porca at sair retirar pneu furado colocar estepe no lugar do pneu furado faa 4 vezes colocar uma porca girando-a 60 (horrio) abaixar macaco at estepe est totalmente no cho retirar macaco faa 4 vezes girar uma porca (horrio) folgada at apert-la guardar ferramentas e pneu furado seno Chamar Socorro de Pneu

Algoritmo Socorro de Pneu


obter todas as ferrramentas necessrias dirigir-se ao local identificando o pneu furado faa 4 vezes girar uma porca no folgada 60 (anti-horrio) colocar macaco em posio adequada usar o macaco para levantar o carro at pneu furado sair do cho faa 4 vezes girar uma porca at sair retirar pneu furado colocar estepe no lugar do pneu furado faa 4 vezes colocar uma porca girando-a 60 (horrio) abaixar macaco at estepe est totalmente no cho retirar macaco faa 4 vezes girar uma porca (horrio) folgada at apert-la guardar ferramentas e pneu furado cobrar servio

Algoritmos

Exerccio para a prxima aula

Faa um algoritmo em linguagem narrativa para fazer um bolo

Conceitos de Fluxograma

Algoritmos

Exerccio Receita de Bolo A importncia da Endentao!


se <condio> inicio
<bloco de comandos>;

fim seno inicio


<bloco de comandos>;

fim

Fluxograma - Smbolos especiais


Terminador Entrada de dado

Execuo

Exibio

Deciso

Fluxograma

Algoritmo Troca de Pneu em fluxograma Algoritmo Receita de Bolo em fluxograma Ferramenta Construtor

Algoritmos

Comentrios do exerccio receita de bolo Exerccios Fluxograma


Faa um algoritmo para receber dois nmeros, calcular e apresentar a multiplicao destes; Faa um algoritmo para realizar o clculo da mdia de duas notas de um aluno. Ao final, informe se o aluno foi ou no aprovado (se media>=7 ento aprovado, seno reprovado); Faa um algoritmo para receber dois nmeros informados pelo usurio e verificar se eles so iguais, se o primeiro maior ou menor em relao ao segundo; Faa um algoritmo para ler o preo e a quantidade de um produto e ento fornecer o total.

Algoritmos em Portugol

Algoritmos em uma pseudo-linguagem (Portugus Estruturado) "Portugol" derivado da aglutinao de Portugus + Algol (Algol o nome de uma linguagem de programao estruturada usada no final da dcada de 50) Algoritmos computacionais

Ex: Portugol Reajuste Salarial ler(salario); se (salario > 10690.50)


salario = salario * 1.10;

seno
salario = salario * 1.40;

Construo de Algoritmos
Unidade II

Variveis

Locais da memria destinados a armazenar informaes temporrias Uma varivel possue: Nome Tipo de dados Contedo Endereo de memria

Variveis

Tipos de dados

Numrico Literal/alfanumrico/texto/ /string/caractere Lgico

Tipos de dados

Inteiro Admite somente nmeros inteiros Real Admite nmeros reais (com ou sem casas decimais) Literal/alfanumrico/texto/string Admite caracteres alfanumricos String (texto) Lgico Admite valor verdadeiro ou falso

Variveis

contedo

Nome

po Ti

de

do a

Variveis

350,697.45
ValorVenda
um n

co i

Variveis

V
Resp

ic g l

Variveis

Maria Silva Pereira


NomePessoa

li t

er al

Identificador

Meio para manipulao de uma informao Nome que identifica um(a):


programa tipo varivel constante sub-rotina

Nomes a Identificadores

Formado por uma combinao de caracteres alfanumricos Regras para criao de nomes de identificadores:

Comea por uma letra do alfabeto e o resto pode ser qualquer letra do alfabeto, ou qualquer dgito numrico ou um sublinhado (undescore) No usar palavras chaves da linguagem (se, entao, senao, inicio, fim, )

Nomes a Identificadores

Lembrete:

No usar espaos em branco; No acentuar; No usar caracteres especiais do tipo: @, %, ?, !, *, &, #, /,

Exemplos:
nome_1; _a; Nota; nota; imposto_de_renda; !x; 4_nota; valor venda

Dicionrio de Dados

Exemplo:

nm id vl end

= = = =

Nome do cliente (literal) Idade do cliente (numrico) Valor da venda (numrico) Endereo do cliente (literal)

CONSTANTES

Locais da memria destinados a armazenar informaes fixas, inalterveis durante a execuo do programa
const <tipo> <nome> <contedo>;

Exemplo: const float PI 3.14159;

Noo de tipo de dado


As aspas Atribuio Exemplos de atribuio:


Para num (numrico) e pessoa (literal): num teste; pessoa teste; num 123; pessoa joo; num 123; pessoa 123;

1 Laboratrio

Apresentao da Ferramenta Construtor Exerccios:

Faa um algoritmo para receber dois nmeros, calcular e apresentar a multiplicao destes. Faa um algoritmo para realizar o clculo da mdia de duas notas de um aluno. Ao final informe se o aluno foi ou no aprovado (se media>=7 ento aprovado, seno reprovado) Faa um algoritmo para receber dois nmeros informados pelo usurio e verificar se eles so iguais, se o primeiro maior ou menor em relao ao segundo. Faa um algoritmo para ler o preo e a quantidade de um produto e ento fornecer o total

Lista de Exerccios 1 (Para casa)

Comandos de E/S

Comando de sada que exibe uma informao na tela do monitor/impressora/arquivo


imprimir(A IDADE , idade);

Comando de entrada que permite a leitura de um contedo para uma varivel


ler(n);

Comandos de E/S
numerico preco, quant, total;

inicio
imprimir(Digite o preo do produto); ler(preco); imprimir(Digite a quantidade); ler(quant); total := preco*quant; imprimir(O valor total , total);

fim

Comandos de E/S
Digite o preo do produto 154.45 Digite a quantidade do produto 3 O valor total 463.35

Exerccio

Escreva um algoritmo para calcular o consumo mdio de um automvel (medido em Km/l), dado que so informados pelo usurio a distncia total percorrida e a quantidade de combustvel consumido para percorr-la (medido em litros)

cons_medio = distancia / quant;

Atribuio

O contedo de uma varivel pode ser alterado a qualquer momento Para atribuir valores a variveis devemos usar o sinal de ou = Exemplos:

a = 2; b = 3; c = a + b;

Ponto e vrgula

O sinal de ponto e vrgula ";" indica a existncia de um prximo comando (passa para o prximo) Por no ser um comando, aps a palavra INICIO no se usa ";"

/* Linhas de Comentrios */

Podemos inserir em um algoritmo comentrios para aumentar a compreenso do mesmo, para isso basta que o texto fique entre /* */ essencial para um bom algoritmo Exemplo

ler(raio); /* entrada valor do raio */

Aspas
Quando queremos exibir uma mensagem para a tela ou impressora ela deve estar contida entre aspas duplas, caso contrrio, o computador ir identific-la como Identificador Desconhecido Exemplo: imprimir(Area Total=, area); /* informa a rea total */

Comando de Deciso SE
Unidade III

Estruturas de deciso

Executa uma seqncia de comandos de acordo com o resultado de um teste condicional A estrutura de deciso pode ser Simples ou Composta, baseada em um resultado lgico (condio)

Exemplo
se <condio> inicio <comando1>; <comandoN>; fim seno inicio <comando1>; <comandoM>; fim

SE Aninhados

Usados para tomadas de decises para mais de 2 opes Forma Geral:

se <condio> <comando1> seno se <condio> <comando2> seno <comando3>

Comando SE

Condio:

Varivel lgica (em Pascal, Delphi, etc) ou varivel inteira (em C)


L1 = verdadeiro; se (L1) inicio fim

Expresso lgica
se ((x==2) and (y>4)) inicio fim

Resultado de funo com retorno lgico

Exerccio (Comando SE)


inicio lgico L1, L2, L3; se (L1) comando1; seno inicio se (L2) inicio se (L3) comando2; seno inicio comando3; comando4; fim fim fim comando5; fim

L1 = verdadeiro; L2 = verdadeiro; L3 = falso;

Dado o algoritmo em Portugol, diga quais comandos sero executados

Exerccio (Comando SE)


inicio lgico L1, L2, L3; se (L1) comando1; seno inicio se (L2) inicio se (L3) comando2; seno inicio comando3; comando4; fim fim fim Comando5; fim

L1 = falso; L2 = verdadeiro; L3 = falso;

Dado o algoritmo em Portugol, diga quais comandos sero executados

Exerccio (Comando SE)


inicio lgico L1, L2, L3; se (L1) comando1; seno inicio se (L2) inicio se (L3) comando2; seno inicio comando3; comando4; fim fim fim comando5; fim

L1 = ? L2 = ? L3 = ?

Quais os valores de L1, L2 e L3 para que somente o comando5 seja executado?

Exerccio (Comando SE)


inicio lgico L1, L2, L3; se (L1) comando1; seno inicio se (L2) inicio se (L3) comando2; seno inicio comando3; comando4; fim fim fim comando5; fim

L1 = falso; L2 = verdadeiro; L3 = verdadeiro;

Dado o algoritmo em Portugol, diga quais comandos sero executados

Comando SE

O que Endentao Exerccio (para a prxima aula):

Faa um algoritmo para ler o nome de um contribuinte e seu rendimento anual. O algoritmo dever ento informar ao usurio qual o valor do Imposto de Renda a pagar de acordo com a tabela abaixo.

www.receita.fazenda.gov.br

Expresses Aritmticas

O resultado da avaliao numrico Somente o uso de operadores aritmticos e variveis numricas so permitidos nessas expresses
Operador Tipo Prioridade

+ * / **

Adio Subtrao Multiplicao Diviso Exponenciao

4 4 3 3 2 1

- (unrio) Inversor de sinal

Expresses Aritmticas

A prioridade entre operadores define a ordem em que os mesmos devem ser avaliados dentro de uma mesma expresso Os parnteses podem definir prioridades Exemplos:

a+b*c (a+b)*c a+(b*c) x/y m+x*y/z

Expresses Aritmticas

Linearizao de expresses

{[

2 1 53 X = +Y 3 2

] }

(((2/3)+(5-3))-X)=1/2+Y

Operadores Especiais

%: Retorna o resto da diviso entre 2 nmeros inteiros Exemplo: x = a % 2;

Expresses Lgicas

As expresses compostas de relaes sempre retornam um valor lgico


(2+5>4) (3!=3) ((2+5>4) E (3!=3)) ((2+5>4) OU (3!=3)) NO(3!=3) Verdadeiro Falso Falso Verdadeiro Verdadeiro

Expresses Lgicas
... se ((sexo = 'f') and (sal < 5000)) sal = sal * 1.10; seno sal = sal *1.05;

Operadores Relacionais

a=1, b=2, c=3, d=4

(NO(a>5) OU ((C<1) E (d!=a))) ( NO(F) ( (V) OU ( (F) OU (V) E (F) (V) )) )

Operadores Lgicos

Atuam sobre expresses lgicas retornando sempre valores lgicos como falso ou verdadeiro
Operador Operao Prioridade

OU (OR) (||) E (AND) (&&) NO (NOT) (!)

Disjuno Conjuno Negao

3 2 1

Operadores Relacionais

Usados quando se deseja realizar comparaes em expresses lgicas


Operador Comparao

== != < <= > >=

Igualdade Diferente Menor Menor igual Maior Maior igual

Estruturas de Repetio
Unidade IV

Repetio Condicional

COM VALIDAO INICIAL

usada para repetir N vezes uma ou mais instrues. Tendo como vantagem o fato de no ser necessrio o conhecimento prvio do nmero de repeties Todas as variveis CONTADORES devem receber um valor inicial.

Enquanto

Forma Geral 1:

enquanto <condio> faa <comando1>;

Forma Geral 2:

enquanto<condio>faa inicio <comando1>; <comandon>; fim

Enquanto

Comando Enquanto

Com Contador

Incremento

N=N+1; N=N-1;

Decremento

Sem Contador

ENQUANTO com Incremento


inicio numerico n; n=1; enquanto (n<=5) faa inicio imprimir(natao); n=n+1; fim fim

6 5 4 3 2 1

ENQUANTO com Decremento


inicio numerico n; n=5; enquanto (n>=1) faa inicio imprimir(cooper); n=n-1; fim fim

5 4 3 2 1 0

Exemplo1
inicio numerico x, numero, soma; soma=0; x=10; enquanto (x>=1) faa inicio imprimir(digite nmero); leia(numero); soma=soma+numero; x=x-1; fim imprimir(somatrio , soma); fim

Exemplo2
inicio numerico x, numero, soma; soma=0; imprimir(quantos nmeros? ); leia(x); enquanto (x>=1) faa inicio imprimir(digite nmero); leia(numero); soma=soma+numero; x=x-1; fim imprimir(somatrio , soma); fim

ENQUANTO sem contador

Exemplos:

resposta = s Quando num=999 Quando x=0 etc

Exemplo3
principal() inicio numerico soma, salario; soma=o; salario=1; enquanto (salario>0) faa inicio imprimir(digite o salrio (digite 0 para sair)); ler(salario); soma=soma+salario; fim imprimir(soma); fim

Laboratrio2 - Construtor

Comando Enquanto Prtica da aula anterior Lista de exerccios2 - Enquanto

Resoluo de exerccios

Lista de Exerccios 2

Fatorial Fibonacci PA e PG etc

Repetio Condicional

COM VALIDAO FINAL

Assim como a estrutura ENQUANTO, usada para repetir uma ou mais instrues Sua validao no final fazendo com que a repetio seja executada pelo menos uma vez

faa enquanto
faa inicio <comando1>; <comandon>; fim enquanto <condio>;

Exemplo1
principal () inicio soma, salario : numerico; soma:=0; faa imprimir(digite salrio (0 para sair); ler(salario); soma=soma+salario; enquanto (salario!=0); imprimir(soma); fim

Exemplo2
principal () inicio numerico par, contador; contador = 0; par = 0; faa imprimir(par); par := par+2; contador := contador+1; enquanto (contador<100); fim

Repetio Determinada

Na repetio determinada o algoritmo apresenta previamente a quantidade de repeties O contador (com incremento ou decremento) automtico

Exerccios
1)Faa um algoritmo para ler um valor X qualquer, calcular e imprimir Y, sendo:
Y = (x+1)+ (x+2)+ (x+3)+... (x+99)+ (x+100)

2) Faa um algoritmo para gerar 50 termos da seguinte PG: 3,9,27,81,... Imprima-os. LISTA DE EXERCCIOS 2 (Agora com os comandos faa enquanto)

Estruturas de Condio

A estrutura de condio equivale a um SE aninhado. Forma Geral: faa caso caso <condio1> <comando1>; caso <condioN> <comando2>; outros casos <comandoX>; fim

Linguagem C
Unidade V

LINGUAGENS DE PROGRAMAO

Permitem o desenvolvimento de programas. Possuem um poder de criao ilimitado, desde jogos, editores de texto, sistemas empresariais at sistemas operacionais. Existem vrias linguagens de programao:

Pascal C Delphi Java Lisp Prolog etc.

Introduo
Dennis

Ritchie (Laboratrios Bell) -

1972
Idias B

a partir da linguagens BCPL e B

para o UNIX (PDP-11)

Introduo
Inicialmente

para mquinas do tipo

PDP-11 (com UNIX escrito em Assembly)


Reescreveu Depois

o UNIX (1973) com C

para os IBM PC e compatveis

(MSDOS/MS-Windows e Linux)

O Standard C ANSI

Surgiram diversas implementaes. Cdigos incompatveis Padro ANSI em 1983 Verso que segue a norma do American National Standard Institute (ANSI), e da International Standards Organization (ISO) Compiladores da Borland (primeiros a oferecer compatibilidade com essa norma Turbo C 2.0)

Caractersticas
A

linguagem C muito famosa e muito utilizada:


pela conciso de suas instrues; pela facilidade de desenvolvimento de compiladores C; pela rapidez de execuo de programas; pelo poderoso conjunto de operadores e tipos de dados;

Caractersticas

por permitir a gerao de um cdigo bem otimizado e compacto; pela sua portabilidade; por apresentar facilidade de manipulao direta do hardware da mquina; pelo fato que o poderoso Unix foi escrito em C. Linux tambm.

Palavras Chaves (reservadas)

So palavras que tm um significado especial para a linguagem

if,else,break,case,for,while, continue,return,const,....

C entende essas palavras apenas em letras minsculas

Detalhes importantes
Compilador

Sempre que o cdigo fonte for alterado ele deve ser re-compilado

Deve-se

criar antecipadamente as variveis utilizadas

Bibliotecas

Conjunto de funes para realizar tarefas especficas. Biblioteca padro C - ANSI - funes bsicas. As primeiras linhas do programa indicam as bibliotecas utilizadas

#include minha_biblioteca.h #include <minha_biblioteca.h> #include arq_funcoes.c

Organizao de um programa
Bibliotecas Declaraes globais Funes (comandos) Funo Principal (main) (comandos)

Um Programa Simples
#include <stdio.h>
/* */ um programa bem simples que imprime uma mensagem na tela.

main () { printf("Software Livre"); }

Compilao
Pre-Processadores:

Transformao lexical do texto do programa


Compiladores:

Traduo do texto gerado pelo preprocessador e sua transformao em instrues da mquina

Compiladores

gcc (Linux)

utilize um editor de texto (vi, emacs, anjuta, pico, gedit, etc)

Cuidado com algumas sujeiras que ficam no arquivo quando se usa Copiar-Colar

Salve (extenso .c) compile no terminal (gera executvel)

gcc nomearquivo.c -o nomearquivo ./nomearquivo

execute com o comando

Compiladores

Dev C++

gratuito F9 (compila e executa) colocar getchar(); getchar(); no final para visualizar o resultado

Smbolos especiais

Delimitador de comandos ; Identificador de um elemento de uma matriz [ ] Comentrios /* */ Atribuio = Delimitador caracteres Delimitador de apenas um caractere ' '

Estrutura de um Programa
Um A

conjunto de funes

funo main obrigatria o ponto de entrada principal do programa

main
main () { declaraes; comando 1; comando 2; ... comando n; }

As outras funes
tipo nome (parmetros)

declaraes; comando 1; comando 2; ... comando n;

Consideraes sobre as funes


O

tipo da funo = tipo do valor que a funo retorna Por default (padro) o tipo de uma funo int

Exerccios

Faa um programa para receber dois nmeros, calcular e apresentar a multiplicao destes; Faa um programa para realizar o clculo da mdia de duas notas de um aluno. Ao final, informe se o aluno foi ou no aprovado (se media>=7 ento aprovado, seno reprovado); Faa um programa para receber dois nmeros informados pelo usurio e verificar se eles so iguais, se o primeiro maior ou menor em relao ao segundo.

Tipos Bsicos de Dados

Principais tipos de Dados

int

famlia dos nmeros inteiros famlia dos nmeros pontoflutuantes (pseudo-reais) famlia dos caracteres

float double

char

Observao: No tem o tipo boolean!

Inteiros

Podem receber dois atributos:


de

preciso (para o tamanho) de representao (para o sinal) Atributos


de preciso
: : : 1 byte 2 bytes 4 bytes

short int int long int

Inteiros
Atributos

de representao
: :
positivos positivos e negativos

unsigned signed

Combinao de Atributos - Inteiros


unsigned short int : rep. sobre 8 bits [0, 255] signed short int : rep. sobre 7 bits
[-128, 127]

: rep. sobre 16 bits [0, 65535] signed int : rep. sobre 15 bits [-32768, 32767] unsigned long int : rep. sobre 32 bits [0, 4294967295] signed long int : rep. sobre 31 bits [-2147483648, 2147483647] unsigned int

Inteiros - Resumo
Seis

tipos de inteiros
todos signed

int; short int; long int; unsigned int; unsigned short int; unsigned long int;

Pseudo-Reais
(representao da forma: M * 10EXP)

Os flutuantes podem ser:

float :representao sobre 7 bytes

[-3.4*10-38, 3.4*1038 ] double : representao sobre 15 bytes [-1.7*10-308, 1.7*10308 ] long double : representao sobre 19 bytes [-3.4*10-4932, 3.4*104932 ]

Caracteres

Um caracter representado por seu cdigo ASCII Ele pode ser manipulado como um inteiro Um caracter codificado sobre um byte podemos representar at 256 caracteres.

Caracteres
O

tipo : Char
char c,b; c = \65; b = c;

sizeof

Este operador retorna o tamanho da varivel ou tipo que est em seu operando. Por exemplo

sizeof(char) resultaria em 1.

E o tipo String?
No

existe em C o tipo string vetores de caracteres

Substituo:

char nome[20];

E o tipo Boolean (lgico)?


Ateno:

O Boolean no existe em C!
Pode

ser substitudo pelo int


: : false true

0 diferente de 0

Lgico
#include <stdio.h> main ( ) { int verdadeiro, falso; verdadeiro = (15 < 20); falso = (15 == 20); printf(Verdadeiro= %d,Falso= %d, verdadeiro, falso); }

Em sistemas 32 bits

char signed char unsigned char short unsigned short int


2,147,483,647

1 1 1 2 2 4 4 4 4 4 8 10

-128 a 127 -128 a 127 0 a 255 -32,768 a 32,767 0 a 65,535


-2,147,483,648 a

unsigned int long 2,147,483,647 unsigned long float double long double

0 a 4,294,967,295 -2,147,483,648 a 0 a 4,294,967,295 3.4E+/-38 (7 dgitos) 1.7E+/-308 (15 dgitos) 1.2E+/-4932 (19 dgitos)

DECLARAO DE VARIVEIS

Identificadores
Um Um

identificador um meio para manipulao da informao nome que indica uma varivel

funo tipo de dados etc

Identificadores
Formado Comea

por uma combinao de caracteres alfanumricos por uma letra do alfabeto ou um sublinhado, e o resto pode ser qualquer letra do alfabeto, ou qualquer dgito numrico (algarismo) ou um sublinhado.

Exemplos de identificadores
Exemplo:

nome_1; _a; Nota; nota; imposto_de_renda; !x;

4_nota;

Ateno (exemplo):

Os identificadores Nota e nota representam duas variveis diferentes (Case Sensitive)

Regras para a nomeao


Como

os compiladores ANSI usam variveis que comeam por um sublinhado, melhor ento no uslas No usar as palavras chaves da linguagem

Palavras Chaves
(so 32 palavras)
auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while

Declaraes
tipo lista-de-nomes-de-variveis

Exemplo:

int i,a; double d1, d2; char c;

Inicializao de Variveis
C

no faz automaticamente

Isto

pode ser feito no momento da declarao: int i=1,j=2, k=somar(4,5); short int l=1; char c=\0;

Operaes

Atribuio
Exemplo

i=4; a=5*2; d=-b/a; raiz=sqrt(d);

Exemplos de Atribuio
i = (j = k) - 2; 5 3 (caso k=5)

Atribuio

mltipla:

a=b=c=8;

Adio/subtrao/multiplicao
expresso1 + expresso2 expresso1 - expresso2 expresso1 * expresso2
As

duas expresses so avaliadas, depois a operao realizada, e o valor obtido o valor da expresso

Pode

ter uma converso de tipos, depois da avaliao das expresses: float x,y; int z; x=y+z;

Diviso (1)
expresso1 / expresso2
Em

C, o / designa ao mesmo tempo a diviso dos inteiros e dos reais depende ento dos valores retornados pelas expresses

Isto

Se os dois so inteiros ento a diviso inteira, mas se um deles real ento a diviso real

Diviso
Caso

(2)

os dois operandos inteiros sejam positivos, o sistema arredonda o resultado da diviso a zero:

7 / 2 retorna 3 7.0 / 2 retorna 3.5 (float) 7 / 2 retorna 3.5 7 / (float) 2 retorna 3.5

O Resto %
Expresso1 % Expresso2
Retorna

o resto da diviso inteira 7 % 2 retorna 1 Caso um dois operadores negativo, o sinal do mdulo depende da implementao, mas geralmente o sinal do primeiro 7 % 2 retornam 1 -7 % 2 retornam -1 7 % -2 retornam 1

Operadores Relacionais

expresso1 op-rel expresso2 Onde op-rel um dos seguintes smbolos: Operador Semntica == igual != diferentes > superior >= superior ou igual < inferior <= inferior ou igual O resultado da comparao um valor lgico: 1 (se a comparao verdadeira) e 0 (seno)

Operadores Lgicos

Para combinar expresses lgicas


Operador Semntica

&& || !
Exemplos:

e ou negao

a >= b (a = = 0) || (b != 0) ! ((a = = 0) && (b<3))

Operador &

o operador de endereamento (ponteiro) &a o endereo da varivel a acesso ao contedo da varivel a

Incremento/decremento
x = x + 1; x++; ++x; s+=i; z = y++; z = ++y;
O

/* isto incrementa x */ /* isto incrementa x */ /* isto incrementa x */ /* s=s+i*/

/* y++ e depois z = y (novo) */

/* z = y e depois y++ */

decremento semelhante

Regra
v = v operador expresso v operador= expresso

Condicional
a = (b >= 3.0 ? 2.0 : 10.5 );
if (b >= 3.0) a = 2.0; else a = 10.5;

c=(a > b ? a : b); c=(a > b ? b : a);


*/

/* c=maior(a,b) */ /* c=menor(a,b)

Operadores

Entradas e Sadas

Sistema

Entrada de Dados

Processamento de dados

Sada de Dados

Sadas
printf("Bom

dia"); puts("Bom dia"); /* para imprimir um texto */ putch(a); /* para imprimir um char */
printf ("Meu nome : %s\ne tenho %d anos.",
nome, idade)

Entradas
gets(s);
/* leitura de string */ (O gcc no recomenda por que perigosa)

char c; c = getch(); c = getchar(); scanf ("%d",&nome);


/* com echo */

/* para a leitura de nome */

Comandos de E/S
main () { short int idade; printf (Digite a sua idade:\n); scanf (%d, &idade); printf(Voce tem %d anos, idade); }

Comandos de E/S
main () { short int idade; printf (Digite a sua idade:\n); fflush(stdin); // fflush - usar antes do scanf // usa-se // para comentrios em c++) scanf (%d, &idade); printf(Voce tem %d anos, idade); }

Constantes utilizados no printf


\n \t \v \b \r \a \\ \% \{} \? nova linha tabulao (horizontal) tabulao vertical um espao para trs um return um bip backslash o caracter % um apostrofo um ponto de interrogao

Converso de Tipos
%d %o %x %e %u %c %s %f notao notao notao notao notao notao notao notao de decimal (inteiro) octal hexadecimal cientfica sem sinal de caracter de string de float

Formatao
Cada

um desses caracteres de converso utilizado depois do % para indicar o formato da sada (da converso) entre os dois podemos entrar outros argumentos

Mas,

Formatao
+ n justificar a esquerda o sinal sempre aparente o comprimento mnimo da sada (seno brancos)

0n o comprimento mnimo da sada (seno 0s esquerda) n.m para separar as partes antes e depois da virgula total de n dgitos l para indicar um long

Laboratrio 1 (C)

Primeiro contato com a linguagem Programa clculo de mdia de notas


writeln('Mdia: ', media:6:2) Lista de Exerccios1 em Linguagem C (para casa) Exemplo nos prximos slides

Exemplo
#include <stdio.h> int main() { int a; long int b; short int c; unsigned int d; char e; float f; double g; a = 1023; b = 2222; c = 123; d = 1234; e = X; f = 3.14159; g = 3.1415926535898;

Exemplo
{ printf("a = %d\n", a); /* a = 1023 printf("a = %o\n", a); /* a = 1777 printf("a = %x\n", a); /* a = 3ff printf("b = %ld\n",b); /* b = 2222 printf("c = %d\n", c); /* c = 123 printf("d = %u\n", d); /* d = 1234 printf("e = %c\n", e); /* e = X */ */ */ */ */ */ */

printf("f = %f\n", f); /* f = 3.141590 */ printf("g = %f\n", g); /* g = 3.141593 */ }

Exemplo
{ printf("\n"); printf("a = %d\n", a); printf("a printf("a c = 5; d = 8; printf("a printf("a = %7d\n", a); = %-7d\n", a); = %*d\n", c, a); = %*d\n", d, a);

Exemplo
{
printf("\n"); printf("f = %f\n", f); printf("f = %12f\n", f); printf("f = %12.3f\n", f); printf("f = %12.5f\n", f); printf("f = %-12.5f\n", f);

Exemplo
As sadas so:

f f f f f

= 3.141590 = 3.141590 = 3.142 = 3.14159 = 3.14159

Exemplo

Ler e escrever na tela o seu nome e a sua idade:

main( ) { short int idade; char nome[30]; printf ("Digite a sua idade:\n"); scanf ("%d", &idade); printf ("Digite o seu nome:\n"); scanf("%s", nome); printf("A idade de %s eh %d",nome, idade); }

O const

Para declarar variveis constantes podemos usar a palavra chave const const int N 20
Isto proibe que N seja modificado no programa

Diferena para o #define: - Usando o const teremos uma reserva de um


espao na memria. Ele se aplica sobre qualquer tipo de var - O #define serve somente para o preprocessador que faz as substituies necessrias antes da compilao

Estruturas de Controle

Blocos de instrues
{ declaraes; comando_1; } comando_n; Em um bloco pode-se declarar variveis, que ficam visveis somente nesse bloco

if...else (1)
if (condio) comando_1; [else comando_2;]
Exemplos:

if (a>=b) max=a; else max=b;

if (a!=0) x=-b/a;

if...else (1)
#include <stdio.h> main () { float rend,imp; printf("\ndigite o rendimento: "); scanf("%f",&rend); if (rend <= 17215.08) imp = 0; else if (rend <= 34400.4) imp = rend * 0.15; else imp = rend * 0.275; printf("\nO imposto a pagar %7.2f\n",imp); }

if...else (2)
Qualquer

comando simples pode ser substitudo por um comando composto: if (d>0) { x1=(-b-sqrt(d))/2*a; x2=(-b+sqrt(d))/2*a; }

if...else (3)
Observao: o else refere-se ao ltimo if if (condio_1) instruo_1; else if (condio_2) instruo_2; else if (condio_3) instruo_3; else instruo_4;

if...else (4)
int a=3, b=2, c=1, d=0; if (a>b) if (c<d) b=2*a; else a=2*b;

observe como seria utilizando-se as chaves: if (a>b) { if (c<d) b=2*a; } else a=2*b;

if...else (5)
Observao: o else refere ao ltimo if seno tem que usar chaves (bloco) if (condio_1) { comando_1; if (condio_2) comando_2; } else if (condio_3) comando_3;

Observao

A condio no obrigatoriamente uma comparao. Pode ser qualquer expresso retornando um valor que pode ser comparado a zero

int b=0; if (b) /* equiv. a: if(b!=0)*/ { comandos; }

s switch
escolha mltipla
switch (expresso) { case constante_1: comandos; break; case constante_2: comandos; break; ... default: comandos }

switch - conj. de valores

Quando os mesmos comandos devem ser executados

switch (expresso) { case val_1: case val_n: comandos; break; case val_3: comandos; break; default: comandos; }

Instrues de Repetio

while
while (condio) comandos;
fim do while

condio!=0 ? no
sim

comandos

do...while (1)
do comandos; while (condio);

equivalente ao repeat do Pascal comandos do lao de repetio

Os

so executados pelo menos uma vez

do...while
do c=getch(); while (c==s)

(2)

comando

fim do do

sim

condio!=0 ?

no

for
comandos;

(1)

for (expresso1; condio; expresso2)

expresso1 avaliada na primeira vez depois a condio

se condio OK, os comandos so executados

depois a expresso2, antes de voltar a avaliar novamente a condio


for (i=1; i<=10; i++) { printf(Brasil); }

Exemplo:

for
expresso1

(2)
inicializao
fim do for

condio!=0 ?
sim

no

comandos expresso2

for

(3)

As expresses podem ser vrios comandos separados por virgula


Exemplo:

for (i=1; i<=10; printf(Brasil) , i++);

break
O break permite parar um lao de repetio (for, do, while) Se temos vrios nveis, o controle volta penltima estrutura de repetio
for(;;) { scanf(%c,&c); if (c == A) break;
/*interrompe o que deveria ser um lao eterno*/

}
printf(Fim do Loop!);

continue

Utilizado dentro de uma instruo for, while ou do O continue permite parar a iterao atual e passar iterao seguinte Exemplo: for (i=1;i<20;i++) { if (vet[i]<0) continue; comandos; }

Laboratrio 2 (C)

Exerccio

Faa um programa para ler o rendimento anual de um contribuinte. O programa dever ento informar ao usurio qual o valor do imposto de renda a pagar de acordo com a tabela abaixo. Faa para 3 funcionrios:

Laboratrio 2 (C)

Exerccio

Com base no exerccio anterior, imprima uma relao de renda (16000, 17000 ... 50000) com seu respectivo imposto e percentual efetivamente pago 16000 9999 8% 17000 8888 - 8,1%

Laboratrio 3 (C)
while <condio> do begin
<comandos>;

end;

Exerccios utilizando while, repeat e para Fazer todos os exerccios da Segunda Lista (em C)

Modularizao de Algoritmos
Unidade VII

Mdulos

Decomposio de um problema em subproblemas


Simplifica o problema Melhora o entendimento Facilita a manuteno

Mdulos (sub-rotinas) ou Funes

Organizao de um programa
Bibliotecas Declaraes globais
main () {

Corpo Principal
}

Organizao de um programa
Bibliotecas Declaraes globais

Mdulo 1
...

Mdulo n
Corpo Principal do Programa

Definio de uma funo

Alm das funes predefinidas nos arquivos header da biblioteca (no diretrio lib, usando o #include) Exemplos de funes predefinidas da biblioteca: stdio.h, math.h, stdlib.h O usurio pode definir outras funes

funes: (stdio.h)
Principalmente:
puts gets printf scanf

funes: (math.h)
abs fabs exp ceil floor pow pow10 hypot sqrt mdulo de inteiro mdulo de real exponencial arredondar ao max arredondar ao min xy 10x hipotenusa raiz quadrada double double int double double double double abs(int) fabs(double) exp(double) ceil(double) floor(double)

pow(double x,double y) pow10(double) double sqrt(double)

double hypot(double, double)

funes: (conio.h) - Win


clrscr apaga a tela void clrscr () void void void int
int

clreol apaga o resto da linha clreol () delline insline gotoxy kbhit putch getch herex herey apaga a linha atual insere uma linha
posiciona o cursor

delline () insline () kbhit ()

void gotoxy (int x, int y) putch (int c)

testa se tecla
imprima um char c

leia char sem echo int posio x do cursor posio y do cursor int int

putch () wherex () wherey ()

funes: (stdlib.h)
min max
type) retorna o min retorna o max type min(type, type) type max(type,

rand exit
random

nmero aleatrio

int rand() void exit(int) int random(int n) int

sada

num. aleat. de 0 a n-1

randomize inicializa o ger. aleat.


randomize()

precisa de <time.h>

funes graphics.h
rectangle

desenha um retngulo

void rectangle (int e, int c, int d, int b)

As

funes de string.h sero descritas posteriormente

Definio de uma funo


tipo nome ([lista-identificadores]) { [declaraes;] comandos; }

Semntica
tipo:
o tipo do valor retornado pela funo

nome: nome da funo (identificador) lista dos identificadores: os parmetros


formais funo

declaraes: declarao das variveis locais comandos: so executados quando a funo


chamada

Exemplo
#include <stdio.h> int int { fatorial (int); //interface fatorial (int n) int i, resultado = 1; for ( i = 1; i <= n; i ++) resultado *= i; return resultado; } main ( ) { printf ( o fatorial de 4 = %d, fatorial(4) ); printf ( o fatorial de 3 = %d, fatorial(3) ); }

Exemplo
float media (float a, float b) { float resultado; /* var. locais */ resultado=(a+b)/2; return (resultado);
/* retornar o resultado ao chamador */

Os parmetros formais - opcionais


double pi () /* no temos param. formais
*/

{ }

/* no temos var. locais */ return (3.14159);

Exemplo
int { if (a<b) return (a); else return (b); } min (int a, int b)

Chamada de uma funo


{ int m_1, m_2; float p, d=4.5; m_1 = max (4,3); m_2 = max(6*2-3,10); p = d * pi(); }

Exerccio

Chamando vrias funes


S(x, n) = x/1! + x2/2! + x3/3! + ... + xn/ n!

Soluo (1)
#include <stdio.h> float serie (float , int ); float potencia (float , int) int fat (int); main( ) { float x; int termos; printf(entre com o numero de termos: ); scanf(%d, &termos); printf(entre com o valor de X: ); scanf(%f, &x); printf(O valor de srie = %f , serie(x, termos)); }

Soluo (2)
float serie (float x, int n) { int i; float for ( i = 1; resultado } resultado = 0; i <= n; i++) += potncia( x, i ) / fat( i );

return resultado;

Soluo (3)
float potencia (float base, int expoente)

{ int i; float resultado = 1; if (expoente == 0) return 1; for (i = 1; i <= expoente; i++) resultado *= base; return resultado; }

Soluo (4)
int { int i, resultado = 1; for (i=1; i<=n; i++) resultado *= i; return resultado; } fat (int n)

Procedimentos

Funes que no retornam valores: void linha ()


{ printf("-------------------------\n"); }

Observao: no temos aqui o comando return (o tipo especial void no existia nas primeiras verses da linguagem)

Omisso do tipo da funo!


por

defaut o tipo int.

somar (int a, int b) { return (a+b); }

Passagem dos Parmetros


int somar (int x, int y) { return (x+y); } void main () { int a=8, b=5, s; s = somar(a,b); /*os parmetros
efetivos*/

Passagem por Valor

Na chamada, parmetros

tem-se passagem de

Mas, as modificaes dos parmetros formais no afetam os parmetros efetivos

Passagem por Referncia


(ou por endereo)
Usar

o operador de endereamento

&

void somar (int x, int y, int * som) { *som = x+y; } void main () { int a=5, b=6, s; somar(a,b, &s); printf("%d + %d = %d",a,b,s); }

Declarao de Funes
Uma

funo f conhecida implicitamente por uma outra funo g se elas so definidas no mesmo arquivo, e se f definida antes de g desse caso e para controle preciso declarar as funes antes de us-las

Fora

Exemplo
void main (void) { int maior (int a, int b); maior (2,8); } int maior (int x, int y) { return (x>y?x:y); }

Funes Iterativas
exemplo do fatorial long int fat (long int n) { long int i,res=1; for (i=1;i<=n;i++) res=res*i; return (res); }

Funes Recursivas
exemplo do fatorial long int fat (long int n) { if (n == 1) return 1; else return (n*fat(n-1)); }

Exerccios
Escreva as funes real_dlar e dlar_real de converses Real-Dlar e vice-versa. Escreva as verses recursiva e iterativa da funo soma que retorna a soma dos n primeiros termos:

S(n) = 1 + 1/2 + 1/3 + ... + 1/(n-1) + 1/n


Escreva

a funo s(n) tal que:

S(n) = 1/n - 2/(n-1) +3/(n-2) + ... - (n-1)/2 + n/1

Tabelas Vetores / Matrizes Estrutura de dados homogneos

Matrizes

Vrias informaes dentro de uma mesma varivel Variveis Indexadas, Variveis Compostas, Vetores, Matrizes, Tabelas ou Arrays

Tabelas

O objetivo da estrutura de dados homogneos (tabela) agrupar um conjunto de informaes de mesmo tipo em uma mesma varivel
tabela pode ser multidimensional (matriz) ou unidimensional (vetor)

Uma

Exerccios

Faa um programa para realizar a soma de duas matrizes de dimenso 100x100. A partir de uma tabela(dada) que registra a temperatura mdia de todos os dias de um ano, elabore um algoritmo que calcule e escreva: a menor temperatura ocorrida no ano; a maior temperatura ocorrida no ano; a temperatura mdia anual; o nmero de dias no ano em que a temperatura foi inferior mdia anual

Declarao
float vet[10];

long int v1[8], v2[15];


/* v1 um vetor de 8 long int e v2 um vetor de 15 long int */
Os

elementos so indexados de 0

a N-1

Dimenso
Na

prtica, recomendado definir

sempre uma constante que indica o nmero de elementos:

#define N 60 short int v[N];


/* declaro um vetor de 60 inteiros indexado de 0 a 59 */

Acesso aos elementos


Sintaxe: nome-varivel [expresso]
expresso deve ser um inteiro (o indexador)

Exemplos: vet[0]=6; vet[4+1]=-2; x=3*vet[2*a-b];

Inicializao
#define N 4 int v[N]={1,2,3,4};

Inicializao de somente uma parte do vetor:

#define N 10 int v[N]={1,2}; //o resto ser zerado

Inicializao pelo mesmo valor:

for (i=0;i<=9;i++) v[i]=2;

Inicializao pelo usurio:

for (i=0;i<=9;i++) scanf("%d",&v[i]);

Operadores abrangentes
lembramos que:
x++ incrementa x mas retorna o valor inicial ++x incrementa x e retorna o valor incrementado i=0; v[i++]=0; v[i++]=0; i=1; v[++i]=0; v[++i]=0;

/* v[0]=0 e i=i+1 */ /* v[1]=0 e i=i+1 */ /* i=i+1 e v[2]=0 */ /* i=i+1 e v[3]=0 */

idem para o operador --

Uso da instruo nula


Inicializao

de um vetor

for (i=0;i<10;v[i++]=1); Isto equivalente a: for (i=0;i<10;i++) v[i]=1;


Pesquisar

em um vetor:

for (i=0; i<N && t[i]!=10; i++);


/* usando a instruo nula */

Isso equivalente a: for (i=0; i<N; i++) if t[i]==10 break;

Tabelas MultiDimensionais
Declarao:

Matrizes
/* matriz bidimensional de 3 linhas 4 colunas */

int mat [3][4];

Inicialiazao:
int mat [3][4] = { {5,6,8,1}, {4,3,0,9}, {12,7,4,8}, }

Exemplo
#define L 4; #define C 3; int mat[L][C];

/* leitura: */
for (i=0;i<=L;i++) for (j=0;j<=C;j++) { printf("digite o elemento [%d,%d]: ",i,j); scanf("%d",&mat[i][j]); }

Observao 1
for (i=0,j=0;i<L && j<C;i++,j++) {
printf("digite o elemento [%d,%d]: ",i,j); scanf("%d",&mat[i][j]);

} no a mesma coisa que:


for (i=0;i<=L;i++) for (j=0;i<=C;j++) { printf("digite o elemento [%d,%d]: ",i,j); scanf("%d",&mat[i][j]); }

Observao 2
int sum (int n) { int res=0; for (;n>0;n--) // n inicializada na chamada res=res+n; return (res); }
chamada: sum(5)

O que faz esse cdigo?

Exerccios

A.1 Escreva o procedimento ini_num_dias que inicializa um vetor num_dias[12] que indica para cada ms do ano seu nmero de dias: (num_dias[i] indica o nmero de dias do ms i do ano), sabendo que: Se i=2 ento num_dias=28; Se (i par e i<=7) ou (se i impar e i>7) ento num_dias=30 Seno num_dias=31. A.2 Escreva o procedimento imp_num_dias que imprima os nmeros de dias de todos os meses do ano.

B. Escreva a funo ordenar que ordena um vetor. C. Escreva a funo palindromo que determina se um vetor de caracteres um palindromo.

Tipos Enumerados

enum

A enumerao permite agrupar um conjunto de constantes (compartilhando a mesma semntica)


enum dias {Domingo, Segunda, Tera, Quarta, Quinta, Sexta, Sbado};

exemplos:

declarao:

dias d1,d2=Quinta;

enum define um novo tipo cujo os elementos so numerados automaticamente pelo compilador: 0 1 2 ...

Exemplo
#include <stdio.h> enum dias {Segunda,Tera,Quarta,Quinta, Sexta,Sbado,Domingo} d; // d uma varivel declarada de tipo dias void main (void) { // dias d; uma outra maneira de declarar for (d = Segunda ; d < Domingo ; d++) printf(O cdigo do dia : %d\n", d); }

Vai imprimir os valores dos dias:

0, 1 at 6

enum

Essa numerao permite comparar os elementos do tipo: if (d1<=d2) ... Portanto podemos mudar essa numerao:
enum boolean {true=1,false=0};

Quando um item no numerado ele pega o valor de seu precedente:


enum temperatura {baixa=2,media=4,alta};

Ponteiros

Variveis Dinmicas
Todas

as variveis vistas at agora

so estticas (reserva imediata na memria)


Variveis Um

dinmicas (ponteiro)

ponteiro uma referncia sobre

um objeto na memria ( um endereo)

Variveis Dinmicas
Exemplo

de declarao de ponteiros: float * pf


/* declara que pf um ponteiro sobre um real */

pf 4.6

Os Operadores & e * (1)


O

operador de endereamento &

se aplica sobre uma varivel e permite retornar seu endereo de memria O operador de indireo * se aplica sobre um ponteiro e permite retornar (manipular) o objeto apontado

Os Operadores & e * (2)


*P

(Ponteiro)

(Varivel)

&v

Exemplo
int i,j; int *pi;
/* pi um ponteiro sobre um inteiro */

i=5; pi=&i; *pi=6; j=*pi-2; pi=&j;

pi &i &j 56 i 4 j

Exerccio
1. Declare um inteiro i e um ponteiro p sobre um inteiro 2. Inicialize o inteiro com um valor qualquer 3. Aponte o ponteiro sobre a varivel i 4. Imprima o valor de i 5. Modifique o valor de i usando o ponteiro 6. Imprima o novo valor de i

int i; int * p; i=8; p=&i; printf("i= %d\n",i); *p=5; printf("novo i= %d\n",i);

/* 1 */ /* 1 */ /* 2 */ /* 3 */ /* 4 */ /* 5 */ /* 6 */

Passagem de Parmetros
Passagem

de parmetros (dois tipos):

por valor por referncia (passar o endereo da varivel)

Estratgias

adotadas pelas linguagens:

Tudo feito por referncia (FORTRAN, PL/1) Temos a escolha entre a passagem por valor ou por referncia (PASCAL) Toda passagem feita por valor (C)

Estratgia de C
Em

C, toda passagem de parmetros portanto feita por valor ento fazer as passagens por referncia? A soluo declarar os parmetros formais do tipo ponteiro feito pelo uso do operador & (usado na chamada a funo)

Como

Isso

Exemplo
void
{ }

adicionar (int a, int b, int * res)


a declarao de res como um ponteiro sobre um inteiro: um endereo

*res=a+b;

void main (void) { int i,j,k; adicionar (i,j,&k); }

observe que na chamada tem que passar o endereo da varivel onde deseja-se recuperar o resultado

Um outro exemplo
A funo troca
void troca (int * x, int * y) { int temp; temp=*x; *x=*y; *y=temp; }

chamada da funo troca(&a,&b);


/* passagem por referncia */

Strings

String ~ vetor de char


Uma

string um conjunto de caracteres uma estrutura equivalente estrutura de vetor nica diferena que string termina sempre pelo caractere '\0' terminador '\0' serve para facilitar o tratamento das strings, ou melhor, para detectar o fim da string

Declarao
O

tipo string no existe em C, existem duas maneiras para

Portanto

simular este tipo de varivel:


Como um vetor de char; ou Como um ponteiro sobre uma zona de caracteres (char)

Como vetor de caracteres


char

nome[30];

As variveis do tipo string declaradas como vetor de char tm um tamanho limite fixo (o tamanho do vetor) Se o tamanho da string menor do que o tamanho do vetor, o compilador C completa com o caractere especial '\0' para indicar o fim da string

Inicializao (vetor de caracteres)

A inicializao de um vetor de char pode ser feita, no momento da declarao, de duas maneiras:
1. Atribuindo um conjunto de caracteres:
char ch [20]={e,x,e,m,p,l,o}; (como normalmente feito para inicializar qualquer tipo de vetor)

2. Atribuindo uma string (mais prtica):

char ch[20]= "exemplo"; O tamanho pode ou no estar especificado: char nome[]="este tem 23 caracteres"

Acesso aos elementos (vetor)

feito como em qualquer tipo de vetor

#define N 3 char ch[N]={'O','i'}; char c; ch[0]= 'H'; /* refere-se ao 1o caractere */ c = ch[1]; /* refere-se ao 2o caractere */ /* ch[N-1] refere ao Nsimo caractere */ printf("%s - %c", ch, c);

Oi\0

Hi\0

Como Ponteiro sobre Caracteres

A manipulao de strings como vetores de caracteres pode ser pouco prtica. Portanto, podemos criar strings de tamanho dinmico, usando um ponteiro sobre um char

char

* ch = "exemplo";

Contrariamente outra maneira, a reserva do espao de memria no feita no momento da declarao, mas dinamicamente, no momento da atribuio

Inicializao e atribuio (ponteiro)


A inicializao e atribuio so feitas diretamente:
char * ch = "exemplo"; // C completa com '\0' ch = "uma mudana"; ch = "outra mudana";
// Isso no uma copia mas uma atribuio de ponteiros

ch uma mudana\0 outra mudana\0

Manipulao de Strings

As funes de manipulao de strings so definidas no arquivo da biblioteca

string.h
Temos,

principalmente, as seguintes funes:

strcpy, strlen strcat, strcmp, strchr,

strncpy strncat strncmp strrchr

Strcpy/strncpy

A funo especial strcpy permite atribuir um valor texto a uma varivel de tipo texto O strcpy apresenta dois formatos de uso:
strcpy(string1,string2); strncpy(string1,string2,n);

Exemplo:

char *ch1="boa", *ch2="noite"; strcpy(ch1,"isto um exemplo"); strncpy(ch2,ch1,4); /* ch2 vai pegar isto */

strlen
strlen permite retornar o tamanho de um string: nmero de chars que compem o string (o \0 no faz parte) exemplo:
int a; char * nome; strcpy(nome,brasil"); a=strlen(nome); /* a=6 */

strcat/strncat
strcat se aplica sobre dois strings e retorna um ponteiro sobre a concatenao dos dois. exemplo:
char *ch1="boa", *ch2="noite", *ch3, *ch4;

ch3=strcat(ch1,ch2); ch4=strncat(ch1,ch2,3); printf("%s %s",ch3,ch4);


/* vai imprimir boanoite boanoi*/

strcmp/strncmp
Lembramos que as letras so ordenadas dando seu cdigo: a< ...
z< A...<Z

strcmp compara dois strings s1 e s2 e retorna um valor: negativo se s1 <


s2

exemplo:
char

0 positivo

se s1 == s2 se s1 > s2

*ch1="boa tarde", *ch2="boa noite"; int a,b; a=strcmp(ch1,ch2);

strchr/strrchr
strchr procura por um caractere em um string e retorna um ponteiro sobre sua ltima ocorrncia, seno retorna null. exemplo:
char ch[]="informtica"; char *pc, c='f';

pc=strchr(ch,c);
if (pc) /* i.e. if pc!=null */ printf("%d",*pc); else printf("Caractere inexistente"); O strrchr faz a busca no senso inverso.

touppar/tolower
toupper converte um caractere minsculo em maisculo. tolower faz o contrrio. # include <ctype.h>
char c='a';

c=toupper(c); c=toupper(c); c=tolower(c);

/* c= /*

/* c j esta =

'A' */ c volta a ser 'a' */

'A'

*/

Exerccios 1
A. Defina a funo ocorrncia que retorna o
nmero de ocorrncias de um caractere em um string.

B.1 Defina a funo tamanho1 que pega como

parmetro um vetor de caracteres e retorna seu comprimento.

B.2 Defina tamanho2 que implementa a mesma


funo mas que pega como parmetro um ponteiro sobre uma zona de caracteres.

B.3 Defina o main que chama essas duas funes.

int tamanho1 (char s[]) /* com um vetor */ { int i=0; while (s[i]) /* equiv. while (s[i]!= '\0' ) */ i++; return (i); } int tamanho2 (char * s) /*com os ponteiros*/ { int i=0; while (*s) /* equiv. while (*s!= '\0 ') */ {i++;s++;} return (i); }

void

main (void)

char ch[]="So Luis"; int a,b; a=tamanho1(ch); b=tamanho2(ch); /* a= 8*/ /* b= 8*/

printf("O tamanho de %s : %d\n",ch,a); printf("O tamanho de %s : %d\n",ch,b);

Exerccios 2: Criptografia Simples


1. Defina as funes Criptar e Decriptar que codificam e decodificam um caractere aplicando o seguinte algoritmo de criptografia: - Um caractere substitudo por um outro aplicando um shift de 3 (por exemplo a seria substitudo por D). - Apenas os caracteres do alfabeto so codificados. - Os masculos passam a ser minsculos e vice-versa. 2. Defina a funo main que leia e codifica ou decodifica uma mensagem usando as funes definidas acima.

You might also like