Você está na página 1de 97

Linguagem C

9
Prefcio

Esta Apostila foi planejada para


um curso de programao em Linguagem C , e
o objetivo principal de apresent-la
claramente, mostrando assim a criao de
vrios programas, explicando exatamente o
que ocorre em cada passo.
Por que C ? Porque popular,
disponvel na maioria dos sistemas de
computao e relativamente fcil de aprender,
at mesmo como primeira linguagem de
programao.
Ao aluno interessado haver a
oportunidade de criar novos programas e de
desenvolver mais idias a partir das
apresentadas.
Para os exemplos contidos na
apostila, foi utilizado o compilador Turbo C++
do Borland para computadores IBM-PC e
sistema operac. MS-DOS, mas podem ser
processados em qualquer compilador
compatvel com o MS-DOS ou UNIX.

Prof Call
10
Captulo 1

Introduo

Origem da Linguagem C
Linguagem de Mdio Nvel e Estruturada
Interpretadores e Compiladores
Modelo de um programa em C
Compilao Separada
Compilando um programa em C
Mapa de Memria de C

11
Origem
Foi inventada e implementada inicialmente pr Dennis M.
Ritchie e Ken Thompson em um DEC PDP-11 utilizando o sistema
operacional UNIX, em 1972.

Linguagem C com
BCPL B C padro formado
pelo ANSI
Desenvolveu a
Linguagem C (dcada de 70)
Linguagem antiga, mas
ainda em uso na Europa.
Originou a Linguagem B.

ANSI : Padro que define um conjunto completo de funes de E/S


que pode ser utilizado para ler e escrever qualquer tipo de dado.

Linguagem de Mdio Nvel

Para computadores, uma linguagem de nvel mdio. No


significa que menos poderosa ou menos desenvolvida. Linguagem C
combina elementos de linguagem de alto nvel com funcionalidade de
linguagem Assembly.

Permite a manipulao de bits, bytes e endereos.


Bit: Sinnimo de dgito binrio; 0 ou 1.
Byte: Caractere de 8 bits
Endereo: Nele esto contidas as memrias do computador.

Linguagem C tem velocidade de Linguagem de Mquina


muito utilizada em editores, compiladores, gerenciadores de banco
de dados, etc... 12
Nvel mais alto: Ada , Modula-2 , Pascal , Cobol , Fortran , Basic.

Mdio Nvel: C , Forth , Macro-assembler.

Nvel mais baixo: Assembler.

Um cdigo em C muito portvel !

OBS: Portabilidade significa que possvel adaptar um software


escrito para um tipo de computador a outro.

Exemplo:

Programa para um Compilador Programa p/


Apple Mac Intosh C um IBM-PC

Palavras-Chaves: A Linguagem C possui apenas 32


palavras-chaves. Se formos comparar, a linguagem Basic (p/ IBM-PC)
contm 159 palavras-chaves !

Linguagem Estruturada
A caracterstica especial de uma linguagem estruturada de,
atravs da criao de sub-rotinas, com o uso de variveis locais,
processar eventos que no causem nenhum efeito inesperado nas
outras partes do programa. Por exemplo, em uma linguagem
estruturada, o uso do goto proibido.

Linguagem no estruturada: Fortran, Basic, Cobol.


Linguagem estruturada: Pascal, C ,Modula-2, Ada.

13
Obs: O termo Linguagem estruturada em blocos no
rigorosamente aplicvel em C.
Linguagem C simplesmente referida como Linguagem
Estruturada.

Linguagens estruturadas tendem a ser modernas, pois os


programadores a consideram mais fceis.

Funo = Sub-rotina isolada

Permite definir e codificar separadamente


as tarefas de um programa.

Aps ter sido criada (a funo), permite ser utilizada em


vrias situaes, sem criar efeitos inesperados em outras partes do
programa.
Outro meio de estruturar o cdigo em C criando-se um
bloco de cdigo. Este bloco escrito no programa entre chaves: { }
Isto faz com que o programador conceitue a verdadeira
natureza da rotina.
A linguagem C prope ao usurio planejar programas
estruturados e modulares. O resultado um programa mais legvel e
documentado.

Linguagem para Programadores

Nem todas linguagens de computadores so para


programadores !!!
Por exemplo: Linguagem Basic foi criada para os usurios
que no precisam, necessariamente, ser programadores e assim
resolverem problemas relativamente simples em seus computadores.
A linguagem C foi criada, influnciada e testada por
programadores profissionais. Ela proporciona:
14
Poucas restries e reclamaes;
Funes isoladas;
Estruturas de bloco;
Conjunto compacto de palavras-chaves.

possvel tornar um cdigo escrito, compil-lo e rod-lo


em outra mquina com pouca ou nenhuma modificao.
Esta portabilidade economiza tempo e dinheiro !

Interpretadores e Compiladores
Os termos, interpretadores e compiladores referem-se a
maneira como um programa executado.

Exemplo: Basic - normalmente interpretada


C - compilada

Interpretadores e compiladores so simplesmente programas


sofisticados que operam sobre o cdigo-fonte do seu programa.

Interpretador: L o cdigo-fonte de seu programa uma linha por vez,


para depois finalizar (RUN).
Compiladores: L o programa inteiro de uma s vez e o converte em
um cdigo-objeto, com isso o programa executado diretamente.

Palavras-Chaves de C:

auto double int struct


break else long switch
case enum register typedef
char extern return union
const float short unsigned
continue for signed void
default goto sizeof volatile
do if static while
15
O compilador, se no houver erros, gera um programa em
disco com o sufixo .Obj com as instrues j traduzidas. Este
programa no pode ser executado at que seje criado um produto
final em disco com o sufixo .Exe , produto este feito por um
programa chamado Linkeditor .
Com isso a velocidade de execuo do programa pode ser de
20 vezes mais rpida do que quando o programa interpretado.

Mais vantagens:
Se o programa j foi compilado e linkeditado, no ser mais
necessria a presena do compilador.
Programas .Exe no podem ser alterados, com isso o cdigo fonte
estar protegido.

Obs:

Linkeditor: Une funes compiladas separadamente em um


programa. Combina as funes da Biblioteca C padro com o cdigo
escrito pelo programador. A sada do linkeditor um programa
executvel.

Tempo de compilao: Refere-se ao tempo durante o qual o


compilador l os arquivos-fonte e gera o cdigo-objeto. Um erro em
tempo de compilao um erro de sintaxe descoberto durante a
compilao.

Sintaxe: So regras a serem seguidas ao digitar comandos. Para


evitar um erro no programa, indispensvel a ateno quanto sintaxe
de C. O compilador avisar ao usurio, no caso de um erro.

Tempo de execuo: Tempo durante o qual um programa roda .

Depurao: o processo de localizar e corrigir erros de execuo.

16
Modelo de programa C
Em muitos compiladores acrescidas diversas palavras-
chaves para explorar melhor os processadores 8088/8086.
As mais comuns so:

asm _cs _ds _es


_ss cdecl far huge
interrupt near pascal

Todas palavras-chaves em C so minsculas, else uma


palavra-chave, mas ELSE no !
A palavra-chave no pode ser utilizada como uma varivel
ou nome de uma funo.
A nica funo que sempre deve estar presente :

main ( )

a primeira funo a ser chamada quando a execuo do


programa comea, embora no seja tecnicamente parte da linguagem
C.
A funo main( ) no utilizada como varivel.

A Biblioteca e a Linkedio
Todo compilador C vem com uma biblioteca C padro de
funes para realizar tarefas necessrias mais comuns, definidas pelo
padro ANSI C. No entanto provvel que um compilador tenha
outras funes adicionais, como por exemplo: grfica.
Se o programador usa uma funo (determinada funo)
vrias vezes e sua biblioteca padro no contm esta funo,
possvel coloc-la em uma biblioteca. Assim sempre que necessrio
ela ser utilizada. E quando esta funo for chamada, uma vez
memorizada pelo compilador C, o linkeditor combinar o cdigo-
escrito com o cdigo-objeto j encontrado na biblioteca. Este
processo chamado de Linkedio.
17
Alguns compiladores C tem seu prprio linkeditor,
enquanto outros usam o linkeditor padro fornecido pelo sistema
operacional.

Compilao Separada

Para programas longos, permitido que um programa esteja


contido em vrios arquivos e que cada arquivo seje compilado
separadamente. Com isso podemos mudar o cdigo de um arquivo,
sem recompilar o programa todo.

Compilando um Programa em C
Para compilarmos um programa em C, devemos:
Criar o programa ;
Compilar o programa ;
Linkeditar o programa com funes necessrias da biblioteca.

Para alguns compiladores necessrio usar um editor


separado para criar o programa.
Os compiladores s aceitam arquivos de texto padro para o
editor.

Mapa de memria de C

Pilha

Heap
> 4 regies da memria
Variveis Globais

Cdigo do Programa

Obs: Acima temos um mapa conceitual.


18
Pilha: Guarda o estado atual da CPU.

Heap: Memria livre, a disposio do programa C.

Variveis Globais: So criadas e acessadas independentemente.

Cdigo do Programa: O compilador gera o cdigo.

Cdigo-fonte: o programa que pode ser lido; a entrada para o


compilador C.

Cdigo-objeto: Traduz o cdigo-fonte em linguagem de mquina; a


entrada para o linkeditor.

19
Captulo 2

Elementos
Bsicos de
C

A funo main ( )
Comentrios
A funo printf ( )
Cdigos de caracteres de Escape
Strings
Comandos de formato printf
Exerccios

20
A funo main ( )
Um programa em C constitudo de:

Ttulo: main ( ) , parte principal de qualquer programa C.

Corpo do Programa: iniciado por uma chave { , e


terminado por outra chave } .

Uma funo, que necessariamente estar presente


denominada de main ( ), que a primeira funo a ser chamada
quando o programa executado.

main ( ) Contm um esboo do que o programa faz; inicia a


execuo do programa.

main ( ) primeira funo a ser executada


{ inicia o corpo da funo
} termina a funo

Os parnteses ( ) aps o nome indicam que esta uma


funo. Toda funo deve ser iniciada por uma chave de abertura e
encerrada por uma chave de fechamento.
Devemos nos preocupar com o layout do programa, pois se
um programa for bem organizado, conseqentemente ser mais
simples de se ler e entender.

Nome da funo
{
instruo;
instruo;
{
instruo;
}
instruo;
}
21
Quando aberta uma chave {, deslocamos o cdigo de
programa direita desta, e quando fechamos uma chave },
deslocamos para a esquerda.

Obs: Letra minscula para formao escrita de variveis,


funes e comandos.
Letra maiscula para constantes.

Comentrios
Todo programa deve conter comentrios como guia de
explicao, e em C, iniciado com o par de caracteres : /* ; e
finalizado pelo par: */ .
O comentrio pode ser colocado em qualquer lugar do
programa, menos no meio de uma palavra-chave ou entre outro
comentrio, e sempre so delimitados pelo chamados smbolos de
comentrios.

/* barra-astersco
*/ astersco-barra
Comentrios so teis tambm para identificar o propsito
ou nome de um programa.

Exemplo correto: Exemplo incorreto:

/* Primeiro programa em C */ swi/*isso no funciona*/tch

main ( )
{ ou
printf (Programando em C );
} /*este progr./*no funciona*/

22
Como o compilador ignora caracteres contidos em smbolos
de comentrios e espaos, os comentrios podem ser escritos em
vrias linhas.

/*
Exemplo de comentrio
em vrias
linhas
*/

Muitos programadores inserem um grande comentrio


descritivo ao incio dos cdigos. Isto tambm ocorre quando
desenvolvido programas em partes separadas por pessoas distintas e
depois unidos num produto final.

A funo printf ( )

uma funo de E/S que no faz parte do padro de


linguagem C, ela providenciada pelo compilador C pois todos os
sistemas tem uma verso de printf ( ). Esta funo escreve na tela um
texto entre aspas duplas. Pertence a uma biblioteca do compilador e
deve ser linkeditada em nossos programas.
Funo uma coleo de comandos identificada por nome.
Utilizar o nome de uma funo em um comando chamar a funo e
executar suas instrues; ou seja, os parnteses em printf ( ) indicam
que estamos utilizando uma funo e no interior desses parnteses
esto as informaes passadas pelo programa main ( ) funo printf(
). Esta informao chamada de argumento de printf ( ). O controle,
ento, passado para a funo printf que imprimir na tela do monitor
de vdeo, e quando encerra a execuo desta, o controle transferido
novamente para o programa.

23
A sintaxe para a funo printf ( ) :

printf ( expresso de controle , lista de argumentos)

A expresso de controle pode conter caracteres que sero,


por sua vez, demonstrados na tela do computador e comandos de
formato ( cdigos de formatao ) que indicam a forma em que os
argumentos devem ser impressos.
A funo printf( ) pode ter um nico ou vrios argumentos.
Obs: Os argumentos so separados por vrgula ( , ).

Exemplo:
/* primeiro exemplo */

main( )
{
printf(O resultado do jogo foi %d x 0,2);
}
Na primeira linha do programa temos um comentrio
sugerindo um ttulo ou nome do programa. Todo comentrio fica a
critrio do programador, sendo assim no obrigatrio o uso deste.
A funo main( ) a seguir inicia a parte executvel.
A chave de abertura utilizada para que o compilador possa
ler as instrues.
Em seguida a funo printf( ) passa a ter o controle. O texto
a ser impresso est compreendido entre aspas duplas e o cdigo de
formatao %d indica que ser impresso um nmero decimal. Este
nmero decimal o 2 que se encontra na lista de argumentos.
A linha de instruo finalizada por um ponto-vrgula ;
fato este fundamental para concluir uma linha de instruo.
A chave de fechamento encerra o corpo do programa e o
texto impresso no monitor de vdeo ser:

O resultado do jogo foi 2 x 0

Cdigos de caracteres de Escape 24


A tabela abaixo demonstra os cdigos de C para caracteres
que no podem ser inseridos diretamente atravs do teclado. A funo
printf( ) aceita todos eles.
Os caracteres de escape comeam com uma barra invertida
\ seguida por uma letra que seleciona um cdigo de controle.

Cdigo de escape Significado

\a alarme ou alerta (beep)


\b retrocesso, retorna o cursor de uma
coluna.
\n nova linha, muda de linha
\t tabulao horizontal no vdeo ou
impressora.
\f limpa a tela do vdeo ou passa para
a prxima pgina da impressora.
\v tabulao vertical no vdeo ou na
impressora.
\r retorno do cursor, fica na primeira
posio da linha.
\o nulo, fim de uma string.
\N valor octal , imprime na base octal
( onde N uma constante octal ).
\xN valor hexadecimal, imprime na base
hexadecimal(onde N uma cte.hexa)
\ aspas ( ).
\\ barra invertida ( \ ).
\? ponto de interrogao.
\ apstrofo ( ).

Obs: Como a barra invertida \ tem uso especial na linguagem C,


devemos associar duas barras invertidas \\ para representar uma.

Exemplo:
25
.
main ( )
{
printf (\n\tisto um teste.);
}

O programa acima pula uma linha (\n), posiciona o cursor


na prxima coluna de tabulao (\t) e escreve no monitor de vdeo
como segue abaixo.

1 coluna

2 linha > Isto um teste

Strings
Strings uma das mais teis e importantes formas de dados
em C. Armazena e manipula textos como palavras e sentenas.
Ateno: No deve-se confundir string com caractere. Um nico
caractere estar envolvido por aspas simples. Exemplo: a
Uma string envolvida por aspas duplas.
Exemplo: o , teste ou o teste .
Sempre que o compilador encontrar qualquer coisa entre
aspas duplas, ele reconhecer que trata-se de uma string constante.
Cada caractere de uma string ocupa 1 byte de memria.
As strings consistem em dois tipos:

Constantes caracteres que so impressos na tela.


Comandos de Formato so cdigos de formatao.

Comandos de formato printf.


26
A tabela abaixo mostra os cdigos para impresso
formatada de texto.

Cdigos printf( ) Formato


%c ............................. caractere
%d ou %i ...................
................... inteiros decimais com sinal.
%u ............................. inteiros decimais sem sinal.
%o ............................. octal .
%x ou %X .................. hexadecimal .
%e ou %E .................. notao cientfica .
%f ou %F...................
%F................... ponto flutuante decimal.
%g ............................. usa %e ou %f, o que for mais curto.
%G ............................ usa %E ou %F o que for mais curto.
%s .............................. strings de caractere.
%% ............................
............................ escreve o smbolo %
(porcentagem).
%ld ............................ decimal longo.
%lf ............................. ponto flutuante longo (DOUBLE).

Um comando de formato comea com um smbolo


percentual (%), e seguido pelo cdigo de formato. A ordem da
combinao sempre ser da esquerda para a direita.

Exemplo:

.
.
printf(Estamos %s\na linguagem %c.,aprendendo,C);
.
.
Ser impresso no vdeo o seguinte texto:

Estamos aprendendo
a linguagem C.

A funo printf imprimir inicialmente a palavra


Estamos; logo aps receber a instruo que dever ser impresso 27
uma string de caractere. Nesta string ser localizado o conjunto de
caracteres envolvidos por aspas duplas aps o trmino do texto a ser
impresso.
Um cdigo de escape \n comanda o cursor para a
prxima linha, quando ento ser impresso a continuao da sentena
a linguagem precedida de um caractere C identificado por um
outro comando de formato (%c).

Lembre-se: Os argumentos, no caso aprendendo e C so


separados por vrgula.

Ponto flutuante decimal: Quando deseja-se imprimir um nmero com


casas decimais , utilizamos o comando de
formato %f.

Exemplo: Desejamos imprimir apenas com 3 casas decimais o nmero


87,3466798.
Ento digitamos:

printf (O nmero %.3f, 87.3466798);

A sada ser: 87.347

Obs: O computador arredonda o nmero !

Exemplo:
O nmero 156,55479832 pode ser arredondado para:
................. 156,5547983 ou
................. 156,554798 ou
................. 156,55480 ou
................. 156,5549 ou
................. 156,555 ou
................. 156,6 ou
................. 157

Exerccios
28
1- Comente resumidamente a origem da Linguagem C.
________________________________________________________
________________________________________________________
_____________________________________________________

2 - O que vem a ser Interpretadores e Compiladores ?


________________________________________________________
________________________________________________________
________________________________________________________
____________________________________________________

3 - Cite 4 caracteres de escape e seus significados.


________________________________________________________
________________________________________________________
_____________________________________________________

4 - Para que servem os comentrios ?


________________________________________________________
______________________________________________________

5 - Porque os programadores costumam utilizar comentrios ?


________________________________________________________
______________________________________________________

6 - O que uma funo ?


________________________________________________________
______________________________________________________

7 - O que faz um Linkeditor ?


________________________________________________________
________________________________________________________
_____________________________________________________
_______________________________________________________

8 - Quando utilizamos %.f ? Cite um exemplo :


________________________________________________________
29
______________________________________________________
9 - O que string e quais os tipos ?
________________________________________________________
________________________________________________________
_____________________________________________________

10 - Qual a sintaxe da funo printf ( ) ?


________________________________________________________
______________________________________________________

11 - Explique a funo main ( ) :


________________________________________________________
______________________________________________________

12 - Esboce o Mapa conceitual da memria C :

13 - O que faz a Biblioteca C ?


________________________________________________________
________________________________________________________
_____________________________________________________

14 - Cite 4 comandos de formato printf e explique sua forma de


formatao:
________________________________________________________
________________________________________________________
________________________________________________________
____________________________________________________

15 - O que falta para a linha do programa abaixo ser executada com


sucesso ?
.
30
printf(A linguagem %c de %s m%cdio,C,nive, )
.
________________________________________________________
________________________________________________________
_____________________________________________________

16 - Faa um programa que imprima seus dados pessoais, como o


nome, RG, idade, endereo, utilizando todas as funes e comandos
vistos at este captulo.
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
__________________________________________________

17 - Analise o programa abaixo e descreva, em ordem, o que ser


impresso no vdeo:
.
main ( ) /*programa teste*/
{
printf(O nmero %.2f o %s\n de um %clculo do produto\t\%d x
15,6789\\n\?,376.2936,resultado,C,24);
________________________________________________________
________________________________________________________
________________________________________________________
____________________________________________________

18 - Elabore um programa que imprima o n10 em octal e o n538 em


hexadecimal:
________________________________________________________
________________________________________________________
________________________________________________________
____________________________________________________

31
Captulo 3

Iniciao
de
Variveis

Constantes
Tipos de Constantes
Variveis
Tipos de Variveis
Significado das Variveis Bsicas
Variveis Globais e Locais
Exerccios

32
Constantes
Constantes referem-se a valores fixos que o programa no
pode alterar. A maneira como cada constante representada depende
do seu tipo.
Ou seja:

Constantes inteiras so descritas como nmeros sem componentes


fracionrios.
Exemplo: 20 e -150

Constantes em ponto flutuante requerem o ponto decimal seguida


pela parte fracionria do nmero.
Exemplo: 3.141592

Obs: Em C utilizamos o ponto antes da parte fracionria.


proibido, neste caso, o uso da vrgula !

Constantes de caractere so envolvidas por aspas simples .


Exemplo: 'a' e '+'

Uma constante cadeia de caracteres envolvida pos aspas duplas

Exemplo: "linguagem C"

Dependendo de como deseja-se o resultado atravs do


dado obtido, teremos duas formas de digitar o mesmo programa.
Exemplo:
.
.
main( )
{
printf("O resultado obtido e:%d.",5);
}

No exemplo acima a constante 5,ser impressa no formato


decimal.
Ou ......
33
.
.
main( )
{
printf("O resultado obtido 5");
}

Imprimir tambm, alm do texto o nmero 5.

Embora o 2exemplo mais simples, no devemos


dispensar o intuito do 1 exemplo, pois se nos defrontarmos com um
programa que exija atravs da entrada de dados(teclado) um certo
dado necessrio que este seja encontrado pelo comando de formato
para que seja possvel a sua impresso.

Tipos de Constantes
Existem trs tipos de constantes em C: literais, simblicas
e objeto.
Uma constante literal um valor digitado diretamente
em um comando ou expresso de um programa.

Exemplo : pi=3.1415;
MAX=0xff; /*hexadecimal*/
distancia=4.3E+09;
ch='h';

Constantes simblicas so aquelas, que atravs de


diretivas, fazem com que o compilador signifique/traduza algo.

Exemplo: # define PI 3.14159

Uma diretiva #define tem trs partes: a palavra-chave


#define, um nome e um valor.
Sendo assim, se considerarmos o exemplo de diretiva
acima, o programa poder utilizar PI em vrios locais do programa.

34
Exemplo: int i, j ;
i= PI;
j= PI*3;

A diretiva #define no define um objeto. Ela define um nome


simblico para um valor literal. Quando o compilador encontra um
nome simblico tal como PI, ele substitui esse smbolo por 3.14159
exatamente como se fosse digitado o nmero diretamente.
Obs: Diretivas, sero tpicos de assunto que sero vistos em
captulos posteriores.

A constante-objeto, tambm conhecida por constantes


tipificadas, um agrupamento de constante literal com varivel. Ou
seja, assim como as variveis, elas ocupam espao de memria, mas,
da mesma forma que as constantes, seus valores no podem ser
modificados.

Exemplo:
.
.
main( )
{
int resultado = 200;
resultado = valor;
printf("conta = %d\n",resultado);
printf("resposta = %d\n",valor);
}

Veremos, ento, na tela do monitor de vdeo:

conta = 200
resposta = 200

Obs: int - varivel a ser vista posteriormente.

Variveis 35
As Variveis so o aspecto fundamental de qualquer
linguagem de computador. Uma varivel uma posio de memria,
com um nome para referenciar o seu contedo, que usada para
guardar um valor que pode ser modificado pelo programa.

A forma geral para declarar uma varivel :

Nome de um tipo de varivel nome da varivel ;

Em C, o nome de uma varivel no tem nenhuma relao


com seu tipo.

Tipos de Variveis

Tipo Tamanho escala/abrangncia


Bit / Bytes

char 8 1 -128 a 127


unsigned char 8 1 0 a 255
signed char 8 1 -128 a 127
int 16 2 -32768 a 32767
unsigned int 16 2 0 a 65535
signed int 16 2 o mesmo que int
long 32 4 -2147483648 a 2147483647
unsigned long int 32 4 0 a 4294967295
float 32 4 3,4E-38 a 3,4E+38
double 64 8 1,7E-308 a 1,7E+308
long double 80 10 3,4E-4932 a 3,4E+4932

Podemos observar na tabela acima, que na linguagem C existem 4


tipos de variveis bsicas: char , int , float e double .

36
Estes tipos bsicos podem estar acompanhados por
modificadores de tipo : signed , unsigned e long .
O uso importante de signed modificar char ou int nas
implementaes em que esse tipo no tem sinal.
Algumas implementaes podem permitir que unsigned
seja aplicado aos tipos de ponto flutuante.

Significado das Variveis Bsicas


Vejamos ento o siginificado das Variveis bsicas:

char - uma palavra-chave (ou varivel) que indica caracteres


ASCII .
int - Valores inteiros na faixa de -32768 32767 .
float - Dgitos de preciso (c/casas decimais) na faixa de 3,4E-38
3,4E+38 .
double - Dgitos de preciso na faixa de 1,7E-308 1,7E+308 .

Exemplo de programa:
.
.
main( )
{
int quantidade;
char empresa;
float tempo;
quantidade=5;
empresa='B';
tempo=13.456;
printf("A fabricao de %d terminais de vdeo,quantidade);
printf(\nna empresa %c gasta apenas %.2f minutos de hora,
empresa,tempo);
}

O programa possui trs variveis: int , char e float.


E a elas dado um nome.
Obs: Observe que a cada trmino da instruo usamos ponto-vrgula 37
Posteriormente associamos a varivel um valor, seja em
nmeros ou caracteres.
A varivel int aceita apenas nmeros inteiros, no exemplo a
ela foi associado o n 5. A varivel float acatar nmeros com ponto
flutuante (c/casa decimal).
J a varivel tipo char armazenar caracteres ASCII. Se
for nico caractere, este dever ser envolvido em aspas simples. Mas
no caso de uma cadeia de caractere (mais de um caractere) este dever
ser identificado atravs de uma matriz e estar contido entre chaves e
aspas duplas (exemplo posterior).
Por fim aps nomearmos as variveis e a elas associarmos
valores, a execuo do programa resultar em:
A fabricao de 5 terminais de vdeo
na empresa B gasta apenas 13.46 minutos de hora.

O nmero 5 impresso pelo comando de formato %d pois


trata-se de nmero decimal; um nico caractere B expresso por %c e
o tempo identificado com apenas 2 casas decimais e arredondado.
Exemplo de programa:
.
.
main( )
{
int x=30;
char y[12]={900 pessoas};
char z=Z;
printf(No dia %d haviam %s\n,x,y);
printf(no teatro para assistir a pea %c.,z);
}
Observe neste exemplo que possvel em uma linha de
instruo associarmos ao mesmo tempo o nome e o valor varivel.
A varivel char y ter como atribuio uma cadeia de
caracteres que sero impressos atravs do comando de formato %c.

Porque a matriz [12] ?


Utilizando a palavra-chave char podemos declarar
uma string (cadeia de caracteres) que so, em C, terminadas em
nulo. Isto quer dizer que terminam com um byte zero, tambm
38
chamado de caractere nulo. A linguagem C acrescenta esse byte
automaticamente s strings literais, mas a responsabilidade sempre
existir ao programador para garantir que as strings estejam
corretamente terminados.

Exemplo: char string[12]={Linguagem C};

O conjunto entre aspas duplas contm 11 caracteres


(strings literais ). Sendo assim, ao declararmos o array=12 (array
significa tabela, leque) estamos garantindo o byte zero (caractere
nulo).
Nada impede de declararmos arrays maiores, o importante
garantirmos pelo menos um caractere adicional, chamado de
caractere nulo ao array.
Podemos concluir ento, que a utilizao de array em C
significa a criao de matrizes.
O resultado do programa ser:

No dia 30 haviam 900 pessoas


no teatro para assistir a pea Z.

Nota: ASCII A tabela ASCII tem 256 cdigos. Dispe de


nmeros de 0 a 127(decimal) cobrindo letras, dgitos de 0 a 9,
caracteres de pontuao e caracteres de controle como salto de linha,
tabulao, etc...
Os computadores IBM usam 128 caracteres adicionais
com cdigos de 128 a 255 que consistem em smbolos de lnguas
estrangeiras e caracteres grficos.
No fim da apostila temos a tabela ASCII !!!
A forma de representar um caractere de cdigo acima de
127 decimal :
\xdd

... onde dd representa o cdigo de caractere em notao hexadecimal;


e pode ser usado na expresso de controle de printf( ) como qualquer
outro caractere. O exemplo a seguir mostra a possibilidade de
imprimirmos caracteres grficos, utilizando a tabela ASCII.
39
.
.
main( )
{
printf(\xe1 \xe8 \xfo \xf6 \xe3 );
}

Resultado:

Variveis Globais e Locais


Quando uma varivel for utilizada pelo programa, deve-
se defini-las, para isto basta indicar seu tipo e nome.

Exemplo: int a, b;
double despesas;
main( )
{
int d, e;
.
.
}

As variveis a, b e despesas so variveis globais pois so


vlidas para todo o programa em virtude de terem sido declaradas fora
da funo main( ).
As variveis d e e so consideradas locais a funo
main( ), pois foram declaradas dentro da mesma.

Exerccios

1 - O que uma Constante Literal ? Cite um exemplo:


________________________________________________________
________________________________________________________
_____________________________________________________
40
2 - Qual a forma geral para declarar uma Varivel ?
________________________________________________________
______________________________________________________
3 - Verifique se o programa abaixo funciona corretamente. Descreva,
se houver, os erros e a soluo para os mesmos.
.
.
main( );
{
printf(O placar foi de %c x %% , 5 , 2 );
}
________________________________________________________
________________________________________________________
________________________________________________________
____________________________________________________
4 - Qual o procedimento para, atravs da palavra-chave char,
declararmos uma string.
________________________________________________________
________________________________________________________
_____________________________________________________
5 - Faa um programa, consultando a tabela ASCII, de forma que
resulte aps a compilao o seguinte desenho grfico:

_________________________________________________
_______________________________________________
6 - Cite 4 variveis bsicas em C explicando seu significado e
tamanho em C.
________________________________________________________
________________________________________________________
_____________________________________________________
7 - Faa um programa utilizando 3 variveis bsicas.
________________________________________________________
________________________________________________________
41
________________________________________________________
________________________________________________________
___________________________________________________
8 - Escreva um programa que declare 3 variveis inteiras e atribua os
valores 6, 14 e 53 a elas ; 3 variveis caracteres e atribua a elas as
letras x, y e z ; finalmente imprima na tela:
As variveis inteiras contm os nmeros 6, 14 e 53.
As variveis caracteres contm os valores x, y e z.
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
___________________________________________________
9 - Qual a forma de se representar um caracter de cdigo acima de
127 decimal ?
_______________________________________________________
10 - O programa abaixo est correto ? Porque ?
.
main( )
{
char a[19]={Compilar e Linkeditar}
printf(Em C necessrio %s,a);
}
_______________________________________________________
________________________________________________________
_____________________________________________________

11 - Qual tipo de varivel utilizamos para nmeros com casa decimal


________________________________________________________
______________________________________________________
12 - Qual a abrangncia da varivel long double ?
________________________________________________________
______________________________________________________
13 - Cite 2 modificadores de tipo e explique um deles.
42
________________________________________________________
______________________________________________________
14 - O que so variveis Globais e Locais ?
________________________________________________________
________________________________________________________
_____________________________________________________
15 - O que so constantes simblicas ?
________________________________________________________
________________________________________________________
_____________________________________________________
16 - Assinale V (verdadeiro) ou F (falso) :

( ) Uma constante possui valor fixo e altervel.

( ) Constante-objeto um agrupamento de constante literal com


varivel.

( ) Uma varivel uma posio de memria que usada para


guardar um valor que no pode ser modificado pelo programa.

Captulo 4
43
Operadores

Definio de Operadores
Operadores de Atribuio
Operadores Aritmticos
Operador Unrio
Operadores de Incremento e Decremento
Operadores Aritmticos de Atribuio
Operador Vrgula
Precedncia dos Operadores em C
Exerccios

Definio de Operadores
A linguagem C d mais nfase aos operadores que a
maioria das outras linguagens de computador; com isso dizemos que C
rica em Operadores Internos. Tendo um pouco mais de 40 tipos de
operadores, alguns so mais usados que outros, como por exemplo os
Operadores Aritmticos.
O que fazem os Operadores ? Trabalham sobre seus
operandos de modo precisamente definido. A linguagem C define
quatro tipos de operadores: Aritmticos, Relacionais, Lgicos e Bit a 44
bit. A linguagem C possui tambm alguns operadores especiais para
tarefas particulares.

Operador de Atribuio
possvel utilizar um operador de atribuio dentro de
qualquer expresso vlida em C. Isso no possvel em certas
linguagens de computao, tais como: Pascal, Basic e Fortan, que
tratam os operadores de atribuio como um caso especial de
comando.
A forma geral do operador de atribuio :

Nome da Varivel = Expresso

Devemos memorizar que, o sinal de igual( = ) no tem a


mesma interpretao dada em matemtica. Ou seja, o sinal = em C,
somente representar a atribuio da expresso direita ao nome da
varivel esquerda.

Exemplo: PI = 3.1415 ;
Kilo = 1000 ;

A linguagem C aceita vrias atribuies (atribuies


mltiplas) na mesma instruo; ou seja, em um nico comando.

Exemplo: x = y = z = 80 ;

Em programas profissionais, valores so atribudos


variveis usando esse mtodo.

Exemplo de programa:
45
.
main( )
{
int x ;
x = y = 30 ;
printf(O resultado foi %d,y);
}

Operadores Aritmticos
Representam as operaes aritmticas bsicas como a
soma, subtrao, multiplicao e diviso .

+ ..................... soma
- ..................... subtrao
* ..................... multiplicao
/ ..................... diviso
% ..................... mdulo de diviso (resto)

Obs: O operador mdulo % no pode ser usado nos tipos em


ponto flutuante.

Exemplo de programa:
.
main( )
{
int x , y ;
float b,c;
float a = 5.13 ;
b= x = 10 ;
c= y = 4 ;
printf(\n X + Y = %d , x + y);/* soma */
printf(\n A - Y = %.2f, a - y );/*subtrao */
printf(\n Y x A = %.2f, y * a );/* multiplicao */
printf(\n X\xf6Y= %d e o resto =%d,x/y , x%y );/* diviso*/; 46
printf(\n ou X\xf6Y = %.1f, b/c ); /* diviso */
}

Resultado:
X + Y = 14
A - Y = 1.13
Y x A = 20.52
X Y = 2 e o resto = 2
ou X Y = 2.5
Quanto a anlise do programa, podemos afirmar que o uso
de float e o comando de formato printf %.f deve-se ao fato de usarmos
nmeros com ponto flutuante.
No caso de um nmero puramente inteiro, o uso de int
satisfaz a condio.
O sinal de = envolvido por aspas duplas significa em
C apenas um caractere a ser impresso. Utilizamos \xf6, cdigo este em
hexa, para imprimirmos o caractere .
Nas ltimas duas linhas de instruo, possvel
observarmos os dois exemplos de respostas utilizando desta vez
variveis diferentes, mas com o mesmo valor. O fato de usarmos
variveis diferentes refere-se ao fato de no podermos imprimir um
resultado de diviso com ponto flutuante utilizando variveis do tipo
int .

Obs: Se o nome de uma varivel for dada em letras minsculas ou


maisculas,devemos respeitar o nome desta sempre na forma original .
Exemplo:
.
.
int ABC = 123; /*letras maisculas*/
.
.
printf(Os nmeros so %d, ABC);
.
.

.................ou

.
.
int Valor=30; /*letras maisculas e minsculas*/ 47
.
.
printf(O resultado %d,Valor);
.
.
O no cumprimento desta norma em C, acarretar erro ao
compilarmos o programa !

Operador Unrio
Indica a troca do sinal algbrico do valor, ou seja um
operador que multiplica o seu operando por -1 .

Exemplo: resultado_A= -3 ;
resultado_B= - resultado_A ;

Desta forma obteremos com resultado B o nmero 3,


porque: (-3) x (-1) = 3 .
Como o prprio nome diz, este tipo de operador necessita
de apenas um operando, com isso atribui a negao aritmtica.

Operadores de Incremento e Decremento

A linguagem C dispem de dois operadores no


encontrados em outras linguagens; so eles:

Operador de incremento...... + + ......adiciona 1 ao seu operando


Operador de decremento..... - - ......subtrai 1 ao seu operando

Este um dos fatores, em que podemos em C, comprimir


comandos de programa. Em outras palavras:

Exemplo: x=x+1; x=x-1;


.... o mesmo que .... o mesmo que
++x; --x; 48
Os operadores de incremento trabalham de dois modos. O
primeiro modo chamado pr-fixado, em que o operador aparece
antes do nome da varivel( como no exemplo acima ). O segundo
modo o ps-fixado em que o operador aparece aps o nome da
varivel.

Exemplo: x=x+1; x=x-1;


.... o mesmo que .... o mesmo que
x++; x--;

Porm existe uma diferena quando esses operadores so


usados em uma expresso ! Quando preceder (pr-fixado) o seu
operando, C executa o incremento ou decremento antes de usar o valor
do operando. Se o operador estiver aps (ps-fixado) o seu operando,
C usar o valor do operando antes de increment-lo ou decrement-lo.

1exemplo: (pr-fixado)

a=6;
b=++a;
printf ( a = %d, b = %d , a , b );

Imprimir:
a=7,b=7

2exemplo: (ps-fixado)

a=6;
b=a++;
printf( a = %d , b = %d , a , b );

Imprimir:
a=7,b=6
49
A anlise vale tambm para o operador de decremento(--)

Exemplo:
main( ) /*ps-fixado*/
{
int a = 0 ;
printf(%d um nmero nulo \n,a );
printf(%d indica vazio \n,a- - );
printf(%d um nmero negativo.,a);
}

Imprimir:

0 um nmero nulo
0 indica vazio
-1 um nmero negativo.

Exemplo:
main( ) /*pr-fixado*/
{
int a = 0 ;
printf(%d um nmero nulo \n, a );
printf(%d um nmero negativo \n,- - a);
printf(%d um ndecrescente em relao ao ao zero,a );
}

Imprimir:
0 um nmero nulo
-1 um nmero negativo
-1 um ndecrescente em relao ao zero

Obs: Se as duas linhas abaixo so equivalentes, pergunta-se por


que no preferir uma a outra ?

x = x + 1 ; /*funciona, mas no o ideal*/

x + + ; /* prefervel */

50
A maioria dos compiladores C produzem o cdigo-objeto
muito mais rpido e eficiente para as operaes se incremento e/ou
decremento. Por essa razo, devemos usar os operadores de
incremento e decremento sempre que possvel !

Precedncia

Devemos atentar quanto a precedncia dos operadores.


Todo compilador C tem um calculador de expresses prprio que
disseca as expresses do cdigo-fonte e constri instrues no cdigo
compilado para calcular resultados das expresses.
O calculador de expresses obedece rigorosamente as
regras de ordem de precedncia e avaliao.
Na ausncia de parnteses, uma expresso calculada
usando um conjunto de regras padro.

Exemplo:
conta = a + b * h ;

1 passo: calcula-se b * h e em seguida....


2 passo: ...soma-se com a e atribui o resultado varivel conta.
Em C, multiplicao e diviso so efetuadas antes da
soma e subtrao. Porm, caso desejamos, dependendo da finalidade
da expresso matemtica, somar-se ou subtrair-se antes da
multiplicao ou diviso, ser necessrio o uso dos parnteses.
Exemplo:
conta = ( a + b ) * h ;

Alguns parnteses, embora tecnicamente desnecessrios,


tornam as intenes do programador perfeitamente claras.
Exemplo:
conta = ( ( a * b ) / c ) + ( d - e ) ;

Primeiramente a multiplicado por b, porque esta


sub-expresso est no interior dos parnteses aninhados. O resultado
dividido por c, enquanto que e subtrado de d
independentemente. Finalizando, a soma efetuada, atribuindo-se o
resultado varivel conta. 51
Operadores Aritmticos de
Atribuio

So eles: += , -= , *= , /= e %=

Forma geral:

Nome da varivel Op.aritmtico Expresso ;


de atribuio

As expresses com estes operadores so mais compactas e


normalmente produzem um cdigo de mquina mais eficiente.

Exemplos:

a+=3 ; /* equivale a: a=a+3 */


b- = 2 ;/* equivale a: b=b- 2 */
c *=4;/* equivale a: c=c4*/
d/=1;/* equivale a: d=d1*/
e%=5;/* equivale a: e=e%5*/

Exemplo de programa:
.
main( );
{
int a=2;
int b=3;
printf(valor = %d\n,a);
a+=b;/*equivale a: a=2+3*/
printf(valor = %d\n,a);
a+=b;/*equivale a: a=5+3*/
printf(valor = %d\n,a); 52
}

Imprimir:

valor = 2
valor = 5
valor = 8

Operadores Relacionais
Utilizamos para fazer comparaes de valores relativos de
operadores inteiros ou de ponto flutuante. Os operadores relacionais
em C so:

Operador Ao

> maior que


>= maior ou igual que
< menor que
<= menor ou igual que
== igualdade
!= diferente

A idia de verdadeiro e falso acompanha os conceitos dos


operadores lgicos e relacionais. Em C, verdadeiro qualquer valor
diferente de zero. E falso equivale a zero. As expresses que usam
operadores relacionais ou lgicos devolvem zero para falso e 1
(um) para verdadeiro.
Podemos criar laos em um programa C utilizando os
operadores relacionais.

Exemplo de diagrama:

se a>2 53
vai para e e

se a==1
vai para f
f
se a <1
vai para g

Concluso
do
programa

O operador relacional de igualdade (= =) representado


por dois sinais de igual. Um erro comum o ato de usar um nico
sinal de igual como operador. Neste caso o compilador no acusar
erro, pois como em C toda expresso tem um valor verdadeiro ou
falso, este no seria um erro de programa e sim do programador.

Exemplo:
.
main( );
{
int a=10;
printf(\nO nmero igual a 100 ? %d,a==100);
a=50;
printf(\nO nmero igual a 50 ?%d,a==50);
printf(\n0...................falso e 1...........verdadeiro);
}

Imprimir:

O nmero igual a 100? 0


O nmero igual a 50? 1
0.....................falso e 1.................verdadeiro

Obs: A anlise seria inversa para o operador != (diferente).

54
O Operador Vrgula
usado para encadear vrias expresses. O operador
vrgula tem o mesmo significado da expresso: faa isso e isso.

Exemplo:

a = ( b = 2 , b + 1 );

Primeiramente atribudo o valor 2 b, em seguida


soma-se 2 1 e concluindo, atribudo 3 varivel a. Pelo fato do
operador vrgula ter uma precedncia menor que o operador de
atribuio (=), necessrio o uso de parnteses.

Precedncia dos Operadores em C

Operadores
em ordem de
precedncia:................ + + , - - maior

* , / , %

+ , -

> , >= , < , <=

= = , !=

= , += , - = , * = , / = , %=
, (vrgula) menor
55
Exerccios
1 - Quais os operadores aritmticos bsicos em C ?
________________________________________________________
________________________________________________________
_____________________________________________________

2 - Rescreva a seguinte instruo usando operador de incremento.

soma = soma +1 ;

_______________________________________________________

3 - Os operadores relacionais so usados para: ( assinale o correto )

a) trocar valores lgicos por variveis ;


b) distinguir diferentes tipos de variveis ;
c) representar operaes aritmticas ou
d) comparar valores .

4 - A forma geral do operador de atribuio :


________________________________________________________
______________________________________________________

5 - Qual a funo do calculador de expresses em C ?


________________________________________________________
________________________________________________________
_____________________________________________________ 56
6 - Qual a forma geral do Operador Aritmtico de Atribuio ?
________________________________________________________
______________________________________________________

7 - O que entende-se por verdadeiro e falso em C ?


________________________________________________________
________________________________________________________
_____________________________________________________

8 - Qual ser o valor de y ?

x=5;
y = x ==5;
________________________________________________________
______________________________________________________

9 - Como funcionam os Operadores de Incremento e Decremento ?


________________________________________________________
________________________________________________________
________________________________________________________
____________________________________________________

10 - Faa um programa utilizando o Operador de Incremento pr-


fixado .
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
_________________________________________________

11 - O programa abaixo utiliza que operador ?

main ( )
{
int x=2 ;
printf (%d um nmero positivo,x--); 57
}

a) Operador de Incremento
b) Operador Unrio
c) Operador Aritmtico pr-fixado
d) Operador de decremento ps-fixado

12 - O sinal de igual = em C, significa:

________________________________________________________
______________________________________________________

13 - Descreva a equivalncia:

j /= 2 ____________________
x += y ____________________
h %=10 ____________________
c*3.1415 ___________________
M - =12 ____________________

14 - Escreva um programa que contenha 4 variveis e imprima sua


mdia aritmtica. (Utilizar variveis do tipo int e float).
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
_________________________________________________

15 - Analise e descreva o que o programa imprime:


main ( )
{
float x , y, A ;
x = 3.5 ;
58
y = 6.5;
printf ( valor1 = %.2f \n, x+y);
x*=y ;
printf ( valor2 = %.3f \n,x);
y - =x ;
printf ( valor3 = %.2f \n,y);
A=x+y;
printf ( valor 4 igual a 6,3 ? %.d,A==6.3);
printf (\n 0..........falso e 1........verdadeiro);
}

Imprimir:
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
___________________________________________________

16 - Cite o motivo de usarmos o operador vrgula .

________________________________________________________
________________________________________________________
_____________________________________________________

17 - Demonstre a precedncia dos operadores em C .


________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
__________________________________________________

18 - Qual o resultado impresso ?

main ( );
{
int a , b ;
float c ;
a = ((20*1*3) + 4) + (16/2);
b = (6/2+4) - 3*1.5;
c = a/b ;
59
printf ( O resultado %.2f, c+=3);
}

________________________________________________________
________________________________________________________
________________________________________________________
____________________________________________________
19 - O programa abaixo possui erros de execuo. Demonstre-os:

main ( );
int a = b = 20 ,
printf (%d equivale a %d,a,b);
printf (Com incremento fica %d, ++a)
printf (*pr-fixado*);
}

Correes se necessrias: _____________________________


_____________________________
_____________________________
_____________________________

Imprimir ento: _____________________________________


_____________________________________
_____________________________________

20 - O que representa x+++y ? Porque ?

a) x++ + y
b) x + ++y
c) x + y
d) x - y

60
Captulo 5

Pr-
processador
de C

Diretivas do pr-processador
Tipos de diretivas
A diretiva #include
61
A diretiva #define
Exerccios

Neste captulo , aprenderemos


sobre o pr-processador de C com o
intuito de podermos, desde j, digitarmos
programas completos em C no
microcomputador.

62
Diretivas do pr-processador

O pr-processador faz parte do compilador, sendo assim


podemos consider-lo como uma linguagem dentro da linguagem C.
possvel incluirmos diversas instrues do compilador no cdigo-
fonte de um programa em C. O pr-processador executado
automaticamente antes da compilao por instrues chamadas de :
Diretivas , que embora no sejam parte da linguagem de
programao C, expandem o escopo do ambiente de programao em
C, tendo a finalidade de alterar o cdigo-fonte na sua forma de texto.

Ao digitarmos uma linha de programa, solicitamos ao


compilador codificar para instrues em linguagem de mquina para
serem executadas pelo processador. Mas o compilador solicitado
somente ter xito se instruirmos ele com uma linguagem. Esta
linguagem ou instrues so as diretivas .

Ento, podemos definir que diretivas do pr-processador


so instrues para o compilador, antes do processo de compilao ser
iniciado. E as linhas normais de um programa so instrues para o
microcomputador.

ANSI Padro que define um conjunto completo de funes de


E/S
que pode ser utilizado para ler e escrever qualquer tipo de dado.

63
TIPOS: Segundo o padro ANSI , o pr-processador de C contm
as diretivas:

# include
# define
# if
# ifdef
# ifndef
# undef
# else
# endif
# elif
# line
# error
# pragma

Alguns critrios so adotados para o correto uso das


diretivas.
Todas as diretivas comeam com o smbolo escopo # .
Cada diretiva deve estar na sua prpria linha.
As diretivas, por conveno, aparecem no incio do programa ( antes
de main( ) ) ou antes de uma funo particular .
Mas nada impede que sejam colocadas em qualquer parte do
programa, desde que corretamente.

A diretiva #include
Sabemos que diretivas so, de certo modo,
64
minilinguagens embutidas em C.
A diretiva #include instrui o compilador a ler outro
programa, chamado de arquivo-fonte, adicionado quele que contm a
diretiva #include.

O nome de um arquivo-fonte, quando associado uma


diretiva, deve estar sempre envolvido por aspas duplas ( )ou
smbolos de maior e menor ( > e < ) .

Sua forma geral :

# include nome do arquivo-fonte

ou

# include <nome do arquivo-fonte>

Esta linha de instruo, vista em sua forma geral,


chamada de arquivo-cabealho e compilada para as rotinas de
arquivos em disco da biblioteca. Ou seja, o arquivo ser localizado de
forma definida pelo fabricante do compilador ( caso em que o nome
do arquivo-fonte esteje envolvido por chaves angulares ). Se o nome
do arquivo-fonte estiver entre aspas, a busca do arquivo ser no
diretrio atual e se no for encontrado a busca repetida como se o
nome do arquivo estiver envolvido por chaves angulares.
Os arquivo-fontes so criados pelo fabricante e variam
conforme a verso do software.
Um programador pode criar um programa de rotina
contendo, por exemplo, vrias frmulas e coloc-lo em uma diretiva.
Assim no haver a necessidade de reescrever este programa para
utiliz-lo em outro programa.

Exemplo:

/* prog.1 */ / * prog.2 * /
main( ) #include <prog.1>
{ main( )
. {
. .
65
} .
}

Geralmente, uma verso de um software (no caso do Turbo


C++), acompanha arquivos-fontes criados pelo fabricante com
prottipos que podero ser usados pelo usurio/programador sempre
que o programa desejar.
Por exemplo: A funo printf( ) requer um prottipo que
encontrado atravs da diretiva que contm o arquivo-fonte especfico.

* Exemplos de arquivos-fonte contidos na diretiva # include .

< stdio.h > necessria a sua utilizao quanto ao fato de obter-se a


sada de dados impressa na tela do vdeo.

< conio.h > arquivo-fonte que contm o prottipo para o uso


da
funo clrscr ( )- utilizado para limpar a tela , da fun-
o getche( )- utilizado para entrada de dados via tecla-
do.

< dos.h > utilizamos este arquivo-fonte para obter a


pausa da
tela aps a execuo da sada de dados - delay( ).

Algumas verses trazem um nmero maior ou reduzido de


diretivas, ocasionando uma maior ou menor concentrao de arquivos-
fonte. Ou seja, podemos encontrar o prottipo de uma funo em
diretivas diferentes dependendo da verso do software.
OBS: Se ao digitarmos um programa e for detectado um ou mais
erros devido a falta de prottipos, uma mensagem ir aparecer, e
atravs do help, poderemos localizar em que diretiva encontra-se o
arquivo-fonte necessrio para a plena compilao e execuo do
programa.
Nos exemplos expostos ao longo do curso, ser abordado
a explicao quanto a utilizao de novos arquivos-fontes ou funes
ligadas a eles. O nome do arquivo-fonte pode ser expresso no
programa em letras maisculas ou minsculas. A forma geral de uma
diretiva no inclui ponto e vrgula ( ; ). 66
Exemplo de programa :

/* Programa DIRETIVA */
# include <stdio.h>
# include <conio.h>/*o nome do arquivo-fonte pode ser escrito */
# include <DOS.H> /* em letras maisculas ou minsculas */
main ( )
{
clrscr( );
printf (linguagem C );
delay(1000); /*atraso*/
}

Imprimir:

Linguagem C

No programa utilizada a diretiva #include e trs


arquivos-fonte.

<stdio.h> - utilizado para exibir a sada de dados. Este prottipo


contm uma linguagem prpria que instrui o processador antes da
compilao.

<conio.h> - arquivo-fonte solicitado para a utilizao da funo


clrscr( ), funo esta que limpa a tela antes ou aps a apresentao
de um dado/texto ou resultado. Sua forma geral : clrscr( ) .

< dos.h > - arquivo-fonte que instrui o processador quanto ao


correto funcionamento da funo delay( ) , funo esta utilizada para
obter um retardo ou pausa antes de concluir o programa propriamente
dito. Sua forma geral : delay (<tempo>) ; onde:
tempo digitado em milisegundos. Exemplo: delay (1000);
O tempo de retardo resultar em 1 segundo.

67
A diretiva #define

Esta diretiva, como seu prprio nome sugere, tem a


funo de definir um identificador (macro) e uma string que o
substituir toda vez que for encontrado no arquivo-fonte. A diretiva
#define, neste caso, definir constantes simblicas com nomes
apropriados.

A forma geral desta diretiva :

# define macro string

Ao macro dado um nome, que por conveno escrito


em letras maisculas para maior destaque e compreenso quando da
leitura do programa.
A string consiste em um texto que associado ao
identificador (macro). Este texto pode ser em forma de nmeros ou
letras (neste ltimo caso devemos envolve-los por aspas duplas).
Somente permitido um comando por linha, e lembre-se:
nunca haver ponto-e-vrgula aps qualquer diretiva do pr-
processador de C, caso contrrio resultar em uma mensagem de erro
criptogrfica.
Se a string for maior que uma linha, podemos continua-la
na prxima linha, porm delimitando-a com uma barra invertida (\).
importante entender que basicamente a diretiva #define
associa texto (string) um smbolo (macro).

Exemplo:

# define PI 3.14159
# define VALOR 100
# define PROGRAMA Diretivas em C

68
Dever haver espaos entre o identificador (macro) e a
string, para evidentemente separ-los. A clareza do cdigo aumenta
com o uso de macros permitindo assim o uso de nomes sugestivos para
as expresses.
Um dos exemplos de programa, na qual recomendvel o
uso da diretiva #define, a de utilizarmos uma constante vrias vezes
no programa. Ou seja, podemos definir um valor a uma constante, no
qual em cada vez que a solicitarmos, poderemos escrev-la apenas
citando seu identificador.

Exemplo:

# include <stdio.h>
# include <conio.h>
# include <dos.h>
# define PI 3.14159
main( )
{
float L=30; /*podemos resumir em uma s linha: */
float R=18;/* float L=30,R=18; */
clrscr( );
printf (A rea : %.3f, PI*R*R);
printf (\nO volume : %.3f, PI*R*R*L);
delay(3000);
}

Imprimir:
A rea :1017.875
O volume :30536.255
O programa acima utiliza trs diretivas includes no qual
possuem os prottipos para a pausa, limpar a tela, e impresso das
respostas no vdeo.
A diretiva #define associa o identificador PI a uma string
3.14159, assim sempre que o identificador for mencionado o programa
o substitui pela string.
Esta diretiva tambm possui outra forte caracterstica: O
nome do macro pode ter argumentos. Isto significa que toda vez que o
nome do macro encontrado, os argumentos a ele associados podem

69
ser substitudos pelos argumentos reais encontrados no programa.
Exemplo:

# include <stdio.h>
# include <conio.h>
# include <dos.h>
# define CONTA(X) printf(%.3f\n,X)
main( )
{
float Z=35.10;
float Y;
Y=Z*3.14;
clrscr( );
CONTA (Z);
CONTA (Y);
delay (2000);
}

Imprimir: 35.100
110.214

Quando o programa enxergar a ocorrncia CONTA, esta


ser substituda printf(%.3f\n,X). O X na definio do macro ser
substitudo pelo nome do macro no programa. Ou seja, CONTA(Z)
ser substituda por printf(%.3f\n,Z) e CONTA(Y) ser substituda
por printf(%.3f\n,Y). Com isso concluirmos X como argumento.

Outro exemplo:

70
# include <stdio.h>
# include <conio.h>
# include <dos.h>
# define PI 3.15159
# define AREA(X) (2*PI*X*X)
main( )
{
float raio;
raio=3;
clrscr( );
printf(A rea da esfera %.2f,AREA(raio));
delay(6000);
}

Imprimir:

A rea da esfera 56.55

Quando o programa encontrar o macro rea, substituir


sua definio (raio) pela equao 2*PI*X*X. O valor de X ser o
valor contido na varivel raio .

Exerccios

1- Qual a forma geral da diretiva # define ?


________________________________________________________
______________________________________________________
71
2- Cite, segundo o padro ANSI, algumas diretivas contidas em C.
________________________________________________________
______________________________________________________

3- Defina o que so diretivas do pr-processador de C.


________________________________________________________
________________________________________________________
_____________________________________________________

4- Cite 3 exemplos de arquivos-fontes contidos na diretiva #include.


________________________________________________________________
________________________________________________________
_______________________________________________________

5- A funo printf( ) requer um prottipo que encontrado atravs da


diretiva que contm o arquivo-fonte especfico. No caso da diretiva
#include citamos como exemplo stdio.h , conio.h e dos.h . Explique
quando estes prottipos so utilizados.
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
__________________________________________________

6- Qual a funo da diretiva # define ? Descreva sua forma geral.


________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
72
________________________________________________________
__________________________________________________

7- Cite dois exemplos de prottipos utilizados na diretiva #define e


explique-os:
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
___________________________________________________

8- Assinale Verdadeiro ( V ) ou Falso ( F ) .


( ) A diretiva #define possui uma forte caracterstica , na qual o
nome do macro no pode ter argumentos.
( ) O pr-processador C um programa contido no compilador
que altera o programa-fonte antes da compilao.
( ) A diretiva #define define constantes simblicas ou macros. A
diretiva #include inclui um programa-fonte no seu programa.
( ) Macros aumentam a clareza do cdigo, pois no permitem a
utilizao de nomes sugestivos para expresses.
( ) Um dos exemplos de programa, na qual recomendvel o uso
da diretiva #define, a de utilizarmos uma constante vrias vezes no
programa.

9- O que so Strings ? Explique:


________________________________________________________
________________________________________________________
________________________________________________________
____________________________________________________

10- Faa um programa que apresente o resultado da adio e


multiplicao, baseando-se na utilizao da propriedade distributiva,
ou seja, quando forem lidas as variveis A, B, C e D , estas devero
ser somadas e multiplicadas A com B, A com C e A com D; B com
C e B com D; e finalmente C com D.
73
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________

11- Calcular e apresentar o valor do volume de uma lata ,utilizando a


diretiva #define. Sendo a frmula: Volume = PI x R x R x Altura.
Raio= 0,12 metros e Altura = 354 centmetros.
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
_________________________________________________

12- Elaborar um programa que contenha 6 variveis e imprima sua


mdia aritmtica. (Utilizar variveis do tipo int e float).
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
_________________________________________________

13- Elaborar um programa que contenha as diretivas #include e


#define e que utilize os prottipos stdio.h, conio.h, dos.h.
________________________________________________________
________________________________________________________
________________________________________________________ 74
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
_______________________________________________

14- O programa abaixo funciona ? Porque ?

# include <stdio.h>
#define RESULTADO(X) printf(%.2f\n,Y)
main( )
{
float A=40.3;
float B;
B=A * 3.14;
resultado(A);
resultado(B);
}

________________________________________________________
________________________________________________________
_____________________________________________________

Captulo 6
75
Operadores
de endereo

A funo scanf( )
Operador de endereo
Matriz String
Operadores de E/S atravs do console
As funes getch( ) e getche( )
As funes getchar( ) e putchar( )
As funes gets( ) e puts( )

Funo scanf( )

Esta funo a rotina de entrada pelo console de uso geral,


implementada em todos compiladores C. L todos os tipo de dados
intrnsecos e converte nmeros ao formato interno apropriado, similar 76
a funo printf( ) no que consiste em uma expresso de controle
seguida por uma lista de argumentos. S que a lista de argumentos de
scanf( ), devem ser endereos de variveis !

O prottipo para scanf( ) est em stdio.h, e sua sintaxe :

scanf ( expresso de controle , lista de


argumentos);

A expresso de controle contm especificadores de formato


de entrada que so precedidos por um sinal de % (porcentagem) e
informam scanf( ) o tipo de dado a ser lido na ordem da esquerda
para a direita, com os argumentos da lista.

Especificadores de formato da funo scanf( ) :

%c ............. L um nico caractere


%d ou %i ....... L um inteiro decimal
%e ............. L um n em notao cientfica
%f ou %g ....... L um n em ponto flutuante
%l ............. L um inteiro longo
%lf ............ L um double
%o ............. L um inteiro octal
%p ............. L um ponteiro
%s ............. L uma string(cadeia de caracteres)
%u ............. L um decimal sem sinal
%x ............. L um hexadecimal
% .............. Busca por uma cadeia de caractes

Operador de endereo

A Linguagem C oferece um operador chamado Operador


de Endereo representado pelo smbolo & (e comercial) que
resulta o endereo do operando. 77
Toda varivel ocupa uma certa localizao na memria, e
seu endereo o do primeiro byte ocupado por ela.

Nota: Endereo o nome que o computador usa para identificar uma


varivel.

Todas as variveis utilizadas para receber valores, atravs


de scanf( ), devem ser passadas pelos seus endereos.
Se referenciarmos uma varivel x precedida por & (&x),
a funo scanf( ) devolver o endereo do primeiro byte onde x est
guardada.

Nota: Uma memria de computador dividida em bytes que so


numerados de 0 at o limite mximo de memria.
Exemplo: 0 ............................16Mbytes (16.384 Kbytes)

limite de memria
Exemplo de Programa:
/* Programa Clculo de Rentabilidade */
# include <stdio.h>
# include <conio.h>
# include <dos.h>
main( )
{
float valor_principal, juros, rentabilidade;
clrscr( );
printf (Digite o valor principal:);
scanf (%f,&valor_principal);
printf (Digite a taxa de juros (%):);
scanf (%f,&juros);
rentabilidade = valor_principal * (juros/100);
printf(A rentabilidade foi de r$%.2f,rentabilidade);
delay (3000);
}

Funcionamento do Programa:

O arquivo-fonte <stdio.h> da diretiva #include, possui o


prottipo para as funes printf( ) e scanf( ). J o arquivo-fonte
<conio.h> possibilita a funo clrscr( ) de limpar a tela do monitor
78
de vdeo antes da impresso de texto e dados. A funo delay( )
instruda pelo processador C atravs do arquivo-fonte <dos.h> .
Devemos identificar o tipo das variveis no incio do corpo
do programa (aps a funo main( ) ), assim determinamos as posies
de memria com nomes para referenciar seus contedos.
Determinamos, no exemplo, 4 variveis do tipo float
(dgitos de preciso) : valor_principal, juros e rentabilidade. Atravs
de printf( ), solicitamos ao usurio o valor principal. Este dado, a ser
inserido atravs do teclado pelo usurio, associado varivel
valor_principal. Posteriormente solicitado a taxa de juros e o
valor associado varivel juros. Repare que a varivel precedida
do smbolo & para determinar o endereo da varivel. Pr-
finalizamos o programa com a equao rentabilidade que determinar
o valor do juro ganho com a aplicao. A impresso ser com duas
casas decimais, para identificar o valor em moeda corrente. Haver
uma pausa de 3 segundos para visualizao e posterior finalizao.

Matriz String
String, conforme visto no captulo 2, uma das formas
mais importantes de armazenagem e manipulao de dados. O
compilador, quando encontra qualquer caractere entre aspas duplas,
reconhecer que trata-se de uma string constante. Uma string
finalizada pelo caractere null, ou seja, em uma string cada caractere
ocupa 1 byte de memria e o ltimo caractere sempre \0 (null) que
tem valor zero (0) decimal, sendo assim a nica maneira que as
funes possuem para poderem reconhecer onde o fim de uma string.
Este efeito melhor visualizado quando utilizamos uma
matriz como um conjunto de dados de mesmo tipo.
A funo scanf( ) considerada limitada para a leitura de
strings, pois usa o espao em branco para terminar a leitura na
entrada.

Assim no encontramos uma forma, em scanf( ), de


digitarmos textos com vrias palavras.

Exemplo:
.
. 79
char nome [ 18 ];
printf (Qual o seu nome completo ?);
scanf (%s, nome);
printf (Ol, %s .,nome );
.
.

O programa imprimir seu 1 nome com no mximo 17


caracteres pois o ltimo null (nulo). A funo scanf( ) l cada
caractere no branco e os armazena a partir do endereo nome .
Apenas fornece o 1 nome pois, quando encontra um caractere em
branco, termina o processo (para scanf( ), um espao em branco um
retorno de carro ou tabulao). Se o nome digitado for, por exemplo:
CARLOS DA COSTA, ser impresso apenas CARLOS, mesmo que a
matriz possibilite guardar 17 caracteres mais o mull.
Nota-se que a varivel nome no est precedida por &,
pois a matriz (nome) seu endereo inicial. Se utilizssemos o
operador de endereo &, no teramos um limite de caracteres na
varivel, que no exemplo 17 + null.

Operadores de E/S atravs do controle

A Linguagem C nos permite enfoque nas operaes de E/S


(entrada e sada) que so efetuadas pelas funes da biblioteca,
envolvendo diversas funes diferentes. Em C, existe E/S pelo
console e atravs de arquivo. Veremos neste captulo, em detalhes,
funes de E/S pelo console definidas pelo padro ANSI C, ou seja,
funes que realizam a entrada de dados pelo teclado e a sada de
dados, ou resposta, pelo monitor de vdeo.

Em algumas situaes, a funo scanf( ), no se adapta


perfeitamente a finalidade ou desempenho de um programa. Por
exemplo: necessrio pressionarmos enter depois da sua entrada para
que scanf( ) termine a leitura. A biblioteca de C permite a opo de
funes que lem um caractere no instante em que digitado, sem
esperar enter .
80
O sistema de E/S pelo console um flexvel mecanismo
para transferir dados entre dispositivos. Vejamos algumas funes
que nos permite averiguar a funcionabilidade deste evento.

As funes getch( ) e getche( )


O prottipo para essas funes so encontrados em conio.h
A funo getch( ) l o caractere do teclado, mas no permite que seja
impresso, espera at que uma tecla seja pressionada e ento retorna
imediatamente. No aceita argumentos e devolve o caractere para a
funo que a chamou.

Exemplo de programa:

/* Programa Exemplo_1 */
# include <stdio.h>
# include <conio.h>
main( )
{
char caractere;
clrscr( );
printf (Digite um caractere : );
caractere = getch( );
printf(\nO caractere pressionado :%c.,caractere);
getch( );
}

Funcionamento: So utilizadas as diretivas conforme a


necessidades do programa. Note que desta vez, no utilizamos a
diretiva dos.h pois no estamos desejando uma pausa no final, no
caso a funo delay( ). Atravs de char identificamos o tipo da
varivel chamada caractere, no caso uma letra, nmero ou smbolo.
Ser impresso na tela uma solicitao para que digite-se qualquer
caractere. Este caractere lido pela funo getch( ) e impresso pela
linha de instruo seguinte, atravs de printf( ).

O programa ento aguardar que o usurio pressione


qualquer tecla, e quando o fizer ser lido por outra funo getch( )
retornando imediatamente a listagem de programao.
A funo getche( ) tem a princpio o mesmo
funcionamento da funo dita anteriormente, exceto quanto a 81
impresso ! Ela permite que o caractere, ora digitado, seja impresso
simultaneamente na tela. Esta observao pode ser melhor visualizada
se substituirmos na linha 9 do programa anterior,getche( ) por getch( )
.
Assim....
caractere = getche ( );

Quando for digitado algum caractere, este ser impresso e


reimpresso atravs de printf( ).

As funes getchar( ) e putchar( )


O prottipo para essas funes est contido em stdio.h. A
funo getchar( ) l um caractere do teclado e s termina a leitura
deste, ou seja, s devolver o valor aps pressionarmos enter. Permite
que o caractere digitado seja impresso simultaneamente. A funo
putchar( ) devolve o caractere escrito imprimindo-o na tela do monitor
de vdeo a partir da posio atual do cursor. Tambm est definido no
arquivo stdio.h. A funo putchar( ) o complemento de getchar( ).

Exemplo de programa:

/* Programa Exemplo_2 */
# include <stdio.h>
# include <conio.h>
main( )
{
char caractere;
clrscr( );
printf (Digite um caractere e veja seu sucessor:);
caractere = getchar ( );
putchar (caractere + 1 );
getch( );
}

Funcionamento: O programa utiliza a diretiva stdio.h que contm os


prottipos pasa as funes printf( ), getchar( ) e putchar( ). Os
prottipos para as funes clrscr( ) e getch( ) esto em conio.h . O
programa sugere um caractere que ser lido por getchar( ) e impresso
simultaneamente; logo aps, putchar( ) possibilita a impresso do
82
sucessor do caractere anteriomente digitado. A funo getch( )
aguarda uma tecla ser pressionada para finalizar o programa.

As funes gets( ) e puts( )


As funes gets( ) e puts( ) permitem a leitura e escrita de
strings de caracteres no console. O prottipo das funes
encontrado em stdio.h .
A funo gets( ) l uma string de caracteres atravs do
dispositivo padro de entrada (teclado). Para corrigirmos erro de
digitao usamos a tecla Back Space antes de pressionar <enter>.
Aps a leitura, coloca a string no endereo apontado por seu
argumento ponteiro de caracteres. Espaos e tabulaes so aceitos
por gets( ).

Exemplo de programa:

/* Programa Exemplo_1 */
# include <stdio.h>
# include <conio.h>
main( )
{
char nome [50];
int idade;
printf (Qual seu nome ?\n);
gets (nome);
printf (\nQual sua idade?\n);
scanf (%d,&idade);
printf(\nOl %s, em seu ltimo aniversrio voc
completou %d dias de vida !,nome,idade*365);
getch( );
}

No exemplo, o programa utiliza a diretiva stdio.h pois


contm os prottipos para as funes printf( ) , gets( ) e scanf( ). Os
prottipos para as funes clrscr( ) e getch( ) esto em conio.h .
83
Atravs de printf( ) pergunta-se o nome ao Usurio que
ser digitado e associado varivel chamada nome do tipo char que
possibilita um nmero mximo de 50 caracteres, e tambm a
visualizao no vdeo. Em seguida, atravs de scanf( ) inserido um
novo dado uma varivel do tipo int chamada idade. Se por exemplo
a varivel nome for: Joo da Cruz e a varivel idade for 21, teremos na
tela impresso o seguinte resultado:
Ol Joo da Cruz, em seu ltimo aniversrio voc completou 7665 dias
de vida!

A funo puts( ) utilizada quando deseja-se um cdigo


altamente otimizado, de fcil uso ! Esta funo o complemento de
gets( ) e imprime na tela uma nica string por vez seguido por uma
nova linha. Reconhece os cdigos de escape de printf( ) assim como o
null (\0) como fim de string.
Uma chamada a puts( ) requer menos tempo do que a mesma
chamada a printf( ) pelo fato de puts( ) escrever apenas strings
caractere.

Exemplo de programa:

/* Programa Exemplo_2 */
#include <stdio.h>
#include <conio.h>
main( )
{
char nome [50];
clrscr( );
puts (Qual o seu nome ?);
gets (nome);
puts;
puts (Ol);
puts (nome);
puts (tudo bem ?);
getch( );
}
O exemplo de programa, solicitar atravs de um texto o
nome do usurio, que por sua vez ser lido por gets( ). Se, por
exemplo, o nome digitado for RONALDO o programa imprime:

Qual o seu nome ?


RONALDO 84
Ol
RONALDO
tudo bem ?

Comparando printf( ) com puts( ) :

Exemplo: printf(%s\n,nome);

... o mesmo que: puts(nome);

Obs: A funo puts( ) imprime somente uma string. Para a impresso


de um nmero maior de strings necessrio o uso de printf( ).

Podemos utilizar o operador de endereo em puts( ). Se


acrescentarmos ao programa Exemplo_2 as linhas:
puts(Seu apelido );
puts(&nome[2]);
puts(?);

....ser visualizado:

Qual o seu nome?


RONALDO

Ol
RONALDO
Tudo bem?
Seu apelido
NALDO
?
O operador nos possibilita a determinar o nmero de
caracteres iniciais que no devero ser impressos.

Exerccios
1 Defina Operador de Endereo:
________________________________________________________
________________________________________________________
_____________________________________________________
85
2 Qual a sintaxe da funo scanf( ) ?
________________________________________________________
______________________________________________________

3 Por que uma string finalizada pelo caractere null ?


________________________________________________________
______________________________________________________

4 D 5 exemplos de especificadores de formato scanf( ) e explique a


sua utilizao.
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
___________________________________________________

5 Por que a funo scanf( ) considerada limitada para a leitura de


strings ?
________________________________________________________
______________________________________________________

6 O programa funciona corretamente? Por que ?

#include <stdio.h>
#include <conio.h>
main( )
{
char PALAVRA [50];
clrscr( );
puts(Escreva uma palavra:);
scanf(%c,PALAVRA);
puts(PALAVRA);
getch( );
}
________________________________________________________
________________________________________________________
________________________________________________________
____________________________________________________

7 Qual a principal diferena entre getch( ) e getche( ).


________________________________________________________
86
________________________________________________________
________________________________________________________
____________________________________________________

8 Para ler uma string de caracteres qual funo deve ser utilizada:
getchar( ) ou gets( ) ? Explique:
________________________________________________________
________________________________________________________
________________________________________________________
____________________________________________________

9 Se for digitada a palavra FUNO, o que ser visualizado na tela


aps a execuo do programa ?

#include <stdio.h>
#include <conio.h>
main( )
{
char palavra;
clrscr( );
puts(Digite uma palavra:);
palavra = getchar( );
putchar(palavra);
getch( );
}
________________________________________________________
________________________________________________________
________________________________________________________
____________________________________________________

10-No exerccio anterior, se utilizssemos gets( ), quais as


modificaes necessrias para o correto funcionamento? O que seria
impresso ?

________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
_________________________________________________
87
11-Elabore um programa que calcule a quantidade de combustvel
gastos em uma viagem. O programa deve solicitar ao usurio os
seguintes dados: Qual distncia(em Km)o veculo faz por litro de
combustvel, tempo (em horas) gasto na viagem e a velocidade mdia
(em Km) durante a mesma.
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
_________________________________________________

12-Crie um programa que seja capaz de converter e apresentar a idade


de uma pessoa em dias e em horas.
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
_______________________________________________

Captulo 7

88
Decises e
Seleo
mltipla

O comando if
Bloco de comando com if
O comando if-else
O comando if-else-if
O operador alternativo ?
Operadores lgicos
O comando switch

Comandos de Seleo

Em C, os comandos de seleo direcionam o fluxo de um


programa utilizando expresses relacionais que controlam quais
comandos sero executados com base em uma ou em outra condio.
Muitos comandos em C contam com um teste condicional que
determina o curso da ao. Uma condio, poder ser falsa ou 89
verdadeira; ou seja, diferente de zero ou zero. Esse mtodo, para
verdadeiro e falso, permite que rotinas sejam codificadas com
eficincia.
Um comando de deciso executa uma srie de instrues,
se for necessrio repete a seqncia at que uma certa condio seja
encontrada e decide entre aes alternativas.

O comando if
Utilizamos esse comando quando deseja-se tomar uma
deciso simples. Se a expresso verdadeira (diferente de 0), o
comando ou bloco que forma o corpo do if executado uma nica
vez. Se a expresso for falsa, o programa no executa a instruo
iniciada por if .

Exemplo:
.
.
main( )
{
clrscr( );
int x;
printf(Digite um nmero:);
scanf(%d,&x);
if (x>=0)
if (x<100)
puts(O nmero menor que uma centena ! );
getch( );
}

Neste exemplo, ao executar o programa, solicitado um


nmero. A funo scanf( ) possibilita a entrada atravs do teclado, de
um nmero que ser atribudo varivel x . O comando if efetuar a
seqncia de condies at que encontre a verdadeira.

if ( x>=0 ) Se x for maior ou igual a zero


90
if( x<100 ) e menor que cem.................

Se o nmero digitado satisfaz a condio, ento ser


impresso: O nmero menor que uma centena ! uma nica vez, caso
contrrio no imprimir nada e aguardar pressionarmos uma tecla
para finalizar o programa ( atravs de getch( ) ).

Sintaxe :

if ( expresso de controle )
comando ;

Obs: comando pode ser um bloco de comandos, um nico comando


ou nada ( comandos vazios ).

Bloco de comando if
Em C, possvel a utilizao de ifs aninhados ,que
formam um comando composto, tambm chamado bloco de
comando. Neste caso, um comando if o objeto de outro if .

Sintaxe:

if (expresso de controle) {
if (expresso de controle)
comando 1;
comando 2;
}

Exemplo:
.
.
main ( )
{
clrscr( );
int a,b;
puts(Digite dois valores:\n); 91
scanf(%d,&a);
scanf(%d,&b);
if (a < b) {
if (b < 10)printf(O 2nmero menor que 10\n);
puts(O 1 nmero menor que o 2nmero);
}
getch( );
}

Funcionamento: O programa possibilita, atravs de scanf( ), a leitura


de dois valores digitados no teclado, que por sua vez so atribudos s
variveis ( do tipo int ) a e b respectivamente. Se a for menor que b,
o bloco de comando (que est envolvido por chaves) executado,
sendo que a mensagem o 2 nmero menor que 10 somente ser
impresso se b for menor que 10.
A mensagem O 1 nmero menor que o 2nmero ser
obrigatoriamente impressa se a for menor que b. Caso a expresso
contida no primeiro if do programa no for verdadeira, o bloco de
comando if no ser executado, passando p/a prxima instruo que
no exemplo getch( ) que aguardar uma tecla para terminar o
programa.

O comando if-else
Vimos que o comando if executa uma nica instruo ou
um bloco de comando quando verdadeira ( 1 ) a expresso. Porm,
nada far se esta for falsa ( 0 ).
Quando associamos if ao comando else, haver a execuo
de uma ou mais instrues compreendidas entre chaves, se a expresso
de teste relacionada ao comando if for falsa ( 0 ) .
Ou seja, quando o comando if estiver acompanhado de uma
clusula else, esta selecionar um comando alternativo a ser
executado.

Sintaxe:
if (expresso de controle)
comando 1;
else
comando 2;
92
Se a expresso de controle for verdadeira, o programa
executar comando 1; do contrrio executar comando 2. Ambos os
comandos terminam com ponto-e-vrgula, como de resto, todos os
comandos em C.

Exemplo:
.
.
main( )
{
clrscr( );
int a,b,c,d;
float e;
puts(Digite 4 valores inteiros:);
scanf(%d%d%d%d,&a,&b,&c,&d);
e=(a+b+c+d)/4;
if(a < b)
puts(O 1nmero menor que o ltimo nmero digitado);
else
printf(A mdia aritmtica dos nrs digitados :%.1f,e);
getch( );
}

Funcionamento: Inicialmente, o programa sugere 4 valores que


sero digitados pelo usurio em forma ordenada e atribudas atravs de
scanf( ) as variveis a,b,c e d. Note que utilizamos apenas uma funo
scanf( ) tornando , com isso, o programa mais portvel. Se os
comandos de formato printf forem diferentes (ex:%d %f %c) devem
ser separados por espao. A mdia aritmtica calculada para uma
posterior chamada, se necessrio. Em seguida o programa decidir o
que fazer tomando como base as condies descritas nele.
Se (if) a 1varivel (a) for menor que a ltima (d) o
programa imprimir uma mensagem afirmando o evento e aguardar
em seguida o encerramento do programa; caso contrrio (else) ser
impresso somente a mdia aritmtica das variveis aguardando em
seguida o trmino do programa atravs de getch( ).

O comando if-else-if
Tambm chamada de escada if-else-if ou rvore de
deciso devido a sua aparncia na listagem do programa, faz com que
as condies sejam avaliadas de cima para baixo. Encontrada a
93
condio verdadeira, o comando associado a ela executado fazendo
com que o restante da escada seja contornado.
Esta coleo de comandos if com clusulas else pode
conter um else final para garantir no mnimo que um comando seja
relacionado.

Sintaxe:
if (condio 1 )
comando 1;
else if (condio 2)
comando 2;
else if (condio 3)
comando 3;
.
.
else comando n ;

Um comando if inicia a seleo mltipla executando o


comando 1 se a condio 1 for verdadeira. Se a condio 2 for
verdadeira, o comando 2 executado e assim por diante para tantas
condies e comandos necessrios.
Obs: Apenas um dos comandos ser selecionado.

Se nenhuma das condies for verdadeira, um else final


ser executado, assegurando total controle sobre as aes do programa
para todas as possveis condies.

Exemplo:
.
.
main( )
{
clrscr( );
char x;
puts(Escolha apenas uma das letras: a,b ou c );
scanf(%c,&x);
if(x==a)
printf(O incremento de a :%c\n,++x); 94
else if (x==b)
printf(O incremento de b :%c\n,++x);
else if (x==c)
printf(O incremento de c :%c\n,++x);
else
puts(Voc no digitou uma letra vlida !);
puts(Pressione uma tecla p/finalizar);
getch( );
}

Funcionamento:
O programa sugere a escolha de uma letra que, atravs de
scanf( ) associar varivel x. Apenas uma das condies ser
verdadeira; e se for ser impresso, portanto, o incremento deste
caractere (a,b ou c) passando, posteriormente, para as instrues que
solicita uma tecla para finalizar o programa . Se nenhuma das
condies for verdadeira, atravs do ltimo else ser impressa uma
mensagem alertando para o fato e posteriormente solicitando uma
tecla para finalizar o programa.

O operador alternativo ?
Em C, existe uma forma compacta de representar uma
instruo if-else simples.
Tambm chamado de Operador ternrio ( o nico em C),
o ? requer trs operandos.
Sintaxe:

Expresso 1 ? Expresso 2 : Expresso 3 ;

A Expresso 1 avaliada, se for verdadeira (0), a


Expresso 2 se torna o valor da expresso ? inteira. Mas se a
Expresso 1 for falsa (0), a Expresso 3 que se tornar o valor da
expresso inteira.

Exemplo:
95
#include <stdio.h>
#include <conio.h>
#include <math.h>
main( )
{
clrscr( );
int x;
float y;
puts(Digite um valor inteiro positivo:);
scanf(%d,&x);
y = x>100 ? printf(O nmero maior que cem e sua
raiz quadrada :%.2f,sqrt(x)): printf(O nmero
menor que cem e seu quadrado :%d,x*x);
getch( );
}

Funcionamento: O programa sugere que seja digitado um nmero


inteiro positivo, que ser atribudo uma varivel x do tipo int . A
expresso 1 (y = x > 100) avaliada, se for verdadeira (nmero
digitado maior que cem) ser impresso o texto e resultado da
expresso 2. Se a condio for falsa (nmero digitado menor que
cem) ento ser impresso o texto e resultado da expresso 3.

Uma outra diretiva foi utilizada com o prottipo <math.h> que


possui diversas definies usadas pela biblioteca de matemtica. A
funo sqrt( ) devolve a raiz quadrada de um nmero positivo. Sua
sintaxe : sqrt( x ); onde x o nmero que se quer extrair a raiz
quadrada.

Operadores lgicos
Os operadores lgicos explanam as maneiras que as
relaes podem ser conectadas. Os operadores relacionais (visto no
captulo 4), freqentemente, trabalham juntos com esses operadores.
Como sabemos, verdadeiro qualquer valor diferente de zero,
enquanto que falso zero. Assim como o operador relacional, o
operador lgico devolve 0 para falso e 1 para verdadeiro.
possvel formar expresses relacionais complexas
utilizando os operadores lgicos. 96
Operadores lgicos:
operador ao
&& AND
|| OR
! NOT

Quando for utilizado um mesmo operador mais de uma vez


em uma expresso, sero avaliados pelo compilador da esquerda para
a direita. O uso de parnteses tornam o comando mais claro quando
deseja-se alterar a ordem de avaliao.
Tabela verdade:

x y x&&y x||y !x !y
0 0 0 0 1 1
0 1 0 1 1 0
1 0 0 1 0 1
1 1 1 1 0 0
Obs: Assim como toda expresso relacional, a lgica produz como
resultado o zero (falso) ou 1 (verdadeiro).

Precedncia dos maior ! - (unrio) ++ - -


operadores: * / %
+ -
< > <= >=
== !=
&&
| |
? :
= += -= *= /= %=
menor , (vrgula)

Exemplo 1:
.
.
if ((a>=10) && (a<=100))
comando ;
.
.
No exemplo acima deseja-se executar um comando se a
varivel a estiver compreendida entre 10 e 100.
97
L-se: Se a for maior ou igual a 10 e menor ou igual a 100.........
Neste caso, o comando ser executado se, to somente, as condies
forem verdadeiras.

Exemplo 2 :
.
.
if ((a<10) || (a>100))
comando ;
.
.
No exemplo 2, se qualquer uma das condies for
verdadeira, ou se ambas forem verdadeiras, o comando ser
executado; do contrrio ignorado.
L-se: Se a for menor que 10 ou maior que 100 .......

Obs: Se observarmos a precedncia dos operadores, podemos


escrever o exemplo anterior da seguinte forma:
.
.
if (a<10 || a>100)
comando;
.
.
Porm o efeito o mesmo, mas para torn-lo mais claro
conveniente utilizarmos parnteses extras.

O operador NOT ( ! ) utilizado para inverter a lgica de


uma condio (verdadeira ou falsa).
Exemplo:
.
if (!(x>10))
comando ;
.
L-se: Se x no for maior que 10 ...............

Ento o comando ser executado somente se x for menor


que 10 . permitido a combinao de vrias condies em uma
expresso.

Exemplo:

40>10&&!(40<7)||6>=4
98
Neste caso, a condio verdadeira .

O comando switch
Esse comando freqentemente utilizado para processar
uma entrada de dados pelo console.
Algumas rvores de deciso se tornam mais claras, se
escritas com o comando switch que similar ao else-if mas tem maior
flexibilidade. O comando switch testa sucessivamente o valor de uma
expresso com uma lista de constantes. Se o valor coincide, os
comandos associados quela constante so executados.

Sintaxe:
switch (expresso) {
case constante_1:
comando_1;
break ;
case constante_2:
comando_2;
break;
.
.
default:
comando_n;
}

O comando switch usa um ou mais rtulos case, cada um


especificando uma constante diferente a ser comparada com a
expresso entre parnteses que deve ser de valor inteiro ou caractere.
Quando um determinado caso for verdadeiro, a seqncia
de comandos associada a este ser executada at que o comando break
ou fim do comando switch seja alcanado. Se nenhum caso for
verdadeiro o comando default executado. O default opcional e, se
no estiver presente, nenhuma ao ser realizada se todos os testes
falharem. Pode haver uma ou mais instrues (no precisam estar
99
entre chaves) seguindo cada case. Os rtulos dos casos devem ser
todos diferentes. O comando break causa uma sada imediata do
switch, porm se no existir, o programa segue executando todas as
instrues dos casos posteriores.
Devemos envolver por chaves o corpo de switch . Cada
rtulo case termina com dois-pontos e no pode existir sozinho, ou
seja, fora de switch .
Exemplo:

#include <stdio.h>
#include <conio.h>
main( )
{
clrscr( );
char x ;
puts(Selecione a opo:\n a -Soma\n b -Subtrao\n c -
Multiplicao\nd-Diviso);
x=getch( );
switch (x) {
case a :
puts(Voc selecionou Soma);
break ;
case b :
puts(Voc selecionou Subtrao);
break ;
case c :
puts(Voc selecionou Multiplicao);
break ;
case d :
puts(Voc selecionou Diviso);
break ;
default :
puts(Voc escolheu uma opo invlida.);
}
getch( );
}

No exemplo, temos um programa que descreve a opo


escolhida, a partir da seleo de um caractere no teclado. Caso o
caracter escolhido no coincida com algum case , ser impressa uma
mensagem comandada por default. Note que os dois comandos (case
e default) devem estar dentro do corpo de switch.

Obs.: A expresso do comando switch deve ter valor inteiro ou


caractere.

100
Outro exemplo:

#include <stdio.h>
#include <conio.h>
main( )
{
clrscr( );
char x ;
puts(Selecione a opo:\n + -Soma\n - -Subtrao\n * ou x
-Multiplicao\n / -Diviso);
x=getch( );
switch (x) {
case + :
puts(Voc selecionou Soma);
break ;
case - :
puts(Voc selecionou Subtrao);
break ;
case * :
case x :
puts(Voc selecionou Multiplicao);
break ;
case / :
puts(Voc selecionou Diviso);
break ;
default :
puts(Voc escolheu uma opo invlida.);
}
getch( );
}

Exerccios

1- Descreva o funcionamento do comando if .


________________________________________________________
________________________________________________________
_____________________________________________________

2- Para que serve o comando break ?


101
________________________________________________________
______________________________________________________

3- Qual a sintaxe do comando if-else-if .


________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
___________________________________________________

4- Para que serve a funo sqrt( ) e em que prottipo est definida ?


________________________________________________________
______________________________________________________

5- Quais so os operadores lgicos em C ? Descreva sua ao


(significado) e a tabela verdade.
________________________________________________________
______________________________________________________

a b a&&b a||b !a !b

6- As expresses abaixo so verdadeiras ? (falso ou verdadeiro)


Se preferir utilize parnteses, para tornar o cdigo mais claro.

( ) 70>20&&!(70<8)||6>=5
( ) 1<2||2>=3
( ) 4*2-7<=4-8
( )6>=5&&5!=2||2<4
( )++15>15||70!=60+7&&5>=5/1

7- Escreva a sintaxe do operador ternrio e seu funcionamento. 102


________________________________________________________
________________________________________________________
________________________________________________________
____________________________________________________

8- O que ser impresso se:


int x=10, y=3, z=5 ;
float a=5.5 , b=17.3 ;
float c, d ; Resposta
a) c=x>20?printf(%.2f,a):printf(%d,z); ____________________
b) c=a=5.5?printf(%d,y):printf(%d,y); ____________________
c) d=a<=b?printf(%.2f,b):printf(%d,x); ____________________
d) c=a!=b?printf(%.3f,b-a):printf(%d,y); ___________________
e) d=y>x-z?printf(%d,y):printf(%d,x); ____________________

9- Explique o funcionamento do comando switch.


________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
___________________________________________________

10- Faa um programa, utilizando if-else-if que simule uma


calculadora capaz de executar contas simples
(nmero,operador,nmero) utilizando os operadores
soma,subtrao,multiplicao e diviso.
________________________________________________________
______________________________________________________

________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
___________________________________________________

11- Faa o mesmo programa, mas utilize o comando switch.


________________________________________________________
________________________________________________________
________________________________________________________ 103
________________________________________________________
________________________________________________________
__________________________________________________

12- Faa um programa utilizando if-else que identifique se a letra


digitada vogal ou consoante.
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
___________________________________________________

13- Elabore um programa que seja capaz de identificar se o caracter


digitado um nmero, letra maiscula, letra minscula, um espao,
ou nenhum dos tipos mencionados.
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
__________________________________________________

14- Faa um programa que leia 3 valores numricos e os apresente


em ordem crescente.
________________________________________________________
________________________________________________________
_____________________________________________________

________________________________________________________
________________________________________________________
________________________________________________________
____________________________________________________

15- Elabore um programa que leia quatro valores referentes a quatro


notas escolares de um aluno e imprima dizendo que o aluno foi
aprovado, desde que a mdia escolar seja igual ou maior que 7. Se
a mdia for menor que 7, solicitar a nota de exame, somar com a
mdia anterior e obter nova mdia. Se a nova mdia for maior ou 104
igual a 5, apresentar uma mensagem dizendo que o aluno foi
aprovado em exame. Se o aluno no obter, aps o exame, mdia
satisfatria apresentar uma mensagem dizendo que est retido.
Apresentar junto com as mensagens o valor da mdia do aluno para
qualquer condio.
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
__________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
__________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
__________________________________________________

105

Você também pode gostar