Beruflich Dokumente
Kultur Dokumente
Introduo a
LINGUAGEM DE PROGRAMAO C
HISTRICO CARACTERSTICAS CRTICAS PROGRAMA EM C TIPOS DE ARQUIVOS FONTES EM C BIBLIOTECAS EM C PALAVRAS CHAVES VARIVEIS E CONSTANTES - TIPOS E DECLARAES TIPOS DE DADOS A NORMA ANSI C IDENTIFICADORES VARIVEIS
Onde declarar variveis
5 6 7 8 8 8 9 9 11 11 12 13
13
PARMETROS FORMAIS VARIVEIS GLOBAIS ESPECIFICADORES DE TIPOS DE ARMAZENAMENTO DEVARIVEIS CONSTANTES COMANDOS DE CONTROLE
14 15 16 18 27
COMANDO DE ITERAO COMANDO DE DESVIO ARRANJOS ESTRUTURAS UNIES EXEMPLOS: FUNES USO DE FUNES FUNES EM C PASSAGEM DE ESTRUTURAS PARA FUNES EXEMPLOS DO USO DE FUNES UTILIZAO DE PARMETROS FUNES DE ENTRADA E SADA APONTADORES (POINTERS) APONTADORES APONTADORES E ARGUMENTOS DE FUNES APONTADORES E ARRANJOS ARITMTICA COM ENDEREOS APONTADORES DE CARACTERE E FUNES
29 30 34 40 41 41 46 47 47 47 49 50 51 56 57 58 59 59 60
APONTADORES PARA FUNES APONTADORES PARA ESTRUTURAS FUNO PARA ABRIR E FECHAR ARQUIVOS LEITURA E GRAVAO EM ARQUIVOS EXEMPLOS O PREPROCESSADOR C
61 62 63 63 64 65
Histrico BCPL B C Projetada por Dennis Ritchie para ser implementada no sistema operacional Unix Evoluo: O Unix e os programas de aplicao implementados em C Linguagem de Implementao de vrios sistemas operacionais, interpretadores, editores, compiladores, software de comunicao, etc.
Caractersticas Linguagem de programao de finalidade geral uma linguagem que combina o alto nvel com o baixo nvel
permite a manipulao direta de bits, bytes, palavras e apontadores
Possui modernos fluxos de controle e estruturas de dados e, ainda, um rico conjunto de operadores Possui apenas 28 palavras-chaves (reservadas) Permite economia de expresso e gera cdigos reduzidos Permite estruturar o software em mdulos, arquivos fontes, bibliotecas facilmente transportvel (ANSI C) Alocao dinmica de memria C permite recursividade O uso da recursividade torna-se invivel quando o tempo ou o espao da memria forem crticos
Programa em C Consiste de uma (main) ou mais funes Um programa comea a ser executado no incio da funo main ( ), que invocar as demais funes A comunicao entre as funes feita atravs da passagem de argumentos e/ou variveis globais
Bibliotecas em C
So utilizadas para facilitar o desenvolvimento de software Por exemplo, stdlib.a sempre includa em todos os programas C por default
Variveis e Constantes - Tipos e Declaraes Declarao deve vir antes do uso Os nomes das variveis so constitudos de letras e dgitos, onde o primeiro caractere uma letra H diferena entre letras maisculas e minsculas Uso de letras maisculas para constantes (conveno)
10
LINGUAGEM
T I P OS D E D A D O S
11
Tipos de Dados
- tipo caractere (normalmente um byte) - tipo inteiro (tamanho natural de inteiro na mquina 2 bytes) - tipo ponto flutuante de preciso simples (1e-37 at 1e+37) - tipo ponto flutuante de preciso dupla - tipo explicto para funes ou ponteiros (ser visto a posterior)
A Norma ANSI C Diferentes compiladores C para diferentes arquitetura de hardware define tamanhos diferentes para o armazenamento dos tipos de dados da Linguagem C Isto poder gerar problemas de portabilidade dos fontes Definio da norma ANSI C
12
Tipo char unsigned char signed char int unsigned int signed int short int unsigned short int signed short int long int unsigned long int signed long int float double long double
Intervalo -127 127 0 255 -127 127 -32.767 32.767 0 65.535 Igual a int Igual a int 0 65.535 Igual a short int -2.147.483.647 2.147.483.647 0 4.294.967.295 Igual a long int Seis dgitos de preciso Dez dgitos de preciso Dez dgitos de preciso
Identificadores Usados para definir nomes de variveis, funes, rtulos (labels), etc. Consiste de um ou mais caracteres, o primeiro caracter deve ser letra ou _, os demais devem ser letras, ou nmeros ou _ Pode ter qualquer tamanho , os 6 primeiros caracteres devem ser significativos para serem usados como nomes externos, e os 31 primeiros caracteres para nomes internos
Correto contador test123 sala_de_aula Incorreto 1contador ola!turma sala-de-aula
13
Variveis uma posio da memria, identificada por um nome (identificador), usada para guardar um valor que poder ser usado, modificado pelo programa Todas as variveis em C devem ser declaradas Uma declarao consiste de um tipo (adcionado de algum qualificador) e de uma lista de variveis (separadas por vrgula) que sejam deste tipo Ex: int soma, total; double fact; char carac, ch; unsigned int idade; short int valor; C no inicializa as variveis Variveis podem ser inicializadas quando declaradas Ex: int eh_zero = 0, num_max = 5000; float pi = 2.1416, eps = 1.0e-5; Onde declarar variveis dentro de funes variveis locais definio dos parmetros das funes parmetros formais fora das funes variveis globais
14
Variveis Locais S pode ser referenciada dentro do bloco na qual foi definida, so criadas aps a sua definio e so destrudas aps a sada do bloco Um bloco identificado por um par de chaves { no nicio e } no fim, no mximo um bloco representa uma funo Variveis podem ser definidas em qualquer parte do bloco, normalmente as variveis so definidas logo no incio de uma funo ( a varivel local s pode ser referenciada depois de ter sido definida)
Parmetros Formais So usados para definir os argumentos de uma funo Comportamento igual ao de uma varivel local Lista de identificadores, separados por vrgula, aps o nome da funo entre parenteses Deve-se definir os parmetros e o tipo deles deve ser o mesmo definido para os argumentos usados na chamada da funo ( o compilador no verifica isto)
15
Variveis Globais Diferem das variveis locais por poderem ser usadas em qualquer parte do cdigo Existem durante todo o ciclo de vida do programa (ocupa memria) Normalmente so declaradas no nicio do programa e/ou em arquivos do tipo header (*.h) Se uma varivel local tem o mesmo nome de uma varivel global, dentro do bloco no qual foi definido a varivel local ela ter prioridade sobre a global Deve-se evitar o uso abusivo de variveis globais para evitar problemas de limitao de memria e de tempo de execuo As variveis globais s podem ser declaradas uma s vez O Tipo const Variveis do tipo const no podem ser modificadas pelo programa, entretanto elas podem ser inicializadas quando forem definidas Ex: const int a = 10;
16
Especificadores de Tipos de Armazenamento deVariveis extern static register auto extern Permite que dois ou mais arquivos compartilhem as mesmas variveis globais As variveis globais s podem ser declaradas uma s vez um mecanismo para importar variveis globais definidas em outros arquivos O escopo de uma varivel extern vai do ponto em que ela declarada no arquivo fonte at o fim do mesmo Para variveis automticas (locais) e argumentos, o escopo a funo em que o nome definido Declarao extern obrigatria em dois casos Declarao diferente de definio Ex: Arquivo 1: int ap = 0; /* apontador */ double val [MAXVAL]: Arquivo 2: extern int ap; extern double val[ ]; double empil (f) { ... } double desempil ( ) { ... }
17
static Quando usado em uma varivel local: instrui o compilador a manter a varivel local existente durante o tempo de vida do programa (ela s existe no bloco em que foi definida) Quando usado em uma varivel global: instrui o compilador a limitar o uso desta varivel ao arquivo onde ela foi definida Ex: int contador ( x) char x; { static int meucontador = 0; meucontador = meucontador + 1; ... }
register usado em variveis locais do tipo caractere ou inteiro, prov um acesso mais rpido a mesma (pode tambm ser usado nos parmetros formais). Em algums implementaes utiliza registradores ao invs de memria Ex: register int aux; for (aux = 0; aux < 100; aux++) { ... }
auto usado para declarar variveis locais. opcional e pouco usado porque default
18
Constantes So valores constantes fixos dentro do programa que no podem ser alterados
Tipo de Dado int long int short int unsigned int float double long double hexadecimal octal character string Exemplos 1 123 21000 -234 35000L -34L 10 -12 90 10000U 987U 40000 123.23F 4.34e -3F 123.23 12312333 -0.9876324 1001.2L int hex = 0x80 (128) int oct = 012 (10) a este e um teste
Cdigo \b \f \n \r \t \ \ \0 \\ \v \a \N \xN
Significado Espao Alimenta formulrio Pula linha Carriage return Tabulao horizontal Aspa dupla Aspa simples NULL \ Tabulao vertical Alerta Constante octal Constante hexadecimal
19
O uso de constantes simblicas torna o programa mais legvel. Geralmente so escritas com letras maisculas. O comando define neste exemplo ser processado pelo pr-processador do C (cpp) Ex: #define INICIO 0 /* limite inferior da tabela */ int #define GOS 0.1 /* grau de servico eh 10% */ double #define FIM 123L /* limite inferior */ long
20
Operadores atribuio aritmticos relacionais lgicos manipulao de bits (bitwise) especiais Atribuio O operador de atribuio pode ser usado em qualquer expresso vlida em C Forma geral: nome-da variavel = expressao ; O nome-da-variavel deve ser uma varivel ou um pointer (para um endereo vlido na memria) Mltiplas atribuies Ex:x = y = z = 0;
21
Quando tipos diferentes de variveis so usados ocorre uma converso de tipos nas seguintes situaes (este resultado depende da arquitetura do hardware)
Tipo da Varivel signed char char char char int int float double Tipo da Expresso char short int int long int long int float double long double Possveis Perdas Se valor > 127, valor final negativo 8 bits de mais alta ordem 8 bits de mais alta ordem 24 bits de mais alta ordem 16 bits de mais alta ordem parte fracionria e talvez mais info Preciso, resultado arredondado Preciso, resultado arredondado
22
Operadores Aritmticos
Operador + * / % -++ Prioridade 3 (1) 3 2 2 2 1 1 Ao subtrao ( unrio ) adio multiplicao diviso resto da diviso (s para int) decrementa incrementa
Ex:
++x; x--; y = 11 y = 10
y = ++x; y = x++;
Operadores Relacionais
Operador > >= < <= == != Prioridade 4 4 4 4 5 5 Ao maior que maior ou igual que menor que menor ou igual que igual diferente
23
Operadores Lgicos
Operador && || ! Prioridade 6 7 1 Ao e ou no
Ex:
ch & 127
com paridade
128 | 3
24
11010011
O operador ? Forma geral: Exp1 ? Exp2 : Exp3 Ex: x = 10; y = x > 9 ? 100 : 200; Os operadores & e * para pointers (ponteiros) - Um ponteiro o endereo de uma varivel na memria - Uma varivel do tipo ponteiro (pointer) pode ser declarada para um tipo especfico de dado - Ponteiros podem ser usados para: acesso rpido a elementos de arranjos; modificar os parmetros de chamad de uma funo; e acesso a estruturas dinmicas Ex: m = &contador; m recebe o endereo de contador q = *m; q recebe o valor que est armazenado no endereo m
25
Precedncia e Ordem de Avaliao A tabela abaixo apresenta um resumo das regras de precedncia e de`associatividade de todos os operadores vistos
Operador ( ) [ ] -> . ! ~ ++ - - - (tipo) * & sizeof * / % + << >> > => < <= == != & ^ | && || ?: ++ = -= etc. ,
Associatividade esquerda para direita direita para esquerda esquerda para direita esquerda para direita esquerda para direita esquerda para direita esquerda para direita esquerda para direita esquerda para direita esquerda para direita esquerda para direita esquerda para direita direita para esquerda direita para esquerda esquerda para direita
26
LI NGUAGEM
COMANDOS
DE
CONTROLE
27
Comandos de Controle
O ponto-e-virgula (;) usado como terminador de comandos seleo iterao desvio rtulo (label) expresso bloco
Comando de Seleo if Forma Geral: if (expresso) comando; else comando; Num aninhamento, o else associado ao mais recente if sem else
28
switch Forma Geral: switch (expresso) { case constante1: comando(s) break; case constante2: comando(s) break; . . . default: comando(s) }
29
inicializao condio de parada incremento comando; Loop infinito: for (; ;) comando; for sem corpo: for ( t=0; t < VALOR; t++);
while Forma Geral: while (condio) comando; do-while Forma Geral: do { comando(s) ; } while (condio);
30
Comando de Desvio return Forma Geral: return expresso; (opcional) goto Forma Geral: goto label; . . . label: comando; break Forma Geral: break; exit Forma Geral: void exit (int codigo-de-retorno); continue Forma Geral: continue;
31
Expresses Qualquer expresso vlida em C seguida de um ; Ex: func ( ); a = b + c; ; Bloco de Comandos Comandos agrupados que so tratados como uma unidade. Devem estar entre { } /* chamada de funcao */ /* comando de atribuicao */ /* comando nulo */
32
Exemplos main () { printf(programa em C\n); } main ( ) /* copia entrada na sada */ { int c; c = getchar( ) ; while (c != EOF) { putchar (c); c = getchar( ); } } main() /* teste da funcao de potencia */ { int j; for ( j = 0; j < 10; j++) printf ( %d %d %d\n, j , pot(2,j), pot(-3,j)); } pot (x, n) int x, n; { int j, p; p = 1; for (j = 1; j <= n; ++j) p = p * x; return (p); } main( ) { int c; while ((c = getchar( )) != EOF) putchar(c); }
33
LIGUAGEM
ARRANJOS
34
Arranjos
Coleo de variveis do mesmo tipo referenciadas por um s nome. Um elemento especfico num arranjo localizado por um ndice ou mais Os arranjos em C podem ter de 1 a N dimenses Pode-se declarar arranjos em quaisquer dos tipos de dados descritos anteriormente Os ndices de arranjos comeam sempre de 0 C no faz testes para os limites de um arranjo Arranjo Bi-dimensional Arranjos com vrias dimenses so declarados colocando-se a dimenso adicional dentro de outro par de colchetes Ex: float matriz [2] [2];
35
Strings O uso mais comum para os arranjos uni-dimensionais na declarao de strings (cadeia de caracteres) Em C um string definido como uma cadeia de caracteres que termina por um caractere null (\0). Portanto quando declarar o arranjo adicione 1 ao tamanho mximo Ex: char s [11]; s pode armazenar 10 caracteres s [10] deve ser o caracter null (\0) Em C no existe o tipo de dados string, porm existe a constante do tipo string Ex: char mensagem = ola a todos;
Estas funes operam sobre strings terminados com o caractere null (\0)
36
Arranjos de strings s utilizar o bi-dimensional arranjo de caracteres Ex: char str-array [30] [80];
Inicializao de Arranjos Ex: int j[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; char str [14] = Eu gosto de C; char str [14] = {E, u, , g, o, s, t, o, , d, e, , C, \0};
Ex: main ( ) { int c, j, nbranco, noutro; int ndigito[10]; nbranco = noutro = 0; for (j = 0; j < 10; j ++) ndigito[j] = 0; . . . }
37
Exemplos main () /* conta carac. na entrada */ { long int nc; nc = 0; while (getchar () != EOF) ++nc; printf (%ld\n, nc); } main () { double int nc; for (nc = 0; getchar() != EOF; ++nc) ; printf (%.0f\n, nc); }
main () /* conta digitos, espaco em branco, outros caracteres */ { int c, j, nbranco, noutro; int ndigito [10]; nbranco = noutro = 0; for (j = 0; j < 10; ++j) ndigito [j] = 0; while ((c = getchar()) != EOF) if (c >= 0 && c <= 9) ++ndigito [c - 0]; else if (c == || c== \n || c == \t) ++nbranco; else ++noutro; printf (digitos =); for (j = 0; j < 10; j++) printf (%d, ndigito [j]); printf(\nespacos em branco = %d, outros = %d\n, nbranco, noutro); }
38
Exemplos (continuao) /* exemplo do uso do continue */ for (j = 0; j < N; j++) { if (a[j] < 0) /* elementos negativos saltados */ continue; ... /* elementos positivos processados */ } /* exemplo do uso do goto */ for (j = 0; j < N; j++) for (k = 0; k < M; k++) if (v[j][k] < 0) goto achei; /* nao achei */ . . . achei: /* achei na posicao j, k */
39
LINGUAGEM
ESTRUTURAS
UNIES
40
Estruturas Pode-se criar combinaes de tipos de dados bsicos, utilizando struct e union Uma estrutura uma coleo de uma ou mais variveis que podem ser de tipos diferentes e que passam a ser referenciadas por um nico nome Forma Geral: struct tag { tipo nome-da variavel; tipo nome-da variavel; tipo nome-da variavel; . . . } variaveis-estruturas; Ex: struct func { int matr; char nome [40]; int setor; float salario; } serv1, serv2; { int char int float matr; nome [40]; setor; salario; struct func
O operador ponto (.) usado quando se quer referenciar um elemento individual de uma estrutura Ex: serv1.setor = 2112; serv1.salario = 2190000.21 Estruturas admitem aninhamento
41
Unies Uma union definida quando duas ou mais variveis compartilham a mesma rea de memria Ex: union qualq { char ch; int x; } aux1; x
byte 1
byte 2
ch Exemplos: struct data { int dia; int mes; int ano; int dia_ano; char nome_mes[4]; }; static int tab_dia[2][13] = { {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} };
dia_do_ano(ad) /* acha o dia do ano a partir do dia do mes */ struct data *ad; { int j, dia, bissexto; dia = ad -> dia; bissexto = ad -> ano % 4 = = 0 && ad -> ano % 100 ! = 0 || ad -> ano % 400 = = 0; for ( j = 1; j < ad -> mes; j++) dia = dia + tab_dia[bissexto][j]; return(dia); }
42
Exemplos (continuao) #define SIM 1 #define NAO 0 main( ) /* conta linhas, palavras, caracteres na entrada */ { int c, nl, np, nc, empalavra; empalavra = NAO; nl = np = nc = 0; while ((c = getchar( ) ) != EOF) { nc++; if (c = = \n) nl++; if (c = = || c = = \n || c = = \t) empalavra = NAO; else if (empalavra = = NAO) { empalavra = SIM; np++; } } } atoi (s) { int j, n = 0; for ( j = 0; s[j] >= 0 && s[j] <= 9; ++j) n = 10 * n + s[j] - 0; return (n); }
43
Exemplos (continuao) comprime (s, c) char s[ ]; int c; { int j, k; for (j = k = 0; s[j] != \0; j++) if (s[j] != c) s[k++] = s[j]; s[k] = \0; } contabits (n) /* conta os bits ligados em n */ unsigned n; { int b; for (b = 0; n != 0; n >>= 1) if (n & 01) b++; return (b); } /* remove todos os c de s */
44
Exemplos (continuao) pesq-binaria(x, v, n) /* acha x em v[0] ... v[n-1] */ int x, v[ ], n; { int inicio, fim, meio; inicio = 0; fim = n -1; while (inicio <= fim) { meio = (inicio + fim) / 2; if (x < v[meio]) fim = meio - 1; else if (x > v[meio]) inicio = meio + 1; else /* achou */ return(meio); } return (-1); }
45
Exemplos (continuao) /* imprimir a tabela de converso Fahrenheit-Celsius para f = 0, 20, ..., 300 */ main( ) { int inicio = 0, /* limite inferior da tabela */ fim = 300, /* limite superior */ incr = 20; /* incremento */ float fahr, celsius; fahr = inicio; while (fahr <= fim) { celsius = (5.0 / 9.0) * (fahr - 32.0); printf(%4.0f %6.1f\n, fahr, celsius); fahr = fahr + incr; } } /* imprimir a tabela de converso Fahrenheit-Celsius para f = 0, 20, ..., 300 */ #define INICIO 0 /* limite inferior da tabela */ #define FIM 300 /* limite superior */ #define INCR 20 /* incremento */ main( ) { int fahr; for (fahr = INICIO; fahr <= FIM; fahr += INCR) printf(%4.0f %6.1f\n, fahr, (5.0 / 9.0) * (fahr - 32)); }
46
LINGUAGEM FUNES
47
Uso de Funes Funes dividem grandes tarefas de computao em partes menores e simples Um programa estruturado em C como um conjunto de definies individuais de funes O programa fonte pode ser dividido em arquivos mltiplos
Funes em C Comunicao feita por argumentos e valores retornados O return define um mecanismo para retornar um valor de uma funo chamada para a sua chamadora As funes podem ocorrer em qualquer ordem no arquivo fonte C permite que declaremos o tipo que uma funo ir retornar A rotina chamadora deve estabelecer que a funo chamada retorna um valor no inteiro Por default, o tipo de uma funo int Passagem de Estruturas para Funes Pode se pssar um elemento de uma estrutura por valor Ex: struct exemplo { char x; int y; } ex;
func1 (ex.x);
48
49
Exemplos do uso de Funes double fatorial (num) int num; /* Retorna o fatorial de um numero. Se um erro ocorre, ela retorna o valor -1 e emite uma mensagem */ { double aux, fact; if (num < 0) { printf (\n Erro: fatorial de um numero negativo!); fact = -1.0; } else { fact = 1.0; for (aux = num; aux > 0: aux --) fact *= aux; } return (fact); } atoi (s) /* converte um string num inteiro */ char s[ ]; { int j, n, sinal; for (j = 0; s[j] == || s[j] == \n || s[j] == \t; j++) ; /* pula espacos em branco */ sinal = 1; if (s[j] == + || s[j] == -) /* sinal */ sinal = (s[j++] == +) ?1:-1; for (n = 0; s[j] >= 0 && s[j] <= 9; j++) n = 10 * n + s[j] - 0; return(sinal * n);
}
UFPE - Departamento de Informtica - Judith Kelner
50
Utilizao de Parmetros A passagem de argumentos pode ser feita por: valor referncia (endereo), por exemplo, o endereo de um arranjo As funes em C aceitam um nmero varivel de argumentos (no transportvel) As variveis externas (globais) so definidas fora de qualquer funo e ficam disponveis para qualquer funo As funes so sempre externas (no h aninhamento) Deve-se usar variveis externas quando h um grnde nmero de funes que fazem uso das mesmas O escopo de um nome a parte do programa para o qual o nome definido Para variveis automticas (locais) e argumentos, o escopo a funo em que o nome definido Num programa C deve ter pelo menos a funo main ( ) onde comea a execuo A funo main ( ) tem dois argumentos: argc
argv [ ]
51
Funes de Entrada e Sada As funes de entrada e sada esto definidas no arquivo header stdio.h A Funo Printf Permite a impresso de quantidades numricas, strings, caracteres, etc. Forma Geral: printf (controle, arg1, arg2, ... ) caracteres ordinrios e especificaes de converso ( % ) Entre o % e o caractere de converso pode haver: sinal de menos cadeia de dgitos (tamanho mnimo) um ponto cadeia de dgitos modificador de tamanho (l) Caracteres de converso: d, o, x, u, c, s, e, f e g Ex: printf(fatorial de %d = %g\n, num, fatorial(num)); Por default todos os tipos so ajustados direita, para ajustar esquerda inclua o caractere -
52
Formato %c %d %i %e %E %f %g %G %o %p %s %u %x %X %%
Significado caracter inteiro decimal com sinal inteiro decimal com sinal notao cientfica com e notao cientfica com E ponto flutuante decimal escolhe %e ou %f ,o menor dos dois formatos escolhe %E ou %f ,o menor dos dois formatos octal imprime o endereo de um ponteiro cadeia de caracteres inteiro decimal sem sinal hexadecimal sem sinal (letras minsculas) hexadecimal sem sinal (letras maisculas) imprime o caracter %
53
Exemplo main ( ) { int num; double fatorial; printf (\n Entre com um numero:); scanf (%d, &num); printf (\n Fatorial de %d %f\n, num, fatorial(num)); } double fatorial (x) int x; /* Calcula o fatorial de um numero recursivamente. Retorna um valor negativo se recebe como parametro um numero negativo { if (x < 0) { printf (\n Erro: fatorial de um numero negativo!!!); return (-1); } else if (x == 0) return (1); else return (x * fatorial (x - 1)); }
*/
54
A funo Scanf Usada para a entrada (leitura) de dados, para string ler at o primeiro espao em branco, ou o return, ou o tab. Forma Geral: scanf ( controle, arg1, arg2, . . .) Devem ser apontadores Anlogo ao printf A cadeia de controle pode conter Espaos em branco Caracteres ordinrios Especificaes de converso Um nmero (opcional) especificando o tamanho do campo Caracteres de converso Caracteres de converso aceitos: d, o, x, h, c, s e f Ex: Note que a funo scanf est usando passagem de parmetros por referncia #include <stdio.h> main ( ) /* calculadora elementar */ { double soma, v; soma = 0; while (scanf (%lf, &v) != EOF) printf (\t%.2f\n, soma += v); }
55
56
LINGUAGEM
57
Apontadores Um apontador uma varivel que contm o endereo de outra varivel Levam a um cdigo mais compacto e eficiente (disciplina) aplicado apenas a variveis, elementos de arranjos e elementos de estruturas O operador unrio & fornece o endereo de um objeto Ex: px = &x; O operador unrio * trata seu operando como endereo Ex: y = *px; necessrio haver declarao de tais variveis Ex: int x, y; int *px; Podem ocorrer em expresses (os operadores * e & tm precedncia sobre os demais operadores) Ex: y = *px + 1; * ( px + 1 ) *px = 0; (*px) ++;
58
Apontadores e Argumentos de Funes Apontadores so utilizados quando se quer passar valores por referncia O programa chamador passa apontadores para as variveis que se quer atualizar Ex: troca (ax, ay) /* permuta *ax e *ay */ int *ax, *ay; { int temp; temp = *ax; *ax = *ay; *ay = temp; }
Uso comum quando uma funo deve retornar mais de um valor Ex: leint (an) /* le proximo caracter da entrada */ int *an; { int c, sinal; while (( c = getch( )) = = || c = = \n || c = = \t) ; /* pula espaco em branco */ sinal = 1; if (( c = = + || c = = -) /* guarda o sinal */ { sinal = (c = = +) ? 1 : -1; c = getch ( ); } for (*an = 0; c >= 0 && c <=9; c = getch ( )) *an = 10 ** an + c - 0; *an *= sinal; if (c != EOF) ungetch ( c); return (c); }
UFPE - Departamento de Informtica - Judith Kelner
59
Apontadores e Arranjos
Existe um relacionamento muito estreito entre arranjos e apontadores Ex: int a[10]; int *pa; pa = &a[0]; /* pa = a */ x = *(pa + 1) /* refere-se ao conteudo de a[1] */ Obs: a[j] idntico a *( a + j ) Qualquer arranjo e expresso indexada podem ser escritos como um apontador e deslocamento ( vice-versa ) possvel passar parte de um arranjo para uma funo Aritmtica com Endereos Se p um apontador, ento p++ faz p apontar para o prximo elemento, independente do tipo para o qual p aponta Ex: strlen (s) /* retorna o tamanho da cadeia s */ char *s; { char *ap = s; while (*ap != \0) ap++; return (ap - s); }
60
Operaes permitidas com apontadores: adio/subtrao com inteiro; adio/subtrao/comparao de dois apontadores NULL e p < q Apontadores de Caractere e Funes
Quando uma cadeia de caracteres aparece num programa, o acesso a mesma feito atravs de um apontador de caractere Ex: char *mensagem; mensagem = sou uma cadeia; strcpy (s, t) /* copia t em s */ char s[ ], t[ ]; { int j; j = 0; while ((s[j] = t[j] != \0) j++; } Note que: *++p *p++ possvel criar apontadores para apontadores Ex: int *tab_dia[13]; arranjo de apontadores strcpy (s, t) /* copia t em s*/ char *s, *t; { while ((*s++ = *t++) != \0) ; }
61
Arranjos de apontadores podem ser incializados Ex: char *nome_mes (n) /* retorna o nome do n-esimo mes */ int n; { static char *nome[ ] = { mes ilegal, janeiro, fevereiro, ... dezembro }; return ((n < 1 || n > 12) ? nome[0] : nome[n]); } Apontadores para Funes
possvel definir um apontador para uma funo Tal apontador pode ser manipulado, passado como argumento, colocado em arranjos, etc. Note que: int (*comp) ( ) != int *comp( )
62
Apontadores para Estruturas Ex: struct addr *addr-pointer; A referncia para um elemento de uma estrutura atravs de um apontador para esta estrutura feita usando o operador -> Ex: struct exemplo { float numero; char nome [80]; } pessoa; struct exemplo *ptr; ptr = &pessoa; ptr -> nome = Luis; Argumentos da Linha de Comando Os nicos argumentos permitidos para a funo main so argc e argv apontador para os argumentos passados nmero de argumentos da linha de comando Ex: main (argc, argv) int argc; char *argv[ ]; { if (argc < 2) printf (Entre com seu nome na linha de comando\n); else printf(Ola %s\n, argv[1]); }
63
argv[0] o nome do programa e argv[1] o primeiro argumento Funo para abrir e fechar arquivos Existncia de um apontador de arquivo Ex: FILE *fp, *fopen ( ); fp = fopen (nome, modo); Os modos de abertura podem ser os seguintes: r - leitura w - gravao a - adio O apontador nulo, NULL, retornado se h um erro fclose ( ) para fechar arquivos Leitura e Gravao em Arquivos Para ler ou gravar num arquivo, pode-se usar: getc ( ), putc ( ), fscanf ( ), fprintf ( ) Ex: c = getc (fp); putc (c, fp);
64
Exemplos #include <stdio.h> main (argc, argv) /* cat: concatena arquivos */ int argc; char *argv[ ]; { FILE *fp, *fopen ( ); if (argc = = 1) /* nao tem argumentos; copia entrada padrao */ copia_arq (stdin); else while (--argc > 0) if ((fp = fopen (*++argv, r)) = = NULL) { fprintf (stderr, Erro: cat nao pode abrir %s\n, *argv); exit (1); } else { copia_arq (fp); fclose (fp); } exit (0); } copia_arq (fp) /* copia arquivo fp na saida padrao */ FILE *fp; { int c; while ((c = getc (fp) != EOF) putc (c, stdout); }
65
O Preprocessador C
Uma linha do tipo #include nome_arquivo substituda pelo contedo de nome_arquivo Substituio de macros:
#define TRUE 1
66