Você está na página 1de 245

Curso de Linguagem C

Curso de Linguagem C
Rodolfo Jardim de Azevedo
Instituto de Computao
UNICAMP

Curso de Linguagem C

Programao Estruturada
n

A linguagem C uma linguagem estruturada


em bloco simples. Uma caracterstica
distintiva de uma linguagem estruturada em
bloco a compartimentalizao de seu
cdigo e de seus dados, que a habilidade
de uma linguagem tem de seccionar e
esconder do resto do programa todas as
instrues necessrias para a realizao de
uma determinada tarefa.

Curso de Linguagem C

Declarao de variveis
n

Variveis devem ser declaradas antes


de serem usadas, permitindo assim,
que o compilador saiba de antemo
informaes como tipo e espao gasto
em memria podendo fazer checagem
durante o processo de compilao.

Curso de Linguagem C

Funes - Blocos de cdigo


n

Utilizando funes, possvel esconder


parte do cdigo e variveis, evitando
assim, que sejam gerados efeitos
colaterais em outras partes do
programa. Desta forma, necessrio
saber apenas o que as rotinas fazem, e
no como elas fazem.

Curso de Linguagem C

Laos
n

Os programas passam a maior parte do


tempo repetindo tarefas at que uma
condio seja satisfeita (ou um nmero
fixo de vezes). Desta forma, fica mais
fcil a programao e eliminam-se os
inconvenientes gerados por vrios
gotos espalhados pelo programa.

Curso de Linguagem C

Testes de condies
n

Numa linguagem estruturada, os testes


de condies so amplamente
utilizados, tanto como controle de laos,
quanto para execues condicionais de
blocos de cdigo.

Curso de Linguagem C

A linguagem C
n

Surgiu nos anos 70 de uma linguagem chamada


B. Criada por Dennis Ritchie. Embora
houvessem poucas divergncias entre as
primeiras implementaes em nvel de cdigofonte, foi desenvolvido o padro ANSI sendo
assim, qualquer programa C ANSI pode ser
compilado em qualquer compilador C ANSI no
importando a mquina na qual o programa v ser
executado. Por isso, quando se quer
portabilidade, a escolha acaba recaindo sobre a
linguagem C.

Linguagem feita para


programadores
n

Curso de Linguagem C

Ao contrrio do que possa parecer, nem


todas as linguagens foram feitas para
programadores. C virtualmente nica,
porque ela foi criada, influenciada e testada
em campo por programadores. Ela oferece
ao programador exatamente o que ele quer:
poucas restries e queixas, cdigo rpido e
eficincia. Por isso ela a linguagem mais
popular entre os programadores profissionais
altamente qualificados.

Curso de Linguagem C

Sensvel ao caso
n

A linguagem C sensvel ao caso, isto


quer significa que letras maisculas e
minsculas so tratadas como
caracteres separados.

Curso de Linguagem C

10

Programa exemplo
/* Este o primeiro programa */
#include <stdio.h>
main()
{
printf(Alo mundo\n);
}
n

Este um exemplo bem simples, mas que mostra


alguns componentes bsicos que existem nos
programas feitos em C. Nele vemos:

Curso de Linguagem C

11

/* Este o primeiro programa */


n

Esta linha um comentrio.

Curso de Linguagem C

12

#include <stdio.h>
n

Indica a incluso de arquivos dentro do


programa atual (neste caso, o arquivo
stdio.h). Normalmente so arquivos
cabealhos contendo declaraes de
tipos e prottipos de funes. Sero
vistos mais tarde.

Curso de Linguagem C

13

main()
n

Todo programa em C tem que ter a


funo main, na primeira linha desta
funo que o programa comea a ser
executado e quando a ltima linha for
executada, o programa ser encerrado.

Curso de Linguagem C

14

{
n

Inicia um bloco de cdigo.

Curso de Linguagem C

15

printf(Alo mundo\n);
n

Chamada a uma funo em C. A funo


printf utilizada para imprimir uma
mensagem na tela, neste caso, a
mensagem Alo mundo que chamado
de parmetro passado funo.

Curso de Linguagem C

16

}
n

Encerra um bloco de cdigo.

Curso de Linguagem C

17

Blocos de cdigo
n

Por ser uma linguagem estruturada, a


linguagem C permite a criao de blocos de
cdigo. Um bloco de cdigo um grupo de
comandos de programa conectados
logicamente que o computador trata como
uma unidade. Para criar um bloco de cdigo,
coloque uma seqncia de comandos entre
chaves, como pode ser visto no programa
exemplo, as linhas 5, 6 e 7 representam um
bloco de cdigo.

Curso de Linguagem C

18

Ponto e vrgula
n

O ponto e vrgula um terminador de


comandos, por isso, todos os
comandos devem ser terminados por
um. Desta forma, podemos ter vrios
comandos numa mesma linha sendo
cada um terminado com um ponto e
vrgula.

Curso de Linguagem C

19

Chaves
n

Todo bloco de cdigo escrito em C


deve vir entre chaves. No necessrio
colocar um ponto e vrgula depois de
fechar chaves pois cada comando
dentro do bloco j possui o seu
terminador.

Curso de Linguagem C

20

Comentrios
n

Na linguagem C, os comentrios so
delimitados por /* e */ como pode ser
visto na primeira linha do programa
anterior. No permitido colocar
comentrios aninhados. Os
comentrios podem vir em qualquer
posio do programa e no apenas em
linhas separadas. Eles tambm podem
comear em uma linha e terminar em
outra.

Curso de Linguagem C

21

Palavras reservadas
n

Como todas as outras linguagens de


programao, C consiste em palavras
reservadas e em regras de sintaxe que se
aplicam a cada palavra reservada. Uma
palavra reservada essencialmente um
comando, e na maioria das vezes, as
palavras reservadas de uma linguagem
definem o que pode ser feito e como ser
feito. O padro ANSI C especifica as
seguintes palavras reservadas:

Curso de Linguagem C

22

Palavras reservadas
auto
break
case
char
const
continue
default
do

double
else
enum
extern
float
for
goto
if

int
long
register
return
short
signed
sizeof
static

struct
switch
typedef
union
unsigned
void
volatile
while

23

Variveis, constantes,
operadores e expresses
n

Curso de Linguagem C

Por ser uma linguagem estruturada, em


C, as variveis devem ser declaradas
antes de serem usadas, permitindo
assim, que o compilador faa
checagens em tempo de compilao.

Curso de Linguagem C

24

Identificadores
n

Identificadores so nomes usados para


se fazer referncia a variveis, funes,
rtulos e vrios outros objetos definidos
pelo usurio. Um identificador pode ter
de um a vrios caracteres. O primeiro
deve ser uma letra ou um sublinhado, e
os caracteres subseqentes deve serm
letras, nmeros ou um sublinhado.

Curso de Linguagem C

25

Tipos de dados
n

Em C, existem 5 tipos de dados


bsicos: caracter, inteiro, ponto
flutuante, ponto flutuante de dupla
preciso e sem valor. As palavras
reservadas para declarar variveis
destes tipos so char, int, float, double
e void respectivamente. Veja na tabela
a seguir o espao gasto por cada um
destes tipos assim como seus limites
em mquinas IBM PC compatveis.

Curso de Linguagem C

26

Tipos de dados
Tipo Extenso
em bits
char
8
int
16
float
32
double
64
void
0

Escala
-128 a 127
-31768 a 32767
3.4E-38 a 3.4E+38
1.7E-308 a 1.7E308
sem valor

Curso de Linguagem C

27

Modificadores de tipo
n

Com exceo de void, os tipos de dados bsicos


tm vrios modificadores que os precedem. O
modificador usado para alterar o significado do
tipo-base para que ele se adapte da maneira
mais precisa s necessidades das vrias
situaes. Eis aqui uma lista dos modificadores:
signed, unsigned, long, short. Os dois primeiros
modificadores indicam a existncia ou no de
sinal enquanto os outros dois so relativos ao
tamanho de memria necessrio para armazenar
o valor de um elemento deste tipo.

Curso de Linguagem C

28

Modificadores de tipo
Tipo
char
int
short int
long int
float
short float
long float
double
short double
long double

Extenso em bits
8
16
16
32
32
32
64
64
64
80

Curso de Linguagem C

29

Declarando variveis
n

Uma declarao de varivel deve seguir


a seguinte regra:
tipo lista_variveis;

onde tipo deve ser um tipo vlido em C


e lista_variveis pode consistir em um
ou mais identificadores separados por
vrgula.

30

Exemplos de declarao de
varivel
int i, j, l;
n short int si;
n unsigned int ui;
n long inteiro_grande;
n double balanco, lucro, prejuizo;
n

Curso de Linguagem C

Curso de Linguagem C

31

Onde declarar?
n

Existem 3 lugares em um programa C


onde as variveis podem ser
declaradas.

Curso de Linguagem C

32

Varivel global
n

O primeiro lugar fora de todas as


funes, incluindo a funo main(). A
varivel decalrada dessa maneira
chamada varivel global e pode ser
usada em qualquer parte do programa.

Curso de Linguagem C

33

Varivel local
n

O segundo lugar dentro de uma


funo. Estas variveis so chamadas
variveis locais e podem ser usadas
somente pelos comandos que
estiverem na mesma funo.

Curso de Linguagem C

34

Parmetro (argumento)
n

O ltimo lugar onde as variveis podem


ser declaradas na declarao dos
parmetros formais de uma funo,
embora as variveis aqui declaradas
sejam utilizadas para receber os
argumentos quando a funo
chamada, eles podem ser utilizados
como outra varivei qualquer.

Curso de Linguagem C

35

Programa exemplo:
/* soma os nmeros de 0 a 9 */
int soma;
/* Varivel global */
main()
{
int cont;
/* Varivel local */
soma = 0;
/* inicializa varivel soma */
for (cont = 0; cont < 10; cont ++) {
total(cont);
display();
}
}

Curso de Linguagem C

36

Funo total()
/* acumula no total parcial */
total(x)
int x;
/* Parmetro formal */
{
soma = x + soma;
}

Curso de Linguagem C

37

Funo display()
display()
{
int cont;
/* Varivel local */
/* esta varivel cont diferente
daquela declarada em main() */
for(cont = 0; cont < 10; cont ++) printf(-);
printf(A soma atual %d, soma);
}

Curso de Linguagem C

38

Comentrios
n

Neste exemplo, qualquer funo do programa


pode acessar a varivel global soma. Porm
total() no pode acessar diretamente a varivel
local cont em main(), que deve passar cont como
um argumento. Isto necessrio porque uma
varivel local s pode ser usada pelo cdigo que
est na mesma funo na qual ela declarada.
Observe que cont em display() completamente
separada de cont em main(), novamente porque
uma varivel local conhecida apenas pela
funo na qual ela declarada.

Curso de Linguagem C

39

Inicializao de variveis
n

Ns vimos que em main() existe uma linha


somente para inicializar a varivel soma, esta
linha poderia ser suprimida se a varivel
fosse declarada
int soma = 0;

Desta forma, podemos inicializar variveis no


momento de sua declarao, o que facilita
muito a escrita do programa alm de reduzir
o seu tamanho.

Curso de Linguagem C

40

Constantes
n

Constantes so valores fixos que o


programa no pode alterar.

Curso de Linguagem C

41

Exemplos de Constantes
Tipo de dado

Exemplo

char
int
long int
short int
unsigned int
float
double

a
n 9
1
123 2100 -234
35000 -34
10
-12 90
10000 987 40000
123.23 4.34E-3
123.23 12312333 -0.9876

Curso de Linguagem C

42

Constantes hexadecimais e octais


n

Podem ser declaradas constantes em


hexadecimal ou octal conforme o
exemplo a seguir:
int hex = 0xFF;
/* 255 em decimal */
/* as constantes em hexadecimal devem
ser precedidas por 0x */
int oct = 011; /* 9 em decimal */
/* as constantes em octal devem
ser precedidas por 0 */

Curso de Linguagem C

43

Constantes strings
n

Uma string um conjunto de caracteres


entre aspas. Por exemplo, esta uma
string uma string. No confundir
strings com caracteres, a um
caracter enquanto a uma string.

Curso de Linguagem C

44

Constantes com barras invertidas


n

Existem alguns caracteres que no


podem ser representados no texto
comum, as constantes com barra
invertida servem para representar estes
caracteres.

Curso de Linguagem C

45

Constantes com barras invertidas


Cdigo
\b
\f
\n
\r
\t
\
\
\0
\\
\v
\a
\x

Significado
retrocesso
avano de pgina
mudana de linha
retorno de carro
tab horizontal
aspas duplas
aspas simples
ASCII 0
barra invertida
tab vertical
alerte (beep)
constante hexadecimal

Curso de Linguagem C

46

Operadores
n

A linguagem C muito rica em


operadores. Os operadores so
divididos em 3 categorias gerais:
aritmticos, de relao e lgicos e bit a
bit. Alm desses, C tem operadores
especiais para tarefas particulares.

Curso de Linguagem C

47

Operadores aritmticos
Operador
+
*
/
%
-++

Ao
subtrao, tambm menos unrio
adio
multiplicao
diviso
resto da diviso
decremento
incremento

Curso de Linguagem C

48

Exemplo:
main()
{
int x = 10, y = 3;
printf(%d\n, x / y);
/* exibir 3 */
printf(%d\n, x % y);
/* exibir 1, o resto da diviso de inteiros */
x = 1;
y = 2;
printf(%d %d\n, x / y, x % y);
/* exibir 0 e 1 */

Curso de Linguagem C

49

Exemplo (continuao)
x ++;
printf(%d\n, x); /* exibir 2*/
printf(%d %d\n, x++, ++y);/* exibir 2 e 3 */
/* neste caso, x s incrementado depois que o
comando
executado enquando y incrementado antes */
}

Curso de Linguagem C

50

Operadores de relao
Operador

Ao

>

maior que

>=

maior ou igual a

<

menor que

<=

menor ou igual a

==

igual a

!=

no igual a

Curso de Linguagem C

51

Operadores lgicos
Operador
&&
||
!

Ao
AND
OR
NOT

Curso de Linguagem C

52

Observao
n

Em C, o nmero 0 representa falso e


qualquer nmero no-zero
verdadeiro, assim, os operadores
anteriores retornam 1 para verdadeiro e
0 para falso.

Curso de Linguagem C

53

Operador de atribuio
n

O operador = o operador de
atribuio. Ao contrrio de outras
linguagens, C permite que o operador
de atribuio seja usado em
expresses com outros operadores.
int a, b, c;
a = b = c = 1; /* atribui 1 s 3 variveis */
((a = 2 * b) > c)
/* a = 2 e a comparao
resulta em 1 */

Curso de Linguagem C

54

Expresses
n

Os operadores, as constantes e as
variveis so os componentes das
expresses. Uma expresso em C
qualquer combinao vlida desses
componentes.

Curso de Linguagem C

55

Converses de tipos
n

Quando voc mistura constantes e


variveis de tipos diferentes em uma
expresso, C as converte para o
mesmo tipo. O compilador C converter
todos os operandos para o tipo do
maior operando, uma operao de cada
vez, conforme descrito nestas regras de
converso de tipo:

Curso de Linguagem C

56

Regra 1
n

Todo char e short int convertido para


int. Todo float convertido para double.

Curso de Linguagem C

57

Regra 2
n

Para todos os pares de operandos,


ocorre o seguinte, em seqncia: se um
dos operandos for um long double, o
outro ser convertido para long double.
Se um dos operandos for double, o
outro ser convertido para double. Se
um dos operandos for long, o outro ser
convertido para long. Se um dos
operandos for unsigned, o outro ser
convertido para unsigned.

Curso de Linguagem C

58

Type cast
n

Pode-se forar o compilador a efetuar


determinada converso utilizando-se
um type cast que tem a seguinte forma:
(tipo) expresso

Curso de Linguagem C

59

Exemplo:
main()
{
int x = 3;
printf(%f %f\n, (float) x / 2, (float) (x / 2));
/* sero impressos na tela 1.5 e 1.0 pois no primeiro
caso, x convertido para float e depois dividido, j
no segundo, somente o resultado convertido para
float */
}

Curso de Linguagem C

60

Modificadores de acesso
n

Os modificadores de acesso informam


sobre como ser feito o acesso
varivel.

Curso de Linguagem C

61

Register
n

Sempre que uma varivel for declarada


do tipo register, o compilador far o
mximo possvel para mante-la num
dos registradores do microprocessador,
acelerando assim o acesso a seu valor.
pratica comum, declarar as variveis
de controle de loop como sendo
register.

Curso de Linguagem C

62

Static
n

Variveis static so variveis existem


durante toda a execuo do programa,
mas s podem ser acessadas de dentro
do bloco que a declarou.

Curso de Linguagem C

63

Exemplo:
/* Exemplo de varivel static */
main()
{
printf(%d\n, numero());
/* imprimir 0 */
printf(%d\n, numero());
/* imprimir 1 */
}
numero()
{
static valor = 0; /* atribuio s executada 1 vez */
return valor ++;
}

Curso de Linguagem C

64

printf()
Rotina de finalidade geral para sada
pelo console
n A funo printf() serve para mostrar
mensagens na tela. Sua forma geral
n

printf(string de controle, lista argumentos);

Curso de Linguagem C

65

string de controle
n

A string de controle consiste em dois


tipos de itens:
Caracteres que a funo imprimir na tela
Comandos de formatao

Curso de Linguagem C

66

Comandos de formatao
Todos os comandos de formatao
comeam por % que seguido pelo
cdigo de formatao
n Deve haver exatamente o mesmo
nmero de argumentos quanto forem os
comandos de formatao e eles devem
coincidir em ordem
n

Curso de Linguagem C

67

Comandos de formatao
Cdigo
%c
%d
%i
%e
%f
%g
%o
%s
%u
%x
%%
%p
%n

Formato
um nico caracter
decimal
decimal
notao cientfica
ponto decimal flutuante
usa %e ou %f - aquele que for menor
octal
string de caracteres
decimal sem sinal
hexadecimal
sinal %
exibe um ponteiro
o argumento associado ser um ponteiro inteiro no
qual ser colocado o nmero de caracteres escritos
at o momento

Curso de Linguagem C

68

Comprimento mnimo do campo


n

Para especificar o comprimento mnimo que


um campo poder ter, basta colocar um
inteiro entre o sinal % e o comando de
formatao. Observe que este o
comprimento mnimo e que o campo pode
ocupar um espao maior.
Exemplo Funo
%3d
inteiro com pelo menos 3 dgitos (preenchido
com espaos)
%03d inteiro com pelo menos 3 dgitos (preenchido
com zeros)
%5s
string com pelo menos 5 caracteres

Curso de Linguagem C

69

Nmero de casas decimais


n

Para especificar o nmero de casas


decimais, coloque um ponto decimal
aps o especificador de largura mnima
do campo e depois dele, o nmero de
casas decimais que devero ser
exibidas.
Exemplo
Funo
%7.2f
Usar 2 casas decimais

Curso de Linguagem C

70

Comprimento mximo
n

Quando o formato de casas decimais


colocado em strings, o nmero de
casas decimais passa a ser
considerado como comprimento
mximo do campo.
Exemplo Funo
%5.7s
string com no mnimo 5 e no
mximo 7 caracteres

Curso de Linguagem C

71

Nmero mnimo de dgitos


n

Quando o formato de casas decimais


aplicado em inteiros, o especificador de
casas decimais ser utilizado como
nmero mnimo de dgitos
Exemplo Funo
%7.6d
7 caracteres no mnimo e 6
dgitos no mnimo

Curso de Linguagem C

72

Alinhamento
n

Por padro, todo resultado alinhado


direita, para inverter este padro, utilize
um sinal de menos (-) antes de
especificar o tamanho.
Exemplo
Funo
%-5d 5 caracteres alinhados
esquerda
%-10s 10 caracteres alinhados
esquerda

Curso de Linguagem C

73

Modificadores de formatao
n

Podemos usar modificadores para


informar sobre a leitura de shorts
(modificador h) ou longs (modificador l)
Exemplo
Funo
%hd
Imprime um short int
%ld
Imprime um long int

Curso de Linguagem C

74

Exemplos
Comando printf()
(%-5.2f, 123.234)
(%5.2f, 3.234)
(%10s, alo)
(%-10s, alo)
(%5.7s, 123456789)
(%5.4d, 123)

Resultado
123.23
3.23
alo
alo
1234567
0123

Curso de Linguagem C

75

scanf()
Rotina de finalidade geral para entrada
pelo console
n A funo scanf() serve para ler
informaes do teclado. Sua forma
geral
n

scanf(string de controle, lista argumentos);

Curso de Linguagem C

76

string de controle
n

A string de controle consiste em trs


classificaes de caracteres:
Especificadores de formato
Caracteres brancos
Caracteres no-brancos

Curso de Linguagem C

77

Especificadores de formato
Todos os especificadores de formato
comeam por % que seguido por um
caracter que indica o tipo de de dado
que ser lido
n Deve haver exatamente o mesmo
nmero de argumentos quanto forem os
especificadores de formato e eles
devem coincidir em ordem
n

Curso de Linguagem C

78

Especificadores de formato
Cdigo
%c
%d
%i
%e
%f
%o
%s
%x
%p
%n

L
nico caracter
decimal
decimal
nmero com ponto flutuante
numero com ponto decimal flutuante
nmero octal
string de caracteres
hexadecimal
ponteiro
recebe um valor inteiro igual ao nmero de
caracteres lidos at o momento

Curso de Linguagem C

79

Caracter branco
Um caracter branco na string de
controle faz com que scanf() passe por
cima de um ou mais caracteres brancos
na string de entrada
n Um caracter branco um espao, um
tab ou um \n
n

Curso de Linguagem C

80

Caracter no branco
Um caracter no branco na string de
controle faz com que scanf() leia e
desconsidere um caracter coincidente.
Se o computador no encontrar o
caracter especificado, scanf terminar
n O comando %d,%d far com que
scanf leia um inteiro, depois leia e
desconsidere uma vrgula e finalmente,
leia um outro inteiro
n

Curso de Linguagem C

81

Como chamar scanf()


n

Todas as variveis usadas para receber


valores atravs de scanf() devem ser
passadas por seus endereos. Se
quiser ler a varivel cont, utilize
scanf(%d, &cont);

Como strings so representadas por


vetores, NO deve ser colocado o &
antes do nome da varivel

Curso de Linguagem C

82

Ignorar entrada
n

Colocar um * entre o % e o cdigo de


formatao far com que scanf() leia
dados do tipo especificado mas
suprimir suas atribuies. Desta forma
scanf(%d%*c%d, &x, &y)

dada a entrada 10/20, coloca 10 em x,


desconsidera o sinal de diviso e
coloca 20 em y

Curso de Linguagem C

83

Comprimento mximo do campo


n

Para especificar o comprimento mximo que


um campo poder ter, basta colocar um
inteiro entre o sinal % e o comando de
formatao. Os caracteres que sobrarem
sero utilizados nas prximas chamadas a
scanf(). Caso no queira ler mais do que 20
caracteres na string nome, utilize
scanf(%20s, nome);

Curso de Linguagem C

84

Espaos, tabs e \n
n

Servem como separadores quando no


estiverem sendo lidos caracteres. So
lidos e atribudos quando for pedido um
caracter de entrada. Caso o comando
scanf(%c%c%c, &a, &b, &c);

seja lido com a entrada


x y

scanf retornar com x em a, espao em


b e y em c

Curso de Linguagem C

85

Comandos de controle de fluxo


n

Os comandos de controle de fluxo so a


base de qualquer linguagem.
A maneira como eles so implementados
afeta a personalidade e percepo da
linguagem.
C tem um conjunto muito rico e poderoso de
comandos de controle de fluxo.
Eles se dividem em comandos de teste de
condies e comandos de controle de loop.

Curso de Linguagem C

86

Comandos de testes de condies


n

Estes comandos avaliam uma condio


e executam um bloco de cdigo de
acordo com o resultado. So eles:
if
switch

Curso de Linguagem C

87

if
O comando if serve para executar
comandos de acordo com uma
determinada condio
n A forma geral do comando if
n

if (condio) comando;
else comando;
n

onde a parte else opcional

Curso de Linguagem C

88

Exemplo
/* programa do nmero mgico */
#include <stdlib.h>
main()
{
int magico, adivinhacao;
magico = rand() % 10; /* gerar um nmero */
printf(Adivinhe o nmero: );
scanf(%d, &adivinhacao);
if (adivinhacao == magico)
printf(** nmero certo **);
else
printf(-- nmero errado --);
}

Curso de Linguagem C

89

if aninhados
C permite que sejam colocados
comandos if dentro de outros comandos
if. A isto chamamos de if aninhados.
n Quando se trata de if aninhados, o
comando else se refere ao if mais
prximo que no possui um comando
else. Tanto o if quanto o else devem
estar dentro do mesmo bloco de cdigo.
n

Curso de Linguagem C

90

Exemplos
if (x)
if (y) printf(1);
else printf(2);

Neste caso, o else


pertence ao
segundo if.

if (x) {
if (y) printf(1);
}
else printf(2);
n

Neste caso, o else


pertence ao primeiro
if.

Curso de Linguagem C

91

if-else-if
n

muito comum encontrar programas


que possuem uma escada if-else-if da
seguinte forma:
if (condio)
comando;
else if (condio)
comando;
else
comando;

Curso de Linguagem C

92

Avaliao do if-else-if
O computador avalia as expresses
condicionais de cima para baixo. Assim
que encontra uma condio verdadeira,
ele executa o comando associado a ela
e passa por cima do resto da escada.
n Se nenhuma condio for verdadeira, o
computador executar o else final.
n

Curso de Linguagem C

93

A expresso condicional
n

Qualquer expresso vlida em C pode


servir como expresso condicional.
Veja o exemplo:
/* dividir o primeiro nmero pelo segundo */
main()
{
int a, b;
printf(Digite dois nmeros: );
scanf(%d %d, &a, &b);
if (b) printf(%d\n, a/b);
else printf(no posso diridir por zero\n);
}

Curso de Linguagem C

94

switch
n

Embora o if-else-if possa executar vrios


tipos de testes, o cdigo pode ficar muito
difcil de ser seguido.
C possui um comando de vrios desvios
chamado switch.
No switch, o computador testa uma varivel
sucessivamente contra uma lista de
constantes inteiras ou de caracteres e
executa um comando ou bloco de comandos
quando encontrar uma coincidncia.

Curso de Linguagem C

95

Forma geral do switch


switch (varivel) {
case constante1:
seqncia de comandos
break;
case constante2:
seqncia de comandos
break;
default:
seqncia de comandos
}

96

O comando default dentro do


switch

Curso de Linguagem C

O comando default ser executado se


no for encontrada nenhuma
coincidncia na lista de constantes.
n Caso no seja colocado um comando
default e no haja coincidncia,
nenhum comando ser executado.
n

Curso de Linguagem C

97

O comando break
Quando o computador encontra alguma
coincidncia, ele executa os comandos
associados quele case at encontrar
break ou o fim do comando switch.
n um erro comum programadores
esquecerem de colocar o break aps os
comandos.
n

Curso de Linguagem C

98

Importante
n

O switch difere do if, j que o primeiro s


pode testar igualdade e a expresso
condicional if pode ser de qualquer tipo.
No pode haver duas constantes case com
valores iguais no mesmo switch.
Podem ser colocados comandos switch
dentro de comandos switch.
Pode ser deixado um case vazio quando
mais de uma condio usa o mesmo cdigo.

Curso de Linguagem C

99

Comandos de controle de loops


n

Os comandos de controle de loops


permitem que o computador repita um
conjunto de instrues at que alcance
uma certa condio. Em C temos os
seguintes comandos de controle de
loop:
for
while
do while

Curso de Linguagem C

100

for
n

O loop for em C muito mais forte e


mais flexvel que o da maioria das
outras linguagens. Sua forma geral
for (inicializao; condio; incremento)
comando;

Observe que as trs partes do loop for


so separadas por ponto e vrgula.
n Nenhuma destas partes precisa existir.
n

Curso de Linguagem C

101

Inicializao
Na forma mais simples, inicializao
um comando de atribuio que o
compilador usa para estabelecer a
varivel de controle de loop.
n A inicializao pode conter qualquer
comando vlido em C.
n

Curso de Linguagem C

102

Condio
A condio uma expresso de relao
que testa se a condio final desejada
pelo loop for ocorreu.
n Aqui tambm pode ser colocado
qualquer comando vlido em C.
n

Curso de Linguagem C

103

Incremento
O incremento define a maneira como a
varivel de controle do loop ser
alterada cada vez que o computador
repetir o loop.
n Tambm aqui, podemos colocar
qualquer comando vlido em C.
n

Curso de Linguagem C

104

Exemplo 1
/* imprimir os nmeros de 1 a 100 */
main()
{
int x;
for (x = 1; x <= 100; x ++) printf(%d , x);
}

Curso de Linguagem C

105

Exemplo 2
/* imprimir os nmeros de 100 a 1 */
main()
{
int x;
for (x = 100; x > 0; x --) printf(%d , x);
}

Curso de Linguagem C

106

Exemplo 3
/* imprimir os nmeros de 0 a 100, 5 em 5 */
main()
{
int x;
for (x = 0; x <= 100; x = x + 5)
printf(%d , x);
}

Curso de Linguagem C

107

Exemplo 4
/* executa um bloco de cdigo 100 vezes */
main()
{
int x;
for (x = 0; x < 100; x ++) {
printf(O valor de x : %d , x);
printf(e o quadrado de x : %d\n, x * x);
}
}

Curso de Linguagem C

108

Variaes do loop for


n

Podem ser executados mais de um


comando nas partes de inicializao e
de incremento. Veja que
main()
{
int x, y;
for (x = 0, y = 0; x + y < 100; ++x, y++)
printf(%d , x + y);
}

Mostrar nmeros de 0 a 98, 2 a 2.

Curso de Linguagem C

109

Um uso diferente para for


main()
{ int t;
for (prompt(); t=readnum(); prompt()) sqrnum(t);
}
prompt()
{ printf(digite um inteiro: );
}
readnum()
{ int t;
scanf(%d, &t);
return t;
}
sqrnum(int num)
{ printf(%d\n, num * num);
}

Curso de Linguagem C

110

Loop infinito
n

Podemos fazer um comando for


executar para sempre simplesmente
no especificando sua parte
condicional. Veja
for (;;)
printf(este loop rodar para sempre\n);

Curso de Linguagem C

111

Saindo de um loop
n

Podemos usar o comando break para


encerrar um for a qualquer momento.
Veja um exemplo:
main()
{
int a;
for (a = 1; a < 100; a++)
if (a == 10) break;
}

O loop s ser executado 10 vezes.

Curso de Linguagem C

112

Loops for sem nenhum corpo


n

Podem ser utilizados loops sem corpo


para gerar retardo de tempo. Veja um
exemplo:
for (a = 0; a < 1000; a ++);

Curso de Linguagem C

113

while
O while executa um comando (ou bloco
de comandos) enquanto uma condio
for verdadeira.
n A forma geral do while :
n

while (condio)
comando;

Curso de Linguagem C

114

Exemplo 1
pausa()
{
char tecla = \0;
printf(Tecle ESPAO para continuar...);
while (tecla != )
tecla = getche();
}

Curso de Linguagem C

115

Exemplo 2
n

O exemplo anterior pode ser reescrito


sem utilizar varivel. Veja:
main()
{
printf(Tecle ESPAO para continuar...);
while (getche() != );
}

Curso de Linguagem C

116

do while
n

Ao contrrio do loop for e do loop while,


que testam a condio no comeo do
loop, o loop do while verifica a condio
somente no final. Desta forma, o loop
ser executado pelo menos uma vez. A
forma geral do loop do while :
do {
comando;
} while (condio);

Curso de Linguagem C

117

Exemplo
/* L um nmero maior que 100 */
main()
{
int num;
do {
printf(Digite um nmero maior que 100);
scanf(%d, &num);
} while (num <= 100);
}

Curso de Linguagem C

118

Loops aninhados
Quando um loop est dentro do outro,
dizemos que o loop interior est
aninhado.
n Loops aninhados permite que sejam
solucionados vrios problemas de
programao.
n Em C podemos aninhar qualquer tipo
de loop.
n

Curso de Linguagem C

119

Exemplo
/* exibir uma tabela de potncias dos nmeros de 1 a 9*/
main()
{ int i, j, k, temp;
printf(\ti\ti^2\ti^3\ti^4\n);
for (i = 1; i < 10; i ++) {
/* loop externo */
for (j = 1; j < 5; j ++) {
/* primeiro nvel de aninhamento */
temp = 1;
for (k = 0; k < j; k ++)
/* loop mais interior */
temp = temp * i;
printf(%8d, temp);
}
}
}

Curso de Linguagem C

120

Interrupo de loops
Quando precisamos encerrar um loop
sem que sua condio de encerramento
esteja satisfeita, podemos utilizar o
comando break.
n O comando break especialmente til
quando algum evento externo controle
um loop.
n

Curso de Linguagem C

121

Comando continue
n

O comando continue funciona de


maneira parecida com o comando
break. Porm, em vez de forar o
encerramento, continue fora a prxima
iterao do loop e pula o cdigo que
estiver no meio.

Curso de Linguagem C

122

Exemplo
/* programa para imprimir os nmeros pares
entre 0 e 98 */
main()
{
int x;
for (x = 0; x < 100; x ++) {
if (x % 2) continue;
printf(%d , x);
}
}

Curso de Linguagem C

123

Vetores
Vetores so uma coleo de variveis
do mesmo tipo que so referenciadas
pelo mesmo nome.
n Em C, um vetor consiste em locaes
contguas de memria.
n O elemento mais baixo corresponde ao
primeiro elemento e o mais alto ao
ltimo.
n O vetor mais utilizado o de caracteres.
n

Curso de Linguagem C

124

Declarando vetores
n

A forma geral da declarao de um


vetor :
tipo nome_var[tamanho];

Onde
tipo o tipo base do vetor e
tamanho a quantidade de elementos que
o vetor conter

Curso de Linguagem C

125

Acessando um vetor
Os vetores so acessados atravs de
ndices colocados entre colchetes.
n O ndice do primeiro elemento do vetor
0 (ZERO).
n

int amostra[10];
amostra[0]
amostra[9]

/* vetor de 10 inteiros */
/* primeiro elemento */
/* ltimo elemento */

Curso de Linguagem C

126

Exemplo
main()
{
int x[10]; /* vetor com 10 elementos int */
int t;
for (t = 0; t < 10; t ++)
x [ t ] = t;
}

Curso de Linguagem C

127

Limites dos vetores


n

C no faz checagem dos limites dos


vetores, isto responsabilidade do
programador. Logo, o cdigo a seguir
no causar nenhum erro.
int elementos[10];
elementos[12] = 0;
elementos[10] = 0;

Curso de Linguagem C

128

Strings
n

Uma string por definio, um vetor de


caracteres terminado em 0. Ento, para
declarar a string, devemos declarar
sempre um elemento a mais para o
terminador. Veja que
char mensagem[10] = Exemplo

Ficar armazenado na memria como:


E x e m p l o \0

Curso de Linguagem C

129

Funes para manipular strings


Funo
gets
puts
strcpy
srtcat
strcmp
strlen

Finalidade
L uma string do teclado
Imprime uma string na tela
Copia uma string em outra
Concatena strings
Compara strings
Retorna o tamanho da string

Curso de Linguagem C

130

gets
L uma string do teclado.
n Forma geral:
n

gets(nome_string);
n

Exemplo:
main()
{ char str[80];
gets(str);
printf(%s, str);
}

Curso de Linguagem C

131

puts
Mostra uma string na tela.
n Forma geral:
n

puts(nome_string);
n

Exemplo:
main()
{
puts(Esta uma mensagem);
}

Curso de Linguagem C

132

strcpy
Copia uma string em outra.
n Forma geral:
n

strcpy(para, de);
n

Lembre-se que a string para deve ser


grande o suficiente para conter de.
main()
{ char str[80];
strcpy(str, alo);
}

Curso de Linguagem C

133

strcat
Adiciona uma string em outra.
n Forma geral:
n

strcat(s1, s2);
n

s2 ser anexada ao final de s1.


main()
{ char primeiro[20], segundo[10];
strcpy(primeiro, bom);
strcpy(segundo, dia);
strcat(primeiro, segundo);
printf(%s\n, primeiro);
}

Curso de Linguagem C

134

strcmp
Compara 2 strings.
n Forma geral:
n

strcmp(s1, s2)
n

A funo retorna:
0
>0
<0

se s1 igual a s2
se s1 > s2
se s2 > s1

Curso de Linguagem C

135

strlen
Retorna o tamanho da string
n Forma geral:
n

strlen(str);
n

Exemplo:
main()
{ char str[80];
printf(Digite uma string: );
gets(str);
printf(Tamanho: %d\n, strlen(str));
}

Curso de Linguagem C

136

Matrizes bidimensionais
C permite que sejam declaradas
matrizes bidimensionais.
n Forma da declarao:
n

tipo nome_var[dimenso1][dimenso2];
n

Exemplo:
char tabela[5][5];

Curso de Linguagem C

137

Matrizes multidimensionais
n

De forma semelhante as matrizes


bidimensionais, declaramos as
multidimensionais. Veja por exemplo
uma matriz de 4 dimenses:
int matriz[5][7][3][8];

138

Acessando os elementos das


matrizes multidimensionais
main()
{
int numeros[4][3], i, j;
for (i = 0; i < 4; i ++)
for (j = 0; j < 3; j++)
numeros[ i ][ j ] = i * j;
}

Curso de Linguagem C

Curso de Linguagem C

139

Matrizes de strings
n

Uma matriz bidimensional de caracteres


pode ser interpretada como uma matriz
de strings.
main()
{ char strings[5][20]; /* 5 strings */
int i;
for (i = 0; i < 5; i ++)
gets(strings[ i ]);
}

Curso de Linguagem C

140

Inicializao de matrizes
C permite que as matrizes globais
sejam inicializadas.
n A forma geral :
n

tipo nome_matriz[tam1]...[tamN] = {lista de


valores}
n

Exemplo:
int i[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

Curso de Linguagem C

141

Exemplo
int quadrados[5][2] = {
1, 1,
2, 4,
3, 9,
4, 16,
5, 25};
quadrados =

1
2
3
4
5

1
4
9
16
25

Curso de Linguagem C

142

Declarando vetores sem tamanho


Podem ser declarados vetores sem
especificar explicitamente seus
tamanhos. Os vetores devem ser
inicializados na declarao. O tamanho
ser definido na inicializao.
n Exemplo:
n

char mensagem[ ] = Esta uma string;

Curso de Linguagem C

143

Exerccios
Faa um programa que leia 3 nomes
com suas respectivas idades e mostre o
maior e o menor.
n Faa um programa que leia 5 nmeros
e imprima Nmeros altos se mais do
que 3 deles forem maiores que 5, caso
contrrio, imprima Nmeros baixos.
n

Curso de Linguagem C

144

Modelos de memria
n

A definio de modelos de memria foi


a forma utilizada para contornar as
limitaes de segmentos em
computadores IBM PC.
Modelo
Tiny
Small
Medium
Compact
Large
Huge

Cdigo

Dados
1

1
mais de 1
1
mais de 1
mais de 1

1
1
mais de 1
mais de 1
mais de 1

Curso de Linguagem C

145

Ponteiros
Entender e usar corretamente os
ponteiros so pontos cruciais para
criao de programas bem-sucedidos
em C.
n Alm dos ponteiros serem uma das
caractersticas mais fortes em C,
tambm a mais perigosa.
n muito fcil usar ponteiros
incorretamente causando erros difceis
de serem encontrados.
n

Curso de Linguagem C

146

Motivos para usar ponteiros


Os ponteiros fornecem maneiras pelas
quais as funes podem modificar os
argumentos recebidos.
n Do apoio s rotinas de alocao
dinmica.
n Podem substituir o uso vetores em
muitas situaes para aumentar a
eficincia.
n

Curso de Linguagem C

147

Ponteiros so endereos
Um ponteiro uma varivel que contm
um endereo de memria. Isto , eles
possuem armazenam a localizao de
outra varivel dentro da memria do
computador.
n Ento dizemos que um ponteiro aponta
para esta varivel.
n

Curso de Linguagem C

148

Ilustrao de poteiros
Endereamento
de memria
1000
1001
1002
1003
1004
1005

Varivel na
memria
1003

Curso de Linguagem C

149

Variveis ponteiros - declarao


n

A declarao de variveis ponteiros,


segue a seguinte regra geral:
tipo *nome_var;

onde tipo o tipo do elemento para o


qual o ponteiro apontar.
n Exemplo:
n

char *p;
int *temp, *valor;

Curso de Linguagem C

150

Os operadores de ponteiros
Existem 2 operadores especiais de
ponteiros: & e *.
n O operador & devolve o endereo da
varivel. utilizado para fazer um
ponteiro apontar para ela.
n O operador * devolve o valor
armazenado no endereo apontado
pelo ponteiro.
n

Curso de Linguagem C

151

Exemplo
main()
{ int numero = 5, *p;
p = &numero;
printf(%d %d\n, numero, *p);
*p = 3;
printf(%d %d\n, numero, *p);
numero = 7;
printf(%d %d\n, numero, *p);
}

Curso de Linguagem C

152

Expresses com ponteiros


C permite que sejam feitas expresses
com ponteiros e elas seguem as
mesmas regras das outras expresses
em C.
n Quando se compara um ponteiro com
outro, estamos comparando seus
endereos. Isto til quando ambos os
ponteiros apontam para elementos de
um vetor.
n

Curso de Linguagem C

153

Ponteiros e vetores
n

Existe um relacionamento muito


prximo entre os ponteiros e os vetores.
Veja o cdigo:
char str[80], *p;
p = str;

Este cdigo faz com que p aponte para


o primero elemento do vetor, pois um
vetor sem o ndice se comporta como
um ponteiro para seu primeiro
elemento.

Curso de Linguagem C

154

Exemplo
n

Aps a definio:
char str[80], *p;
p = str;

so equivalentes os acessos ao quinto


elemento de str:
str[4]
*(p + 4)
p[4]

Curso de Linguagem C

155

Problemas com ponteiros


muito fcil errar quando se trabalha
com ponteiros em C.
n Algumas vezes, os erros com ponteiros
s aparecem quando o programa
cresce.
n Ponteiros que no foram inicializados,
apontam para um lugar desconhecido
na memria, que pode ser inclusive o
cdigo do programa.
n

Curso de Linguagem C

156

Dois erros comuns


/* este programa est
errado */

/* este programa est


errado */

main()
{
int x, *p;
x = 10;
*p = x;
}

main()
{
int x, *p;
x = 10;
p = x;
printf(%d, *p);
}

Curso de Linguagem C

157

Alocao dinmica de memria


A linguagem C permite que seja feita
alocao dinmica de memria, isto ,
solicitar memria a medida que ela for
sendo necessria.
n Programas que utilizam listas, pilhas, e
outros tipos de dados complexos cuja
quantidade mxima no definida
durante a compilao, trabalham com
alocao dinmica de memria.
n

Curso de Linguagem C

158

Funes de alocao dinmica


n

Alocar um bloco de memria


void *malloc(int nmero_de_bytes);
void *calloc(unsigned num, unsigned tam);

Liberar um bloco de memria


void free(void *p);

Alterar o tamanho de um bloco de


memria
void *realloc(void *p, unsigned tam);

Curso de Linguagem C

159

Exemplo 1
#include <stdio.h>
#include <stdlib.h>
main()
{ char *str;
str = (char *) malloc(101 * sizeof(char));
if (str) {
strcpy(str, Isto um teste);
printf(%s, str);
free(str);
}
}

Curso de Linguagem C

160

Exemplo 2
#include <stdio.h>
#include <stdlib.h>
main()
{ float *p;
p = (float *) calloc(100, sizeof(float));
if (!p) {
printf(alocao fracassada - abortado);
exit(1);
}
free(p);
}

Curso de Linguagem C

161

Funes
Funes so os blocos de contruo
em que ocorrem todas as atividades do
programas.
n Programar utilizando funes reduzir
a complexidade do cdigo e simplificar
sua escrita.
n

Curso de Linguagem C

162

Forma geral
n

A forma geral da declarao de uma


funo :
tipo nome_funo(lista_parmetros)
declarao de parmetros
{
corpo da funo
}

Caso no seja especificado o tipo da


funo, ela ser do tipo int.

Curso de Linguagem C

163

Comando return
n

O comando return possui duas


utilidades bsicas:
Causar a sada imediata da funo na qual
ele se encontra, retornando para o cdigo
de chamada.
Devolver um valor para a funo
chamadora.

Curso de Linguagem C

164

Exemplo
/* retorna 1 se o parmetro > 10 */
int maior_que_dez(int x)
{
return (x > 10);
}

Curso de Linguagem C

165

Argumentos
n

Quando necessrio passar alguma


informao extra para uma funo, esta
informao ser passada atravs de
argumentos.
Para chamar uma funo com argumentos,
eles devem ser colocados entre parnteses
aps o identificador da funo. Veja:
puts(Ateno);

a string Ateno o argumento


passado para a funo puts.

166

Chamadas por valor e por


referncia
n

Curso de Linguagem C

Existem duas formas de se passar um


parmetro para uma funo, utilizando
chamadas por valor ou por referncia.
Quando um parmetro passado por valor,
as alteraes efetuadas na funo no
afetaro a varivel da funo chamadora.
Quando um parmetro passado por
referncia, qualquer alterao efetuada pela
funo afetar a varivel da funo
chamadora.

Curso de Linguagem C

167

Exemplo
main()
{ int x = 3, y = 4;
printf(%d %d\n, x, y);
processa(x, &y);
printf(%d %d\n, x, y);
}
int processa(int a, int *b)
{ a = 6;
b = 7;
}

Curso de Linguagem C

168

Observaes
Vetores so passados por referncia.
n Quando uma funo feita para
receber um parmetro por referncia, o
parmetro deve ser declarado como um
ponteiro na lista de argumentos da
funo.
n Para conjuntos grandes de dados, a
passagem de parmetros por referncia
mais rpida.
n

169

Argumentos argc e argv para


main()
n

Curso de Linguagem C

A funo main tambm recebe


argumentos. Eles so os parmetros da
linha de comando passados ao
programa. Os dois parmetros so argc
e argv. Veja como eles devem ser
declarados:
main(int argc, char *argv[ ])

Argc conter o nmero de parmetros


passados e argv conter os
parmetros.

Curso de Linguagem C

170

Exemplo
/* Funo para imprimir os parmetros */
main(int argc, char *argv[ ])
{
int i;
for (i = 0; i < argc; i ++)
printf(argv[%d]: %s\n, i, argv[i]);
}

171

Funes que devolvem no


inteiros
n

Curso de Linguagem C

Quando o tipo de uma funo no


declarado, por default, ele ser int.
Se for necessrio definir uma funo que
retorna valores de outros tipos, o tipo deve
ser especificado.
Quando a funo no do tipo int, ela deve
ser identificada antes de ser chamada da
primeira vez. Assim, o compilador poder
gerar um cdigo correto para a chamada
funo.

Curso de Linguagem C

172

Prottipos
Como vimos, as funes que no
retornam int, devem ser identificadas
antes de serem referenciadas, para
isto, deve ser definido um prottipo para
a funo.
n Forma geral
n

tipo nome_funo(tipo_parmetros);

Curso de Linguagem C

173

Exemplo
float metade(float);
main()
{
printf(%f\n, metade(3));
}
float metade(float numero)
{
return (numero / 2);
}

Curso de Linguagem C

174

Recursividade
A linguagem C permite que as prprias
funes se chamem. A esta
caracterstica damos o nome de
recursividade.
n Existem muitos problemas que se
tornariam extremamente difceis de
serem implementados sem a
recursividade.
n

Curso de Linguagem C

175

Preprocessador
Antes do programa ser compilado, ele
submetido ao preprocessador. Esta
caracterstica muito til.
n Todos os comandos do preprocessador
so iniciados por um sinal #, sendo os
dois mais usados:
n

#define
#include

Curso de Linguagem C

176

#define
n

O comando define serve para definir um


identificador e uma string. O compilador
substituir o identificador pela string
toda vez que for encontrado no arquivofonte. O identificador chamado de
nome de macro, e o processo de
substituio chamado de substituio
de macro.
#define indentificador string

Curso de Linguagem C

177

Exemplo
#define mensagem Isto um teste.\n
#define verdadeiro 1
#define falso !verdadeiro
main()
{
if (verdadeiro) printf(mensagem);
if (falso) printf(mensagem);
}

Curso de Linguagem C

178

#include
n

Instrui o compilador a incluir um outro arquivo


fonte com aquele que contm o comando
#include. O nome do arquivo a ser includo deve
estar entre aspas ou entre o sinal de maior e
menor.
Se o nome do arquivo for colocado entre aspas,
o compilador procurar pelo arquivo na seguinte
seqncia: diretrio atual, diretrios configurados
no compilador e diretrios padres. Caso o nome
do arquivo esteja entre < >, no ser procurado
no diretrio atual.

Curso de Linguagem C

179

Entrada e sada
A entrada e sada em C feita
utilizando-se funes da biblioteca do
compilador, no existe nenhuma
palavra reservada para esta finalidade.
n Existem dois sistemas de entrada e
sada em C:
n

Bufferizado
No bufferizado
n

O padro ANSI s define o primeiro.

Curso de Linguagem C

180

Arquivo cabealho stdio.h


n

Muitas bibliotecas em C exigem que


certos tipos de dados ou outras
informaes sejam partes dos
programas que as usam. Para isto,
necessrio utilizar o comando #include
e incluir arquivos cabealho com estas
definies nos programas.
#include <stdio.h>

Curso de Linguagem C

181

Filas de bytes
O sistema de arquivo bufferizado
destina-se a trabalhar com uma
variedade de dispositivos, que inclui
terminais, acionadores de disco e
acionadores de fita.
n Embora cada dispositivo seja diferente,
o sistema de arquivo bufferizado
transforma cada um em um dispositivo
lgico chamado fila de bytes.
n

Curso de Linguagem C

182

Arquivos
Em C, um arquivo um conceito lgico
que o sistema pode aplicar a qualquer
coisa, desde arquivos em disco at
terminais.
n Para associar uma fila de bytes a um
determinado arquivo, basta realizar
uma operao de abertura.
n Todas as filas de bytes so iguais.
n Nem todos os arquivos so iguais.
n

183

Sistema de entrada e sada


buferizado

Curso de Linguagem C

O sistema de entrada e sada


bufferizado composto de vrias
funes relacionadas.
n Para utiliza-las, necessrio incluir o
arquivo-cabealho stdio.h no programa.
n

Curso de Linguagem C

184

O ponteiro do arquivo
o que mantm unido o sistema de
entrada e sada bufferizado.
n um ponteiro para a informao que
define vrios aspectos do arquivo,
incluindo nome, status e posio
corrente.
n Um ponteiro de arquivo uma varivel
de ponteiro do tipo FILE, que definida
em stdio.h.
n

Curso de Linguagem C

185

Algumas funes
Nome
fopen()
fclose()
putc()
getc()
fseek()
fprintf()
fscanf()
feof()
ferror()
rewind()
remove

Funo
abre uma fila
fecha uma fila
grava um caracter na fila
l um caracter na fila
ajusta a posio atual no arquivo
printf para a fila
scanf para a fila
indica se a marca EOF foi encontrada
indica se ocorreu um erro
reposiciona no incio do arquivo
apaga um arquivo

Curso de Linguagem C

186

fopen()
n

Abre uma fila de bytes para ser usada e liga


um arquivo a esta fila.
Prottipo:
FILE *fopen(char *nome_arq, char *modo);

onde modo uma string que contm o status


de abertura desejado.
nome_arq uma string com um nome de
arquivo vlido para o sistema operacional,
podendo incluir drive e diretrio.
Retorna NULL ( = 0 ) se a funo falhar.

Curso de Linguagem C

187

Valores legais de modo


Modo
r
w
a
rb
wb
ab
r+
w+
a+
r+b
w+b
a+b
rt
wt
at
r+t
w+t
a+t

Significado
abre um arquivo-texto para leitura
cria um arquivo-texto para gravao
anexa a um arquivo-texto
abre um arquivo binrio para leitura
cria um arquivo binrio para gravao
anexa a um arquivo binrio
abre um arquivo-texto para leitura/gravao
cria um arquivo-texto para leitura/gravao
abre ou cria um arquivo-texto para leitura/gravao
abre um arquivo binrio para leitura/gravao
cria um arquivo binrio para leitura/gravao
abre um arquivo binrio para leitura/gravao
abre um arquivo-texto para leitura
cria um arquivo-texto para gravao
anexa a um arquivo-texto
abre um arquivo-texto para leitura/gravao
cria um arquivo-texto para leitura/gravao
abre ou cria um arquivo-texto para leitura/gravao

Curso de Linguagem C

188

fclose()
Fecha uma fila que foi aberta com
fopen().
n Todas as filas devem ser fechadas
antes que o programa termine.
n Prottipo:
n

int fclose(FILE *arquivo);

Curso de Linguagem C

189

ferror() e rewind()
ferror() determina se a ltima operao
com arquivos produziu um erro
(devolvendo 1 caso tenha ocorrido).
n rewind() reposiciona no incio do
arquivo.
n Prottipos:
n

int ferror(FILE *arquivo);


void rewind(FILE *arquivo);

Curso de Linguagem C

190

getc() e putc()
n

So utilizados para ler e gravar caracteres


numa fila previamente aberta.
Prottipo:
int putc(int caracter, FILE *arquivo);
int getc(FILE *arquivo);

putc devolve o caracter gravado em caso de


sucesso, em caso de erro EOF(definido em
stdio.h) ser devolvido.
getc devolve um inteiro mas com o byte
superior zero. Ele devolve EOF quando
alcanar o fim do arquivo.

Curso de Linguagem C

191

fprintf() e fscanf()
So os correspondentes a printf e scanf
do sistema de entrada e sada do
console. A diferena que o primeiro
parmetro um ponteiro de arquivo.
n Prottipos:
n

int fprintf(FILE *arq, const char *controle, ...);


int fscanf(FILE *arq, const char *controle, ...);

Curso de Linguagem C

192

fgets() e fputs()
So as correspondentes a gets e puts
para arquivos.
n Prottipos:
n

char *fputs(char *str, FILE *arquivo);


char *fgets(char *str, int comprimento, FILE
*arquivo);
n

Observe que em fgets pode ser


especificado o comprimento mximo da
string e, ao contrrio do gets, o \n final
colocado na string.

Curso de Linguagem C

193

getw() e putw()
So utilizadas para ler e gravar inteiros.
n Elas trabalham exatamente como getc
e putc com exceo de gravarem
inteiros.
n Prottipos:
n

int getw(FILE *arquivo);


int putw(int numero, FILE *arquivo);

Curso de Linguagem C

194

fread() e fwrite()
n

So funes utilizadas para ler e gravar blocos de


dados nos arquivos.
Prottipos:
int fread(void *buffer, int tamanho, int quantidade, FILE
*arquivo);
int fwrite(void *buffer, int tamanho, int quantidade, FILE
*arquivo);

buffer um ponteiro para a regio da memria que


possui os dados, tamanho o tamanho em bytes de
cada unidade, quantidade determina quantos itens
(cada um contendo tamanho bytes) sero lidos ou
gravados e arquivo um ponteiro de arquivo para
uma fila previamente aberta.

Curso de Linguagem C

195

fseek()
n

utilizado para efetuar operaes de leitura e


gravao aleatrias sob o sistema de entrada e
sada bufferizado.
Prottipo:
int fseek(FILE *arquivo, long int num_bytes, int origem);

n
n

fseek retorna zero em caso de sucesso.


Arquivo o ponteiro de arquivo, num_bytes o
nmero de bytes desde origem at chegar a nova
posio e origem um dos seguintes macros:
Origem
Nome
incio do arquivo SEEK_SET
posio corrente SEEK_CUR
fim do arquivo
SEEK_END

196

Curso de Linguagem C

As filas de bytes stdin, stdout e


stderr
n

Existem 3 filas de bytes especiais que


so abertas automaticamente quando o
programa inicializado:
stdin
sdtout
stderr

entrada padro
sada padro
erro padro

Elas podem ser usadas para efetuar


operaes de entrada e sada no
console.

Curso de Linguagem C

197

Exemplo
#include <stdio.h>
main(int argc, char *argv[ ])
{ FILE *entrada, *saida;
char ch;
if (argc != 3) {
printf(No foi digitado o nome da origem.\n);
exit(1);
}
if (!(entrada = fopen(argv[1], rb)) {
printf(arquivo de origem no achado.\n);
exit(1);
}

Curso de Linguagem C

198

Exemplo (continuao)
if (!(saida = fopen(argv[2], wb)) {
printf(Arquivo destino no pode ser aberto.\n);
exit(1);
}
/* esta a linha que copia o arquivo */
while (!feof(entrada)) putc(getc(entrada), saida);
fclose(entrada);
fclose(saida);
}

199

Curso de Linguagem C

Tipos de dados definidos pelos


usurios
n

Em C podem ser criados 5 tipos


diferentes de dados personalizados:

estrutura
campo de bit
unio
enumerao
typedef

O uso de tipos definido pelo usurio


facilita a programao e d maior poder
ao programador.

Curso de Linguagem C

200

Estruturas
n

Em C, uma estrutura uma coleo de


variveis que so referenciadas pelo mesmo
nome.
uma forma conveniente de manter juntas
informaes relacionadas.
Forma geral:
struct nome_estrutura {
tipo1 var1;
tipo2 var2;
} var_estrutura;

201

Declarando variveis do tipo


estrutura
n

Curso de Linguagem C

Alm de poder declarar variveis do


tipo da estrutura durante a definio da
estrutura, elas podem ser declaradas
da seguinte forma:
struct nome_estrutura nome_varivel;

202

Acessando variveis do tipo


estrutura

Curso de Linguagem C

Para acessar variveis do tipo


estrutura, utiliza-se o operador . (ponto).
n Forma geral:
n

nome_variavel.nome_elemento;

Curso de Linguagem C

203

Exemplo
struct pessoa {
char nome[21];
int idade;
} primeiro;
main() {
struct pessoa segundo;
strcpy(primeiro.nome, Jos);
primeiro.idade = 20;
segundo = primeiro;
}

Curso de Linguagem C

204

Vetores e matrizes de estruturas


n

Podem ser declarados vetores e


matrizes de estruturas, para isto,
usamos a forma geral:
struct nome_estrutura nome_var[t1][t2]...[tn];

Exemplo:
struct pessoa pessoas[5];

Curso de Linguagem C

205

Ponteiros para estruturas


Em C, podem ser declarados ponteiros
para estruturas.
n Forma geral:
n

struct pessoa *primeiro;

206

Curso de Linguagem C

Vantagens de se usar ponteiros


para estruturas

Fazer chamada por referncia para


uma funo;
n Criar listas ligadas com estruturas
dinmicas de dados usando o sistema
de alocao.
n mais rpido passar estruturas
grandes por referncia (usando
ponteiros) do que por valor, pois
estamos passando apenas um
endereo.
n

207

Curso de Linguagem C

Acessando os elementos usando


ponteiros para estruturas
n

Veja a declarao:
struct pessoa *primeiro, segundo;
strcpy(segundo.nome, Jos);
segundo.idade = 10;
primeiro = &segundo;

Para acessar o campo idade de


primeiro:
(*primeiro).idade
primeiro -> idade

208

Curso de Linguagem C

Vetores, matrizes e estruturas


dentro de estruturas
n

Os elementos das estruturas podem ser


simples ou complexos, assim, podemos
colocar vetores, matrizes e at
estruturas dentro das estruturas. Veja:
struct complexa {
char setor[21];
struct pessoa funcionarios[50];
}

Curso de Linguagem C

209

Campos de bit
n

C possui metodos para acessar


somente um bit dentro de um byte. Isto
til para:
Economizar memria declarando vrias
variveis booleanas num s byte
Comunicar com dispositivos que
transmitem informaes diversas
codificadas em bytes
Rotinas de codificao que precisam
acessar bits dos bytes

Curso de Linguagem C

210

Como declarar campos de bit


Os campos de bit s podem ser
declarados dentro de estruturas.
n Forma geral:
n

struct nome_estrutura {
tipo1 var1 : comprimento;
tipo2 var2 : comprimento;
} nome_var ;
n

Os tipos podem ser: int, signed e


unsigned. Quando o tamanho 1, ele
deve ser obrigatoriamente unsigned.

Curso de Linguagem C

211

Exemplo
struct dispositivo {
unsigned ativo : 1;
unsigned pronto : 1;
unsignet erro : 1;
unsigned : 2;
unsigned ultimo_erro : 3;
}

Curso de Linguagem C

212

Unies
Em C, uma unio uma localizao de
memria que usada por muitas
variveis diferentes, que podem ser de
tipos diferentes.
n A declarao e o acesso a uma unio
feita de forma semelhante as
estruturas, s que usando a palavra
reservada union no lugar de struct.
n

Curso de Linguagem C

213

Exemplo
union dois_bytes {
int inteiro;
char caracter[2];
} valor;
main()
{
valor.inteiro = A * 256 + B;
printf(%c %c, valor.caracter[0],
valor.caracter[1]);
}

Curso de Linguagem C

214

Enumeraes
Enumerao um conjunto de
constantes inteiras com nome e e
especifica todos os valores legais que
uma varivel daquele tipo pode ter.
n Para declarar:
n

enum nome_tipo { lista de constantes }


nome_var;
n

Todas as constantes recebero valores


inteiros a comear por zero, a no ser
que seja especificado o contrrio.

Curso de Linguagem C

215

Exemplo
enum tamanhos {pequeno, medio, grande =
5} tamanho;
main()
{
tamanho = pequeno; printf(%d, tamanho);
tamanho = medio; printf(%d, tamanho);
tamanho = grande; printf(%d, tamanho);
}

Curso de Linguagem C

216

sizeof
n

Como estamos trabalhando s com


computadores IBM PC, at agora, no nos
preocupamos com os tamanhos das
variveis pois j sabemos seus valores.
C possui o operador sizeof com a finalidade
de garantir a portabilidade dos programas
entre ambientes cujos tamanhos das
variveis sejam diferentes.
sizeof retorna a quantidade de bytes que
uma varivel ocupa na memria.

Curso de Linguagem C

217

Exemplos
n

Alocar memria para 10 floats:


float *numeros;
numeros = (float *) calloc(10, sizeof(float));

Imprimir o tamanho gasto por uma


varivel inteira:
printf(%d, sizeof(int));

Curso de Linguagem C

218

typedef
C permite que sejam definidos
explicitamente novos tipos de dados
usando a palavra reservada typedef.
n typedef no cria realmente uma nova
classe de dados, mas sim define um
novo nome para uma tipo j existente.
n O uso do typedef torna os programas
em C mais legveis e mais portteis
pois bastar alterar a definio do
typedef quando trocar de ambiente.
n

Curso de Linguagem C

219

Exemplo
n

Aps as definies:
typedef float balanco;
typedef char string[21];
typedef struct pessoa tipo_pessoa;

As seguintes declaraes sero


equivalentes:
balanco valor;
string frase;
tipo_pessoa aluno;

float valor;
char frase[21];
struct pessoa aluno;

Curso de Linguagem C

220

Operadores avanados
n

C possui vrios operadores especiais


que aumentam em muito sua fora e
flexibilidade - especialmente na
programao a nvel de sistema.

Curso de Linguagem C

221

Operadores bit a bit


Como C foi projetada para substituir a
linguagem assembly na maioria das
tarefas de programao, ela possui um
completo arsenal de operadores bit a
bit.
n Os operadores bit a bit s podem ser
usados nos tipos char e int.
n

Curso de Linguagem C

222

Tabela dos operadores bit a bit


Operador
&
|
^
~
>>
<<

Ao
E
OU
OU exclusivo (XOR)
Complemento de um (NOT)
Deslocar para direita
Deslocar para esquerda

Curso de Linguagem C

223

Operador ?
n

O operador ? pode ser usado para


substituir comandos if / else que
tenham a forma geral:
if (condio)
expresso1;
else
expresso2;

Forma geral:
condio ? expresso1 : expresso 2;

Curso de Linguagem C

224

Exemplo
n

A seqncia de comandos:
x = 10;
if (x > 9) y = 100;
else y = 200;

pode ser substituda por:


x = 10;
y = x > 9 ? 100 : 200;

Curso de Linguagem C

225

Formas abreviadas
n

C permite que sejam escritas formas


abreviadas dos comandos de
atribuio. Os comandos:
x = x + 10;
y = y * 20;
z = z - 5;

podem ser reescritos da forma:


x += 10;
y *= 20;
z -= 5;

Curso de Linguagem C

226

Operador vrgula
O operador vrgula usado para juntar
vrias expresses. O compilador
sempre avalia o lado esquerdo da
vrgula como void. Assim, a expresso
do lado direito ficar sendo o valor de
toda expresso separada por vrgula.
n Por exemplo:
n

x = (y = 3, y + 1);
n

Atribuir 3 a y e 4 a x.

Curso de Linguagem C

227

Parnteses e colchetes
C considera os parnteses e os
colchetes como operadores.
n Os parnteses executam a tarefa
esperada de aumentar a precedncia
dos operadores que esto dentro deles.
n Os colchetes executam a indexao de
vetores e matrizes.
n

Curso de Linguagem C

228

Resumo de precedncia
Maior

Menor

( ) [ ] ->
! ~ ++ -- - (type cast) * & sizeof
*/%
+<< >>
< <= >=
== !=
&
^
|
&&
||
?
= += -= *= /=
,

Curso de Linguagem C

229

Funes comuns
A biblioteca padro de funes da
linguagem C muito ampla.
n Os programas em C fazem uso intenso
das funes da biblioteca.
n Os programadores iniciantes tendem a
reescrever funes j existentes nas
bibliotecas.
n

Curso de Linguagem C

230

Funes matemticas
n

Os prottipos das funes matemticas ficam


no arquivo math.h. Veja alguns prottipos:
double sin(double arg);
double cos(double arg);
double tan(double arg)
double exp(double arg);
double log(double num);
double log10(double num);
double pow(double base, double exp);
double sqrt(double num);

231

Alguns erros comuns de


programao

Curso de Linguagem C

Por ser uma linguagem que d muito


poder ao programador, tambm muito
fcil de errar em C.
n Como o compilador aceita praticamente
tudo o que se escreve, o programador
deve ter ateno redobrada na hora de
programar.
n

232

Erros de ordem de
processamento
n

Os operadores de incremento e
decremento so usados na maioria dos
programas em C, e a ordem de
ocorrncia da operao afetada pelo
fato de esses operadores precederem
ou sucederem a varivel. Logo, se y=10
x = y++;

Curso de Linguagem C

ser diferente de
x = ++y;

Curso de Linguagem C

233

Problemas com ponteiros


n

O mau-uso de ponteiros em C pode


causar muitos problemas. Veja os dois
exemplos ERRADOS abaixo:
int *x;
char *p;
*p = malloc(100);
*x = 10;

Curso de Linguagem C

234

Redefinindo funes
n

possvel, mas no recomendado, que seja


criada uma funo com o mesmo nome de
uma existente na biblioteca de C. Isto far
com que qualquer chamada a esta funo
seja direcionada para a nova.
A pior parte que, mesmo o nosso programa
no referenciando uma funo da biblioteca,
as prprias funes da biblioteca podem
estar se referenciando, o que causar
problemas da mesma forma. Por exemplo, o
programador reescreveu a funo getc mas
esqueceu-se que a funo scanf a chama.

Curso de Linguagem C

235

Erros por um
n

Todos os ndices dos vetores e


matrizes em C comeam em 0. Logo, o
programa abaixo est errado.
main()
{
int x, num[100];
for (x = 1; x <= 100; x ++)
num[x] = x;
}

Curso de Linguagem C

236

Erros de limite
n

Muitas funes em C (inclusive as das


bibliotecas) no possuem (ou possuem
pouca) verificao de limites. Assim, a
chamada a gets abaixo pode gerar um
problema caso o usurio digite mais
que 20 caracteres.
main()
{ char texto[21];
gets(texto);
}

237

Omisses de declarao de
funo
n

Curso de Linguagem C

Esquecer de definir o prottipo de uma


funo pode causar erro pois o
compilador estar esperando sempre
que as funes no declaradas
retornem um inteiro. O mesmo
problema ocorre tambm com os
parmetros.

Curso de Linguagem C

238

Erros de argumentos de chamada


n

Os argumentos passados a uma funo


devem ser do mesmo tipo do esperado
por elas. O programa abaixo est
errado:
main()
{
int x;
char string[10];
scanf(%d%s, x, string);
}

Curso de Linguagem C

239

Exerccio (parte 1)
Faa um programa que leia 5 nomes
com suas respectivas idades e mostre o
maior e o menor.
n Vamos dividir o problema em partes,
primeiro vamos definir uma estrutura
contendo um campo nome e um campo
idade:
n

typedef struct {
char nome[21];
int idade; } pessoa;

Curso de Linguagem C

240

Exerccio (parte 2)
n

Vamos definir a funo mais_velho que


recebe 2 ponteiros do tipo pessoa e
retorna um ponteiro para a pessoa mais
velha:
pessoa *mais_velho(pessoa *p1, pessoa
*p2);
{
if (p1 -> idade < p2 -> idade) return p2;
else return p1;
}

Curso de Linguagem C

241

Exerccio (parte 3)
n

Vamos definir a funo mais_novo que


recebe 2 ponteiros do tipo pessoa e
retorna um ponteiro para a pessoa mais
nova:
pessoa *mais_novo(pessoa *p1, pessoa
*p2);
{
if (p1 -> idade > p2 -> idade) return p2;
else return p1;
}

Curso de Linguagem C

242

Exerccio (parte 4)
n

Vamos definir a funo le_pessoa que


recebe um ponteiro do tipo pessoa e faz
a leitura do teclado:
void le_pessoa(pessoa *p)
{
printf(Nome: );
gets(p -> nome);
printf(Idade: );
scanf(%d, p -> idade);
}

Curso de Linguagem C

243

Exerccio (parte 5)
n

Vamos definir a funo mostra_pessoa


que recebe um ponteiro para uma
pessoa e mostra seus dados na tela.
void mostra_pessoa(pessoa *p)
{
printf(Nome: %s\nIdade: %d\n, p->nome,
p->idade);
}

Curso de Linguagem C

244

Exerccio (parte 6)
Agora s falta declarar as variveis e
definir o programa principal, que ser
composto por um loop de entrada, um
loop de pesquisa e a apresentao dos
resultados.
n Dividindo o cdigo do programa, fica
mais fcil resolver os problemas e
verificar os erros que possam ocorrer.
n

Curso de Linguagem C

245

Exerccio (parte 7)
main()
{ pessoa pessoas[5], *velho, *novo;
int i;
for(i = 0; i < 5; i++) le_pessoa(&pessoas[i]);
velho = novo = pessoas;
for(i = 1; i < 5; i++) {
velho = mais_velho(velho, &pessoas[i]);
novo = mais_novo(novo, &pessoas[i]);
}
puts(O mais novo \n); mostra_pessoa(novo);
puts(O mais velho \n); mostra_pessoa(velho);
}

Você também pode gostar