Anda di halaman 1dari 66

1

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


2
Introduo a linguagem de programao C

HISTRICO 5

CARACTERSTICAS 6

CRTICAS 7

PROGRAMA EM C 8

TIPOS DE ARQUIVOS FONTES EM C 8

BIBLIOTECAS EM C 8

PALAVRAS CHAVES 9

VARIVEIS E CONSTANTES - TIPOS E DECLARAES 9

TIPOS DE DADOS 11

A NORMA ANSI C 11

IDENTIFICADORES 12

VARIVEIS 13

Onde declarar variveis 13

PARMETROS FORMAIS 14

VARIVEIS GLOBAIS 15

ESPECIFICADORES DE TIPOS DE ARMAZENAMENTO DEVARIVEIS 16

CONSTANTES 18

COMANDOS DE CONTROLE 27

UFPE - Departamento de Informtica - Judith Kelner


3
Introduo a linguagem de programao C

COMANDO DE ITERAO 29

COMANDO DE DESVIO 30

ARRANJOS 34

ESTRUTURAS 40

UNIES 41

EXEMPLOS: 41

FUNES 46

USO DE FUNES 47

FUNES EM C 47

PASSAGEM DE ESTRUTURAS PARA FUNES 47

EXEMPLOS DO USO DE FUNES 49

UTILIZAO DE PARMETROS 50

FUNES DE ENTRADA E SADA 51

APONTADORES (POINTERS) 56

APONTADORES 57

APONTADORES E ARGUMENTOS DE FUNES 58

APONTADORES E ARRANJOS 59

ARITMTICA COM ENDEREOS 59

APONTADORES DE CARACTERE E FUNES 60

UFPE - Departamento de Informtica - Judith Kelner


4
Introduo a linguagem de programao C

APONTADORES PARA FUNES 61

APONTADORES PARA ESTRUTURAS 62

FUNO PARA ABRIR E FECHAR ARQUIVOS 63

LEITURA E GRAVAO EM ARQUIVOS 63

EXEMPLOS 64

O PREPROCESSADOR C 65

UFPE - Departamento de Informtica - Judith Kelner


5
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


6
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


7
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


8
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


9
Introduo a linguagem de programao C

Palavras Chaves
So sempre escritas com letras minsculas

auto break case char continue default


do double else entry extern float
for goto if int long register
return short szeof satic struct switch
typedef union unsigned while

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


10
Introduo a linguagem de programao C

LINGUAGEM C

T I P OS D E D A D O S

UFPE - Departamento de Informtica - Judith Kelner


11
Introduo a linguagem de programao C

Tipos de Dados

char - tipo caractere (normalmente um byte)

int - tipo inteiro (tamanho natural de inteiro na mquina 2 bytes)

float - tipo ponto flutuante de preciso simples (1e-37 at 1e+37)

double - tipo ponto flutuante de preciso dupla

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


12
Introduo a linguagem de programao C

Tipo Tamanho em Bits Intervalo


char 8 -127 127
unsigned char 8 0 255
signed char 8 -127 127
int 16 -32.767 32.767
unsigned int 16 0 65.535
signed int 16 Igual a int
short int 16 Igual a int
unsigned short int 8 0 65.535
signed short int 8 Igual a short int
long int 32 -2.147.483.647 2.147.483.647
unsigned long int 32 0 4.294.967.295
signed long int 32 Igual a long int
float 32 Seis dgitos de preciso
double 64 Dez dgitos de preciso
long double 128 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 Incorreto
contador 1contador
test123 ola!turma
sala_de_aula sala-de-aula

UFPE - Departamento de Informtica - Judith Kelner


13
Introduo a linguagem de programao C

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


14
Introduo a linguagem de programao C

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


15
Introduo a linguagem de programao C

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


16
Introduo a linguagem de programao C

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: Arquivo 2:
int ap = 0; /* apontador */ extern int ap;
double val [MAXVAL]: extern double val[ ];
double empil (f) { ... }
double desempil ( ) { ... }

UFPE - Departamento de Informtica - Judith Kelner


17
Introduo a linguagem de programao C

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


18
Introduo a linguagem de programao C

Constantes

So valores constantes fixos dentro do programa que no podem ser alterados

Tipo de Dado Exemplos


int 1 123 21000 -234
long int 35000L -34L
short int 10 -12 90
unsigned int 10000U 987U 40000
float 123.23F 4.34e -3F
double 123.23 12312333 -0.9876324
long double 1001.2L
hexadecimal int hex = 0x80 (128)
octal int oct = 012 (10)
character a
string este e um teste

Cdigo Significado
\b Espao
\f Alimenta formulrio
\n Pula linha
\r Carriage return
\t Tabulao horizontal
\ Aspa dupla
\ Aspa simples
\0 NULL
\\ \
\v Tabulao vertical
\a Alerta
\N Constante octal
\xN Constante hexadecimal

UFPE - Departamento de Informtica - Judith Kelner


19
Introduo a linguagem de programao C

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


20
Introduo a linguagem de programao C

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


21
Introduo a linguagem de programao C

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 Tipo da Expresso Possveis Perdas


signed char char Se valor > 127, valor final negativo
char short int 8 bits de mais alta ordem
char int 8 bits de mais alta ordem
char long int 24 bits de mais alta ordem
int long int 16 bits de mais alta ordem
int float parte fracionria e talvez mais info
float double Preciso, resultado arredondado
double long double Preciso, resultado arredondado

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

UFPE - Departamento de Informtica - Judith Kelner


22
Introduo a linguagem de programao C

Operadores Aritmticos

Operador Prioridade Ao
- 3 (1) subtrao ( unrio )
+ 3 adio
* 2 multiplicao
/ 2 diviso
% 2 resto da diviso (s para int)
-- 1 decrementa
++ 1 incrementa

Ex: x = x + 1; ++x;

x = x -1; x--;

x = 10; y = ++x; y = 11

x = 10; y = x++; y = 10

Operadores Relacionais

Operador Prioridade Ao
> 4 maior que
>= 4 maior ou igual que
< 4 menor que
<= 4 menor ou igual que
== 5 igual
!= 5 diferente

UFPE - Departamento de Informtica - Judith Kelner


23
Introduo a linguagem de programao C

Operadores Lgicos

Operador Prioridade Ao
&& 6 e
|| 7 ou
! 1 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 com paridade


01111111
&
01000001 sem paridade

128 | 3 10000000 127 ^ 120 01111111


00000011 01111000
| (ou) ^ (ou exclusivo)
10000011 00000111

UFPE - Departamento de Informtica - Judith Kelner


24
Introduo a linguagem de programao C

char x x depois de cada comando valor de x


x = 7; 00000111 7
x << 1; 00001110 14
x << 3; 01110000 112
x << 2; 11000000 192
x >> 1; 01100000 96
x >> 2; 00011000 24

Multiplicao e Diviso atravs do operador de deslocamento


Ex: complemento de 1
~ 00101100 11010011
Operadores Especiais

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


25
Introduo a linguagem de programao C

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 Associatividade
( ) [ ] -> . esquerda para direita
! ~ ++ - - - (tipo) * & sizeof 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
++ = -= etc. direita para esquerda
, esquerda para direita

UFPE - Departamento de Informtica - Judith Kelner


26
Introduo a linguagem de programao C

LI NGUAGEM C

COMANDOS DE CONTROLE

UFPE - Departamento de Informtica - Judith Kelner


27
Introduo a linguagem de programao C

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


28
Introduo a linguagem de programao C

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

UFPE - Departamento de Informtica - Judith Kelner


29
Introduo a linguagem de programao C

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


30
Introduo a linguagem de programao C

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


31
Introduo a linguagem de programao C

Expresses

Qualquer expresso vlida em C seguida de um ;

Ex: func ( ); /* chamada de funcao */

a = b + c; /* comando de atribuicao */

; /* comando nulo */

Bloco de Comandos

Comandos agrupados que so tratados como uma unidade. Devem estar entre

{ }

UFPE - Departamento de Informtica - Judith Kelner


32
Introduo a linguagem de programao C

Exemplos

main ()
{
printf(programa em C\n);
}

main ( ) /* copia entrada na sada */ main( )


{ {
int c; int c;

c = getchar( ) ; while ((c = getchar( )) != EOF)


while (c != EOF) putchar(c);
{ }
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); }

UFPE - Departamento de Informtica - Judith Kelner


33
Introduo a linguagem de programao C

LIGUAGEM C

ARRANJOS

UFPE - Departamento de Informtica - Judith Kelner


34
Introduo a linguagem de programao C

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


35
Introduo a linguagem de programao C

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

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

UFPE - Departamento de Informtica - Judith Kelner


36
Introduo a linguagem de programao C

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 nbranco = 0;
{ int noutro = 0;
int c, j, nbranco, noutro; int ndigito[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
int ndigito[10];
main ( )
nbranco = noutro = 0; {
for (j = 0; j < 10; j ++) int c, j;
ndigito[j] = 0;
. . . . . .
} }

UFPE - Departamento de Informtica - Judith Kelner


37
Introduo a linguagem de programao C

Exemplos

main () /* conta carac. na entrada */ main ()


{ {
long int nc; double int nc;
nc = 0; for (nc = 0; getchar() != EOF; ++nc)
while (getchar () != EOF) ;
++nc; printf (%.0f\n, nc);
printf (%ld\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


38
Introduo a linguagem de programao C

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


39
Introduo a linguagem de programao C

LINGUAGEM C

ESTRUTURAS E UNIES

UFPE - Departamento de Informtica - Judith Kelner


40
Introduo a linguagem de programao C

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 struct func


{ {
int matr; int matr;
char nome [40]; char nome [40];
int setor; int setor;
float salario; float salario;
} serv1, serv2; };
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


41
Introduo a linguagem de programao C

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 static int tab_dia[2][13] = {
{ {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
int dia; {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
int mes; };
int ano;
int dia_ano;
char nome_mes[4];
};

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


42
Introduo a linguagem de programao C

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) /* funcao que converte um string de nmeros s em um inteiro */

{
int j, n = 0;

for ( j = 0; s[j] >= 0 && s[j] <= 9; ++j)

n = 10 * n + s[j] - 0;

return (n);

UFPE - Departamento de Informtica - Judith Kelner


43
Introduo a linguagem de programao C

Exemplos (continuao)
comprime (s, c) /* remove todos os c de s */

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

UFPE - Departamento de Informtica - Judith Kelner


44
Introduo a linguagem de programao C

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


45
Introduo a linguagem de programao C

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


46
Introduo a linguagem de programao C

LINGUAGEM C

FUNES

UFPE - Departamento de Informtica - Judith Kelner


47
Introduo a linguagem de programao C

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


48
Introduo a linguagem de programao C

Passagem do endereo de um componente


Ex: func2 (&ex.x);

Passagem de uma Estrutura por referncia


func3 (&ex);

UFPE - Departamento de Informtica - Judith Kelner


49
Introduo a linguagem de programao C

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

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


51
Introduo a linguagem de programao C

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


52
Introduo a linguagem de programao C

Formato Significado
%c caracter
%d inteiro decimal com sinal
%i inteiro decimal com sinal
%e notao cientfica com e
%E notao cientfica com E
%f ponto flutuante decimal
%g escolhe %e ou %f ,o menor dos dois formatos
%G escolhe %E ou %f ,o menor dos dois formatos
%o octal
%p imprime o endereo de um ponteiro
%s cadeia de caracteres
%u inteiro decimal sem sinal
%x hexadecimal sem sinal (letras minsculas)
%X hexadecimal sem sinal (letras maisculas)
%% imprime o caracter %

Formatos para o comando printf

UFPE - Departamento de Informtica - Judith Kelner


53
Introduo a linguagem de programao C

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


54
Introduo a linguagem de programao C

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


55
Introduo a linguagem de programao C

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

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

Formatos para o comando scanf

UFPE - Departamento de Informtica - Judith Kelner


56
Introduo a linguagem de programao C

LINGUAGEM C

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

UFPE - Departamento de Informtica - Judith Kelner


57
Introduo a linguagem de programao C

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


58
Introduo a linguagem de programao C

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

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


60
Introduo a linguagem de programao C

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 */ strcpy (s, t) /* copia t em s*/


char s[ ], t[ ]; char *s, *t;
{ {
int j; while ((*s++ = *t++) != \0)
;
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

UFPE - Departamento de Informtica - Judith Kelner


61
Introduo a linguagem de programao C

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


62
Introduo a linguagem de programao C

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


63
Introduo a linguagem de programao C

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


64
Introduo a linguagem de programao C

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


65
Introduo a linguagem de programao C

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


66
Introduo a linguagem de programao C

UFPE - Departamento de Informtica - Judith Kelner

Anda mungkin juga menyukai