Вы находитесь на странице: 1из 66

Introduo a linguagem de programao C

Introduo a

LINGUAGEM DE PROGRAMAO C

Material cedido pela Profa. Judith Kelner do Centro de Informtica da UFPE

UFPE - Departamento de Informtica - Judith Kelner

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

UFPE - Departamento de Informtica - Judith Kelner

Introduo a linguagem de programao C

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

UFPE - Departamento de Informtica - Judith Kelner

Introduo a linguagem de programao C

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

UFPE - Departamento de Informtica - Judith Kelner

Introduo a linguagem de programao C

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.

UFPE - Departamento de Informtica - Judith Kelner

Introduo a linguagem de programao C

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

UFPE - Departamento de Informtica - Judith Kelner

Introduo a linguagem de programao C

Crticas D-se muita liberdade ao programador


Programas ininteligveis, acesso direto a memria

No permite o aninhamento de funes

No h verificao de tipos e nem de limites de arranjos


Simplifica o design do compilador C

O uso de apontadores pode se tornar muito confuso

Mensagens de erro muito vagas ( limitao do compilador )

Alguns comandos no podem ser definidos semanticamente

Constatao: no possui muitas facilidades para tratamento de arquivos

UFPE - Departamento de Informtica - Judith Kelner

Introduo a linguagem de programao C

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

Tipos de Arquivos Fontes em C

Arquivos fonte *.c Arquivos fonte *.h (stdio.h, math.h)

Bibliotecas em C

So utilizadas para facilitar o desenvolvimento de software Por exemplo, stdlib.a sempre includa em todos os programas C por default

UFPE - Departamento de Informtica - Judith Kelner

Introduo a linguagem de programao C

Palavras Chaves So sempre escritas com letras minsculas

auto do for return typedef

break double goto short union

case else if szeof unsigned

char entry int satic while

continue extern long struct

default float register switch

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)

UFPE - Departamento de Informtica - Judith Kelner

Introduo a linguagem de programao C

10

LINGUAGEM

T I P OS D E D A D O S

UFPE - Departamento de Informtica - Judith Kelner

Introduo a linguagem de programao C

11

Tipos de Dados

char int float double void

- 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)

Qualificadores para o tipo inteiro short long unsigned

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

UFPE - Departamento de Informtica - Judith Kelner

Introduo a linguagem de programao 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

Tamanho em Bits 8 8 8 16 16 16 16 8 8 32 32 32 32 64 128

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

Todos os tipos de dados defenidos pelo padro ANSI

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

UFPE - Departamento de Informtica - Judith Kelner

Introduo a linguagem de programao C

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

UFPE - Departamento de Informtica - Judith Kelner

Introduo a linguagem de programao C

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)

UFPE - Departamento de Informtica - Judith Kelner

Introduo a linguagem de programao C

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;

UFPE - Departamento de Informtica - Judith Kelner

Introduo a linguagem de programao C

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 ( ) { ... }

UFPE - Departamento de Informtica - Judith Kelner

Introduo a linguagem de programao C

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

UFPE - Departamento de Informtica - Judith Kelner

Introduo a linguagem de programao C

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

UFPE - Departamento de Informtica - Judith Kelner

Introduo a linguagem de programao C

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

UFPE - Departamento de Informtica - Judith Kelner

Introduo a linguagem de programao C

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;

UFPE - Departamento de Informtica - Judith Kelner

Introduo a linguagem de programao C

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

Converso de alguns tipos (assumindo uma palavra de 16 bits)

UFPE - Departamento de Informtica - Judith Kelner

Introduo a linguagem de programao C

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 + 1; x = x -1; x = 10; x = 10;

++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

UFPE - Departamento de Informtica - Judith Kelner

Introduo a linguagem de programao C

23

Operadores Lgicos
Operador && || ! Prioridade 6 7 1 Ao e ou no

Operadores para Manipulao de Bits (s para int e char)


Operador & | ^ ~ >> << Ao e ou ou exclusivo complemento de 1 deslocamento esquerda deslocamento direita

Ex:

ch & 127

11000001 01111111 & 01000001 127 ^ 120

com paridade

sem paridade 01111111 01111000 ^ (ou exclusivo) 00000111

128 | 3

10000000 00000011 | (ou) 10000011

UFPE - Departamento de Informtica - Judith Kelner

Introduo a linguagem de programao C

24

char x x = 7; x << 1; x << 3; x << 2; x >> 1; x >> 2;

x depois de cada comando 00000111 00001110 01110000 11000000 01100000 00011000

valor de x 7 14 112 192 96 24

Multiplicao e Diviso atravs do operador de deslocamento

Ex: complemento de 1 ~ 00101100 Operadores Especiais

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

UFPE - Departamento de Informtica - Judith Kelner

Introduo a linguagem de programao C

25

O operador , (vrgula) -Usado para juntar vrias expresses Ex: x = ( y = 3, y + 1);

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

UFPE - Departamento de Informtica - Judith Kelner

Introduo a linguagem de programao C

26

LI NGUAGEM

COMANDOS

DE

CONTROLE

UFPE - Departamento de Informtica - Judith Kelner

Introduo a linguagem de programao C

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

UFPE - Departamento de Informtica - Judith Kelner

Introduo a linguagem de programao C

28

switch Forma Geral: switch (expresso) { case constante1: comando(s) break; case constante2: comando(s) break; . . . default: comando(s) }

UFPE - Departamento de Informtica - Judith Kelner

Introduo a linguagem de programao C

29

Comando de Iterao for for (expressao_1; expressao_2; expressao_3)

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);

UFPE - Departamento de Informtica - Judith Kelner

Introduo a linguagem de programao C

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;

UFPE - Departamento de Informtica - Judith Kelner

Introduo a linguagem de programao C

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 */

UFPE - Departamento de Informtica - Judith Kelner

Introduo a linguagem de programao C

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); }

UFPE - Departamento de Informtica - Judith Kelner

Introduo a linguagem de programao C

33

LIGUAGEM

ARRANJOS

UFPE - Departamento de Informtica - Judith Kelner

Introduo a linguagem de programao C

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];

UFPE - Departamento de Informtica - Judith Kelner

Introduo a linguagem de programao C

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;

Funes para Manipulao de Strings


Nome strcpy (s1, s2) strcat (s1, s2) strlen (s1) strcmp (s1, s2) Funo copia s2 em s1 concatena s2 no fim de s1 retorna o tamanho de s1 retorna 0 se s1 e s2 forem do mesmo tamanho retorna < 0 se s1 < s2 retorna > 0 se s1 > s2 retorna um ponteiro para o primeiro caracter de ch em s1 retorna um ponteiro para a primeira ocorrncia de s2 em s1

strchr (s1, ch) strstr (s1, s2)

Estas funes operam sobre strings terminados com o caractere null (\0)

UFPE - Departamento de Informtica - Judith Kelner

Introduo a linguagem de programao C

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; . . . }

int nbranco = 0; int noutro = 0; int ndigito[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0} main ( ) { int c, j; . . . }

UFPE - Departamento de Informtica - Judith Kelner

Introduo a linguagem de programao C

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); }

UFPE - Departamento de Informtica - Judith Kelner

Introduo a linguagem de programao C

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 */

UFPE - Departamento de Informtica - Judith Kelner

Introduo a linguagem de programao C

39

LINGUAGEM

ESTRUTURAS

UNIES

UFPE - Departamento de Informtica - Judith Kelner

Introduo a linguagem de programao C

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

}; struct func serv1, serv2;

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

UFPE - Departamento de Informtica - Judith Kelner

Introduo a linguagem de programao C

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); }

UFPE - Departamento de Informtica - Judith Kelner

Introduo a linguagem de programao C

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); }

/* funcao que converte um string de nmeros s em um inteiro */

UFPE - Departamento de Informtica - Judith Kelner

Introduo a linguagem de programao C

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 */

UFPE - Departamento de Informtica - Judith Kelner

Introduo a linguagem de programao C

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); }

UFPE - Departamento de Informtica - Judith Kelner

Introduo a linguagem de programao C

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)); }

UFPE - Departamento de Informtica - Judith Kelner

Introduo a linguagem de programao C

46

LINGUAGEM FUNES

UFPE - Departamento de Informtica - Judith Kelner

Introduo a linguagem de programao C

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);

UFPE - Departamento de Informtica - Judith Kelner

Introduo a linguagem de programao C

48

Passagem do endereo de um componente Ex: func2 (&ex.x);

Passagem de uma Estrutura por referncia func3 (&ex);

UFPE - Departamento de Informtica - Judith Kelner

Introduo a linguagem de programao C

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

Introduo a linguagem de programao C

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 [ ]

UFPE - Departamento de Informtica - Judith Kelner

Introduo a linguagem de programao C

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 -

UFPE - Departamento de Informtica - Judith Kelner

Introduo a linguagem de programao C

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 %

Formatos para o comando printf

UFPE - Departamento de Informtica - Judith Kelner

Introduo a linguagem de programao C

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)); }

*/

UFPE - Departamento de Informtica - Judith Kelner

Introduo a linguagem de programao C

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); }

UFPE - Departamento de Informtica - Judith Kelner

Introduo a linguagem de programao C

55

Os caracacteres d, o, x e f podem ser precedidos por l


Formato %c %d %i %e %f %g %o %p %s %u %x Significado l um caracter l um inteiro decimal com sinal l um inteiro decimal com sinal l um nmero ponto flutuante l um nmero ponto flutuante l um nmero ponto flutuante l um octal l o endereo de um ponteiro l uma cadeia de caracteres l um inteiro sem sinal l um hexadecimal sem sinal

Formatos para o comando scanf

UFPE - Departamento de Informtica - Judith Kelner

Introduo a linguagem de programao C

56

LINGUAGEM

APO NTAD O R E S ( PO I NTE R S )

UFPE - Departamento de Informtica - Judith Kelner

Introduo a linguagem de programao C

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) ++;

UFPE - Departamento de Informtica - Judith Kelner

Introduo a linguagem de programao C

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

Introduo a linguagem de programao C

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); }

UFPE - Departamento de Informtica - Judith Kelner

Introduo a linguagem de programao C

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) ; }

UFPE - Departamento de Informtica - Judith Kelner

Introduo a linguagem de programao C

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( )

UFPE - Departamento de Informtica - Judith Kelner

Introduo a linguagem de programao C

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]); }

UFPE - Departamento de Informtica - Judith Kelner

Introduo a linguagem de programao C

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);

UFPE - Departamento de Informtica - Judith Kelner

Introduo a linguagem de programao C

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); }

UFPE - Departamento de Informtica - Judith Kelner

Introduo a linguagem de programao C

65

O Preprocessador C

Uma linha do tipo #include nome_arquivo substituda pelo contedo de nome_arquivo Substituio de macros:

#define TRUE 1

Exemplo: #define max (A, B) ((A) > (B) ? (A) : (B))

UFPE - Departamento de Informtica - Judith Kelner

Introduo a linguagem de programao C

66

UFPE - Departamento de Informtica - Judith Kelner