Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
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.
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
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.
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.
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
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
ou
a = 10;
a += 10;
ou
ou
++a;
--b;
a=2
b=0
Exemplos:
a = b = 2;
c = ++a;
d = b--;
e = c++ - --d;
c=3ea=3
d=2eb=1
e = 2, c = 4 e d = 1
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;
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,
Significado
maior que
maior ou igual a
menor que
menor ou igual a
igual a
diferente de
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
op2
V
F
V
F
op1&&op2
V
F
F
F
op1||op2
V
V
V
F
!op1
F
F
V
V
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
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.
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);
}
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
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
Pg. 19
Programao em Linguagem C
#elif CTE2
#endif
#ifdef NOME
#else
#endif
#ifndef NOME2
#else
#endif
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();
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
float funo1();
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.
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).
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
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.
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.
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.
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 */
}
Pg. 33
Programao em Linguagem C
Pg. 34
Programao em Linguagem C
Pg. 35
Programao em Linguagem C
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
Pg. 39
Programao em Linguagem C
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
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.
Pg. 43
Programao em Linguagem C
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
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