You are on page 1of 165

L

i
n
g
u
a
g
e
m

C
1
L
i
n
g
u
a
g
e
m

C
Linguagem C
Treinamento em
Desenvolvimento de
Aplicativos para Sistemas
Embarcados
L
i
n
g
u
a
g
e
m

C
2
Bibliografia

Shildt, Herbert , C Completo e Total, Editora


Makron Books, 3edio, So Paulo, 1997.

Manzano, Jos augusto, Estudo Dirigido de


Linguagem C, Editora rika, So Paulo,
1997.
L
i
n
g
u
a
g
e
m

C
3
Ementa
ntroduo
Operadores e Expresses
Funes de E/S
Estruturas de Controle
Vetores e Matrizes
Strings
Ponteiros
Funes
Estruturas
Alocao Dinmica de Memria
Arquivos
L
i
n
g
u
a
g
e
m

C
4
ntroduo

Histrico
C resultado de um processo iniciado com a
linguagem BCPL. BCPL influenciou a linguagem
de nome B, que evoluiu posteriormente para C.
Projetada em 1972, nos laboratrios da BELL
(empresa de desenvolvimento de software
bsico), por Brian Kerninghan e Dennis Ritchie
para o UNX do PDP-11.
A simplicidade de sua implementao permitiu a
extenso da linguagem e a criao de compila-
dores C para praticamente todas as plataformas
de hardware e sistemas operacionais.
Em 1983 estabeleceu-se o padro ANS.
L
i
n
g
u
a
g
e
m

C
5
ntroduo

Caractersticas
Portabilidade
Linguagem estruturada e modular
Gerao de cdigo eficiente
Simplicidade
Possui apenas 32 palavras chaves
Uso de biblioteca de funes que implementam
os recursos de alto nvel para o programador
Linguagem de mdio nvel
Combina facilidades de uma linguagem de alto nvel com a
versatilidade e potencialidade do Assembly.
No efetua verificaes em tempo de execuo.
L
i
n
g
u
a
g
e
m

C
6
ntroduo

Aplicao

Sistemas Operacionais

Compiladores

Planilhas Eletrnicas

Editores de Texto

Banco de Dados
L
i
n
g
u
a
g
e
m

C
7
ntroduo
Linguagem de mquina: nica linguagem que o
computador entende, ou seja, que pode ser
diretamente executada pelo hardware. Ela formada
por cdigos binrios que representam as instrues e
dados. Tem uso difcil e tedioso. Pode-se dizer que,
para se programar em linguagem de mquina
necessrio um amplo conhecimento do hardware
utilizado.
Linguagem de alto nvel: conjunto de instrues
mais compatveis com a linguagem humana e com o
modo do ser humano pensar. Estas linguagens, na
sua maioria, so de uso genrico e no necessrio
ter conhecimento do hardware utilizado.
L
i
n
g
u
a
g
e
m

C
8
ntroduo
Todo programa escrito em linguagem de alto nvel
chamado de programa-onte ou cdigo onte.
O programa em linguagem de mquina, escrito ou
resultante, chamado de programa-ob!eto ou
cdigo ob!eto.
Todo o programa-onte" para ser executado, deve
obrigatoriamente, de alguma forma, ser traduzido para
programa-ob!eto# Neste momento que so
utilizados os compiladores e/ou interpretadores.
L
i
n
g
u
a
g
e
m

C
9
ntroduo

$nterpretador% l o cdigo-fonte linha-a-linha,


faz uma consistncia de sua sintaxe e se no
houver erro, converte-a para linguagem de
mquina para execut-la. Este processo
realizado at que a ltima linha seja
executada ou a consistncia apresente algum
erro. O interpretador precisa estar presente
todas as vezes que vamos executar o nosso
programa e o trabalho de checagem da
sintaxe dever ser repetido.
L
i
n
g
u
a
g
e
m

C
10
ntroduo
Compilador% l o programa inteiro, faz uma
consistncia de sua sintaxe e se no houver erro,
gera o cdigo-objeto em disco com a extenso .OBJ.
Este programa no pode ser executado at que
sejam agregadas a ele rotinas em linguagem de
mquina (biblioteca da linguagem) que lhe permitiro
a sua execuo. Este trabalho feito por um
programa chamado lin&editor, que cria o cdigo-
executvel final em disco com a extenso .EXE.
Neste momento no mais necessria a presena
do compilador, pois todo o programa j esta
traduzido para linguagem de mquina e armazenado
em disco, basta rod-lo.
L
i
n
g
u
a
g
e
m

C
11
ntroduo

C uma linguagem compilada


'ontes C
Arquivos ()* )ibliotecas
Compila+,o
-
E.ecutvel
Liga+,o
L
i
n
g
u
a
g
e
m

C
12
Estrutura de um programa em C
Declarao das bibliotecas de funes (/include)
Declaraes de constantes e seus valores (/deine0
Declarao das variveis globais (pblicas)
Declarao das funes
nica funo obrigatria e primeira a ser executada
a funo main10
O corpo das funes fica entre 2 3
main() /* funo obrigatria */
{
printf(Hello World);
}
L
i
n
g
u
a
g
e
m

C
13
Estrutura de um programa em C
/* declarao dos arquivos de cabealho e definies */
#include <stdio.h>
#define P 3.1415
/* definio das variveis globais */
/* funo principal do programa */
void main()
{
/* definio das variveis locais */
printf ("Hello World);
}
L
i
n
g
u
a
g
e
m

C
14
Mapa de Memria
4il5a
Heap
6ariveis
7lobais
Cdigo do
4rograma
L
i
n
g
u
a
g
e
m

C
15
Tipos bsicos de dados
T$4( )$Ts )8TEs DESC9$:;( D(<=>$(
void 0 0 sem argumento e no retorna
valor
Sem valor
char 8 1 caractere isolado -128 a 127
int 16 2 valor inteiro -32.768 a 32.767
float 32 4 nmero ponto-flutuante (n
o

contendo um ponto decimal
e/ou um expoente)
3.4E-38 a 3.4E+38
double 64 8 nmero ponto-flutuante de
dupla preciso (mais
algarismos significativos e um
expoente que pode ter mais
magnitude)
1.7E-308 a
1.7E+308
L
i
n
g
u
a
g
e
m

C
16
Modificadores de tipos bsicos
signed char -128 a 127
signed int -32.768 a 32.767
short int = int -32.768 a 32.767
unsigned char 0 a 255
unsigned int 0 a 65.535
unsigned short int = unsigned int 0 a 65.535
long int -2.147.483.648 a 2.147.483.647 (quatro bytes)
unsigned long int 0 a 4.294.967.295
long float = double (padro ANS)
long double dez dgitos de preciso ( 80 bits)
L
i
n
g
u
a
g
e
m

C
17
dentificadores
Identificadores so os nomes das varireis,
funes, rtulos e outros objetos definidos
pelo usurio.
O primeiro caracter deve ser uma letra ou sublinhado
Apenas os 32 primeiros caracteres so significativos
case sensitive, ou seja, maisculas se diferem das
minsculas
int x; /* diferente de int X; */
As instrues terminam com ";
Comentrios devem ficar entre /* e */
Palavras-chave so minsculas
L
i
n
g
u
a
g
e
m

C
18
Declarao
int i;
float f;
unsigned int inteirosemsinal;
!"ar !";
double balan!o# lu!ro# pre$ui%o;
int i# $# &;
int e'emplodeumnomelongo;
long int ()&;

L
i
n
g
u
a
g
e
m

C
19
Primeiro Programa
1. Use o DE Dev C++ para editar,
compilar, linkar e executar o
programa Hello.c
2. Qual o tamanho dos arquivos C, OBJ
e EXE do programa Hello.c ?
3. Que concluses voc tira da
resposta da questo 2?
L
i
n
g
u
a
g
e
m

C
20
Ementa
ntroduo
Operadores e Expresses
Funes de E/S
Estruturas de Controle
Vetores e Matrizes
Strings
Ponteiros
Funes
Estruturas
Alocao Dinmica de Memria
Arquivos
L
i
n
g
u
a
g
e
m

C
21
Operadores
(perador de Atribui+,o
Em C o operador de atribuio o sinal de igual "=.
erro comum em programadores iniciantes confundir
o "= com o operador relacional de igualdade "==.
Exemplos:
a * +;
delta * b * b , - * a * !;
i * $;
O operando esquerdo deve ser um identificador de
varivel, isto , no pode ser uma constante ou
expresso. So atribuies invlidas:
+ * a; // !onstante.
b / + * a; // e'presso.
L
i
n
g
u
a
g
e
m

C
22
Converses de tipos
Se os dois operandos de uma atribuio no so do
mesmo tipo, o valor da expresso ou operador da direita
ser convertido para o tipo do identificador da esquerda.
Exemplo 1:
int i;
float r;
i * ); // 0alor de i1 )
r * i; // 0alor de r1 )23
Exemplo 2:
int i;
float r * 4)-256+;
i * r; // i ser7 trun!ado para 4)-
L
i
n
g
u
a
g
e
m

C
23
Converses de tipos
Pode-se dizer que as converses potencialmente perigo-
sas (onde h possibilidade de perda de informao) so:
!"ar int float double
Observe que o compilador C ao encontrar esta operao
n,o gera nenhum aviso de ateno para o programador.
Assim este detalhe pode gerar um erro de programao
(bug) que passe desapercebido ao programador
inexperiente. possvel dizer que a linguagem C possui
tipos macios (soft types) pois a operao com variveis
de tipos diferentes perfeitamente possvel. Esta
caracterstica do C se contrape a algumas linguagens em
que isto no possvel. Estas linguagens possuem tipos
"duros (hard types).
L
i
n
g
u
a
g
e
m

C
24
Operadores
Atribui+,o <?ltipla
possvel atribuir um valor a muitas variveis em
uma nica instruo.
int i# $# &;
double ma'# min;
i * $ * & * +;
ma' * min * 323;
(peradores Aritm@ticos
(perador (pera+,o
+ adio
- subtrao
* multiplicao
/ diviso
% mdulo (resto da diviso inteira)
L
i
n
g
u
a
g
e
m

C
25
Converso de tipo (casting)
O operador cast permite forar uma expresso a
ser de determinado tipo:
int num;
float 0alor * +523;
num * 0alor 8 6; // in07lido
num *(int) 0alor 8 6; // 07lido
A converso de tipo usada para que o dado
armazenado em 0alor fosse transformado no
tipo int assim a operao mdulo pode ser
efetuada.
Regra geral de converso de tipos:
!"ar int float double
L
i
n
g
u
a
g
e
m

C
26
ncremento/Decremento
Utilizados para incrementar e/ou decrementar em uma
unidade o valor de uma varivel. Eles podem ser
utilizados antes (prefixo) ou aps (posfixo) a varivel,
dando resultados ligeiramente diferentes.
Ex.:
Y = X ++; "Y recebe o valor de X e depois X incrementado
Y = X --; "Y recebe o valor de X e depois X decrementado
Y = ++ X; "X incrementado e depois Y recebe o valor de X
Y = -- X; "X decrementado e depois Y recebe o valor de X
L
i
n
g
u
a
g
e
m

C
27
Operadores Relacionais

As expresses compostas com operadores


relacionais comparam dois valores e
retornam 0 em caso de expresses falsas e
1 se forem verdadeiras.
(perador (pera+,o
< Menor que
> Maior que
< = Menor que ou igual a
> = Maior que ou igual a
= = gual a
! = Diferente de

L
i
n
g
u
a
g
e
m

C
28
Operadores Lgicos
Os operadores lgicos comparam duas expresses
e retornam o valor 0 (falso) ou 1 (verdadeiro).
(perador (pera+,o
&& AND (E)
|| OR (OU)
! NOT (NO)
O operador unrio ! tem maior precedncia, seguido
do operador E lgico. O operador OU lgico tem a
menor precedncia dentre os operadores lgicos.
L
i
n
g
u
a
g
e
m

C
29
Operadores Bit a Bit

Os operadores de bit s podem ser


utilizados com valores do tipo
caracter ou inteiro.
(perador (pera+,o
<< Deslocamento esquerda
>> Deslocamento direita
& E bit a bit
| OU bit a bit
^ XOU bit a bit
~ No bit a bit (complemento de um)
L
i
n
g
u
a
g
e
m

C
30
Operadores Bit a Bit
Ex.: a = 15 0 0 0 0 1 1 1 1
a << 1 0 0 0 1 1 1 1 0
a >> 3 0 0 0 0 0 0 1 1
Ex.: a = 15 0 0 0 0 1 1 1 1
b = 56 0 0 1 1 1 0 0 0
a & b 0 0 0 0 1 0 0 0
a | b 0 0 1 1 1 1 1 1
a ^ b 0 0 1 1 0 1 1 1
L
i
n
g
u
a
g
e
m

C
31
Operador Condicional (Ternrio)
O operador condicional (ou ternrio) consiste de um
ponto de interrogao (?) e um dois pontos (:)
usados juntos e requer trs operandos.
resultado = modo > 0 A 1 % 0;
a varivel resultado receber valor 1 se modo for
maior que 0, caso contrrio receber 0.
V
F
L
i
n
g
u
a
g
e
m

C
32
Expresses Reduzidas
Expresso normal Expresso reduzida
soma = soma + cont; soma += cont;
d = d 3; d-= 3;
y = y * (z+1); y*= z+1;
i = i / j; i/= j;
a = a & b; a &= b;
a = a << 3; a <<= 3;
L
i
n
g
u
a
g
e
m

C
33
Precedncia dos Operadores
<aior 1 0 B C -D
E F -- -- - 1tipo0 G H siIeo
G J K
- -
LL DD
L LM D DM
MM EM
H
N
O
HH
OO
A%
M -M -M GM JM etc#
<enor "
L
i
n
g
u
a
g
e
m

C
nstituto CERT Amaznia. Treinamento para Sistemas Embarcados 34
Problemas
1. Escreva quatro instrues diferentes em C, cada uma subtraindo
1 da varivel n.
2. Escreva um bloco de cdigo C que tem o mesmo efeito da
instruo
n * +33 / m//;
sem utilizar o operador de ps-incremento
3. Escreva um bloco de cdigo C que tem o mesmo efeito da
instruo
n * +33 / //m;
sem utilizar o operador de pr-incremento
4. Escreva uma instruo nica em C que subtraia de % a soma de
' e 9 e depois incremente 9.
5. Se m=5 e n=2, quais sero os valores de m e n aps cada uma
das expresses:
a2 m ** n//;
b2 m /* ::n;
L
i
n
g
u
a
g
e
m

C
35
Ementa
ntroduo
Operadores e Expresses
Funes de E/S
Estruturas de Controle
Vetores e Matrizes
Strings
Ponteiros
Funes
Estruturas
Alocao Dinmica de Memria
Arquivos
L
i
n
g
u
a
g
e
m

C
36
E/S pelo console
FUNO printf():
A funo printf() utilizada para escrever na
tela. O prottipo desta funo est descrito no
arquivo de cabealho <stdio.h>.
printf("string de controle", lista de argumentos);
A string de controle contm caracteres que
sero exibidos na tela, comandos de
formatao que dizem a print10 como exibir
os argumentos restantes ou ambos. Quando
encontra um comando de formatao, a
funo liga os comandos aos argumentos.
L
i
n
g
u
a
g
e
m

C
37
E/S pelo console
Cdigo Signiicado
%d Exibe um inteiro no formato decimal com
sinal
%uExibe um inteiro no formato decimal sem sinal
%f Exibe um tipo float no formato decimal
%c Exibe um caractere
%s Exibe uma string
%oExibe um nmero octal sem sinal
%xExibe um nmero hexadecimal sem sinal (letras
minsculas)
%X Exibe um nmero hexadecimal sem sinal (letras
maisculas)
L
i
n
g
u
a
g
e
m

C
38
E/S pelo console
Exemplos:
print1PKs KdP" PEsta @ uma string P" QRR0S
exibe:
Esta uma string 100
print1Pesta @ uma string KdP" QRR0S
exibe:
esta uma string 100
print1Po n?mero Kd @ decimal" K @ ponto lutuante#P"QR" QQR#TU0S
exibe:
o nmero 10 decimal, 110.79 ponto flutuante.
print1PKsP" PAlVWnP0S
exibe:
Al
e avana uma linha
print1XKc" KdY"Z["YCY0S
exibe:
A, 67
L
i
n
g
u
a
g
e
m

C
39
E/S pelo console
FUNO scanf():
A funo scan10 utilizada para leitura de dados
pelo teclado. O prottipo desta funo est descrito
no arquivo de cabealho Lstdio#5D#
scan1Pstring de controleP" lista de argumentos0S
A string de controle determina como os valores so
lidos para as variveis apontadas na lista de
argumentos.
Todas as leituras devem ser finalizadas por
<ENTER>.
A lista de argumento deve conter os endereos das
variveis a que devem ser atribudos os valores.
L
i
n
g
u
a
g
e
m

C
40
E/S pelo console
Exemplos:
;in!lude <stdio2"=
main(){
int idade;
printf(>igite um n?mero1 );
s!anf(8d# @idade);
printf (ABn( min"a idade C 8dA# idade) ;
}
;in!lude <stdio2"=
main(){
int pes;
float metros;
printf(ADnforme o n?mero de pes1 A);
s!anf(A8dA# @pes);

metros * pes * 3253-E;

printf(ABn8d pCs C 8f metrosA# pes# metros);
}
L
i
n
g
u
a
g
e
m

C
41
E/S pelo console
$nstru+\es Descri+,o
getchar() l um caracter do teclado aguardando
<Enter>
getche() l um caracter do teclado e prossegue
getch() l um caracter sem eco na tela e
prossegue
putchar() escreve um caracter na tela
gets() l uma string do teclado
puts() escreve uma string na tela
L
i
n
g
u
a
g
e
m

C
42
E/S pelo console
E.emplos%
#include <stdio.h>
main(){
c5ar chS
ch=getchar();
putchar(ch);
}
Comando print10 Resultado
("%-5.2f, 123.234) 123.23
("%5.2f, 3.234) 3.23
("%10s, "alo) alo
("%-10s, "alo) alo
("%5.7s, "123456789) 1234567
("%04d, 21) 0021
L
i
n
g
u
a
g
e
m

C
43
Exerccios
1. Utilize o operador si%eof para exibir quanto
espao em bytes ocupa cada um dos tipos bsicos
de C (char, int, float e double).
2. Leia uma temperatura em graus Centgrados e
apresent-la convertida em graus Fahrenheit. A
frmula de converso : F = (9 * C + 160) / 5. Exiba
o resultado com 3 casas decimais.
3. Faa um programa que leia um caractere e exiba
seu cdigo ASC equivalente.
4. Leia e exiba uma string com seu nome completo
usando a funo scan10# Qual o resultado obtido?
Justifique.
L
i
n
g
u
a
g
e
m

C
44
Ementa
ntroduo
Operadores e Expresses
Funes de E/S
Estruturas de Controle
Vetores e Matrizes
Strings
Ponteiros
Funes
Estruturas
Alocao Dinmica de Memria
Arquivos
L
i
n
g
u
a
g
e
m

C
45
Estruturas de Controle

Governam o fluxo de execuo do


programa. Se dividem em trs
categorias:

Desvios Condicionais: if, operador


ternrio (?:) e switch.

Loop: while(), do-while(), for() e os


comandos continue e break.

Desvio ncondicional: goto.


L
i
n
g
u
a
g
e
m

C
46
if
Sintaxe: i (e.press,o) comando;
else comando;
onde, comando poder ser um nico, um bloco de
comandos e, neste caso, usa-se os delimitadores
de bloco de comandos ( { } ) ou nenhum comando.
A clusula else opcional.
F
if (expresso)
comando;
else comando;
prximo comando;
F
L
i
n
g
u
a
g
e
m

C
47
if
Exemplo:
main()
{
int a# b;
printf(>igite dois n?meros);
s!anf(8d#8d#@a#@b);
if (b) printf(8fBn#(float)a/b);
else printf(di0iso por %eroBn);
}
L
i
n
g
u
a
g
e
m

C
48
if aninhados
Ocorre quando um comando if um objeto de um
outro if ou else.
Sintaxe exemplo:
if ( i )
{
if ( k ) comando1;
if ( j ) comando2;
else comando3;
}
else comando4;
L
i
n
g
u
a
g
e
m

C
49
if else - if
Sinta.e e.emplo%
if (e'presso) !omando;
else if (e'presso) !omando;
else if (e'presso) !omando;
else if (e'presso) !omando;
else !omando;
Neste caso, as expresses so avaliadas de cima para
baixo. Assim que uma expresso for diferente de zero
(verdadeira), o comando associado a ela executado e a
estrutura encerrada. Se nenhuma expresso for verdadeira,
ser executado o comando associado ao ltimo else e, se
ele no for declarado, nenhum comando ser executado.
L
i
n
g
u
a
g
e
m

C
50
if else - if
main(){
int magi!o# adi0in"a!ao;
randomi%e();
magi!o* random(+3);
printf((>DFDGHH1 );
s!anf(8d#@adi0in"a!ao);
if (adi0in"a!ao ** magi!o){
printf((IHJKLM);
printf(8d C o n?mero m7gi!oBn# magi!o);
} else if (adi0in"a!ao = magi!o)
printf(Nerrado, muito altoBnO);
else (Nerrado, muito bai'oBnO);}
L
i
n
g
u
a
g
e
m

C
51
Operador Ternrio
main(){
int ' * 5# 9 * P# ma';
ma' * ('=9)Q+13;
printf(ma' * 8dBn#ma');
}
L
i
n
g
u
a
g
e
m

C
52
switch
O comando de seleo s]itc5 utilizado em caso de seleo mltipla. Ele
testa o valor de uma expresso contra uma lista de constantes inteiras ou
caracter. Quando o valor igual, os comandos associados quela
constante so executados. Se nenhuma coincidncia for encontrada os
comandos de deault so executados.
s]itc51e.press,o0
2
case constanteQ%
comandosS
brea&S
case constante^%
comandosS
brea&S
#
deault%
comandosS
3
L
i
n
g
u
a
g
e
m

C
53
switch
O comando brea& causa a sada imediata do s]itc5. Se no existir um
comando brea& seguindo os comandos de um case, o programa segue
executando os comandos dos cases abaixo. Exemplo:
void main() {
int dia;
clrscr();
printf(Digite um dia da semana: );
scanf(%d,&dia);
switc(dia) {
case !: printf("nDomingo"n);
#rea$;
case %: printf("n&egunda"n);
#rea$;
'
case (: printf("n&)#ado"n);
#rea$;
default: printf("n*+mero inv)lido,,,"n);
}}
L
i
n
g
u
a
g
e
m

C
54
Comandos de repetio
O comando de repetio utilizado nos casos
em que queremos repetir determinados
comandos.
La+o for
Sintaxe:
or1inicialiIa+,oScondi+,oSincremento0 comando;
ou
or1inicialiIa+,oScondi+,oSincremento0
2
comandos;
3
L
i
n
g
u
a
g
e
m

C
55
for
$nicialiIa+,o: geralmente uma atribuio
que determina o valor inicial da varivel de
controle. Esta declarao pode ser feita
antes do lao e, desta forma, no necessita
ser declarada no escopo do comando.
Condi+,o: uma expresso que determina o
final do lao ou o valor final da varivel de
controle.
$ncremento: define como a varivel de
controle do lao varia cada vez que o lao
repetido.
L
i
n
g
u
a
g
e
m

C
56
for
Exemplo:
int -;
for(-.!;-/.!00;-11) printf(%d,-);
for(-.!00;-,.23;-4.3) {
5.-6-;
printf(o 7uadrado de %d 8 %f,-,5);
}
O lao infinito:
for( ; ; ) printf(este la9o 8 infinito"n);
c."0;
for( ; ; ){
c.getcar();
if (c..:) #rea$; o !omando brea& !ausa
o tCrmino imediato do lao
}
printf(;oc< digitou :);
L
i
n
g
u
a
g
e
m

C
57
while
Sintaxe: ]5ile1condi+,o0 comando;
ou
]5ile1condi+,o0
2
comandos;
3
A condio pode ser qualquer expresso, e
verdadeiro qualquer valor no-zero. Quando a
condio falsa, o controle do programa passa para
o primeiro comando aps o bloco de cdigo do
comando ]5ile#
L
i
n
g
u
a
g
e
m

C
58
while
Exemplo:
void main(){
int t.!, dia;
wile(t) {
printf(Digite um dia da semana, ou /==> para encerrar:
);
scanf(%d,&dia);
switc(dia) {
case !: printf("nDomingo"n);
#rea$;
'
case (: printf("n&)#ado"n);
#rea$;
case ==: printf("n?ncerrando"n);
t.0;
#rea$;
default: printf("n*+mero inv)lido,,,"n);
} /* fim sRit!"*/
} /* fim R"ile */
} /* fim main() */
L
i
n
g
u
a
g
e
m

C
59
do-while
Ao contrrio dos laos or e ]5ile, que testam as
condies no incio, o do-]5ile testa a condio no
final. Este lao sempre ser executado pelo menos uma
vez e repete at que a condio se torne falsa.
Sintaxe: do
2
comando
3 ]5ile 1condi+,o0;
Exemplo:
do
{
scanf(%d,&num);
}wile(num,.==);
L
i
n
g
u
a
g
e
m

C
60
Comandos de desvio
So utilizados para realizar desvios dentro de um
programa.
brea&%
O comando brea& tem duas finalidades. A primeira
de terminar um case num comando s]itc5 e a
segunda de forar o trmino imediato de um lao
de repetio.
Exemplo:
for(t*3;t<+33;t//){
print(8d Bn#t);
if(t**+3) brea&; }
L
i
n
g
u
a
g
e
m

C
61
Comandos de desvio

continue%
Fora a repetio (retorna ao incio do lao
e testa a condio).
Exemplo:
for('*3;'<+33;'//){
if ('86) !ontinue;
print(8d Bn#');
}
L
i
n
g
u
a
g
e
m

C
62
Comandos de desvio
goto%
Apesar das linguagens possurem estruturas de
controle eficientes, tambm disponibilizado o
comando de desvio. Deve-se ter um cuidado muito
grande, pois a sua utilizao em demasia ou de forma
incorreta tende a tornar os programas ilegveis.
A sua utilizao simples, basta declarar um rtulo
(identificador aceito pela linguagem C seguido de dois
pontos) e, de algum ponto do programa estabelecer o
desvio atravs da declarao goto rtulo;
Sintaxe: goto rtulo;
rtulo:
L
i
n
g
u
a
g
e
m

C
63
Comandos de desvio
Exemplo:
int '*+;
retorno1
printf(8d#');
'//;
if('<*+33) goto retorno;
L
i
n
g
u
a
g
e
m

C
64
Comandos de desvio
e.it10%
Assim como o comando brea& fora o trmino de um
lao, a funo e.it10 fora o trmino de execuo de
um programa, retornando ao sistema operacional.
Sintaxe:
void e.it1cdigo_de_erro0S
onde cdigo_de_erro utilizado para indicar o
estado de retorno. Quando for zero, indica trmino
normal de execuo e outros valores so utilizados
para indicar algum tipo de erro (retornado para a
varivel ERRORLEVEL em arquivos "batch do
DOS).
L
i
n
g
u
a
g
e
m

C
65
Lista de Exerccios
1. Anacleto tem 1,50 metro e cresce 2 centmetros por
ano, enquanto Felisberto tem 1,10 metro e cresce 3
centmetros por ano. Calcule e exiba quantos anos
sero necessrios para que Felisberto seja maior
que Anacleto.
2. mprima os nmeros perfeitos menores de 100.
Nota: Nmero perfeito aquele cuja soma de seus
divisores, exceto ele prprio, igual ao nmero.
Exemplo: 6 perfeito porque 1 + 2 + 3 = 6.
3. Calcule e apresente o valor de S no seguinte
somatrio:
S = 1/225 2/196 + 4/169 8/144 + ... + 16384/1
L
i
n
g
u
a
g
e
m

C
66
Ementa
ntroduo
Operadores e Expresses
Funes de E/S
Estruturas de Controle
Vetores e Matrizes
Strings
Ponteiros
Funes
Estruturas
Alocao Dinmica de Memria
Arquivos
L
i
n
g
u
a
g
e
m

C
67
Vetor

Um vetor uma matriz de uma dimenso


capaz de armazenar um conjunto de variveis
de mesmo tipo, referenciadas pelo seu nome e
por um ndice.

Sintaxe: tipo nomeStaman"oT;

As variveis so alocadas seqencialmente


na memria.

tamanho representa o nmero de elementos


suportado pelo vetor.

O ndice do vetor varia de 0 a (tamanho-1).


L
i
n
g
u
a
g
e
m

C
68
Vetor
Exemplo:
6etor notas QR [ R T ^
ndices R Q ^ _ `
main(){
int notasS)T# i# soma*3;
for (i*3; i<) ; i//) {
printf(>igite a nota 8d1#i);
s!anf(8d#@notasSiT); }
for (i*3; i<) ; i//) soma . soma 1 notas@iA;
printf(Uedia * 8f# (float) soma/));
}
L
i
n
g
u
a
g
e
m

C
69
Verificao de Limites
A linguagem C no faz verificao automtica dos
limites dos vetores.
O teste dos limites deve ser realizado pelo programa
e erro comum de programao:
main()
{
int aS+3T#i;
for (i*+;i<*+3;i//)
s!anf(8d#@aSiT);
}
L
i
n
g
u
a
g
e
m

C
70
Exerccios
1. Leia dois vetores A e B com 5 elementos inteiros
cada, calcule e escreva:
O vetor S = A + B;
O vetor W com os elementos intercalados de A e
B;
O vetor Z obtido pela inverso da ordem de A;
O vetor Q com os elementos comuns de A e B;
O vetor Y correspondente unio de A e B;
Coloque A em ordem crescente de seus
elementos.
L
i
n
g
u
a
g
e
m

C
71
Matrizes
Possuem duas dimenses fazendo meno a linhas
e colunas.
Sintaxe: tipo nomeSdimlin"aTSdim!olunaT;
Ex: int N[2][3];
Matriz N
0
[ Z T Valores
1 Z T a Valores
Linha 0 1 2 Coluna
L
i
n
g
u
a
g
e
m

C
72
Matrizes
;in!lude <stdio2"=
main()
{
int aS6TS5T# '# 9;
printf(>igite 4 0alores);
for('*3; '<6; '//)
for(9*3; 9<5; 9//)
s!anf(8d# @aS'TS9T);
}
L
i
n
g
u
a
g
e
m

C
73
nicializao de Matrizes

C permite a inicializao de matrizes no


momento da declarao. Ex:
int iS+3T * {+# 6# 5# -# )# 4# P# E# V#
+3};
int sWrs S)TS6T * {
+# +#
6# -#
5# V#
-# +4#
)# 6)
};
L
i
n
g
u
a
g
e
m

C
74
Matrizes No-Dimensionadas
C pode calcular automaticamente as dimenses de
uma matriz, usando matriz no-dimensionadas. Se,
na inicializao de uma matriz, seu tamanho for
omitido, o compilador C cria uma matriz grande o
bastante para conter todos os dados inicializadores
presentes.
int iST * {+# 6# 5# -# )# 4# P# E# V# +3};
int sWrs STS6T * {
+# +#
6# -#
5# V#
-# +4#
)# 6)
};
L
i
n
g
u
a
g
e
m

C
75
Exerccios
1. Leia uma matriz 5x5, imprima a soma dos
elementos da diagonal principal e a soma dos
elementos da diagonal secundria.
2. Leia duas matrizes A e B, do tipo 3x3, calcule
em uma matriz R sua multiplicao, ou seja, R =
A * B.
3. Leia uma matriz 5x5, calcule a sua transposta.
mprima as duas matrizes.
4. Faa um programa que ordene uma matriz de
5x5 em ordem decrescente, de maneira que o
maior valor se localize na posio [0][0] e o
menor na [4][4]. O programa deve escrever a
matriz original e a ordenada.
L
i
n
g
u
a
g
e
m

C
76
Ementa
ntroduo
Operadores e Expresses
Funes de E/S
Estruturas de Controle
Vetores e Matrizes
Strings
Ponteiros
Funes
Estruturas
Alocao Dinmica de Memria
Arquivos
L
i
n
g
u
a
g
e
m

C
77
Matrizes de char (strings)
Uma "string" definida como sendo constituda de
uma matriz de caracteres (tipo de dado char - 1 byte)
que terminada por um "nulo". Um nulo especificado
usando-se '\0' que zero.
Por exemplo, se quisermos declarar uma matriz "str"
que possa armazenar uma string de 10 caracteres,
escrevemos:
char str [11];
As funes de manipulao de string armazenam e
manipulam automaticamente o '\0'.
Uma constante string fica entre " " (aspas), ex:
printf("%s, "Curso C);

L
i
n
g
u
a
g
e
m

C
78
Strings
Leitura de uma string do teclado% A maneira mais
fcil de inserir uma string pelo teclado com a
funo de biblioteca gets10# A forma geral da funo
gets10 :
gets1nomebdabmatriI0S
;in!lude <stdio2"=
main()
{
!"ar str SE3T;
printf(Ainforme uma string1A);
gets(str); /*le a string do te!lado*/
printf(A8sA# str);
}
L
i
n
g
u
a
g
e
m

C
79
nicializao de Strings

nicializao de string dimensionada:


!"ar erroS+PT * erro de leituraBn;

nicializao de string no-dimensionada.


Deixa que o compilador crie uma matriz
grande o suficiente para conter a string:
!"ar erroST * erro de leituraBn;
L
i
n
g
u
a
g
e
m

C
80
Funes de Manipulao de String

As funes de manipulao de strings esto


declaradas no arquivo de cabealho "string.h.
'un+,o strcpc10% Copia o contedo da string "de" para a
string "para". Forma geral:
strcpc1para"de0S
;in!lude <stdio2"=
;in!lude<string2"=
main(){
!"ar str SE3T;
str!p9(str# A(loA);
printf(A8sA# str);
}
L
i
n
g
u
a
g
e
m

C
81
Funes de Manipulao de String
'un+,o strlen10% Retorna o tamanho de s.
strlen1s0S onde s uma string.
/* imprime o taman"o da string digitada
*/
;in!lude<stdio2"=
;in!lude<string2"=
main()
{
!"ar str SE3T;
printf(Adigite uma string1A);
gets(str);
printf(A8dA# strlen(str));
}
L
i
n
g
u
a
g
e
m

C
82
Funes de Manipulao de String
'un+,o strcmp10% Compara duas strings e retorna 0 se elas
forem iguais. Se s1 lexicograficamente maior (Exemplos:
"BBBB">"AAAA") que s2, ento um nmero positivo
retornado; se for menor que s2, um numero negativo
retornado.
strcmp1sQ"s^0S
;in!lude<stdio2"=
;in!lude <string2"=
main() {
!"ar sSE3T;
printf(Ainforme a sen"a1A);
gets(s);
if(str!mp(s# Asen"aA))
printf(Asen"a in0alidaBnA);
else printf(Asen"a !orretaBnA); }
L
i
n
g
u
a
g
e
m

C
83
Funes de Manipulao de String
'un+,o strcat10% Anexa (concatena) "s2" em " s1";
"s2" no modificada. As duas strings devem ser
terminadas com nulo e o resultado tambm ser
terminado com um nulo.
strcat1sQ"s^0S
;in!lude <stdio2"=
;in!lude <string2"=
main(){
!"ar s+S63T# s6S+)T;
str!p9(s+# A(loA);
str!p9(s6#A para todosA);
str!at(s+#s6);
printf(A8sA#s+); }
L
i
n
g
u
a
g
e
m

C
84
Exerccios
1. Escrever um programa que l duas strings e
informa o tamanho, a igualdade entre elas e no
final escrever as strings concatenadas.
2. Escrever um programa que l uma string e a
escreve em ordem inversa.
3. Escrever um programa que l uma string e
escreve quantos caracteres iguais a 'a' existem
na string.
4. Escrever um programa que l uma string e a
escreve em maisculo. Ver funo toupper.
5. Escrever um programa que l uma string s[30] e
escreve cada palavra desta string numa nova
linha
L
i
n
g
u
a
g
e
m

C
85
Ementa
ntroduo
Operadores e Expresses
Funes de E/S
Estruturas de Controle
Vetores e Matrizes
Strings
Ponteiros
Funes
Estruturas
Alocao Dinmica de Memria
Arquivos
L
i
n
g
u
a
g
e
m

C
86
Ponteiros
Um ponteiro uma varivel que contm um endereo
de memria. Esse endereo normalmente a posio
de uma outra varivel na memria.
Sintaxe: tipo GnomebponteiroS
tipo do ponteiro define que tipo de varivel o ponteiro
pode apontar.
Operadores de Ponteiros:
& Operador unrio que retorna o endereo na memria
do seu operando.
* Operador unrio que retorna o valor da varivel
localizada no endereo que o segue.

L
i
n
g
u
a
g
e
m

C
87
Exemplos
X
int 9# '*3# *p'# *p9;
p'*@'; "px aponta para x
9**p'; "y recebe contedo de x, ou seja, 0
p9*p'; "py tambm aponta para x
*p9*5; "varivel apontada por py, ou seja, x, recebe 3
X
float '*+32+# 9;
int *p;
p*@'; B6 erro 6B
9**p;
printf(8f#9);
X
int '# *p;
'*+3;
*p*'; B6 cuidado, ponteiro perdido 6B
B6 (cont8m li-o) 6B
L
i
n
g
u
a
g
e
m

C
88
Expresses com Ponteiros
Os ponteiros podem aparecer normalmente no lugar
das variveis.
O operador * tem maior precedncia que as
operaes matemticas.
Y * *p' / +; /* 9 re!ebe a soma de + ao
!onte?do de *p' */
9 * *(p'/+); /* 9 re!ebe o !onte?do do
endereo de p' / +
(pr'imo) */
Dois ponteiros, como outras variveis, podem ser
comparados.
if (p+**p6)22 /* 0erifi!a se p+ e p6 apontam
para a mesma 0ari70el */
L
i
n
g
u
a
g
e
m

C
89
ncremento e Decremento de Ponteiros
Os ponteiros no so necessariamente
incrementados e decrementados em uma
unidade, mas pelo tamanho do tipo apontado
pelo ponteiro.
Os operadores ++ e -- possuem precedncia
sobre o * e operadores matemticos.
Qual a diferena entre
p//; (*p)//; *(p//);
L
i
n
g
u
a
g
e
m

C
90
ncremento e Decremento de Ponteiros
p11; in!rementa o ponteiro# ou se$a# o
endereo(p passa a apontar para a
posio de memria imediatamente
superior)2
(6p)11; in!rementa o !onte?do apontado por p#
ou se$a# o 0alor arma%enado na
0ari70el para a Wual p est7
apontando2
6(p11); in!rementa p# !omo em p//# e a!essa o
0alor en!ontrado na no0a
posio2
L
i
n
g
u
a
g
e
m

C
91
Ponteiros e Matrizes
X
H um grande relacionamento entre ponteiros e
matrizes.
Verses com ponteiros so mais rpidas.
Os ponteiros possuem mais facilidades de
manipulao.
Ao contrrio das matrizes, os ponteiros podem
ser incrementados e decrementados
diretamente.
L
i
n
g
u
a
g
e
m

C
92
Exemplo

Lendo um vetor com ponteiro:


main()
{
int aS)T*{3#+#6#5#-}# *p# ';
p*@aS3T; /* mesmo Wue p*a */
'**(p/6); /* ' re!ebe aS6T */
printf(8d# ');
}
L
i
n
g
u
a
g
e
m

C
93
Exemplo

Construindo um vetor com ponteiro:


main(){
int 0etS+3T# *p# i;
p*0et;
for (i*3#i<+3;i//) {
*p*i;
p//;
}
p*0et;
for (i*3#i<+3;i//)
printf(8d# *p//);
}
L
i
n
g
u
a
g
e
m

C
94
Exemplo

Ponteiro com string:


main(){
!"ar strSE3T# *p;
printf (>igite string em letras
mai?s!ulas1 );
gets(str);
printf (His a string em letras
min?s!ulas1 );
p*str; /* p aponta para o primeiro
elemento de str */
R"ile (*p) printf(8!# toloRer(*p//));
}
L
i
n
g
u
a
g
e
m

C
95
Exemplo

Matrizes de Ponteiros:
main(){
!"ar *erroS6T*{arWui0o ine'istenteBn#
erro na leituraBn};
printf (8s# erroS3T);
printf (8s# erroS+T);
}
L
i
n
g
u
a
g
e
m

C
96
Exerccios
1. Usando ponteiros, faa um programa que
imprima uma string invertida.
2. Usando ponteiros, faa um programa que
preencha uma matriz 10x10 de inteiros
com os nmeros de 1 a 100.
3. Usando ponteiros, faa um programa que
leia duas strings e as concatene numa
terceira string.
L
i
n
g
u
a
g
e
m

C
97
Teste
1. Leia 10 strings para uma matriz de string. Ordene e
imprima as strings em ordem alfabtica.
2. Na teoria de sistemas define-se como elemento
minimax de uma matriz o menor elemento da linha
em que se encontra o maior elemento da matriz.
Escreva um programa que leia uma matriz 4 x 4 e
determine e imprima o seu elemento minimax.
3. Escreva um programa que converta um numero em
notao romana para notao decimal. Considere
nmeros menores que 1000.
L
i
n
g
u
a
g
e
m

C
98
Ementa
ntroduo
Operadores e Expresses
Funes de E/S
Estruturas de Controle
Vetores e Matrizes
Strings
Ponteiros
Funes
Estruturas
Alocao Dinmica de Memria
Arquivos
L
i
n
g
u
a
g
e
m

C
99
Funes
uma sub-rotina que realiza uma tarefa especfica.
Um programa em C uma coleo de funes.
Forma geral de uma funo:
tipo_retorno nome(lista_parmetros)
{
// corpo da funo
}
tipo_retorno especifica o tipo de dado retornado pela
funo. Pode ser qualquer tipo vlido exceto um array.
nome especifica o nome da funo.
lista_parmetros uma seqncia de pares de tipo e
identificador separados por vrgulas. So as variveis que
recebem o valor dos argumentos passados para a funo
quando chamada.
L
i
n
g
u
a
g
e
m

C
100
Funo sem parmetro
// Hste programa !ontCm duas funZes1 main() e
min"afun!()
0oid min"afun!(); // prottipo de min"afun!()
// Go "7 par[metros formais
int main(){
printf(Hm main() Bn);
min"afun!(); // !"ame min"afun!()
printf(>e 0olta a main());
}
// Hsta C a definio da funo2
0oid min"afun!(){
printf(>e dentro de min"afun!()Bn);
}
?m main()
De dentro de minaCfunc()
De volta a main()
L
i
n
g
u
a
g
e
m

C
101
Funo com parmetro
0oid bo'(int lengt"# int Ridt"# int "eig"t);
// prottipo de bo'() !om 5 par[metros formais
int main(){
bo'(P# 63# -); // passa argumentos para bo'
bo'(6E# 53# 6));
bo'(5# )# -);
}
// Iomputa o 0olume da !ai'a2
0oid bo'(int lengt"# int Ridt"# int "eig"t){
printf(Folume da !ai'a e 8d# lengt"*Ridt"
*"eig"t);
} // Ls par[metros re!ebem os 0alores dos
argumentos passados para bo'()2
L
i
n
g
u
a
g
e
m

C
102
O retorno de valores
Uma funo pode retornar um valor para seu
chamador.
Para retornar um valor usamos return vaor.
O tipo do valor retornado deve ser compatvel
com o tipo de retorno declarado na funo. Se
no for, um erro em tempo de compilao
ocorrer.
L
i
n
g
u
a
g
e
m

C
103
Funo com retorno
int bo'(int lengt"# int Ridt"# int
"eig"t); // bo'() agora retorna um
inteiro
int main(){
int 0olume;
0olume*bo'(P# 63# -); // o 0alor de retorno
de bo'() C atribu\do a 0olume2
printf(L Folume da !ai'a e 8d# 0olume);
}
// Iomputa o 0olume da !ai'a2
int bo'(int lengt"# int Ridt"# int "eig"t){
return lengt"*Ridt"*"ieg"t;
} // bo'() retorna o 0olume da !ai'a para
main()
D ;olume da cai-a e 320
L
i
n
g
u
a
g
e
m

C
104
Regras de Escopo
X
Existem trs tipos de variveis: variveis locais,
parmetros formais e variveis globais.
As regras de escopo regem a visibilidade e o
tempo de vida de cada um desses tipos.
Variveis Locais

Declaradas dentro de uma funo ou


dentro de um bloco de cdigo.

Conhecidas apenas dentro do bloco no


qual esto declaradas.

So criadas na entrada do bloco e


destrudas na sada.
L
i
n
g
u
a
g
e
m

C
105
Variveis Locais
0oid fun!+() {
int '; //' C lo!al para fun!+()
'*+3;
printf(' * 8d#');
}
0oid fun!6(){
int '*V; //' C lo!al para fun!6()2
if ('**V){
int 9*63; //9 C lo!al ao blo!o if
printf(' / 9 * 8d# '/9);
}
9*+33; //erro. Y no C !on"e!ido aWui2
}
L
i
n
g
u
a
g
e
m

C
106
Parmetros Formais
X
Parmetros Formais
So as variveis que recebem os argumentos
de uma funo.
Dentro de uma funo, elas se comportam
como qualquer outra varivel local.
Os parmetros formais declarados devem ser
do mesmo tipo dos argumentos usados para
chamar a funo.
L
i
n
g
u
a
g
e
m

C
107
Parmetros Formais
;in!lude <stdio2"= /* de!larao do arWui0o de !abeal"o*/
int mul0ar(int# int); /* de!larao do prottipo mul0ar */
int mul0ar(int -, int E) /* de!larao da funo mul0ar */
{
int %;
% * ' * 9;
return(%);
}
0oid main(0oid) /* de!larao da funo main()

{
int a, #, mul;
printf(A>igite 6 0alores1BnA);
s!anf(A8d 8dA# @a# @b);
mul * mul0ar( a, #); /* !"amada da funo mul0ar*/
printf(ABn 8d A# mul);
}
]ar[metros formais
da funo
(rgumentos da funo# de0em ser
do mesmo tipo do par[metro formal
L
i
n
g
u
a
g
e
m

C
108
Variveis Globais
Variveis Gloais
Estas variveis so declaradas fora das funes, ou
seja, logo aps as declaraes #include.
So conhecidas por todo o programa e podem ser
usadas por qualquer parte do cdigo.
Variveis globais retm seus valores durante toda a
execuo do programa.
L
i
n
g
u
a
g
e
m

C
109
Variveis Globais
;in!lude <stdio2"=
0oid fun!+();
int !ount; // count C global
int main() {
int i; // i C lo!al
for (i*3;i<+3;i//) {
!ount * i*6;
fun!+();
}
return 3;
}
0oid fun!+() {
printf(!ount1 8dBn# !ount); //a!essa count global
}
L
i
n
g
u
a
g
e
m

C
110
Exerccios
1. Escreva e teste a seguinte funo mdia(), que retorna a
mdia dos trs nmeros:
float media(float x1, float x2, float x3)
1. Escreva e teste a seguinte funo power(), que retorna x
elevado a potncia de n, onde n pode ser qualquer inteiro:
double power(double x, int n)
Utilize o algoritmo que calcularia x
20
multiplicando 1 por x 20
vezes.
3. Escreva e teste a seguinte funo isSquare(), que
determina se o inteiro dado um nmero quadrado: int
isSquare(int n). Retorna 1 se for nmero quadrado e 0 caso
contrrio.
Os primeiros 10 nmeros quadrados so: 0, 1, 4, 9, 16, 25, 36,
49, 64 e 81
L
i
n
g
u
a
g
e
m

C
111
Passagem de ponteiros para funes
;in!lude <stdio2"=
0oid f(int *$); // f adota um ponteiro int* !omo par[metro
int main() {
int i*3# *p;
p*@i;
f(p); // passa o ponteiro
// ou f(@i) passa o endereo de i
printf( i * 8d# i);
return 3;
}
// f re!ebe um ponteiro para um int
0oid f(int *$) {
*$*+33; // 0ar apontado por $ re!ebe +33
}
L
i
n
g
u
a
g
e
m

C
112
Passagem de um array

Quando um array um argumento para


uma funo, o endereo do array
passado, e no uma cpia de todo o array.

Um nome de array sem qualquer ndice


um ponteiro para o primeiro elemento no
array.

L
i
n
g
u
a
g
e
m

C
113
Passagem de um array
;in!lude <stdio2"=
0oid mostra(int numS+3T);
int main() {
int tS+3T# i;
for (i*3; i<+3 ;i//) tSiT*i;
mostra (t); // passa o arra9 t para uma funo
return 3;
}
// ]ar[metro C um arra9 dimensionado
0oid mostra(int numS+3T) {
int i;
for (i*3; i<+3 ;i//) printf(8d #numSiT);
}
L^_1 L Iompilador I automati!amente !on0erter7 o
par[metro num para um ponteiro int# $7 Wue nen"um
par[metro pode re!eber um arra9 inteiro2 (penas o
endereo do arra9 C passado2
L
i
n
g
u
a
g
e
m

C
114
Passagem de um array
Lutras possibilidades de passar um ponteiro de
arra91
X
]ar[metro C um arra9 no dimensionado
0oid mostra(int numS T) {
int i;
for (i*3; i<+3 ;i//) printf(8d #numSiT);
}
X
]ar[metro de!larado !omo ponteiro
0oid mostra(int *num) {
int i;
for (i*3; i<+3 ;i//) printf(8d #numSiT);
}
// um ponteiro pode ser inde'ado usando ST# !omo
se // fosse um arra9
L
i
n
g
u
a
g
e
m

C
115
Passagem de strings

Como uma string simplesmente um array


de caracteres que terminado por caractere
nulo, quando passamos uma string para
uma funo, apenas um ponteiro para o
incio da string na realidade passado.
L
i
n
g
u
a
g
e
m

C
116
Passagem de strings
0oid strDn0ertIase(!"ar *str);
int main() {
!"ar strSE3T;
str!p9(str# Dsto H Mm Keste);
strDn0ertIase(str); //passa ponteiro para str
puts(str);
return 3;
}
0oid strDn0ertIase(!"ar *str){
R"ile(*str) {
if (isupper(*str)) *str*toloRer(*str);
else if (isloRer(*str)) *str*toupper(*str);
str//;
}}
L
i
n
g
u
a
g
e
m

C
117
Exerccios
1. Escreva e teste a funo strlen()
2. Escreva e teste a seguinte funo:
void add(float a[], int n, float b[]);
A funo adiciona os primeiros n elementos de b aos n
primeiros elementos de a. Por exemplo, se a for
{2.2,3.3,4.4,5.5,6.6,7.7,8.8,8.9} e b for
{6.0,5.0,4.0,3.0,2.0,1.0}, a chamada add(a, 5, b)
transformaria a em {8.2, 8.3, 8.4, 8.5, 8.6, 7.7, 8.8, 8.9}.
3. Escreva e teste a seguinte funo, que remove um item
de um array:
void remove(float a[], int &n, int i);
A funo remove a[i] mudando para baixo todos os
elementos acima dessa posio e decrementando n.
L
i
n
g
u
a
g
e
m

C
118
A funo main()
Podemos passar informaes para um programa ao
rod-lo. sto possvel passando argumentos de
linha de comando para a funo main().
C define dois parmetros embutidos, mas opcionais
para main(). Eles so argc e argv.
argc um nmero inteiro que contm o nmero de
argumentos na linha de comandos. Ele sempre ser
pelo menos 1, porque o nome do programa se
qualifica como primeiro argumento.
argv um ponteiro para um array de ponteiros de
caracteres. Cada ponteiro no array argv aponta para
uma string contendo um argumento de linha de
comando.
L
i
n
g
u
a
g
e
m

C
119
A funo main()

O nome do programa apontado por


argvBR]; argvBQ] apontar para o primeiro
argumento, argvB^] para o segundo
argumento e assim por diante.

argv declarado da seguinte forma:


!"ar *arg0ST;
L
i
n
g
u
a
g
e
m

C
120
argc e argv
Esse programa exibe os argumentos da linha de
comando:
int main(int arg!# !"ar *arg0ST) {
for (int i*3; i<arg!; i//)
puts(arg0SiT);
return 3;
}
_e o programa for !"amado de Iom`ine# ento
e'e!ut7:lo da forma1 Iomline um dois tres#
ter\amos a seguinte sa\da1
Iomline
um
dois
tres
L
i
n
g
u
a
g
e
m

C
121
Exerccios
1. Escreva e teste a seguinte funo que retorna o
ndice do menor valor de um array dado:
int minndex(float a[ ])
1. Escreva e teste a seguinte funo que retorna o
valor mnimo entre os primeiros n elementos de um
array dado:
float min(float a[ ], int n)
1. Escreva a funo strcpy().
2. Escreva um programa que exiba a soma dos dois
argumentos numricos de linha de comando.
L
i
n
g
u
a
g
e
m

C
122
Ementa
ntroduo
Operadores e Expresses
Funes de E/S
Estruturas de Controle
Vetores e Matrizes
Strings
Ponteiros
Funes
Estruturas
Alocao Dinmica de Memria
Arquivos
L
i
n
g
u
a
g
e
m

C
123
Estruturas

Uma estrutura uma coleo de variveis


referenciadas pelo mesmo nome.

As variveis que formam a estrutura so


chamadas de membros ou campos da
estrutura.

A palavra reservada struct informa ao


compilador a definio de uma estrutura.
L
i
n
g
u
a
g
e
m

C
124
Estruturas
Exemplo de estrutura:
stru!t pessoal {
!"ar nomeS53T;
!"ar endere!oSE3T;
int idade;
float salario;
};
Para declarar uma varivel com essa estrutura:
stru!t pessoal fun!ionario;
L
i
n
g
u
a
g
e
m

C
125
Estruturas
Referncia aos elementos da estrutura: operador ponto
(.)
gets(fun!ionario2nome);
fun!ionario2idade*63;
printf( 8f# fun!ionario2salario);
puts(fun!ionario2endere!o);
L
i
n
g
u
a
g
e
m

C
126
Matrizes de Estruturas
Para declarar uma matriz de estruturas do tipo
pessoal de 100 elementos:
stru!t pessoal fun!ionarioS+33T;
Para acessar uma estrutura especfica,
indexamos o nome da estrutura. Por exemplo,
para imprimir o campo nome da estrutura 3:
gets(fun!ionarioS5T2nome);
L
i
n
g
u
a
g
e
m

C
127
Exerccio
1. Escreva um programa simples que
gerencie um cadastro com registros com
os campos NOME, SEXO,
COR_DE_OLHOS, DADE, ALTURA e
PESO. Escreva as funes nserir, Exibir e
Excluir um registro da matriz. Obtenha a
seleo das funes atravs de um menu.
Sugesto: assuma que uma estrutura no est em uso se
o campo NOME estiver vazio.
L
i
n
g
u
a
g
e
m

C
128
Unies
X
Uma unio uma localizao de memria
usada por muitas variveis diferentes, que podem
ser de tipos diferentes. A definio de uma unio
parecida com aquela de uma estrutura:
union ut9pe {
int i;
!"ar !";
};
X
Para declarar uma varivel do tipo u_type:
union ut9pe !0nt;
L
i
n
g
u
a
g
e
m

C
129
Unies

Em cntv, tanto o inteiro i como o


caractere c5 compartilham da mesma
localizao de memria. No entanto i
ocupa dois bytes e ch apenas um.

Para acessar um elemento de uma


union:
!0nt2i*+;
L
i
n
g
u
a
g
e
m

C
130
Exemplo de Unio
main(0oid){
union ut9pe {
int i;
!"ar !"S6T;
};
union ut9pe !0nt;
!0nt2i*+333;
printf (Auniao u !omo int1 8dBnA# !0nt2i);
printf (Auniao u !omo !"ar1 8! 8!BnA#
!0nt2!"S3T#!0nt2!"S+T);
get!"();
}
L
i
n
g
u
a
g
e
m

C
131
typedef
C permite a definio de novos nomes de tipos de
dados com a palavra-chave tcpede.
A forma geral da instruo tcpede :
t9pedef tipo nome;
Por exemplo, podemos criar um novo nome para
float usando:
t9pedef float balan!e;
Essa instruo diria ao compilador para reconhecer
balance, como um novo nome pra float. Assim,
poderamos criar uma varivel float usando:
balan!e 0!ontabil;
L
i
n
g
u
a
g
e
m

C
132
Enumeraes
Enumerao um conjunto de constantes inteiras
com nome e especifica todos os valores legais que
uma varivel daquele tipo pode ter.
Forma geral:
enum nomedotipoenum {lista de 0eri70eis}
lista 0ari70el;
Exemplo:
enum transporte {!arro# a0iao# trem#
na0io};
Declarao de varivel enum:
enum transporte tr+;
L
i
n
g
u
a
g
e
m

C
133
Enumeraes

Cada um dos smbolos da enumerao


representa um valor inteiro. Como tal, eles
podem ser usados em qualquer expresso
de nmeros inteiros. A menos que
inicializado de outra forma, o valor do
primeiro smbolo da enumerao 0, o
valor do segundo 1 e assim por diante.
tr+*na0io;
if (tr+**!arro) printf( 0ou de
!arro);
printf(8d# a0iao);
L
i
n
g
u
a
g
e
m

C
134
Ementa
ntroduo
Operadores e Expresses
Funes de E/S
Estruturas de Controle
Vetores e Matrizes
Strings
Ponteiros
Funes
Estruturas
Alocao Dinmica de Memria
Arquivos
L
i
n
g
u
a
g
e
m

C
135
Alocao Dinmica de Memria
Um programa em C usa uma das duas maneiras
principais de se armazenar informaes na memria
principal do computador.
A primeira maneira usa variveis globais e locais.
Variveis globais tm seu armazenamento fixo
durante todo o tempo de execuo do programa.
Variveis locais so armazenadas na pilha do
programa. Entretanto essa maneira requer que o
programador saiba, com antecedncia, o montante de
armazenamento necessrio para cada situao.
A segunda maneira atravs de aloca+,o dindmica
da rea de memria livre (heap) do programa.
As funes malloc10 e ree10 formam o sistema de
alocao dinmica de C.
L
i
n
g
u
a
g
e
m

C
136
malloc()
void *malloc(unsigned size)
Retorna um ponteiro 0oid para o primeiro
byte de uma regio da memria de tamanho
si!e da rea de alocao dinmica. O
ponteiro 0oid dever ser atribudo a um
ponteiro do tipo desejado (usar cast explcito).
Se no houver memria suficiente para
satisfazer o pedido, malloc10 retornar um
ponteiro NULL.
L
i
n
g
u
a
g
e
m

C
137
free()

free (void *p)


O oposto de malloc(), ree10 devolve ao
sistema a memria previamente alocada.
ree10 nunca deve ser chamada com um
argumento invlido, porque isto far com
que o computador destrua a lista livre.
L
i
n
g
u
a
g
e
m

C
138
Exemplo
main() { */ (lo!a memria para )3 inteiros /*
int *p# t;
p*(int *)mallo!()3*si%eof(int));
if (.p) printf(Uemria Dnsufi!iente.);
else {
for (t*3; t<)3; t//) *(p/t)*t;
for (t*3; t<)3; t//) printf(8d# *(p/t));
free(p)
}
}
L
i
n
g
u
a
g
e
m

C
139
Exerccio
1. Escreva um programa que aloque espao para
cinco strings inseridas pelo usurio.
2. Escreva uma funo getstruct() que aloque
memria para uma estrutura addr e retorne o
ponteiro para a memria alocada:
stru!t addr {
!"ar nomeS-3T;
!"ar ruaS-3T;
!"ar !idadeS53T;
!"ar esradoS5T;
!"ar !epS+3T;
};
L
i
n
g
u
a
g
e
m

C
140
Ementa
ntroduo
Operadores e Expresses
Funes de E/S
Estruturas de Controle
Vetores e Matrizes
Strings
Ponteiros
Funes
Estruturas
Alocao Dinmica de Memria
Arquivos
L
i
n
g
u
a
g
e
m

C
141
Arquivos
!onteiro de "r#$ivo
Para ler ou escrever em um arquivo de disco, o
programa deve declarar uma varivel ponteiro de
arquivo#
Um ponteiro de arquivo um ponteiro para uma
rea na memria(buer) onde esto contidos vrios
dados sobre o arquivo a ler ou escrever, tais como o
nome do arquivo, estado e posio corrente
Este buffer intermedirio entre arquivo e programa
chamado elu.of ou fstreamg" e uma entidade lgica
genrica, que pode estar associada a uma unidade
de fita magntica, um disco, uma porta serial, etc.
L
i
n
g
u
a
g
e
m

C
142
Arquivos
!onteiro de "r#$ivo
Para obter uma varivel ponteiro de arquivo :
'$LE GpS
onde fp o ponteiro de arquivo.
"rindo $% "r#$ivo:
A funo open10 abre um fluxo e liga um arquivo a esse fluxo.
Retorna o ponteiro de arquivo associado ao fluxoem questo.
'$LE Gopen1c5ar Gnomebdebarquivo" c5ar Gmodo0S
onde modo uma string contendo o estado desejado para
abertura.
O nome do arquivo deve ser uma string de caracteres que
compreende um nome de arquivo vlido incluindo uma
especificao de caminho (PATH).
L
i
n
g
u
a
g
e
m

C
143
Modos de Abertura
<odo Signiicado
"r" Abre um arquivo-texto para leitura
"w" Cria um arquivo-texto para escrita
"a" Acrescenta dados para um arquivo-texto existente
"rb" Abre um arquivo binrio para leitura
"wb" Cria um arquivo binrio para escrita
"ab" Acrescenta dados a um arquivo binrio existente
"r+" Abre um arquivo-texto para leitura/escrita
"w+" Cria um arquivo-texto para leitura/escrita
"a+" Acrescenta dados ou cria um arquivo-texto para
leitura/escrita
"r+b" Abre um arquivo binrio para leitura/escrita
"w+b" Cria um arquivo binrio para leitura/escrita
"a+b" Acrescenta ou cria um arquivo binrio para leitura/escrita
L
i
n
g
u
a
g
e
m

C
144
Abertura de Arquivo
Um arquivo pode ser aberto ou em modo
te.to ou em modo binrio#
No modo te.to, as seqncias de retorno de
carro e alimentao de formulrios so
transformadas em seqncias de novas linhas
na entrada. Na sada, ocorre o inverso: novas
linhas so transformadas em retorno de carro e
alimentao de formulrio. Tais transformaes
no acontecem em um arquivo binrio.
L
i
n
g
u
a
g
e
m

C
145
Abertura de Arquivo

Se um erro ocorre quando se est abrindo


um arquivo, open10 retorna um nulo
(NULL).

Por exemplo: tentar abrir um arquivo


inexistente para leitura, escrever em um
arquivo protegido contra gravao, ou
ainda criar um arquivo se o disco estiver
cheio, um erro ocorrer e fopen() retornar
NULL.
L
i
n
g
u
a
g
e
m

C
146
Abertura de Arquivo
H'emplo1
aD`H *ofp;
ofp * fopen (AtestA# ARA);
Hntretanto# para !"e!agem de erros es!re0emos assim1
aD`H *ofp;
if((ofp*fopen(AtestA#ARA))**GM``)
{
puts(Ano posso abrir o arWui0oBnA);
e'it(+); //Hrro.. Kermina programa
}
Obs: Abrindo um arquivo no modo "w, qualquer arquivo preexistente
com o mesmo nome ser apagado e o novo arquivo iniciado.
L
i
n
g
u
a
g
e
m

C
147
Escrita em Arquivo
&screvendo $% caractere:

A funo putc10 usada para


escrever caracteres para um fluxo
que foi previamente aberto para
escrita pela funo fopen(). A funo
declarada como:
int put!(int !"# aD`H *fp);
onde p o ponteiro de arquivo
retornado pela funo fopen() e, c5
o caractere a ser escrito.
L
i
n
g
u
a
g
e
m

C
148
Leitura em Arquivo
'endo $% caractere:
A funo getc10 usada para ler caracteres do fluxo
aberto em modo de leitura pela funo fopen(). A funo
declarada como:
int get!(aD`H *fp)
onde p um ponteiro de arquivo do tipo FLE
retornado pela funo fopen().
A funo getc() retornar uma marca EOF quando o fim
do arquivo tiver sido encontrado ou um erro tiver ocorrido.
Exemplo:
!"*get!(fp);
R"ile(!".*HLa){
!"*get!(fp);
}
L
i
n
g
u
a
g
e
m

C
149
Fechamento de Arquivo

A funo close10 fecha um fluxo que foi


aberto por uma chamada funo
fopen(). Ela escreve quaisquer dados
restantes na rea intermediria (fluxo) no
arquivo e faz um fechamento formal em
nvel de sistema operacional do arquivo.

A funo close10 declarada como:


int f!lose(aD`H*fp);

onde p o ponteiro do arquivo retornado


pela chamada funo fopen().

L
i
n
g
u
a
g
e
m

C
150
Exemplo escrita
/* bra0a em dis!o dados digitados no te!lado atC te!lar c */
;in!lude <stdio2"=
;in!lude <stdlib2"=
main() {
aD`H *fp;
!"ar !";
if((fp*fopen(Ateste2t'tA#ARA))**GM``) {
puts(AL arWui0o no pode ser aberto.A);
e'it(+);
}
do { /* get!"e() no fun!ionaria aWui */
!"*get!"ar();
if(HLa**put!(!"# fp)) {
puts(AHrro ao es!re0er no arWui0o.A);
brea&;
}
} R"ile (!".*dcd);
f!lose(fp);
return 3; /* !digo de retorno de final Le p/ o >L_2 */
}
L
i
n
g
u
a
g
e
m

C
151
Exemplo leitura
/*L arquivos e exibe-os na tela.*/
#include <stdio.h>
#include <stdlib.h>
main() {
FLE *fp;
char ch;
if((fp=fopen("teste.txt","r"))==NULL) {
puts("O arquivo no pode ser aberto!");
exit(1);
}
ch= getc(fp); /* l um caractere */
while(ch!=EOF)
{
putchar(ch); /* imprime na tela */
ch=getc(fp);
}
return 0;
}
L
i
n
g
u
a
g
e
m

C
152
ferror()
ferror():
A funo error10 usada para determinar se uma
operao em um arquivo produziu um erro. Se um
arquivo aberto em modo texto e ocorre um erro na
leitura ou na escrita, retornado E('. Voc usa a
funo ferror() para determinar o que aconteceu. A funo
ferror() tem o seguinte prottipo:
int ferror(aD`H*fp);
onde p um ponteiro vlido para um arquivo. error10
retorna verdadeiro se um erro ocorreu durante a ltima
operao com o arquivo, e falso, caso contrrio. Uma vez
que cada operao em arquivo determina uma condio de
erro, a funo ferror() deve ser chamada imediatamente
aps cada operao com o arquivo; caso contrrio, um
erro pode ser perdido.
L
i
n
g
u
a
g
e
m

C
153
rewind()
re(ind():

A funo re]ind10 recolocar o localizador


de posio do arquivo no incio do arquivo
especificado como seu argumento, ou seja,
re]ind10 "rebobina o arquivo. O seu
prottipo :
0oid reRind(aD`H*fp);

onde p um ponteiro de arquivo.


L
i
n
g
u
a
g
e
m

C
154
getw() e putw()
get(() e p$t(():

Funcionam exatamente como putc() e getc()


s que em vez de ler ou escrever um nico
caractere, lem ou escrevem um inteiro.

Prottipos:
int putR(int i# aD`H *fp);
int getR(aD`H *fp);

Header: stdio.h

Exemplo: putw(100,saida); //escreve o


inteiro 100 no arquivo apontado por saida.
L
i
n
g
u
a
g
e
m

C
155
fgets() e fputs()
fgets() e fp$ts():
Funcionam como gets() e puts() s que lem e
escrevem em fluxos.
Prottipos:
!"ar *fputs(!"ar *str# aD`H *fp);
!"ar *fgets(!"ar *str# int taman"o# aD`H
*fp);
Header: stdio.h
(bserva+,o: fgets() l uma string de um fluxo
especificado at que um newline seja lido OU
tamanho-1 caracteres tenham sido lidos. Se um
newline lido, ele far parte da string (diferente de
gets()). A string resultante termina com um nulo.
L
i
n
g
u
a
g
e
m

C
156
fgets() e fputs()
/* bra0a strings em dis!o atC digitar IJ# rebobina e lf */
;in!lude <stdio2"=
;in!lude <stdlib2"=
main() {
aD`H *arW;
!"ar strSE3T;
if((arW*fopen(Ateste2t'tA#AR/A))**GM``) {
puts(AL arWui0o no pode ser aberto.A);
e'it(+); }
do {
printf(>igite string (IJ para terminar)1);
gets(str);
str!at(str#Bn); /* a!res!enta neRline */
fputs(str#arW);
} R"ile(*str.*gBnO);
reRind(arW); /* rebobina arW */
R"ile(.feof(arW)){
fgets(str#PV#arW);
printf(str);
} f!lose(arW);
return 3;
}
L
i
n
g
u
a
g
e
m

C
157
fread() e fwrite():
Lem e escrevem blocos de dados em fluxos.
Prottipos:
unsigned fread(0oid *buffer# int
numb9tes# int !ount# aD`H *fp);
unsigned fRrite(0oid *buffer# int
numb9tes# int !ount# aD`H *fp);
No caso de read10, buffer um ponteiro para uma
rea da memria que receber os dados lidos do
arquivo.
No caso de ]rite10, buffer um ponteiro para uma
rea da memria onde se encontram os dados a
serem escritos no arquivo.
L
i
n
g
u
a
g
e
m

C
158
fread() e fwrite():
O n?mero de bctes a ser lido ou escrito
especificado por num_bytes.
O argumento count determina quantos itens (cada
um tendo num_bytes de tamanho) sero lidos ou
escritos.
O argumento p um ponteiro para um arquivo de
um fluxo previamente aberto por fopen().
A funo read10 retorna o nmero de itens lidos, que
pode ser menor que count caso o final de arquivo
(EOF) seja encontrado ou ocorra um erro.
A funo ]rite10 retorna o nmero de itens escritos,
que ser igual a count exceto na ocorrncia de um
erro de escrita.
L
i
n
g
u
a
g
e
m

C
159
Escrita de estrutura em arquivo
main() {
struct {
char titulo[30];
int regnum;
double preco;
} livro;
char numstr[81];
FLE *fp;
if((fp=fopen("livro.dat,wb))==NULL) {
puts("No posso abrir arquivo!");
exit(1); }
printf("\n Digite o titulo: ");
gets(livro.titulo);
printf("\n Digite o registro: ");
gets(numstr);
livro.regnum = atoi(numstr);
printf("\n Digite o preco: ");
gets(numstr);
livro.preco = atof(numstr);
fwrite(&livro,sizeof(livro),1,fp);
fclose(fp);
}
L
i
n
g
u
a
g
e
m

C
160
Leitura de estrutura em arquivo
main() {
struct {
char titulo[30];
int regnum;
double preco;
} livro;
FLE *fp;
if((fp=fopen("livro.dat,rb))==NULL) {
puts("No posso abrir arquivo!");
exit(1); }
if(fread(&livro,sizeof(livro),1,fp)==1) {
printf("\n Titulo: %s \n", livro.titulo);
printf("\n Registro: %03d \n",livro.regnum);
printf("\n Preco: %.2f \n",livro.preco);
} fclose(fp);
}
L
i
n
g
u
a
g
e
m

C
161
Acesso randVmico a arquivos
fsee)():
A funo see&10 indica o localizador de posio do arquivo.
Prottipo:
int fsee&(aD`H *fp# long numb9tes# int
origem);
fp um ponteiro para o arquivo retornado por uma chamada
fopen().
numbytes (long int) o nmero de bytes a partir da origem at a
posio corrente.
origem uma das seguintes macros definidas em stdio.h:

(rigem >ome da <acro 6alor num@rico
comeo do arquivo SEEK_SET 0
posio corrente SEEK_CUR 1
fim do arquivo SEEK_END 2
Para procurar numbytes do comeo do arquivo, origem deve ser SEEK_SET.
Para procurar da posio corrente em diante, origem SEEK_CUR. Para
procurar numbytes do final do arquivo de trs para diante, origem
SEEK_END.
L
i
n
g
u
a
g
e
m

C
162
Acesso randVmico a arquivos
O seguinte cdigo l o 235 byte do arquivo
chamado test:
aD`H *fp;
!"ar !";
if((fp*fopen(AtesteA#ArbA))**GM``){
puts(AGo posso abrir arWui0o.A);
e'it(+); }
fsee&(fp#65-#_HHe_HK);
!"*get!(fp); /* lf um !ara!tere na
posio 65)h */
A funo see&10 retorna zero se houve sucesso ou
um valor no-zero se houve falha no posicionamento
do localizador de posio do arquivo.
L
i
n
g
u
a
g
e
m

C
163
Outras funes de arquivos

"pagando ar#$ivos: re%ove()


int remo0e(!"ar *nomearWui0o);
Retorna zero em caso de sucesso e no
zero se falhar.

&sva*iando $% fl$+o: ffl$s,()


int fflus"(aD`H *fp);
Escreve o contedo de qualquer dado
existente no fluxo para o arquivo associado
a fp.
Retorna zero em caso de sucesso e EOF se
falhar.
L
i
n
g
u
a
g
e
m

C
164
Exerccios
1. Faa um programa que receba dois
arquivos pela linha de comandos e
verifique se seus contedos so
exatamente iguais.
2. Escreva um programa que una dois
arquivos de texto. Leia os arquivos na linha
de comandos assim como o arquivo de
sada.
3. Escreva um programa que insira, consulte,
liste e exclua itens (estruturas) mantendo
as informaes em arquivo.
L
i
n
g
u
a
g
e
m

C
165
Teste
1. Gerar o arquivo clientes contendo
registros com os campos conta, nome e
saldo de clientes de um banco.
2. Gerar o arquivo entradas contendo os
campos conta, operao e valor, referentes
s movimentaes do dia dos clientes.
Operao pode ser depsito ou retirada.
3. Atualizar no fim do dia o arquivo clientes.