Você está na página 1de 341

Linguagem C

Ricardo Terra
rterrabh@gmail.com

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

1 / 341

Contedo

Introduo Tpicos Importantes Sintaxe Bsica Ponteiros Tpicos Relevantes Extras

2 3 4 5

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

2 / 341

Introduo
Tpicos Importantes

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

3 / 341

Introduo Tpicos Importantes Origem do C


Dennis Ritchie BCPL B C em 1970

Devido a popularidade de microcomputadores, um grande nmero de implementaes surgiram


compatveis, porm com algumas discrepncias

Para evitar discrepncias, o ANSI (American National Standards Institute), em 1983, criou o padro C ANSI
Modicado em 1989 (C89) Modicado em 1999 (C99) Modicado em 2009? No
Ricardo Terra (rterrabh@gmail.com) Linguagem C 1 de agosto de 2012 4 / 341

Introduo Tpicos Importantes Linguagem Estruturada


exceto por uma nica caracterstica

Mdio Nvel
nvel mais alto: Pascal, COBOL, Java... mdio nvel: C, C++... nvel mais baixo: Assembly...

Para programadores
foi criada, inuenciada e testada por programadores no se admire que C seja a linguagem mais popular entre excelentes programadores
Ricardo Terra (rterrabh@gmail.com) Linguagem C 1 de agosto de 2012 5 / 341

Introduo Tpicos Importantes

Compiladores X Interpretadores Interpretador l o cdigo-fonte linha a linha, executando a instruo especca daquela linha Compilador l o programa inteiro, converte-o em um cdigo-objeto (ou cdigo de mquina) de modo que o computador consiga execut-lo diretamente Qual mais rpido?

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

6 / 341

Introduo Tpicos Importantes Forma de um programa C Declaraes globais Funes denidas pelo programador Funo main

declaraes globais tipo deretorno funcao ( l i s t a deparmetros ) { ... } ... i n t main ( i n t argc , char argv [ ] ) { ... }

11

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

7 / 341

Introduo Tpicos Importantes

Exemplo de um programa C
1

#include < s t d i o . h> #include <math . h> const double P I = 3.141596;

double calcularArea ( double r a i o ) { r e t u r n P I pow( raio , 2 ) ; } i n t main ( i n t argc , char argv [ ] ) { double raio , area ; p r i n t f ( " Digite o raio : " ) ; scanf ( "% l f " , &r a i o ) ; area = calcularArea ( r a i o ) ; p r i n t f ( " Area = % l f " , area ) ; return 0; }

11

13

15

17

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

8 / 341

Introduo Tpicos Importantes

Um pouco sobre a funo main A funo main o ponto de entrada de uma aplicao C. Usualmente, um aplicao C se inicia no mtodo main e, a partir dele, invoca diversas outras funes. Por m, essa funo retorna um valor inteiro Esse valor retornado no impresso, serve apenas para indicar ao sistema operacional ou para um aplicativo que invocou o seu aplicativo qual foi o cdigo de retorno Por padro, o retorno 0 indica que o aplicativo encerrou conforme esperado. Os outros valores podem ser denidos conforme a necessidade de cada aplicao
Normalmente, valores negativos se referem a erros

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

9 / 341

Introduo Tpicos Importantes

Valores de retorno da funo main Nesta apostila, adota-se os seguintes valores de retorno:
0 encerramento conforme esperado -1 memria insuciente -2 argumentos de linha de comando incorretos -3 problema ao abrir arquivo

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

10 / 341

Introduo Tpicos Importantes

Palavras reservadas
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

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

11 / 341

Introduo Tpicos Importantes

Processo de compilao Criar o programa Compilar o programa Linkeditar o programa com as funes necessrias da biblioteca Por utilizarmos uma IDE de desenvolvimento esse processo ca bem mais transparente

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

12 / 341

Introduo Tpicos Importantes Mapa de memria em C Quatro regies logicamente distintas:


cdigo do programa variveis globais pilha (stack) heap
regio de memria livre a ser requisitada (alocao dinmica)

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

13 / 341

Introduo Tpicos Importantes C versus C++ C++ uma verso estendida e melhorada da linguagem C que projetada para suportar programao orientada a objetos C++ contm e suporta toda a linguagem C e mais um conjunto de extenses orientadas a objetos Portanto:
Voc no pode programar em C++ se no souber C Tudo que aprender da linguagem C, poder ser utilizado em C++

Compiladores compatveis?
Ricardo Terra (rterrabh@gmail.com) Linguagem C 1 de agosto de 2012 14 / 341

Introduo Tpicos Importantes IDEs Eclipse (ver material disponibilizado de como congurar )

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

15 / 341

Introduo Tpicos Importantes IDEs Dev-Cpp 5 (http://www.bloodshed.net/devcpp.html )

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

16 / 341

Contedo

1 2

Introduo Sintaxe Bsica Expresses Comandos condicionais Comandos de repetio Arranjos Variveis Funes Estruturas Ponteiros Tpicos Relevantes Extras

3 4 5

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

17 / 341

Sintaxe Bsica
Expresses

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

18 / 341

Sintaxe Bsica Expresses Denies Expresso o elemento mais fundamental da linguagem C So mais gerais e mais poderosas que na maioria das outras linguagens de programao As expresses so formadas por:
dados (representados por variveis ou constantes) operadores

Exemplos:
2 + 4 * (7 - 3) (-b + delta) / (2 * a) calcularArea(raio=3.98) printf((a%2==0 || ++b<=pow(x,y)) ?
Ricardo Terra (rterrabh@gmail.com) Linguagem C

"S":

"NO")
19 / 341

1 de agosto de 2012

Sintaxe Bsica Expresses Tipos bsicos:


Caractere (char) Inteiro (int) Ponto utuante (float) Ponto utuante de preciso dupla (double) Sem valor (void)

Modicadores:
signed unsigned long short
Ricardo Terra (rterrabh@gmail.com) Linguagem C 1 de agosto de 2012 20 / 341

Sintaxe Bsica Expresses Tipo char Representa um caractere ASCII 1 byte Na verdade, um inteiro sem sinal (0 a 255) Exemplo
1

#include < s t d i o . h> i n t main ( i n t argc , char argv [ ] ) { char ch ; scanf ( "%c " , &ch ) ; p r i n t f ( "%c " , ch ) ; / Imprime o caractere l i d o / ch = A ; p r i n t f ( "%d " , ch ) ; / Imprime o codigo ASCII numerico / ch = 6 5 ; p r i n t f ( "%c " , ch ) ; / Imprime o caractere / return 0;

11

13

15

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

21 / 341

Sintaxe Bsica Expresses Tipo int Representa um inteiro 4 bytes (normalmente) Exemplo
1

#include < s t d i o . h> i n t main ( i n t argc , char argv [ ] ) { int i ; scanf ( "%d " , & i ) ; p r i n t f ( "%d " , i ) ; / Imprime o numero l i d o / i = 0 ; p r i n t f ( "%d " , i ) ; / Imprime o codigo ASCII numerico / i = 48; p r i n t f ( "%c " , i ) ; / Imprime o caractere ASCII correspondente / return 0;

11

13

15

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

22 / 341

Sintaxe Bsica Expresses Tipo float Representa um nmero decimal 4 bytes (normalmente) Exemplo
1

#include < s t d i o . h> i n t main ( i n t argc , char argv [ ] ) { float f ; scanf ( "%f " , & f ) ; p r i n t f ( "%f " , f ) ; / Imprime o numero l i d o / f = 1.234; p r i n t f ( "%f " , f ) ; f = 1.3213e2 ; p r i n t f ( " %.2 f " , f ) ; / Imprime com apenas 2 casas decimais / return 0; }

11

13

15

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

23 / 341

Sintaxe Bsica Expresses Tipo double Representa um nmero decimal com maior preciso que float 8 bytes (normalmente) Exemplo
#include < s t d i o . h>
2

i n t main ( i n t argc , char argv [ ] ) { double d ; scanf ( "% l f " , &d ) ; p r i n t f ( "% l f " , d ) ; / Imprime o numero l i d o / d = 1.234; p r i n t f ( "% l f " , d ) ; d = 1.3213e2 ; p r i n t f ( " %.2 l f " , d ) ; / Imprime com apenas 2 casas decimais / return 0;

10

12

14

16

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

24 / 341

Sintaxe Bsica Expresses

C no tem um tipo lgico Utiliza-se qualquer valor inteiro


0 false diferente de 0 true

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

25 / 341

Sintaxe Bsica Expresses

Identicadores
nomes de variveis, funes, rtulos e vrios outros objetos denidos pelo usurio

So case-sensitive
Na verdade, C case-sensitive

Identicador vlido:
A primeira letra deve ser uma letra ou um underline ( _ ) As letras subsequentes devem ser letras, nmeros ou underline Exemplos: idade, nome, sexo, telefone1, a1, A1, _x, _y, ...

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

26 / 341

Sintaxe Bsica Expresses

Uma varivel uma posio nomeada de memria, que utilizada para guardar um valor que pode ser modicado pelo programa Todas as variveis devem ser declaradas e inicializadas antes de serem utilizadas (Padro C89, o qual iremos seguir) Declaradas:
dentro de funes (variveis locais ) como parmetros de funes (parmetros formais ) fora de todas as funes (variveis globais )

Podem j ser inicializadas

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

27 / 341

Sintaxe Bsica Expresses Exemplo de variveis


#include < s t d i o . h>
2

double P I = 3.141596;
4

i n t soma( i n t x , i n t y ) { return x + y ; } i n t main ( i n t argc , char argv [ ] ) { i n t c = soma( 2 , 3 ) ; p r i n t f ( " c = %d " , c ) ; return 0; }

10

12

Pergunta-se Quais so as variveis locais? E as globais? E os parmetros formais?


Ricardo Terra (rterrabh@gmail.com) Linguagem C 1 de agosto de 2012 28 / 341

Sintaxe Bsica Expresses

Modicadores de tipo de acesso (quanticadores): const


O valor da varivel no pode ser modicada por seu programa Exemplo: const double PI = 3.141596;

volative
O valor da varivel pode ser alterada de uma maneira no explicitamente especicada pelo programa Exemplo: volative double taxa = 0.65;

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

29 / 341

Sintaxe Bsica Expresses

Especicadores de tipo de classe de armazenamento: extern


Diz ao compilador que os tipos e nomes de varivel que o seguem foram declarados em outro arquivo fonte Exemplo: J existe um arquivo matematica.c que possui declarado como varivel global o valor de PI. Imagine que esteja desenvolvendo um outro arquivo fonte e queira utilizar o valor do PI j declarado. Voc utiliza normalmente, mas deve deixar claro que o valor de PI est declarado em um outro arquivo. Assim declara-se PI como a seguir: extern PI;

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

30 / 341

Sintaxe Bsica Expresses

Especicadores de tipo de classe de armazenamento: static


Variveis permanentes, i.e., mantm seus valores entre as chamadas S inicializado na primeira vez que a funo chamada Funciona como uma varivel global (mantendo seu valor), contudo no possui visibilidade global, somente para a prpria funo (como em variveis locais)

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

31 / 341

Sintaxe Bsica Expresses Exemplo static


1

#include < s t d i o . h> i n t contador ( ) { s t a t i c i n t count = 0 ; r e t u r n ++ count ; } i n t main ( i n t argc , char argv [ ] ) { p r i n t f ( " count = %d\n " , contador ( ) ) ; p r i n t f ( " count = %d\n " , contador ( ) ) ; p r i n t f ( " count = %d\n " , contador ( ) ) ; return 0; }

11

13

Pergunta-se O que ser impresso? E se a varivel count no fosse static?


Ricardo Terra (rterrabh@gmail.com) Linguagem C 1 de agosto de 2012 32 / 341

Sintaxe Bsica Expresses

register
Antigamente: Varivel armazenada em um registrador Atualmente: Varivel armazenada de tal modo que seja o mais rpido possvel Exemplo: register int count;

auto
Declarao de variveis locais, porm no utilizada Por padro, todas as variveis no globais so auto Exemplo: auto int idade; int idade;

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

33 / 341

Sintaxe Bsica Expresses

Em C, constantes referem-se a valores xos que o programa no pode alterar Constantes caracteres: A, B, C, ...
So envolvidas por aspas simples ()

Constantes inteiras: 1, 2, 3, 4, ... Constantes em ponto utuante: 3.14, 4.67, ...

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

34 / 341

Sintaxe Bsica Expresses

Constantes Hexadecimais e Octais


Hexadecimal: inicia com 0x
Exemplo: 0x18 equivale a 24

Octal: inicia com 0


Exemplo: 017 equivale a 15

Constantes string: uma string qualquer


Conjunto de caracteres envolvidos por aspas duplas ( )

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

35 / 341

Sintaxe Bsica Expresses Constantes caractere de barra invertida Para a maioria dos caracteres, as aspas simples funcionam bem, porm para enter, tab, esc seria bem complicado represent-los, uma vez que so teclas de ao. Por isto, C criou as constantes especiais de barra invertida Constantes especiais mais utilizadas
\n \r \t \ \" \0 \\ \a Nova Linha Retorno de Carro (CR) Tabulao horizontal Aspas Simples Aspas Duplas Nulo Barra Invertida Alerta
Linguagem C 1 de agosto de 2012 36 / 341

Ricardo Terra (rterrabh@gmail.com)

Sintaxe Bsica Expresses

Quatro classes de operadores: Aritmticos Relacionais Lgicos Bit a bit

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

37 / 341

Sintaxe Bsica Expresses

Operadores Artimticos + / % (corresponde ao mod do Pascal)

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

38 / 341

Sintaxe Bsica Expresses Prioridades e Associatividades normais Parnteses mudam as prioridades


2 + 2 * 4 != (2 + 2) * 4

Operador /
Operando inteiros:
Diviso Inteira: (7 / 2 = 3)

Pelo menos um ponto utuante:


Diviso Fracionria: 7.0 / 2.0 = 3.5 7.0 / 2 7 = 3.5 / 2.0 = 3.5

Operador %
Resto de diviso inteira Ex: 4 % 2 = 0 e 5 % 2 = 1
Ricardo Terra (rterrabh@gmail.com) Linguagem C 1 de agosto de 2012 39 / 341

Sintaxe Bsica Expresses

Operadores Aritmticos em Atribuies Compostas Em geral, os operadores aritmticos possuem um operador de atribuio correspondente:
Exemplo:
A = A + 2 A += 2

Outros: -= *= /= %=

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

40 / 341

Sintaxe Bsica Expresses

Exemplo de operadores de atribuio compostos


1

#include < s t d i o . h> i n t main ( i n t argc , char argv [ ] ) { i n t valor = 10; v a l o r += 1 0 ; p r i n t f ( "%d " , v a l o r ) ; / v a l o r : 20 / v a l o r = 1 0 ; p r i n t f ( "%d " , v a l o r ) ; / v a l o r : 10 / v a l o r = 5 ; p r i n t f ( "%d " , v a l o r ) ; / v a l o r : 50 / v a l o r /= 1 0 ; p r i n t f ( "%d " , v a l o r ) ; / v a l o r : 5 / v a l o r %= 3 ; p r i n t f ( "%d " , v a l o r ) ; / v a l o r : 2 / return 0; }

11

13

15

17

19

21

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

41 / 341

Sintaxe Bsica Expresses Operadores Aritmticos de incremento e decremento ++ (incrementa 1) -- (decrementa 1) Exemplos: A = A + 1 A += 1 A++ ++A A = A - 1 A -= 1 A-- --A Posicionamento (vale para ++ e para --) ++ aps a varivel:
ps-incremento (retorna e incrementa)

++ antes da varivel:
pr-incremento (incrementa e retorna)
Ricardo Terra (rterrabh@gmail.com) Linguagem C 1 de agosto de 2012 42 / 341

Sintaxe Bsica Expresses Exemplos


1

i n t i = 0; System . out . p r i n t f ( "%d " , i + + ) ; System . out . p r i n t f ( "%d " , i ) ; System . out . p r i n t f ( "%d " , i ) ; i n t i = 0; System . out . System . out . System . out . System . out .

p r i n t f ( "%d " p r i n t f ( "%d " p r i n t f ( "%d " p r i n t f ( "%d "

, , , ,

++ i ) ; i ); i ); i );

Pergunta-se Qual a sada de cada printf?


Ricardo Terra (rterrabh@gmail.com) Linguagem C 1 de agosto de 2012 43 / 341

Sintaxe Bsica Expresses

#include < s t d i o . h> i n t main ( i n t argc , char argv [ ] ) { i n t i = 0; p r i n t f ( "%d " , i + + ) ; p r i n t f ( "%d " , i ); p r i n t f ( "%d " , i ) ; p r i n t f ( "%d " , i ) ; i = 6; p r i n t f ( "% l f " , ++ i / 2 . 0 ) ; return 0; }

11

13

Pergunta-se Qual a sada de cada printf?


Ricardo Terra (rterrabh@gmail.com) Linguagem C 1 de agosto de 2012 44 / 341

Sintaxe Bsica Expresses

Operadores Relacionais: == (comparao) != (diferena) < > <= >=

Operadores Lgicos: So eles: & (and), | (or) e ! (not) Normalmente, para and e or, utiliza-se operadores de curto circuito que fazem com que a expresso s seja analisada at que seja possvel determinar o resultado
So eles: && (and) e || (or)

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

45 / 341

Sintaxe Bsica Expresses Operadores Lgicos de Curto Circuito Ao encontrarem um valor que determine seu resultado, no testam mais as outras condies, isto , a expresso s ser analisada at que seja possvel determinar o resultado Exemplo: considere que os mtodos a e b retornem booleano a() & b() executa os dois mtodos para obter o resultado a() | b() executa os dois mtodos para obter o resultado a() && b() se o mtodo a retornar false, o resultado ser false e o mtodo b nem ser executado a() || b() se o mtodo a retornar true, o resultado ser true e o mtodo b nem ser executado
Ricardo Terra (rterrabh@gmail.com) Linguagem C 1 de agosto de 2012 46 / 341

Sintaxe Bsica Expresses Entendeu mesmo?


#include < s t d i o . h>
2

int int int int

a() b() c() d()

{ { { {

return return return return

0; 1; 0; 1;

} } } }

10

i n t main ( i n t argc , char argv [ ] ) { p r i n t f ( "%d " , a ( ) & b ( ) & c ( ) & d ( ) ) ; p r i n t f ( "%d " , a ( ) && b ( ) && c ( ) && d ( ) ) ; p r i n t f ( "%d " , a ( ) || b ( ) || c ( ) || d ( ) ) ; return 0;

12

14

Pergunta-se Quais mtodos sero executados e qual o retorno dos printfs das linhas 9, 10 e 11?
Ricardo Terra (rterrabh@gmail.com) Linguagem C 1 de agosto de 2012 47 / 341

Sintaxe Bsica Expresses

Tiro no p!
#include < s t d i o . h>
2

i n t main ( i n t argc , char argv [ ] ) { i n t a = 0; i f ( a ! = 0 & 2 / a > 5) { p r i n t f ( "OK" ) ; } else { p r i n t f ( "NOK" ) ; } return 0;

10

12

Pergunta-se O programa acima apresenta um erro fatal. Como evit-lo?

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

48 / 341

Sintaxe Bsica Expresses

Operadores bit a bit: & (and)


Ex: 3 & 1 0011 & 0001 0001 1

| (or)
Ex: 3 | 1 0011 | 0001 0011 3

(xor)
Ex: 3 1 0011 0001 0010 2

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

49 / 341

Sintaxe Bsica Expresses

Operadores bit a bit: ~ (complemento de um)


Ex: 3 0011 1100 12

<< (deslocamento esquerda)


Ex: 4 << 1 0100 << 1 1000 8

>> (deslocamento direita)


Ex: 4 >> 1 0100 >> 1 0010 2

>>> (deslocamento direita com sinal)


Ex: -127 >>> 1 2147483584

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

50 / 341

Sintaxe Bsica Expresses

Exerccios 10 & 13 ? 10 | 13 ? 10 13 ? 0 ?

8 1 ? 2 2 ?

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

51 / 341

Sintaxe Bsica Expresses Comentrios Algumas vezes se deseja explicar um cdigo, explicitar uma informao em linguagem natural. Para isso existem os comentrios. Eles no deixam o programa mais lento e seu uso altamente recomendvel. Existem dois tipos de comentrios em C ANSI: Comentrio at nal de linha. Tudo escrito aps ele na linha, considerado comentrio. Exemplo:
i n t rg ; / / s os nmeros sero armazenados

Comentrio de bloco. Tudo escrito entre /* e */ considerado comentrio. Exemplo:


/ pode i n c l u i r vrias linhas /
Ricardo Terra (rterrabh@gmail.com) Linguagem C 1 de agosto de 2012 52 / 341

Sintaxe Bsica
Comandos condicionais

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

53 / 341

Sintaxe Bsica Comandos condicionais

Comandos condicionais (if, switch e operador ternrio) Comando condicionais so aqueles que dependendo de uma condio executam um bloco, caso a condio no seja atendida, o bloco no ser executado C prov suporte a trs comandos condicionais:
if switch operador ternrio (? :)

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

54 / 341

Sintaxe Bsica Comandos condicionais

Comandos condicionais - if Sintaxe do comando if


i f ( condicao ) { comando1; comando2; comando3; }

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

55 / 341

Sintaxe Bsica Comandos condicionais

Observaes: Os parnteses que envolvem a condio so OBRIGATRIOS Diferentemente de Pascal, Delphi (Object Pascal) etc A condio dever retornar um tipo booleano Os comandos somente sero executados se a condio for verdadeira

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

56 / 341

Sintaxe Bsica Comandos condicionais Comandos condicionais - if O uso dos braos NO obrigatrio caso seja apenas um nico comando Porm, a boa prtica recomenda a utilizao de braos independente do nmero de comandos
Melhor indentao do cdigo
i f ( 1 ) comando;

equivale a:
if ( 1 ) { comando; }

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

57 / 341

Sintaxe Bsica Comandos condicionais Comandos condicionais - if Como fao o conhecido: se verdade ento . . . seno . . .
i f ( condicao ) { comando1; comando2; comando3; } else { comando4; comando5; comando6; }

Pergunta-se Quais comandos sero executados se a condio for verdadeira? E se for falsa?
Ricardo Terra (rterrabh@gmail.com) Linguagem C 1 de agosto de 2012 58 / 341

Sintaxe Bsica Comandos condicionais

Comandos condicionais - if
1

#include < s t d i o . h> i n t main ( i n t argc , i n t a, b; scanf ( "%d %d " , i f (a >= b) { p r i n t f ( "%d } else { p r i n t f ( "%d } return 0; } char argv [ ] ) { &a , &b ) ; e maior ou i g u a l a %d ! " , a , b ) ; e menor que %d ! " , a , b ) ;

11

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

59 / 341

Sintaxe Bsica Comandos condicionais Comandos condicionais - if Comando if podem ser aninhados
#include < s t d i o . h>
2

i n t main ( i n t argc , char argv [ ] ) { i n t nota ; scanf ( "%d " , &nota ) ; i f ( nota >= 90) { p r i n t f ( " Nota A" ) ; } else i f ( nota >= 80) { p r i n t f ( " Nota B " ) ; } else i f ( nota >= 70) { p r i n t f ( " Nota C" ) ; } else { p r i n t f ( " Reprovado " ) ; } return 0; }

10

12

14

16

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

60 / 341

Sintaxe Bsica Comandos condicionais

Exemplo if
1

#include < s t d i o . h> i n t main ( i n t argc , char argv [ ] ) { char op ; p r i n t f ( " D i g i t e um operador (+ / ): " ) ; scanf ( "%c " , &op ) ; i f (op == + || op == ) { p r i n t f ( " Operador de Baixa Prioridade . \ n " ) ; } else i f (op == / || op == ) { p r i n t f ( " Operador de Alta Prioridade . \ n " ) ; } else { p r i n t f ( " Caractere I n v a l i d o ! \n " ) ; } return 0;

11

13

15

17

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

61 / 341

Sintaxe Bsica Comandos condicionais

Comandos condicionais - switch Na instruo switch, uma varivel de tipo primitivo char ou int comparada com cada valor em questo. Se um valor coincidente achado, a instruo (ou instrues) depois do teste executada Sintaxe:
switch ( v a r i a v e l ) { case 1 : comandoA; break ; case 2 : comandoB; break ; case 3 : comandoC; break ; d e f a u l t : comandoPadrao ; }

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

62 / 341

Sintaxe Bsica Comandos condicionais

Comandos condicionais - switch Se nenhum valor for encontrado, a instruo default executada O comando break necessrio para quebrar o switch, pois assim que encontrada a opo correta, executado tudo em seguida

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

63 / 341

Sintaxe Bsica Comandos condicionais Comandos condicionais - switch


#include < s t d i o . h>
2

10

12

i n t main ( i n t argc , char argv [ ] ) char l e t r a = B ; switch ( l e t r a ) { case A : p r i n t f ( " Entrou case B : p r i n t f ( " Entrou case C : p r i n t f ( " Entrou case D : p r i n t f ( " Entrou default : p r i n t f ( " Entrou } return 0; }

em em em em em

A" ) ; break ; B" ); C" ) ; break ; D" ) ; break ; Default " ) ;

Pergunta-se Qual a sada? E se o valor de letra fosse C? E se fosse a?


Ricardo Terra (rterrabh@gmail.com) Linguagem C 1 de agosto de 2012 64 / 341

Sintaxe Bsica Comandos condicionais Comandos condicionais - switch


1

#include < s t d i o . h> i n t main ( i n t argc , char argv [ ] ) char l e t r a = B ; switch ( l e t r a ) { default : p r i n t f ( " Entrou case A : p r i n t f ( " Entrou case B : p r i n t f ( " Entrou case C : p r i n t f ( " Entrou case D : p r i n t f ( " Entrou } return 0; } {

em em em em em

Default " ) ; A" ) ; break ; B " ) ; break ; C" ) ; break ; D" ) ; break ;

11

13

Pergunta-se Qual a sada?


Ricardo Terra (rterrabh@gmail.com) Linguagem C 1 de agosto de 2012 65 / 341

Sintaxe Bsica Comandos condicionais Comandos condicionais - switch


1

#include < s t d i o . h> i n t main ( i n t argc , char argv [ ] ) char l e t r a = b ; switch ( l e t r a ) { case A : p r i n t f ( " Entrou case B : p r i n t f ( " Entrou default : p r i n t f ( " Entrou case C : p r i n t f ( " Entrou case D : p r i n t f ( " Entrou } return 0; } {

em em em em em

A" ) ; break ; B " ) ; break ; Default " ) ; C" ) ; break ; D" ) ; break ;

11

13

Pergunta-se Qual a sada?


Ricardo Terra (rterrabh@gmail.com) Linguagem C 1 de agosto de 2012 66 / 341

Sintaxe Bsica Comandos condicionais

Exemplo switch
1

#include < s t d i o . h> i n t main ( i n t argc , char argv [ ] ) { char op ; p r i n t f ( " D i g i t e um operador (+ / ): " ) ; scanf ( "%c " , &op ) ; switch (op) { case + : case : p r i n t f ( " Operador de Baixa Prioridade . \ n " ) ; break ; case : case / : p r i n t f ( " Operador de Alta Prioridade . \ n " ) ; break ; d e f a u l t : p r i n t f ( " Caractere I n v a l i d o ! \n " ) ; } return 0;

11

13

15

17

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

67 / 341

Sintaxe Bsica Comandos condicionais

Comandos condicionais - Operador Ternrio Existem situaes cujo uso do if no elegante Por exemplo, suponha que a funo max retorne o maior nmero dentre os dois passados via parmetros formais
1

i n t max( i n t a , i f (a > b) return } else { return } }

i n t b) { { a; b;

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

68 / 341

Sintaxe Bsica Comandos condicionais

Comandos condicionais - Operador Ternrio O operador ternrio uma expresso, signicando que ele devolve um valor O operador ternrio muito til para condicionais (curtas e simples) e tem o seguinte formato: varivel = <condio> ? seTrue : seFalse;
A condio pode estar envolvida entre parnteses para facilitar a leitura, contudo no obrigatrio

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

69 / 341

Sintaxe Bsica Comandos condicionais

Exemplos:
i n t a = 2; i n t b = 3; i n t c = ( a > b ) ? a : b;

Indica que se a for maior que b, c recebe o valor de a, caso contrrio recebe o valor de a, isto , c recebe o maior valor entre a e b Pergunta-se Qual o valor das variveis abaixo:
i n t peso = ( 2 != 2 ) ? 80 : 6 3 ; char l e t r a = ( 1 == 1 ) ? R : T ;

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

70 / 341

Sintaxe Bsica Comandos condicionais Comandos condicionais - Operador Ternrio No necessariamente o retorno do operador ternrio deve ser atribudo a uma varivel Por exemplo, seu retorno pode ser o retorno de uma funo como faz a funo max com operador ternrio:
i n t max( i n t a , i n t b) { r e t u r n (a > b) ? a : b ; }

Ou mesmo o retorno pode servir como parmetro de chamada de uma funo:


p r i n t f ( ( a > b) ? " a maior ! " : " b maior ! " ) ; p r i n t f ( "%d " , (a > b) ? a : b ) ;

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

71 / 341

Sintaxe Bsica
Comandos de repetio

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

72 / 341

Sintaxe Bsica Comandos de repetio

Comandos repetio (while, do...while e for) Comandos de repetio so utilizados para repetir um bloco de cdigo C prov suporte a trs comandos de repetio:
while (enquanto) do...while (faa...enquanto) for (para)

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

73 / 341

Sintaxe Bsica Comandos de repetio

Comandos repetio - while O comando while utilizado para repetir um bloco de acordo com uma condio considerado um loop de pr-teste
Isto , testa a condio antes de executar o bloco

Sintaxe:
while ( condicao ) { comando1; comando2; comandoN; }

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

74 / 341

Sintaxe Bsica Comandos de repetio

Comandos repetio - while


1

#include < s t d i o . h> i n t main ( i n t argc , char argv [ ] ) { i n t i = 0; while ( i < 10) { p r i n t f ( "%d " , ++ i ) ; } return 0;

11

Pergunta-se Qual a sada?

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

75 / 341

Sintaxe Bsica Comandos de repetio

Comandos repetio - do...while O comando do...while semelhante ao while, contudo um comando de repetio de ps-teste
Isto , somente ao nal da execuo do bloco que se verica a condio

Geralmente, utilizado quando se deseja testar a condio somente a partir da segunda iterao
Por exemplo, uma leitura da opo de um menu. Pede para digitar uma primeira vez. Somente se no digitar uma opo vlida que pede para digitar novamente

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

76 / 341

Sintaxe Bsica Comandos de repetio

Sintaxe:
do { comando1; comando2; comandoN; } while ( condicao ) ;

Observe o ponto-e-vrgula aps os parnteses da condio. No o esquea!

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

77 / 341

Sintaxe Bsica Comandos de repetio

Comandos repetio - do...while


1

#include < s t d i o . h> i n t main ( i n t argc , char argv [ ] ) { i n t i = 0; do {

p r i n t f ( "%d " , ++ i ) ; } while (1 ! = 1 ) ; return 0;

11

Pergunta-se Qual a sada?

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

78 / 341

Sintaxe Bsica Comandos de repetio Exemplo


1

#include < s t d i o . h> i n t main ( i n t argc , char argv [ ] ) { int i ; do {

p r i n t f ( " D i g i t e um numero entre 0 e 1 0 : " ) ; scanf ( "%d " , & i ) ; } while ( i < 0 || i > 1 0 ) ; p r i n t f ( " Numero digitado : %d\n " , i ) ; return 0; }

11

13

Pergunta-se Qual a sada?


Ricardo Terra (rterrabh@gmail.com) Linguagem C 1 de agosto de 2012 79 / 341

Sintaxe Bsica Comandos de repetio Comandos de repetio - for Comando de repetio mais poderoso da linguagem C composta por:
Inicializao: executado uma nica vez no incio do loop Condio: executado sempre antes de cada iterao. Se verdadeira, o bloco executado. Se falsa, nalizado Operao : executado sempre ao trmino de cada iterao

Sintaxe
f o r ( i n i c i a l i z a c a o ; condicao ; operacao ) { comando1; comando2; ... comandoN; }
Ricardo Terra (rterrabh@gmail.com) Linguagem C 1 de agosto de 2012 80 / 341

Sintaxe Bsica Comandos de repetio

Exemplo
#include < s t d i o . h>
2

i n t main ( i n t argc , char argv [ ] ) { int i ; f o r ( i = 0 ; i < 1 0 ; i ++) { p r i n t f ( "%d " , i ) ; } return 0; }

10

Pergunta-se Qual a sada?

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

81 / 341

Sintaxe Bsica Comandos de repetio Sintaxe No lao for, a inicializao, condio e operao so todas opcionais Exemplo
1

#include < s t d i o . h> i n t main ( i n t argc , char argv [ ] ) { i n t i = 0; f o r ( ; ; ) { / Sem condicao , admitese sempre verdade / p r i n t f ( "%d " , ++ i ) ; } return 0; }

Pergunta-se Qual a sada?


Ricardo Terra (rterrabh@gmail.com) Linguagem C 1 de agosto de 2012 82 / 341

Sintaxe Bsica Comandos de repetio Comandos de repetio - for Podemos ter um for dentro de outro, e outro dentro de outro, e outro dentro de outro...
1

#include < s t d i o . h> i n t main ( i n t argc , char argv [ ] ) { int i , j ; f o r ( i = 0 ; i <= 2 ; i ++) { f o r ( j = 0 ; j < 2 ; j ++) { p r i n t f ( "%d %d " , i , j ) ; } } return 0; }

11

Pergunta-se Qual a sada?


Ricardo Terra (rterrabh@gmail.com) Linguagem C 1 de agosto de 2012 83 / 341

Sintaxe Bsica Comandos de repetio Comandos de repetio - for Um comando for pode ter vrias inicializaes, uma condio complexa e vrias operaes Exemplo
#include < s t d i o . h>
2

i n t main ( i n t argc , char argv [ ] ) { i n t i , d; f o r ( i = 1 , d = 2 i ; i <= 10 || d == 2 2 ; i ++ , d = i 2) { p r i n t f ( "%d %d\n " , i , d ) ; } return 0; }

10

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

84 / 341

Sintaxe Bsica Comandos de repetio Comando break Inserido dentro de um bloco de repetio (pode tambm ser while ou do...while) Caso seja executado, o bloco de repetio nalizado Exemplo
1

i n t main ( i n t argc , char argv [ ] ) { i n t i = 0; f o r ( ; i < 1 0 ; i ++) { i f ( i == 3) { break ; } p r i n t f ( "%d " , i ) ; } return 0; }

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

85 / 341

Sintaxe Bsica Comandos de repetio Comando continue Inserido dentro de um bloco de repetio Caso seja executado, a iterao atual do bloco de repetio interrompida e parte para a prxima iterao Exemplo
2

10

i n t main ( i n t argc , char argv [ ] ) { int i ; f o r ( i = 0 ; i < 1 0 ; i ++) { i f ( i == 3 || i == 5) { continue ; } p r i n t f ( "%d " , i ) ; } return 0; }

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

86 / 341

Sintaxe Bsica Comandos de repetio Comando de repetio - for Logicamente, pode-se utilizar break e continue conjuntamente Exemplo
2

10

12

i n t main ( i n t argc , char argv [ ] ) { int i , j ; f o r ( i = 0 ; i < 3 ; i ++) { i f ( i == 1) { continue ; } f o r ( j = 0 ; j < 2 ; j ++) { p r i n t f ( "%d %d\n " , i , j ) ; break ; } } return 0; }

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

87 / 341

Sintaxe Bsica Comandos de repetio Comando de repetio rotulados Ao contrrio de linguagens como Java, C ANSI no possui blocos de repetio rotulados Por exemplo, dependendo uma certa condio de um bloco mais interno, voc quer quebrar ou continuar a partir do bloco mais externo Exemplo em Java
1

externo : f o r ( i =0; i < 3 ; i ++) { f o r ( j =0; j < 3 ; j ++) { i f ( i == 1 && j == 1 ) { break externo ; } System . out . p r i n t f ( "%d %d\n " , i , j ) ; } }
Linguagem C 1 de agosto de 2012 88 / 341

Ricardo Terra (rterrabh@gmail.com)

Sintaxe Bsica Comandos de repetio Exemplo Neste exemplo, se o valor de j e de k forem 1, o bloco de repetio de k encerrado e volta a iterao do bloco de repetio de j E se fosse para encerrar o for mais externo? Exemplo
1

11

13

15

i n t main ( i n t argc , char argv [ ] ) { int i , j , k; f o r ( i = 0 ; i < 3 ; i ++) { f o r ( j = 0 ; j < 3 ; j ++) { f o r ( k = 0 ; k < 3 ; k ++) { i f ( j == 1 && k == 1) { break ; } p r i n t f ( "%d %d %d\n " , i , j , k ) ; } } } p r i n t f ( " Programa Encerrado . " ) ; return 0; } Linguagem C 1 de agosto de 2012 89 / 341

Ricardo Terra (rterrabh@gmail.com)

Sintaxe Bsica Comandos de repetio Soluo A soluo seria utilizar rtulos (labels) Contudo, seu uso perigoso e pouco recomendado Exemplo
1

11

13

15

i n t main ( i n t argc , char argv [ ] ) { int i , j , k; f o r ( i =0; i <3; i ++) { f o r ( j =0; j <3; j ++) { f o r ( k =0; k <3; k ++) { i f ( j == 1 && k == 1 ) { goto fora ; } p r i n t f ( "%d %d %d\n " , i , j , k ) ; } } } fora : p r i n t f ( " Programa Encerrado . " ) ; return 0; }

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

90 / 341

Sintaxe Bsica
Arranjos

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

91 / 341

Sintaxe Bsica Arranjos

Arranjos - Conceito Arranjos tambm conhecidos como vetor, array etc so colees de um mesmo tipo em sequncia Arranjos podem ser de tipos primitivos (char, int, float, double), de um outro arranjo, de uma estrutura, de enumerao... Pode se ter um arranjo de inteiros ou um arranjo de caracteres ou um arranjo de arranjo de pontos utuantes
Contudo, no se pode ter um arranjo que contenha inteiros e pontos utuantes

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

92 / 341

Sintaxe Bsica Arranjos

Arranjos - Declarao Declarao:


2

i n t notas [ 5 ] ; / Arranjo de 5 i n t e i r o s / char l e t r a s [ 5 ] ; / Arranjo de 5 caracteres /

Assim como variveis comuns, os elementos do arranjo no so inicializados automaticamente. Contudo, voc pode declarar j inicializando:
2

i n t notas [ 5 ] = { 4 , 6 , 6 , 9 , 8 } ; char l e t r a s [ 5 ] = { 6 5 , E , I , O , U } ; char nome[ 1 0 0 ] = "ANA" ; / s t r i n g de 100 caracteres /

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

93 / 341

Sintaxe Bsica Arranjos

Arranjos - Declarao Um arranjo de tamanho n, tem suas posies indexadas de 0 a n-1. Exemplo:
1

i n t notas [ 5 ] = { 8 , 7 , 8 , 9 , 3 } ; notas [ 3 ] = 7 ; p r i n t f ( "%d " , notas [ 4 ] ) ;

Para obter o tamanho de um arranjo, basta dividir o seu tamanho pelo tamanho ocupado por cada elemento utilizando a funo sizeof. Exemplo:
1

i n t tam = s i z e o f ( notas ) / s i z e o f ( i n t ) ;

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

94 / 341

Sintaxe Bsica Arranjos

Declarando, inicializando e iterando um arranjo de inteiros


1

#include < s t d i o . h> i n t main ( i n t argc , char argv [ ] ) { i n t notas [ 5 ] , i ; i n t tam = s i z e o f ( notas ) / s i z e o f ( i n t ) ;

f o r ( i = 0 ; i < tam ; i ++) { notas [ i ] = 0 ; } return 0;

11

13

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

95 / 341

Sintaxe Bsica Arranjos

Declarando, inicializando e iterando um arranjo de caracteres


#include < s t d i o . h>
2

i n t main ( i n t argc , char argv [ ] ) { int i ; char vogais [ 5 ] = { A , E , I , O , U } ; f o r ( i = 0 ; i < s i z e o f ( vogais ) / s i z e o f ( char ) ; i ++) { p r i n t f ( "%c " , vogais [ i ] ) ; } return 0;

10

12

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

96 / 341

Sintaxe Bsica Arranjos

Arranjos - Acesso aos elementos Arranjos permite recuperar ou alterar qualquer um de seus elementos Os arranjos em C sempre iniciam-se na posio 0
Isto indica que ele termina em uma posio inferior ao tamanho (n-1)

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

97 / 341

Sintaxe Bsica Arranjos Exemplo


#include < s t d i o . h>
2

i n t main ( i n t argc , char argv [ ] ) { char l e t r a s [ 1 0 ] ; l e t r a s [ 0 ] = A ; / A t r i b u i a 1a posicao do arranjo / p r i n t f ( "%c " , l e t r a s [ 0 ] ) ; / Imprime a 1a posicao do arranjo / l e t r a s [ 1 ] = B ; l e t r a s [ 2 ] = C ; / . . . / l e t r a s [ 9 ] = H ; letras [10] = I ; return 0;

10

12

/ ERRO /

14

16

O erro acima acessa uma rea de memria no reservada ao arranjo. Isso pode alterar o funcionamento normal do programa ou at mesmo "derrub-lo"
Ricardo Terra (rterrabh@gmail.com) Linguagem C 1 de agosto de 2012 98 / 341

Sintaxe Bsica Arranjos

Entendendo arranjos de caracteres Um arranjo de caracteres como qualquer outro arranjo. Se ele tem tamanho n, ele tem n posies disponveis indexadas de 0 a n-1 Um arranjo de caracteres no um string Em C, no existe o tipo string. Ele simulado por um arranjo de caracteres em que o caractere \0 delimita o seu nal

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

99 / 341

Sintaxe Bsica Arranjos Arranjo de caracteres como Arranjo de caracteres Suas posies vlidas so como de todos os arranjos de 0 a n-1 Seu tamanho calculado pelo uso da funo sizeof A leitura/impresso de cada caractere usa-se %c Exemplo
1

#include < s t d i o . h> i n t main ( i n t argc , char argv [ ] ) { char placa [ 7 ] = { B , A , D , 0 , 0 , 0 , 7 } ; int i ; f o r ( i = 0 ; i < s i z e o f ( placa ) / s i z e o f ( char ) ; i ++) { p r i n t f ( "%c " , placa [ i ] ) ; } return 0; }

11

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

100 / 341

Sintaxe Bsica Arranjos Arranjo de caracteres como string Suas posies vlidas so de 0 a n-2. No pior caso, a posio n-1 deve conter o terminador nulo Seu tamanho calculado pelo uso da funo srtlen da biblioteca string.h A leitura utiliza a funo gets e a impresso usa-se %s Exemplo
2

#include < s t d i o . h> #include < s t r i n g . h> i n t main ( i n t argc , char argv [ ] ) { char nome [ 1 0 0 ] ; gets ( nome ) ; / Le s t r i n g /

p r i n t f ( "O nome digitado f o i %s (%d caracteres ) " , nome, ( i n t ) s t r l e n ( nome ) ) ;


10

return 0;
12

} Linguagem C 1 de agosto de 2012 101 / 341

Ricardo Terra (rterrabh@gmail.com)

Sintaxe Bsica Arranjos Arranjos - Cpia Observe o seguinte trecho: int vA[4] = {1,2,3,4}, vB[4]; Cpia completamente errada:
vB = vA;

Cpia correta:
2

f o r ( i =0; i <4; i ++){ vB [ i ] = vA [ i ] ; }

Isto , uma posio de cada vez

No for, utilizei a literal 4 para limitar a iterao somente para demonstrao, contudo qual seria mais apropriado?
Ricardo Terra (rterrabh@gmail.com) Linguagem C 1 de agosto de 2012 102 / 341

Sintaxe Bsica Arranjos Arranjos Multidimensionais Pode-se criar um arranjo de arranjos O mais comum o bidimensional que vemos como uma matriz A declarao somente acrescentar o nmero de colunas Por exemplo: int matriz[4][3] declara-se uma matriz de 4 linhas e 3 colunas
matriz[4][3] = {{1,0,0},{0,1,2},{2,3,4},{0,6,7}};

Representao :

1 0 2 0

0 1 3 6

0 2 4 7
1 de agosto de 2012 103 / 341

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

Sintaxe Bsica Arranjos Arranjo Bidimensional - Exemplo Criando uma matriz 3x2, zerando e setando valores
1

#include < s t d i o . h> i n t main ( i n t argc , char argv [ ] ) { i n t matriz [ 3 ] [ 2 ] , i , j ; / Declara uma m a t r i z 3x2 / f o r ( i = 0 ; i < 3 ; i ++) { f o r ( j = 0 ; j < 2 ; j ++) { matriz [ i ] [ j ] = 0 ; } } matriz [ 0 ] [ 0 ] = 1 ; / A t r i b u i o v a l o r 1 ao canto s u p e r i o r esquerdo / matriz [ 2 ] [ 1 ] = 7 ; / A t r i b u i o v a l o r 7 ao canto i n f e r i o r d i r e i t o / return 0;

11

13

15

matriz
1 0 0 0 0 7

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

104 / 341

Sintaxe Bsica Arranjos

Arranjo Bidimensional - Exemplo com sizeof O exemplo anterior no utilizou sizeof porque o clculo do tamanho depende do entendimento de ponteiros. S para saberem, o certo seria:
#include < s t d i o . h>
2

i n t main ( i n t argc , char argv [ ] ) { i n t matriz [ 3 ] [ 2 ] , i , j ; / Declara uma m a t r i z 3x2 / f o r ( i = 0 ; i < s i z e o f ( matriz ) / s i z e o f ( matriz [ i ] ) ; i ++) { f o r ( j = 0 ; j < s i z e o f ( matriz [ i ] ) / s i z e o f ( i n t ) ; j ++) { matriz [ i ] [ j ] = 0 ; } } matriz [ 0 ] [ 0 ] = 1 ; / A t r i b u i o v a l o r 1 ao canto s u p e r i o r esquerdo / matriz [ 2 ] [ 1 ] = 7 ; / A t r i b u i o v a l o r 7 ao canto i n f e r i o r d i r e i t o / return 0; }

10

12

14

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

105 / 341

Sintaxe Bsica Arranjos Exemplo Completo Leitura de cada elemento de uma matriz 2x3 e posterior impresso
#include < s t d i o . h>
2

i n t main ( i n t argc , char argv [ ] ) { i n t matriz [ 2 ] [ 3 ] , i , j ; f o r ( i = 0 ; i < s i z e o f ( matriz ) / s i z e o f ( matriz [ i ] ) ; i ++) { f o r ( j = 0 ; j < s i z e o f ( matriz [ i ] ) / s i z e o f ( i n t ) ; j ++) { p r i n t f ( " D i g i t e m a t r i z [%d][%d ] : " , i , j ) ; scanf ( "%d " , &matriz [ i ] [ j ] ) ; } } f o r ( i = 0 ; i < s i z e o f ( matriz ) / s i z e o f ( matriz [ i ] ) ; i ++) { f o r ( j = 0 ; j < s i z e o f ( matriz [ i ] ) / s i z e o f ( i n t ) ; j ++) { p r i n t f ( "%d\ t " , matriz [ i ] [ j ] ) ; } p r i n t f ( " \n " ) ; } return 0; }

10

12

14

16

18

20

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

106 / 341

Sintaxe Bsica
Variveis

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

107 / 341

Sintaxe Bsica Variveis

Variveis Uma varivel uma posio nomeada de memria So declaradas basicamente em trs lugares:
dentro de funes variveis locais

nos parmetros de funes parmetros formais fora de todas as funes variveis globais

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

108 / 341

Sintaxe Bsica Variveis Variveis Variveis locais


so reconhecidas apenas dentro do bloco em que foi declarada e existem apenas enquanto o bloco de cdigo em que foi declarada est sendo executado

Parmetros formais
sero vistos quando abordarmos funes, mas, para adiantar, se comportam exatamente como variveis locais que so reconhecidas apenas dentro da funo

Variveis globais
so variveis declaradas fora de qualquer funo que so reconhecidas por todo o programa e podem ser utilizadas por qualquer bloco de cdigo

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

109 / 341

Sintaxe Bsica Variveis

Exemplo
1

#include < s t d i o . h> #include <math . h> const double P I = 3.141596; / Variavel Global /

double area ( double r ) { / Parametro Formal / r e t u r n P I pow( r , 2 ) ; } i n t main ( i n t argc , char argv [ ] ) { double r a i o ; / Variavel Local / p r i n t f ( " Digite o raio : " ) ; scanf ( "% l f " , &r a i o ) ; p r i n t f ( "A area da circunferencia e : % l f " , area ( r a i o ) ) ; return 0; }

11

13

15

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

110 / 341

Sintaxe Bsica Variveis

Variveis Globais Caractersticas:


So declaradas no arquivo fonte fora do escopo de qualquer funo Existem durante todo o ciclo de vida do programa S so acessveis s funes declaradas depois delas no mesmo arquivo fonte

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

111 / 341

Sintaxe Bsica Variveis Variveis Globais - Exemplo


#include < s t d i o . h>
2

void func1 ( ) { p r i n t f ( " Var . Global g nao a c e s s i v e l " ) ; } i n t g ; / v a r i a v e l global /

10

12

void func2 ( ) { g ++; p r i n t f ( " Var . Global g a c e s s i v e l : %d " , g ) ; } i n t main ( i n t argc , char argv [ ] ) { g = 5; func1 ( ) ; func2 ( ) ; return 0; }

14

16

18

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

112 / 341

Sintaxe Bsica Variveis

Variveis Uma varivel dentro de um bloco interno esconde a varivel de mesmo nome no bloco externo Observe os exemplos a seguir em que temos variveis com o mesmo nome em nveis lexicogrcos diferentes e tente aferir a sada gerada pelo programa

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

113 / 341

Sintaxe Bsica Variveis

Variveis - Nveis Lexicogrcos


1

#include < s t d i o . h> i n t i = 8 ; / v a r i a v e l global / i n t main ( i n t argc , char argv [ ] ) { i n t i = 3; p r i n t f ( "%d " , i ) ; return 0; }

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

114 / 341

Sintaxe Bsica Variveis Variveis - Nveis Lexicogrcos


1

#include < s t d i o . h> i n t a ; / v a r i a v e l global / void func ( i n t a ) { / parametro formal / p r i n t f ( "%d " , a ) ; i f ( a > 2) { i n t a = 7 ; / v a r i a v e l l o c a l / p r i n t f ( "%d " , a ) ; } a += 7 ; p r i n t f ( "%d " , a ) ; } i n t main ( i n t argc , char argv [ ] ) { a = 3 ; / atribuicao a v a r i a v e l global / func ( a ) ; p r i n t f ( "%d " , a ) ; return 0; }
Linguagem C 1 de agosto de 2012 115 / 341

11

13

15

17

19

Ricardo Terra (rterrabh@gmail.com)

Sintaxe Bsica
Funes

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

116 / 341

Sintaxe Bsica Funes

Funo Um programa C uma coleo de funes Uma das funes deve se chamar main
ponto de entrada

Uma funo pode:


receber parmetros declarar variveis locais conter instrues executveis retornar um valor

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

117 / 341

Sintaxe Bsica Funes

Funo Uma funo no pode declarar outra funo


Este o motivo pelo qual a linguagem C no classicada integralmente como estruturada em blocos

Isso no pode!
2

int f () { ... ... i n t g ( ) { / Nao pode! / } ... ... }

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

118 / 341

Sintaxe Bsica Funes Funo A funo deve ser declarada antes do local onde chamada O comando return efetua o retorno (trmino) da funo Uma funo pode ou no ter um retorno Uma funo pode ou no ter parmetros formais Exemplos
1

void m1 ( ) { . . . } / sem retorno e sem parametros formais / void m2( double x ) { . . . } / sem retorno e com um par . formal / i n t m3 ( ) { . . . } / com retorno e sem parametros formais / i n t m4( char c , i n t f ) { . . . } / com retorno e com dois param . /
Linguagem C 1 de agosto de 2012 119 / 341

Ricardo Terra (rterrabh@gmail.com)

Sintaxe Bsica Funes Ordem de Declarao Funo deve ser declarada antes de seu uso: no caso, soma est declarada antes de main
#include < s t d i o . h> i n t soma ( i n t x , i n t y ) { / parametros Formais / return x + y ; } i n t main ( i n t argc , char argv [ ] ) { int a = 2 , b = 3 , total ; / chamada a funcao : valores de a e b copiados para x e y / t o t a l = soma (a , b ) ; p r i n t f ( "Soma: %d " , t o t a l ) ; return 0; }

11

13

15

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

120 / 341

Sintaxe Bsica Funes Funo Sintaxe:


retorno nome ( < param { , param} > ) { corpo }

Exemplos
1

void i m p ri m i r ( ) { . . . } i n t dobro ( i n t x ) { . . . } double somar ( double a , double b) { . . . } void l i s t a r ( i n t notas [ ] , i n t tam) { . . . }

Convm salientar que a passagem de parmetros em C sempre por valor, i.e., os valores so copiados da origem para o destino
Ricardo Terra (rterrabh@gmail.com) Linguagem C 1 de agosto de 2012 121 / 341

Sintaxe Bsica Funes

Exemplo - Passagem por Valor


1

#include < s t d i o . h> void func ( i n t k ) { k = 3; } i n t main ( i n t argc , char argv [ ] ) { i n t i = 2; func ( i ) ; p r i n t f ( "%d " , i ) ; return 0; }

11

Pergunta-se Qual o valor de i impresso?

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

122 / 341

Sintaxe Bsica Funes

Funo Retorno de funes


Uma funo pode retornar valores de qualquer tipo, exceto arranjos ou outras funes Uma funo que retorna nada, deve ter seu retorno declarado como void A expresso que segue o return o valor retornado
no se deve colocar parnteses return x+y; e no return (x+y);

O valor de retorno pode ser ignorado


por exemplo, a funo printf retorna um valor, mas geralmente se ignora

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

123 / 341

Sintaxe Bsica Funes

Funo Trmino de uma funo


Ao encontrar a chave de fechamento Ao ser retornada (return)

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

124 / 341

Sintaxe Bsica Funes Exemplo


2

#include < s t d i o . h> #include < s t r i n g . h> i n t imprimeRetornandoTamanho ( char s t r [ ] ) { p r i n t f ( "%s " , s t r ) ; r e t u r n s t r l e n ( s t r ) ; / Nao precisa de parenteses , mas pode / } i n t main ( i n t argc , char argv [ ] ) { char s t r [ 1 0 0 ] ; p r i n t f ( " D i g i t e o nome: " ) ; gets ( s t r ) ; imprimeRetornandoTamanho ( s t r ) ; return 0; }

10

12

14

Tamanho do string retornado pela funo foi ignorado


Ricardo Terra (rterrabh@gmail.com) Linguagem C 1 de agosto de 2012 125 / 341

Sintaxe Bsica Funes

Funo Como j se sabe, arranjos podem ser passados como parmetros para funes Contudo, ao se passar arranjos, alm da funo receber o arranjo, ela deve receber o tamanho do arranjo
Pois, dentro da funo no funcionar corretamente a funo sizeof Exceo para arranjos de caracteres que esto representando strings, pois o tamanho do string denido pelo caractere \0 e utilizada a funo strlen

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

126 / 341

Sintaxe Bsica Funes

Exemplo
1

#include < s t d i o . h> void imprimeArranjo ( i n t v [ ] , i n t tam ) { int i ; f o r ( i = 0 ; i < tam ; i ++) { p r i n t f ( " %4d " , v [ i ] ) ; } } i n t main ( i n t argc , char argv [ ] ) { int v[4] = { 4 , 9 , 2 , 3 } ; imprimeArranjo ( v , s i z e o f ( v ) / s i z e o f ( i n t ) ) ; return 0; }

11

13

O tamanho deve ser passado

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

127 / 341

Sintaxe Bsica Funes Exemplo


2

#include < s t d i o . h> #include < s t r i n g . h> void imprimeString ( char s t r [ ] ) { i n t i , tam ; tam = s t r l e n ( s t r ) ; f o r ( i = 0 ; i < tam ; i ++) { p r i n t f ( "%c " , s t r [ i ] ) ; } } i n t main ( i n t argc , char argv [ ] ) { char v [ 1 0 ] = { A , N , A , \0 , I , X , K , ^ , % , ! } ; imprimeString ( v ) ; return 0; }

10

12

14

16

No precisa passar o tamanho quando o arranjo de caracteres estiver representando um string


Ricardo Terra (rterrabh@gmail.com) Linguagem C 1 de agosto de 2012 128 / 341

Sintaxe Bsica Funes

Exerccios de Fixao Implementar as funes:


fatorial escreveMaior retornaMenorElemento retornaMaiorElemento retornaMedia

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

129 / 341

Sintaxe Bsica Funes Exerccio - Fatorial


#include < s t d i o . h>
2

10

12

long i n t f a t ( i n t n ) { int i ; long i n t r e s = 1 ; i f ( n == 0 || n == 1) { return 1; } f o r ( i = 2 ; i <= n ; i ++) { r e s = i ; } return res ; } i n t main ( i n t argc , char argv [ ] ) { int n; scanf ( "%d " , &n ) ; p r i n t f ( "%d ! = %l d " , n , f a t ( n ) ) ; return 0; }
Linguagem C 1 de agosto de 2012 130 / 341

14

16

18

20

Ricardo Terra (rterrabh@gmail.com)

Sintaxe Bsica Funes

Exerccio - Escreve Maior


#include < s t d i o . h>
2

void escreveMaior ( i n t n ) { int i ; f o r ( i = n ; i >= 1 ; i ) { p r i n t f ( "%d " , i ) ; p r i n t f ( ( i > 1) ? " > " : " \n " ) ; } } i n t main ( i n t argc , char argv [ ] ) { int n; scanf ( "%d " , &n ) ; escreveMaior ( n ) ; return 0; }

10

12

14

16

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

131 / 341

Sintaxe Bsica Funes

Exerccio - Escreve Maior (hardcore)


#include < s t d i o . h>
2

void escreveMaior ( i n t n ) { f o r ( ; n >= 1 ; p r i n t f ( "%d " , n ) , p r i n t f ( n > 1 ? " > " : " \n " ) ) ; } i n t main ( i n t argc , char argv [ ] ) { int n; scanf ( "%d " , &n ) ; escreveMaior ( n ) ; return 0; }

10

12

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

132 / 341

Sintaxe Bsica Funes Exerccio - Retorna Menor Elemento


#include < s t d i o . h>
2

10

12

i n t retornaMenorElemento ( i n t v [ ] , i n t tam ) { int i ; i n t menor = v [ 0 ] ; f o r ( i = 1 ; i < tam ; i ++) { i f ( v [ i ] < menor) { menor = v [ i ] ; } } r e t u r n menor ; } i n t main ( i n t argc , char argv [ ] ) { int v[5] = { 2 , 4 , 5 , 1 , 3 } ; i n t tam = s i z e o f ( v ) / s i z e o f ( i n t ) ; p r i n t f ( " Menor e l . : %d " , retornaMenorElemento ( v , tam ) ) ; return 0; }

14

16

18

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

133 / 341

Sintaxe Bsica Funes

Ordem de Declarao Uma funo pode ser implementada aps seu ponto de chamada ou mesmo em um outro arquivo fonte Entretanto, para utiliz-la deve-se especicar, ao menos, o seu prottipo O prottipo de uma funo consiste em especicar seu retorno, seu nome e o tipo dos seus parmetros formais
Uma espcie de assinatura da funo

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

134 / 341

Sintaxe Bsica Funes

Funciona?
1

#include < s t d i o . h> i n t main ( i n t argc , char argv [ ] ) { int a = 2 , b = 3 , total ; t o t a l = soma (a , b ) ; p r i n t f ( "Soma: %d " , t o t a l ) ; return 0; } i n t soma ( i n t x , i n t y ) { return x + y ; }

11

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

135 / 341

Sintaxe Bsica Funes E agora?


1

#include < s t d i o . h> / Prototipo / i n t soma ( i n t , i n t ) ; i n t main ( i n t argc , char argv [ ] ) { int a = 2 , b = 3 , total ; t o t a l = soma (a , b ) ; p r i n t f ( "Soma: %d " , t o t a l ) ; return 0; } i n t soma ( i n t x , i n t y ) { return x + y ; }

11

13

15

Com o uso de prottipo, a funo main sabe que existe a funo soma
Ricardo Terra (rterrabh@gmail.com) Linguagem C 1 de agosto de 2012 136 / 341

Sintaxe Bsica Funes Importante importante mencionar que o uso de prottipo no se limita apenas funo main, mas sim, qualquer funo que deseje acessar mtodos declarados abaixo dela
1

#include < s t d i o . h> / Prototipo / i n t ePar ( i n t ) ; i n t resto ( int , i n t ) ; i n t main ( i n t argc , char argv [ ] ) { int n; scanf ( "%d " , &n ) ; p r i n t f ( ( ( ePar ( n ) ) ? "%d eh par " : "%d eh impar " ) , n ) ; return 0; } i n t ePar ( i n t n ) { r e t u r n r e s t o ( n , 2) ? 0 : 1 ; / Acessando funcao declarada abaixo / }

11

13

15

17

19

i n t resto ( i n t x , i n t y ) { return x % y ; }

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

137 / 341

Sintaxe Bsica Funes

Recurso Como se sabe, uma funo pode chamar uma outra funo
Essa outra funo pode ser ela mesma

Uma funo que chama a si mesma dita ser uma funo recursiva Funes recursivas podem chamar a si mesmas direta ou indiretamente
a( ) que chama a( ) a( ) que chama b( ) que chama a( )

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

138 / 341

Sintaxe Bsica Funes

Recurso Existem problemas que so naturalmente recursivos O mais clssico o fatorial


0! n! = 1! = 1

= n * (n-1)!

Ao se implementar uma funo recursiva, o mais importante denir o seu ponto de parada No exemplo do fatorial, a recurso para quando se chega no 0 ou 1

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

139 / 341

Sintaxe Bsica Funes

Exerccios de Fixao Implementar as funes:


fatorial recursivo fibonacci recursivo escreveMaior recursivo

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

140 / 341

Sintaxe Bsica Funes Exerccio - Fatorial Recursivo


#include < s t d i o . h>
2

/ Prototipo / long i n t f a t ( i n t ) ; i n t main ( i n t argc , char argv [ ] ) { int n; scanf ( "%d " , &n ) ; p r i n t f ( "%d ! = %l d " , n , f a t ( n ) ) ; return 0; } long i n t f a t ( i n t n ) { i f ( n == 0 || n == 1) { r e t u r n 1 ; / Ponto de Parada / } r e t u r n n f a t ( n 1 ) ; / Codigo da Recursao / }

10

12

14

16

18

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

141 / 341

Sintaxe Bsica Funes Exerccio - Fibonacci Recursivo


#include < s t d i o . h>
2

/ Prototipo / long i n t f i b ( i n t ) ; i n t main ( i n t argc , char argv [ ] ) { int n; scanf ( "%d " , &n ) ; p r i n t f ( " f i b (%d) = %l d " , n , f i b ( n ) ) ; return 0; } long i n t f i b ( i n t n ) { i f ( n == 0 || n == 1) { / Ponto de Parada / return n ; } r e t u r n f i b ( n 1) + f i b ( n 2 ) ; / Codigo da Recursao / }

10

12

14

16

18

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

142 / 341

Sintaxe Bsica Funes

Algumas funes da biblioteca padro Funes de E/S (stdio.h)


printf(), scanf(), fprintf(), fscanf(), gets()

Funes Matemticas (math.h)


sin(), cos(), exp(), log(), pow(), sqrt()

Teste e manipulao de caracteres (ctype.h)


isDigit(), isAlpha(), toupper()

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

143 / 341

Sintaxe Bsica Funes

Algumas funes da biblioteca padro Funes de propstio geral (stdlib.h)


malloc(), free(), exit(), rand()

Manipulao de strings e arranjos (string.h)


strcpy(), strcmp(), strcat(), memcpy()

Manipulao de datas e horas (time.h)


localtime(), time(), clock()

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

144 / 341

Sintaxe Bsica
Estruturas

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

145 / 341

Sintaxe Bsica Estruturas Estruturas (Struct) O que conhecemos como record em Pascal, em C conhecido como struct Uma estrutura uma coleo de variveis referenciadas por um nome, fornecendo uma maneira conveniente de atribuir informaes (variveis) relacionadas de forma agrupada A denio de uma estrutura um modelo a ser seguido por todas as variveis de seu tipo As variveis que compreendem a estrutura so tambm conhecidas como campos ou atributos da estrutura
Ricardo Terra (rterrabh@gmail.com) Linguagem C 1 de agosto de 2012 146 / 341

Sintaxe Bsica Estruturas

O exemplo abaixo cria uma estrutura para representao de uma data:


2

struct int int int }

data { dia ; mes ; ano ;

Para declarar uma varivel do tipo data, faz-se como abaixo: struct data d;

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

147 / 341

Sintaxe Bsica Estruturas Instruo typedef A instruo typedef permite denotar novos nomes linguagem Assim, pode-se utilizar o comando typedef para que se simplicar a declarao de variveis de estrutura Exemplo
1

typedef s t r u c t { i n t dia ; i n t mes ; i n t ano ; } data ;

Assim, a estrutura simplesmente conhecida como data e declarao se faz como um tipo primitivo (char, int etc) data d;
Ricardo Terra (rterrabh@gmail.com) Linguagem C 1 de agosto de 2012 148 / 341

Sintaxe Bsica Estruturas Exemplo struct Atribuio e Acesso aos elementos


1

#include < s t d i o . h> typedef int int int } data ; struct { dia ; mes ; ano ;

11

13

i n t main ( i n t argc , char argv [ ] ) { data d ; d . dia = 3 1 ; d . mes = 1 2 ; d . ano = 1999; p r i n t f ( "A data e %2.d/%2.d/%4.d\n " , d . dia , d . mes , d . ano ) ; return 0; }

15

17

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

149 / 341

Sintaxe Bsica Estruturas Exemplo struct Leitura e Acesso aos elementos


#include < s t d i o . h>
2

typedef int int int } data ;

struct { dia ; mes ; ano ;

10

i n t main ( i n t argc , char argv [ ] ) { data d ; scanf ( "%d " , &d . dia ) ; scanf ( "%d " , &d . mes ) ; scanf ( "%d " , &d . ano ) ; p r i n t f ( "A data e %2.d/%2.d/%4.d\n " , d . dia , d . mes , d . ano ) ; return 0; }

12

14

16

18

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

150 / 341

Sintaxe Bsica Estruturas

Exemplos (struct) Vamos a seguir, ver e entender mais exemplos utilizando estruturas

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

151 / 341

Sintaxe Bsica Estruturas

Exemplo 1 Um exemplo que possui uma estrutura chamada cliente e que, dentro dessa estrutura, possui um campo do tipo endereco (outra estrutura), i.e., um cliente possui suas informaes e ainda possui um endereo Nesse exemplo, sero lidos todos os dados de um cliente e depois sero impressos os dados lidos (observe a notao ponto para acessar os membros de uma estrutura)

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

152 / 341

Sintaxe Bsica Estruturas


1

#include < s t d i o . h> typedef s t r u c t { char logradouro [ 6 0 ] ; i n t numero ; } endereco ; typedef s t r u c t { i n t codigo ; char nome[ 6 0 ] ; endereco e ; } cliente ; i n t main ( i n t argc , char argv [ ] ) { cliente c; p r i n t f ( " Codigo : " ) ; scanf ( "%d " , &c . codigo ) ; p r i n t f ( "Nome: " ) ; gets ( c .nome) ; p r i n t f ( " Logradouro : " ) ; gets ( c . e . logradouro ) ; p r i n t f ( " Numero : " ) ; scanf ( "%d " , &c . e . numero ) ; p r i n t f ( " Cliente %d : %s r e s i d e em %s , %d\n " , c . codigo , c .nome, c . e . logradouro , c . e . numero ) ; return 0; }

11

13

15

17

19

21

23

25

27

29

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

153 / 341

Sintaxe Bsica Estruturas

Exemplo 2 Um exemplo que possui uma estrutura chamada carro e que, dentro dessa estrutura, possui um campo do tipo proprietario (outra estrutura), i.e., um carro possui suas informaes e ainda possui um proprietrio Nesse exemplo, sero atribudos todos os dados de um carro e depois sero impressos os dados atribudos (observe a notao ponto para acessar os membros de uma estrutura)

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

154 / 341

Sintaxe Bsica Estruturas


#include < s t d i o . h> #include < s t r i n g . h> typedef s t r u c t { i n t rg ; char nome[ 6 0 ] ; } proprietario ; typedef s t r u c t { char modelo [ 3 0 ] ; i n t ano ; char placa [ 7 ] ; proprietario p; } carro ; i n t main ( i n t argc , char argv [ ] ) { carro c ; s t r c p y ( c . modelo , "GOL" ) ; c . ano = 2010; strncpy ( c . placa , " BAD0007 " , 7 ) ; c . p . rg = 10200300; s t r c p y ( c . p .nome, " Ricardo T e r r a " ) ; p r i n t f ( "CARRO: %s , ano %d , placa %.7 s \n " , c . modelo , c . ano , c . placa ) ; p r i n t f ( " PROPRIETARIO : %s (RG: %d) " , c . p .nome, c . p . rg ) ; return 0; }

10

12

14

16

18

20

22

24

26

28

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

155 / 341

Sintaxe Bsica Estruturas Dica: A atribuio pode ser simplicada


Observe declarao da varivel carro
#include < s t d i o . h> #include < s t r i n g . h> typedef s t r u c t { i n t rg ; char nome[ 6 0 ] ; } proprietario ; typedef s t r u c t { char modelo [ 3 0 ] ; i n t ano ; char placa [ 7 ] ; proprietario p; } carro ; i n t main ( i n t argc , char argv [ ] ) { carro c = { "GOL" , 2010 , " BAD0007 " , { 10200300 , " Ricardo T e r r a " } } ; p r i n t f ( "CARRO: %s , ano %d , placa %.7 s \n " , c . modelo , c . ano , c . placa ) ; p r i n t f ( " PROPRIETARIO : %s (RG: %d) " , c . p .nome, c . p . rg ) ; return 0;
23

11

13

15

17

19

21

} Linguagem C 1 de agosto de 2012 156 / 341

Ricardo Terra (rterrabh@gmail.com)

Sintaxe Bsica Estruturas

Exemplo 2 Um exemplo que possui uma estrutura chamada aluno e que, dentro dessa estrutura, possui um campo do tipo disciplina (outra estrutura) que possui um campo do tipo professor (outra estrutura), i.e., um aluno possui uma nica disciplinas que est vinculada a um professor Nesse exemplo, sero atribudos todos os dados de um aluno e depois sero impressos os dados lidos (observe a notao ponto para acessar os membros de uma estrutura)

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

157 / 341

Sintaxe Bsica Estruturas


1

#include < s t d i o . h> typedef s t r u c t { i n t ctps ; char nome[ 6 0 ] ; } professor ; typedef s t r u c t { i n t codigo ; char nome[ 6 0 ] ; p r o f e s s o r prof ; } disciplina ; typedef s t r u c t { i n t matricula ; char nome[ 6 0 ] ; d i s c i p l i n a disc ; } aluno ; i n t main ( i n t argc , char argv [ ] ) { aluno a = { 40 , "JORGE" , { 1 , " ED I " , { 1001 , " T e r r a " } } } ; p r i n t f ( "%d\n " p r i n t f ( "%s \n " p r i n t f ( "%d\n " p r i n t f ( "%s \n " p r i n t f ( "%d\n " p r i n t f ( "%s \n " return 0; , , , , , , a . matricula ) ; a .nome) ; a . disc . codigo ) ; a . disc .nome) ; a . disc . prof . ctps ) ; a . disc . prof .nome) ;

11

13

15

17

19

21

23

25

27

29

31

} Linguagem C 1 de agosto de 2012 158 / 341

Ricardo Terra (rterrabh@gmail.com)

Contedo

1 2 3

Introduo Sintaxe Bsica Ponteiros Conceitualizao Aritmtica Alocao Dinmica de Memria Alocao Dinmica de Arranjos Multidimensionais Tpicos Relevantes Extras

4 5

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

159 / 341

Ponteiros
Conceitualizao

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

160 / 341

Ponteiros Conceitualizao

O que so ponteiros? Um ponteiro uma varivel que contm um endereo de memria


Esse endereo normalmente a posio de uma outra varivel na memria

Se uma varivel contm o endereo de uma outra, ento a primeira varivel dita apontar para a segunda
Eis a origem do nome ponteiro

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

161 / 341

Ponteiros Conceitualizao Variveis ponteiros? Se uma varivel ir conter um ponteiro, ela deve ser declarada como tal. A forma geral para declarar uma varivel ponteiro :
tipo *nome;

Um ponteiro aponta para uma outra variavl. Contudo, em sua inicializao como em todos os tipos de variveis seu valor inicial lixo de memria. Utilizando NULL, pode-se criar um ponteiro e apont-lo para nulo
int *p = NULL;

Para imprimir o endereo de memria, utiliza-se %p


printf("O ponteiro p aponta para %p", p);
Ricardo Terra (rterrabh@gmail.com) Linguagem C 1 de agosto de 2012 162 / 341

Ponteiros Conceitualizao Os operadores de ponteiros Inicialmente, existem dois operadores especiais para ponteiros: * e & O operador & um operador unrio que devolve o endereo na memria do seu operando Exemplo
1

#include < s t d i o . h> i n t main ( i n t argc , char argv [ ] ) { i n t count = 100; i n t p ; p = &count ; p r i n t f ( "O endereco apontado por p e %p " , p ) ; return 0; }
Linguagem C 1 de agosto de 2012 163 / 341

11

Ricardo Terra (rterrabh@gmail.com)

Ponteiros Conceitualizao

Os operadores de ponteiros colocado em p o endereo da memria que contm a varivel count


Esse endereo a posio interna ao computador daquela varivel

O endereo no tem relao alguma com o valor de count O operador & pode ser imaginado como o endereo de, assim como o comando de atribuio do ltimo exemplo signica p recebe o endereo de count

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

164 / 341

Ponteiros Conceitualizao Os operadores de ponteiros O operador * o complemento de &. um operador unrio que devolve o valor da varivel localizada no endereo que o segue
int q = *p;

Sabendo que p contm o endereo da varivel count, i.e., p aponta para count podemos pensar no resultado de duas maneiras:
o exemplo coloca o valor de count em q o exemplo coloca o valor da varivel apontada por p em q

O operador * pode ser imaginado como no endereo apontado por , assim como o exemplo acima signica q recebe o valor que est no endereo apontado por p
Ricardo Terra (rterrabh@gmail.com) Linguagem C 1 de agosto de 2012 165 / 341

Ponteiros Conceitualizao Exemplo


#include < s t d i o . h>
2

i n t main ( i n t argc , char argv [ ] ) { i n t count = 100; i n t p ; p = &count ;

10

12

p r i n t f ( "%d " , p ) ; p = 3 4 ; p r i n t f ( "%d " , count ) ; p r i n t f ( "%d " , p ) ; / return 0; }

/ Imprimira 100 / / Altera v a l o r de count para 34 / / Imprimira 34 / Imprimira 34 /

14

Observe que pode-se imprimir ou alterar o valor a partir do ponteiro para a varivel
Ricardo Terra (rterrabh@gmail.com) Linguagem C 1 de agosto de 2012 166 / 341

Ponteiros Conceitualizao

Exemplo 1
1

#include < s t d i o . h> i n t main ( i n t argc , char argv [ ] ) { i n t x = 2; i n t p ; p = &x ; / Ponteiro recebe o endereco de x / p = 4 ; / O endereco apontado por p , recebe 4 / p r i n t f ( " v a l o r de x : %d\n " , x ) ; / Imprimira 4 /

11

return 0;
13

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

167 / 341

Ponteiros Conceitualizao

Exemplo 2
1

#include < s t d i o . h> i n t main ( i n t argc , char argv [ ] ) { i n t x = 2; i n t p1 , p2 ; / Um ponteiro so recebe um endereco ou um outro ponteiro / p1 = &x ; p2 = p1 ; p r i n t f ( "%p = %p? Apontam para o mesmo endereco?\n " , p1 , p2 ) ; p r i n t f ( " Valor apontado por p1 : %d\n " , p1 ) ; / Imprimira 2 / p r i n t f ( " Valor apontado por p2 : %d\n " , p2 ) ; / Imprimira 2 / return 0;

11

13

15

17

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

168 / 341

Ponteiros Conceitualizao Passagem por valor A conveno de C de passagem de parmetros por valor, isto , quando se passa o valor de uma varivel para uma funo, tem-se a certeza que seu valor no ser alterado Exemplo
1

#include < s t d i o . h> void incrementa ( i n t x ) { x ++; / Incrementa x / } i n t main ( i n t argc , char argv [ ] ) { i n t x = 10; incrementa ( x ) ; / Passei o v a l o r de x / p r i n t f ( " v a l o r de x : %d\n " , x ) ; / Imprimira 10 / return 0; }

11

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

169 / 341

Ponteiros Conceitualizao

Simulando uma chamada por referncia Muito embora a conveno de C de passagem de parmetros seja por valor, voc pode simular uma chamada por referncia Para isso, passa-se o endereo de uma varivel para um ponteiro (parmetro formal de uma funo) Isso faz com que o endereo da varivel seja passado funo e, desse modo, voc pode alterar o valor da varivel fora da funo
Contudo, isso no se qualica como passagem por referncia, uma vez que o endereo da varivel copiado para o ponteiro, i.e., ainda passagem por valor

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

170 / 341

Ponteiros Conceitualizao Simulando uma chamada por referncia Endereos de variveis so passados para as funes de forma simples
Obviamente necessrio declarar os parmetros formais da funo como do tipo ponteiro

Exemplo
#include < s t d i o . h>
2

void incrementa ( i n t x ) { ( x ) + + ; / Incrementa o v a l o r da v a r i a v e l apontada por x / } i n t main ( i n t argc , char argv [ ] ) { i n t x = 10; incrementa(& x ) ; / Passei o endereco de x / p r i n t f ( " v a l o r de x : %d\n " , x ) ; / Imprimira 11 / return 0; }

10

12

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

171 / 341

Ponteiros Conceitualizao Exemplo - Funo de troca de valores


#include < s t d i o . h>
2

void troca ( i n t , i n t ) ; / Prototipo /


4

i n t main ( i n t argc , char argv [ ] ) { i n t x = 2 , y = 4; p r i n t f ( " x = %d e y = %d\n " , x , y ) ; troca (& x , &y ) ; p r i n t f ( " x = %d e y = %d\n " , x , y ) ; return 0; }

10

12

14

16

18

void troca ( i n t x , i n t y ) { / Observe o uso do a s t e r i s c o ( ) / i n t temp = x ; x = y ; y = temp ; }

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

172 / 341

Ponteiros Conceitualizao Exemplo - Funo de troca de valores (hardcore)


1

#include < s t d i o . h> void troca ( i n t , i n t ) ; / Prototipo / i n t main ( i n t argc , char argv [ ] ) { i n t x = 2 , y = 4; p r i n t f ( " x = %d e y = %d\n " , x , y ) ; troca (& x , &y ) ; p r i n t f ( " x = %d e y = %d\n " , x , y ) ; return 0;

11

13

} void troca ( i n t x , i n t y ) { / sem uso de v a r i a v e l a u x i l i a r / x += y ; / x = ( x + y ) / y = x y ; / y = ( x + y ) y = x / x = y ; / x = ( x + y ) x = y / }

15

17

19

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

173 / 341

Ponteiros
Aritmtica

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

174 / 341

Ponteiros Aritmtica Arranjos e Ponteiros Arranjos e ponteiros so intimamente relacionados em C O nome de um arranjo um ponteiro constante para o primeiro elemento do arranjo Exemplo: double v[5]; Logo, as seguintes sintaxes so equivalentes:
*v v[0] v &v[0]

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

175 / 341

Ponteiros Aritmtica

Logo, so assinaturas equivalentes de funes: void funcao (float v[], int tam) ou void funcao (float *v, int tam) Logo, so chamadas equivalentes s funes: funcao(v, tam); ou funcao(&v[0], tam);

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

176 / 341

Ponteiros Aritmtica

Possveis operaes: Sejam p, pa e pb ponteiros e i um nmero inteiro p + i ponteiro p deslocado i elementos para direita p - i ponteiro p deslocado i elementos para esquerda pa - pb retorna a distncia, em elementos, entre os ponteiros pa e pb

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

177 / 341

Ponteiros Aritmtica

Portanto, segue-se que: double v[5]; v[0] = 1.4; *v = 1.4; v[2] = 1.6; *(v+2) = 1.6;

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

178 / 341

Ponteiros Aritmtica

Aritmtica de Ponteiros: + e Movimentam um ponteiro levando em considerao o tamanho do tipo do elemento Observe:
1

float v [5]; f l o a t p ; p = v; p = v + 2; p;

/ Ponteiro p est apontando para v [ 0 ] / / Ponteiro p est apontando para v [ 2 ] / / Ponteiro p est apontando para v [ 1 ] /

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

179 / 341

Ponteiros Aritmtica

Exemplo 1 Assim que se iterava um arranjo:


1

#include < s t d i o . h> i n t main ( i n t argc , char argv [ ] ) { i n t i , v [ ] = { 13 , 15 , 17 , 19 , 21 } ; i n t tam = s i z e o f ( v ) / s i z e o f ( i n t ) ; f o r ( i = 0 ; i < tam ; i ++) { p r i n t f ( "%d\ t " , v [ i ] ) ; } return 0; }

11

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

180 / 341

Ponteiros Aritmtica

Exemplo 2 - Arranjo de inteiros Agora, assim que se itera um arranjo:


#include < s t d i o . h>
2

i n t main ( i n t argc , char argv [ ] ) { i n t i , v [ ] = { 13 , 15 , 17 , 19 , 21 } ; i n t tam = s i z e o f ( v ) / s i z e o f ( i n t ) ; i n t p ; f o r ( i = 0 , p = v ; i < tam ; i ++ , p++) { p r i n t f ( "%d\ t " , p ) ; } return 0; }

10

12

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

181 / 341

Ponteiros Aritmtica

Exemplo 2 - Arranjo de caracteres Idntico ao anterior, porm o arranjo de caracteres


1

#include < s t d i o . h> i n t main ( i n t argc , char argv [ ] ) { char vogais [ ] = { 65 , E , I , 79 , U } ; i n t i , tam = s i z e o f ( vogais ) / s i z e o f ( char ) ; char p ; f o r ( i = 0 , p = vogais ; i < tam ; i ++ , p++) { p r i n t f ( "%c\ t " , p ) ; } return 0;

11

13

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

182 / 341

Ponteiros Aritmtica Exemplo 3 Se alm de um ponteiro para o primeiro elemento tivermos um outro ponteiro para o ltimo elemento, pode-se iterar sem as variveis i e tam:
1

#include < s t d i o . h> i n t main ( i n t argc , char argv [ ] ) { i n t v [ ] = { 13 , 15 , 17 , 19 , 21 } ; i n t p , q ; i n t tam = s i z e o f ( v ) / s i z e o f ( i n t ) ; f o r ( p = v , q = v + tam 1 ; p <= q ; p++) { p r i n t f ( "%d\ t " , p ) ; } return 0;

11

13

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

183 / 341

Ponteiros Aritmtica Ponteiros para estrutura A linguagem C ANSI permite ponteiros para estruturas exatamente como permite ponteiros para os outros tipos de variveis, como char, int, float... Sintaxe:
<nome-da-estrutura> *p;

Exemplos:
pessoa *p; aluno *p; disciplina *p;

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

184 / 341

Ponteiros Aritmtica

Ponteiros para estrutura Para acessar os membros de uma estrutura utilizando um ponteiro para aquela estrutura, voc pode e deve usar o operador -> Por exemplo, seja p um ponteiro para conta. Assim:
p->saldo equivale a (*p).saldo

O operador seta (->) substitui o asterisco e o ponto importante mencionar que s funciona quando se tem um ponteiro para estrutura

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

185 / 341

Ponteiros Aritmtica Exemplo 4 - Manipulando estruturas atravs de um ponteiro


1

#include < s t d i o . h> typedef s t r u c t { i n t numero ; char c o r r e n t i s t a [ 6 0 ] ; f l o a t saldo ; } conta ; i n t main ( i n t argc , char argv [ ] ) { conta c ; conta p ; p = &c ; scanf ( "%d " , &(p>numero ) ) ; gets ( p>c o r r e n t i s t a ) ; scanf ( "%f " , &(p>saldo ) ) ; p r i n t f ( " (%d) %s tem $%.2 f " , p>numero , p>c o r r e n t i s t a , p>saldo ) ;

11

13

15

17

19

return 0;
21

}
Linguagem C 1 de agosto de 2012 186 / 341

Ricardo Terra (rterrabh@gmail.com)

Ponteiros Aritmtica Exemplo 5 - Manipulando estruturas atravs de um ponteiro


1

#include < s t d i o . h>


2

typedef s t r u c t { i n t numero ; char c o r r e n t i s t a [ 6 0 ] ; f l o a t saldo ; } conta ; / Prototipo / void t r a n s f e r i r ( conta origem , conta destino , f l o a t valor ) ;

i n t main ( i n t argc , char argv [ ] ) { conta contaA = { 1 , "CARLOS MACIEL " , 300.00 } ; conta contaB = { 2 , "RICARDO TERRA " , 200.00 } ; t r a n s f e r i r (&contaA , &contaB , 4 0 . 0 0 ) ;

8 9

10

11

12

p r i n t f ( " (%d) %s agora contaA . numero , contaA . saldo ) ; p r i n t f ( " (%d) %s agora contaB . numero , contaB . saldo ) ; return 0; }

tem $%.2 f \n " , contaA . c o r r e n t i s t a , tem $%.2 f \n " , contaB . c o r r e n t i s t a ,

14

16

18

20

22

void t r a n s f e r i r ( conta origem , conta destino , f l o a t valor ) { origem>saldo = v a l o r ; destino >saldo += v a l o r ; }

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

187 / 341

Ponteiros Aritmtica Exemplo 6 - Manipulando estruturas atravs de um ponteiro


1

#include < s t d i o . h> typedef s t r u c t { i n t matricula ; char nome[ 6 0 ] ; } aluno ; / P r o t o t i p o s / void l e ( aluno p ) ; void imprime ( aluno p ) ; i n t main ( i n t argc , char argv [ ] ) { aluno a ; l e (&a ) ; imprime(&a ) ; return 0; } void l e ( aluno p ) { scanf ( "%d " , &(p>matricula ) ) ; gets ( p>nome) ; } void imprime ( aluno p ) { p r i n t f ( "%d %s " , p>matricula , p>nome) ; }

11

13

15

17

19

21

23

25

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

188 / 341

Ponteiros Aritmtica Exemplo 7 - Manipulando estruturas que possuem outras estruturas


#include < s t d i o . h>
2 2

i n t main ( i n t argc , char argv [ ] ) { aluno a ; l e (&a ) ; imprime(&a ) ; return 0;

typedef s t r u c t { i n t codigo ; char nome[ 6 0 ] ; } disciplina ; typedef s t r u c t { i n t matricula ; char nome[ 6 0 ] ; disciplina d; } aluno ; / P r o t o t i p o s / void l e ( aluno p ) ; void imprime ( aluno p ) ;

} void l e ( aluno p ) { scanf ( "%d " , &(p>matricula ) ) ; gets ( p>nome) ; scanf ( "%d " , &(p>d . codigo ) ) ; gets ( p>d .nome) ; } void imprime ( aluno p ) { p r i n t f ( "%d %s %d %s " , p>matricula , p>nome, p>d . codigo , p>d .nome) ; }

10

10

12

12

14

14

16

16

18

20

22

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

189 / 341

Ponteiros Aritmtica Exemplo 8 - Manipulando arranjos de estruturas


1

#include < s t d i o . h> typedef s t r u c t { i n t matricula ; char nome[ 6 0 ] ; } aluno ; / P r o t o t i p o s / void l e ( aluno v , i n t tam ) ; void imprime ( aluno v , i n t tam ) ; i n t main ( i n t argc , char argv [ ] ) { aluno v [ 3 ] ; i n t tam = s i z e o f ( v ) / s i z e o f ( aluno ) ; l e ( v , tam ) ; imprime ( v , tam ) ; return 0;

void l e ( aluno v , i n t tam) { int i ; aluno p ; f o r ( i = 0 , p = v ; i < tam ; i ++ , p++) { scanf ( "%d " , &(p>matricula ) ) ; gets ( p>nome) ; } } void imprime ( aluno v , i n t tam) { int i ; aluno p ; f o r ( i = 0 , p = v ; i < tam ; i ++ , p++) { p r i n t f ( " [%d] %d %s \n " , i , p>matricula , p>nome) ; } }

11

11

13

13

15

15

17

17

19

21

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

190 / 341

Ponteiros
Alocao Dinmica de Memria

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

191 / 341

Ponteiros Alocao Dinmica de Memria Alocao Dinmica de Memria Estruturas de dados estticas tm seu espao pr-determinado a tempo de compilao Ento, como criar um arranjo que saiba o tamanho durante a execuo do programa? Por exemplo, isto est ERRADO!
1

i n t main ( i n t argc , char argv [ ] ) { int x; scanf ( "%d " , &x ) ; i n t v [ x ] ; / Completamente Errado / / . . . / return 0; }

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

192 / 341

Ponteiros Alocao Dinmica de Memria

Alocao Dinmica de Memria Assim, estruturas dinmicas tm seu tamanho determinado em tempo de execuo Para isso, existem mecanismos que permitam fazer alocao dinmica de memria em tempo de execuo Memria pode ser alocada de uma regio chamada heap Memria alocada da heap DEVE ser devolvida quando no for mais utilizada

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

193 / 341

Ponteiros Alocao Dinmica de Memria

Funes para manipulao da heap Encontram-se na biblioteca stdlib.h


malloc, calloc, realloc, free...

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

194 / 341

Ponteiros Alocao Dinmica de Memria

Funo malloc Solicita memria ao sistema Sintaxe: void* malloc (int tam)
void* ponteiro de tipo no especicado necessita de typecast tam quantidade de bytes a serem alocados

Retorno de malloc um ponteiro sem tipo para o incio da rea alocada

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

195 / 341

Ponteiros Alocao Dinmica de Memria

Funo free Libera memria ao sistema Sintaxe: void free (void *p)
void *p um ponteiro que aponta para uma rea alocada com malloc, ou melhor, deve ser passado o endereo do incio da rea alocada pelo malloc

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

196 / 341

Ponteiros Alocao Dinmica de Memria Exemplo 1: Alocao de 100 caracteres (Observe o


2

typecast)

#include < s t d i o . h> #include < s t d l i b . h> i n t main ( i n t argc , char argv [ ] ) { char pc ; pc = ( char ) malloc (100 s i z e o f ( char ) ) ; gets (pc ) ; p r i n t f ( "%s " , pc ) ; f r e e (pc ) ; return 0; }

10

12

Pergunta: Sempre conseguir alocar a memria desejada?


Ricardo Terra (rterrabh@gmail.com) Linguagem C 1 de agosto de 2012 197 / 341

Ponteiros Alocao Dinmica de Memria IMPORTANTE: Em caso de erro, isto , no conseguir memria disponvel para efetuar a alocao, a funo malloc retorna NULL Exemplo 2: Alocao de x inteiros (Observe o
1

typecast)

#include < s t d i o . h> #include < s t d l i b . h> i n t main ( i n t argc , char argv [ ] ) { int x; i n t pi ; scanf ( "%d " , &x ) ; p i = ( i n t ) malloc ( x s i z e o f ( i n t ) ) ; i f ( p i == NULL ) { p r i n t f ( " Memoria I n s u f i c i e n t e . Programa encerrado . " ) ; r e t u r n 1; } p i [ 5 ] = 4 4 ; / Considere x > 5 / / v a r i a s outras operacoes / free ( pi ) ; return 0; } Linguagem C 1 de agosto de 2012 198 / 341

11

13

15

17

19

21

Ricardo Terra (rterrabh@gmail.com)

Ponteiros Alocao Dinmica de Memria

Exemplo 3: Alocao de x pontos utuantes de preciso dupla


(Observe o teste)
1

#include < s t d i o . h> #include < s t d l i b . h> i n t main ( i n t argc , char argv [ ] ) { int x; double pd ; scanf ( "%d " , &x ) ; pd = ( double ) malloc ( x s i z e o f ( double ) ) ; if ( ! pd) { / Mais P r o f i s s i o n a l / p r i n t f ( " Memoria I n s u f i c i e n t e . Programa encerrado . " ) ; r e t u r n 1;

11

13

} pd[ 5 ] = 4 4 ; / Considere x > 5 / / v a r i a s outras operacoes / f r e e (pd ) ; return 0; }

15

17

19

21

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

199 / 341

Ponteiros Alocao Dinmica de Memria Exemplo Completo: Alocao, inicializao e liberao de um arranjo de ponto utuante
1

#include < s t d i o . h> #include < s t d l i b . h> i n t main ( i n t argc , char argv [ ] ) { f l o a t v ; i n t tam , i ; scanf ( "%d " , &tam ) ; v = ( f l o a t ) malloc ( tam s i z e o f ( f l o a t ) ) ; i f ( ! v ) { / V e r i f i c a se conseguiu alocar / p r i n t f ( " Memoria I n s u f i c i e n t e . Programa encerrado . " ) ; r e t u r n 1; } f o r ( i = 0 ; i < tam ; i ++) { / I n i c i a l i z a o arranjo / v[ i ] = 0; } / v a r i a s outras operacoes / f r e e ( v ) ; / Libera a area de memoria alocada / return 0; }

11

13

15

17

19

21

23

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

200 / 341

Ponteiros Alocao Dinmica de Memria

Exemplo Anterior j com Aritmtica de Ponteiros


1

#include < s t d i o . h> #include < s t d l i b . h> i n t main ( i n t argc , char argv [ ] ) { f l o a t v , p ; i n t tam , i ; scanf ( "%d " , &tam ) ; v = ( f l o a t ) malloc ( tam s i z e o f ( f l o a t ) ) ; i f ( ! v ) { / V e r i f i c a se conseguiu alocar / p r i n t f ( " Memoria I n s u f i c i e n t e . Programa encerrado . " ) ; r e t u r n 1; } f o r ( p = v , i = 0 ; i < tam ; i ++ , p++) { / I n i c i a l i z a o arranjo / p = 0 ; } / v a r i a s outras operacoes / f r e e ( v ) ; / Libera a area de memoria alocada / return 0; }

11

13

15

17

19

21

23

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

201 / 341

Ponteiros Alocao Dinmica de Memria Exemplo Completo: Alocao, inicializao e liberao de um arranjo de estrutura com Aritmtica de Ponteiros
1

#include < s t d i o . h> #include < s t d l i b . h> typedef s t r u c t { i n t matricula ; char nome[ 6 0 ] ; } aluno ; i n t main ( i n t argc , char argv [ ] ) { aluno v , p ; i n t tam , i ; scanf ( "%d " , &tam ) ; v = ( aluno ) malloc ( tam s i z e o f ( aluno ) ) ; / V e r i f i c a se conseguiu alocar / i f (! v) { p r i n t f ( "Mem. I n s u f i c i e n t e . " ) ; r e t u r n 1; }

/ I n i c i a l i z a o arranjo / f o r (p = v , i = 0 ; i < tam ; i ++ , p++) { scanf ( "%d " , &(p>matricula ) ) ; gets (p>nome) ; } / Imprime o arranjo / f o r (p = v , i = 0 ; i < tam ; i ++ , p++) { p r i n t f ( "%d %s \n " , p>matricula , p>nome) ; } / Libera a area de memoria alocada / free ( v ) ; return 0; }

11

11

13

13

15

15

17

19

21

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

202 / 341

Ponteiros
Alocao Dinmica de Arranjos Multidimensionais

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

203 / 341

Ponteiros Alocao Dinmica de Arranjos Multidimensionais Ponteiro para ponteiro Como sabemos, um arranjo de inteiros um ponteiro para inteiros:
int vA[] int *vA

Logo, um arranjo bidimensional de inteiros um arranjo de ponteiros para inteiros:


int vA[][] int *vA[] int **vA

por isso que a assinatura do mtodo main pode ser:


int main (int argc, char int main (int argc, char argv[][]) *argv[] ) )
1 de agosto de 2012 204 / 341

int main (int argc, char **argv


Ricardo Terra (rterrabh@gmail.com) Linguagem C

Ponteiros Alocao Dinmica de Arranjos Multidimensionais Exemplo 1


#include < s t d i o . h>
2

i n t main ( i n t argc , char argv [ ] ) { f l o a t f 1 = 27 , f 2 = 13 , pf1 , pf2 , ppf1 , ppf2 ; pf1 = &f 1 ; pf2 = &f 2 ; p r i n t f ( " %.2 f %.2 f \n " , pf1 , pf2 ) ; / Imprimira 27.00 13.00 / ppf1 = &pf1 ; ppf2 = &pf2 ; ppf1 = pf1 1 ; ppf2 = pf2 + 1 ; p r i n t f ( " %.2 f %.2 f \n " , ppf1 , ppf2 ) ; / Imprimira 26.00 14.00 / return 0; }

10

12

14

16

18

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

205 / 341

Ponteiros Alocao Dinmica de Arranjos Multidimensionais Alocao Dinmica de Arranjos Multidimensionais Assim como possvel com um arranjo, pode-se alocar arranjos multidimensionais dinamicamente Ento, como criar um arranjo mutidimensional que se saiba seu tamanho durante a execuo do programa? Por exemplo, isto est ERRADO!
1

i n t main ( i n t argc , char argv [ ] ) { int x, y; scanf ( "%d %d " , &x , &y ) ; i n t mat [ x ] [ y ] ; / Completamente Errado / / . . . / return 0; }

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

206 / 341

Ponteiros Alocao Dinmica de Arranjos Multidimensionais Matriz Matriz um arranjo bidimensional. Na verdade, pode ser pensado como um arranjo de arranjos A imagem abaixo apresenta como visualmente raciocinada uma matriz e como a sua respectiva estrutura de dados

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

207 / 341

Ponteiros Alocao Dinmica de Arranjos Multidimensionais Exemplo 2: Alocao de matriz x x y


#include < s t d i o . h> #include < s t d l i b . h> / Prototipo / i n t soma( i n t mat , i n t x , i n t y ) ; i n t main ( i n t argc , char argv [ ] ) { i n t mat ; int x, y, i , j ; scanf ( "%d " , &x ) ; scanf ( "%d " , &y ) ; mat = ( i n t ) malloc ( x s i z e o f ( i n t ) ) ; i f ( ! mat ) { p r i n t f ( "MEM. INSUFICIENTE . " ) ; r e t u r n 1; } f o r ( i = 0 ; i < x ; i ++) { mat [ i ] = ( i n t ) malloc ( y sizeof ( int ) ) ; i f ( ! mat [ i ] ) { p r i n t f ( "MEM. INSUFICIENTE . " ) ; r e t u r n 1; } } f o r ( i = 0 ; i < x ; i ++) { f o r ( j = 0 ; j < y ; j ++) { scanf ( "%d " , &mat [ i ] [ j ] ) ; } } p r i n t f ( "SOMA DOS ELEMENTOS : %d " , soma( mat , x , y ) ) ; f o r ( i = 0 ; i < x ; i ++) { free ( mat [ i ] ) ; } free ( mat ) ; return 0; }
18

10

10

12

12

14

14

16

16

18

20

20

22

22

24

24

26

26

i n t soma( i n t mat , i n t x , i n t y ) { i n t i , j , soma = 0 ; f o r ( i = 0 ; i < x ; i ++) { f o r ( j = 0 ; j < y ; j ++) { soma += mat [ i ] [ j ] ; } } r e t u r n soma ; } 1 de agosto de 2012 208 / 341

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

Ponteiros Alocao Dinmica de Arranjos Multidimensionais

Observe o que faz o seguinte cdigo (suponha x = 2):


1

mat = ( i n t ) malloc ( x s i z e o f ( i n t ) ) ;

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

209 / 341

Ponteiros Alocao Dinmica de Arranjos Multidimensionais E o que faz o seguinte cdigo de repetio (suponha y = 3):
2

f o r ( i = 0 ; i < x ; i ++) { mat [ i ] = ( i n t ) malloc ( y sizeof ( int ) ) ; i f ( ! mat [ i ] ) { p r i n t f ( "MEM. INSUFICIENTE . " ) ; r e t u r n 1; } }

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

210 / 341

Ponteiros Alocao Dinmica de Arranjos Multidimensionais Matriz quadrada Matriz quadrada um tipo especial de matriz cujo nmero de linhas igual ao nmero de colulas A imagem abaixo apresenta como visualmente raciocinada uma matriz quadrada e como a sua respectiva estrutura de dados

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

211 / 341

Ponteiros Alocao Dinmica de Arranjos Multidimensionais Exemplo 3: Alocao de matriz quadrada


1

#include < s t d i o . h> #include < s t d l i b . h> / Prototipo / i n t soma( i n t mat , i n t tam ) ; i n t main ( i n t argc , char argv [ ] ) { i n t mat ; i n t tam , i , j ; scanf ( "%d " , &tam ) ; mat = ( i n t ) malloc ( tam s i z e o f ( i n t ) ) ; i f ( ! mat ) { p r i n t f ( "MEM. INSUFICIENTE . " ) ; r e t u r n 1; } f o r ( i = 0 ; i < tam ; i ++) { mat [ i ] = ( i n t ) malloc ( tam sizeof ( int ) ) ; i f ( ! mat [ i ] ) { p r i n t f ( "MEM. INSUFICIENTE . " ) ; r e t u r n 1; } }

f o r ( i = 0 ; i < tam ; i ++) { f o r ( j = 0 ; j < tam ; j ++) { scanf ( "%d " , &mat [ i ] [ j ] ) ; } } p r i n t f ( "SOMA DOS ELEMENTOS : %d " , soma( mat , tam ) ) ; f o r ( i = 0 ; i < tam ; i ++) { free ( mat [ i ] ) ; } free ( mat ) ;

11

11

13

13

15

15

return 0;
17

17

} i n t soma( i n t mat , i n t tam ) { i n t i , j , soma = 0 ; f o r ( i = 0 ; i < tam ; i ++) { f o r ( j = 0 ; j < tam ; j ++) { soma += mat [ i ] [ j ] ; } } r e t u r n soma ; } 1 de agosto de 2012 212 / 341

19

19

21

21

23

23

25

25

27

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

Ponteiros Alocao Dinmica de Arranjos Multidimensionais Matriz triangular Matriz triangular um tipo especial de matriz quadrada em que todos os elementos acima (triangular superior) ou abaixo (triangular inferior) da diagonal principal so nulos A imagem abaixo apresenta como visualmente raciocinada uma matriz triangular inferior e como a sua respectiva estrutura de dados

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

213 / 341

Ponteiros Alocao Dinmica de Arranjos Multidimensionais Exemplo 4: Alocao de matriz triangular inferior
#include < s t d i o . h> #include < s t d l i b . h> / Prototipo / i n t soma( i n t mat , i n t tam ) ; i n t main ( i n t argc , char argv [ ] ) { i n t mat ; i n t tam , i , j ; scanf ( "%d " , &tam ) ;
12 1

3 4

f o r ( i = 0 ; i < tam ; i ++) { f o r ( j = 0 ; j < ( i + 1 ) ; j ++) { scanf ( "%d " , &mat [ i ] [ j ] ) ; } } p r i n t f ( "SOMA DOS ELEMENTOS : %d " , soma( mat , tam ) ) ; f o r ( i = 0 ; i < tam ; i ++) { free ( mat [ i ] ) ; } free ( mat ) ;

6 7

10 11

14

16

mat = ( i n t ) malloc ( tam s i z e o f ( i n t ) ) ; i f ( ! mat ) { p r i n t f ( "MEM. INSUFICIENTE . " ) ; r e t u r n 1; } f o r ( i = 0 ; i < tam ; i ++) { mat [ i ] = ( i n t ) malloc ( ( i +1) sizeof ( int ) ) ; i f ( ! mat [ i ] ) { p r i n t f ( "MEM. INSUFICIENTE . " ) ; r e t u r n 1; } }

13

15

return 0;
17

} i n t soma( i n t mat , i n t tam ) { i n t i , j , soma = 0 ; f o r ( i = 0 ; i < tam ; i ++) { f o r ( j = 0 ; j < ( i + 1 ) ; j ++) { soma += mat [ i ] [ j ] ; } } r e t u r n soma ; } 1 de agosto de 2012 214 / 341

18 19

20

21

22

23

24

25

26

27

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

Ponteiros Alocao Dinmica de Arranjos Multidimensionais Exemplo 3 sem indexao: Alocao de matriz quadrada
#include < s t d i o . h> #include < s t d l i b . h> / Prototipo / i n t soma( i n t mat , i n t tam ) ; i n t main ( i n t argc , char argv [ ] ) { i n t mat , pp , p ; i n t tam, i , j ; scanf ( "%d " , &tam ) ;
12 1

3 4

f o r ( pp=mat , i =0; i <tam ; i ++ , pp ++){ f o r ( p=pp , j =0; j <tam ; j ++ , p ++){ scanf ( "%d " , p ) ; } } p r i n t f ( "SOMA DOS ELEMENTOS : %d " , soma( mat , tam ) ) ; f o r ( pp=mat , i =0; i <tam ; i ++ ,pp ++){ free ( pp ) ; } free ( mat ) ;

6 7

10 11

14

16

mat = ( i n t ) malloc (tam s i z e o f ( i n t ) ) ; i f ( ! mat ) { p r i n t f ( "MEM. INSUFICIENTE . " ) ; r e t u r n 1; } f o r ( pp = mat , i = 0 ; i < tam ; i ++ , pp++) { pp = ( i n t ) malloc (tam sizeof ( int ) ) ; i f ( ! ( pp ) ) { p r i n t f ( "MEM. INSUFICIENTE . " ) ; r e t u r n 1; } }

13

15

return 0;
17

} i n t soma( i n t mat , i n t tam ) { i n t pp , p , i , j , soma=0; f o r ( pp=mat , i =0; i <tam ; i ++ ,pp ++){ f o r ( p=pp , j =0; j <tam ; j ++ , p ++){ soma += ( p ) ; } } r e t u r n soma ; } 1 de agosto de 2012 215 / 341

18 19

20

21

22

23

24

25

26

27

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

Ponteiros Alocao Dinmica de Arranjos Multidimensionais

Para treinar Refazer os exemplos 2 e 4 sem utilizar indexao

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

216 / 341

Contedo

1 2 3 4

Introduo Sintaxe Bsica Ponteiros Tpicos Relevantes Argumentos Unio Enumerao Diretivas Arquivos Extras

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

217 / 341

Tpicos Relevantes
Argumentos

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

218 / 341

Tpicos Relevantes Argumentos

Parmetros Formais da Funo main A funo main recebe dois parmetros:


argc, um parmetro do tipo inteiro que possui o nmero de argumentos passados argv, um parmetro do tipo arranjo para arranjo de caracteres que pode ser entendido como um arranjo de strings

importante mencionar que o parmetro argc ser, no mnimo, de tamanho 1, pois o argv[0] sempre o nome do aplicativo

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

219 / 341

Tpicos Relevantes Argumentos

Observe o aplicativo show abaixo:


#include < s t d i o . h>
2

i n t main ( i n t argc , char argv [ ] ) { int i ; p r i n t f ( " Numero de argumentos passados : %d\n " , argc ) ; f o r ( i = 0 ; i < argc ; i ++) { p r i n t f ( " argv[%d] = %s \n " , i , argv [ i ] ) ; } return 0;

10

12

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

220 / 341

Tpicos Relevantes Argumentos

Ao invocar o aplicativo show pelo prompt de comando, exibir-se-: ./show


Numero de argumentos passados: argv[0] = ./show 1

./show 2 5.7
Numero de argumentos passados: argv[0] = ./show argv[1] = 2 argv[2] = 5.7 3

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

221 / 341

Tpicos Relevantes Argumentos

Delimitador O espao o delimitador dos argumentos. Contudo, se for necessrio inserir um parmetro que possua espao, ento dever ser utilizada aspas. Observe: ./show Ricardo Terra Linguagem C 2012
Numero de argumentos passados: argv[0] = ./show argv[1] = Ricardo Terra argv[2] = Linguagem C argv[3] = 2012 4

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

222 / 341

Tpicos Relevantes Argumentos

Aplicabilidade A partir de agora sabe-se que os argumentos so teis para quando se deseja passar informaes ao aplicativo no momento de sua chamada Como todo argumento um string existem algumas funes de converso da biblioteca stdlib.h muito utilizadas:
int atoi(char *): converte um string para int long int atol(char *): converte um string para long int float atof(char *): converte um string para float

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

223 / 341

Tpicos Relevantes Argumentos Exemplo Completo: Criando programa soma


2

#include < s t d i o . h> #include < s t d l i b . h> i n t main ( i n t argc , char argv [ ] ) { float x , y ; i f ( argc ! = 3) { p r i n t f ( " Uso : soma <n1> <n2> " ) ; r e t u r n 2; } x = a t o f ( argv [ 1 ] ) ; y = a t o f ( argv [ 2 ] ) ; p r i n t f ( " %.2 f " , x + y ) ;

10

12

14

16

return 0;
18

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

224 / 341

Tpicos Relevantes Argumentos

Para treinar Estender o programa soma de forma que possa se passar innitos nmeros, por exemplo: ./soma 3.2 8.1 4.2 1.5

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

225 / 341

Tpicos Relevantes
Unio

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

226 / 341

Tpicos Relevantes Unio

Unio Em C, uma union uma posio de memria compartilhada por duas ou mais variveis, normalmente de tipos diferentes Unio A denio de uma union semelhante denio de uma estrutura, conforme pode ser observado a seguir:
typedef union { t i p o nome; t i p o nome; t i p o nome; } nomeUniao ;

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

227 / 341

Tpicos Relevantes Unio

O exemplo abaixo cria uma unio que armazena um inteiro i e um caractere ch compartilhando uma mesma posio de memria em uma unio chamada intChar:
1

typedef union { int i ; char ch ; } intChar ;

Para declarar uma varivel do tipo intChar, faz-se como abaixo: intChar x;

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

228 / 341

Tpicos Relevantes Unio Unio Na unio intChar, o inteiro i e o caractere ch compartilham a mesma posio de memria A unio ter o tamanho de um inteiro, uma vez que int o maior tipo de varivel da unio Desse modo, a varivel i ocupa 4 bytes e a varivel ch compartilha 1 byte o mais direita

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

229 / 341

Tpicos Relevantes Unio

Unio O acesso a elementos de uma unio similar ao modo que se faz em estruturas Em variveis do tipo da unio utiliza-se o operador ponto (.) Em ponteiros para o tipo da unio utiliza-se o operador seta (->)

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

230 / 341

Tpicos Relevantes Unio

Exemplo 1: Atribuio e leitura de campos da unio intChar


#include < s t d i o . h>
2

typedef union { int i ; char ch ; } intChar ; i n t main ( i n t argc , char argv [ ] ) { intChar x ; x . i = 4161;

10

12

14

p r i n t f ( "%d " , x . i ) ; / Imprime 4161 / p r i n t f ( "%c " , x . ch ) ; / Imprime A / return 0; }

16

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

231 / 341

Tpicos Relevantes Unio Exemplo 2: Atribuio e leitura de campos da unio intChar por meio de ponteiros
1

#include < s t d i o . h> typedef union { int i ; char ch ; } intChar ; void l e ( intChar p ) { scanf ( "%d " , &(p> i ) ) ; } void imprime ( intChar p ) { p r i n t f ( "%d %c " , p>i , p>ch ) ; / Imprime 4161 A sse d i g i t o u 4161 / } i n t main ( i n t argc , char argv [ ] ) { intChar x ; l e (& x ) ; imprime(& x ) ; return 0;

11

13

15

17

19

21

23

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

232 / 341

Tpicos Relevantes Unio

Exemplo 3: Denio da unio pw


1

#include < s t d i o . h> typedef union { int i ; char ch [ 4 ] ; } pw ; i n t main ( i n t argc , char argv [ ] ) { pw senha ; senha . ch [ 0 ] = 6 5 ; senha . ch [ 1 ] = 1 6 ; senha . ch [ 2 ] = senha . ch [ 3 ] = 0 ; p r i n t f ( "%d " , senha . i ) ; / Imprime 4161 /

11

13

15

return 0;
17

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

233 / 341

Tpicos Relevantes
Enumerao

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

234 / 341

Tpicos Relevantes Enumerao Enumerao Uma enum um conjunto de constantes inteiras que determina quais os possveis valores de uma varivel desse tipo Sintaxe: typedef enum {x, y, z} exemplo; Por padro, os valores comeam de zero. Por exemplo, na enumerao denida acima, as variveis possuem os seguintes valores:
x = 0 y = 1 z = 2
Ricardo Terra (rterrabh@gmail.com) Linguagem C 1 de agosto de 2012 235 / 341

Tpicos Relevantes Enumerao

Alterando o valor das variveis de uma enumerao Contudo, as variveis podem ter sua numerao alterada com uma simples atribuio no momento da denio. Por exemplo: typedef enum {x, y=10, z} exemplo; Assim, as variveis possuem os seguintes valores:
x = 0 y = 10 z = 11

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

236 / 341

Tpicos Relevantes Enumerao Exemplo 1: Denindo o tipo boolean


1

#include < s t d i o . h> typedef enum { f a l s e , t r u e } boolean ; i n t main ( i n t argc , char argv [ ] ) { boolean b ; b = (3 > 1 ) ; i f (b) { printf ( "3 > 1" ); } b = !b; i f ( b == t r u e ) { p r i n t f ( " 3 <= 1 " ) ; } return 0; }

11

13

15

17

19

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

237 / 341

Tpicos Relevantes Enumerao

Exemplo 2: Denindo o tipo diaSemana


#include < s t d i o . h>
2

typedef enum { domingo , segunda , terca , quarta , quinta , sexta , sabado } diaSemana ; i n t main ( i n t argc , char argv [ ] ) { diaSemana d = segunda ; / Poderia s e r 1 / i f (d == sabado || d == domingo ) { p r i n t f ( " Fim de Semana! " ) ; } else { p r i n t f ( " Dia U t i l . " ) ; } return 0; }

10

12

14

16

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

238 / 341

Tpicos Relevantes Enumerao Observaes Importantes: Observe que segunda refere-se ao inteiro 1
d = segunda equivale a d = 1

Isso indica que segunda no o string segunda


d = segunda no equivale a d = segunda

Assim, caso o usurio digite segunda e voc quer atribuir isso varivel d, deve ser feito com alguns comandos if
1

( ! strcmp ( s t r , " segunda " ) ) { d = segunda ; } else i f ( ! strcmp ( s t r , " tera " ) ) { d = terca ; } ...

if

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

239 / 341

Tpicos Relevantes
Diretivas

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

240 / 341

Tpicos Relevantes Diretivas

Pr-Processador de C O pr-processador manipula o texto de um programa antes da compilao Pode-se incluir diversas instrues do compilador no cdigo fonte de um programa C. Essas instrues so denominadas diretivas Basicamente, diretivas so linhas cujo primeiro caractere um # (sustenido)

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

241 / 341

Tpicos Relevantes Diretivas

O pr-processador de C reconhece as seguintes diretivas: #include #define #undef #line #error #pragma #if #ifdef #ifndef #else #elif #endif

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

242 / 341

Tpicos Relevantes Diretivas

Diretiva #include Instrui o compilador a inserir todo o contedo de outro arquivo no arquivo fonte Sintaxe: #include<stdio.h>
com < ... > , delimita-se arquivos da biblioteca C

#include "mylib.h"
com ... (aspas), delimita-se arquivos fora da biblioteca C, ou melhor, aqueles criados por voc

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

243 / 341

Tpicos Relevantes Diretivas Diretiva #include Exemplo


1

#include < s t d i o . h> #include " mylib . h " i n t main ( i n t argc , char argv [ ] ) { i n t x = 2 , y = 3; p r i n t f ( "soma : %d " , soma( x , y ) ) ; return 0; } i n t soma( i n t x , i n t y ) { return x + y ; }

11

Arquivo mylib.h
2

/ P r o t o t i p o s / i n t soma( i n t , i n t ) ;

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

244 / 341

Tpicos Relevantes Diretivas

Diretiva #define Dene uma macro um string de substituio. O Pr-Processador de C substituir cada ocorrncia dessa macro pela seu valor antes da compilao Exemplos:
#define PI 3.14159 area = PI * pow(r,2); area = 3.14159 * pow(r,2); #define TAM_MAX 100 int = v[TAM_MAX]; int v[100]; #define escreve printf escreve(%d,i); printf(%d,i);

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

245 / 341

Tpicos Relevantes Diretivas

Diretiva #define Exemplo


1

#include < s t d i o . h> #include <math . h> #define P I 3.14159 #define escreve p r i n t f i n t main ( i n t argc , char argv [ ] ) { double r ; scanf ( "% l f " , &r ) ; escreve ( "% l f " , P I pow( r , 2 ) ) ; / p r i n t f ("% l f " , 3.14159 pow( r , 2 ) ) ; / return 0; }

11

13

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

246 / 341

Tpicos Relevantes Diretivas

Diretiva #undef Uma macro pode ser removida com a diretiva undef em qualquer ponto do arquivo fonte, isto , a macro s vale em uma parte do cdigo fonte Por exemplo, removendo as macros denidas anteriormente:
#undef PI #undef TAM_MAX #undef escreve

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

247 / 341

Tpicos Relevantes Diretivas

Diretiva #if, #endif, #elif e #else Permitem fazer pr-compilaes condicionais Exemplo Dene-se uma macro modelo e dependendo de seu valor, dene-se uma outra macro
#define modelo medio
2

# i f modelo == pequeno #define TAM 10 # e l i f modelo == medio #define TAM 100 # else #define TAM 1000 # endif

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

248 / 341

Tpicos Relevantes Diretivas Diretiva #ifdef e #ifndef Permite fazer pr-compilaes condicionais em funo de uma macro ter sido (#ifdef) ou no denida (#ifndef) Exemplo Dene-se uma macro debug e, caso ela esteja denida, uma srie de instrues voltadas ao teste do programa sero executadas Por exemplo:
1

#define debug ; # i f d e f debug p r i n t f ( "%d " , i ) ; # endif

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

249 / 341

Tpicos Relevantes Diretivas

Demais diretivas #line: Reseta o contador de linhas. Geralmente utilizado para depurao e aplicaes especcas #error: Fora o compilador a parar a compilao. Geralmente utilizado para depurao #pragma: Permite que sejam passadas instrues ao compilador Existem tambm os operadores # e ##. Utilizados com a diretiva define quando essa diretiva visa denir algo parecido com uma funo

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

250 / 341

Tpicos Relevantes Diretivas Exemplo Completo


1

#include < s t d i o . h> #include " mylib . h " #define LANG PT

i n t main ( i n t argc , char argv [ ] ) { i n t v [ TAM ] , i , p , i x , i y ; para (p = v , i = 0 ; i < TAM ; i ++ , p++) { l e ( "%d " , p ) ; } # i f d e f DEBUG para (p = v , i = 0 ; i < TAM ; i ++ , p++) { escreve ( " v[%d]=%d\n " , i , p ) ; } # endif l e ( "%d " , &i x ) ; l e ( "%d " , &i y ) ; # i f d e f DEBUG escreve ( "%d > %d e %d > %d\n " , i x , v [ i x ] , i y , v [ i y ] ) ; # endif escreve ( "%d " , soma ( v [ i x ] , v [ i y ] ) ) ; return 0; }

3 4

11

13

# i f LANG == PT #define para for #define escreve p r i n t f #define l e scanf # e l i f LANG == EN #define w r i t e printf #define read scanf # endif #undef LANG

10

12

14 15

16 17

#define TAM 5 #define DEBUG

18

20

22

24

26

i n t soma ( i n t x , i n t y ) { return x + y ; } Linguagem C 1 de agosto de 2012 251 / 341

Ricardo Terra (rterrabh@gmail.com)

Tpicos Relevantes
Arquivos

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

252 / 341

Tpicos Relevantes Arquivos

Funes de E/S As funes que compem o sistema de entrada/sada do C ANSI podem ser agrupadas em duas principais categorias:
E/S pelo console e E/S com arquivo

A linguagem C no contm nenhum comando de E/S. Ao contrrio, todas as operaes de E/S ocorrem mediante chamadas de funes da biblioteca C padro (stdio.h)

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

253 / 341

Tpicos Relevantes Arquivos

Stream x Arquivo Antes de aprofundarmos em nas funes de E/S, importante diferenciar stream e arquivo O sistema de E/S de C fornece uma interface consistente ao programador, independente do dispositivo real que acessado Essa abstrao chamada stream e o dispositivo real chamado de arquivo

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

254 / 341

Tpicos Relevantes Arquivos

Streams Existem dois tipos principais de streams :


stream de texto stream binrio

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

255 / 341

Tpicos Relevantes Arquivos

Stream de texto Basicamente, um stream de texto uma sequncia de caracteres Normalmente, um stream de texto organizada em linhas terminadas por um caractere de nova linha todo.txt 1. Buscar Jornal 2. Ir ao supermercado 3. Marcar dentista

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

256 / 341

Tpicos Relevantes Arquivos Stream de texto importante mencionar que a representao de nova linha diferente em sistemas operacionais Por exemplo, em sistemas operacionais baseados em UNIX representado por:
\n ASCII 10 isto , somente a quebra de linha (line feed )

J no software Windows representado por:


\r \n ASCIIs 13 e 10 isto , retorno de carro (carrier return) seguido de quebra de linha (line feed )
Ricardo Terra (rterrabh@gmail.com) Linguagem C 1 de agosto de 2012 257 / 341

Tpicos Relevantes Arquivos

Stream de texto At agora, temos trabalhado com as streams padres:


stdin stdout para entrada de dados para sada de dados

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

258 / 341

Tpicos Relevantes Arquivos

Stream binrio Basicamente, um stream binrio uma sequncia de bytes diretamente correspondida com o dispositivo externo, isto , sem traduo dos caracteres todo.bin 100101010100101010111010101001010101110101010010101 101010010101010010101011101010100101010111010101001 111110101001010101110101010010101011101010100101011 101001010101110101010010101011101010100101011001010

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

259 / 341

Tpicos Relevantes Arquivos

Arquivos Arquivo pode ser qualquer dispositivo de E/S. Por exemplo:


impressora, teclado, disquete, disco rgido etc

Os aplicativos C ANSI manipulam arquivos atravs de streams Para manipular o stream de um arquivo, necessrio que o arquivo seja aberto IMPORTANTE: Aps manipular o arquivo, esse deve ser fechado

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

260 / 341

Tpicos Relevantes Arquivos Operaes comuns em arquivos: abrir e fechar apagar ler e escrever caracteres ou dados binrios vericar se chegou ao m posicionar Observaes: Obviamente algumas dessas funes no se aplicam a todos os tipos de dispositivos. Por exemplo:
no possvel reposicionar uma impressora no incio um arquivo em disco permite acesso aleatrio ao contrrio de um teclado
Ricardo Terra (rterrabh@gmail.com) Linguagem C 1 de agosto de 2012 261 / 341

Tpicos Relevantes Arquivos

Fechar arquivos Sempre aps manipular um arquivo, ele deve ser fechado Isso faz com que os buffers sejam descarregados para o dispositivo externo, o que ocorre automaticamente quando o aplicativo encerrado Entretanto, caso o aplicativo encerre de forma no esperada, o buffer do arquivo pode no ser descarregado, gerando uma inconsistncia

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

262 / 341

Tpicos Relevantes Arquivos

Funes de Entrada e Sada (E/S) As funes de entrada e sada encontram-se na biblioteca stdio.h Por padro, a maioria das funes iniciam-se com o prexo f No prximo slide, sero vistas diversas dessas funes

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

263 / 341

Tpicos Relevantes Arquivos Funo


fopen() fclose() fputc(), putc() fgetc(), getc() fprintf() fscanf() fgets() fputs() fseek() rewind() feof() ferror() fflush() fread() fwrite() remove()

Descrio
Abre um arquivo Fecha um arquivo Escreve um caractere em um arquivo L um caractere de um arquivo Equivalente a printf(), utilizando stream Equivalente a scanf(), utilizando stream L uma cadeia de caracteres (string) Escreve uma cadeia de caracteres (string) Posiciona o arquivo em um ponto especco Posiciona o arquivo no incio Verica se chegou ao nal do arquivo Verica se ocorreu um erro Descarrega o buffer associado ao arquivo Leitura binria de dados Escrita binria de dados Remove um arquivo

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

264 / 341

Tpicos Relevantes Arquivos

Ponteiro de Arquivo Para ter acesso aos dados em um arquivo necessrio denir um ponteiro do tipo especial FILE denido na biblioteca stdio.h Esse ponteiro permite que o aplicativo tenha acesso a uma estrutura que armazena informaes importantes sobre o arquivo Declarao:
FILE *fp; fp ponteiro utilizado para operaes no arquivo

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

265 / 341

Tpicos Relevantes Arquivos

Abertura de um Arquivo A primeira operao a ser realizada em um arquivo a sua abertura. Essa operao associa um stream (uxo de dados) ao arquivo Um arquivo pode ser aberto para diversas nalidades:
leitura, escrita, leitura/escrita, adio (append ) de texto etc

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

266 / 341

Tpicos Relevantes Arquivos Abertura de um Arquivo A funo fopen utilizada para abrir o arquivo Prottipo: FILE *fopen (const char *arq, const char *modo)
arq nome do arquivo (caminho relativo ou absoluto) modo determina como o arquivo ser aberto

Assim como na funo malloc, o ponteiro retornado no deve ser modicado. Alm disso, caso no consiga abrir o arquivo, retornado um ponteiro nulo (NULL) No prximo slide, sero vistos os diversos modos de abertura de arquivos
Ricardo Terra (rterrabh@gmail.com) Linguagem C 1 de agosto de 2012 267 / 341

Tpicos Relevantes Arquivos Modo


r w a rb wb ab r+ w+ a+ r+b w+b a+b

Descrio
Abre um arquivo texto para leitura Cria um arquivo texto para escrita Adiciona texto ao m de um arquivo texto Abre um arquivo binrio para leitura Abre um arquivo binrio para escrita Anexa a um arquivo binrio Abre um arquivo texto para leitura/escrita Cria um arquivo texto para leitura/escrita Anexa ou cria um arquivo texto para leitura/escrita Abre um arquivo binrio para leitura/escrita Cria um arquivo binrio para leitura/escrita Anexa a um arquivo binrio para leitura/escrita

Importante: Se um arquivo existente for aberto para escrita, ser apagado e um novo ser criado. Se for aberto para leitura/escrita, ele no ser apagado. E, caso ele no exista, ento ser criado
Ricardo Terra (rterrabh@gmail.com) Linguagem C 1 de agosto de 2012 268 / 341

Tpicos Relevantes Arquivos

Exemplo: Abertura de um arquivo


2

F I L E fp ; char ch ; fp = fopen ( " arquivo . t x t " , " r " ) ; i f ( ! fp ) { p r i n t f ( "O arquivo nao pode s e r aberto " ) ; r e t u r n 3; }

Importante: Usualmente, testa-se o retorno da funo fopen para vericar se houve erro na abertura de um arquivo, tal como arquivo no existente, arquivo sem permisso de leitura ou escrita etc

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

269 / 341

Tpicos Relevantes Arquivos

Fechamento de um Arquivo A funo fclose fecha o stream aberto pela funo fopen Prottipo: int fclose (FILE *fp)
fp ponteiro para o arquivo a ser fechado

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

270 / 341

Tpicos Relevantes Arquivos

Fechamento de um Arquivo Caso a funo retorne 0 indica que o arquivo foi fechado com sucesso. Qualquer outro valor indica que ocorreu algum erro A chamada a funo fclose implica na escrita de qualquer dado que ainda no tenha sido efetivamente escrito no arquivo
Isso um ponto importante a mencionar, pois no UNIX, por exemplo, uma operao de escrita em arquivo no ocorre imediatamente emisso da ordem de escrita Normalmente, o sistema operacional executa a escrita no momento que achar mais conveniente

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

271 / 341

Tpicos Relevantes Arquivos Vericando o Final de um Arquivo A funo feof indica se chegou ao nal do arquivo Prottipo: int feof (FILE *fp)
fp ponteiro do arquivo a ser vericado se atingiu o nal

Exemplo O uso mais comum de feof em um lao de repetio, por exemplo, para a leitura completa de um arquivo
1

while ( ! f e o f ( fp ) ) { / Poderia s e r while ( feof ( fp ) == 0 ) / ch = fgetc ( fp ) ; / A funo fgetc ou getc l um caractere / ... }

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

272 / 341

Tpicos Relevantes Arquivos

Retrocedendo um Arquivo ao Incio A funo rewind reposiciona o arquivo em seu incio


Operao semelhante a de rebobinar um VHS

Prottipo: void rewind(FILE *fp)


fp ponteiro para o arquivo a ser retrocedido

importante observar que o modo de abertura do arquivo


Por exemplo, um arquivo aberto somente para escrita, se retrocedido ao incio, no ir permitir outra operao que no seja escrita

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

273 / 341

Tpicos Relevantes Arquivos Leitura e Escrita de Caracteres As operaes mais simples em arquivos so leitura e escrita de caracteres Para efetuar a leitura do caractere de um arquivo pode-se utilizar as funes getc e fgetc, que so equivalentes Prottipo int fgetc (FILE *fp)
fp ponteiro para o arquivo cujo caractere ser lido

A funo retorna o caractere como um int (padro) Caso tente-se ler de um arquivo cujo nal j foi alcanado, a funo devolve o cdigo EOF (-1)
Ricardo Terra (rterrabh@gmail.com) Linguagem C 1 de agosto de 2012 274 / 341

Tpicos Relevantes Arquivos

Leitura e Escrita de Caracteres Para efetuar a escrita de um caractere em um arquivo pode-se utilizar as funes putc e fputc, que so equivalentes Prottipo int fputc (int ch, FILE *fp)
fp ponteiro para o arquivo cujo caractere ser escrito ch caractere a ser escrito

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

275 / 341

Tpicos Relevantes Arquivos Exemplo 1a: Exibindo o contedo de um arquivo


#include < s t d i o . h>
2

i n t main ( i n t argc , char argv [ ] ) { F I L E fp ; char ch ; fp = fopen ( " arquivo . t x t " , " r " ) ; i f ( ! fp ) { p r i n t f ( "O arquivo nao pode s e r aberto " ) ; r e t u r n 3; } while ( ! f e o f ( fp ) ) { ch = fgetc ( fp ) ; i f (ch ! = EOF) { p r i n t f ( "%c " , ch ) ; } } f c l o s e ( fp ) ; return 0; }
Linguagem C 1 de agosto de 2012 276 / 341

10

12

14

16

18

20

Ricardo Terra (rterrabh@gmail.com)

Tpicos Relevantes Arquivos Exemplo 1b: Criando o prprio cat


#include < s t d i o . h>
2

i n t main ( i n t argc , char argv [ ] ) { F I L E fp ; char ch ; i f ( argc != 2) { p r i n t f ( " Uso : cat <nome do arquivo > " ) ; r e t u r n 2; } fp = fopen ( argv [ 1 ] , " r " ) ;

10

12

if
14

( ! fp ) { p r i n t f ( "O arquivo nao pode s e r aberto " ) ; r e t u r n 3;

16

} while ( ! f e o f ( fp ) ) { ch = fgetc ( fp ) ; i f (ch != EOF) { p r i n t f ( "%c " , ch ) ; } } f c l o s e ( fp ) ; return 0; }

18

20

22

24

26

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

277 / 341

Tpicos Relevantes Arquivos Exemplo 2: Escrita, Retrocesso e Leitura


1

#include < s t d i o . h> i n t main ( i n t argc , char argv [ ] ) { F I L E fp ; i n t i ; char ch ; fp = fopen ( " alfabeto . t x t " , "w+ " ) ; / Abre para l e i t u r a / e s c r i t a / i f ( ! fp ) { p r i n t f ( " E r r o na abertura do arquivo . " ) ; r e t u r n 3; } f o r ( i = 6 5 ; i <= 9 0 ; i ++) { / Grava de A a Z / fputc ( i , fp ) ; } rewind ( fp ) ; / Rebobina o arquivo /

11

13

15

17

19

21

23

while ( ! f e o f ( fp ) ) { / L e i t u r a Completa / ch = fgetc ( fp ) ; i f (ch != EOF) { p r i n t f ( "%c " , ch ) ; } } f c l o s e ( fp ) ; / Fecha o arquivo / return 0; }

25

27

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

278 / 341

Tpicos Relevantes Arquivos Exemplo 3: Criando o prprio cp


1

#include < s t d i o . h> i n t main ( i n t argc , char argv [ ] ) { F I L E fp1 , fp2 ; char ch ; i f ( argc != 3) { p r i n t f ( " Uso : cp <arquivoorigem> <arquivodestino > " ) ; r e t u r n 2; } fp1 = fopen ( argv [ 1 ] , " r " ) ; / Abre para l e i t u r a / i f ( ! fp1 ) { p r i n t f ( " E r r o na abertura do arquivo origem . " ) ; r e t u r n 3; } fp2 = fopen ( argv [ 2 ] , "w" ) ; / Abre para e s c r i t a / i f ( ! fp2 ) { p r i n t f ( " E r r o na abertura do arquivo destino . " ) ; r e t u r n 3; } while ( ! f e o f ( fp1 ) ) { / L e i t u r a /Gravacao / ch = fgetc ( fp1 ) ; i f (ch != EOF) { fputc ( ch , fp2 ) ; } } f c l o s e ( fp1 ) ; f c l o s e ( fp2 ) ; return 0; } Linguagem C 1 de agosto de 2012 279 / 341 / Fecha os arquivos /

11

13

15

17

19

21

23

25

27

29

Ricardo Terra (rterrabh@gmail.com)

Tpicos Relevantes Arquivos

Leitura e Escrita de Cadeia de Caracteres (strings) As funes fgets e fputs realizam a leitura e escrita de cadeias de caracteres em arquivos Prottipo fputs: int fputs(char *str, FILE *fp)
str string a ser gravado fp ponteiro do arquivo cujo string ser escrito

A funo fputs escreve o string str no stream fp Em caso de erro, a funo fputs retorna EOF

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

280 / 341

Tpicos Relevantes Arquivos

Prottipo fgets: int fgets(char *str, int comp, FILE *fp)


str string a ser preenchido pela leitura comp tamanho do string fp ponteiro do arquivo cuja string ser lido

A funo fgets l uma cadeia de caracteres do stream fp para a varivel str


At que um caractere de nova linha seja encontrado ou comp-1 caracteres sejam lidos

Em caso de erro, a varivel str recebe NULL

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

281 / 341

Tpicos Relevantes Arquivos Exemplo 4: Escrita, Retrocesso e Leitura utilizando fgets e fputs
1

#include < s t d i o . h> #define STR_TAM 100 i n t main ( i n t argc , char argv [ ] ) { char linguagens [ 5 ] [ 2 0 ] = { " PASCAL " , "C" , "C++ " , " S m a l l T a l k " , " Java " } ; F I L E fp ; i n t i ; char s t r [ STR_TAM ] ; fp = fopen ( " linguagens . t x t " , "w+ " ) ; / Cria para l e i t u r a / e s c r i t a / i f ( ! fp ) { p r i n t f ( " E r r o na abertura do arquivo . " ) ; r e t u r n 3; } / Grava o arranjo de linguagens / f o r ( i = 0 ; i < s i z e o f ( linguagens ) / s i z e o f ( linguagens [ i ] ) ; i ++) { f p u t s ( linguagens [ i ] , fp ) ; fputc ( \n , fp ) ; } rewind ( fp ) ; / Rebobina o arquivo /

11

13

15

17

19

21

23

25

27

while ( ! f e o f ( fp ) ) { / L e i t u r a Completa / i f ( f g e t s ( s t r , STR_TAM , fp ) != NULL ) { p r i n t f ( "%s " , s t r ) ; } } f c l o s e ( fp ) ; / Fecha o arquivo / return 0; } Linguagem C 1 de agosto de 2012 282 / 341

29

Ricardo Terra (rterrabh@gmail.com)

Tpicos Relevantes Arquivos

E/S Formatada As funes fprintf e fscanf so equivalentes as j conhecidas funes printf e scanf As funes printf e scanf trabalham sempre com os arquivos padres de E/S
stdin: entrada padro, normalmente, teclado stdout: sada padro, normalmente, monitor

A nica diferena que nas funes fprintf e fscanf deve-se informar qual o arquivo que est se trabalhando

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

283 / 341

Tpicos Relevantes Arquivos

Prottipo fprintf: int fprintf(FILE *fp, const char *format, ...)


fp ponteiro do arquivo a ser escrito format sequncia de converso ... variveis (varargs )

Por exemplo: printf("%d", num) fprintf(stdout,"%d", num)

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

284 / 341

Tpicos Relevantes Arquivos

Prottipo fscanf: int fscanf(FILE *fp, const char *format, ...)


fp ponteiro do arquivo a ser escrito format sequncia de converso ... variveis (varargs )

Por exemplo: scanf("%d", &num) fscanf(stdin,"%d", &num)

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

285 / 341

Tpicos Relevantes Arquivos

E/S Formatada Embora essas funes, por sua semelhana com printf e scanf, sejam maneiras convenientes de escrever e ler dados de arquivos, elas tm a desvantagem de serem mais lentas do que uso de arquivos binrios, os quais so descritos a frente A perda de tempo ocorre devido aos dados serem armazenados na codicao ASCII, o que obriga converso de dados a cada operao Contudo, dados armazenados em ASCII pode ser tambm uma vantagem, uma vez que so facilmente vericados pelos usurios, o que no ocorre com dados binrios

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

286 / 341

Tpicos Relevantes Arquivos Exemplo 5: Gravando uma matriz em um arquivo


1

#include < s t d i o . h> i n t main ( i n t argc , char argv [ ] ) { F I L E fp ; i n t i , j , tam, aux ; p r i n t f ( "Tamanho da M a t r i z Quadrada : " ) ; scanf ( "%d " , &tam ) ; fp = fopen ( " m a t r i z . t x t " , "w" ) ; / Abre para e s c r i t a / i f ( ! fp ) { p r i n t f ( " E r r o na abertura do arquivo . " ) ; r e t u r n 3; } f p r i n t f ( fp , "%d\n " , tam ) ; / Armazena o tamanho da m a t r i z / f o r ( i = 0 ; i < tam ; i ++) { / Le m a t r i z gravando no arquivo / f o r ( j = 0 ; j < tam ; j ++) { p r i n t f ( " mat[%d][%d] = " , ( i + 1 ) , ( j + 1 ) ) ; scanf ( "%d " , &aux ) ; f p r i n t f ( fp , "%d " , aux ) ; } f p r i n t f ( fp , " \n " ) ; } f c l o s e ( fp ) ; / Fecha o arquivo /

11

13

15

17

19

21

23

25

27

return 0;
29

} Linguagem C 1 de agosto de 2012 287 / 341

Ricardo Terra (rterrabh@gmail.com)

Tpicos Relevantes Arquivos Exemplo 6: Lendo uma matriz de um arquivo


1

#include < s t d i o . h> i n t main ( i n t argc , char argv [ ] ) { F I L E fp ; i n t i , j , tam, aux ; fp = fopen ( " m a t r i z . t x t " , " r " ) ; / Abre para l e i t u r a / if ( ! fp ) { p r i n t f ( " E r r o na abertura do arquivo . " ) ; r e t u r n 3;

11

}
13

f s c a n f ( fp , "%d " , &tam ) ; / Le o tamanho /


15

17

19

21

f o r ( i = 0 ; i < tam ; i ++) { / Imprime a M a t r i z Gravada no Arquivo / f o r ( j = 0 ; j < tam ; j ++) { fscanf ( fp , "%d " , &aux ) ; f p r i n t f ( stdout , "%d " , aux ) ; } f p r i n t f ( stdout , " \n " ) ; } f c l o s e ( fp ) ; / Fecha o arquivo /

23

25

return 0;
27

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

288 / 341

Tpicos Relevantes Arquivos

Exerccio de Fixao Refazer os Exemplos 5 e 6 com matrizes que no sejam quadradas

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

289 / 341

Tpicos Relevantes Arquivos

Leitura e Escrita Binria As funes fread e fwrite so empregadas para leitura e escrita de dados binrios

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

290 / 341

Tpicos Relevantes Arquivos Prottipo fread:


size_t fread (void *ptr, size_t size, size_t nmemb, FILE *fp)

ptr ser atribudo size nmemb fp

ponteiro para ou endereo do tipo de dado a tamanho do tipo de dado nmero de elementos a serem lidos ponteiro para o arquivo a ler

L nmemb membros, cada um com size bytes do arquivo fp e os coloca em ptr Retorna o nmero de itens que foram lidos com sucesso Em caso de erro ou o m de arquivo, o valor de retorno menor do que nmemb ou zero Como essa funo no distingue entre um m de arquivo e erro, aconselhvel o uso de feof ou ferror para determinar o problema
Ricardo Terra (rterrabh@gmail.com) Linguagem C 1 de agosto de 2012 291 / 341

Tpicos Relevantes Arquivos Prottipo fwrite:


size_t fwrite (const void *ptr, size_t size, size_t nmemb, FILE *fp)

ptr gravado size nmemb fp

ponteiro para ou endereo o dado a ser

tamanho do tipo de dado nmero de elementos a serem gravados ponteiro para o arquivo a gravar

Escreve nmemb membros, cada um com size bytes a partir do endereo apontado em ptr para o arquivo fp Retorna o nmero de itens que foram escritos com sucesso Em caso de erro ou o m de arquivo, o valor de retorno menor do que nmemb ou zero
Ricardo Terra (rterrabh@gmail.com) Linguagem C 1 de agosto de 2012 292 / 341

Tpicos Relevantes Arquivos

Exemplo 7a: Gravando uma estrutura em um arquivo


1

#include < s t d i o . h> typedef s t r u c t { i n t matricula ; char nome[ 6 0 ] ; } aluno ; i n t main ( i n t argc , char argv [ ] ) { F I L E fp ; aluno a = { 1 , " Ricardo T e r r a " } ; fp = fopen ( " aluno . bin " , "wb" ) ; / Abre para e s c r i t a / i f ( ! fp ) { p r i n t f ( " E r r o na abertura do arquivo . " ) ; r e t u r n 3; } f w r i t e (&a , s i z e o f ( aluno ) , 1 , fp ) ; / Grava a e s t r u t u r a /

11

13

15

17

19

f c l o s e ( fp ) ;
21

return 0;
23

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

293 / 341

Tpicos Relevantes Arquivos Exemplo 8a: Lendo uma estrutura de um arquivo


1

#include < s t d i o . h> typedef s t r u c t { i n t matricula ; char nome[ 6 0 ] ; } aluno ; i n t main ( i n t argc , char argv [ ] ) { F I L E fp ; aluno a ; fp = fopen ( " aluno . bin " , " rb " ) ; / Abre para l e i t u r a / i f ( ! fp ) { p r i n t f ( " E r r o na abertura do arquivo . " ) ; r e t u r n 3; } fread (&a , s i z e o f ( aluno ) , 1 , fp ) ; / Le a e s t r u t u r a /

11

13

15

17

19

p r i n t f ( "A matricula %d pertence ao aluno %s " , a . matricula , a .nome) ;


21

f c l o s e ( fp ) ;
23

return 0;
25

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

294 / 341

Tpicos Relevantes Arquivos Exemplo 7b: Gravando um arranjo de estrutura em um arquivo


1

#include < s t d i o . h> typedef s t r u c t { i n t matricula ; char nome[ 6 0 ] ; } aluno ; i n t main ( i n t argc , char argv [ ] ) { F I L E fp ; aluno v [ 3 ] = { { 1 , " Ricardo T e r r a " } , { 2 , " V i r g i l i o Borges " } , { 3 , " Marco T u l i o " } } ; i n t tam = s i z e o f ( v ) / s i z e o f ( aluno ) ;

11

13

15

17

19

fp = fopen ( " aluno . bin " , "wb" ) ; / Abre para e s c r i t a / i f ( ! fp ) { p r i n t f ( " E r r o na abertura do arquivo . " ) ; r e t u r n 3; } f w r i t e ( v , s i z e o f ( aluno ) , tam, fp ) ; / Grava o arranjo de e s t r u t u r a /

21

23

f c l o s e ( fp ) ;
25

return 0;
27

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

295 / 341

Tpicos Relevantes Arquivos Exemplo 8b: Lendo vrias estruturas de um arquivo


1

#include < s t d i o . h> typedef s t r u c t { i n t matricula ; char nome[ 6 0 ] ; } aluno ; i n t main ( i n t argc , char argv [ ] ) { F I L E fp ; aluno a ; fp = fopen ( " aluno . bin " , " rb " ) ; / Abre para l e i t u r a / i f ( ! fp ) { p r i n t f ( " E r r o na abertura do arquivo . " ) ; r e t u r n 3; } while ( ! f e o f ( fp ) ) { i f ( fread (&a , s i z e o f ( aluno ) , 1 , fp ) ) { / Le a e s t r u t u r a / p r i n t f ( "A matricula %d pertence ao aluno %s \n " , a . matricula , a .nome) ; } } f c l o s e ( fp ) ;

11

13

15

17

19

21

23

25

return 0;
27

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

296 / 341

Tpicos Relevantes Arquivos Exemplo 9: Criando o cadastraAluno


1

#include < s t d i o . h> #include < s t d l i b . h> #include < s t r i n g . h> typedef s t r u c t { i n t matricula ; char nome[ 6 0 ] ; } aluno ; i n t main ( i n t argc , char argv [ ] ) { F I L E fp ; aluno a ; i f ( argc != 3) { p r i n t f ( " Uso : cadastra <matricula > \" <nome>\"\n " ) ; r e t u r n 2; } fp = fopen ( " aluno . bin " , " a+b " ) ; / Abre para e s c r i t a ao f i n a l / i f ( ! fp ) { p r i n t f ( " E r r o na abertura do arquivo . " ) ; r e t u r n 3; } a . matricula = a t o i ( argv [ 1 ] ) ; s t r c p y (a .nome, argv [ 2 ] ) ; f w r i t e (&a , s i z e o f ( aluno ) , 1 , fp ) ; f c l o s e ( fp ) ; return 0; } Linguagem C 1 de agosto de 2012 297 / 341

11

13

15

17

19

21

23

25

27

29

Ricardo Terra (rterrabh@gmail.com)

Contedo

1 2 3 4 5

Introduo Sintaxe Bsica Ponteiros Tpicos Relevantes Extras Funo printf Funo scanf Funes para manipular strings Outras funes relevantes

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

298 / 341

Extras
Funo printf

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

299 / 341

Extras Funo printf

A funo printf A funo printf parte de um conjunto de funes pr-denidas armazenadas em uma biblioteca padro de rotinas da linguagem C Ela permite apresentar na tela os valores de qualquer tipo de dado. Para tanto, printf utiliza o mecanismo de formatao, que permite traduzir a representao interna de variveis para a representao ASCII que pode ser apresentada na tela

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

300 / 341

Extras Funo printf

A funo printf O primeiro argumento de printf um string de controle, uma sequncia de caracteres entre aspas. Essa string, que sempre deve estar presente, pode especicar atravs de caracteres especiais (as sequncias de converso) quantos outros argumentos estaro presentes nesta invocao da funo Estes outros argumentos sero variveis cujos valores sero formatados e apresentados na tela

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

301 / 341

Extras Funo printf

A funo printf Por exemplo, se o valor de uma varivel inteira x 12, ento a execuo da funo:
printf("Valor de x = %d", x);

Imprime na tela a frase: Valor de x = 12

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

302 / 341

Extras Funo printf

A funo printf Se y uma varivel do tipo caractere com valor A, ento a execuo de:
printf("x = %d e y = %c \n", x, y);

Imprime na tela a frase: x = 12 e y = A seguida pelo caracter de nova linha (\n) , ou seja, a prxima sada para a tela aconteceria na linha seguinte Observe que a sequncia de converso pode ocorrer dentro de qualquer posio dentro da string de controle

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

303 / 341

Extras Funo printf

A funo printf A funo printf no tem um nmero xo de argumentos Em sua forma mais simples, pelo menos um argumento deve estar presente a string de controle. Uma string de controle sem nenhuma sequncia de converso ser literalmente impressa na tela
printf("Estou aprendendo C ANSI!");

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

304 / 341

Extras Funo printf

A funo printf Com variveis adicionais, a nica forma de saber qual o nmero de variveis que ser apresentado por inspeo da string de controle
Desta forma, cuidado deve ser tomado para que o nmero de variveis aps a string de controle esteja de acordo com o nmero de sequncias de converso presente na string de controle

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

305 / 341

Extras Funo printf

A funo printf Alm de ter o nmero correto de argumentos e sequncias de converso, o tipo de cada varivel deve estar de acordo com a sequncia de converso especicada na string de controle A sequncia de converso pode ser reconhecida dentro da string de controle por iniciar sempre com o caractere %

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

306 / 341

Extras Funo printf As principais sequncias de converso para variveis caracteres e inteiras so: %c %d %i %u %e %f %g %o %s %u %x %p
Caractere simples Inteiro L um decimal inteiro (no pode ser octal ou hexadecimal) L um decimal sem sinal Notao cientfica Ponto flutuante %e ou %f (escolher o mais curto) Octal Cadeia de caracteres (string) Inteiro sem sinal Hexadecimal Endereo de Memria

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

307 / 341

Extras Funo printf

Os principais cdigos especiais so: \n Nova linha \t \" \ \\ \0 Tabulao Aspas Apstrofe Barra invertida Nulo

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

308 / 341

Extras Funo printf

Exemplo Completo
1

#include < s t d i o . h> i n t main ( i n t argc , char argv [ ] ) { char c = A ; i n t i = 12; float f = 1.1; double d = 3 . 1 2 3 4 ; p r i n t f ( "%c %d %f % l f " , c , i , f , d ) ; return 0; }

11

Neste exemplo so impressas variveis de todos os tipos primitivos da linguagem C. Observe a sada: A - 12 - 1.100000 - 3.123400

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

309 / 341

Extras Funo printf Exemplo Completo Customizado


#include < s t d i o . h>
2

i n t main ( i n t argc , char argv [ ] ) { char c = A ; i n t i = 12; float f = 1.1; double d = 3 . 1 2 3 4 ; p r i n t f ( "%c %d %.2 f %.4 l f " , c , i , f , d ) ; return 0; }

10

Como o exemplo anterior, neste exemplo so impressas variveis de todos os tipos primitivos da linguagem C, contudo houve a formatao dos tipos float e double para exibir somente 2 e 4 casas decimais, respectivamente. Observe a sada: A - 12 - 1.10 - 3.1234
Ricardo Terra (rterrabh@gmail.com) Linguagem C 1 de agosto de 2012 310 / 341

Extras Funo printf Resumo

Resumo A funo printf parte de um conjunto de funes pr-denidas armazenadas em uma biblioteca padro de rotinas da linguagem C. Ela permite apresentar na tela os valores de qualquer tipo de dado Exemplo
int x = 5; printf("Valor de x = %d", x);

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

311 / 341

Extras Funo printf Resumo

Exemplo O exemplo anterior foi voltado uma varivel inteiro, contudo a mesma ideia pode ser seguida com os outros tipos primitivos
char c = A; printf("Valor de c = %c", c); float f = 3.14; printf("Valor de f = %f", f); double d = 9.290261; printf("Valor de d = %.2lf", d);

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

312 / 341

Extras
Funo scanf

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

313 / 341

Extras Funo scanf

A FUNO scanf A funo scanf uma das funes de entrada de dados da Linguagem C, que pode ser usada para ler virtualmente qualquer tipo de dado inserido por meio do teclado, frequentemente ela usada para a entrada de nmeros inteiros ou de ponto utuante A forma geral da funo scanf :
scanf("string de controle", lista de argumentos);

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

314 / 341

Extras Funo scanf

A FUNO scanf Os especicadores de formato de entrada so precedidos por um sinal % e dizem funo scanf qual tipo de dado deve ser lido em seguida Esses cdigos so listados na tabela a seguir

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

315 / 341

Extras Funo scanf

Cdigo %c %d %i %u %e %f %g %o %s %x %p
L um nico caractere L um decimal inteiro

Signicado

L um decimal inteiro (no pode ser octal ou hexadecimal) L um decimal sem sinal L um nmero em ponto flutuante com sinal opcional L um nmero em ponto flutuante com ponto opcional L um nmero em ponto flutuante com expoente opcional (double) L um nmero em base octal L uma string L um nmero em base hexadecimal L um ponteiro

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

316 / 341

Extras Funo scanf

Observe alguns exemplos: Espera que o usurio digite um inteiro. O valor digitado ser o contedo da varivel n
scanf("%d", &n);

Espera que o usurio digite um inteiro, um espao e um ponto utuante. O primeiro valor digitado ser o contedo da varivel m e o segundo valor ser o contedo da varivel n
scanf("%d %f", &m, &n);

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

317 / 341

Extras Funo scanf Foi refeito o exemplo do printf de forma que o usurio digite os valores a serem impressos
1

#include < s t d i o . h> i n t main ( i n t argc , char argv [ ] ) { char c ; i n t i ; f l o a t f ; double d ; p r i n t f ( " D i g i t e um scanf ( "%c " , &c ) ; p r i n t f ( " D i g i t e um scanf ( "%d " , & i ) ; p r i n t f ( " D i g i t e um scanf ( "%f " , &f ) ; p r i n t f ( " D i g i t e um scanf ( "% l f " , &d ) ; caractere : " ) ; inteiro : " ); float : " ) ; double : " ) ;

11

13

15

p r i n t f ( "%c %d %.2 f %.4 l f " , c , i , f , d ) ; return 0; }

17

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

318 / 341

Extras Funo scanf

Voc pode ler todas as variveis em um nico scanf


#include < s t d i o . h>
2

i n t main ( i n t argc , char argv [ ] ) { char c ; i n t i ; f l o a t f ; double d ; p r i n t f ( " D i g i t e o caractere , i n t e i r o , f l o a t e double : " ) ; scanf ( "%c %d %f % l f " , &c , &i , &f , &d ) ; p r i n t f ( "%c %d %.2 f %.4 l f " , c , i , f , d ) ;

10

return 0;
12

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

319 / 341

Extras Funo scanf O usurio deve digitar n nmeros conforme lidos e depois ser exibido a soma de todos eles. Note que o printf tem como nalidade somente orientar o usurio para a digitao dos nmeros
#include < s t d i o . h>
2

10

12

14

i n t main ( i n t argc , char argv [ ] ) { i n t n , num, soma, i ; p r i n t f ( " D i g i t e a quantidade de numeros a serem somados : " ) ; scanf ( "%d " , &n ) ; f o r ( i = 0 ; i < n ; i ++) { p r i n t f ( " D i g i t e o numero %d/%d : " , i + 1 , n ) ; scanf ( "%d " , &num) ; soma += num; } p r i n t f ( "Soma: %d " , soma ) ; return 0; }

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

320 / 341

Extras Funo scanf Resumo Resumo A funo scanf uma das funes de entrada de dados da Linguagem C, que pode ser usada para ler virtualmente qualquer tipo de dado inserido por meio do teclado Frequentemente, ela usada para a entrada de nmeros inteiros ou de ponto utuante Exemplo
int x; printf("Digite o valor de x: scanf("%d", &x); ");

Isso ocorre para leitura de variveis inteiras (x inteiro). Para outros tipos de variveis como char, float e double basta alterar %d para %c, %f e %lf, respectivamente
Ricardo Terra (rterrabh@gmail.com) Linguagem C 1 de agosto de 2012 321 / 341

Extras
Funes para manipular strings

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

322 / 341

Extras Funes para manipular strings

Biblioteca string.h A biblioteca string.h contm diversas funes para manipulao de strings. Por exemplo:
Comparar se dois strings so iguais Copiar um string para dentro de outro string

Eis as funes que veremos:


i n t strcmp ( char s t r 1 , char s t r 2 ) ; void strcpy ( char s t r D e s t i n o , char strOrigem ) ; void s t r c a t ( char s t r D e s t i n o , char s t r ) ;

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

323 / 341

Extras Funes para manipular strings

A funo strcmp A funo strcmp compara se dois strings so iguais. Como resultado tem-se:
Se forem iguais, retorna 0 Se str1 for maior que str2, retorna um valor positivo (>0) Se str1 for menor que str2, retorna um valor negativo (<0)

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

324 / 341

Extras Funes para manipular strings

Exemplo: comparando os strings str1 e str2


1

#include < s t d i o . h> #include < s t r i n g . h> i n t main ( i n t argc , char argv [ ] ) { char s t r 1 [ ] = " Joao " ; char s t r 2 [ ] = " Carlos " ; i f ( strcmp ( s t r 1 , s t r 2 ) == 0) { / sao i g u a i s ? / p r i n t f ( "%s = %s " , s t r 1 , s t r 2 ) ; } else { p r i n t f ( "%s ! = %s " , s t r 1 , s t r 2 ) ; } return 0;

11

13

15

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

325 / 341

Extras Funes para manipular strings

Sendo um pouco mais prossional...


1

#include < s t d i o . h> #include < s t r i n g . h> i n t main ( i n t argc , char argv [ ] ) { char s t r 1 [ ] = " Joao " ; char s t r 2 [ ] = " Carlos " ; ( ! strcmp ( s t r 1 , s t r 2 ) ) { / sao i g u a i s ? / p r i n t f ( "%s = %s " , s t r 1 , s t r 2 ) ; } else { p r i n t f ( "%s ! = %s " , s t r 1 , s t r 2 ) ; } return 0; if

11

13

15

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

326 / 341

Extras Funes para manipular strings A funo strcpy A funo strcpy copia para um string o contedo de um outro string Exemplo
1

#include < s t d i o . h> #include < s t r i n g . h> i n t main ( i n t argc , char argv [ ] ) { char s t r 1 [ 6 0 ] , s t r 2 [ 6 0 ] ; gets ( s t r 1 ) ; / l e o s t r 1 / strcpy ( s t r 2 , s t r 1 ) ; / copia s t r 1 para s t r 2 / p r i n t f ( " s t r 1 : %s \ n s t r 2 : %s " , s t r 1 , s t r 2 ) ; return 0; }

11

13

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

327 / 341

Extras Funes para manipular strings A funo strcat A funo strcat concatena para um string o contedo de um outro string Exemplo
2

#include < s t d i o . h> #include < s t r i n g . h> i n t main ( i n t argc , char argv [ ] ) { char s t r [ 6 0 ] ; strcpy ( s t r , " r t e r r a b h " ) ; s t r c a t ( s t r , " @gmail " ) ; s t r c a t ( s t r , " .com" ) ; p r i n t f ( " s t r : %s " , s t r ) ;

10

12

return 0;
14

}
Linguagem C 1 de agosto de 2012 328 / 341

Ricardo Terra (rterrabh@gmail.com)

Extras
Outras funes relevantes

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

329 / 341

Extras Outras funes relevantes

Biblioteca time.h Basicamente, a biblioteca time.h contm funes relativas a data/hora e medio de tempo Eis as funes que veremos:
clock_t clock ( ) ; time_t time ( time_t timer ) ;

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

330 / 341

Extras Outras funes relevantes

A funo clock A funo clock retorna o nmero de pulsos de clock decorrido desde o incio da execuo do programa Normalmente, utilizada para se medir o tempo de execuo de um programa:
Faz-se isso armazenando o nmero de pulsos de clock no incio e no nal do programa e ento se divide pelo macro CLOCKS_PER_SEC que armazena o nmero de pulsos de clock por segundo

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

331 / 341

Extras Outras funes relevantes

Exemplo: medindo o tempo de execuo do bonacci


1

#include < s t d i o . h> #include < s t d l i b . h> #include <time . h> long i n t f i b ( i n t n ) { i f ( n == 0 || n == 1) { / Ponto de Parada / return n ; } r e t u r n f i b ( n 1) + f i b ( n 2 ) ; / Codigo da Recursao / } i n t main ( i n t argc , char argv [ ] ) { clock_t s t a r t = clock ( ) ; int n; scanf ( "%d " , &n ) ; p r i n t f ( " f i b (%d) = %l d \n " , n , f i b ( n ) ) ; p r i n t f ( "TEMPO : %f s " , ( ( double ) ( clock ( ) s t a r t ) ) / CLOCKS_PER_SEC ) ; return 0; }

11

13

15

17

19

21

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

332 / 341

Extras Outras funes relevantes A funo time A funo time retorna o nmero de segundos a partir de 01/01/1970 Exemplo
2

#include < s t d i o . h> #include < time . h> i n t main ( i n t argc , char argv [ ] ) { time_t agora ; agora = time ( NULL ) ; p r i n t f ( "%l d segundos desde 01/01/1970\n " , agora ) ; p r i n t f ( "%l d horas desde 01/01/1970\n " , agora / 3 6 0 0 ) ; p r i n t f ( "%l d dias desde 01/01/1970\n " , agora / (3600 2 4 ) ) ; return 0; }

10

12

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

333 / 341

Extras Outras funes relevantes Biblioteca ctype.h Basicamente, a biblioteca ctype.h contm funes relativas a manipulao de caracteres Eis as funes que veremos:
i n t isalnum ( i n t c ) ; / alfanumerico? / i n t isalpha ( i n t c ) ; / alfabetico? / i n t i s d i g i t ( i n t c ) ; / d i g i t o ? / i n t i s l o w e r ( i n t c ) ; / caixa baixa? / i n t isupper ( i n t c ) ; / caixa alta ? / i n t tolower ( i n t c ) ; / converte para caixa baixa / i n t toupper ( i n t c ) ; / converte para caixa alta /

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

334 / 341

Extras Outras funes relevantes

Exemplo ctype.h
1

#include < s t d i o . h> #include <ctype . h> i n t main ( i n t argc , char argv [ ] ) { char ch ; scanf ( "%c " , &ch ) ; p r i n t f ( " Alfanumerico? %s \n " , ( ( isalnum (ch ) ) ? " sim " : " nao " ) ) ; p r i n t f ( " Alfabetico? %s \n " , ( ( isalpha (ch ) ) ? " sim " : " nao " ) ) ; p r i n t f ( " D i g i t o ? %s \n " , ( ( i s d i g i t (ch ) ) ? " sim " : " nao " ) ) ; p r i n t f ( " Caixa baixa? %s \n " , ( ( i s l o w e r (ch ) ) ? " sim " : " nao " ) ) ; p r i n t f ( " Caixa alta ? %s \n " , ( ( isupper (ch ) ) ? " sim " : " nao " ) ) ; p r i n t f ( "%c para %c\n " , ch , tolower (ch ) ) ; p r i n t f ( "%c para %c\n " , ch , toupper (ch ) ) ; return 0;

11

13

15

17

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

335 / 341

Extras Outras funes relevantes Biblioteca math.h Basicamente, a biblioteca math.h contm funes matemticas Eis as funes que veremos:
double log ( double x ) ; / logaritmo base natural ( l n ) / double log10 ( double x ) ; / logaritmo base 10 / double pow ( double x , double y ) ; / exponenciao / double s q r t ( double x ) ; / r a i z quadrada / double f l o o r ( double x ) ; / arredonda para baixo / double c e i l ( double x ) ; / arredonda para cima / / E outras comuns , t a i s como cos , s i n , tan . . . /

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

336 / 341

Extras Outras funes relevantes Exemplo math.h


1

#include < s t d i o . h> #include <math . h> i n t main ( i n t argc , char argv [ ] ) { double n ; scanf ( "% l f " , &n ) ; p r i n t f ( " l n (% l f ) = % l f \n " , n , log ( n ) ) ;

p r i n t f ( " log10(% l f ) = % l f \n " , n , log10 ( n ) ) ;


11

p r i n t f ( "% l f ao quadrado = % l f \n " , n , pow ( n , 2 ) ) ;


13

p r i n t f ( " r a i z quadrada de % l f = % l f \n " , n , s q r t ( n ) ) ;


15

p r i n t f ( "% l f arrend . para baixo = % l f \n " , n , f l o o r ( n ) ) ;


17

p r i n t f ( "% l f arrend . para cima = % l f \n " , n , c e i l ( n ) ) ;


19

return 0;
21

}
Linguagem C 1 de agosto de 2012 337 / 341

Ricardo Terra (rterrabh@gmail.com)

Extras Outras funes relevantes Biblioteca stdlib.h Basicamente, a biblioteca stblib.h contm funes de propsito geral, tais como converso, gerao de nmeros aleatrios etc Eis as funes que veremos:
i n t a t o i ( const char s t r ) ; / converte s t r i n g para i n t / double a t o f ( const char s t r ) ; long i n t a t o l ( const char s t r ) ; i n t rand ( void ) ; / converte s t r i n g para double / / converte s t r i n g para long /

/ gera um numero a l e a t o r i o / / semente da aleatoriedade /

void srand ( unsigned i n t seed ) ;

/ E outras j v i s t a s , t a i s como malloc , free . . . /

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

338 / 341

Extras Outras funes relevantes Exemplo stdlib.h


1

#include < s t d i o . h> #include < s t d l i b . h> #include <time . h> i n t main ( i n t argc , char argv [ ] ) { i n t numSecreto , numChute, l i m i t e S u p e r i o r ; i f ( argc != 2) { p r i n t f ( " Uso : adivinha < l i m i t e S u p e r i o r > " ) ; r e t u r n 2; } srand ( time ( NULL ) ) ; / I n i c i a l i z a a semente / l i m i t e S u p e r i o r = a t o i ( argv [ 1 ] ) ; / Converte s t r i n g para i n t e i r o / numSecreto = ( rand ( ) % l i m i t e S u p e r i o r ) + 1 ; / Gera numero secreto / do {

11

13

15

17

19

21

23

25

p r i n t f ( " Adivinhe o numero (1 ate %d ) : " , l i m i t e S u p e r i o r ) ; scanf ( "%d " , &numChute ) ; i f ( numSecreto < numChute) { p r i n t f ( " Menor\n " ) ; } else { p r i n t f ( " Maior\n " ) ; } } while ( numSecreto != numChute ) ; p r i n t f ( " Parabens ! " ) ; return 0; }

27

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

339 / 341

Agradecimentos

Gostaria de agradecer ao aluno Willer Henrique dos Reis pela tarefa de converso inicial dos slides em formato ppt para LaTeX

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

340 / 341

Referncias

Herbert Schildt. C: The Complete Reference. McGraw-Hill, 4 edition, 2000. Victorine Viviane Mizrahi. Treinamento em Linguagem C. Prentice-Hall, 2 edition, 2008.

Ricardo Terra (rterrabh@gmail.com)

Linguagem C

1 de agosto de 2012

341 / 341

Você também pode gostar