You are on page 1of 46

Linguagem C

ndice
1 Conceitos preliminares .......................................................................................................................1
1.1 Microcomputadores padro Intel x86 ..........................................................................................1
1.2 Modos de memria nos microcomputadores ..............................................................................3
1.3 O sistema operacional.................................................................................................................3
2 Introduo a Linguagem C .................................................................................................................4
2.1 Caractersticas principais.............................................................................................................4
2.2 Estrutura de um programa em C .................................................................................................5
2.3 Palavras reservadas em C ..........................................................................................................5
2.4 Variveis e constantes .................................................................................................................6
2.5 Operadores ..................................................................................................................................7
2.6 Expresses.................................................................................................................................11
2.7 Comentrios ...............................................................................................................................12
3 Estruturas de controle de fluxo .........................................................................................................12
3.1 Operadores relacionais e lgicos ..............................................................................................12
3.2 Estruturas de deciso ................................................................................................................14
3.3 Estruturas repetitivas.................................................................................................................15
3.4 Comandos bsicos de entrada e sada.....................................................................................17
4 Construindo programas em C ..........................................................................................................18
4.1 Comandos do pr-processador .................................................................................................18
4.2 Construes e uso de funes ..................................................................................................20
4.3 Construo de funes de diversos tipos .................................................................................22
4.4 Classe de armazenamento de funes e variveis ..................................................................24
4.5 Programas com mltiplos arquivos ...........................................................................................26
5 Tipos avanados de dados em C.....................................................................................................27
5.1 Vetores e Strings ........................................................................................................................27
5.2 Matrizes......................................................................................................................................28
5.3 Estruturas...................................................................................................................................29
5.4 Unies ........................................................................................................................................30
5.5 Enumeraes.............................................................................................................................31
6 Trabalhando com Ponteiros (Apontadores) .....................................................................................31
6.1 Vetores e Matrizes como ponteiros ...........................................................................................31
6.2 Ponteiros de estruturas..............................................................................................................32
6.3 Aritmtica de ponteiros..............................................................................................................32
7 Trabalhando com arquivos: ..............................................................................................................32
7.1 Exemplo de leitura de caractere de arquivo:.............................................................................33
7.2 Exemplo de gravao de caractere no arquivo:........................................................................34
7.3 Exemplo de leitura de string de caracteres do arquivo: ............................................................34
7.4 Exemplo de gravao de string em arquivo: .............................................................................34
7.5 Exemplo de leitura de arquivo formatada: .................................................................................35
7.6 Exemplo de gravao formatada em arquivo: ..........................................................................35
8 Apndice (Biblioteca de funes) .....................................................................................................36
8.1 Funes de entrada e sada padro (stdio.h): ..........................................................................36
8.2 Funes de Testes de Tipos (ctype.h) ......................................................................................39
8.3 Funes de Cadeias de Caracteres (string.h) ..........................................................................40
8.4 Funes Matemticas (math.h) .................................................................................................40
8.5 Funes utilitrias (stdlib.h) .......................................................................................................42
8.6 Funes de Data e Hora (time.h) ..............................................................................................43
8.7 Funes de Entrada e Sada acessrias (conio.h) ...................................................................44

Programao em Linguagem C

1 CONCEITOS PRELIMINARES
Este captulo visa mostrar alguns conceitos bsicos, que so de grande importncia para
quem pretende se tornar um programador em linguagem C e trabalhar sob a plataforma Intel x86. O
estudo de uma linguagem de programao no est ligada, na maioria das vezes, ao equipamento
com o qual se est trabalhando. Entretanto, existem diferentes implementaes para uma mesma
linguagem, disponveis para determinadas plataformas de trabalho. Neste curso, trabalhamos com as
estruturas de linguagem C que esto disponveis nas diversas implementaes, mas iremos utilizar a
plataforma Intel x86 com sistemas operacionais baseados na famlia Windows 9x (ou MSDOS).
Este fato alterar os recursos disponveis para o desenvolvimento de sistemas, no a
estrutura da linguagem em si, desta forma, sero mostrados alguns conceitos bsicos de Hardware e
Software de baixo nvel, nessa plataforma.

1.1 MICROCOMPUTADORES PADRO INTEL X86


Arquitetura Interna
Os equipamentos compatveis com o padro Intel x86 possuem uma arquitetura interna
semelhante, que permite a compatibilidade, se desejado, entre os diversos modelos de
processadores desde um PC-XT at os PCs-AT do 386 at os processadores de nova gerao.
Internamente, os microprocessadores possuem algumas variveis, chamadas de
registradores, que so utilizadas pelas suas instrues a fim de obterem dados para processa-las ou
para armazenarem resultados de instrues processadas. Existem vrios tipos de registradores: os
de uso geral, os registradores de pilha, os registradores de segmento, etc.
Registradores de uso Geral
So utilizados pelos microprocessadores para realizarem as tarefas bsicas, como:
implementar um contador em um ciclo de repetio, armazenar um dado que ser escrito na
memria ou receber um dado lido da memria, armazenar o resultado de uma operao aritmtica,
etc. Os registadores de uso geral so: AX, BX, CX e DX, todos de 16 bits, podendo ser divididos em
dois registradores de 8 bits, chamados de parte menos significativa (L Low) e parte mais
significativa (H High). Ficando: AL e AH, BL e BH, CL e CH, DL e DH.
O registrador AX (AL e AH) chamado de acumulador e o registrador mais utilizado no
processamento de instrues.
Registradores de segmento e Segmentao de Memria
A memria dos microcomputadores do tipo segmentada, ou seja, est dividida em
segmentos ou pginas. Esse recurso foi desenvolvido para permitir a utilizao de mais de 1Mb de
memria, dispondo de registradores de 16 bits.
Existem quatro segmentos, bem definidos, que estaro presentes em qualquer programa,
cada um representado por um registrador de segmento:

Segmento de cdigo (CS) onde so armazenadas as instrues do programa que


sero executadas.
Segmento de dados (DS) onde so armazenados os dados globais ou fixos do
programa (mensagens, por exemplo).
Segmento de pilha (SS) onde so armazenados os dados temporrios de um
programa. A pilha um dispositivo auxiliar que permite o armazenamento de dados
temporariamente, de forma que, os primeiros dados a serem armazenados so os ltimos
a sarem.
Segmento extra ou auxiliar (ES) utilizado como auxiliar do segmento DS para
manipulao de dados na memria.

Pg. 1

Programao em Linguagem C
O registrador de segmento funciona como uma referncia, uma marca de incio, a partir da
qual so alojados dados ou instrues. Um segmento de memria tem um tamanho mximo de
64Kb. Para se poder utilizar ou enderear cada um desses bytes, o registrador de segmento conta
com um registrador auxiliar, que indica a posio o deslocamento ou offset a partir do incio do
segmento. Por exemplo: o segmento de cdigo utiliza o registrador IP, ou ponteiro da pilha, para
indicar a posio de memria em que est o topo da pilha, ou seja, a primeira informao a ser
resgatada.
Desta forma, para podermos utilizar ou enderear a memria temos que trabalhar com um
endereo composto, formado por um segmento (que indica a referncia ou incio) e um offset (que
indica o deslocamento ou distncia em bytes, a partir da referncia).
Quando se quer indicar um endereamento, no IBM-PC, normalmente utiliza-se a notao
hexadecimal do segmento e do offset, separados por dois pontos :. Exemplo: B800:0000, CS:0000,
SS:SP, etc.
Interrupes
Um dos grandes recursos criados nos microcomputadores padro Intel x86 so o de
interrupes, que so as responsveis pela manuteno da compatibilidade entre os diversos
equipamentos existentes no mercado. A interrupo se constitui do desvio da execuo de um
programa para uma outra posio de memria, a fim de ser tratado algum evento ou ser realizada
alguma tarefa especfica, com o retorno, em seguida, para o local onde o processamento foi
interrompido. As interrupes podem ser geradas de duas maneiras: por Hardware, quando algum
dispositivo tiver sido acionado (teclado, placa de comunicao serial, relgio, drives, etc.); ou por
Software, usando-se uma instruo especfica do microprocessador. Em um microcomputador
podemos ter at 256 interrupes.
Quando uma interrupo gerada, feita uma consulta a uma tabela, que fica localizada nos
primeiros 1024 bytes da memria RAM (4 bytes para cada interrupo 2 do segmento e 2 do
offset), de onde lido o endereo de memria para onde o processamento ser desviado. Os
endereos armazenados na tabela so chamados de vetores de interrupes. Muitas dessas
interrupes tem um uso pr-definido, como, por exemplo, a interrupo 05h, que executa a cpia do
contedo do vdeo para a impressora, quando a tecla Print Screen pressionada. Outras ficam em
aberto, para serem utilizadas pelos programas aplicativos.
A grande vantagem de se utilizar interrupes que, para utilizarmos os recursos da mquina
ou do sistema operacional, atravs de interrupes, ser feita uma consulta na tabela de vetores
para se saber qual o endereo de memria para onde o programa deve ser desviado. Desta forma,
se um fabricante quiser alterar as rotinas internas do seu microcomputador ou do seu sistema
operacional, alterando assim o endereo de memria das mesmas, poder faze-lo sem problemas;
basta alterar tambm o contedo da tabela de vetores de interrupo, para manter a compatibilidade.
Interrupes do BIOS nos microcomputadores
Nos microcomputadores existem uma srie de rotinas (BIOS Basic Input Output System)
para manipular os dados (armazenados no CMOS da placa me) dos perifricos conectados a
MotherBoard. Essas rotinas so acessadas atravs de interrupes, chamadas de interrupes do
BIOS, e vo da interrupo 00h e 19h. Uma rotina para tratar ou responder a uma interrupo 10h
permite acesso ao vdeo, possuindo procedimentos de mudana de modo, mudana ou leitura da
posio do cursor, mudana de cor, etc. Cada um desses procedimentos deve ser selecionado antes
da chamada da interrupo e, normalmente, isto feito usando-se o registrador AH. De acordo com
o valor que estiver armazenado em AH, a rotina que responder interrupo ir executar um
procedimento diferente.

Pg. 2

Programao em Linguagem C

1.2 MODOS DE MEMRIA NOS MICROCOMPUTADORES


Todo programa desenvolvido para microcomputadores utiliza os registradores de segmentos
descritos anteriormente. Entretanto, como cada segmento s pode ter at 64Kb, teramos uma
limitao de criar programas como no mximo 64Kb de cdigo e 64Kb de dados fixos. Para
solucionar esse problema, criou-se um artifcio para se construir programas, alterando a forma de se
manusear os registradores de segmento. So os modos de memria destacados abaixo:
Modo SMALL: nesse modo, todos os registradores de segmento apontam para a mesma
posio de memria. Desta forma, o tamanho do programa, somando as suas
interrupes, os dados fixos e a pilha, no podem exceder 64Kb. utilizado para a
construo de programas pequenos e tem a vantagem que, para se manipular os dados,
a pilha e as interrupes s h a necessidade de se alterar o offset, pois os segmentos
so fixos. Isso torna o programa menor e mais rpido.
Modo MEDIUM : nesse modo, o registrador do segmento de dados e o da pilha apontam
para a mesma posio da memria, podendo juntos ocupar at 64Kb. O registrador de
segmento de cdigo no tem valor fixo, podendo ser alterado de acordo com a
necessidade. Normalmente, para cada mdulo de um programa, define-se um valor para o
segmento de cdigo. Desta forma, o conjunto de instrues de um programa pode ocupar
at 1Mb de memria. utilizado para a construo de programas extensos, mas que no
utilizaram uma grande quantidade de dados. Para manipular os dados e a pilha s h
necessidade de se alterar o offset, pois os segmentos esto fixos. Para manipular as
instrues h a necessidade de se alterar tanto o segmento como o offset, deixando o
processamento um pouco mais lento.
Modo LARGE: nesse modo, o registrador de segmentos de dados no tem valor fixo,
podendo ser alterado de acordo com a necessidade. Normalmente, para cada varivel ou
grupo de variveis de um programa, define-se um valor para o segmento de dados. O
registrador de segmento de cdigo no tem valor fixo, podendo ser alterado de acordo
com a necessidade. Normalmente, para cada mdulo de um programa, define-se um valor
para o segmento de cdigo. Desta forma, tanto o conjunto de dados como o conjunto de
instrues de um programa podem ocupar at 1Mb de memria, cada um. utilizado para
a construo de programas extensos, que utilizaram uma grande quantidade de dados.
Para manipular os dados e as instrues h necessidade de se alterar tanto o segmento
quanto o offset, tornando o programa maior e um pouco mais lento.

1.3 O SISTEMA OPERACIONAL


Interrupes do Sistema Operacional
O sistema operacional tambm utiliza interrupes para realizar as suas operaes de baixo
nvel, como: abrir, ler, gravar ou fechar um arquivo, ler ou alterar um vetor de interrupo, acessar o
teclado ou vdeo, etc. As principais interrupes do sistemas operacional esto entre 20h e 24h,
sendo que a interrupo 21h a que permite manipular arquivos e perifricos, sendo a principal
delas (possui mais de 100 funes diferentes).
Dispositivos do Sistema Operacional
O S.O. possui alguns dispositivos padres. So eles: COM (console), que funciona como
entrada (teclado) ou sada (vdeo); COMn, que funciona como entrada e sada atravs da placa de
comunicao serial; PRN, que funciona como a sada para a impressora, sendo a porta padro de
impresso; e LPTn, que funciona como entrada e sada atravs da placa de comunicao paralela.
Estes dispositivos so utilizados pela maioria das linguagens de programao, a fim de
permitirem o acesso aos equipamentos perifricos. Desta forma, cria-se um certa transparncia, pois
sabe-se que se est utilizando um determinado dispositivo de E/S, mas cabe ao sistemas
operacional saber como acionar o equipamento perifrico correspondente ao dispositivo.

Pg. 3

Programao em Linguagem C
Alm disso, essa transparncia ainda permite o redirecionamento dos dispositivos, ou seja,
pode-se redirecionar a sada do console para a impressora, ou vice-versa, por exemplo.
Quando um programa executado sob o Sistema Operacional, este reserva cinco
manipuladores (handles) para o acesso aos seus dispositivos. So eles: STDOUT (sada padro),
STDIN (entrada padro), STDPRN (impressora auxiliar), STDERR (sada padro das mensagens de
erro) e STDAUX (manipulador auxiliar). Qualquer alterao ou configurao feita para esses
dispositivos, atravs de algum comando do S.O. (comando MODE, comando de redirecionamento >
e <, etc.), ser vlida dentro dos programas que os utilizam.
Diviso de memria para o Sistema Operacional
Em microcomputadores padro Intel x86 a memria pode receber algumas denominaes
dependendo de seu tamanho em bytes e da forma como manipulada pelo S.O. Temos ento:
Memria baixa ou principal (LM) possui at 640Kb e onde o S.O. e os aplicativos 16
bits so armazenados e executados (na maioria das vezes).
Memria alta (HMA ou UMB) a parte da memria entre 640Kb e 1Mb, conhecida
como bloco de memria alta. Normalmente, utilizada pelo S.O. para gravar parte de
seus arquivos ou dispositivos instalados e programas residentes. o local onde o
ambiente grfico do Windows executado. Somente fica disponvel se existir a instruo
HIMEM.SYS no arquivo de configurao da mquina.
Memria expandida (EMS) a memria disponvel alm dos 640Kb da memria
principal. Para ser usada necessrio a utilizao de um programa especial chamado de
gerenciador de memria expandida. Esta memria gerenciada sob a forma de pginas
ou blocos.
Memria estendida (XMS) a memria disponvel acima de 1Mb em computadores AT
e posteriores. Esta memria gerenciada de forma contnua e no acessada pela
maioria dos programas do Sistema Operacional, sendo normalmente utilizada pelo
gerenciador de memria expandida para aumentar a quantidade de memria EMS.
importante saber que, num computador com sistemas operacionais 16 bits, os programas
s conseguem se alojar e serem executados na memria principal. A memria EMS utilizada para
o armazenamento provisrio de dados ou de partes do programa executvel. Para isso, o driver de
memria EMS dever estar instalado e o programa dever ser projetado de uma forma que consiga
gerenciar as informaes que sero armazenadas na memria EMS.

2 INTRODUO A LINGUAGEM C
2.1 CARACTERSTICAS PRINCIPAIS
A linguagem C foi criada por Dennis M. Ritchie e Ken Thompson em 1972, nos Laboratrios
Bell, e foi baseada na linguagem B (Thompson), que era uma evoluo da linguagem BCPL.
A linguagem comeou a ter sucesso aps a edio do livro The C Programming Language,
de Brian Kernigham e Dennis M. Ritchie, que descreve todas as caractersticas da linguagem, como
foi projetada inicialmente e deve ser leitura obrigatria para os programadores de C.
Hoje, a linguagem C sofreu modificaes e possui caractersticas de linguagem visual com
embutimento do conceito de Orientao a Objeto, chamada atualmente de C++, ela utilizada no
desenvolvimento de diversos tipos de sistemas, entre eles, planilhas eletrnicas, editores de texto,
gerenciadores de bancos de dados, sistemas de comunicao de dados, etc. Os principais
programas existentes no mercado foram desenvolvidos parcialmente ou totalmente em linguagem C.
A linguagem C permite aos programadores desenvolverem programas estruturados e
modulares; permite a reutilizao de cdigo atravs da construo de bibliotecas; os programas
executveis construdos em C so rpidos e compactos; alm de serem portveis, ou seja, podem
ser transferidos de uma plataforma de trabalho para outra, sem grandes modificaes.

Pg. 4

Programao em Linguagem C
Por exemplo: de um computador com sistema operacional padro Microsoft (Windows 9x)
para uma estao RISC com UNIX. Isto possvel porque os compiladores em Linguagem C so
padronizados, na sua maioria.

2.2 ESTRUTURA DE UM PROGRAMA EM C


Um programa em C constitudo de um ou mais mdulos ou sub-rotinas chamadas de
funes. Uma funo simples em C identificada por um nome, seguido de parntesis (). Para
marcar o incio da funo, usa-se uma chave de abertura {, e para identificar o final da funo usase uma chave de fechamento }. Normalmente, utiliza -se apenas letras minsculas. Exemplo:
nomefc ()
{
}
Todo programa em C dever conter pelo menos uma funo, chamada main(), que significa
principal. atravs da funo main() que o programa ir iniciar. As instrues devem ser escritas
dentro das chaves e finalizadas por um ponto-e-vrgula ;. Espaos em branco so suprimidos pelos
compiladores C. Exe mplo:
main()
{
instrucao1;
instrucao3;

instrucao2;

}
A funo main() tem que ser escrita em letras minsculas, bem como todas as palavras-chave
ou palavras-reservadas da linguagem C. Isto necessrio porque os compiladores C so Case
Sensitive Sensveis ao Caso, isto , eles fazem distino entre palavras escritas em letras
minsculas ou maisculas. Por exemplo: for For FOR.

2.3 PALAVRAS RESERVADAS EM C


As palavras reservadas em linguagem C so:
auto
break
case
char
const
continue
default
do

double
else
enum
extern
float
for
goto
if

int
long
Register
return
short
signed
sizeof
static

struct
switch
typedef
union
insigned
void
volatile
while

Observe que alguns compiladores, que possuem outras implementaes para a linguagem C,
tm outras palavras reservadas. No caso do Turbo C++ podemos destacar:
asm
cdecl
_cs

_ds
far
huge

interrupt
near
pascal

Pg. 5

_seg
_ss

Programao em Linguagem C

2.4 VARIVEIS E CONSTANTES


Em C podemos utilizar variveis e constantes de diversos tipos. Todas devem ser
devidamente declaradas antes de sua utilizao, para permitir que a memria seja corretamente
reservada e para que o compilador as manipule da forma correta.
Tipos de dados bsicos
Em C existem quatro tipos bsicos de dados:
Tipos Bytes
Universo
char
1
-128 a 127
int
2
-32768 a 32767
float
4
3.4e-38 a 3.4e+38
double
8
1.7e-308 a 1.7e+308
Os tipos char e int permitem o armazenamento de nmeros inteiros, positivos e negativos e
so utilizados para armazenar caracteres ou resultados lgicos, implementarem um contador, etc.
Esses tipos so armazenados na memria em notao binria: o byte menos significativo e, em
seguida, o mais significativo (para o caso do int); o bit mais significativo utilizado para indicar o
sinal.
Os tipos float e double permitem o armazenamento de nmeros reais, positivos e negativos e
so utilizados em clculos cientficos, financeiros, etc. Esses nmeros so armazenados na memria
em notao binria, da seguinte forma: 1 bit indica o sinal, M bits indicam a mantissa e os E bits
restantes indicam o expoente, por exemplo, no caso de uma varivel float M=25 e E=8.
Modificadores
Em C existem ainda os modificadores que alteram a forma dos dados a serem tratados. So
eles:
Modificador
Exemplo
short
short int
long
long int ou long double
unsigned
unsigned char ou unsigned int
O modificador short, em alguns computadores, tem a metade do tamanho de um inteiro int. O
modificador long dobra o tamanho do nmero inteiro ou real, permitindo uma maior capacidade de
armazenamento. O tipo long double s aceito em alguns compiladores C. Ao invs de se escrever
long int, pode-se usar apenas long.
O modificador unsigned faz com que o compilador trate o dado como positivo. Desta forma, a
capacidade de armazenamento dobra. Uma varivel char pode armazenar um nmero entre 0 e 255,
e uma varivel int de 0 a 65535. Ao invs de se escrever unsigned int, pode-se usar apenas
unsigned.
Declarao de variveis e constantes
A declarao de variveis em C constituda pelo tido de dado, seguido de uma lista de
nomes de variveis de mesmo tipo a serem declaradas, separadas por vrgula, e finalizada com um
ponto-e-vrgula. Exemplo:
char a;
int b,c;
long int Tipo, TIPO, tipo;
double Soma, resultado, Dt_lanc;

Pg. 6

Programao em Linguagem C
A declarao de uma constante precedida da palavra cons e aps o nome da constante
deve-se inicializ-la, usando o operador de igualdade =. Exemplo:
const x = 10;
const y = 3.14;
const float CONSTANTE = 25.4;
Observe que podemos ter constantes sem a definio de tipo. Neste caso o compilador ir
utilizar um tipo equivalente ao valor atribudo. No exemplo acima, x ser do tipo int e y ser do tipo
float.
O nome de uma varivel ou constante pode ter qualquer tamanho, entretanto, apenas alguns
caracteres sero reconhecidos, ou seja, so significativos. Normalmente, esse nmero de 32
caracteres, mas pode ser configurado na maioria dos compiladores. Nenhuma palavra-chave pode
ser utilizada como nome de varivel ou constante. Variveis e constantes escritas com letra
maisculas ou minsculas so diferentes.
Inicializao de variveis
As variveis podem ser inicializadas durante sua declarao e/ou utilizando-se uma instruo
de atribuio. Por exemplo:
main()
{
float dado1 = 1.2, dado2 = 2.5, dado3 = 4.7, dado4;
float media;
dado4 = 1.9;
media = (dado1 + dado2 + dado3 + dado4) / 4;
}
As duas primeiras instrues declaram as variveis que sero utilizadas e j inicializam trs
delas. As duas ltimas exemplificam instrues de atribuio.
Tipos de dados lgicos ou booleanos
Em C no existe um tipo de dado para armazenar dados lgicos ou booleanos, ou seja, dados
que possuem apenas um estado dual (verdadeiro ou falso). Neste caso qualquer valor diferente de
zero representa um valor verdadeiro; enquanto que o zero representa um valor falso. Se for
necessrio, pode-se simular um tipo de dado booleano, para melhor compreenso do programa.
Exemplo;
a = 1; representa um valor lgico verdadeiro
b = 0; representa um valor lgico falso
c = -8 representa um valor lgico verdadeiro

2.5 OPERADORES
A linguagem C rica em operadores, que so representados por um smbolo (um ou mais
caracteres) e so utilizados para operar ou manipular dados, sob a forma de constantes ou
variveis. Talvez a linguagem C seja a mais rica em operadores; mas deve ser a mais pobre em
smbolos, pois existem operadores diferentes com o mesmo smbolo.

Pg. 7

Programao em Linguagem C
Operadores aritmticos
Operador
Significado
+
Soma
Subtrao
*
Multiplicao
/
Diviso
%
Mdulo ou resto da diviso
=
Atribuio
Menos unrio sinal negativo
Todos os operandos, com exceo do menos unrio, so operadores binrios, ou seja,
possuem dois operandos. Outro detalhe que deve ser observado o tipo dos dados (operandos) que
esto sendo utilizados.
O operador de atribuio exige que o operando da esquerda seja uma varivel (inteira ou
real), para que possa armazenar o valor correspondente ao operando da direita. Exemplo:
a = 10;
b = 10;
c = -1;
d = a + b + c;
15 = a; isto invlido
Alm disso, permitido inicializar mais de uma varivel, com o mesmo valor, numa nica
instruo. Exemplo:
a = b = 10;
c = a * b;
Recomenda-se, por questo de organizao e para evitar erros, que os operandos do
operador de atribuio sejam do mesmo tipo. A linguagem C permite que operandos de tipos
diferentes sejam utilizados em conjunto e que o resultado seja atribudo a outro operando, do mesmo
tipo dos anteriores, ou no. Para isso o compilador utiliza um recurso chamado converso de tipos
de dados, que ser visto mais adiante. Exemplo:
int a,b = 1;
float c = 2.5;
a = b + c;
Neste caso, a = 3, pois uma varivel inteira.
O operador unrio opera sobre o operando da sua direita, que pode ser uma varivel, uma
constante ou uma expresso, inteira ou real. Exemplo:
a = -1;
b = - 10 + a;
c = - (b + 4);

Pg. 8

Programao em Linguagem C
Operadores aritmticos de atribuio
Operador
+=
-=
*=
/=
%=

Exemplo
Significado
op1 += op2 Atribui a op1 o resultado de op1 + op2
op1 -= op2 Atribui a op1 o resultado de op1 - op2
op1 *= op2 Atribui a op1 o resultado de op1 * op2
op1 /= op2
Atribui a op1 o resultado de op1 / op2
op1 %= op2 Atribui a op1 o resultado de op1 % op2

Como pode ser observado, os operadores aritmticos de atribuio simplificam as instrues


de atribuio em que o operando da esquerda tambm aparece do lado direito do operador de
atribuio. Por exemplo:
a = 10;
a = a + 10;

ou

a = 10;
a += 10;

Operadores de incremento e decremento


Operador
Significado
++
Incremento de um
-Decremento de um
Os operadores de incremento e decremento so unrios e operam apenas variveis inteiras
(char ou int). Quando a instruo for apenas o incremento de uma varivel, podem ser colocados
antes do operando ou depois do operando. Exemplo:
int a = 1, b = 1;
a++;
b--;

ou
ou

++a;
--b;

a=2
b=0

Quando forem usados dentro de expresses, a sua posio em relao ao operando no ir


mudar o valor final do operando, mas ir mudar o valor final da expresso. Desta forma, deve-se
observar que:

Se o operador escrito antes do operando, primeiro se realiza a operao de incremento


ou decremento para, em seguida, se calcular o valor final da expresso.
Se o operador escrito depois do operando, primeiro se calcula o valor final da expresso
para, em seguida, realizar a operao de incremento ou decremento.

Exemplos:
a = b = 2;
c = ++a;
d = b--;
e = c++ - --d;

c=3ea=3
d=2eb=1
e = 2, c = 4 e d = 1

Operadores binrios (Bit a bit)


Os operadores binrios so aqueles que realizam as operaes e, ou, no ou
deslocamentos (shift), sobre cada bit de operandos inteiros (char ou int). So, na verdade,
operadores aritmticos, s que operam sobre a representao binria dos nmeros inteiros.

Pg. 9

Programao em Linguagem C

Operador
Significado
&
e binrio
|
ou binrio
~
no binrio
>>
Deslocamento para esquerda
<<
Deslocamento para direita
Os operadores & e | possuem dois operandos e o operador ~ possui apenas um. O resultado
de sua aplicao pode ser analisado de acordo com a tabela a seguir, s que bit a bit.
Bit1 Bit2 Bit1 & Bit2 Bit1 | Bit2 ~Bit1
1
1
1
1
0
1
0
0
1
0
0
1
0
1
1
0
0
0
0
1
Exemplo:
char a, b, c, d, e;
a = 0x40; /* 0x indica notao hexadecimal */
b = 0x2F;
c = a & b; /* c = 0 */
d = a | b; /* d = 0x6F */
e = ~a; /* e = 0xBF */
Os operadores >> e << possuem dois operandos: o da esquerda a varivel inteira a ser
operada e o da direita um valor ou varivel inteira que indica o nmero de deslocamentos de bits
que devem ser feitos. Exemplo:
a >> 1 deslocar 1 bit esquerda a = 0x80
a << 3 deslocar 3 bits direita b = 0x05
Como pode ser notado, deslocar esquerda o mesmo que multiplicar por 2; e deslocar
direita o mesmo que dividir por 2.
Operador de endereo
O operador endereo & utilizado sobre uma varivel para representar o seu endereo de
memria. Isto muito utilizado em C, inclusive quando se for passar parmetros para funes. O
valor do endereo sempre um nmero inteiro sem sinal, e representa o offset da posio da
varivel em relao ao segmento de dados ou do segmento da pilha.
int a = 10;
unsigned int b;
b = &a;

b igual ao endereo de memria da varivel a

Pg. 10

Programao em Linguagem C

2.6 EXPRESSES
Expresses em C so um conjunto de variveis e operadores organizados em uma certa
ordem, que so resolvidas e retornam resultados aritmticos ou lgicos. As expresses so
avaliadas sempre da esquerda para a direita, mas deve-se levar em conta dois fatores: a
precedncia dos operadores, ou seja, a prioridade que um operador tem sobre o outro; e o uso dos
parnteses, que altera a seqncia de avaliao da expresso.
Procedncia de operadores
Os operadores de incremento e decremento tm precedncia maior que os aritmticos. Os
operadores aritmticos de multiplicao e diviso tm precedncia maior que os de soma e
subrao.
Os operadores aritmticos tm precedncia sobre os relacionais e os lgicos, que sero
vistos depois.
A seguir mostrada a tabela de precedncia de operadores em linguagem C.
OPERADORES
!
++ -* / &
+ < > <= >=
==
!=
&&
= += -= *= / =

TIPOS
no lgico e menos unrio
incremento / decremento
aritmticos
aritmticos
relacionais
relacionais
lgicos
aritmticos de atribuio

Expresses aritmticas
Uma expresso aritm tica ir resultar sempre em um resultado inteiro ou real, cujo tipo do
resultado ser definido pelo maior tipo existente na expresso. Exemplo:
int a;
long b;
float c;
double d;
d = a + b; resultado long atribudo a um double
a = c + b; resultado float atribudo a um int
Converso de tipos de dados (cast)
As converses entre os diversos tipos de dados so feitas naturalmente pelo compilador C.
Entretanto, muitas vezes, essas converses causam perdas de preciso ou de informao
(algarismos aps o ponto decimal). Para evitar que as converses sejam feitas de acordo com o
critrio do compilador, podemos utilizar um cast, que uma forma de forar a converso para um
determinado tipo de dado. Esse cast constitudo de um tipo de dado, entre parntesis, colocado
antes da expresso, ou da parte da expresso, que dever ser convertida. Exemplo:
d = (double) (a + b);
converte a+b para double
a = (int) ((long) c + b); converte c para long e c+b para int

Pg. 11

Programao em Linguagem C

2.7 COMENTRIOS
Em linguagem C podemos escrever comentrios, ou seja, informaes de orientao do
programador que no devem ser processadas pelo compilador. Um comentrio em C pode ter vrias
linhas e deve ser iniciado pelos caracteres */. Exe mplo:
a = 0; /* Inicializando a varivel a */ ou,
/* Arquivo de exemplo : exemplo1.c
Construdo em Linguagem C
*/
Em C, no se pode colocar um comentrio dentro de outro.
Alguns compiladores, como o TC++, aceitam tambm um comentrio de uma linha, utilizandose os caracteres //. Exemplo:
a = 0; // Inicializando a varivel a

ou,

// Arquivo de exemplo : exemplo1.c


// Construdo em Linguagem C

3 ESTRUTURAS DE CONTROLE DE FLUXO


3.1 OPERADORES RELACIONAIS E LGICOS
Os operadores relacionais e lgicos so utilizados nas expresses de controle das estruturas
de deciso e repetio condicional.
Operadores relacionais
Operador
>
>=
<
<=
==
!=

Significado
maior que
maior ou igual a
menor que
menor ou igual a
igual a
diferente de

Os operadores relacionais so utilizados em expresses de comparao ou expresses


lgicas, onde o resultado esperado no um nmero, e sim, um resultado lgico verdadeiro ou falso.
Exemplo:
a = b = 10;
c = 20;
d = 40;
a>b
a == b
d >= c
c <= a

a maior que b?
a igual a b?
d maior ou igual a c?
c menor ou igual a a?

Falso
Verdadeiro
Verdadeiro
Falso

Pg. 12

Programao em Linguagem C
Observe que, no exemplo acima a, b, c e d so variveis, mas poderiam ser expresses
aritmticas ou at mesmo relacionais. Exemplo:
a + b == c
Verdadeiro
d - 2*c <= 0
Verdadeiro
(a > b) == (d >= c)
Falso
(a == b) > (c <= a)
Verdadeiro
A ltima expresso s possvel porque cada expresso relacional, aps ser avaliada, gera
um resultado 1 ou 0, representando verdadeiro e falso, respectivamente.
Lgicos
OPERADOR
&&

SIGNIFICADO
e lgico
ou lgico
no lgico

Os operadores lgicos so utilizados em expresses de comparao ou expresses lgicas, e


tem como operandos valores lgicos, e no valores aritmticos. Eles renem os resultados das
expresses lgicas que compem seus operandos e realizam uma outra operao lgica, de acordo
com a lgebra de BOOLE, como mostrado na tabela a seguir.
op1
V
V
F
F

op2
V
F
V
F

op1&&op2
V
F
F
F

op1||op2
V
V
V
F

!op1
F
F
V
V

As regras bsicas para a composio de expresses utilizando-se os operadores && e ,


so:

O resultado de uma expresso lgica e s verdadeiro, se todos os operandos


forem verdadeiros.
O resultado de uma expresso lgica ou verdadeiro, se pelo menos um dos seus
operandos for verdadeiro.
a = 1; b = 0; c = 1;
a > b && c == 1
a == b && c >= 0

V && V Verdadeiro
F && V Falso

a > b c == 1
a == b c >= 0

V V Verdadeiro
F V Verdadeiro

O operador no unrio e opera sobre o operando que estiver a sua direita, seja ele uma
varivel, uma constante ou uma expresso lgica ou aritmtica. Exemplos:
!(a > b)
!(a > b) && b + 1
a == b !b

!V Falso
F && V Falso
F V Verdadeiro

Observe que, nos dois ltimos exemplos, foram utilizados uma expresso aritmtica b+1 e
uma varivel b. Nesses casos, para podermos avaliar o resultado lgico, devemos seguir a regra
citada anteriormente: se a varivel ou a expresso aritmtica tiver como resultado um valor diferente
de 0 (zero), seu resultado lgico verdadeiro, caso contrrio, falso.

Pg. 13

Programao em Linguagem C

3.2 ESTRUTURAS DE DECISO


Estrutura Condicional
A estrutura condicional permite uma tomada de deciso durante a execuo do programa.
Pode ser escrita da seguinte maneira:
if (expresso) procedimento;
ou
if (expresso)
{
procedimento1;
procedimento2;
....
procedimento n;
}
A expresso pode ser tanto aritmtica quanto lgica, pode conter chamadas a funes, etc. A
deciso tomada da seguinte forma: se a expresso for verdadeira, a instruo ou o conjunto de
instrues ser executado.
OBS: Deve ser observado que quanto tivermos mais de uma instruo para ser executada,
dentro de uma estrutura de deciso ou repetio, elas devem vir marcadas por um bloco, ou
seja, entre chaves. Essa regra vale para todas as estruturas, com exceo do SWITCH.
A estrutura condicional possui ainda uma outra variao que utilizada para implementar
procedimentos para a condio verdadeira ou falsa, como pode ser descrita abaixo:
if (expresso)
procedimentoV;
else
procedimentoF;
Pode-se escrever estruturas condicionais aninhadas, isto , uma dentro da outra para testar
diversas condies diferentes. Exemplo:
if (expressoA)
procedimento1;
else {
procedimento2;
if (expressoB)
procedimento3;
else
procedimento4;
}
Operador Ternrio
Existe um operador em Linguagem C, chamado de operador ternrio, cujo smbolo uma
interrogao ?. Pode ser utilizado para substituir pequenas estruturas condicionais. Sua sintaxe :

Pg. 14

Programao em Linguagem C
Expresso ? instruoV : instruoF;
Se a expresso for verdadeira, a instruoV ser executada; caso contrrio, a instruoF ser
executada. Exemplo:
a > b ? maior = a : maior = b;
Estrutura de casos condicionais
A estrutura de casos condicionais, em C conhecida como SWITCH, utilizada quando a
tomada de decises envolve vrias alternativas, de acordo com o resultado de uma mesma
expresso, evitando a utilizao de IF aninhados. Sua sintaxe :
switch (expresso) {
case valor1 : instruo1;
break;
case valor2 : instruo2;
break;
.....
default : instruoD;
break;
}
A expresso deve resultar um valor constante e inteiro; valor1, valor2, ...., so os possveis
resultados da expresso que sero comparados e devem ser constantes inteiras; default uma
construo opcional, que ser executada se nenhum dos valores for igual a expresso.
A instruo BREAK indica o trmino da lista de instrues para cada caso. Na estrutura
SWITCH, no necessrio o uso das chaves, caso deseja-se executar mais de uma instruo. O
importante lembrar que, para finalizar as instrues, deve-se colocar um BREAK; caso contrrio, a
execuo continuar at encontrar algum BREAK ou o fim da estrutura SWITCH.

3.3 ESTRUTURAS REPETITIVAS


Estrutura repetitiva finita
Esta estrutura permite a repetio de uma ou mais instrues, um nmero fixo de vezes,
utilizando-se para isso de um contador (varivel inteira). Nas linguagens de programao mais
conhecidas, temos um contador, cujo valor inicial VI e que vai at o valor final VF, com um
incremento INC. Por exemplo: um contador A, que comea com 1 e vai at 10, saltando de 1 em 1.
Isto significa que as instrues sero executadas 10 vezes, e em cada repetio o contador A ter
um valor diferente.
Em C, a estrutura FOR composta por trs expresses, separadas por ;, dentro de
parnteses. A primeira expresso a de inicializao, a segunda de comparao e a terceira de
incremento.
for (inicializao; comparao; incremento) instruo;
for (inicializao; comparao; incremento) {
procedimentos;
}
Exemplo:
for (a=1; a<=10; a++) printf(%d, a);

Pg. 15

ou

Programao em Linguagem C
A lgica da estrutura FOR a seguinte:
1. Primeiro, a expresso de inicializao avaliada;
2. Em seguida, a expresso de comparao avaliada. Se for verdadeira, as instrues
sero executadas; caso contrrio, abandona-se a estrutura FOR.
3. Finalmente, aps a execuo das instrues, a expresso de incremento avaliada e a
execuo volta para o passo 2.
O mais interessante que qualquer expresso C aceita nos trs campos da estrutura FOR
e nenhuma delas precisa ter uma varivel contadora; opcional. Alm disso, os trs campos so
opcionais, mas deve-se manter os ;. Exemplo:
i = 0;
for ( ; i<10; ) {
printf (Mensagem);
i++;
}
A estrutura FOR tambm permite outra estrutura FOR como instruo. So os FOR
aninhados. Por exemplo:
for ( i=0; i<10; i++)
for ( j=0; j<5; j++) {
printf (%d - %d, i, j);
}
Estrutura repetitiva condicional
Esta estrutura utilizada para repetir uma ou mais instrues enquanto uma condio for
verdadeira. Essa estrutura pode ser substituda pela estrutura repetitiva finita, mas isto no feito
devido s tcnicas de programao estruturada.
Sintaxe:
while (condio) procedimento;

ou

while (condio) {
instruo1;
instruo2;
}
Enquanto a condio for verdadeira, as instrues sero executadas; caso contrrio, a
estrutura WHILE abandonada. Deve-se observar que, a condio avaliada antes da execuo
das instrues e que seus componentes j devem estar previamente inicializados. Exemplos:
char i, j;
i = 0;
printf (Digite qualquer valor para continuar ou zero para sair);
while (i >= 0) scanf (i);
j = 10; /* Equivalente ao FOR */
while (j > 0) {
printf (valor = %d, j);
j--;
}

Pg. 16

Programao em Linguagem C
Como uma variao deste tipo de estrutura pode-se citar a estrutura DO-WHILE que difere da
estrutura WHILE pela ordem de avaliao da condio. Na estrutura WHILE a condio avaliada na
entrada da estrutura e cada vez que ela completa o loop. Na estrutura DO-WHILE a condio
avaliada no final da estrutura, ou seja, neste caso pelo menos uma vez a estrutura executada.
Sintaxe:
do
procedimento
while (condio);
do{
procedimento1;
procedimento2;
procedimento3;
} while (condio);
Pode-se utilizar uma instruo para finalizar o processo das estruturas de repetio antes do
limite final da sua execuo. Exemplo:
printf (Digite um nmero ou zero para finalizar);
for ( ; ; ) {
scanf (a);
if (a==0) break; /* quando a=0 o loop infinito terminar */
}
A instruo CONTINUE pode ser utilizada, em qualquer estrutura de repetio e seu efeito o
de forar o reincio do processo de repetio. Na estrutura FOR, o processamento passa para a
expresso de incremento, enquanto que nas estruturas WHILE e DO-WHILE, o processamento
passa para a condio. Exemplo:
for (i = 1; i < 1000; i++) {
if (i % 2)
continue;
else
printf (%d, i);
}

3.4 COMANDOS BSIC OS DE ENTRADA E SADA


Para existir uma certa interao com o usu rio necessrio trabalhar com as entradas e
sadas padro do sistema operacional que so : o monitor para exibio de mensagens e resultados
de processamento e o teclado para entrada de dados solicitados ao usurio.
Na biblioteca padro de controle de Entrada/Sada (STDIO.H) existem funes que podem
ser usadas para esta finalidade. So elas:
Printf( )
Funo para sada de dados usando a sada padro (stdout) do Sistema Operacional
(monitor), sua sintaxe :
printf (string de controle, argumentos);

Pg. 17

Programao em Linguagem C
Como string de controle entenda-se uma frase com caracteres e constantes especiais usadas
para formatao das sadas dos resultados. Os argumentos so valores constantes ou variveis
cujos contedos sero substitudos nos caracteres de formatao da string de controle. Existem
ainda algumas constantes para controle da apresentao das quais destaca-se:

Cdigos Especiais
\n
\t
\b
\
\\
\f
\o

Significado
nova linha
TAB
retrocesso
aspas
barra
salta pgina
nulo

Como principais caracteres de formatao pode-se destacar:

Formatador
%c
%d
%e
%f
%g
%o
%s
%u
%x

Descrio
caractere simples
Decimal
notao cientfica
ponto flutuante
%e ou %f (mais curto)
Octal
cadeia de caracteres
decimal sem sinal
Hexadecimal

scanf( )
Funo para solicitao de dados ao usurio usando a entrada padro (stdin) do sistema
operacional (teclado), sua sintaxe :
scanf(string de controle, argumentos);
A string de controle conta com o uso dos formatadores para limitar a digitao do usurio,
como argumentos entenda-se o conjunto de variveis que iro receber o contedo digitado. Neste
caso existe uma notao especial que passa o endereo de memria onde a varivel foi reservada,
para passar este endereo basta utilizar o operador &. Este operador diz que o contedo ser
armazenado na posio de memria da varivel que precedida por ele.

4 CONSTRUINDO PROGRAMAS EM C
4.1 COMANDOS DO PR-PROCESSADOR
Todo compilador C possui um pr -processador, que implementa os seguintes recursos:
incluso de arquivos, compilao condicional, definio de constantes, macros, etc. Esse pr processador executado antes do compilador e prepara o caminho para o mesmo.

Pg. 18

Programao em Linguagem C
Diretiva #INCLUDE
Esta diretiva permite a incluso de um arquivo, dentro do outro, apenas para a compilao do
mesmo, ou seja, o contedo do arquivo includo ser compilado, mas no ser anexado ao arquivo
fonte, que est sendo compilado. Sintaxe:
#include <nomearq>
#include nomearq
Esta diretiva utilizada, normalmente, para a incluso dos arquivos de cabealho (arquivo.H),
que so aqueles que contm a definio de variveis e funes globais. Todo compilador C vem
acompanhado por uma biblioteca de funes. Cada grupo de funes possui um arquivo de
cabealho. Por exemplo, MATH.H o arquivo de cabealho para as funes matemticas. Exemplo:
#include <math.h>
#include math.h
A diferena entre usar < > ou est no fato de que no primeiro caso o compilador ir
procurar o arquivo em um diretrio previamente configurado, no segundo caso o arquivo ser
procurado no diretrio atual.
Diretiva #DEFINE
Essa diretiva permite a criao de macros, que podem ser nomes de constantes ou
seqncias de instrues, por exemplo. As macros sero substitudas pelo pr -processador, antes
da compilao. No feita nenhuma alterao no arquivo fonte. Sintaxe:
#define NOMEMACRO textomacro
comum, mas no obrigatrio, criar macros ou constantes com letras maisculas, para
melhor diferencia-las das variveis e instrues da linguagem C, que normalmente so escritas em
letra minscula. Exemplos:
#define COR_TEXTO 15
#define TESTA_FLAG flag>10?fim=1:fim=0
Uma vez definidas essas macros, podemos utiliza-las no programa, da seguinte forma:
if (cor == COR_TEXTO) procedimento;
TESTA_FLAG;
if ( fim ) printf (Abandonar o programa);
Diretiva #IF
As diretivas #IF permitem fazer com que o compilador tome uma deciso. Por exemplo: se ele
ir compilar uma parte do programa, ou outra. Isso chamado de compilao condicional e muito
til quanto se tem um trecho de programa que pode ser utilizado por vrios programas, com apenas
algumas alteraes. As estruturas das diretivas so:
#if EXP_CONST
/* se EXP_CONST for verdadeira */
procedimentosV;
#else
/* seno */
procedimentosF;
#endif
/* fim da diretiva #if */
#if CTE1

/* se CTE1 for verdadeira */

Pg. 19

Programao em Linguagem C
#elif CTE2
#endif

/* seno, se CTE2 for verdadeira */


/* fim da diretiva */

#ifdef NOME
#else
#endif

/* se NOME estiver definido */


/* seno */
/* final da diretiva */

#ifndef NOME2
#else
#endif

/* se NOME2 no estiver definido */


/* seno */
/* final da diretiva */

4.2 CONSTRUES E USO DE FUNES


Construo
Em linguagem C podemos ter vrias funes em um mesmo arquivo. Cada funo deve ser
construda, uma em baixo da outra. A posio da funo no arquivo no importa muito (na maioria
das vezes). O programa ir sempre comear pela funo main(), independentemente da posio em
que esta estiver no arquivo. As demais funes s sero executadas se forem chamadas atravs da
funo main(); ou de outra funo, que tenha sido previamente chamada atravs da funo main().
Isto significa que: o simples fato de uma funo ter sido construda no implica que ela ser
executada.
Exemplo de construo de funes:
funcao1()
{
procedimentosA;
}
funcao2()
{
procedimentosB;
}
main()
{
procedimento1;
funcao1();
procedimento2;
}
A construo mais simples de uma funo em C a demonstrada acima: o nome da funo
seguido de parnteses, mais o corpo da funo (procedimentos), entre chaves.
Chamada de funes
No exemplo acima, a instruo na funo main() apresentada como funcao1() constitui uma
chamada de funo. O programa se inicia em main() o procedimento1 executado e,
posteriormente, chamada a funcao1() e seus procedimentos so executados, ao final da execuo
desta funo o controle de processamento volta para a funo main() que executa o procedimento2 e
o programa finalizado. importante observar que a funcao2() no foi executada, embora esteja
presente no programa; pois, em momento algum, foi feita uma chamada para ela.

Pg. 20

Programao em Linguagem C
Prottipos de funes
Nos casos onde existem funes que so construdas aps o ponto onde so chamadas
existe a necessidade de resolver um problemas estrutural. Neste caso, a linguagem C compila o
arquivo de cima para baixo. Desta forma, como poder saber se a forma como a funo foi chamada
est correta?
Para resolver este problema, pode-se utilizar dois recursos:
1. Construir as funes numa ordem tal que, toda funo que for chamada j esteja
construda.
2. O caso acima salientado de difcil construo, principalmente quando se tem um
programa com muitas funes, dispostas em vrios arquivos. Para este caso utiliza-se o
prottipo de funo.
O prottipo nada mais do que a instruo equivalente linha de construo de uma funo
(linha do nome da mesma), seguida pelo terminador padro de C (;). Esse prottipo deve ser escrito
fora do corpo das funes e antes do nome da funo a ser referenciada. Exemplo:
funcao1();
funcao2();

/* Prottipo de funes a serem chamadas */

main()
{
proc1;
funcao1();
proc2;
}
funcao1()
{
proc3;
}
funcao2()
{
proc4;
proc5;
}
Neste caso, o compilador no ter dvidas com relao ao formato das funes, mesmo elas
sendo chamadas antes de serem construdas, pois na parte superior do programa, ou cabealho do
programa, foram escritos os prottipos das funes.
Arquivos de cabealho
devido, principalmente, ao problema de prottipos de funes que foram introduzidos os
arquivos de cabealho. Nesses arquivos, que possuem a extenso .H, de preferncia, normalmente
vm definidas vrias funes que esto disponveis para o programador, na biblioteca C. O
programador tambm pode construir os seus prprios arquivos de cabealho, a fim de definir suas
funes. Isto muito utilizado quando se constri algumas funes em um arquivo, mas deseja-se
utiliz -las em outros. Para evitar escrever os prottipos das funes toda hora, em cada novo
arquivo, basta utilizar a diretiva #INCLUDE para carregar o arquivo de cabealho onde esto
definidas as funes.

Pg. 21

Programao em Linguagem C

4.3 CONSTRUO DE FUNES DE DIVERSOS TIPOS


Funes e parmetros
Em linguagem C pode-se ter funes de diversos tipos:

Funes simples: no possuem parmetros nem retorno.


Funes que retornam valores.
Funes que possuem parmetros.

Os parmetros so informaes que so passadas para a funo, e so necessrios para que


ela realize suas tarefas. Por exemplo: uma funo que calcula a raiz quadrada de um nmero,
precisa de pelo menos um parmetro, que o nmero cuja raiz deve ser calculada.
Os valores de retorno podem ser uma simples informao de que a funo foi executada com
sucesso, ou no; bem como o resultado de algum clculo ou processamento. Exemplo: O resultado
da raiz quadrada do nmero que foi passado como parmetro.
Funes que retornam valores
Para se construir funes que retornem valores, deve-se colocar o tipo de dado que esta ir
retornar, antes do seu nome; e, antes do final da funo, deve-se utilizar a instruo RETURN,
seguida do valor (ou varivel) a ser retornado. Por padro, toda funo em C retorna INT. Exemplo:
Prottipo:

float funo1();

Construo: float funo1() {


procedimentos;
return valor_float;
}
funo2() {
procedimentos2;
return valor_int;
}
Chamada:

main() {
int a;
float b;
b=funo1();
if ( funo2() ) c = funo1() + 10;
}

Observe que a funo2() no possui nenhuma informao do tipo de valor que deve ser
retornado. O compilador ir consider -la um funo inteira, ou seja, que retorna um valor INT.
Para se receber um valor retornado por uma funo pode-se atribuir a funo uma varivel;
inserir a funo em uma expresso aritmtica ou lgica; ou ambos.
Funes com parmetros
Quase todas as funes da biblioteca C e a grande maioria das funes criadas por
programadores, possuem parmetros. Esses parmetros podem ser de qualquer tipo de dado vlido
em C, ou podem ser at uma funo. Para se construir funes com parmetros, deve-se coloc-lo
dentro do parntesis, precedido de seu tipo como se estivesse declarando uma varivel. Exemplo:

Pg. 22

Programao em Linguagem C
Construo: double raizquad( double numero) {
proc_calc_raiz;
return resultado;
}
Prottipo:
double raizquad (double numero); /* ou */
double raizquad (double)
Exemplo de chamada:
main() {
double x, y, z;
x = 10000;
y = raizquad(x);
z = raizquad(100.);
}
Observe que existem duas formas de se construir o prottipo da funo. O primeiro, idntico
construo; o segundo, apenas com o tipo do parmetro. Isto possvel porque, para o compilador,
num prottipo de funo, s interessa saber o tipo de informao.
Outro detalhe importante com relao ao nome do parmetro. Esse nome, o de uma
varivel que s ser usada dentro da funo. No existe nenhuma relao entre ele e o nome da
varivel cujo valor est sendo passado. No exemplo anterior, x uma varivel que utilizada
dentro de main(). O seu valor est sendo passado ou transferido para o parmetro da funo
raizquad(), que se chama numero, ou seja, durante esta chamada funo raizquad(),
numero=10000. Observe na segunda chamada funo raizquad(), que no se est passando o
valor de uma varivel, e sim, um valor constante. Durante esta chamada funo raizquad(),
numero=100.
Funes com vrios parmetros
As funes em C podem ter vrios parmetros, para isso basta separ-los com vrgula, tanto
na hora da construo, como na hora da chamada. importante observar que os parmetros devem
ser passados na mesma seqncia e com o mesmo tipo que foram construdos; caso contrrio,
podero ocorrer erros durante a execuo. Normalmente, os compiladores C, no informam ou
geram mensagens de erro, quando se passa um valor de tipo diferente do parmetro.
Passagem de parmetros por valor ou por referncia
O processo de passagem de parmetros mostrado acima chamado de passagem de
parmetros por valor, porque se est apenas passando um nmero, que pode ser uma varivel ou
uma constante, para outra funo.
Muitas vezes, entretanto, deseja-se enviar o valor de uma varivel, mas precisa-se que este
seja alterado dentro da funo. Existem duas formas de se fazer isso:
1) Usando-se a passagem de parmetros por valor:
int quadrado ( int lado )
{
returna lado*lado;
}
main()
{
int l=5;
l = quadrado ( l );
}

Pg. 23

Programao em Linguagem C
Neste caso, o valor da varivel l passado para o parmetro lado, mas a prpria varivel
l recebe o resultado da funo quadrado().
2) Usando-se passagem de parmetros por referncia:
Neste caso, ser utilizado outra varivel para receber o resultado, s que, no atravs da
instruo RETURN. Passa-se o endereo de memria desta varivel, para que a funo quadrado()
possa alterar o seu valor diretamente.
quadrado ( int lado, int *resultado)
{
*resultado = lado * lado;
}
main()
{
int l=5, r;
quadrado ( l, &r);
}
Neste caso, o valor de l passado para lado (passagem por valor), e o endereo de
memria da varivel r passado para resultado utilizando-se o operador & (endereo). Na
funo quadrado(), existe um operador * antes da palavra resultado que indica que ela no
contm um valor inteiro, e sim o endereo de memria de uma varivel inteira (resultado um
ponteiro). Observe que este operador tem que acompanhar a varivel, quando ela for utilizada. Na
linha *resultado =, l -se, o contedo de resultado igual a. Quando essa instruo for executada,
mesmo o processamento ainda estando dentro da funo quadrado(), o valor da varivel r, na
funo main(), j estar alterado.

4.4 CLASSE DE ARMAZENAMENTO DE FUNES E VARIVEIS


As classe de armazenamento definem em que partes de um programa que uma varivel ou
funo podem ser referenciadas, se elas podem ser utilizadas por outros arquivos, etc. Isto
chamado de escopo de varivel ou da funo.
Classes de armazenamento de variveis
Basicamente, uma varivel possui dois escopos: LOCAL ou GLOBAL.
Uma varivel local aquela que s pode ser utilizada dentro da funo em que foi declarada,
porque a sua existncia est vinculada ao fato da funo estar sendo executada, ou seja, uma
varivel local s existe enquanto a funo na qual ela foi declarada estiver executando. As variveis
locais so alojadas no segmento da pilha (SS), e tm a vantagem de no ocuparem espao fixo na
memria; pois, a pilha incrementada todas vez que uma funo chamada e removida toda vez
que a funo retorna. As variveis locais so aquelas declaradas dentro do corpo das funes.
Uma varivel global aquela que pode ser utilizada por qualquer funo de um programa e o
seu valor pode ser lido ou alterado por qualquer uma dessas funes. Ela est sempre presente na
memria, pois alojada no segmento de dados (DS). Tem a vantagem de reduzir o nmero de
variveis a serem declaradas e a de reduzir o nmero de parmetros que devem ser passados para
as funes. Em contrapartida, aumentam a necessidade de memria do programa. As variveis
globais so aquelas declaradas fora do corpo das funes e antes de serem referenciadas.

Pg. 24

Programao em Linguagem C
No prximo exemplo teremos duas variveis globais a e b, que podem ser utilizadas pelas
funes funcao1() e main(). A funcao1() tem uma varivel local chamada de c, e que s existir
dentro da mesma, quando essa for executada. A funo main() tem duas variveis locais a e c,
que s existiro enquanto e quando esta funo entrar em execuo.
Pontos importantes

Podem existir variveis locais com o mesmo nome s que em funes diferentes. O
importante saber que so variveis diferentes, no tem vnculo entre Sistemas de
Informaes. O fato de terem o mesmo nome uma coincidncia. o caso da varivel
c.
Podem existir variveis locais com o mesmo nome de variveis globais. Da mesma forma,
no tm vnculo entre Sistemas de Informaes. Numa funo, se existir uma varivel
local declarada com o mesmo nome da global, o compilador utilizar a varivel local. o
caso da varivel a.
Qualquer outra varivel que no tenha sido declarada internamente em uma funo
(local), dever ter sido declarada como global, seno, o compilador ir gerar uma
mensagem de erro: Varivel no declarada.

Exemplo:
int a = 5, b;
funcao1() {
int c=1;

/* varivel local */

a = 10;
/* modificando o valor da varivel global */
procedimentos;
}
main() {
float a;
int c;
a = 15;
b = 7;

/* varivel local */
/* varivel global */

procedimentos;
funcao1();
}
Modificador STATIC
O modificador STATIC, que deve ser escrito antes do tipo, durante a declarao de uma
varivel, permite que o valor de uma varivel local, se mantenha, mesmo quando a funo terminar;
de forma que, quando a funo for chamada novamente, o valor da varivel ser aquele que ela
tinha, quando do trmino da primeira chamada funo. Exemplo:
funcao1() {
static int c = 1;
procedimentos;
c = 2;
}

Pg. 25

Programao em Linguagem C
Na primeira chamada funcao1(), c iniciar com 1 e depois ter seu valor alterado para 2.
Na segunda chamada funcao1(), c iniciar com 2, que era o seu valor anterior, ou seja, seu valor
permanecer inalterado (esttico). Variveis estticas so alojadas no segmento de dados (DS).
Para uma varivel global, o efeito do modificador STATIC diferente e s tem sentido em
programas formados por mais de um arquivo fonte. Uma varivel global esttica s estar disponvel
para as funes que estiverem no mesmo arquivo de sua declarao.
Classes de armazenamento de funes
O escopo de uma funo tambm s tem sentido quando se trabalha com programas
formados por mais de um arquivo fonte. Neste caso usa-se o modificador STATIC, antes da
construo da funo, para indicar que aquela funo s deve ser utilizada dentro do arquivo em que
foi construda. Caso contrrio, ela poder ser referenciada ou utilizada em todos os arquivos que
formam o programa.
Funes que sero utilizadas por outros programas, por exemplo, funes de biblioteca, tm
que ter escopo global.
Pode-se ter, ento, funes diferentes com o mesmo nome, dentro de um programa, desde
que pelo menos uma delas tenha escopo local (STATIC).

4.5 PROGRAMAS COM MLTIPLOS ARQUIVOS


Projeto de programas
Normalmente, programas com mais de 1000 linhas no se tornam agradveis para serem
manipulados em apenas um arquivo. Alm do mais, a organizao das funes fica prejudicada. Por
isso, cria-se um projeto de programa em que cada grupo de funes colocado em um arquivo.
Esses arquivos devero ser compilados separadamente e depois link-editados juntamente com a
biblioteca da linguagem C.
Uso de mltiplas funes e variveis globais
Como um programa normalmente possui muitas funes e variveis globais, e nunca ser
possvel separ-lo totalmente, de forma que, as funes e as variveis globais em um arquivo no
sejam utilizadas pelos demais, ser necessrio indicar ao compilador que aquelas funes ou
variveis j esto declaradas, s que em outro arquivo. Alm disso, importante indicar ao
compilador o tipo de varivel e o prottipo da funo, para que o programa cdigo gerado seja
correto. Isto feito utilizando-se o modificador EXTERN, que indica que a varivel ou funo
externa. Exemplo:
Arquivo1:
extern int a;
float funcao1() {
imprime_a;
}
Arquivo2:
extern float funcao1();
main() {
funcao1();
}
importante observar que no podem existir duas variveis globais ou funes, no
estticas, com o mesmo nome.

Pg. 26

Programao em Linguagem C
Compilao e Link-Edio
O problema do uso de vrios arquivos est no fato da forma como o compilador C e o LinkEditor trabalham.
O compilador C um compilador de arquivos, ou seja, ele compila cada arquivo de uma vez,
independentemente um do outro. Para cada arquivo compilado, ele gera um arquivo objeto (.OBJ).
Desta forma, ele tem que ser capaz de compilaras funes do arquivo fonte apenas com as
informaes contidas no mesmo (da a necessidade de se usar a diretiva EXTERN e os arquivos de
cabealho, para definir tudo o que no foi criado dentro do arquivo).
Nos arquivos objeto, alm do cdigo compilado, so colocadas todas as informaes
referentes as funes e variveis globais existentes naquele arquivo, bem como as funes e
variveis globais que esto faltando naquele arquivo.
O Link-Editor rene um ou mais arquivos objeto e cruza as referncias, ou seja, faz a ligao
entre as variveis e funes que esto faltando em alguns arquivos, com aquelas que foram criadas
nos outros. As informaes que ficarem faltando sero buscadas na biblioteca da linguagem C que
estiver sendo utilizada. Se todas as ligaes forem feitas, criado um arquivo executvel, caso
contrrio, sero geradas mensagens de erro.
Dicas finais

Use, sempre que possvel, variveis locais;


Coloque todas as informaes de que uma funo precisa sob a forma de parmetros, em
lugar de utilizar variveis globais, para que esta funo, por si s, possa ser utilizada em
vrios pontos do programa ou em vrios programas;
Procure fazer funes o mais genricas possvel, de modo que, uma nica funo possa
ser vrias vezes utilizada em um programa, reduzindo o tamanho do programa e
facilitando a sua manuteno.
Utilize variveis globais estticas para um conjunto de funes que realizam algum
trabalho em comum e que possuam informaes em comum, dentro de um mesmo
arquivo.

5 TIPOS AVANADOS DE DADOS EM C


5.1 VETORES E STRINGS
Um vetor formado por um conjunto de dados de um mesmo tipo determinado, referenciada
pelo mesmo nome, que so alojadas seqencialmente na memria. Pode-se entender um vetor
como uma varivel que tem sua rea subdividida em reas menores para guardar diversos dados
diferentes. Para acessar cada item do vetor utiliza-se um nmero que indica o ndice de sua posio.
Sintaxe:
tipo nomevar1 [n.elem1], nomevar2 [n. elem2];
Exemplos:
int notas[4], cd[10];
char nome[10];
float media[5];
A diferena entre a declarao de uma varivel simples para um vetor que, aps o nome da
varivel, escreve-se o nmero de elementos entre colchetes. Nos casos acima, a varivel notas
possui 4 elementos do tipo int, enquanto que a varivel cd possui 10 elementos int. Para que se
possa acessar cada elemento do vetor, escreve-se o nome da varivel seguido do ndice, entre
colchetes. Exemplo:

Pg. 27

Programao em Linguagem C
notas[1] = 5;
notas[2] = 8;
notas[3] = notas[1] * 1.2;
A numerao dos ndices, ou indexao, de um vetor, inicia-se sempre de 0 (zero), ou seja, o
primeiro elemento o de ndice zero (0) e o ltimo o de ndice tamanho-1. Assim, para o vetor
notas o primeiro elemento seria notas[0] e o ltimo seria notas[3].
STRING
Uma string nada mais do que um vetor do tipo char (vetor de caracteres), que armazena,
normalmente uma mensagem ou frase. Alm dessa particularidade, o ltimo elemento da mensagem
deve ser sempre um barra zero(\0), no confundir com o caractere zero (0) cujo cdigo ASCII 48.
importante salientar que o ltimo elemento da mensagem no precisa ser, necessariamente, o ltimo
elemento do vetor char. Exemplos:
char nome[11];
char ttulo[21] = {Este o ttulo!};
Acima pode-se destacar que a string nome poder armazenar at 10 caracteres, pois um
deve ser reservado para o terminador \0. A string titulo alm de ser declarada, est sendo
inicializada. Observe que o tamanho da mensagem de 16 caracteres e a varivel suporta at 20
(mais o terminador). Neste caso, o terminado colocado aps o caractere !, posio [15], e no no
final da string, ndice [20].
Outra particularidade, muito importante, no uso de strings que pode-se utiliza-las como uma
nica varivel, sem precisar acessar todos os elementos.

5.2 MATRIZES
As matrizes so estruturas de armazenamento de dados em memria semelhantes aos
vetores, s que possuem mais do que uma dimenso. Sua declarao e utilizao semelhante ao
caso dos vetores, com a diferena que deve-se utilizar dois ou mais ndices, um para cada dimenso.
Sintaxe:
tipo nomevar [dimens1] [dimens2] .... ;
Exemplos:
int A[10][10]; /* declarada uma matriz A com 10 linhas e 10 colunas */
double coord [100] [100] [100] /* matriz coord para armazenar coordenadas 3D */
char nomes [10] [21]; /* vetor de strings */
x[0][0][0] = 1;
x[99] [99] [99] = 100;
nomes[1] [20] = a;
Para acessarmos algum elemento de uma matriz devemos indicar todos os ndices do
elemento desejado. Pode-se ter matrizes com vrias dimenses; entretanto, no comum o seu uso,
num aconselhvel, exceder 3 dimenses. No caso de uma matriz de elementos char ser tratada
como um vetor de strings, utiliza-se apenas um ndice para referenciar a string, e dois ndices para
referenciar um elemento da string. Por exemplo, nomes[1][20] um elemento e nome[1] toda a
string.

Pg. 28

Programao em Linguagem C

5.3 ESTRUTURAS
Estruturas so conjunto de variveis diferentes, que podem ser do mesmo tipo ou no,
referenciadas por um nico nome. Seus elementos podem ser variveis simples, vetores, matrizes ou
at mesmo outras estruturas. No caso da estruturas, pode-se defini-las sem estar declarando
nenhuma varivel. comum usar nomes com letras maisculas para identificar o nome da estrutura.
O tamanho de um estrutura ser a soma do tamanho de cada um dos seus elementos.
As estruturas podem ser utilizadas para trabalhos com bancos de dados em forma de
registros. Os quais podem ser armazenados em memrias auxiliares (unidades de discos). Cada
registro constitudo por uma gama de informaes pertinentes natureza do dado representado
(campos).
Sintaxe da definio de uma estrutura:
struct NOMESTRU {
tipo nomevar1;
tipo nomevar2;
tipo nomevar3;
};
Usando uma estrutura definida para declarar uma varivel :
struct NOMESTRU nomevar;
obs: No se esquea do ponto e vrgula aps a chave final da estrutura.
Exemplo:
struct COORDENADAS {
float x;
float y;
float z;
};
struct COORDENADAS a, c[100];
No exemplo acima, x, y e z so os elementos de uma estrutura chamada COORDENADAS.
Declarou-se, em seguida, duas variveis a e c, com tipo struct COORDENADAS, sendo que c um
vetor.
Para acessar um elemento de uma estrutura, escreve-se o nome da varivel seguida pelo
nome do elemento, separados por um ponto (.). Exemplo:
a.x = 0;
a.y = 1;
a.z = 2;
c[6].x = 4;
c[14].z = c[14].x + c[14].y;
O exemplo acima da varivel c, mostra que fica mais fcil e organizado trabalhar com um
vetor de estruturas que possa representar as coordenadas, do que ter uma matriz tridimensional
(x,y,z), como um ponto s pode ser definido com as trs coordenadas mais simples armazenar em
conjunto. Outro exemplo tpico o de se criar um registro com os dados pessoais de clientes, por
exemplo. Ao invs de se declarar uma varivel para cada dado, deve-se criar uma estrutura com
todas as informaes pertinentes ao cliente. Isso facilitar a estruturao e a implementao do
programa. Exemplo:

Pg. 29

Programao em Linguagem C
struct CLIENTES {
char nome[31];
char ender[41];
char telef[10];
];
struct CLIENTES c[300]; /* limitao em at 300 clientes */
A declarao da varivel c pode ser feita diretamente aps a definio da estrutura
CLIENTES, exemplo:
struct CLIENTES { ............ } c[300];
Apesar disto, esta forma no recomendada, pois costume colocar as definies das
estruturas em arquivos de cabealho, da mesma forma que as declaraes das variveis devem ser
feitas nos respectivos arquivos fonte.

5.4 UNIES
As unies so semelhantes as estruturas, mas os seus elementos, ao invs de ocuparem a
sua posio de memria, um ao lado do outro, ficam sobrepostos entre si, ou seja, existem vrias
variveis utilizando o mesmo espao de memria. A utilizao de unies deve ser cuidadosa, pois
tem-se que ter um controle sobre quais informaes que esto sendo utilizadas no momento. O
acesso aos elementos de uma unio feito de forma anloga ao de uma estrutura. O tamanho de
uma unio ser o tamanho do seu maior elemento. Sintaxe:
union NOMEUNIAO {
tipo nomevar1;
tipo nomevar2;
};
union NOMEUNIAO nomevar;
Exemplo:
union REGISTER {
int ax;
cha al, ah;
};
union REGISTER reg;
reg.ax = 0x1020; /* ou */
reg.al = 0x20;
reg.ah = 0x10;
No caso demonstrado acima, declarou-se uma unio para representar o contedo do
registrador AX, do microprocessador. Como j foi citado, o registrador pode ser dividido em duas
partes de 8 bits cada, chamadas AL e AH. Como a alterao das partes, AL e AH, implica na
alterao do todo, AX, eles devem estar sobrepostos na memria. Consegue-se isso atravs de uma
unio.

Pg. 30

Programao em Linguagem C

5.5 ENUMERAES
Enumeraes so conjuntos de constantes do tipo int e so utilizadas para facilitar
declaraes de vrias constantes referentes um mesmo assunto. Sintaxe:
enum NOMEENUM = { const1 = v1; const2 = v2; ...... };
Cada constante declarada ter um valor, que poder ser definido usando-se o operador de
atribuio (=), ou no; neste caso, o prprio compilador ir dar um valor para a constante, que ser o
valor da constante anterior, mais um.
Exemplo:
enum VIDEO = { MONO=0, CGA, EGA, VGA=5, SVGA};
Neste caso, os valores das constantes sero MONO=1, CGA=2, EGA=3, VGA=5, SVGA=6.

6 TRABALHANDO COM PONTEIROS (APONTADORES)


Ponteiros so variveis que contm o endereo de memria de uma outra varivel (ou de
uma funo), que pode ser uma varivel simples, um vetor, uma matriz ou uma estrutura. So
utilizados quando se precisa fazer passagem de parmetros por referncia, quando deseja-se usar a
tcnica de alocao dinmica de memria, criao das estruturas de dados de listas, pilhas, filas e
rvores, entre outras aplicaes.
A principal vantagem do seu uso est na agilidade imposta ao programa e as strings e
matrizes so declaradas de formas mais simples.
A declarao de um ponteiro feita colocando-se um asterisco (*) antes do seu nome,
durante a declarao. Sintaxe:
tipo *nomeponteiro;
Exemplo:
int *a;
float c, *d;
Nos casos acima tem-se: a como um ponteiro para uma varivel int, enquanto que d um
ponteiro para uma varivel float.

6.1 VETORES E MATRIZES COMO PONTEIROS


Os nomes dos vetores e das matrizes jo so tratados como ponteiros, pelo compilador C. Na
verdade, eles contm o endereo da posio de memria do primeiro elemento do vetor ou da
matriz, que se confunde com o endereo inicial do prprio vetor ou matriz.
Desta forma, em uma funo que possui um vetor como parmetro, mas com um tamanho
desconhecido durante a programao, pode-se declarar um ponteiro ao invs do vetor. Exemplo:
/* funo que calcula a somatria dos elementos do vetor */
float soma (int numero, float *dados) {
int i;
float s= 0;

Pg. 31

Programao em Linguagem C
for (i=0; i<numero; i++)
s+= dados[ i ];
return s;
}
A funo acima deixa claro que mesmo tendo declarado dados como um ponteiro, o acesso
aos elementos pode ser feitos como em um vetor.

6.2 PONTEIROS DE ESTRUTURAS


Os ponteiros para estrutura possuem uma particularidade. Para acessarmos os seus
elementos, devemos trocar o ponto (.) pelo sinal trao sinal de maior (->). Exemplo:
int entra_cliente (struct CLIENTE *c) {
ler_dado (c-> nome);
ler_dado (c->ender);
}

6.3 ARITMTICA DE PONTEIROS


Os ponteiros, por conterem endereos de memria, podem ser manipulados aritmeticamente,
ou seja, podem ser incrementados, decrementados, multiplicados, etc. Os operadores ++ e --"
podem ser utilizados em ponteiros. importante observar que, somar um ponteiro de 1, no significa
acrescentar um 1 byte, mas sim, passar para a prxima posio ou para o prximo elemento. Desta
forma, quando incrementa-se um ponteiro inteiro, ele ser somado de 2 bytes, que o tamanho de
um inteiro. No caso de um ponteiro de dupla preciso (double), ele ser somada de 8 bytes.
Exemplo:
int *a;
double *b;
a--; /* -1 int corresponde 2 bytes */
b = b + 10; /* 10 doubles corresponde a 8 * 10 bytes */

7 TRABALHANDO COM ARQUIVOS:


Um arquivo armazena informaes em algum tipo de memria auxiliar, representada nos
computadores pelas unidades de discos (Rgidos ou Winchester e Disquetes). Existem duas formas
de manipulao de arquivos:

Seqenciais (Texto) possui uma marca EOF (final de arquivo);


Binrios no possuem marca EOF.

Para se trabalhar com um arquivo necessrio abri-lo criando um canal de comunicao


entre o programa sendo executado na memria e o arquivo em disco. A funo de biblioteca fopen
desempenha o papel de abertura e retorna um ponteiro do canal de comunicao utilizado para o
trfego memria-disco.
Sintaxe de declarao de ponteiro de arquivo:
FILE *nomept;

Pg. 32

Programao em Linguagem C
Para a abertura do arquivo utiliza-se a sintaxe:
nomept = fopen(nomearq.ext, tpabert);
O elemento tpabert representa o tipo de abertura que ser definido no arquivo, conforme a
tabela abaixo:
r w a r+ w+ a+ -

Abrir o arquivo texto para leitura. O arquivo deve estar presente no disco.
Abrir o arquivo texto para gravao. Se existir ser substitudo, seno ser criado.
Abrir o arquivo texto para acrscimo. Se existir, os dados sero acrescentados no fim.
Abrir o arquivo texto para gravao e leitura. Se existir, os dados sero atualizados.
Abrir o arquivo texto para gravao e leitura. Se existir, ser reinicializado.
Abrir o arquivo texto para atualizaes e inseres no fim do arquivo.

rb wb ab rb+ wb+ ab+ -

Abrir arquivo binrio para leitura. O arquivo deve estar presente no disco.
Abrir arquivo binrio para gravao. Se existir ser substitudo, seno ser criado.
Abrir arquivo binrio para acrscimo. Se existir, os dados sero acrescentados no fim.
Abrir o arquivo binrio para gravao e leitura. Se existir, os dados sero atualizados.
Abrir o arquivo binrio para gravao e leitura. Se existir, ser reinicializado.
Abrir o arquivo binrio para atualizaes e inseres no fim do arquivo.

Caso o arquivo tente ser aberto mas retorne um valor NULL para o ponteiro de arquivo significa
que ocorreu algum erro, como por exemplo, arquivo inexistente. Para tratar este tipo de
comportamento utiliza-se:
/* Exemplo de abertura, teste de xito e fechamento de arquivo */
void main() {
FILE *arquivo; /* arquivo um ponteiro para um arquivo */
if ((arquivo = fopen(arqteste.txt, w)) == NULL) {
printf (\nErro na abertura do arquivo, verifique!);
exit(0);
}
fclose(arquivo); /* fechamento do arquivo */
}

7.1 EXEMPLO DE LEITURA DE CARACTERE DE ARQUIVO:


void main() {
FILE *arquivo; /* arquivo um ponteiro para um arquivo */
char letra;
if ((arquivo = fopen(arqteste.txt, r)) == NULL) {
printf (\nErro na abertura do arquivo, verifique!);
exit(0);
}
while (letra = getc(arquivo)) != EOF) /* enquanto no fim-de-arquivo l e imprime na tela */
printf (\nO caracter lido %c,letra);
fclose(arquivo); /* fechamento do arquivo */
}

Pg. 33

Programao em Linguagem C

7.2 EXEMPLO DE GRAVAO DE CARACTERE NO ARQUIVO:


void main() {
FILE *arquivo; /* arquivo um ponteiro para um arquivo */
char letra;
if ((arquivo = fopen(arqteste.txt, w)) == NULL) {
printf (\nErro na abertura do arquivo, verifique!);
exit(0);
}
while (letra = getche()) != \r) /* enquanto no for pressionado ENTER imprime no arquivo */
putc(letra, arquivo);
fclose(arquivo); /* fechamento do arquivo */
}

7.3 EXEMPLO DE LEITURA DE STRING DE CARACTERES DO ARQUIVO:


void main() {
FILE *arquivo; /* arquivo um ponteiro para um arquivo */
char frase[81];
if ((arquivo = fopen(arqteste.txt, r)) == NULL) {
printf (\nErro na abertura do arquivo, verifique!);
exit(0);
}
while (fgets(frase, 80, arquivo)) != NULL) /* enquanto existir frase no arquivo imprime na tela */
puts(frase);
fclose(arquivo); /* fechamento do arquivo */
}

7.4 EXEMPLO DE GRAVAO DE STRING EM ARQUIVO:


void main() {
FILE *arquivo; /* arquivo um ponteiro para um arquivo */
char frase[81];
if ((arquivo = fopen(arqteste.txt, w)) == NULL) {
printf (\nErro na abertura do arquivo, verifique!);
exit(0);
}
while (strlen(gets(frase))) > 0) { /* enquanto string maior do que comprimento zero */
fputs(frase, arquivo);
fputs(\n, arquivo);
}
fclose(arquivo); /* fechamento do arquivo */
}

Pg. 34

Programao em Linguagem C

7.5 EXEMPLO DE LEITURA DE ARQUIVO FORMATADA:


void main() {
FILE *arquivo; /* arquivo um ponteiro para um arquivo */
char nome[51];
int codigo;
double salrio;
if ((arquivo = fopen(arqteste.txt, r)) == NULL) {
printf (\nErro na abertura do arquivo, verifique!);
exit(0);
}
while (fscanf(arquivo, %s %d %f, &nome, &codigo, &salario) != EOF)
printf (\n %s %d %f, nome, codigo, salario); /* imprime na tela o que foi lido */
fclose(arquivo); /* fechamento do arquivo */
}

7.6 EXEMPLO DE GRAVAO FORMATADA EM ARQUIVO :


void main() {
FILE *arquivo; /* arquivo um ponteiro para um arquivo */
char nome[51];
int codigo;
double salrio;
if ((arquivo = fopen(arqteste.txt, w)) == NULL) {
printf (\nErro na abertura do arquivo, verifique!);
exit(0);
}
do {
printf (\n Digite o codigo, o nome e o salrio do cliente: );
scanf (%s %s %f, &nome, &codigo, &salrio);
fprintf (arquivo, %d %s %f, codigo, nome, salrio);
} while (strlen(nome) >1);
fclose(arquivo); /* fechamento do arquivo */
}

Pg. 35

Programao em Linguagem C

8 APNDICE (BIBLIOTECA DE FUNES)


8.1 FUNES DE ENTRADA E SADA PADRO (STDIO.H):
clearerr (arqpt)
Esta funo coloca em zero (desligado) o indicador de erro para o arquivo do ponteiro
definido. O indicador de EOF tambm restitudo.
fclose (arqpt)
Fecha o arquivo definido pelo ponteiro e esvazia seu buffer. Aps o uso desta funo o
ponteiro no est mais associado ao arquivo e quaisquer buffers automaticamente alocados so
liberados. Se a funo for bem sucedida devolve zero, caso contrrio, devolve um nmero diferente
de zero.
feof (arqpt)
Esta funo verifica o indicador de posio de arquivo para determinar se foi atingido o final
do arquivo associado ao ponteiro definido. Um valor diferente de zero devolvido se o indicador de
posio de arquivo est no final do mesmo, caso contrrio devolve zero.
ferror (arqpt)
Esta funo verifica a ocorrncia de erros em um dado arquivo definido pelo ponteiro. Caso
retorne zero indica que nenhum erro ocorreu, caso contrrio algum erro ocorreu.
fflush (arqpt)
Se o ponteiro est associado a um arquivo aberto para gravao, a funo promove a
descarga do buffer de sada para o arquivo em questo. Caso o ponteiro esteja associado a um
arquivo de leitura, o contedo do buffer de entrada esvaziado. Nos dois casos, o arquivo continua
aberto. Um valor de retorno indica sucesso ou retornado EOF se ocorrer um erro.
fgetc (arqpt)
Esta funo devolve o prximo caractere do arquivo de entrada associado ao ponteiro e
incrementa o indicador de posio de arquivo. O caractere lido um unsigned char que convertido
em inteiro. Se o final do arquivo for alcanado a funo retorna EOF, mas deve-se utilizar a funo
feof para verificar o final do arquivo quando trabalhar com arquivos binrios, pois EOF um valor
inteiro vlido. Se a funo encontrar um erro tambm retorna EOF.
fgetpos (arqpt, fpost_t *posicao)
Esta funo armazena o valor atual do indicador de posio do arquivo definido pelo ponteiro
no ponteiro posicao. O objeto apontado para posicao deve ser do tipo fpost_t, que um tipo definido
na biblioteca stdio.h. O valor armazenado til apenas em uma chamada subseqente da funo
fsetpos(). Caso ocorra algum erro a funo retorna um valor diferente de zero, seno retorna zero.
fgets (linha, num, arqpt)
Esta funo l (num-1) caracteres do arquivo definido pelo ponteiro e coloca-os no vetor de
caracteres linha. Os caracteres so lidos at que uma nova linha, ou um EOF, seja encontrado ou
at que o limite especificado seja atingido. Aps os caracteres serem lidos, um nulo colocado na
matriz imediatamente aps o ltimo caractere. O caractere de nova linha mantido e parte da
linha. Caso seja bem sucedida a funo devolve a linha e um ponteiro nulo devolvido quando
ocorre alguma falha. Se ocorrer um erro de leitura, o contedo da matriz apontada por linha
indeterminado.

Pg. 36

Programao em Linguagem C
fopen (nomearq, modo)
Esta funo abre um arquivo no modo especificado e devolve um ponteiro associado a ele.
Os tipos de operaes permi tidas nos arquivos so definidos pelo modo. Os valores legais para o
modo, como especificado pelo padro ANSI, so mostrados no captulo 7. O nome do arquivo deve
ser uma string de caracteres que constitua um nome vlido de arquivo, como definido pelo sistema
operacional, e pode incluir uma especificao de percurso (caminho ou path), se o ambiente suporta.
Se a funo consegue abrir corretamente o arquivo ela retorna um ponteiro, caso contrrio
devolvido um ponteiro nulo (NULL).
fprintf (arqpt, formato)
Esta funo escreve no arquivo especificado utilizando a formatao de contedo de formato.
O valor de retorno o nmero de caracteres realmente escritos. Se ocorre um erro, um nmero
negativo devolvido. Pode haver de zero a vrios argumentos o nmero mximo depende do
compilador e do sistema operacional.
fputc (letra, arqpt)
Esta funo escreve o caractere letra no arquivo especificado pelo ponteiro na posio atual
do arquivo e avana o indicador de posio de arquivo. Embora letra seja declarada como inteiro por
razes histricas ele convertido para unsigned char. Como todos os argumentos de caracteres so
elevados a inteiros no momento da chamada, variveis tipo caractere geralmente so usadas como
argumentos. Se um inteiro fosse usado, o byte mais significativo seria simplesmente ignorado. O
valor devolvido pela funo o do caractere escrito, se ocorrer um erro ela retorna EOF.
fputs (string, arqpt)
Esta funo escreve no arquivo definido pelo ponteiro o contedo da string. O terminador nulo
no escrito. Ela devolve um valor no negativo em caso de sucesso e EOF em caso de falha.
fread (buf, tam, num, arqpt)
Esta funo l num objetos, cada um com tamanho tam bytes de comprimento do arquivo
definido pelo ponteiro e coloca-os na matriz apontada por buf. O indicador de posio de arquivo
avanado pelo nmero de caracteres lidos. Ela devolve o nmero de itens realmente lido. Caso
sejam lidos menos itens do que o solicitado na chamada, isso significa que ocorreu um erro ou que o
final de arquivo foi atingido.
fscanf (arqpt, formato)
Esta funo opera exatamente como o scanf, mas l a informao do arquivo definido pelo
ponteiro ao invs da entrada padro (stdin). Ela devolve o nmero de argumentos que realmente
receberam valores. Esse nmero no inclui os campos ignorados. Um valor de retorno EOF significa
que ocorreu uma falha antes que a primeira atribuio tenha sido feita.
fseek (arqpt, passo, inicio)
Esta funo coloca o indicador de posio de arquivo associado ao ponteiro de acordo com
os valores de inicio e passo. Ela suporta operaes de Entrada e Sada aleatrias. O passo o
nmero de bytes a partir do inicio at chegar a nova posio.
Um valor de retorno zero indica que a funo completou com sucesso, seno ocorreu falha.
fsetpos (arqpt, fpost_t posicao)
Esta funo move o indicador de posio de arquivo vinculado ao ponteiro definido para o
ponto especificado pelo objeto apontado por posicao. Esse valor deve ser previamente obtido atravs
de uma chamada a fgetpos. O tipo fpost_t definido pela biblioteca stdio.h. Aps o uso desta
funo o indicador de fim de arquivo desligado e qualquer chamada funo ungetc() se torna
nula.

Pg. 37

Programao em Linguagem C
ftell (arqpt)
Esta funo devolve o valor atual do indicador de posio de arquivo do ponteiro definido.
Para arquivos binrios o valor o nmero de bytes cujo indicador est a partir do incio do arquivo.
Para arquivos texto o valor de retorno pode no ser significativo, exceto como um argumento de
fseek, devido s possveis tradues de caracteres.
fwrite (buf, tam, num, arqpt)
Esta funo escreve num objetos no arquivo apontado pelo ponteiro arqpt que esto
armazenados na matriz de caracteres apontada por buf. O indicador de posio de arquivo
avanado pelo nmero de caracteres escritos. Ela devolve o nmero de itens realmente escritos, que
ser igual ao nmero solicitado, caso a funo seja bem sucedida. Se forem escritos menos itens
que os solicitados, ocorreu algum erro. Para arquivos texto, diversas tabulaes de caracteres
podem ocorrer, mas no afetaro o valor devolvido.
getc (arqpt)
Esta funo devolve o prximo caractere do arquivo definido pelo ponteiro arqpt de entrada a
partir da posio atual e incrementa o indicador de posio de arquivo. O caractere lido como um
unsigned char e convertido para inteiro.
Se o final do arquivo for encontrado ela retorna EOF. Porm como EOF um valor inteiro
vlido, deve-se usar a funo feof() para verificar o final de arquivo quando trabalhar com arquivos
binrios. Se a funo encontra um erro tambm devolve EOF. Quando se trabalha com arquivos
binrios, deve-se usar a funo ferror() para verificar erros em arquivos.
printf (string de controle, argumentos)
Esta funo imprime na tela (sada padro stdout) a string de controle substituindo os
formatadores pelos argumentos definidos. Ela retorna o nmero de caracteres realmente escritos.
Um valor negativo indica erro.
putc (letra, arqpt)
Esta funo escreve a letra no arquivo definido pelo ponteiro. Ela devolve EOF se ocorrer
algum erro. Se o arquivo foi aberto no modo binrio, EOF um valor vlido para um caractere, desta
forma, importante utilizar a funo ferror() para determinar se ocorreu algum erro.
putch (letra)
Esta funo escreve na sada padro o caractere contido em letra. Em muitas
implementaes, a sua sada no pode ser redirecionada. Alm disso, em alguns ambientes, ela
pode operar relativamente a uma janela em lugar da tela.
puts (string)
Esta funo escreve ao vetor de caracteres apontada por string no dispositivo de sada
padro. O terminador nulo traduzido para uma nova linha (\n). Ela devolve um valor negativo, se
bem sucedida e EOF caso contrrio.
rewind (arqpt)
Esta funo move o indicador de posio do arquivo para o incio do mesmo. Ela a
t mbm
limpa os indicadores de erro e de final de arquivo associados ao ponteiro. No h valor de retorno.
scanf (string de controle, argumento)
Esta funo uma rotina de entrada de dados de uso geral que l os argumentos conforme a
formatao imposta na string de controle. o complemento do printf().

Pg. 38

Programao em Linguagem C

8.2 FUNES DE TESTES DE TIPOS (CTYPE.H)


isalnum (caractere)
Esta funo retorna um valor diferente de zero se o caractere for uma letra ou um dgito. Se
no for alfanumrico ela retorna zero.
isalpha (caractere)
Esta funo devolve um valor diferente de zero se o caractere for uma letra do alfabeto, caso
contrrio, devolve zero. O que constitui uma letra pode varia de idioma para idioma.
iscntrl (caractere)
Esta funo devolve um valor diferente de zero se o caractere est entre 0 e 0x1F ou igual a
0x7F (tecla DELETE); caso contrrio, devolve zero.
isdigit (caractere)
Esta funo devolve um valor diferente de zero se o argumento for um dgito, ou seja,
algarismos de 0 a 9. Caso contrrio, retorna zero.
isgraph (caractere)
Esta funo devolve um valor diferente de zero se o caractere pode ser impresso, com
exceo do espao. Caso contrrio devolve zero.
islower (caractere)
Esta funo retorna um valor diferente de zero se o caractere uma letra minscula, caso
contrrio, retorna zero.
isprint (caractere)
Esta funo retorna um valor diferente de zero se o caractere pode ser impresso, incluindo o
espao; caso contrrio retorna zero.
ispuct (caractere)
Esta funo devolve um valor diferente de zero se o caractere um smbolo especial, ou seja,
ele inclui todos os caracteres que podem ser impressos e no sejam alfanumricos num espao.
Caso contrrio retorna zero.
isspace (caractere)
Retorna um valor diferente de zero ser o caractere um espao, tabulao horizontal,
tabulao vertical, alimentao de formulrio, retorno de carro ou caractere de nova linha; caso
contrrio retorna zero.
isupper (caractere)
Esta funo devolve um valor diferente de zero se o caractere for uma letra maiscula, caso
contrrio retorna zero.
isxdigit (caractere)
Esta funo devolve um valor diferente de zero se o caractere um dgito hexadecimal; caso
contrrio devolve zero. Um dgito hexadecimal est na faixa de a a f, de A a F ou de 0 a 9.
tolower (caractere)
Converte o caractere para minscula.
toupper (caractere)
Converte o caractere para maiscula.

Pg. 39

Programao em Linguagem C

8.3 FUNES DE CADEIAS DE CARACTERES (STRING.H)


strcat (frase1, frase2)
Esta funo concatena uma cpia de frase2 no final de frase1 e termina a frase1 com um nulo
(\0). O terminador nulo, que originalmente finalizava a frase1, sobreposto pelo primeiro caractere
de frase2. A frase2 permanece inalterada na operao. Se os vetores de caracteres se sobrepem, o
comportamento de strcat() indefinido. Ela retorna a frase1 final.
strchr (frase, letra)
Esta funo retorna um ponteiro para a posio da primeira ocorrncia de letra em frase. Se
no for encontrada nenhuma coincidncia, ser devolvido um ponteiro nulo (NULL).
strcmp (frase1, frase2)
Esta funo compara lexicograficamente duas strings e devolve um inteiro baseado no
resultado, conforme definido abaixo:
Valor.......................................................................Significado
Menor do que zero............................................................ frase1 menor que frase2.
Zero.......................................................................frase1 igual a frase2.
Maior do que zero.............................................................frase1 maior a frase2.
strcpy (frase1, frase2)
Esta funo copia o contedo de frase2 em frase1. frase2 deve ser um ponteiro para uma
string terminada com um nulo. A funo devolve um ponteiro para a frase1. Se frase1 e frase2 se
sobrepem, o comprimento de strcpy() indefinido.
strerror (num)
Esta funo devolve um ponteiro para uma string definida pela implementao, que
associada ao valor de num. Sob nenhuma circunstncia deve-se modificar a string.
strlen (frase)
Devolve o comprimento da string frase terminada por um nulo. O nulo no contado.

8.4 FUNES MATEMTICAS (MATH.H)


acos (numero)
Esta funo retorna o arco-cosseno do nmero (entre 0 e 1) em radianos.
asin (numero)
Esta funo retorna o arco-seno do nmero (entre 0 e 1) em radianos.
atan (numero)
Esta funo retorna o arco-tangente do nmero em radianos.
atan2 (num1, num2)
Esta funo retorna o arco-tangente de num1/num2 em radianos.
ceil (num)
Esta funo retorna o menor nmero inteiro, no menor que num, como doubl.
cos (ngulo)
Esta funo retorna o valor do cosseno do ngulo. O ngulo definido em radianos.

Pg. 40

Programao em Linguagem C

cosh (ngulo)
Esta funo retorna o cosseno hiperblico do ngulo. O ngulo definido em radianos.
exp (numero)
Esta funo retorna o valor do nmero de Neper elevado ao numero (e num).
fabs (numero)
Esta funo retorna o valor absoluto do nmero.
floor (num)
Esta funo retorna o maior nmero inteiro, no maior que num, como doubl.
fmod (num1, num2)
Esta funo retorna resto da divis o de num1 por num2 (Resto de num1/num2).
ldesp (num1, num2)
Esta funo retorna o valor da expresso num1*2num2.
log (numero)
Esta funo devolve o logaritmo natural (ln) do nmero. Ocorrer um erro de domnio se o
nmero for negativo e um erro de escala se ele for zero.
log10 (numero)
Esta funo retorna o logaritmo na base 10 do numero. Tem os mesmos erros da funo log.
modf (numero, retorno)
Esta funo decompe o numero nas suas partes inteira e fracionria. Ela devolve a parte
fracionria e coloca a parte inteira na varivel apontada por retorno.
pow (base, exp)
Esta funo retorna o resultado da exponenciao da base pelo exp. Ocorrer um erro de
domnio se a base for zero e se o exp for menor ou igual a zero. Tambm ocorre um erro de domnio
se a base for negativa e exp no for um nmero inteiro. Um estouro produzir um erro de escala.
sqrt (numero)
Esta funo retorna a raiz quadrada de um nmero. Ocorrer um erro de domnio se o
argumento for negativo.
sin (ngulo)
Esta funo retorna o seno do ngulo. O ngulo definido em radianos.
sinh (ngulo)
Esta funo retorna o seno hiperblico do ngulo. O ngulo definido em radianos.
tan (ngulo)
Esta funo retorna a tangente do ngulo. O ngulo definido em radianos.
tanh (ngulo)
Esta funo retorna a tangente hiperblica do ngulo. O ngulo definido em radianos.

Pg. 41

Programao em Linguagem C

8.5 FUNES UTILITRIAS (STDLIB.H)


atof (string)
Converte a string para double.
atoi (string)
Converte a string para integer.
atol (string)
Converte a string para long integer.
rand (void)
Retorna um nmero inteiro pseudo-randmico na faixa de 0 a RAND_MAX, que pelo menos
32767.
free (ptr)
Esta funo retorna ao Heap a memria apontada por ptr, tornando a memria disponvel
para alocao futura.
calloc (numobj, tam)
Retorna um apontador para o espao de um vetor de numobj objetos, cada um com tamanho
indicado por tam, ou NULL se o pedido no puder ser satisfeito. O espao inicializado para zero
bytes.
malloc (tam)
Esta funo retorna um ponteiro para o primeiro byte de uma regio de memria de tamanho
tam que foi reservada no Heap. Caso no haja memria suficiente para satisfazer a solicitao, a
funo devolve um ponteiro nulo. Deve-se sempre verificar se o valor devolvido no um ponteiro
nulo antes de utiliza-lo. A tentativa de usar um ponteiro nulo resultar geralmente numa quebra do
sistema.
realloc (ptr, tam)
Esta funo modifica o tamanho da memria previamente alocada apontada pelo ponteiro ptr
para aquele tamanho especificado em tam. O valor tam pode ser maior ou menor que o original. Um
ponteiro para o bloco de memria devolvido porque a funo pode precisar mover o bloco para
aumentar seu tamanho. Se isso ocorre, o contedo do bloco antigo copiado no novo bloco;
nenhuma informao perdida.
Se o ponteiro ptr um nulo, a funo simplesmente aloca tam bytes de memria e devolve
um ponteiro para a memria alocada. Se o tam zero, a memria apontada por ptr liberada.
abort ()
Esta funo provoca a concluso imediata do programa. Geralmente, nenhum arquivo
fechado. Em ambientes que a suportam, esta funo devolve um valor definido pela implementao
ao processo chamador, indicando a falha.
exit (num)
Esta funo provoca a terminao normal imediata de um programa. O valor de num
passado ao processo chamador, normalmente o sistema operacional, se o ambiente o suporta. Por
conveno, se o valor de num zero, uma terminao normal do programa assumida. Um valor
diferente de zero pode indicar um erro definido pela implementao.

Pg. 42

Programao em Linguagem C
system (string)
Esta funo passa a string como um comando para o processador de comandos do sistema
operacional. Quando a funo chamada com um ponteiro para uma string nula, ela devolve um
valor diferente de zero se um processador de comandos est presente; caso contrrio devolve zero.
O valor definido pela funo, quando chamada com um ponteiro para a string definido pela
implementao. No entanto, geralmente devolve zero se o comando foi executado com sucesso; e
um valor diferente de zero caso contrrio.

8.6 FUNES DE DATA E HORA (TIME.H)


clock()
Retorna a hora do processador usada pelo programa desde o incio da execuo, ou 1 se
no estiver disponvel.
time ()
Retorna a hora do calendrio corrente ou 1 se a hora no estiver disponvel.
difftime (hora2, hora1)
Retorna um valor double para a diferena entre hora2 e hora1 (hora2 hora1) em segundos.
asctime (ptr)
Esta funo converte a hora na estrutura ptr para uma cadeia no formato:
Sun Jan 3 15:14:13 2001\n\0
strftime (retorno, tamax, formato, ptr)
Esta funo retorna em retorno a hora armazenada na estrutura ptr de acordo com o formato
definido (semelhante ao printf). Os caracteres comuns (incluindo o \0 terminal) so copiados para
retorno. Os formatadores para o formato so definidos na tabela abaixo. No mais de tamax
caracteres so colocados em retorno. A funo pode retornar o nmero de caracteres, excluindo o \0,
ou zero se forem produzidos mais do que tamax caracteres.
Formatador ..................Sigfnicado
%a.........................dia da semana abreviado
%A.........................dia da semana completo
%b.........................nome do ms abreviado
%B.........................nome do ms completo
%c.........................representao local da data e hora
%d.........................dia do ms (0 a 31)
%H.........................hora (relgio de 24 horas)(00-23)
%l..........................hora (relgio de 12 horas)(01-12)
%j..........................dia do ano (001-366)
%m.........................ms (01-12)
%M.........................minuto (00-59)
%p.........................equivalente local de AM e PM
%s.........................segundo (00-61)
%U.........................nmero da semana no ano (Dom. como 1 dia da semana)(00-53)
%w.........................dia da semana (0-6, domingo 0)
%W ........................ nmero da semana no ano (Seg. como 1 dia da semana)(00-53)
%x.........................representao local da data
%X.........................representao local da hora
%y.........................ano sem sculo (00-99)
%Y.........................ano com sculo.
%Z.........................nome do fuso horrio, se houver.

Pg. 43

Programao em Linguagem C

8.7 FUNES DE ENTRADA E SADA ACESSRIAS (CONIO.H)


clrscr()
Esta funo executa a limpeza da tela.
getch () ou getche ()
Estas funes no so definidas pelo padro C ANSI. Porm, elas geralmente so includas
em compiladores baseados no DOS. A funo getch() devolve o primeiro caractere lido no console
(teclado), mas no o mostra na tela. J a funo getche() faz a mesma coisa, mas mostra o
caractere na tela.
getpass(Mensagem)
Esta funo retorna uma string solicitada a partir da mensagem e que no fica visvel na tela,
como entrada de senhas.
kbhit ()
Esta funo no definida no padro C ANSI. Porm, ela encontrada sob diversas nomes,
em virtualmente todos os compiladores C. Ela devolve um valor diferente de zero se uma tecla foi
pressionada no console, caso contrrio devolve zero.
cgets (buffer)
L o contedo do buffer de teclado.
cprintf (String de controle, argumentos)
Escreve na janela de modo texto a string e argumentos formatados.
cputs (string)
Escreve a string na janela de modo texto.
cscanf (formato, argumentos)
L os argumentos conforme o formato estabelecido.
delline()
Elimina a linha onde se encontra o cursor.
gettext (esquerda, cima, direita, baixo, retorno)
Copia o texto da janela de texto delimitada para a posio de memria indica em retorno.
gettextinfo(&nomevar)
Retorna uma estrutura com as informaes de configurao de tela existente.
gotoxy(px, py)
Posiciona o cursor na posio especfica px, py da janela de texto.
highvideo()
Selecione o modo de alta resoluo de caracteres.
insline()
Insere uma nova linha em branco na posio do cursor da janela de texto.
lowvideo()
Seleciona o modo de baixa resoluo de caracteres.

Pg. 44

Programao em Linguagem C
movetext(esquerda, cima, direita, baixo, destesq, destcima)
Copia o texto contido no retangulo definido por esquerda, cima, direita, baixo para o novo
retngulo iniciado em destesq e destcima com as mesmas dimenses.
normvideo()
Retorna ao modo normal de resoluo de caracteres.
_setcursortype (tipo)
Define o padro de cursor a ser utilizado. O tipo pode variar conforme as opes abaixo:
_NOCURSOR omite o cursor.
_SOLIDCURSOR cursor slido.
_NORMALCURSOR cursor padro.
textcolor (cor)
Define as caractersticas de cores para as letras de texto. Pode ser configurado conforme a
tabela abaixo:
Constante simblica
Valor Constante simblica Valor
BLACK
0
DARKGRAY
8
BLUE
1
LIGHTBLUE
9
GREEN
2
LIGHTGREEN
10
CYAN
3
LIGHTCYAN
11
RED
4
LIGHTRED
12
MAGENTA
5
LIGHTMAGENTA
13
BROWN
6
YELLOW
14
WHITE
15
LIGHTGRAY
7
BLINK
128
textbackground (cor)
Altera a cor de fundo da tela, as seguem a mesma definio da tabela acima at o valor 7.
textmode (modo)
Define o modo de apresentao da tela conforme a tabela abaixo:
Constante simblica
LASTMODE
BW40
C40
BW80
C80
MONO

Valor numrico
-1
0
1
2
3
7

C4350

64

Modo de texto

Modo de texto anterior


Preto e branco com 40 colunas
Colorido com 40 colunas
Preto e branco com 80 colunas
Colorido com 80 colunas
Monocromtico com 80 colunas
Padro EGA com 43 linhas e padro VGA
com 50 linhas

wherex()
Retorna a posio horizontal atual do cursor.
wherey()
Retorna a posio vertical atual do cursor.
window(esquerda, cima, direita, baixo)
Define a janela de texto ativa com as dimenses definidas.

Pg. 45

You might also like