Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Ricardo Terra
rterrabh@gmail.com
Linguagem C
1 de agosto de 2012
1 / 341
Contedo
2 3 4 5
Linguagem C
1 de agosto de 2012
2 / 341
Introduo
Tpicos Importantes
Linguagem C
1 de agosto de 2012
3 / 341
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
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
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?
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
Linguagem C
1 de agosto de 2012
7 / 341
Exemplo de um programa C
1
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
Linguagem C
1 de agosto de 2012
8 / 341
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
Linguagem C
1 de agosto de 2012
9 / 341
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
Linguagem C
1 de agosto de 2012
10 / 341
Palavras reservadas
auto break case char const continue default do
Linguagem C
1 de agosto de 2012
11 / 341
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
Linguagem C
1 de agosto de 2012
12 / 341
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 )
Linguagem C
1 de agosto de 2012
15 / 341
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
Linguagem C
1 de agosto de 2012
17 / 341
Sintaxe Bsica
Expresses
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
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
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
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
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
Linguagem C
1 de agosto de 2012
24 / 341
Linguagem C
1 de agosto de 2012
25 / 341
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, ...
Linguagem C
1 de agosto de 2012
26 / 341
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 )
Linguagem C
1 de agosto de 2012
27 / 341
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
volative
O valor da varivel pode ser alterada de uma maneira no explicitamente especicada pelo programa Exemplo: volative double taxa = 0.65;
Linguagem C
1 de agosto de 2012
29 / 341
Linguagem C
1 de agosto de 2012
30 / 341
Linguagem C
1 de agosto de 2012
31 / 341
#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
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;
Linguagem C
1 de agosto de 2012
33 / 341
Em C, constantes referem-se a valores xos que o programa no pode alterar Constantes caracteres: A, B, C, ...
So envolvidas por aspas simples ()
Linguagem C
1 de agosto de 2012
34 / 341
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
Linguagem C
1 de agosto de 2012
37 / 341
Linguagem C
1 de agosto de 2012
38 / 341
Operador /
Operando inteiros:
Diviso Inteira: (7 / 2 = 3)
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
Operadores Aritmticos em Atribuies Compostas Em geral, os operadores aritmticos possuem um operador de atribuio correspondente:
Exemplo:
A = A + 2 A += 2
Outros: -= *= /= %=
Linguagem C
1 de agosto de 2012
40 / 341
#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
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
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 .
, , , ,
++ i ) ; i ); i ); i );
#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
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)
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
{ { { {
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
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
Linguagem C
1 de agosto de 2012
48 / 341
| (or)
Ex: 3 | 1 0011 | 0001 0011 3
(xor)
Ex: 3 1 0011 0001 0010 2
Linguagem C
1 de agosto de 2012
49 / 341
Linguagem C
1 de agosto de 2012
50 / 341
Exerccios 10 & 13 ? 10 | 13 ? 10 13 ? 0 ?
8 1 ? 2 2 ?
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
Sintaxe Bsica
Comandos condicionais
Linguagem C
1 de agosto de 2012
53 / 341
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 (? :)
Linguagem C
1 de agosto de 2012
54 / 341
Linguagem C
1 de agosto de 2012
55 / 341
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
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; }
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
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
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 " , ¬a ) ; 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
Linguagem C
1 de agosto de 2012
60 / 341
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
Linguagem C
1 de agosto de 2012
61 / 341
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 ; }
Linguagem C
1 de agosto de 2012
62 / 341
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
Linguagem C
1 de agosto de 2012
63 / 341
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
#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
#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
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
Linguagem C
1 de agosto de 2012
67 / 341
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 b) { { a; b;
Linguagem C
1 de agosto de 2012
68 / 341
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
Linguagem C
1 de agosto de 2012
69 / 341
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 ;
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 ; }
Linguagem C
1 de agosto de 2012
71 / 341
Sintaxe Bsica
Comandos de repetio
Linguagem C
1 de agosto de 2012
72 / 341
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)
Linguagem C
1 de agosto de 2012
73 / 341
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; }
Linguagem C
1 de agosto de 2012
74 / 341
#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
Linguagem C
1 de agosto de 2012
75 / 341
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
Linguagem C
1 de agosto de 2012
76 / 341
Sintaxe:
do { comando1; comando2; comandoN; } while ( condicao ) ;
Linguagem C
1 de agosto de 2012
77 / 341
11
Linguagem C
1 de agosto de 2012
78 / 341
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
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
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
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; }
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
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
10
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; }
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; }
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; }
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
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
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; }
Linguagem C
1 de agosto de 2012
90 / 341
Sintaxe Bsica
Arranjos
Linguagem C
1 de agosto de 2012
91 / 341
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
Linguagem C
1 de agosto de 2012
92 / 341
Assim como variveis comuns, os elementos do arranjo no so inicializados automaticamente. Contudo, voc pode declarar j inicializando:
2
Linguagem C
1 de agosto de 2012
93 / 341
Arranjos - Declarao Um arranjo de tamanho n, tem suas posies indexadas de 0 a n-1. Exemplo:
1
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 ) ;
Linguagem C
1 de agosto de 2012
94 / 341
#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 ) ;
11
13
Linguagem C
1 de agosto de 2012
95 / 341
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
Linguagem C
1 de agosto de 2012
96 / 341
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)
Linguagem C
1 de agosto de 2012
97 / 341
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
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
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
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 /
return 0;
12
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
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
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
Linguagem C
1 de agosto de 2012
104 / 341
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
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
Linguagem C
1 de agosto de 2012
106 / 341
Sintaxe Bsica
Variveis
Linguagem C
1 de agosto de 2012
107 / 341
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
Linguagem C
1 de agosto de 2012
108 / 341
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
Linguagem C
1 de agosto de 2012
109 / 341
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
Linguagem C
1 de agosto de 2012
110 / 341
Linguagem C
1 de agosto de 2012
111 / 341
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
Linguagem C
1 de agosto de 2012
112 / 341
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
Linguagem C
1 de agosto de 2012
113 / 341
#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; }
Linguagem C
1 de agosto de 2012
114 / 341
#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
Sintaxe Bsica
Funes
Linguagem C
1 de agosto de 2012
116 / 341
Funo Um programa C uma coleo de funes Uma das funes deve se chamar main
ponto de entrada
Linguagem C
1 de agosto de 2012
117 / 341
Isso no pode!
2
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
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
Linguagem C
1 de agosto de 2012
120 / 341
Exemplos
1
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
#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
Linguagem C
1 de agosto de 2012
122 / 341
Linguagem C
1 de agosto de 2012
123 / 341
Linguagem C
1 de agosto de 2012
124 / 341
#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
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
Linguagem C
1 de agosto de 2012
126 / 341
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
Linguagem C
1 de agosto de 2012
127 / 341
#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
Linguagem C
1 de agosto de 2012
129 / 341
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
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
Linguagem C
1 de agosto de 2012
131 / 341
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
Linguagem C
1 de agosto de 2012
132 / 341
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
Linguagem C
1 de agosto de 2012
133 / 341
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
Linguagem C
1 de agosto de 2012
134 / 341
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
Linguagem C
1 de agosto de 2012
135 / 341
#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 ; }
Linguagem C
1 de agosto de 2012
137 / 341
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( )
Linguagem C
1 de agosto de 2012
138 / 341
= 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
Linguagem C
1 de agosto de 2012
139 / 341
Linguagem C
1 de agosto de 2012
140 / 341
/ 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
Linguagem C
1 de agosto de 2012
141 / 341
/ 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
Linguagem C
1 de agosto de 2012
142 / 341
Linguagem C
1 de agosto de 2012
143 / 341
Linguagem C
1 de agosto de 2012
144 / 341
Sintaxe Bsica
Estruturas
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
Para declarar uma varivel do tipo data, faz-se como abaixo: struct data d;
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
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
#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
Linguagem C
1 de agosto de 2012
149 / 341
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
Linguagem C
1 de agosto de 2012
150 / 341
Exemplos (struct) Vamos a seguir, ver e entender mais exemplos utilizando estruturas
Linguagem C
1 de agosto de 2012
151 / 341
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)
Linguagem C
1 de agosto de 2012
152 / 341
#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
Linguagem C
1 de agosto de 2012
153 / 341
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)
Linguagem C
1 de agosto de 2012
154 / 341
10
12
14
16
18
20
22
24
26
28
Linguagem C
1 de agosto de 2012
155 / 341
11
13
15
17
19
21
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)
Linguagem C
1 de agosto de 2012
157 / 341
#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
Contedo
1 2 3
Introduo Sintaxe Bsica Ponteiros Conceitualizao Aritmtica Alocao Dinmica de Memria Alocao Dinmica de Arranjos Multidimensionais Tpicos Relevantes Extras
4 5
Linguagem C
1 de agosto de 2012
159 / 341
Ponteiros
Conceitualizao
Linguagem C
1 de agosto de 2012
160 / 341
Ponteiros Conceitualizao
Se uma varivel contm o endereo de uma outra, ento a primeira varivel dita apontar para a segunda
Eis a origem do nome ponteiro
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;
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
Ponteiros Conceitualizao
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
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
10
12
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
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
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
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
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
Linguagem C
1 de agosto de 2012
171 / 341
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
Linguagem C
1 de agosto de 2012
172 / 341
#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
15
17
19
Linguagem C
1 de agosto de 2012
173 / 341
Ponteiros
Aritmtica
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]
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);
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
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;
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 ] /
Linguagem C
1 de agosto de 2012
179 / 341
Ponteiros Aritmtica
#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
Linguagem C
1 de agosto de 2012
180 / 341
Ponteiros Aritmtica
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
Linguagem C
1 de agosto de 2012
181 / 341
Ponteiros Aritmtica
#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
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
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;
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
Linguagem C
1 de agosto de 2012
185 / 341
#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
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; }
14
16
18
20
22
Linguagem C
1 de agosto de 2012
187 / 341
#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
Linguagem C
1 de agosto de 2012
188 / 341
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
Linguagem C
1 de agosto de 2012
189 / 341
#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
Linguagem C
1 de agosto de 2012
190 / 341
Ponteiros
Alocao Dinmica de Memria
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; }
Linguagem C
1 de agosto de 2012
192 / 341
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
Linguagem C
1 de agosto de 2012
193 / 341
Linguagem C
1 de agosto de 2012
194 / 341
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
Linguagem C
1 de agosto de 2012
195 / 341
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
Linguagem C
1 de agosto de 2012
196 / 341
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
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
#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
15
17
19
21
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
Linguagem C
1 de agosto de 2012
200 / 341
#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
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
Linguagem C
1 de agosto de 2012
202 / 341
Ponteiros
Alocao Dinmica de Arranjos Multidimensionais
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
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
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; }
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
Linguagem C
1 de agosto de 2012
207 / 341
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
Linguagem C
mat = ( i n t ) malloc ( x s i z e o f ( i n t ) ) ;
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; } }
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
Linguagem C
1 de agosto de 2012
211 / 341
#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
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
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
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
Linguagem C
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
Linguagem C
1 de agosto de 2012
217 / 341
Tpicos Relevantes
Argumentos
Linguagem C
1 de agosto de 2012
218 / 341
importante mencionar que o parmetro argc ser, no mnimo, de tamanho 1, pois o argv[0] sempre o nome do aplicativo
Linguagem C
1 de agosto de 2012
219 / 341
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
Linguagem C
1 de agosto de 2012
220 / 341
./show 2 5.7
Numero de argumentos passados: argv[0] = ./show argv[1] = 2 argv[2] = 5.7 3
Linguagem C
1 de agosto de 2012
221 / 341
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
Linguagem C
1 de agosto de 2012
222 / 341
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
Linguagem C
1 de agosto de 2012
223 / 341
#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
Linguagem C
1 de agosto de 2012
224 / 341
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
Linguagem C
1 de agosto de 2012
225 / 341
Tpicos Relevantes
Unio
Linguagem C
1 de agosto de 2012
226 / 341
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 ;
Linguagem C
1 de agosto de 2012
227 / 341
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
Para declarar uma varivel do tipo intChar, faz-se como abaixo: intChar x;
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
Linguagem C
1 de agosto de 2012
229 / 341
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 (->)
Linguagem C
1 de agosto de 2012
230 / 341
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
16
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
Linguagem C
1 de agosto de 2012
232 / 341
#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
Linguagem C
1 de agosto de 2012
233 / 341
Tpicos Relevantes
Enumerao
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
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
Linguagem C
1 de agosto de 2012
236 / 341
#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
Linguagem C
1 de agosto de 2012
237 / 341
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
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
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
Linguagem C
1 de agosto de 2012
239 / 341
Tpicos Relevantes
Diretivas
Linguagem C
1 de agosto de 2012
240 / 341
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)
Linguagem C
1 de agosto de 2012
241 / 341
O pr-processador de C reconhece as seguintes diretivas: #include #define #undef #line #error #pragma #if #ifdef #ifndef #else #elif #endif
Linguagem C
1 de agosto de 2012
242 / 341
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
Linguagem C
1 de agosto de 2012
243 / 341
#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 ) ;
Linguagem C
1 de agosto de 2012
244 / 341
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);
Linguagem C
1 de agosto de 2012
245 / 341
#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
Linguagem C
1 de agosto de 2012
246 / 341
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
Linguagem C
1 de agosto de 2012
247 / 341
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
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
Linguagem C
1 de agosto de 2012
249 / 341
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
Linguagem C
1 de agosto de 2012
250 / 341
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
18
20
22
24
26
Tpicos Relevantes
Arquivos
Linguagem C
1 de agosto de 2012
252 / 341
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)
Linguagem C
1 de agosto de 2012
253 / 341
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
Linguagem C
1 de agosto de 2012
254 / 341
Linguagem C
1 de agosto de 2012
255 / 341
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
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 )
Linguagem C
1 de agosto de 2012
258 / 341
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
Linguagem C
1 de agosto de 2012
259 / 341
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
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
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
Linguagem C
1 de agosto de 2012
262 / 341
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
Linguagem C
1 de agosto de 2012
263 / 341
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
Linguagem C
1 de agosto de 2012
264 / 341
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
Linguagem C
1 de agosto de 2012
265 / 341
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
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
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
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
Linguagem C
1 de agosto de 2012
269 / 341
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
Linguagem C
1 de agosto de 2012
270 / 341
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
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 / ... }
Linguagem C
1 de agosto de 2012
272 / 341
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
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
Linguagem C
1 de agosto de 2012
275 / 341
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
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
16
18
20
22
24
26
Linguagem C
1 de agosto de 2012
277 / 341
#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
Linguagem C
1 de agosto de 2012
278 / 341
#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
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
Linguagem C
1 de agosto de 2012
280 / 341
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
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
Linguagem C
1 de agosto de 2012
283 / 341
Linguagem C
1 de agosto de 2012
284 / 341
Linguagem C
1 de agosto de 2012
285 / 341
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
Linguagem C
1 de agosto de 2012
286 / 341
#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
#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
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
Linguagem C
1 de agosto de 2012
288 / 341
Linguagem C
1 de agosto de 2012
289 / 341
Leitura e Escrita Binria As funes fread e fwrite so empregadas para leitura e escrita de dados binrios
Linguagem C
1 de agosto de 2012
290 / 341
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
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
#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
Linguagem C
1 de agosto de 2012
293 / 341
#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
f c l o s e ( fp ) ;
23
return 0;
25
Linguagem C
1 de agosto de 2012
294 / 341
#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
Linguagem C
1 de agosto de 2012
295 / 341
#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
Linguagem C
1 de agosto de 2012
296 / 341
#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
Contedo
1 2 3 4 5
Introduo Sintaxe Bsica Ponteiros Tpicos Relevantes Extras Funo printf Funo scanf Funes para manipular strings Outras funes relevantes
Linguagem C
1 de agosto de 2012
298 / 341
Extras
Funo printf
Linguagem C
1 de agosto de 2012
299 / 341
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
Linguagem C
1 de agosto de 2012
300 / 341
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
Linguagem C
1 de agosto de 2012
301 / 341
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);
Linguagem C
1 de agosto de 2012
302 / 341
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
Linguagem C
1 de agosto de 2012
303 / 341
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!");
Linguagem C
1 de agosto de 2012
304 / 341
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
Linguagem C
1 de agosto de 2012
305 / 341
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 %
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
Linguagem C
1 de agosto de 2012
307 / 341
Os principais cdigos especiais so: \n Nova linha \t \" \ \\ \0 Tabulao Aspas Apstrofe Barra invertida Nulo
Linguagem C
1 de agosto de 2012
308 / 341
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
Linguagem C
1 de agosto de 2012
309 / 341
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
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);
Linguagem C
1 de agosto de 2012
311 / 341
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);
Linguagem C
1 de agosto de 2012
312 / 341
Extras
Funo scanf
Linguagem C
1 de agosto de 2012
313 / 341
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);
Linguagem C
1 de agosto de 2012
314 / 341
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
Linguagem C
1 de agosto de 2012
315 / 341
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
Linguagem C
1 de agosto de 2012
316 / 341
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);
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
17
Linguagem C
1 de agosto de 2012
318 / 341
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
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; }
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
Linguagem C
1 de agosto de 2012
322 / 341
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
Linguagem C
1 de agosto de 2012
323 / 341
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)
Linguagem C
1 de agosto de 2012
324 / 341
#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
Linguagem C
1 de agosto de 2012
325 / 341
#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
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
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
Extras
Outras funes relevantes
Linguagem C
1 de agosto de 2012
329 / 341
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 ) ;
Linguagem C
1 de agosto de 2012
330 / 341
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
Linguagem C
1 de agosto de 2012
331 / 341
#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
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
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 /
Linguagem C
1 de agosto de 2012
334 / 341
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
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 . . . /
Linguagem C
1 de agosto de 2012
336 / 341
#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 ) ) ;
return 0;
21
}
Linguagem C 1 de agosto de 2012 337 / 341
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 /
Linguagem C
1 de agosto de 2012
338 / 341
#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
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
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.
Linguagem C
1 de agosto de 2012
341 / 341