Você está na página 1de 62

Introduo linguagem C

Rodolfo Riyoei Goya




1. Introduo programao em linguagem C

1.1. Caractersticas da linguagem C

A linguagem C foi criada em 1972 por Dennis Ritchie nos laboratrios da Bell.
Desde ento e em muito pouco tempo, tornou-se uma das linguagens mais populares do
mundo entre programadores profissionais.

A razo dessa popularidade que a linguagem C foi concebida por
programadores para ser uma ferramenta til para programadores e proporcionar as
convenincias de uma linguagem de alto nvel, mas, ao mesmo tempo, um controle
muito prximo do hardware e perifricos.

A linguagem C foi concebida para ser a ferramenta de desenvolvimento do
sistema operacional UNIX, este mesmo concebido para ser um sistema facilmente
transportvel para qualquer plataforma de hardware. Deste modo, em todas as
plataformas onde o UNIX possa ser encontrado se encontra uma verso do compilador
C.

Esta caracterstica de portabilidade peculiar da linguagem C. A linguagem
especificada de tal modo que requer um mnimo de ajustes para ser executada em
qualquer mquina, seja um microcontrolador, microcomputador pessoal, mainframe ou
supercomputador.

As implementaes atualmente existentes de compiladores de linguagem C
produzem cdigo de tal eficincia em espao e velocidade que chegam a rivalizar
programas codificados diretamente em linguagem assembly (linguagem de mquina
nativa do computador).

Todas estas razes tornam a linguagem C to popular que a maioria dos
programas comerciais atualmente desenvolvidos (incluindo sistemas operacionais,
compiladores e interpretadores para outras linguagens) implementada em linguagem
C. Assim, sua popularidade tornou-a a linguagem comum para divulgao e
comunicaes em revistas especializadas.


Introduo linguagemC
Rodolfo Riyoei Goya
2 de 62
1.2. Arquivos usados no desenvolvimento de um programa em C

A linguagem C uma linguagem compilada. Isto quer dizer que para executar
um programa escrito em linguagem C (programa-fonte), deve-se primeiro traduzi-lo
(essa tarefa executada pelo compilador) para a linguagem nativa do computador para
que possa ser posteriormente executado. Uma vez obtido o programa compilado
(programa executvel), este pode voltar a ser executado quantas vezes se desejar sem a
necessidade de uma nova compilao. O programa executvel pode ser distribudo para
execuo sem a necessidade de se distribuir o programa-fonte.

No processo de desenvolvimento de um programa escrito em linguagem C,
normalmente so utilizados 3 arquivos:

Em UNIX:
nome.C nome.o a.out
(Executamos o programa teclando o nome do Arquivo "a.out").


Em MS-DOS e WINDOWS:
nome.C nome.OBJ nome.EXE
(Executamos o programa teclando "nome").

O primeiro dos arquivos denominado de programa-fonte e produzido pelo
programador com o uso de um editor de texto. O arquivo intermedirio denominado
de programa-objeto e produzido pelo compilador. O arquivo final denominado de
programa executvel e produzido pelo linker. O programa-objeto um mdulo que o
linker rene a outros mdulos (produzidos pela compilao de outros programas fontes
produzidos pelo programador ou contendo rotinas de biblioteca que desempenham
funes oferecidas com a linguagem) para produzir o programa final executvel.


Introduo linguagemC
Rodolfo Riyoei Goya
3 de 62
1.3. Estrutura bsica de um programa em linguagem C

Um programa escrito em linguagem C tem uma estrutura geral da forma abaixo:

#i ncl ude <st di o. h> Cabeal ho ( header )

i nt mai n( ) / * Umpr ogr ama bemsi mpl es. */
{
i nt num; Cor po do pr ogr ama ( body)

num= 1;
pr i nt f ( "%d eh umbel o numer o. \ n", num) ;
r et ur n 0;
}


Este um programa que, ao ser executado, imprime a frase: 1 eh um belo
nmero. um programa simples, que ilustra as caractersticas de um programa escrito
em C.

Todo o programa escrito em linguagem C constitui-se de uma coleo de uma ou
mais funes, onde uma delas deve se chamar mai n( ) . A funo mai n( )
particularmente importante pois a funo chamada primeiro quando o programa
executado (no importando em que parte do programa ela esteja).

Todo programa consiste de um cabealho (header) e de um corpo (body). O
cabealho contm todas as diretivas de pr-processamento (tal como o #i ncl ude do
exemplo acima). O corpo do programa contm as funes, que podem ser reconhecidas
como um nome seguido por um par de parnteses, podendo haver ou no parmetros
dentro dos parnteses. (No caso do exemplo o nome da funo mai n( ) ).

No caso do exemplo, o arquivo de funes de biblioteca chamado st di o. h passa
a fazer parte do programa pelo uso da diretiva #i ncl ude. Este arquivo fornecido como
parte do compilador C. s vezes ele necessrio, s vezes no. No caso do exemplo ele
necessrio por conter dados descrevendo a funo pr i nt f utilizada no programa
(st di o abreviatura de standard input/output - entrada/sada padro). Outros
arquivos, contendo descries de outros tipos de funes tambm fazem parte dos
pacotes que compem um compilador C.

J o corpo da funo delimitado por chaves {} e constitui-se de uma srie de
comandos (statements), cada comando terminado (separado um do outro) com um ponto
e vrgula (; ).

Introduo linguagemC
Rodolfo Riyoei Goya
4 de 62
No exemplo, o corpo do programa contm quatro comandos: o primeiro um
comando de declarao de varivel, definindo os nome e tipos de variveis que esto
sendo usadas. Variveis so locais onde dados so guardados em memria. O
processamento de dados em um computador constitui-se normalmente na manipulao
no valor de variveis. Todas as variveis utilizadas em um programa devem ser
declaradas para especificar seu nome e seu tipo.

O segundo um comando de atribuio onde uma varivel tem seu valor
definido e um terceiro comando que consiste na chamada da funo pr i nt f ( ) . Os
parmetros da funo pr i nt f ( ) tais como o %d e o \n sero explicados mais adiante.

O quarto o comando r et ur n 0 que finaliza a funo.

No exemplo pode-se notar tambm que existe um trecho com o formato abaixo:

/ * Umpr ogr ama bemsi mpl es. */

Este trecho um comentrio. Os comentrios so iniciados com / * e terminados
com */ e servem apenas para facilitar a leitura do programa, pois so ignorados pelo
compilador. Comentrios so observaes inseridas pelo programador para tornar um
programa mais claro.

O compilador C ignora a quantidade de linhas e espaos em branco colocados
entre os comandos. Deste modo, o programa seguinte tem o mesmo efeito final que o do
exemplo:

#i ncl ude <st di o. h> i nt mai n( )


/ * Umpr ogr ama bemsi mpl es. */

{ i nt num; num

=

1;



pr i nt f (

"%d umbel o nmer o. \ n" ,

num) ; }

Introduo linguagemC
Rodolfo Riyoei Goya
5 de 62
Apesar de serem equivalentes, nota-se que o exemplo inicial apresenta-se de
uma forma bem mais clara. De fato, o modo como o programa escrito pode torn-lo
bem mais legvel. Assim, um bom hbito de programao segue algumas regras bastante
simples como as relacionadas abaixo:

#i ncl ude <st di o. h>

i nt mai n( i nt ar gc, char *ar gv[ ] ) / * I mpr i me per nas e dedos. */
Use Coment r i os.
{
i nt per nas, dedos; Escol ha nomes conveni ent es.
Use l i nhas embr anco.
per nas = 4; Col oque umcomando por l i nha.
dedos = 20;
pr i nt f ( "Duas pessoas t m%d per nas e %d dedos. \ n" , per nas, dedos ) ;
}

Outro aspecto importante que a linguagem C diferencia letras maisculas e
minsculas na formao de nomes. Assim, uma varivel chamada per nas no ser a
mesma que outra chamada PERNAS ou Per nas (esta caracterstica denominada de
case-sensitive, diferentemente do que ocorre em muitas outras linguagens de
programao).

Na escolha de nomes para funes e variveis o programador pode-se utilizar de
letras minsculas e maisculas, dgitos numricos e o smbolo de underscore ("_"). Os
nomes podem ser formados por qualquer combinao destes caracteres somente com a
restrio de no poderem comear com dgito numrico. Os nomes podem ter qualquer
comprimento embora alguns compiladores s utilizem os oito primeiros (assim uma
varivel ou funo chamada NomeLongo1 pode ser tida como a mesma que uma outra
chamada NomeLongo2 pois ambas tm os oito primeiros caracteres idnticos, em
alguns compiladores).

Nomes vlidos:
contagem
vai_um _ehbom
temp1

Nomes invlidos:
%descont
vai-um
e'bom
1temp
Os trs primeiros so invlidos por no usarem caracteres vlidos (%, - e ') e o
ltimo por iniciar com caracter numrico.


Introduo linguagemC
Rodolfo Riyoei Goya
6 de 62
2. Blocos construtivos da linguagem C

Funes so construdas encadeando-se comandos. Por sua vez, os comandos
operam sobre dados. Fornece-se nmeros, letras e palavras ao computador e espera-se
obter algo com estes dados. A linguagem C oferece ao programador diversos tipos de
dados para que este possa construir seus programas.

Por outro lado, para que um programa se utilize de dados de uma maneira til
necessrio que ele seja capaz de interagir com o meio exterior (frequentemente o
usurio do programa) recebendo dados para serem processados e devolvendo-lhe os
valores processados.

Porm no basta o computador devolver ao usurio os dados por ele enviados. A
linguagem deve dispor de recursos que permitam ao programador efetuar manipulaes
e transformaes nos dados recebidos.

Nesta seo, veremos como a linguagem C lida com estes conceitos.


2.1. Tipos de Dados

Os tipos bsicos de dados oferecidos pela linguagem C esto divididos em trs
classes:

Nmeros Inteiros: shor t , i nt , l ong, l ong l ong, e unsi gned
Caracteres: char
Nmeros em Ponto Flutuante: f l oat , doubl e e l ong doubl e

Os cinco primeiros so usados para representar nmeros inteiros, ou seja,
nmeros sem parte fracionria. Nmeros tais como 5, -33 e 2719 so inteiros enquanto
nmeros como 3.14, 1/2 e 6,023x10
23
no o so.

O segundo tipo denominado de caracter e consiste em letras do alfabeto
(maisculas e minsculas) e outros caracteres tais como #, $, % e & alm dos
prprios dgitos numricos.

Os outros dois tipos so utilizados para representar nmeros que podem ter parte
decimal. Estes dois ltimos so tambm denominados tipos em ponto flutuante.


Introduo linguagemC
Rodolfo Riyoei Goya
7 de 62
2.1.1. Dado do tipo inteiro

Os diversos tipos possveis de inteiro relacionados se devem possibilidade de
escolha que a linguagem oferece para as faixas de valores que um dado pode assumir.
Ao contrrio do que ocorre na vida real, dentro de um computador os nmeros tm
valores mnimos e mximos e podem ser representados com preciso limitada. Assim os
tipos shor t , i nt , unsi gned, l ong e l ong l ong so tipos inteiros que permitem
diferentes faixas de valores.

As faixas para cada tipo variam para cada computador onde a linguagem
implementada. No caso dos processadores de 16 bits, por exemplo, variveis do tipo
shor t ocupam um byte de memria (8 bits) e seus valores vo de -128 a +127 (entre -2
7

e 2
7
-1), variveis do tipo i nt ocupam dois bytes de memria (16 bits) e seus valores vo
de -32768 a +32767 (entre -2
15
e 2
15
-1), variveis do tipo unsi gned ocupam dois bytes
de memria (16 bits) e seus valores vo de 0 a +65535 (entre 0 e 2
16
-1) e variveis do
tipo l ong ocupam quatro bytes de memria (32 bits) e seus valores vo de -2147483648
a +2147483647 (entre -2
31
e 2
31
-1).

No caso do compilador DevC++usado neste curso (produz programas para
serem executados em Microsoft Windows):
Variveis do tipo shor t so armazenadas em 16 bits de memria e seus
valores vo de -32768 a +32767 (entre -2
15
e 2
15
-1).
Variveis do tipo i nt e l ong so armazenadas em 32 bits de memria e
seus valores vo de -2147483648 a +2147483647 (entre -2
31
e 2
31
-1).
Variveis do tipo unsi gned e unsi gned i nt so armazenadas em 32
bits de memria e seus valores vo de 0 a +4294967295 (entre 0 e 2
32
-1).
Variveis do tipo l ong l ong so armazenadas em 64 bits de memria e
seus valores vo de - 9223372036854775808 a +9223372036854775807
(entre -2
63
e 2
63
-1).

Variveis de tipo inteiras em C so declaradas simplesmente especificando-se o
tipo seguindo-se de uma lista com os nomes das variveis.

i nt pont os;
shor t di a;
l ong popul acao;
l ong l ong di vi da;
shor t hor a, mi nut o, segundo;

Uma lista de variveis feita com uma relao dos nomes das variveis
separados por vrgulas e terminada com ponto e vrgula.

A faixa finita na qual os nmeros so representados se deve o fato de que cada
tipo de dado reserva uma poro finita de memria para armazenamento de cada tipo.
Por exemplo, nos processadores de 16 bits, dados de tipo shor t so guardados em dois
bytes de memria, dados de tipo i nt so guardados em quatro bytes de memria, do
tipo l ong em quatro bytes e do tipo l ong l ong em oito bytes (nos processadores
pentium, dados de tipo shor t so guardados em dois bytes de memria e dados de tipo
i nt e l ong em quatro bytes).

Introduo linguagemC
Rodolfo Riyoei Goya
8 de 62
A palavra unsi gned utilizada para modificar a faixa de definio de um dado
para valores apenas positivos. Assim, no caso dos processadores de 16 bits, um dado de
tipo unsi gned shor t tem valores entre 0 e 255, unsi gned i nt tem valores entre 0 e
65535 e um dado do tipo unsi gned l ong pode assumir valores entre 0 e 4294967295
(nos processadores pentium, um dado de tipo unsi gned shor t tem valores entre 0 e
65535, e dados de tipo unsi gned i nt e unsi gned l ong podem assumir valores entre 0 e
4294967295).

unsi gned i nt ano;
unsi gned shor t di a, mes;
unsi gned l ong por cos, boi s, gansos;

Outro tipo de dado importante so as constantes inteiras. A linguagem C
reconhece um nmero sem um ponto decimal como sendo um inteiro. Assim, nmeros
como 2 ou -150 so constantes inteiras. As constantes inteiras podem ser usadas para
iniciar o valor de variveis:

di a = 1;
mes = 5;
pont os = - 20;

A inicializao de variveis tambm pode ser feita no comando de declarao.
Como no exemplo abaixo:

i nt cr edi t os, pont os = 0;
shor t hor a = 12, mi nut os = segundos = 0;

No primeiro exemplo apenas a varivel pont os inicializada. Enquanto no
receber nenhum valor durante a execuo do programa o valor da varivel cr edi t os
deve ser tomado como indeterminado. No segundo exemplo, a varivel hor a iniciada
com o valor 12 enquanto as variveis mi nut os e segundos so iniciadas com 0.

Constantes de tipo l ong so definidas com valores numricos finalizados com a
letra l :

l ong popul acao = 100000000l ; / * apesar de par ecer com 1 ( um)
uma l et r a l ( el e) no f i nal . */

Variveis de tipo l ong ocupam mais espao e tomam mais tempo de
processamento que variveis de tipo i nt .

Constantes de tipo l ong l ong so definidas com valores numricos finalizados
com a letra l :

l ong l ong popul acao = 100000000l l ; / * par ece com 11 ( umum)
mas l l ( el e el e) no f i nal . */

Variveis de tipo l ong l ong ocupam mais espao e tomam mais tempo de
processamento que variveis de tipo l ong.
Introduo linguagemC
Rodolfo Riyoei Goya
9 de 62
2.1.2. Dado do tipo caracter

Normalmente um dado do tipo char definido como um nmero inteiro na faixa
entre -128 e 127 armazenado em 8 bits (1 byte), enquanto um dado de tipo unsi gned
char definido como um nmero inteiro na faixa entre 0 e 255 armazenado em 8 bits (1
byte). Os computadores normalmente usam um cdigo para traduzir estes nmeros em
caracteres (os mais conhecidos so o ASCII, EBCDIC e o UNICODE). A linguagem C
usa o cdigo ASCII (American Standard Coding for Information Interchange) para
traduzir caracteres em cdigos. No cdigo ASCII, por exemplo, a letra 'A' codificada
em binrio como 01000001 (65 em decimal), a letra 'a' como 01100001 (97 em decimal)
e o smbolo '?' como 00111111 (63 em decimal).

Caracteres numricos no tm necessariamente um cdigo correspondente a seu
valor. Assim, por exemplo, o cdigo ASCII que corresponde ao caracter '0' 00110000,
48 em decimal.

As variveis de tipo caracter so declaradas utilizando-se a palavra chave char :

char l et r a, r espost a;

Um caracter constante definido como um smbolo entre apstrofos. Deste
modo podemos usar tais constantes para atribuir um valor a uma varivel de tipo
caracter.

l et r a = 97; / * col oca a na var i vel l et r a. */
r espost a = ' S' ; / * col oca S na var i vel r espost a. */

Se observarmos uma tabela ASCII veremos que certos caracteres so
denominados de no-imprimveis. Tais caracteres so usados normalmente para o
controle de impresso de sada. Para a representao destes caracteres, a linguagem C
utiliza certas sequncias especiais de caracteres. Tais sequncias so denominadas de
sequncias de escape com alguns exemplos relacionados abaixo:

\n newline
\t tabulao
\b backspace
\r retorno de carro - carriage return
\f form feed
\nnn Nmero codificado em octal
\xnnnn Nmero codificado em hexadecimal
\\ barra invertida (\) - backslash
\' Apstrofo (')
\" Aspas (")

Tais sequncias tambm devem ser colocadas entre aspas para definir uma
constante. Por exemplo:

char car act er = ' \ n' ;

Introduo linguagemC
Rodolfo Riyoei Goya
10 de 62
Ao se imprimir a varivel car act er , a cabea de impresso da impressora ou o
cursor na tela avanam para o comeo da prxima linha.

Na relao dada, o newline avana para o incio da prxima linha, um tab move
o cursor ou a cabea de impresso de uma quantidade fixa de posies (normalmente
mltipla de 5 ou 8). Um backspace move para trs de um caracter. Um retorno de carro
move para o incio da mesma linha e um form feed faz com que a impressora avance o
papel de uma pgina. Os trs ltimos permitem a definio de constantes de caracter
para os caracteres \ ' e ".

Sequncia Smbolo Codificao binria
\n Newline 00001010
\t Tabulao 00001001
\b Backspace 00001000
\r retorno de carro - carriage return 00001101
\f form feed 00001100
\\ barra invertida (\) - backslash 01011100
\' Apstrofo (') 00100111
\" Aspas (") 00100010

Deste modo, as declaraes:
char car act er = ' \ n' ;
e
char car act er = 10;
tm o mesmo significado.

A codificao em binrio completa de todos os caracteres segundo a tabela ASCII
apresentada na figura abaixo:



Uma tabela de codificao ASCII para binrio completa pode ser achada em:
http://pt.wikipedia.org/wiki/ASCII
Introduo linguagemC
Rodolfo Riyoei Goya
11 de 62
2.1.3. Dados do tipo ponto flutuante

Os tipos de dados inteiros e caracteres servem muito bem para a maioria dos
programas. Contudo, alguns programas orientados para aplicaes matemticas
frequentemente fazem uso de nmeros em ponto flutuante. Para este tipo de dados, em
C, definimos os tipos denominados de f l oat , doubl e e l ong doubl e.

A representao de nmeros em ponto flutuante anloga a notao cientfica e
permite a representao de uma faixa bastante grande de nmeros, incluindo os nmeros
fracionrios. Por exemplo:


Nmero
Notao
Cientfica
Notao em
Linguagem C
1000000000 1,0x10
9
1.0e9
123000 1,23x10
5
1.23e5
-786,89 -7,8689x10
2
-7.8689e2
322,56 3,2256x10
2
3.2256e2
0,000056 5,6x10
-5
5.6e-5

Na primeira coluna vemos a notao usual. Na segunda coluna a notao
cientfica e na terceira o modo como a notao cientfica representada em um
computador. Note que, em linguagem C, de modo diferente que o usual em portugus,
usa-se . ao invs de , para separar a parte inteira da decimal.

Do mesmo modo que ocorre com os inteiros, nmeros em ponto flutuante so
armazenados em pores finitas de memria de modo que a sua preciso limitada.

O tipo f l oat tem preciso de 7 dgitos com o expoente indo de 10
-38
a 10
+38
.
O tipo doubl e tem preciso de 14 dgitos com expoente indo de 10
-308
a 10
+308
.
O tipo l ong doubl e tem preciso de 18 dgitos com expoente indo de 10
-4932
a
10
+4932
.

Isto quer dizer que um nmero como 4345345.8476583746123 ser armazenado
como:
4.345345e+6 em uma varivel do tipo f l oat .
4.3453458476584e+6 em uma varivel do tipo doubl e.
4.34534584765837461e+6 em uma varivel do tipo l ong doubl e.


Introduo linguagemC
Rodolfo Riyoei Goya
12 de 62
Constantes em ponto flutuante podem ser definidas de diversas formas. A mais
geral uma srie de dgitos com sinal, incluindo um ponto decimal, depois um e ou E
seguido de um expoente de uma potncia de dez com sinal. Por exemplo:

-1.609E-19
+6.03e+23.

Na definio de constantes, podem-se omitir sinais positivos, a parte de expoente
e a parte inteira ou fracionria. Por exemplo:

3.14159
.2
4e16
.8e-5
100.

No se podem usar espaos dentro de um nmero em ponto flutuante:
O nmero 3.34 E+12 est errado (tem um espao entre o 4 e o E).

Constantes de tipo l ong doubl e so criadas acrescentando-se L ou l no final:
4.34534584765837461e+6L ou 4.34534584765837461e+6l (ele).

Constantes de tipo f l oat so criadas acrescentando-se F ou f no final:
4. 345346e+6F ou 4.345346e+6f.

Variveis de tipo l ong doubl e ocupam mais espao e tomam mais tempo de
processamento que variveis de tipo doubl e e variveis de tipo doubl e ocupam mais
espao e tomam mais tempo de processamento que variveis de tipo f l oat .
Introduo linguagemC
Rodolfo Riyoei Goya
13 de 62
2.2. Funes de Entrada/Sada

Nesta seo vamos examinar algumas das funes existentes na biblioteca da
linguagem C utilizadas para entrada e sada de dados: as funes pr i nt f ( ) , scanf ( ) ,
get che( ) , get char ( ) , get ch ( ) , put char ( ) e put ch( ) .

Estas funes so necessrias para que o usurio do programa possa introduzir
dados no programa e que este possa devolver os resultados processados.

Estas funes pertencem s bibliotecas stdio.h e conio.h, oferecidas juntamente
com todo pacote comercialmente disponvel de compilador de linguagem C. Para que
estas funes possam ser includas em um programa em C torna necessria a incluso da
diretiva no cabealho do programa:

#i ncl ude <st di o. h>
#i ncl ude <coni o. h>



Introduo linguagemC
Rodolfo Riyoei Goya
14 de 62
2.2.1. Funo printf()

A funo pr i nt f ( ) uma funo de impresso em tela bastante flexvel em seu
uso.

A funo pr i nt f ( ) tem o formato geral conforme o descrito abaixo:

#i ncl ude <st di o. h>
mai n( )
{
i nt i dade = 30;
f l oat al t ur a = 1. 75;

pr i nt f ( "Ri car do t em: \ n%f mde al t ur a e %d anos. ", al t ur a, i dade ) ;
}

Nos parmetros de uma funo pr i nt f ( ) encontramos primeiro uma parte entre
aspas que contm os caracteres que sero impressos pelo comando (o que pode incluir
sequncias de escape como no exemplo acima).

Na segunda parte temos uma lista que pode ser formada por qualquer
combinao de variveis, constantes e expresses.

Na primeira parte algumas sequncias iniciadas com o smbolo '%'
(denominadas de especificadores de formato) no so impressas, mas sim substitudas
por valores que so dados pelos elementos da segunda parte.

Deste modo, o exemplo resultar na sada abaixo:

Ri car do t em:
1. 750000 mde al t ur a e 30 anos

Existem outros especificadores de formato. Por exemplo, para caracteres %c:

pr i nt f ( "A l et r a %c eh a pr i mei r a de Ri car do. \ n" , ' R' ) ;

Relacionamos abaixo alguns especificadores de formato:

Sequncia Uso
%d Inteiros em decimal.
%ld Inteiros l ong em decimal.
%lld Inteiros l ong l ong em decimal.
%c Caracter traduzido segundo a tabela ASCII.
%e Nmero em ponto flutuante - notao usando exponencial.
%f Nmero em ponto flutuante - notao decimal.
%g Nmero em ponto flutuante - notao usando exponencial ou decimal.
%Le Nmero l ong doubl e - notao usando exponencial.
%Lf Nmero l ong doubl e - notao decimal.
%Lg Nmero l ong doubl e - notao usando exponencial ou decimal.
%% O smbolo '%'.

Introduo linguagemC
Rodolfo Riyoei Goya
15 de 62
Alm do modo descrito, os especificadores de formato para valores numricos
podem ser alterados para ajustar o formato dos valores a serem impressos.

Modificao Significado
digito Indica a largura mnima do nmero a ser impresso. Por exemplo: %4d
quer dizer que o nmero ser impresso com quatro dgitos (maior se
necessrio).

.digito Indica preciso. Para nmeros em ponto flutuante quantas casas depois
da vrgula sero usadas. Por exemplo: %6.2f indica um nmero que ser
impresso com um total de seis caracteres (incluindo o sinal e o ponto)
com indicao de duas casas depois do ponto decimal.

- J ustificao. Indica que o nmero ser impresso encostado do lado
esquerdo do campo. O normal o nmero ser impresso terminando no
final do campo especificado pelo tamanho. Por exemplo: %-10d

l Especifica que o valor a ser impresso do tipo long. Por exemplo: %6ld
ll Especifica que o valor a ser impresso do tipo long long. Por exemplo:
%6lld
L Especifica que o valor a ser impresso do tipo long double. Por
exemplo: %6Lf


2.2.2. Funo getche()

A funo get che( ) (que uma abreviatura de get character with echo - l um caracter e
ecoa na tela) faz a entrada de um caracter teclado. Por exemplo:

#i ncl ude <st di o. h>
#i ncl ude <coni o. h>

mai n( )
{
char ch;

pr i nt f ( "Pr essi one uma t ecl a: " ) ;
ch = get che( ) ;
pr i nt f ( "\ nA t ecl a pr essi onada f oi %c. ", ch ) ;
}


Introduo linguagemC
Rodolfo Riyoei Goya
16 de 62
2.2.3. Funes getch() e getchar()

A funo get ch( ) (que uma abreviatura de get character without echo - l um caracter
sem ecoar na tela) faz a entrada de um caracter teclado. Por exemplo:

#i ncl ude <st di o. h>
#i ncl ude <coni o. h>

mai n( )
{
char ch;

pr i nt f ( "Pr essi one uma t ecl a: " ) ;
ch = get ch( ) ;
pr i nt f ( "\ nA t ecl a pr essi onada f oi %c. ", ch ) ;
}


2.2.4. Funo scanf()

A funo get che( ) devolve apenas valores de tipo caracter. Para se fazer a
entrada de dados de outros tipos (inclusive de caracter) pode-se utilizar a funo
scanf ( ) .

A estrutura de uma chamada de funo scanf ( ) semelhante a da pr i nt f ( ) .

#i ncl ude <st di o. h>

mai n( )
{
f l oat anos;

pr i nt f ( "Ent r e sua i dade emanos: " ) ;
scanf ( " %f ", &anos ) ;
pr i nt f ( "Voce t em%. 0f di as de i dade. \ n" , anos * 365 ) ;
}
Os especificadores de formato usados so os mesmos. A nica diferena
significativa o smbolo & precedendo o nome da varivel (este smbolo, na
realidade, representa um operador denominado de operador endereo, o que significa
que passamos para a funo scanf ( ) o endereo das variveis a serem lidas pela funo
e veremos mais a respeito deste operador na seo sobre ponteiros, por enquanto
fixemos apenas que se deve colocar um & antes do nome da varivel ao se usar o
scanf ( ) ). A funo scanf ( ) pode ser usada para a leitura de vrios nmeros:

#i ncl ude <st di o. h>

mai n( )
{
f l oat x, y;

pr i nt f ( "Tecl e doi s numer os: " ) ;
scanf ( " %f %f " , &x, &y ) ;
pr i nt f ( "%f + %f = %f . \ n", x, y, x + y ) ;
}


Introduo linguagemC
Rodolfo Riyoei Goya
17 de 62
2.2.5. Funo putch() e putchar()

A funo put ch( ) (que uma abreviatura de print character - imprime um caracter) faz
a saida de um caracter. Por exemplo:

#i ncl ude <st di o. h>
#i ncl ude <coni o. h>

mai n( )
{
char ch;

pr i nt f ( "Pr essi one uma t ecl a: " ) ;
ch = get che( ) ;
pr i nt f ( "\ nA t ecl a pr essi onada f oi " ) ;
put ch( ch ) ;
}
Introduo linguagemC
Rodolfo Riyoei Goya
18 de 62
2.3. Operadores

Um dos tipos de comando mais importantes para a construo de programas em
linguagem C so as expresses. Expresses so construdas atravs do uso de variveis
e constantes relacionadas atravs de operadores. Veremos nesta seo alguns operadores
elementares: Atribuio, Adio, Subtrao, Diviso, Multiplicao, Resto, Sinal,
Incremento e Decremento, Atribuio Aritmtica e Operadores Relacionais.

A importncia dos operadores vem do fato de que estes se constituem nas
ferramentas para a manipulao de dados e variveis em um programa.

A combinao de diversos operadores, constantes e variveis em um mesmo
comando forma uma expresso. Uma expresso com diversos operadores avaliada em
uma ordem univocamente determinada. A ordem com a qual uma combinao de
operadores agrupados em uma expresso avaliada denominada de precedncia.


2.3.1. Atribuio

Um operador de atribuio se apresenta na forma de uma varivel seguida de um
caracter = e, em seguida de outra varivel, constante ou uma expresso que pode
incluir outros operadores.

Em C, um operador de atribuio avalia o valor de uma expresso e faz com que
uma varivel assuma este valor. Assim, em uma atribuio do tipo:

ano = 2009;

O smbolo = no significa "igual" no seu sentido matemtico. Em C o smbolo
"=" denominado de operador de atribuio e quer dizer o seguinte: atribua o valor
2009 varivel ano. Tal distino faz muito sentido quando se interpreta o significado
do comando abaixo:

i = i + 1;

Do ponto de vista matemtico, tal identidade no teria sentido. Em linguagem C
um comando deste tipo significaria o seguinte: "Tome o valor atual da varivel i , some
1 a este valor e atribua o resultado varivel i ".

O operador de atribuio resulta, por si s em um valor. Assim, no exemplo
abaixo:

a = b = 1;

O operador de atribuio b = 1 tem o valor 1 como resultado e este valor
atribudo, ento, para a varivel a (a avaliao feita da direita para a esquerda).


Introduo linguagemC
Rodolfo Riyoei Goya
19 de 62
2.3.2. Operador de Adio: +

O operador de adio faz com os dois valores a cada lado do operador sejam
somados. Por exemplo, o comando:

pr i nt f ( "%d" , 5 + 5 ) ;

Imprimir o nmero 10 e no a expresso 5 +5.

O operador de adio pode ser utilizado tanto com variveis como com
constantes. Assim, o comando:

pr eco = cust o + l ucr o;

Far com que o computador determine o valor atual de cada varivel, some tais
valores e atribua o resultado varivel pr eco.


2.3.3. Operador de Subtrao: -

O operador de subtrao faz com o valor direita do operador seja subtrado do
valor esquerda. Por exemplo, o comando:

i dade = 2009 ano_de_nasci ment o;

Far com que o computador determine o valor atual da varivel
ano_de_nasci ment o, subtraia este valor de 2009 e atribua o resultado varivel i dade.


2.3.4. Operador de Multiplicao: *

O operador de multiplicao faz com os dois valores a cada lado do operador
sejam multiplicados. Por exemplo, o comando:

i mpost o = r ecei t a * 0. 15;

Far com que o computador determine o valor atual da varivel r ecei t a,
multiplique este valor por 0.15 e atribua o resultado varivel i mpost o.


Introduo linguagemC
Rodolfo Riyoei Goya
20 de 62
2.3.5. Operador de Diviso: /

O operador de diviso faz com o valor esquerda do operador seja dividido pelo
valor direita. Por exemplo, o comando:

pr emi o = r at ei o / ganhador es;

Far com que o computador determine o valor atual das variveis r at ei o e
ganhador es divida o primeiro pelo segundo e atribua o resultado varivel pr emi o.

A operao de diviso funciona de modo diferente quando os valores usados so
inteiros quando comparados diviso em ponto flutuante. A diviso de valores em
ponto flutuante resulta em valores em ponto flutuante, mas a diviso de valores inteiros
tambm resulta em valores inteiro. O fato de um nmero inteiro no possuir parte
fracionria faz com que uma diviso do tipo 29 / 10 tenha sua parte fracionria
descartada (o resultado dessa diviso 2). Este processo de se remover a parte
fracionria do resultado denominado de truncamento.


2.3.6. Operador de Resto: %

O operador de resto resulta do resto da diviso inteira do valor esquerda do
operador seja dividido pelo valor direita. Por exemplo, o comando:

r est o = 39 %10;

Far com que o computador atribua o valor 9 varivel r est o.


2.3.7. Operador de Sinal: -

O operador de sinal usado para indicar ou modificar o sinal de um valor. Por
exemplo:

l ucr o = - 25;
pr ej ui zo = - l ucr o;

Atribui o valor 25 varivel prejuzo. Este tipo de operador denominado de unrio
porque manipula um nico operando, ao contrrio dos demais vistos at aqui.


Introduo linguagemC
Rodolfo Riyoei Goya
21 de 62
2.3.8. Operador de incremento e decremento: ++ e --

O operador de incremento desempenha uma tarefa simples; ele incrementa
(soma um) ao valor de seu operando ( um operador unrio). Este operador pode ser
usado com o ++antes da varivel afetada ou com o ++depois da varivel afetada. A
diferena entre ambos se refere ao momento em que o incremento efetuado. No
primeiro caso, o incremento ocorre no incio do comando, antes de qualquer outra
operao ser executada. No segundo caso, o incremento feito aps a execuo de todas
as operaes no comando. Assim:

i = 5;
j = 8;
k = ++i * j ++;

Resultar nos valor 6, 9 e 48 para i , j e k. A varivel k ficou com o valor 48
como resultado da multiplicao de 6 e 8 pois i j sofreu o incremento antes do produto
e j depois.

O operador de decremento opera de modo semelhante. Com a diferena de que a
operao feita de decremento, ou seja, de se subtrair um da varivel.


Introduo linguagemC
Rodolfo Riyoei Goya
22 de 62
2.3.9. Precedncia de operadores

A precedncia de operadores a regra que permite definir qual a ordem com que
as operao so realizadas dentro de uma expresso que rena diversos operadores.

Por exemplo, a expresso abaixo:

x = 3 + y * 4;

Possui dois operadores: +e *. A precedncia permite que se resolva qual ser
avaliado primeiro: se primeiro fazemos a soma e em seguida multiplicamos o resultado
por 4 ou se fazemos primeiro o produto e depois somamos 3 ao resultado.

Na expresso em questo, a multiplicao ser feita primeiro e depois a soma.
Caso se quisesse fazer primeiro a soma devem ser usados os parnteses:

x = ( 3 + y) * 4;

Deste modo, a ordem de precedncia dos operadores na linguagem C est
tabelada abaixo:

Operador Associatividade

() Esquerda para direita.
++-- Esquerda para direita.
- (unrio) Esquerda para direita.
* / Esquerda para direita.
+- (binrio) Esquerda para direita.
= Direita para esquerda.


Introduo linguagemC
Rodolfo Riyoei Goya
23 de 62
2.3.10. Atribuio Aritmtica

Um operador de atribuio aritmtica uma forma compacta de operao de
soma, subtrao, multiplicao, diviso ou resto. Com o uso de atribuio aritmtica o
comando:

i = i + j ;

Fica:

i += j ;

Do mesmo modo, os operadores relacionados acima podem ser usados na
construo de operadores de atribuio aritmticos:

+= at r i bui o comsoma: i += j ; equi val e a i = i + j ;
- = at r i bui o comsubt r ao: i - = j ; equi val e a i = i - j ;
*= at r i bui o commul t i pl i cao: i *= j ; equi val e a i = i * j ;
/ = at r i bui o comdi vi so: i / = j ; equi val e a i = i / j ;
%= at r i bui o comr est o: i %= j ; equi val e a i = i %j ;

A atribuio aritmtica tem a mesma precedncia que o operador de atribuio.


Introduo linguagemC
Rodolfo Riyoei Goya
24 de 62
2.3.11. Operadores Relacionais

Os operadores relacionais efetuam comparaes entre dois valores (constantes,
variveis ou expresses). Na linguagem C, se uma comparao resultar em verdadeiro,
o operador relacional correspondente resulta em 1. Do contrrio, resulta em 0.

Na linguagem C existem 6 operadores relacionais conforma a tabela abaixo:

Operador Significado
< Menor que
> Maior que
<= Menor ou igual a
>= Maior ou igual a
== Igual a
!= Diferente de

Os operadores relacionais so os de menor precedncia dentre todos os
operadores. Assim, a expresso:

1 < 2 + 4;

Resulta no valor 1 (correspondente a verdadeiro) pois 1 menor que 6.
Introduo linguagemC
Rodolfo Riyoei Goya
25 de 62
2.3.12. Erros de arredondamento e overflow

Na execuo de operaes em ponto flutuante possvel que ocorram erros
devido ao arredondamento que ocorre com a preciso finita com que os nmeros so
representados em um computador. Deste modo, uma operao do tipo:

mai n( )
{
f l oat a;

a = 1. 0 + 1. 0E30;
a = a - 1. 0E30;
pr i nt f ( "%f \ n" , a ) ;
}

imprimir 0.000000 como resposta porque o primeiro comando de atribuio
arredondar o resultado da operao para a preciso de 7 dgitos de uma varivel do tipo
float (muito aqum dos 30 dgitos necessrios para a operao acima).

possvel que durante uma operao resulte em um valor fora da faixa para a
qual o tipo do dado definido. Tal situao denominada de overflow.

mai n( )
{
f l oat a;

a = 1. 0E30 * 1. 0E30;
pr i nt f ( "%f \ n" , a ) ;
}

O resultado decorrente desta operao depender da implementao de cada
compilador. responsabilidade do programador prevenir-se contra a ocorrncia ou
contra os efeitos de tais situaes.


Introduo linguagemC
Rodolfo Riyoei Goya
26 de 62
3. Loops

Quase sempre, o que vale a pena ser feito, vale a pena ser feito mais que uma
vez. Em programao, uma determinada ao deve ser executada repetidas vezes e,
frequentemente, com alguma variao nos detalhes a cada vez. O mecanismo com o
qual realizamos estas repeties denominado de "loop".

Existem, basicamente, trs tipos de implementaes de loops em C:

Loops do tipo "for".
Loops do tipo "while".
Loops do tipo "do while".


3.1. Loops do tipo "for"

Um loop do tipo "for" apresenta a estrutura abaixo:

f or ( exp1; exp2; exp3 )
comando;

A expresso exp1 uma inicializao. executada apenas uma vez, exatamente
no momento em que se vai iniciar o processamento do loop. A segunda expresso
(exp2) uma condio de teste. avaliada antes de cada possvel passagem do loop.
Quando esta expresso resultar em valor falso o loop terminado. A terceira expresso
(exp3) avaliada ao final de cada loop. A cada passagem do loop o comando
executado uma vez.

O loop "for" prprio para quando se deseja executar o loop um nmero
determinado de vezes. No exemplo abaixo, o comando no loop executado 256 vezes.

#i ncl ude <st di o. h>

mai n( )
{
i nt n;

pr i nt f ( " Tabel a ASCI I : \ n" ) ;
f or ( n = 0; n < 256; n++ )
pr i nt f ( " Car act er : %c Codi go: %d\ n", n, n ) ;
}

Introduo linguagemC
Rodolfo Riyoei Goya
27 de 62
Caso seja executado mais de um comando dentro do loop, estes ficam
delimitados por chaves {}:

#i ncl ude <st di o. h>

mai n( )
{
i nt i , ano;
f l oat at ual , t axa;

pr i nt f ( "Est i ma a popul acao nos pr oxi mos anos. . \ n" ) ;
pr i nt f ( "Ent r e coma popul acao at ual : " ) ;
scanf ( " %f ", &at ual ) ;
pr i nt f ( "Ent r e coma t axa de cr esci ment o: " ) ;
scanf ( " %f ", &t axa ) ;
pr i nt f ( "Ent r e coma ano at ual : " ) ;
scanf ( " %d", &ano ) ;

f or ( i = 1; i <= 10; i ++ )
{
ano++;
popul acao *= t axa;
pr i nt f ( "ano %d popul acao= %. 0f \ n" , ano, at ual ) ;
}
}

Os loops "for" podem ser aninhados (um loop colocado dentro do outro):

#i ncl ude <st di o. h>

mai n( )
{
i nt i , j ;

pr i nt f ( "Tabuada do 1 ao 10: \ n" ) ;
f or ( i = 1; i <= 10; i ++ )
{
f or ( j = 1; j <= 10; j ++ )
pr i nt f ( " %2d*%2d= %3d", i , j , i * j ) ;
pr i nt f ( "\ n" ) ;
}
}

Introduo linguagemC
Rodolfo Riyoei Goya
28 de 62
O loop "for" bem flexvel. Podemos decrementar a contagem ao invs de
incrementar:

pr i nt f ( " Cont agemr egr essi va. . . \ n" ) ;
f or ( n = 10; n > 0; n- - )
pr i nt f ( "%d segundos\ n", n ) ;

Podemos ter a contagem em qualquer passo:

f or ( n = 10; n < 230; n = n + 15 )
pr i nt f ( "%d \ n", n ) ;

Podemos contar letras ao invs de nmeros:

pr i nt f ( " Al f abet o mi nuscul o: \ n" ) ;
f or ( ch = ' a' ; ch <= ' z' ; ch++ )
pr i nt f ( " %c " , ch ) ;


Introduo linguagemC
Rodolfo Riyoei Goya
29 de 62
3.2. Loops do tipo "while"

Os loops do tipo "while" apresentam a forma abaixo:

whi l e( expr eso )
comando;

No comando "while" a expresso avaliada ao incio do loop. Se esta resultar
verdadeira, ento o comando efetuado e, ento, a expresso reavaliada reiterando o
processo que s terminar quando a expresso for avaliada e se tornar falsa.

O loop "while" prprio para quando se deseja executar o loop um nmero
indeterminado priori de vezes.

Por exemplo:

#i ncl ude <st di o. h>

mai n( )
{
char ch;

pr i nt f ( "Ter mi ne pr essi onando Ent er . \ n" ) ;
whi l e ( ch = get che( ) ! = \ n )
pr i nt f ( " Car act er t ecl ado: %c Codi go: %d\ n" , ch, ch ) ;
}


Introduo linguagemC
Rodolfo Riyoei Goya
30 de 62
3.3. Loops do tipo "do while"

Os loops do tipo "do while" apresentam a forma abaixo:

do
comando;
whi l e ( expr eso) ;

A principal diferena entre um loop "while" e um "do while" que, no segundo
caso, o comando sempre executado pelo menos uma vez independentemente da
possibilidade da expresso ser avaliada como falsa j ao incio do loop.

O loop do tipo "do while" prprio para quando se deseja executar o loop um
nmero indeterminado de vezes, porm pelo menos uma vez.

Por exemplo:

#i ncl ude <st di o. h>

mai n( )
{
char ch;
i nt n = 1;

do
pr i nt f ( "\ nVol t as no l oop: %d Cont i nua ? ( s/ n) " , n++ ) ;
whi l e( ch = get che( ) ! = ' s' )
}


Introduo linguagemC
Rodolfo Riyoei Goya
31 de 62
4. Decises

Um tipo de comando necessrio para a criao de programas teis, versteis e
inteligentes so os de deciso e escolha de alternativas.

Na linguagem C so definidos comandos de controle que permitem desviar o
fluxo de execuo de um programa de acordo com o resultado de testes ou resultados
obtidos para operaes.

As palavras-chave para estes comandos esto relacionadas abaixo:

if
if-else
switch-case-break-default


4.1. Decises do tipo "if"

O comando de controle "if" tem a estrutura abaixo:

i f ( expr esso )
comando;

Durante a execuo do programa a expresso avaliada e, se o resultado for
verdadeiro, somente ento o comando executado.

Embora qualquer tipo de expresso possa ser empregado (neste caso o resultado
falso corresponde a um valor inteiro igual a zero e verdadeiro corresponde a um valor
inteiro diferente de zero), normalmente so utilizadas expresses com operadores
relacionais e lgicos.

No caso de se desejar condicionar a execuo de uma sequncia de comandos a
uma expresso, nos definimos a relao de comandos a serem executados delimitando-
os com chaves {}.

i f ( expr esso )
{
comando1;
comando2;
comando3;
}

Se, ao avaliar-se a expresso resultar em verdadeiro (um) os comandos
comando1 comando2 e comando3 sero executados. Seno, nenhum deles ser
executado.


Introduo linguagemC
Rodolfo Riyoei Goya
32 de 62
4.2. Decises do tipo "if-else"

O comando de controle "if-else" tm a estrutura abaixo:

i f ( expr esso )
comando1;
el se
comando2;

Neste comando de controle, a expresso avaliada. Se o resultado for verdadeiro
(um), o comando1 executado. Se o resultado for falso (zero) o comando2 executado.
A execuo dos dois comandos mutuamente exclusiva. Apenas um dos dois comandos
ser executado.

Caso seja necessrio o uso de mais comandos, tanto para o caso da expresso ser
verdadeira como no caso da expresso ser falsa, as chaves {} tambm podem ser
empregadas.

No caso de se encadear diversos comandos de controle "if" em sequncia, o
comando else corresponder condio falsa do comando "if" anterior mais prximo
que no tenha um "else" ainda associado:

i f ( exp1 )
i f ( exp2 )
comando_a; / * exp1 == ver dadei r o && exp2 == ver dadei r o */
el se / * cor r esponde negao do i f ( expr 2) aci ma. */
comando_b; / * exp1 == ver dadei r o && exp2 == f al so */
el se / * cor r esponde negao do i f ( expr 2) aci ma. */
comando_c; / * exp1 == f al so */

O comando_a ser executado se a expresso exp1 for verdadeira e a expresso
exp2 tambm for verdadeira. O comando_b ser executado se a expresso exp1 for
verdadeira e a expresso exp2 for falsa. Para que o comando_c seja executado basta que
a expresso exp1 seja falsa (exp2 sequer avaliada).


Introduo linguagemC
Rodolfo Riyoei Goya
33 de 62
4.3. Decises do tipo "switch"

Nos comandos de controle "if" e "if-else" a deciso tomada permitia a escolha
dentre duas possveis alternativas. Com o comando de controle "switch" pode-se
escolher um comando a ser executado dentre diversos possveis valores de uma
expresso. A estrutura de um comando de controle "switch" descrito abaixo:

swi t ch( exp )
{
case x1: comando_x1;
br eak;
case x2: comando_x2;
br eak;
case x3: comando_x3;
br eak;
case x4: comando_x4;
br eak;
def aul t : comando_x5;
}

O comando switch mostrado equivalente ao comando abaixo:

i f ( exp == x1 )
comando_x1;
el se
i f ( exp == x2 )
comando_x2;
el se
i f ( exp == x3 )
comando_x3;
el se
i f ( exp == x4 )
comando_x4;
el se
comando_x5;

A expresso exp avaliada. Se o resultado for igual a x1, ento comando_x1
executado. Se o resultado for igual a x2, ento comando_x2 executado. Se o resultado
for igual a x3, ento comando_x3 executado. Se o resultado for igual a x4, ento
comando_x4 executado. Se o resultado for diferente de todos eles, ento comando_x5
executado.

No h limites para o nmero de "cases" que podem ser usados em um comando
"switch". Os valores x1, x2, x3 e x4 usados no comando so constantes, normalmente
inteiras ou caracteres. Caso haja valores iguais em dois ou mais diferentes "cases" ser
executado o comando ligado ao primeiro "case".

Introduo linguagemC
Rodolfo Riyoei Goya
34 de 62
Um "case" em particular recebe o nome de "default" e colocado no final do
comando "switch". O comando associado ao "default" executado sempre que nenhum
"case" corresponda ao valor associado expresso do "switch".

Um comando adicional associado ao comando de "switch" o comando "break"
que determina o trmino da sequncia de comandos associados ao "case". Assim, na
ausncia de um "break", a execuo de um "case" pode prosseguir no "case" seguinte.

Por exemplo:

swi t ch( get che( ) )
{
case ' a' :
case ' e' :
case ' i ' :
case ' o' :
case ' u' : pr i nt f ( " Voc t ecl ou uma vogal . \ n") ;
br eak;
def aul t : pr i nt f ( "Voc t ecl ou uma consoant e. \ n" ) ;
}


Introduo linguagemC
Rodolfo Riyoei Goya
35 de 62
4.4. O operador condicional

O operador condicional um modo abreviado para um comando "if-else" com
uso para comando de atribuio. A estrutura para o operador condicional descrita
abaixo:

x = exp1 ? exp2 : exp3;

Se exp1 for verdadeiro, a varivel x recebe o valor de exp2. Se for falso de
exp3.

A expresso acima equivalente ao comando abaixo:

i f ( exp1 )
x = exp2;
el se
x = exp3;

Por exemplo, o comando abaixo atribui varivel x o valor absoluto da varivel
y:

x = ( y < 0) ? - y : y;


Introduo linguagemC
Rodolfo Riyoei Goya
36 de 62
5. Funes

Um programa em linguagem C constitui-se em uma coleo de funes (onde
pelo menos uma delas chamada de mai n( ) e a funo executada ao iniciar o
programa). Algumas funes (como o pr i nt f ( ) e o scanf ( ) ) so oferecidas como
parte da biblioteca da linguagem C. Descreveremos, nesta seo, como que o
programador pode especificar e usar suas prprias funes.

O programador pode definir quantas funes desejar em seus programas e
cham-las de dentro de qualquer funo que queira. No h qualquer restrio de ordem
ou hierarquia na definio das funes para o programador.

O uso de uma funo passa por duas etapas. Na primeira ns definimos a funo.
Nesta fase ns devemos declarar seu prottipo no cabealho do programa e definir a
funo relacionando os comandos que fazer sua implementao.

O prottipo da funo corresponde a sua declarao. Deste modo, informa ao
compilador o seu nome, o tipo de dado que retorna (caso retorne algum) e que tipo de
parmetros ele recebe (caso receba algum).

Na segunda fase ns a executamos. Uma vez definida a funo, esta pode ser
chamada de diferentes pontos do programa. Este um dos motivos para se utilizar
funes, pois deste modo economiza-se espao de memria.

Contudo, mesmo que seja para se chamar uma funo apenas de um ponto do
programa, vale a pena utilizar-se de funes para implementar trechos de programa pois
isto torna o programa mais estruturado e modular.

Introduo linguagemC
Rodolfo Riyoei Goya
37 de 62
Por exemplo, um programa que faa o seguinte:

leia uma lista de nmeros
ordene os nmeros
encontre sua mdia
desenhe um histograma

Pode ser feito do seguinte modo:

mai n( )
{
l ei aLi st a( ) ;
or denaLi st a( ) ;
f azMedi a( ) ;
f azHi st ogr ama( ) ;
}


Onde o programador decompe sua tarefa em tarefas mais simples.


Introduo linguagemC
Rodolfo Riyoei Goya
38 de 62
5.1. Funes simples

A estrutura para definir uma funo simples est descrita abaixo:

voi d nome( ) ; / * Pr ot ot i po. */

mai n( )
{
.
.
nome( ) ; / * Chamada da f uno. */
.
nome( ) ; / * Chamada da f uno. */
.
nome( ) ; / * Chamada da f uno. */
.
.
}

voi d nome( ) / * Def i ni o da f uno. */
{
.
.
}

Na declarao da funo (prottipo) o nome "voi d" define que a funo no
retorna dado de nenhum tipo. Especificamos o nome da funo (nome) e que no se
utiliza de parmetros.

A cada chamada da funo ela executada. Na definio da funo, so
relacionados os comando que a compe. Por exemplo:

#i ncl ude <st di o. h>

voi d separ ador ( ) ; / * Pr ot ot i po da f uncao. */

mai n( )
{
separ ador ( ) ; / * Chamada da f uncao. */
pr i nt f ( "EU GOSTO DE LI NGUAGEM C\ n" ) ;
pr i nt f ( "Depar t ament o de Engenhar i a\ n" ) ;
separ ador ( ) ; / * Chamada da f uncao. */
}

voi d separ ador ( ) / * Def i ni cao da f uncao. */
{
i nt i ;

f or ( i = 1; i <= 60; i ++ )
pr i nt f ( "%c" , ' *' ) ;
pr i nt f ( "\ n" ) ;
}


Introduo linguagemC
Rodolfo Riyoei Goya
39 de 62
5.2. Funes que retornam um valor

Podem-se definir funes que retornam valores. Para tanto basta declarar a
funo com o tipo de dado que se deseja retornar (diferente do tipo voi d, usado quando
no se deseja retornar dados) e terminar a execuo da funo com o comando r et ur n,
conforme a estrutura descrita abaixo:

t i po nome( ) ; / * Pr ot ot i po. */

mai n( )
{
t i po a, b, c;
.
.
a = nome( ) ; / * Chamada da f uno. */
.
b = nome( ) ; / * Chamada da f uno. */
.
c = nome( ) ; / * Chamada da f uno. */
.
.
}

t i po nome( ) / * Def i ni o da f uno. */
{
.
.
.
r et ur n x;
}


Na estrutura acima, o tipo pode ser qualquer um dos existentes para a linguagem
C (i nt , char , f l oat , etc) e o comando r et ur n que aparece na definio da funo faz
com que seja o valor da expresso representada por x seja avaliado e este valor
retornado para o ponto onde a funo foi chamada.

Introduo linguagemC
Rodolfo Riyoei Goya
40 de 62
Por exemplo:

#i ncl ude <st di o. h>

char get _numer o( ) ; / * Pr ot ot i po da f uncao. */

mai n( )
{
char a;

pr i nt f ( "Tecl e umdi gi t o numer i co: " ) ;
a = get _numer o( ) ; / * Chamada da f uncao. */
pr i nt f ( "O codi go do di gi t o t ecl ado ( %c) eh: %d\ n" , a, a ) ;
}

char get _numer o( ) / * Def i ni cao da f uncao. */
{ / * Le o t ecl ado at e o usuar i o t ecl ar umcar act er numer i co. */
char a;

whi l e ( 1)
swi t ch ( a = get ch( ) )
{
case ' 0' :
case ' 1' :
case ' 2' :
case ' 3' :
case ' 4' :
case ' 5' :
case ' 6' :
case ' 7' :
case ' 8' :
case ' 9' : r et ur n a;
def aul t :
}
}


Introduo linguagemC
Rodolfo Riyoei Goya
41 de 62
5.3. Uso de argumentos em funes

Podem ser definidas funes que recebem argumentos ao serem chamadas. Os
argumentos so passados dentro dos parnteses colocados aps o nome da funo. No
momento em que a funo chamada, os valores colocados nos parnteses substituem
os declarados na definio da funo, de modo que a funo pode utiliz-los.

Por exemplo:

#i ncl ude <st di o. h>

voi d bar r a( i nt ) ; / * Pr ot ot i po da f uncao. Recebe umpar amet r o. */

mai n( )
{
pr i nt f ( "Resul t ado f i nal do campeonat o: \ n" ) ;
pr i nt f ( "Goya\ n" ) ;
bar r a( 35 ) ; / * Chamada da f uncao. */
pr i nt f ( "Ul i sses\ n" ) ;
bar r a( 31 ) ; / * Chamada da f uncao. */
pr i nt f ( "J ul i o\ n" ) ;
bar r a( 22 ) ; / * Chamada da f uncao. */
}

voi d bar r a( i nt t amanho ) / * Def i ni cao da f uncao. */
{
i nt i ;

f or ( i = 1; i <= t amanho; i ++ )
pr i nt f ( "%c" , ' =' ) ;
pr i nt f ( "\ n\ n" ) ;
}

No exemplo, a funo bar r a( ) foi definida com um parmetro denominado de
tamanho. A cada vez que a funo foi chamada, o valor do tamanho foi substitudo (por
35, 31 e 22 para cada chamada no programa acima).


Introduo linguagemC
Rodolfo Riyoei Goya
42 de 62
5.4. Funes e variveis globais

Os comandos de declarao executados no interior de funes definem variveis
cuja validade se restringe ao interior da funo e por isso so invisveis para outras
funes. Tais variveis so denominadas de locais e nos permitem definir variveis com
o mesmo nome, mas com diferentes usos em diferentes funes.

Contudo, podem-se declarar variveis que sejam visveis e modificveis por
todas as funes do programa sem que seja necessrio pass-las como parmetro para
todas as funes. Tais variveis so ditas "globais" ou "externas".

O uso de variveis globais irrestrito. Contudo, o uso indiscriminado de
variveis globais perigoso. Torna o programa difcil de modificar e corrigir. Como so
visveis por todas as funes do programa, esto sujeitas a modificao por qualquer
uma delas e, alm disso, usam a memria de modo menos eficiente que o usado com
variveis locais.

Por exemplo:

#i ncl ude <st di o. h>

voi d i mpar ( ) ; / * Pr ot ot i po. Test a se Numer o eh I mpar */
voi d negat i vo( ) ; / * Pr ot ot i po. Test a se Numer o eh Posi t i vo */

i nt numer o; / * Var i avel gl obal . */

mai n( )
{
pr i nt f ( "Tecl e umnumer o: " ) ;
scanf ( " %d", &numer o ) ;
i mpar ( ) ;
negat i vo( ) ;
}

voi d i mpar ( )
{
i f ( numer o %2 ) / * Mani pul a uma var i avel gl obal . */
pr i nt f ( "O numer o eh i mpar . \ n" ) ;
el se
pr i nt f ( "O numer o eh par . \ n" ) ;
}

voi d negat i vo( )
{
i f ( numer o >= 0 ) / * Mani pul a uma var i avel gl obal . */
pr i nt f ( "O numer o eh posi t i vo. \ n") ;
el se
pr i nt f ( "O numer o eh negat i vo. \ n") ;
}


Introduo linguagemC
Rodolfo Riyoei Goya
43 de 62
6. Vetores e Strings

Vetores e strings so nomes dados a arranjos de variveis onde diversas
variveis de um mesmo tipo e formando um conjunto so tratados coletivamente.

Os vetores so declarados conforme a estrutura abaixo:

t i po nome[ t amanho] ;


Onde o tipo e o nome seguem as regras j conhecidas para declarao de
variveis e o tamanho nos d o nmero de elementos que compem o conjunto.

Exemplo:

#i ncl ude <st di o. h>

mai n( )
{
f l oat soma;
f l oat t emper at ur a[ 7] ;
i nt i ;

f or ( i = 0; i < 7 ; i ++ )
{
pr i nt f ( "Ent r e coma t emper at ur a do di a %d: " , i ) ;
scanf ( " %f ", &t emper at ur a[ i ] ) ;
}

f or ( soma = 0, i = 0; i < 7 ; i ++ )
soma += t emper at ur a[ i ] ;

pr i nt f ( "Temper at ur a medi a eh de %f : ", soma / 7 ) ;
}


importante notar que, na linguagem C, todos os vetores tm sua numerao
iniciando em 0 (ou seja, no exemplo acima, o vetor contm posies cuja enumerao
vai de 0 a 6).


Introduo linguagemC
Rodolfo Riyoei Goya
44 de 62
6.1. Iniciando os dados em um vetor

Os dados contidos em um vetor podem ser inicializados diretamente na sua
declarao. Por exemplo:

i nt di as_por _mes[ 12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

Inicia um vetor de 12 posies com cada posio contendo o nmero de dias que
o ms tem.

Ao iniciarem-se os dados de um vetor no necessrio definir o tamanho do
vetor:

f l oat pr ecos[ ] = {20. 1, 12. 5, 8. 8, 6. 9, 13. 5};

O compilador esperto o suficiente para contar o nmero de elementos
utilizados na definio e criar um vetor do tamanho apropriado.

Contudo, o uso de inicializao de vetores restrito a variveis globais, no
podendo ser usado em variveis locais.


Introduo linguagemC
Rodolfo Riyoei Goya
45 de 62
6.2. Vetores de duas ou mais dimenses

Em linguagem C podemos definir vetores de duas dimenses:

i nt t abul ei r o[ 8] [ 8] ;

Ou mais dimenses:

i nt cubo[ 3] [ 2] [ 4] ;

Todas as consideraes feitas para vetores valem para os vetores multi-
dimensionais. Um aspecto importante o da iniciao de um vetor multidimensional.
Neste caso, a lista de valores empregada para a inicializao deve ser construda de
modo que o ndice da direita varia mais rapidamente que o ndice da esquerda.

Por exemplo:

i nt Cubo[ 3] [ 2] [ 4] =
{ { { 1, 2, 3, 4},
{ 5, 6, 7, 8} },
{ { 9, 10, 11, 12},
{13, 14, 15, 16} },
{ {17, 18, 19, 20},
{21, 22, 23, 24} } };

Os valores 3, 2 e 4 so desnecessrios para especificar o tamanho do vetor.
Foram colocados para maior clareza do que ocorre no exemplo. Por ele, notamos que a
posio Cubo[2][1][0] foi inicializada com o valor 21.
Introduo linguagemC
Rodolfo Riyoei Goya
46 de 62
6.3. Passando vetores como parmetro de funes

Para passar um vetor como parmetro de uma funo, basta definir em seu
prottipo e cabealho a especificao do tipo com o uso dos colchetes:

i nt maxi mo( i nt [ ] , i nt ) ; / * Pr ot ot i po de maxi mo. */

No prottipo do exemplo, a funo definida retorna um valor inteiro e tem dois
parmetros. O primeiro parmetro um vetor e o segundo um inteiro.

Por exemplo, para o prottipo acima, podemos escrever a seguinte funo:

i nt maxi mo( i nt [ ] l i st a, i nt t amanho )
{
i nt t est e;
i nt i ;

t est e = l i st a[ 0] ;

f or ( i = 0; i < t amanho; i ++ )
i f ( l i st a[ i ] > t est e )
t est e = l i st a[ i ] ;

r et ur n t est e;
}


Introduo linguagemC
Rodolfo Riyoei Goya
47 de 62
6.4. Strings

Strings so um caso particular de vetor, so vetores de caracteres. Os strings so
utilizados para a manipulao de textos tais como palavras, nomes e frases.

Constantes contendo strings normalmente so definidas na forma de textos entre
aspas: "EU GOSTO DE C".

Variveis contendo strings so declaradas na formas de vetores de variveis de
tipo char :

char nome[ 20] ;

Contudo, a inicializao de strings pode ser facilitada pelo compilador.

char cumpr i ment o[ 20] = " BomDi a" ;

Todo string acaba por representar um bloco de dados em memria onde, em cada
posio, colocado o cdigo correspondente a um caracter do string. Aps o ltimo
caracter do string, colocado um valor 0 sinalizando o trmino do string. (Este formato
de string conhecido como ASCIIZ ASCII seguido de um zero).

De fato, a inicializao acima equivalente inicializao descrita abaixo:

char cumpr i ment o[ ] = {' B' , ' o' , ' m' , ' ' , ' D' , ' i ' , ' a' , ' \ 0' };

Onde o '\0' corresponde ao valor zero que indica o final do string.


Introduo linguagemC
Rodolfo Riyoei Goya
48 de 62
6.5. Funes de manipulao de strings

Vamos ver, nesta seo, como so algumas funes para manipulao de strings:

Para manipular strings, as funes scanf ( ) e pr i nt f ( ) dispem de um
especificador de formato apropriado: %s.

char nome[ 20] = "Pr ogr ama Test e. C"

pr i nt f ( "Nome at ual : %s\ n" , nome ) ;
pr i nt f ( "Ent r e comnovo nome: " ) ;
scanf ( " %s", nome ) ;

O uso do especificador de formato (%s) muito semelhante ao usado para outros
tipos de dados. Com relao funo scanf ( ) uma diferena importante surge pois a
varivel surge sem o smbolo & e isto se deve ao fato de que a linguagem C
subentende que o uso do nome de um vetor ou string sem o ndice significa que o valor
indicado o seu endereo.

De fato nome equivalente a &nome[ 0] .

Alm do scanf ( ) e pr i nt f ( ) existem mais duas outras funes apropriadas
para manipulao de strings: get s( ) e put s( ) . Seu uso bastante simples:

put s( "Ent r e comseu nome: " ) ;
get s( Nome ) ;
put s( "Como vai " ) ;
put s( Nome ) ;

Como pode ser visto, as funes get s( ) e put s( ) movimentam strings entre
variveis e tela de modo bastante simples.


Introduo linguagemC
Rodolfo Riyoei Goya
49 de 62
7. Ponteiros

Outro tipo de dado presente na linguagem C o ponteiro (pointer). Neste tipo de
dado manipula-se no um valor, mas sim um endereo. Os valores so armazenados em
memria. Deste modo, variveis distintas so armazenados em diferentes posies de
memria. A cada posio corresponde um endereo diferente e nico.

Um ponteiro proporciona um meio de acesso a uma varivel sem referenciar esta
varivel diretamente.

Ponteiros so empregados principalmente para retornar mais de um valor de uma
funo e para passar vetores e strings de ou para uma funo.

O comando de declarao para uma varivel do tipo ponteiro tem a estrutura
abaixo:

t i po *nome;

Onde o tipo e o nome seguem as regras para definio j conhecidas. O que
especifica que a varivel de tipo ponteiro o asterisco colocado na frente do nome.

O uso de variveis de tipo ponteiro bastante simples:

i nt x, y;
i nt *px, *py;

x = 1; / * at r i bui var i vel x o val or 1. */
y = 2; / * at r i bui var i vel y o val or 2. */
px= &x; / * at r i bui ao pont ei r o px o ender eco da var i avel x. */
py= &y; / * at r i bui ao pont ei r o py o ender eco da var i avel y. */

O significado das atribuies acima bastante simples. O operador & um
operador unrio que retorna o endereo de seu operando. Assim, podemos manipular o
endereo apontado por uma varivel de tipo ponteiro.

Introduo linguagemC
Rodolfo Riyoei Goya
50 de 62
Outro operador importante o operador * que indica o valor contido em uma
posio de memria apontada por uma varivel de tipo ponteiro.

Por exemplo:

i nt x, y;
i nt *px, *py;

x = 1; / * at r i bui var i vel x o val or 1. */
y = 2; / * at r i bui var i vel y o val or 2. */

px = &x; / * at r i bui ao pont ei r o px o ender eco da var i avel x. */
py = &y; / * at r i bui ao pont ei r o py o ender eco da var i avel y. */

pr i nt f ( "O ender eco de x eh %d e o val or de x eh %d" , px, *px ) ;

onde o *px significa, literalmente, o valor da posio de memria apontado por px.


Introduo linguagemC
Rodolfo Riyoei Goya
51 de 62
7.1. Ponteiros e funes

Um dos usos mais apropriados para variveis de tipo ponteiro o de passar mais
de um parmetro de retorno para funes. O modo como este mecanismo
implementado descrito abaixo:

voi d t r oca( i nt *px, i nt *py ) ; / * Pr ot ot i po. */

mai n( )
{
i nt x = 4, y = 7;

/ *
* Ao chamar a f uncao passamos o ender eco
* das var i avei s x e y como par amet r o.
*/
pr i nt f ( "x val e %d e y val e %d\ n", x, y ) ;
t r oca( &x, &y ) ;
pr i nt f ( "x val e %d e y val e %d\ n", x, y ) ;
}

voi d t r oca( i nt *px, i nt *py )
/ * Tr oca os val or es das var i avei s apont adas por px e py. */
{
i nt n;

n = *px;
*py = *px;
*px = n;
}

Ao examinarmos a funo, verificamos que houve manipulao nos valores das
posies cujos endereos foram passados como parmetro. Deste modo que
conseguimos implementar funes cuja ao estendido a mais de uma varivel (ou
seja, retorna mais de um valor).


Introduo linguagemC
Rodolfo Riyoei Goya
52 de 62
7.2. Ponteiros e vetores

Ponteiros tambm oferecem meios bastante convenientes para manipulao de
vetores. Por exemplo, o programa abaixo utiliza ponteiros para percorrer um vetor:

mai n( )
{
i nt n[ 20] ;
i nt *p;
i nt i ;
i nt soma;

f or ( i = 0, p = n, soma = 0; i < 20; i ++; p++ )
soma += *p;
}

No exemplo, o programa percorre todo o vetor, acumulando a soma de seus
elementos na varivel soma. Um detalhe importante do exemplo a operao p++
dentro do comando for. Dado que o a varivel p foi definida como um ponteiro para um
inteiro, p++ significa que o endereo contido em p foi acrescido de uma quantidade que
corresponde ao nmero de posies de memria ocupadas pela varivel do tipo
especificado quando da declarao do ponteiro (o que equivale a dizer que, aps o
incremento, p passa a apontar para a prxima posio dentro do vetor).

Outro aspecto importante o de como as variveis de tipo ponteiro so
aplicveis para a passagem de vetores como parmetros para funes. Ao se passar um
ponteiro para um vetor como parmetros para uma funo, trabalhamos sobre a mesma
instncia dos dados do vetor, ou seja, no criamos uma cpia dos dados para uso dentro
da funo.


Introduo linguagemC
Rodolfo Riyoei Goya
53 de 62
7.3. Ponteiros e strings

Ponteiros tambm oferecem meios bastante convenientes para manipulao de
strings. Por exemplo, o programa abaixo utiliza ponteiros para percorrer um string:

mai n( )
{
char f r ase[ 20] ;
i nt *p;
i nt cont char ;
i nt cont spaces;

p = f r ase; / * p apont a par a o i ni ci o da f r ase. */
cont char = cont spaces = 0;
whi l e ( ! *p ) / * Umst r i ng t er mi na comumval or 0. */
{
i f ( *p == ' ' )
cont spaces++;
cont char ++;
p++;
}
}


No exemplo, o programa percorre todo o string, contando o nmero de espaos
em branco e caracteres presentes nele. No final de um string sempre encontramos o
valor 0.


Introduo linguagemC
Rodolfo Riyoei Goya
54 de 62
8. Arquivos

A linguagem C oferece em sua biblioteca uma srie de funes prprias para
manipulao de dados guardados em disco (sejam os chamados discos removveis ou
disquetes ou os chamados discos fixos ou rgidos). Nestes tipos de meio, os dados so
guardados em blocos denominados de arquivos.

Como os dados guardados em arquivos tm caracterstica de persistncia (sua
durao se estende alm da execuo do prprio programa e sobrevive ao desligamento
e religamento da mquina), a manipulao de arquivos apropriada para manuseio e
manuteno de bancos de dados entre outras aplicaes.

Existem, basicamente, dois tipos de entrada/sada para disco: o chamado modo
texto (ou modo padro) e o modo binrio. Ambos os modos sero descritos nas sesses
seguintes.


8.1. Fases na manipulao de arquivos

Ambos os modos de acesso a arquivos passam por trs etapas: abertura,
manipulao (leitura ou escrita) e fechamento.

Na fase de abertura, o programa especifica o nome do arquivo que se deseja
manipular, o tipo de entrada/sada a ser efetuado (se no tipo texto ou binrio) e se o
acesso vai ser de leitura ou escrita.

Na fase de manipulao, o programa pode enviar dados para o disco (escrita em
arquivo) ou receber dados vindos do disco (leitura de arquivo).

No fechamento, o programa informa ao sistema operacional que concluiu o uso
do arquivo. Nesta fase qualquer dado que esteja em buffer na memria finalmente
escrito no disco.


Introduo linguagemC
Rodolfo Riyoei Goya
55 de 62
8.2. Entrada/Sada padro

A linguagem C oferece uma srie de funes para manipulao de arquivos.

Para a manipulao de arquivos, usam-se as funes abaixo:

fopen Abre arquivo.
fclose Fecha arquivo.
fcloseall Fecha todos os arquivos abertos.
ferror Sinaliza o status atual do arquivo.
perror Imprime mensagem de erro.

As funes para manipulao de entrada e sada no modo padro so
relacionadas abaixo:

putc Escreve caracter em arquivo.
getc L caracter de arquivo.
fputs Escreve string em arquivo.
fgets L string de arquivo.
fprintf Escreve formatado em arquivo.
fscanf L formatado de arquivo.
fwrite Escreve bloco em arquivo.
fread L bloco de arquivo.

O controle de acesso ao arquivo pode ser realizado com as funes abaixo:

fgetpos Indica a posio do ponteiro de acesso ao arquivo.
fseek Posiciona o ponteiro de acesso em local desejado.
rewind Posiciona o ponteiro de acesso no incio do arquivo.
fflush Descarrega o stream para o arquivo em disco.
flushallf flush para todos os arquivos abertos.
feof Indica se o ponteiro do arquivo atingiu o final.


Introduo linguagemC
Rodolfo Riyoei Goya
56 de 62
8.2.1. Abertura de arquivo

A abertura de arquivo um procedimento de comunicao entre o programa e o
sistema operacional. Ela necessria para que o sistema verifique o acesso ao arquivo,
onde ele est localizado, qual o tipo de acesso desejado e definir as reas de buffers
necessrias para a operao do arquivo.

Para abrirmos um arquivo, necessrio declarar-se uma varivel de tipo ponteiro
para arquivo com o comando:

FI LE *ar qui vo;

Onde arquivo um nome de identificador para a varivel. De posse da varivel,
a abertura pode ser efetuada com o seguinte procedimento:

ar qui vo = f open( " NOME. EXT", Codi goDeAcesso ) ;

O "NOME.EXT" o nome do arquivo a ser aberto. Est localizado no diretrio
atual e no procurado no path. Se estiver em outro disco ou diretrio deve ser
especificado por completo (pro exemplo: "C:\\QC25\\SOURCE\\EXEMPLO.TXT").

O cdigo de acesso um dentre seis possveis strings:

"r "
Aberto para leitura. O arquivo j deve existir. Se no existir devolve NULL.

"w"
Aberto para escrita. Se o arquivo j existe seu contedo perdido. Se no, um
arquivo novo criado.
"a"
Append: Se o arquivo j existe, ele aberto para escrita aps o final. Se no, um
arquivo para escrita novo criado.
"r +"
Aberto para leitura e escrita. O arquivo j deve existir. Se no existir devolve
NULL.
"w+"
Aberto para leitura e escrita. Se o arquivo j existisse seu contedo original
perdido.
"a+"
Abertura para leitura e escrita no final. Se o arquivo no existisse seria criado.


No caso de ocorrem um erro na operao de abertura de arquivo, a funo
retorna com o valor NULL.


Introduo linguagemC
Rodolfo Riyoei Goya
57 de 62
8.2.2. Fechamento de arquivo

O fechamento de um arquivo feito atravs da funo f cl ose( ) ou
f cl oseal l ( ) na forma abaixo:

f cl ose( ar qui vo ) ;
f cl oseal l ( ) ;

No primeiro caso fechado um arquivo especfico. No segundo todos os
arquivos que estejam abertos.


8.2.3. Mensagem de erro

A ocorrncia de erro pode ser testada com o uso da funo f er r or ( ) . Caso
ocorra algum erro ela retorna um valor no nulo. A funo per r or ( ) imprime uma
mensagem de erro com um string dado pelo usurio e a mensagem correspondente ao
erro ocorrido vinda do sistema:

i f ( f er r or ( ar qui vo ) )
per r or ( " O er r o ocor r i do f oi " ) ;


Introduo linguagemC
Rodolfo Riyoei Goya
58 de 62
8.2.4. Entrada e sada de caracteres e strings para arquivos

As funes bsicas de entrada e sada de caracteres em arquivos so get c( ) e
put c( ) e so usadas da seguinte forma:

put c( ch, ar qui vo ) ;
ch = get c( ar qui vo ) ;

Com ch de tipo char ou i nt . (Como i nt pode-se usar o fato de que a funo
retorna o valor EOF (-1) caso o arquivo tenha chegado ao final) e arquivo de tipo
ponteiro para arquivo com endereo de arquivo j aberto.

As funes para entrada e sada de strings so usadas conforme descrito abaixo:

f get s( st r i ng, ar qui vo ) ;
f put s( st r i ng, ar qui vo ) ;

Com string como ponteiro para caracter e arquivo como ponteiro para arquivo
apontando para arquivo j aberto.


8.2.5. Entrada e sada formatada para arquivos

Para entrada e sada formatada para arquivos usamos as funes f pr i nt f ( ) e
f scanf ( ) . O uso destas funes idntico ao empregado para console (pr i nt f ( ) e
scanf ( ) ) com acrscimo para a identificao do arquivo em acesso:

f pr i nt f ( ar qui vo, especi f i cador de f or mat o, l i st a de var i vei s ) ;
f scanf ( ar qui vo, especi f i cador de f or mat o, l i st a de var i vei s ) ;


Introduo linguagemC
Rodolfo Riyoei Goya
59 de 62
8.2.6. Entrada e sada de blocos de dados com arquivos

As funes f r ead( ) e f wr i t e( ) podem ser usadas para leitura e escrita de
blocos de dados para arquivos. Seu formato de uso est descrito abaixo:

f r ead( pont ei r o, numer o de i t ens, t amanho do i t em, ar qui vo ) ;
f wr i t e( pont ei r o, numer o de i t ens, t amanho do i t em, ar qui vo ) ;

Onde o ponteiro o endereo inicial na memria onde vai ser colocado o dado
lido ou de onde vem o dado a ser escrito, o nmero de itens especifica a quantidade de
dados a serem movidos e o tamanho do item especifica o nmero de bytes para
representar cada item (1 para char , 4 para i nt e assim por diante) e arquivo um
ponteiro para arquivo apontando para um arquivo aberto.

Com o uso de f r ead( ) e f wr i t e( ) pode-se escrever estruturas complexas tais
como vetores e vetores de strings em disco com um acesso bastante simplificado.


8.3. O controle de ponteiro de acesso a arquivos

A funo f get pos( ) devolve a posio do ponteiro de acesso ao arquivo.
utilizada do seguinte modo:

posi cao = f get pos( ar qui vo ) ; / * Onde ar qui vo umpont ei r o par a um
ar qui vo aber t o. */

A funo f seek( ) posiciona o ponteiro de acesso em local desejado. utilizada
do seguinte modo:

f seek( ar qui vo, desl ocament o, posi cao ) ;

Onde o arquivo o ponteiro para o arquivo aberto, o deslocamento a distncia
(em uma varivel tipo l ong) em relao posio especificada. Para especificar a
posio so possveis trs valores: SEEK_SET para o incio do arquivo, SEEK_CUR
para a posio atualmente apontada e SEEK_END para o final do arquivo. O
deslocamento pode ser positivo ou negativo.

A funo r ewi nd( ) posiciona o ponteiro de acesso no incio do arquivo. Uso:

r ewi nd( ) ;

Introduo linguagemC
Rodolfo Riyoei Goya
60 de 62
As funes f f l ush( ) (descarrega o stream para o arquivo em disco) e
f f l ushal l ( ) (descarrega o contedo de todos os arquivos abertos para os seu
respectivos arquivos em disco) controlam os buffers em memria permitindo assegurar
a integridade dos dados gravados em arquivo para o caso do programa ser terminado por
alguma razo exepcional. Uso:

f f l ush( ar qui vo ) ;
f f l ushal l ( )

A funo f eof ( ar qui vo ) indica, com um valor retornado no nulo, que o
ponteiro do arquivo atingiu o final.

f eof ( ar qui vo ) ;

Introduo linguagemC
Rodolfo Riyoei Goya
61 de 62
9. Estruturas

Estruturas (struct) so ferramentas da linguagem C que permitem que o
programador defina tipos de variveis que so o agrupamento de variveis (como nos
vetores), mas com diferentes tipos.

Por exemplo, suponha que um determinado programa necessite em sua estrutura
de dados de uma entidade para armazenar o nome (um vetor de caracteres), nmero do
departamento (um inteiro) e o salrio (um nmero em ponto flutuante) de um
funcionrio. So dados de tipos diferentes e poderia ser necessrio criar vetores com
estas estruturas.

Para tal a linguagem C definiria uma estrutura como a abaixo:

st r uct f i chaTi po / * Def i ni cao da est r ut ur a. */
{
char nome[ 40] ;
i nt dept o;
doubl e sal ar i o;
}

st r uct f i chaTi po f i cha; / * Decl ar acao da var i avel . */

O uso da varivel bastante simples.

f i cha. dept o = 1;
f i cha. sal ar i o = 12000. 0;

Estruturas podem formar vetores:

st r uct f i chaTi po f i char i o[ 1000] ;


Ponteiros para estruturas tambm podem ser definidos.

st r uct f i chaTi po *pf i cha;

Para identificar o elemento da estrutura apontado por um ponteiro deste tipo
usamos outro operador: ->

Depar t ament o = pf i cha- >dept o;


Introduo linguagemC
Rodolfo Riyoei Goya
62 de 62
Bibliografia


Barkakati, N. - The Waite Group's Microsoft C Bible
Howard W. Sams & Co

uma referncia completa. Prpria para um guia de consulta para
programadores que trabalhem com a linguagem C. Contm uma relao e descrio
extensa das funes de biblioteca oferecidas pela linguagem incluindo um guia de
compatibilidade com outras verses de compiladores, com a verso C do sistema UNIX
e com o padro ANSI. Descreve, com exemplos, o uso das funes. No muito
apropriado para iniciantes ou pessoas que desejam se um livro para o aprendizado da
linguagem.


Waite, M. e Prata, S. - The New Waite Group's C Primer Plus
Howard W. Sams & Co

um livro didtico da melhor qualidade. Apresenta conceitos e filosofias
prprias da linguagem C de forma simples e repleta de exemplos.


Jansa, K. - Microsoft C. Dicas, Segredos e Truques.
Makrom Books

um livro muito bom. Em portugus, constitui-se em um guia muito bom para
iniciantes. Introduz o programador de uma forma didtica inclusive apresentando dicas
e os erros mais frequentemente cometidos por programadores iniciantes. Sua falha mais
importante concentrar-se principalmente na linguagem C da Microsoft sem comparar
com outras implementaes e dedicar espao em excesso aos detalhes especficos ao
IBM-PC.

Swan, T. Tecle e Aprenda C