Você está na página 1de 97

Linguagem C

9
Prefácio

Esta Apostila foi planejada para


um curso de programação em Linguagem C , e
o objetivo principal é de apresentá-la
claramente, mostrando assim a criação de
vários programas, explicando exatamente o
que ocorre em cada “passo”.
Por que C ? Porque é popular,
disponível na maioria dos sistemas de
computação e relativamente fácil de aprender,
até mesmo como primeira linguagem de
programação.
Ao aluno interessado haverá a
oportunidade de criar novos programas e de
desenvolver mais idéias 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
compatível com o MS-DOS ou UNIX.

Profº Callé
10
Capítulo 1

Introdução

• Origem da Linguagem C
• Linguagem de Médio Nível e Estruturada
• Interpretadores e Compiladores
• Modelo de um programa em C
• Compilação Separada
• Compilando um programa em C
• Mapa de Memória de C

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

Linguagem C com
BCPL B C padrão formado
pelo ANSI
Desenvolveu a
Linguagem C (década de 70)
Linguagem antiga, mas
ainda em uso na Europa.
Originou a Linguagem B.

ANSI : Padrão que define um conjunto completo de funções de E/S


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

Linguagem de Médio Nível

Para computadores, é uma linguagem de nível médio. Não


significa que é menos poderosa ou menos desenvolvida. Linguagem C
combina elementos de linguagem de alto nível com funcionalidade de
linguagem Assembly.

Permite a manipulação de bits, bytes e endereços.


Bit: Sinônimo de dígito binário; 0 ou 1.
Byte: Caractere de 8 bits
Endereço: Nele estão contidas as memórias do computador.

Linguagem C tem velocidade de “Linguagem de Máquina”


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

Médio Nível: C , Forth , Macro-assembler.

Nível mais baixo: Assembler.

Um código em C é muito portável !

OBS: Portabilidade significa que é possível 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)
contém 159 palavras-chaves !

Linguagem Estruturada
A característica especial de uma linguagem estruturada é de,
através da criação de sub-rotinas, com o uso de variáveis locais,
processar eventos que não causem nenhum efeito inesperado nas
outras partes do programa. Por exemplo, em uma linguagem
estruturada, o uso do goto é proibido.

Linguagem não estruturada: Fortran, Basic, Cobol.


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

13
Obs: O termo “Linguagem estruturada em blocos” não é
rigorosamente aplicável em C.
Linguagem C é simplesmente referida como Linguagem
Estruturada.

Linguagens estruturadas tendem a ser modernas, pois os


programadores a consideram mais fáceis.

Função = Sub-rotina isolada

Permite definir e codificar separadamente


as tarefas de um programa.

Após ter sido criada (a função), permite ser utilizada em


várias situações, sem criar efeitos inesperados em outras partes do
programa.
Outro meio de estruturar o código em C é criando-se um
“bloco de código”. Este bloco é escrito no programa entre chaves: { }
Isto faz com que o programador conceitue a verdadeira
natureza da rotina.
A linguagem C propõe ao usuário planejar programas
estruturados e modulares. O resultado é um programa mais legível e
documentado.

Linguagem para Programadores

Nem todas linguagens de computadores são para


programadores !!!
Por exemplo: Linguagem Basic foi criada para os usuários
que não precisam, necessariamente, ser programadores e assim
resolverem problemas relativamente simples em seus computadores.
A linguagem C foi criada, influênciada e testada por
programadores profissionais. Ela proporciona:
14
• Poucas restrições e reclamações;
• Funções isoladas;
• Estruturas de bloco;
• Conjunto compacto de palavras-chaves.

É possível tornar um código escrito, compilá-lo e rodá-lo


em outra máquina com pouca ou nenhuma modificação.
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 são simplesmente programas


sofisticados que operam sobre o código-fonte do seu programa.

Interpretador: Lê o código-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 código-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 não houver erros, gera um programa em
disco com o sufixo “ .Obj “ com as instruções já traduzidas. Este
programa não 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 execução do programa pode ser de
20 vezes mais rápida do que quando o programa é interpretado.

Mais vantagens:
• Se o programa já foi compilado e linkeditado, não será mais
necessária a presença do compilador.
• Programas .Exe não podem ser alterados, com isso o código fonte
estará protegido.

Obs:

Linkeditor: Une funções compiladas separadamente em um


programa. Combina as funções da Biblioteca C padrão com o código
escrito pelo programador. A saída do linkeditor é um programa
executável.

Tempo de compilação: Refere-se ao tempo durante o qual o


compilador lê os arquivos-fonte e gera o código-objeto. Um erro em
tempo de compilação é um erro de sintaxe descoberto durante a
compilação.

Sintaxe: São regras a serem seguidas ao digitar comandos. Para


evitar um erro no programa, é indispensável a atenção quanto à sintaxe
de C. O compilador avisará ao usuário, no caso de um erro.

Tempo de execução: Tempo durante o qual um programa “ roda “.

Depuração: É o processo de localizar e corrigir erros de execução.

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

asm _cs _ds _es


_ss cdecl far huge
interrupt near pascal

Todas palavras-chaves em C são minúsculas, “else” é uma


palavra-chave, mas ELSE não !
A palavra-chave não pode ser utilizada como uma variável
ou nome de uma função.
A única função que sempre deve estar presente é:

main ( )

É a primeira função a ser chamada quando a execução do


programa começa, embora não seja tecnicamente parte da linguagem
C.
A função main( ) não é utilizada como variável.

A Biblioteca e a Linkedição
Todo compilador C vem com uma biblioteca C padrão de
funções para realizar tarefas necessárias mais comuns, definidas pelo
padrão ANSI C. No entanto é provável que um compilador tenha
outras funções adicionais, como por exemplo: gráfica.
Se o programador usa uma função (determinada função)
várias vezes e sua biblioteca padrão não contém esta função, é
possível colocá-la em uma biblioteca. Assim sempre que necessário
ela será utilizada. E quando esta função for chamada, uma vez
memorizada pelo compilador C, o linkeditor combinará o código-
escrito com o código-objeto já encontrado na biblioteca. Este
processo é chamado de Linkedição.
17
Alguns compiladores C tem seu próprio linkeditor,
enquanto outros usam o linkeditor padrão fornecido pelo sistema
operacional.

Compilação Separada

Para programas longos, é permitido que um programa esteja


contido em vários arquivos e que cada arquivo seje compilado
separadamente. Com isso podemos mudar o código 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 funções necessárias da biblioteca.

Para alguns compiladores é necessário usar um editor


separado para criar o programa.
Os compiladores só aceitam arquivos de texto padrão para o
editor.

Mapa de memória de C

Pilha

Heap
> 4 regiões da memória
Variáveis Globais

Código do Programa

Obs: Acima temos um mapa conceitual.


18
Pilha: Guarda o estado atual da CPU.

Heap: Memória livre, a disposição do programa C.

Variáveis Globais: São criadas e acessadas independentemente.

Código do Programa: O compilador gera o código.

Código-fonte: É o programa que pode ser lido; é a “entrada” para o


compilador C.

Código-objeto: Traduz o código-fonte em linguagem de máquina; é a


“entrada” para o linkeditor.

19
Capítulo 2

Elementos
Básicos de
C

• A função main ( )
• Comentários
• A função printf ( )
• Códigos de caracteres de Escape
• Strings
• Comandos de formato printf
• Exercícios

20
A função main ( )
Um programa em C é constituído de:

Título: main ( ) , parte principal de qualquer programa C.

Corpo do Programa: é iniciado por uma chave “ { “, e


terminado por outra chave “} “ .

Uma função, que necessariamente estará presente é


denominada de main ( ), que é a primeira função a ser chamada
quando o programa é executado.

main ( ) ✎ Contém um esboço do que o programa faz; inicia a


execução do programa.

main ( ) ➧ primeira função a ser executada


{ ➧ inicia o “corpo” da função
} ➧ termina a função

Os parênteses “( )” após o nome indicam que esta é uma


função. Toda função 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, conseqüentemente será mais
simples de se ler e entender.

Nome da função
{
instrução;
instrução;
{
instrução;
}
instrução;
}
21
Quando é aberta uma chave “{“, deslocamos o código de
programa à direita desta, e quando fechamos uma chave “}”,
deslocamos para a esquerda.

Obs: Letra minúscula ➧ para formação escrita de variáveis,


funções e comandos.
Letra maiúscula ➧ para constantes.

Comentários
Todo programa deve conter comentários como guia de
explicação, e em C, é iniciado com o par de caracteres : /* ; e
finalizado pelo par: */ .
O comentário pode ser colocado em qualquer lugar do
programa, menos no meio de uma palavra-chave ou entre outro
comentário, e sempre são delimitados pelo chamados símbolos de
comentários.

/* ➧ barra-asterísco
*/ ➧ asterísco-barra
Comentários são úteis também para identificar o propósito
ou nome de um programa.

Exemplo correto: Exemplo incorreto:

/* Primeiro programa em C */ swi/*isso não funciona*/tch

main ( )
{ ou
printf (“Programando em C “);
} /*este progr./*não funciona*/

22
Como o compilador ignora caracteres contidos em símbolos
de comentários e espaços, os comentários podem ser escritos em
várias linhas.

/*
Exemplo de comentário
em várias
linhas
*/

Muitos programadores inserem um grande comentário


descritivo ao início dos códigos. Isto também ocorre quando é
desenvolvido programas em partes separadas por pessoas distintas e
depois unidos num produto final.

A função printf ( )

É uma função de E/S que não faz parte do padrão de


linguagem C, ela é providenciada pelo compilador C pois todos os
sistemas tem uma versão de printf ( ). Esta função escreve na tela um
texto entre aspas duplas. Pertence a uma biblioteca do compilador e
deve ser linkeditada em nossos programas.
Função é uma coleção de comandos identificada por nome.
Utilizar o nome de uma função em um comando é chamar a função e
executar suas instruções; ou seja, os parênteses em printf ( ) indicam
que estamos utilizando uma função e no interior desses parênteses
estão as informações passadas pelo programa main ( ) à função printf(
). Esta informação é chamada de argumento de printf ( ). O controle,
então, é passado para a função printf que imprimirá na tela do monitor
de vídeo, e quando encerra a execução desta, o controle é transferido
novamente para o programa.

23
A sintaxe para a função printf ( ) é:

printf ( “ expressão de controle “, lista de argumentos)

A expressão de controle pode conter caracteres que serão,


por sua vez, demonstrados na tela do computador e comandos de
formato ( códigos de formatação ) que indicam a forma em que os
argumentos devem ser impressos.
A função printf( ) pode ter um único ou vários argumentos.
Obs: Os argumentos são separados por vírgula ( , ).

Exemplo:
/* primeiro exemplo */

main( )
{
printf(“O resultado do jogo foi %d x 0”,2);
}
Na primeira linha do programa temos um comentário
sugerindo um título ou nome do programa. Todo comentário fica a
critério do programador, sendo assim não é obrigatório o uso deste.
A função main( ) a seguir inicia a parte executável.
A chave de abertura é utilizada para que o compilador possa
“ler” as instruções.
Em seguida a função printf( ) passa a ter o controle. O texto
a ser impresso está compreendido entre aspas duplas “ ” e o código de
formatação “%d” indica que será impresso um número decimal. Este
número decimal é o 2 que se encontra na lista de argumentos.
A linha de instrução é finalizada por um ponto-vírgula “ ; “
fato este fundamental para concluir uma linha de instrução.
A chave de fechamento encerra o corpo do programa e o
texto impresso no monitor de vídeo será:

O resultado do jogo foi 2 x 0

Códigos de caracteres de Escape 24


A tabela abaixo demonstra os códigos de C para caracteres
que não podem ser inseridos diretamente através do teclado. A função
printf( ) aceita todos eles.
Os caracteres de escape começam com uma barra invertida
“ \ “ seguida por uma letra que seleciona um código de controle.

Código de escape Significado

\a alarme ou alerta (beep)


\b retrocesso, retorna o cursor de uma
coluna.
\n nova linha, muda de linha
\t tabulação horizontal no vídeo ou
impressora.
\f limpa a tela do vídeo ou passa para
a próxima página da impressora.
\v tabulação vertical no vídeo ou na
impressora.
\r retorno do cursor, fica na primeira
posição 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 interrogação.
\’ apóstrofo ( ‘ ).

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 próxima coluna de tabulação (\t) e escreve no monitor de vídeo
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 sentenças.
Atenção: Não 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 memória.
As strings consistem em dois tipos:

Constantes ➧ caracteres que são impressos na tela.


Comandos de Formato ➧ são códigos de formatação.

Comandos de formato printf.


26
A tabela abaixo mostra os códigos para impressão
formatada de texto.

Códigos 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 .................. notação científica .
%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 símbolo %
(porcentagem).
%ld ............................ decimal longo.
%lf ............................. ponto flutuante longo (DOUBLE).

Um comando de formato começa com um símbolo


percentual (%), e é seguido pelo código de formato. A ordem da
combinação sempre será da esquerda para a direita.

Exemplo:

.
.
printf(“Estamos %s\na linguagem %c.”,”aprendendo”,’C’);
.
.
Será impresso no vídeo o seguinte texto:

Estamos aprendendo
a linguagem C.

A função printf imprimirá inicialmente a palavra


“Estamos”; logo após receberá a instrução que deverá ser impresso 27
uma string de caractere. Nesta string será localizado o conjunto de
caracteres envolvidos por aspas duplas após o término do texto a ser
impresso.
Um código de escape “\n” comanda o cursor para a
próxima linha, quando então será impresso a continuação da sentença
“a linguagem” precedida de um caractere “C” identificado por um
outro comando de formato (%c).

Lembre-se: Os argumentos, no caso “aprendendo” e “C” são


separados por vírgula.

Ponto flutuante decimal: Quando deseja-se imprimir um número com


casas decimais , utilizamos o comando de
formato “%f”.

Exemplo: Desejamos imprimir apenas com 3 casas decimais o número


87,3466798.
Então digitamos:

printf (“O número é %.3f”, 87.3466798);

A saída será: 87.347

Obs: O computador arredonda o número !

Exemplo:
O número 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

Exercícios
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 comentários ?


________________________________________________________
______________________________________________________

5 - Porque os programadores costumam utilizar comentários ?


________________________________________________________
______________________________________________________

6 - O que é uma função ?


________________________________________________________
______________________________________________________

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 função printf ( ) ?


________________________________________________________
______________________________________________________

11 - Explique a função main ( ) :


________________________________________________________
______________________________________________________

12 - Esboce o Mapa conceitual da memória C :

13 - O que faz a Biblioteca C ?


________________________________________________________
________________________________________________________
_____________________________________________________

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


formatação:
________________________________________________________
________________________________________________________
________________________________________________________
____________________________________________________

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 - Faça um programa que imprima seus dados pessoais, como o


nome, RG, idade, endereço, utilizando todas as funções e comandos
vistos até este capítulo.
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
__________________________________________________

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


impresso no vídeo:
.
main ( ) /*programa teste*/
{
printf(“O número %.2f é o %s\n de um %cálculo do produto\t\”%d x
15,6789\”\n\?”,376.2936,”resultado”,’C’,24);
________________________________________________________
________________________________________________________
________________________________________________________
____________________________________________________

18 - Elabore um programa que imprima o nº10 em octal e o nº538 em


hexadecimal:
________________________________________________________
________________________________________________________
________________________________________________________
____________________________________________________

31
Capítulo 3

Iniciação
de
Variáveis

• Constantes
• Tipos de Constantes
• Variáveis
• Tipos de Variáveis
• Significado das Variáveis Básicas
• Variáveis Globais e Locais
• Exercícios

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

➧ Constantes inteiras são descritas como números sem componentes


fracionários.
Exemplo: 20 e -150

➧ Constantes em ponto flutuante requerem o ponto decimal seguida


pela parte fracionária do número.
Exemplo: 3.141592

Obs: Em C utilizamos o “ponto” antes da parte fracionária. É


proibido, neste caso, o uso da vírgula !

➧ Constantes de caractere são 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 através 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á também, além do texto o número 5.

Embora o 2ºexemplo é mais simples, não devemos


dispensar o intuito do 1º exemplo, pois se nos defrontarmos com um
programa que exija através da entrada de dados(teclado) um certo
dado é necessário que este seja encontrado pelo comando de formato
para que seja possível a sua impressão.

Tipos de Constantes
Existem três tipos de constantes em C: literais, simbólicas
e objeto.
Uma constante literal é um valor digitado diretamente
em um comando ou expressão de um programa.

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

Constantes simbólicas são aquelas, que através de


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

Exemplo: # define PI 3.14159

Uma diretiva #define tem três 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 vários locais do programa.

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

✎ A diretiva #define não “define” um objeto. Ela define um nome


simbólico para um valor literal. Quando o compilador encontra um
nome simbólico tal como PI, ele substitui esse símbolo por 3.14159
exatamente como se fosse digitado o número diretamente.
Obs: Diretivas, serão tópicos de assunto que serão vistos em
capítulos posteriores.

A constante-objeto, também conhecida por constantes


tipificadas, é um agrupamento de constante literal com variável. Ou
seja, assim como as variáveis, elas ocupam espaço de memória, mas,
da mesma forma que as constantes, seus valores não podem ser
modificados.

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

Veremos, então, na tela do monitor de vídeo:

conta = 200
resposta = 200

Obs: int - variável a ser vista posteriormente.

Variáveis 35
As Variáveis são o aspecto fundamental de qualquer
linguagem de computador. Uma variável é uma posição de memória,
com um nome para referenciar o seu conteúdo, que é usada para
guardar um valor que pode ser modificado pelo programa.

A forma geral para declarar uma variável é:

Nome de um tipo de variável nome da variável ;

Em C, o nome de uma variável não tem nenhuma relação


com seu tipo.

Tipos de Variáveis

Tipo Tamanho escala/abrangência


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 variáveis básicas: char , int , float e double .

36
Estes tipos básicos podem estar acompanhados por
“modificadores de tipo” : signed , unsigned e long .
O uso importante de signed é modificar char ou int nas
implementações em que esse tipo não tem sinal.
Algumas implementações podem permitir que unsigned
seja aplicado aos tipos de ponto flutuante.

Significado das Variáveis Básicas


Vejamos então o siginificado das Variáveis básicas:

char - É uma palavra-chave (ou variável) que indica caracteres


ASCII .
int - Valores inteiros na faixa de -32768 à 32767 .
float - Dígitos de precisão (c/casas decimais) na faixa de 3,4E-38
à 3,4E+38 .
double - Dígitos de precisão 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 fabricação de %d terminais de vídeo”,quantidade);
printf(“\nna empresa %c gasta apenas %.2f minutos de hora”,
empresa,tempo);
}

O programa possui três variáveis: int , char e float.


E a elas é dado um nome.
Obs: Observe que a cada término da instrução usamos ponto-vírgula 37
Posteriormente associamos a variável um valor, seja em
números ou caracteres.
A variável int aceita apenas números inteiros, no exemplo a
ela foi associado o nº 5. A variável float acatará números com ponto
flutuante (c/casa decimal).
Já a variável 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 através de uma matriz e estar contido entre chaves e
aspas duplas (exemplo posterior).
Por fim após nomearmos as variáveis e a elas associarmos
valores, a execução do programa resultará em:
A fabricação de 5 terminais de vídeo
na empresa B gasta apenas 13.46 minutos de hora.

O número 5 é impresso pelo comando de formato %d pois


trata-se de número 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 peça %c.”,z);
}
Observe neste exemplo que é possível em uma linha de
instrução associarmos ao mesmo tempo o nome e o valor à variável.
A variável char y terá como atribuição uma cadeia de
caracteres que serão impressos através do comando de formato %c.

Porque a matriz [12] ?


Utilizando a palavra-chave “char” podemos declarar
uma string (cadeia de caracteres) que são, em C, terminadas em
“nulo”. Isto quer dizer que terminam com um byte zero, também
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 contém 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 então, que a utilização de array em C
significa a criação de matrizes.
O resultado do programa será:

No dia 30 haviam 900 pessoas


no teatro para assistir a peça Z.

Nota: ASCII ➧ A tabela ASCII tem 256 códigos. Dispõe de


números de 0 a 127(decimal) cobrindo letras, dígitos de 0 a 9,
caracteres de pontuação e caracteres de controle como salto de linha,
tabulação, etc...
Os computadores IBM usam 128 caracteres adicionais
com códigos de 128 a 255 que consistem em símbolos de línguas
estrangeiras e caracteres gráficos.
No fim da apostila temos a tabela ASCII !!!
A forma de representar um caractere de código acima de
127 decimal é:
\xdd

... onde dd representa o código de caractere em notação hexadecimal;


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

Resultado:

βφ≡÷π

Variáveis Globais e Locais


Quando uma variável 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 variáveis a, b e despesas são variáveis globais pois são


válidas para todo o programa em virtude de terem sido declaradas fora
da função main( ).
As variáveis d e e são consideradas locais a função
main( ), pois foram declaradas dentro da mesma.

Exercícios

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


________________________________________________________
________________________________________________________
_____________________________________________________
40
2 - Qual a forma geral para declarar uma Variável ?
________________________________________________________
______________________________________________________
3 - Verifique se o programa abaixo funciona corretamente. Descreva,
se houver, os erros e a solução para os mesmos.
.
.
main( );
{
printf(“O placar foi de %c x %% , 5 , 2 );
}
________________________________________________________
________________________________________________________
________________________________________________________
____________________________________________________
4 - Qual o procedimento para, através da palavra-chave “char”,
declararmos uma string.
________________________________________________________
________________________________________________________
_____________________________________________________
5 - Faça um programa, consultando a tabela ASCII, de forma que
resulte após a compilação o seguinte desenho gráfico:

_________________________________________________
_______________________________________________
6 - Cite 4 variáveis básicas em C explicando seu significado e
tamanho em C.
________________________________________________________
________________________________________________________
_____________________________________________________
7 - Faça um programa utilizando 3 variáveis básicas.
________________________________________________________
________________________________________________________
41
________________________________________________________
________________________________________________________
___________________________________________________
8 - Escreva um programa que declare 3 variáveis inteiras e atribua os
valores 6, 14 e 53 a elas ; 3 variáveis caracteres e atribua a elas as
letras x, y e z ; finalmente imprima na tela:
As variáveis inteiras contém os números 6, 14 e 53.
As variáveis caracteres contém os valores x, y e z.
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
___________________________________________________
9 - Qual a forma de se representar um caracter de código acima de
127 decimal ?
_______________________________________________________
10 - O programa abaixo está correto ? Porque ?
.
main( )
{
char a[19]={“Compilar e Linkeditar”}
printf(“Em C é necessário %s”,a);
}
_______________________________________________________
________________________________________________________
_____________________________________________________

11 - Qual tipo de variável utilizamos para números com casa decimal


________________________________________________________
______________________________________________________
12 - Qual a abrangência da variável long double ?
________________________________________________________
______________________________________________________
13 - Cite 2 modificadores de tipo e explique um deles.
42
________________________________________________________
______________________________________________________
14 - O que são variáveis Globais e Locais ?
________________________________________________________
________________________________________________________
_____________________________________________________
15 - O que são constantes simbólicas ?
________________________________________________________
________________________________________________________
_____________________________________________________
16 - Assinale V (verdadeiro) ou F (falso) :

( ) Uma constante possui valor fixo e alterável.

( ) Constante-objeto é um agrupamento de constante literal com


variável.

( ) Uma variável é uma posição de memória que é usada para


guardar um valor que não pode ser modificado pelo programa.

Capítulo 4
43
Operadores

• Definição de Operadores
• Operadores de Atribuição
• Operadores Aritméticos
• Operador Unário
• Operadores de Incremento e Decremento
• Operadores Aritméticos de Atribuição
• Operador Vírgula
• Precedência dos Operadores em C
• Exercícios

Definição 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 são mais usados que outros, como por exemplo os
Operadores Aritméticos.
O que fazem os Operadores ? Trabalham sobre seus
operandos de modo precisamente definido. A linguagem C define
quatro tipos de operadores: Aritméticos, Relacionais, Lógicos e Bit a 44
bit. A linguagem C possui também alguns operadores especiais para
tarefas particulares.

Operador de Atribuição
É possível utilizar um operador de atribuição dentro de
qualquer expressão válida em C. Isso não é possível em certas
linguagens de computação, tais como: Pascal, Basic e Fortan, que
tratam os operadores de atribuição como um caso especial de
comando.
A forma geral do operador de atribuição é:

Nome da Variável = Expressão

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


mesma interpretação dada em matemática. Ou seja, o sinal “ = “ em C,
somente representará a atribuição da expressão à direita ao nome da
variável à esquerda.

Exemplo: PI = 3.1415 ;
Kilo = 1000 ;

A linguagem C aceita várias atribuições (atribuições


múltiplas) na mesma instrução; ou seja, em um único comando.

Exemplo: x = y = z = 80 ;

Em programas profissionais, valores são atribuídos à


variáveis usando esse método.

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

Operadores Aritméticos
Representam as operações aritméticas básicas como a
soma, subtração, multiplicação e divisão .

+ ..................... soma
- ..................... subtração
* ..................... multiplicação
/ ..................... divisão
% ..................... módulo de divisão (resto)

Obs: O operador módulo “ % “ não 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 );/*subtração */
printf(“\n Y x A = %.2f”, y * a );/* multiplicação */
printf(“\n X\xf6Y= %d e o resto =%d”,x/y , x%y );/* divisão*/; 46
printf(“\n ou X\xf6Y = %.1f”, b/c ); /* divisão */
}

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 análise do programa, podemos afirmar que o uso
de float e o comando de formato printf %.f deve-se ao fato de usarmos
números com ponto flutuante.
No caso de um número puramente inteiro, o uso de int
satisfaz a condição.
O sinal de “ = “ envolvido por aspas duplas significa em
C apenas um caractere a ser impresso. Utilizamos \xf6, código este em
hexa, para imprimirmos o caractere ÷ .
Nas últimas duas linhas de instrução, é possível
observarmos os dois exemplos de respostas utilizando desta vez
variáveis diferentes, mas com o mesmo valor. O fato de usarmos
variáveis diferentes refere-se ao fato de não podermos imprimir um
resultado de divisão com ponto flutuante utilizando variáveis do tipo
int .

Obs: Se o nome de uma variável for dada em letras minúsculas ou


maiúsculas,devemos respeitar o nome desta sempre na forma original .
Exemplo:
.
.
int ABC = 123; /*letras maiúsculas*/
.
.
printf(“Os números são %d”, ABC);
.
.

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

.
.
int Valor=30; /*letras maiúsculas e minúsculas*/ 47
.
.
printf(“O resultado é %d”,Valor);
.
.
O não cumprimento desta norma em C, acarretará erro ao
compilarmos o programa !

Operador Unário
Indica a troca do sinal algébrico 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 número 3,


porque: (-3) x (-1) = 3 .
Como o próprio nome diz, este tipo de operador necessita
de apenas um operando, com isso atribui a “negação aritmética”.

Operadores de Incremento e Decremento

A linguagem C dispõem de dois operadores não


encontrados em outras linguagens; são 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 variável( como no exemplo acima ). O segundo
modo é o pós-fixado em que o operador aparece após o nome da
variável.

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


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

Porém existe uma diferença quando esses operadores são


usados em uma expressão ! Quando preceder (pré-fixado) o seu
operando, C executa o incremento ou decremento antes de usar o valor
do operando. Se o operador estiver após (pós-fixado) o seu operando,
C usará o valor do operando antes de incrementá-lo ou decrementá-lo.

1ºexemplo: (pré-fixado)

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

Imprimirá:
a=7,b=7

2ºexemplo: (pós-fixado)

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

Imprimirá:
a=7,b=6
49
A análise vale também para o operador de decremento(--)

Exemplo:
main( ) /*pós-fixado*/
{
int a = 0 ;
printf(“%d é um número nulo \n”,a );
printf(“%d indica vazio \n”,a- - );
printf(“%d é um número negativo.”,a);
}

Imprimirá:

0 é um número nulo
0 indica vazio
-1 é um número negativo.

Exemplo:
main( ) /*pré-fixado*/
{
int a = 0 ;
printf(“%d é um número nulo \n”, a );
printf(“%d é um número negativo \n”,- - a);
printf(“%d é um nºdecrescente em relação ao ao zero”,a );
}

Imprimirá:
0 é um número nulo
-1 é um número negativo
-1 é um nºdecrescente em relação ao zero

Obs: Se as duas linhas abaixo são equivalentes, pergunta-se por


que não preferir uma a outra ?

x = x + 1 ; /*funciona, mas não é o ideal*/

x + + ; /* preferível */

50
A maioria dos compiladores C produzem o código-objeto
muito mais rápido e eficiente para as operações se incremento e/ou
decremento. Por essa razão, devemos usar os operadores de
incremento e decremento sempre que possível !

Precedência

Devemos atentar quanto a precedência dos operadores.


Todo compilador C tem um “calculador de expressões” próprio que
disseca as expressões do código-fonte e constrói instruções no código
compilado para calcular resultados das expressões.
O “calculador de expressões” obedece rigorosamente as
regras de ordem de precedência e avaliação.
Na ausência de parênteses, uma expressão é calculada
usando um conjunto de regras padrão.

Exemplo:
conta = a + b * h ;

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


2º passo: ...soma-se com “ a “ e atribui o resultado à variável “conta”.
Em C, multiplicação e divisão são efetuadas antes da
soma e subtração. Porém, caso desejamos, dependendo da finalidade
da expressão matemática, somar-se ou subtrair-se antes da
multiplicação ou divisão, será necessário o uso dos parênteses.
Exemplo:
conta = ( a + b ) * h ;

Alguns parênteses, embora tecnicamente desnecessários,


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

Primeiramente “a” é multiplicado por “b”, porque esta


sub-expressão está no interior dos parênteses aninhados. O resultado é
dividido por “c”, enquanto que “e” é subtraído de “d”
independentemente. Finalizando, a soma é efetuada, atribuindo-se o
resultado à variável “conta”. 51
Operadores Aritméticos de
Atribuição

São eles: += , -= , *= , /= e %=

Forma geral:

Nome da variável Op.aritmético Expressão ;


de atribuição

As expressões com estes operadores são mais compactas e


normalmente produzem um código de máquina mais eficiente.

Exemplos:

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


b- = 2 ;/* equivale a: b=b- 2 */
c *=4;/* equivale a: c=c×4*/
d/=1;/* equivale a: d=d÷1*/
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 comparações de valores relativos de
operadores inteiros ou de ponto flutuante. Os operadores relacionais
em C são:

Operador Ação

> maior que


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

A idéia de verdadeiro e falso acompanha os conceitos dos


operadores lógicos e relacionais. Em C, “verdadeiro” é qualquer valor
diferente de zero. E “falso” equivale a zero. As expressões que usam
operadores relacionais ou lógicos devolvem zero para “falso” e 1
(um) para “verdadeiro”.
Podemos criar “laços” 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”

Conclusão
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 não acusará
erro, pois como em C toda expressão tem um valor verdadeiro ou
falso, este não seria um erro de programa e sim do programador.

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

Imprimirá:

O número é igual a 100? 0


O número é igual a 50? 1
0.....................falso e 1.................verdadeiro

Obs: A análise seria inversa para o operador “!=” (diferente).

54
O Operador Vírgula
É usado para encadear várias expressões. O operador
vírgula tem o mesmo significado da expressão: “faça isso e isso”.

Exemplo:

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

Primeiramente é atribuído o valor 2 à “b”, em seguida


soma-se 2 à 1 e concluindo, é atribuído 3 à variável “a”. Pelo fato do
operador vírgula ter uma precedência menor que o operador de
atribuição (=), é necessário o uso de parênteses.

Precedência dos Operadores em C

Operadores
em ordem de
precedência:................ + + , - - maior

* , / , %

+ , -

> , >= , < , <=

= = , !=

= , += , - = , * = , / = , %=
, (vírgula) menor
55
Exercícios
1 - Quais os operadores aritméticos básicos em C ?
________________________________________________________
________________________________________________________
_____________________________________________________

2 - Rescreva a seguinte instrução usando operador de incremento.

soma = soma +1 ;

_______________________________________________________

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

a) trocar valores lógicos por variáveis ;


b) distinguir diferentes tipos de variáveis ;
c) representar operações aritméticas ou
d) comparar valores .

4 - A forma geral do operador de atribuição é:


________________________________________________________
______________________________________________________

5 - Qual a função do “calculador de expressões” em C ?


________________________________________________________
________________________________________________________
_____________________________________________________ 56
6 - Qual a forma geral do Operador Aritmético de Atribuição ?
________________________________________________________
______________________________________________________

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 - Faça um programa utilizando o Operador de Incremento pré-


fixado .
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
_________________________________________________

11 - O programa abaixo utiliza que operador ?

main ( )
{
int x=2 ;
printf (“%d é um número positivo”,x--); 57
}

a) Operador de Incremento
b) Operador Unário
c) Operador Aritmético pré-fixado
d) Operador de decremento pós-fixado

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

________________________________________________________
______________________________________________________

13 - Descreva a equivalência:

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

14 - Escreva um programa que contenha 4 variáveis e imprima sua


média aritmética. (Utilizar variáveis 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 vírgula .

________________________________________________________
________________________________________________________
_____________________________________________________

17 - Demonstre a precedência 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 execução. Demonstre-os:

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

Correções se necessárias: _____________________________


_____________________________
_____________________________
_____________________________

Imprimirá então: _____________________________________


_____________________________________
_____________________________________

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

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

60
Capítulo 5

Pré-
processador
de C

• Diretivas do pré-processador
• Tipos de diretivas
• A diretiva #include
61
• A diretiva #define
• Exercícios

Neste capítulo , 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.
É possível incluirmos diversas instruções do compilador no código-
fonte de um programa em C. O pré-processador é executado
automaticamente antes da compilação por instruções chamadas de :
Diretivas , que embora não sejam parte da linguagem de
programação C, expandem o escopo do ambiente de programação em
C, tendo a finalidade de alterar o código-fonte na sua forma de texto.

Ao digitarmos uma linha de programa, solicitamos ao


compilador codificar para instruções em linguagem de máquina para
serem executadas pelo processador. Mas o compilador solicitado
somente terá êxito se instruirmos ele com uma linguagem. Esta
linguagem ou instruções são as diretivas .

Então, podemos definir que diretivas do pré-processador


são instruções para o compilador, antes do processo de compilação ser
iniciado. E as linhas normais de um programa são instruções para o
microcomputador.

ANSI ➧ Padrão que define um conjunto completo de funções de


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

63
TIPOS: Segundo o padrão ANSI , o pré-processador de C contém
as diretivas:

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

Alguns critérios são adotados para o correto uso das


diretivas.
• Todas as diretivas começam com o símbolo escopo “ # “.
• Cada diretiva deve estar na sua própria linha.
• As diretivas, por convenção, aparecem no início do programa ( antes
de main( ) ) ou antes de uma função particular .
• Mas nada impede que sejam colocadas em qualquer parte do
programa, desde que corretamente.

A diretiva #include
Sabemos que diretivas são, 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 contém a
diretiva #include.

O nome de um arquivo-fonte, quando associado à uma


diretiva, deve estar sempre envolvido por aspas duplas ( “ “ )ou
símbolos de maior e menor ( > e < ) .

Sua forma geral é :

# include “nome do arquivo-fonte”

ou

# include <nome do arquivo-fonte>

Esta linha de instrução, vista em sua forma geral, é


chamada de “arquivo-cabeçalho” 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
diretório atual e se não for encontrado a busca é repetida como se o
nome do arquivo estiver envolvido por chaves angulares.
Os arquivo-fontes são criados pelo fabricante e variam
conforme a versão do software.
Um programador pode criar um programa de rotina
contendo, por exemplo, várias fórmulas e colocá-lo em uma diretiva.
Assim não 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 versão de um software (no caso do Turbo


C++), acompanha arquivos-fontes criados pelo fabricante com
protótipos que poderão ser usados pelo usuário/programador sempre
que o programa desejar.
Por exemplo: A função printf( ) requer um protótipo que é
encontrado através da diretiva que contém o arquivo-fonte específico.

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

< stdio.h > ➧ necessária a sua utilização quanto ao fato de obter-se a


saída de dados impressa na tela do vídeo.

< conio.h > ➧ arquivo-fonte que contém o protótipo para o uso


da
função 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” após a execução da saída de dados - delay( ).

Algumas versões trazem um número maior ou reduzido de


diretivas, ocasionando uma maior ou menor concentração de arquivos-
fonte. Ou seja, podemos encontrar o protótipo de uma função em
diretivas diferentes dependendo da versão do software.
OBS: Se ao digitarmos um programa e for detectado um ou mais
erros devido a falta de protótipos, uma mensagem irá aparecer, e
através do help, poderemos localizar em que diretiva encontra-se o
arquivo-fonte necessário para a plena compilação e execução do
programa.
Nos exemplos expostos ao longo do curso, será abordado
a explicação quanto a utilização de novos arquivos-fontes ou funções
ligadas a eles. O nome do arquivo-fonte pode ser expresso no
programa em letras maiúsculas ou minúsculas. A forma geral de uma
diretiva não inclui ponto e vírgula ( ; ). 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 maiúsculas ou minúsculas */
main ( )
{
clrscr( );
printf (“linguagem C “);
delay(1000); /*atraso*/
}

Imprimirá:

Linguagem C

No programa é utilizada a diretiva #include e três


arquivos-fonte.

<stdio.h> - utilizado para exibir a saída de dados. Este protótipo


contém uma linguagem própria que instrui o processador antes da
compilação.

<conio.h> - arquivo-fonte solicitado para a utilização da função


clrscr( ), função esta que “limpa” a tela antes ou após a apresentação
de um dado/texto ou resultado. Sua forma geral é: clrscr( ) .

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


correto funcionamento da função delay( ) , função 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 próprio nome sugere, tem a


função 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 simbólicas com nomes
apropriados.

A forma geral desta diretiva é:

# define macro string

Ao “macro” é dado um nome, que por convenção é escrito


em letras maiúsculas para maior destaque e compreensão quando da
leitura do programa.
A string consiste em um texto que é associado ao
identificador (macro). Este texto pode ser em forma de números ou
letras (neste último caso devemos envolve-los por aspas duplas).
Somente é permitido um comando por linha, e lembre-se:
nunca haverá ponto-e-vírgula após qualquer diretiva do pré-
processador de C, caso contrário resultará em uma mensagem de erro
criptográfica.
Se a string for maior que uma linha, podemos continua-la
na próxima linha, porém delimitando-a com uma barra invertida (\).
É importante entender que basicamente a diretiva #define
associa texto (string) à um símbolo (macro).

Exemplo:

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

68
Deverá haver espaços entre o identificador (macro) e a
string, para evidentemente separá-los. A clareza do código aumenta
com o uso de macros permitindo assim o uso de nomes sugestivos para
as expressões.
Um dos exemplos de programa, na qual é recomendável o
uso da diretiva #define, é a de utilizarmos uma constante várias 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 três diretivas includes no qual
possuem os protótipos para a pausa, limpar a tela, e impressão das
respostas no vídeo.
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 também possui outra forte característica: 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 substituídos 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 ocorrência CONTA, esta


será substituída printf(“%.3f\n”,X). O X na definição do macro será
substituído pelo nome do macro no programa. Ou seja, CONTA(Z)
será substituída por printf(“%.3f\n”,Z) e CONTA(Y) será substituída
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 definição (raio) pela equação 2*PI*X*X. O valor de X será o
valor contido na variável raio .

Exercícios

1- Qual a forma geral da diretiva # define ?


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

3- Defina o que são diretivas do pré-processador de C.


________________________________________________________
________________________________________________________
_____________________________________________________

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


________________________________________________________________
________________________________________________________
_______________________________________________________

5- A função printf( ) requer um protótipo que é encontrado através da


diretiva que contém o arquivo-fonte específico. No caso da diretiva
#include citamos como exemplo stdio.h , conio.h e dos.h . Explique
quando estes protótipos são utilizados.
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
__________________________________________________

6- Qual a função da diretiva # define ? Descreva sua forma geral.


________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
72
________________________________________________________
__________________________________________________

7- Cite dois exemplos de protótipos utilizados na diretiva #define e


explique-os:
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
___________________________________________________

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


( ) A diretiva #define possui uma forte característica , na qual o
nome do macro não pode ter argumentos.
( ) O pré-processador C é um programa contido no compilador
que altera o programa-fonte antes da compilação.
( ) A diretiva #define define constantes simbólicas ou macros. A
diretiva #include inclui um programa-fonte no seu programa.
( ) Macros aumentam a clareza do código, pois não permitem a
utilização de nomes sugestivos para expressões.
( ) Um dos exemplos de programa, na qual é recomendável o uso
da diretiva #define, é a de utilizarmos uma constante várias vezes no
programa.

9- O que são Strings ? Explique:


________________________________________________________
________________________________________________________
________________________________________________________
____________________________________________________

10- Faça um programa que apresente o resultado da adição e


multiplicação, baseando-se na utilização da propriedade distributiva,
ou seja, quando forem lidas as variáveis A, B, C e D , estas deverão
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 fórmula: Volume = PI x R x R x Altura.
Raio= 0,12 metros e Altura = 354 centímetros.
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
_________________________________________________

12- Elaborar um programa que contenha 6 variáveis e imprima sua


média aritmética. (Utilizar variáveis do tipo int e float).
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
_________________________________________________

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


#define e que utilize os protótipos 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);
}

________________________________________________________
________________________________________________________
_____________________________________________________

Capítulo 6
75
Operadores
de endereço

• A função scanf( )
• Operador de endereço
• Matriz String
• Operadores de E/S através do console
• As funções getch( ) e getche( )
• As funções getchar( ) e putchar( )
• As funções gets( ) e puts( )

Função scanf( )

Esta função é a rotina de entrada pelo console de uso geral,


implementada em todos compiladores C. Lê todos os tipo de dados
intrínsecos e converte números ao formato interno apropriado, similar 76
a função printf( ) no que consiste em uma expressão de controle
seguida por uma lista de argumentos. Só que a lista de argumentos de
scanf( ), devem ser endereços de variáveis !

O protótipo para scanf( ) está em stdio.h, e sua sintaxe é:

scanf (“ expressão de controle “, lista de


argumentos);

A expressão de controle contém especificadores de formato


de entrada que são 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 função scanf( ) :

%c ............. Lê um único caractere


%d ou %i ....... Lê um inteiro decimal
%e ............. Lê um nº em notação científica
%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 endereço

A Linguagem C oferece um operador chamado “Operador


de Endereço” representado pelo símbolo & (“e” comercial) que
resulta o endereço do operando. 77
Toda variável ocupa uma certa localização na memória, e
seu endereço é o do primeiro byte ocupado por ela.

Nota: Endereço é o nome que o computador usa para identificar uma


variável.

Todas as variáveis utilizadas para receber valores, através


de scanf( ), devem ser passadas pelos seus endereços.
Se referenciarmos uma variável x precedida por & (&x),
a função scanf( ) devolverá o endereço do primeiro byte onde x está
guardada.

Nota: Uma “memória” de computador é dividida em bytes que são


numerados de 0 até o limite máximo de memória.
Exemplo: 0 ............................16Mbytes (16.384 Kbytes)

limite de memória
Exemplo de Programa:
/* Programa Cálculo 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


protótipo para as funções printf( ) e scanf( ). Já o arquivo-fonte
<conio.h> possibilita a função clrscr( ) de “limpar” a tela do monitor
78
de vídeo antes da impressão de texto e dados. A função delay( ) é
instruída pelo processador C através do arquivo-fonte <dos.h> .
Devemos identificar o tipo das variáveis no início do corpo
do programa (após a função main( ) ), assim determinamos as posições
de memória com nomes para referenciar seus conteúdos.
Determinamos, no exemplo, 4 variáveis do tipo float
(dígitos de precisão) : valor_principal, juros e rentabilidade. Através
de printf( ), solicitamos ao usuário o valor principal. Este dado, a ser
inserido através do teclado pelo usuário, é associado à variável
“valor_principal”. Posteriormente é solicitado a taxa de juros e o
valor associado à variável “juros”. Repare que a variável é precedida
do símbolo “&” para determinar o endereço da variável. Pré-
finalizamos o programa com a equação rentabilidade que determinará
o valor do juro ganho com a aplicação. A impressão será com duas
casas decimais, para identificar o valor em moeda corrente. Haverá
uma pausa de 3 segundos para visualização e posterior finalização.

Matriz String
String, conforme visto no capítulo 2, é uma das formas
mais importantes de armazenagem e manipulação 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 memória e o último caractere é sempre ‘\0’ (null) que
tem valor zero (0) decimal, sendo assim a única maneira que as
funções 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 função scanf( ) é considerada “limitada” para a leitura de
strings, pois usa o “espaço em branco” para terminar a leitura na
entrada.

Assim não encontramos uma forma, em scanf( ), de


digitarmos textos com várias 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 máximo 17


caracteres pois o último é null (nulo). A função scanf( ) lê cada
caractere não branco e os armazena a partir do endereço nome .
Apenas fornece o 1º nome pois, quando encontra um caractere em
branco, termina o processo (para scanf( ), um espaço em branco é um
retorno de carro ou tabulação). 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 variável nome não está precedida por &,
pois a matriz (nome) é seu endereço inicial. Se utilizássemos o
operador de endereço &, não teríamos um limite de caracteres na
variável, que no exemplo é 17 + null.

Operadores de E/S através do controle

A Linguagem C nos permite enfoque nas operações de E/S


(entrada e saída) que são efetuadas pelas funções da biblioteca,
envolvendo diversas funções diferentes. Em C, existe E/S pelo
console e através de arquivo. Veremos neste capítulo, em detalhes,
funções de E/S pelo console definidas pelo padrão ANSI C, ou seja,
funções que realizam a entrada de dados pelo teclado e a saída de
dados, ou resposta, pelo monitor de vídeo.

Em algumas situações, a função scanf( ), não se adapta


perfeitamente a finalidade ou desempenho de um programa. Por
exemplo: É necessário pressionarmos enter depois da sua entrada para
que scanf( ) termine a leitura. A biblioteca de C permite a opção de
funções que leêm um caractere no instante em que é digitado, sem
esperar enter .
80
O sistema de E/S pelo console é um flexível mecanismo
para transferir dados entre dispositivos. Vejamos algumas funções
que nos permite averiguar a funcionabilidade deste evento.

As funções getch( ) e getche( )


O protótipo para essas funções são encontrados em conio.h
A função getch( ) lê o caractere do teclado, mas não permite que seja
impresso, espera até que uma tecla seja pressionada e então retorna
imediatamente. Não aceita argumentos e devolve o caractere para a
função 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: São utilizadas as diretivas conforme a


necessidades do programa. Note que desta vez, não utilizamos a
diretiva dos.h pois não estamos desejando uma “pausa” no final, no
caso a função delay( ). Através de char identificamos o tipo da
variável chamada “caractere”, no caso uma letra, número ou símbolo.
Será impresso na tela uma solicitação para que digite-se qualquer
caractere. Este caractere é lido pela função getch( ) e impresso pela
linha de instrução seguinte, através de printf( ).

O programa então aguardará que o usuário pressione


qualquer tecla, e quando o fizer será lido por outra função getch( )
retornando imediatamente a listagem de programação.
A função getche( ) tem a princípio o mesmo
funcionamento da função dita anteriormente, exceto quanto a 81
impressão ! Ela permite que o caractere, ora digitado, seja impresso
simultaneamente na tela. Esta observação 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” através de printf( ).

As funções getchar( ) e putchar( )


O protótipo para essas funções está contido em stdio.h. A
função getchar( ) lê um caractere do teclado e só termina a leitura
deste, ou seja, só devolverá o valor após pressionarmos enter. Permite
que o caractere digitado seja impresso simultaneamente. A função
putchar( ) devolve o caractere escrito imprimindo-o na tela do monitor
de vídeo a partir da posição atual do cursor. Também está definido no
arquivo stdio.h. A função 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 contém os


protótipos pasa as funções printf( ), getchar( ) e putchar( ). Os
protótipos para as funções clrscr( ) e getch( ) estão em conio.h . O
programa sugere um caractere que será lido por getchar( ) e impresso
simultaneamente; logo após, putchar( ) possibilita a impressão do
82
sucessor do caractere anteriomente digitado. A função getch( )
aguarda uma tecla ser pressionada para finalizar o programa.

As funções gets( ) e puts( )


As funções gets( ) e puts( ) permitem a leitura e escrita de
strings de caracteres no console. O protótipo das funções é
encontrado em stdio.h .
A função gets( ) lê uma string de caracteres através do
dispositivo padrão de entrada (teclado). Para corrigirmos erro de
digitação usamos a tecla Back Space antes de pressionar <enter>.
Após a leitura, coloca a string no endereço apontado por seu
argumento ponteiro de caracteres. Espaços e tabulações são 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 aniversário você
completou %d dias de vida !”,nome,idade*365);
getch( );
}

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


contém os protótipos para as funções printf( ) , gets( ) e scanf( ). Os
protótipos para as funções clrscr( ) e getch( ) estão em conio.h .
83
Através de printf( ) pergunta-se o nome ao Usuário que
será digitado e associado à variável chamada “nome” do tipo char que
possibilita um número máximo de 50 caracteres, e também a
visualização no vídeo. Em seguida, através de scanf( ) é inserido um
novo dado à uma variável do tipo int chamada idade. Se por exemplo
a variável nome for: João da Cruz e a variável idade for 21, teremos na
tela impresso o seguinte resultado:
Olá João da Cruz, em seu último aniversário você completou 7665 dias
de vida!

A função puts( ) é utilizada quando deseja-se um código


altamente otimizado, de fácil uso ! Esta função é o complemento de
gets( ) e imprime na tela uma única string por vez seguido por uma
nova linha. Reconhece os códigos 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á através de um texto o
nome do usuário, 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 função puts( ) imprime somente uma string. Para a impressão


de um número maior de strings é necessário o uso de printf( ).

Podemos utilizar o operador de endereço 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 número de
caracteres iniciais que não deverão ser impressos.

Exercícios
1 – Defina Operador de Endereço:
________________________________________________________
________________________________________________________
_____________________________________________________
85
2 – Qual a sintaxe da função scanf( ) ?
________________________________________________________
______________________________________________________

3 – Por que uma string é finalizada pelo caractere null ?


________________________________________________________
______________________________________________________

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


sua utilização.
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
___________________________________________________

5 – Por que a função 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 diferença entre getch( ) e getche( ).


________________________________________________________
86
________________________________________________________
________________________________________________________
____________________________________________________

8 – Para ler uma string de caracteres qual função deve ser utilizada:
getchar( ) ou gets( ) ? Explique:
________________________________________________________
________________________________________________________
________________________________________________________
____________________________________________________

9 – Se for digitada a palavra FUNÇÃO, o que será visualizado na tela


após a execução do programa ?

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

10-No exercício anterior, se utilizássemos gets( ), quais as


modificações necessárias para o correto funcionamento? O que seria
impresso ?

________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
_________________________________________________
87
11-Elabore um programa que calcule a quantidade de combustível
gastos em uma viagem. O programa deve solicitar ao usuário os
seguintes dados: Qual distância(em Km)o veículo faz por litro de
combustível, tempo (em horas) gasto na viagem e a velocidade média
(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.
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
_______________________________________________

Capítulo 7

88
Decisões e
Seleção
múltipla

• O comando if
• Bloco de comando com if
• O comando if-else
• O comando if-else-if
• O operador alternativo “ ? “
• Operadores lógicos
• O comando switch

Comandos de Seleção

Em C, os comandos de seleção direcionam o fluxo de um


programa utilizando expressões relacionais que controlam quais
comandos serão executados com base em uma ou em outra condição.
Muitos comandos em C contam com um teste condicional que
determina o curso da ação. Uma condição, poderá ser falsa ou 89
verdadeira; ou seja, diferente de zero ou zero. Esse método, para
verdadeiro e falso, permite que rotinas sejam codificadas com
eficiência.
Um comando de decisão executa uma série de instruções,
se for necessário repete a seqüência até que uma certa condição seja
encontrada e decide entre ações alternativas.

O comando if
Utilizamos esse comando quando deseja-se tomar uma
decisão simples. Se a expressão é verdadeira (diferente de 0), o
comando ou bloco que forma o “corpo “ do if é executado uma única
vez. Se a expressão for falsa, o programa não executa a instrução
iniciada por if .

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

Neste exemplo, ao executar o programa, é solicitado um


número. A função scanf( ) possibilita a entrada através do teclado, de
um número que será atribuído à variável x . O comando if efetuará a
seqüência de condições 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 número digitado satisfaz a condição, então será


impresso: O número é menor que uma centena ! uma única vez, caso
contrário não imprimirá nada e aguardará pressionarmos uma tecla
para finalizar o programa ( através de getch( ) ).

Sintaxe :

if ( expressão de controle )
comando ;

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


ou nada ( comandos vazios ).

Bloco de comando if
Em C, é possível a utilização de “ ifs aninhados “,que
formam um comando composto, também chamado “bloco de
comando”. Neste caso, um comando if é o objeto de outro if .

Sintaxe:

if (expressão de controle) {
if (expressão 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 2ºnúmero é menor que 10\n”);
puts(“O 1º número é menor que o 2ºnúmero”);
}
getch( );
}

Funcionamento: O programa possibilita, através de scanf( ), a leitura


de dois valores digitados no teclado, que por sua vez são atribuídos às
variáveis ( 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º número é menor que 10” somente será
impresso se b for menor que 10.
A mensagem “O 1º número é menor que o 2ºnúmero” será
obrigatoriamente impressa se a for menor que b. Caso a expressão
contida no primeiro if do programa não for verdadeira, o bloco de
comando if não será executado, passando p/a próxima instrução que
no exemplo é getch( ) que aguardará uma tecla para terminar o
programa.

O comando if-else
Vimos que o comando if executa uma única instrução ou
um bloco de comando quando é verdadeira ( 1 ) a expressão. Porém,
nada fará se esta for falsa ( 0 ).
Quando associamos if ao comando else, haverá a execução
de uma ou mais instruções compreendidas entre chaves, se a expressão
de teste relacionada ao comando if for falsa ( 0 ) .
Ou seja, quando o comando if estiver acompanhado de uma
“cláusula” else, esta selecionará um comando alternativo a ser
executado.

Sintaxe:
if (expressão de controle)
comando 1;
else
comando 2;
92
Se a expressão de controle for verdadeira, o programa
executará comando 1; do contrário executará comando 2. Ambos os
comandos terminam com ponto-e-vírgula, 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 1ºnúmero é menor que o último número digitado”);
else
printf(“A média aritmética dos nrs digitados é:%.1f”,e);
getch( );
}

Funcionamento: Inicialmente, o programa sugere 4 valores que


serão digitados pelo usuário em forma ordenada e atribuídas através de
scanf( ) as variáveis a,b,c e d. Note que utilizamos apenas uma função
scanf( ) tornando , com isso, o programa mais portável. Se os
comandos de formato printf forem diferentes (ex:%d %f %c) devem
ser separados por espaço. A média aritmética é calculada para uma
posterior chamada, se necessário. Em seguida o programa decidirá o
que fazer tomando como base as condições descritas nele.
Se (if) a 1ºvariável (a) for menor que a última (d) o
programa imprimirá uma mensagem afirmando o evento e aguardará
em seguida o encerramento do programa; caso contrário (else) será
impresso somente a média aritmética das variáveis aguardando em
seguida o término do programa através de getch( ).

O comando if-else-if
Também chamada de “escada if-else-if” ou “árvore de
decisão” devido a sua aparência na listagem do programa, faz com que
as condições sejam avaliadas de cima para baixo. Encontrada a
93
condição verdadeira, o comando associado a ela é executado fazendo
com que o restante da escada seja contornado.
Esta coleção de comandos if com cláusulas else pode
conter um else final para garantir no mínimo que um comando seja
relacionado.

Sintaxe:
if (condição 1 )
comando 1;
else if (condição 2)
comando 2;
else if (condição 3)
comando 3;
.
.
else comando n ;

Um comando if inicia a seleção múltipla executando o


comando 1 se a condição 1 for verdadeira. Se a condição 2 for
verdadeira, o comando 2 é executado e assim por diante para tantas
condições e comandos necessários.
Obs: Apenas um dos comandos será selecionado.

Se nenhuma das condições for verdadeira, um else final


será executado, assegurando total controle sobre as ações do programa
para todas as possíveis condições.

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ê não digitou uma letra válida !”);
puts(“Pressione uma tecla p/finalizar“);
getch( );
}

Funcionamento:
O programa sugere a escolha de uma letra que, através de
scanf( ) associará à variável x. Apenas uma das condições será
verdadeira; e se for será impresso, portanto, o incremento deste
caractere (a,b ou c) passando, posteriormente, para as instruções que
solicita uma tecla para finalizar o programa . Se nenhuma das
condições for verdadeira, através 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
instrução if-else simples.
Também chamado de “Operador ternário” ( o único em C),
o ? requer três operandos.
Sintaxe:

Expressão 1 ? Expressão 2 : Expressão 3 ;

A Expressão 1 é avaliada, se for verdadeira (≠0), a


Expressão 2 se torna o valor da expressão ? inteira. Mas se a
Expressão 1 for falsa (0), a Expressão 3 que se tornará o valor da
expressão 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 número é maior que cem e sua
raiz quadrada é:%.2f”,sqrt(x)): printf(“O número é
menor que cem e seu quadrado é:%d”,x*x);
getch( );
}

Funcionamento: O programa sugere que seja digitado um número


inteiro positivo, que será atribuído à uma variável x do tipo int . A
expressão 1 (y = x > 100) é avaliada, se for verdadeira (número
digitado maior que cem) será impresso o texto e resultado da
expressão 2. Se a condição for falsa (número digitado menor que
cem) então será impresso o texto e resultado da expressão 3.

Uma outra diretiva foi utilizada com o protótipo <math.h> que


possui diversas definições usadas pela biblioteca de matemática. A
função sqrt( ) devolve a raiz quadrada de um número positivo. Sua
sintaxe é: sqrt( x ); onde x é o número que se quer extrair a raiz
quadrada.

Operadores lógicos
Os operadores lógicos explanam as maneiras que as
relações podem ser conectadas. Os operadores relacionais (visto no
capítulo 4), freqüentemente, trabalham juntos com esses operadores.
Como sabemos, verdadeiro é qualquer valor diferente de zero,
enquanto que falso é zero. Assim como o operador relacional, o
operador lógico devolve 0 para falso e 1 para verdadeiro.
É possível formar expressões relacionais complexas
utilizando os operadores lógicos. 96
Operadores lógicos:
operador ação
&& AND
|| OR
! NOT

Quando for utilizado um mesmo operador mais de uma vez


em uma expressão, serão avaliados pelo compilador da esquerda para
a direita. O uso de parênteses tornam o comando mais claro quando
deseja-se alterar a ordem de avaliação.
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 expressão relacional, a lógica produz como
resultado o zero (falso) ou 1 (verdadeiro).

Precedência dos maior ! - (unário) ++ - -


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

Exemplo 1:
.
.
if ((a>=10) && (a<=100))
comando ;
.
.
No exemplo acima deseja-se executar um comando se a
variável 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, tão somente, as condições
forem verdadeiras.

Exemplo 2 :
.
.
if ((a<10) || (a>100))
comando ;
.
.
No exemplo 2, se qualquer uma das condições for
verdadeira, ou se ambas forem verdadeiras, o comando será
executado; do contrário é ignorado.
Lê-se: Se a for menor que 10 ou maior que 100 .......

Obs: Se observarmos a precedência dos operadores, podemos


escrever o exemplo anterior da seguinte forma:
.
.
if (a<10 || a>100)
comando;
.
.
Porém o efeito é o mesmo, mas para torná-lo mais claro é
conveniente utilizarmos parênteses extras.

O operador NOT ( ! ) é utilizado para inverter a lógica de


uma condição (verdadeira ou falsa).
Exemplo:
.
if (!(x>10))
comando ;
.
Lê-se: Se x não for maior que 10 ...............

Então o comando será executado somente se x for menor


que 10 . É permitido a combinação de várias condições em uma
expressão.

Exemplo:

40>10&&!(40<7)||6>=4
98
Neste caso, a condição é verdadeira .

O comando switch
Esse comando é freqüentemente utilizado para processar
uma entrada de dados pelo console.
Algumas “árvores de decisão” 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
expressão com uma lista de constantes. Se o valor coincide, os
comandos associados àquela constante são executados.

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

O comando switch usa um ou mais rótulos case, cada um


especificando uma constante diferente a ser comparada com a
expressão entre parênteses que deve ser de valor inteiro ou caractere.
Quando um determinado caso for verdadeiro, a seqüência
de comandos associada a este será executada até que o comando break
ou fim do comando switch seja alcançado. Se nenhum caso for
verdadeiro o comando default é executado. O default é opcional e, se
não estiver presente, nenhuma ação será realizada se todos os testes
falharem. Pode haver uma ou mais instruções (não precisam estar
99
entre chaves) seguindo cada case. Os rótulos dos casos devem ser
todos diferentes. O comando break causa uma saída imediata do
switch, porém se não existir, o programa segue executando todas as
instruções dos casos posteriores.
Devemos envolver por chaves o corpo de switch . Cada
rótulo case termina com dois-pontos e não pode existir sozinho, ou
seja, fora de switch .
Exemplo:

#include <stdio.h>
#include <conio.h>
main( )
{
clrscr( );
char x ;
puts(“Selecione a opção:\n a -Soma\n b -Subtração\n c -
Multiplicação\nd-Divisão”);
x=getch( );
switch (x) {
case ‘a’ :
puts(“Você selecionou Soma”);
break ;
case ‘b’ :
puts(“Você selecionou Subtração”);
break ;
case ‘c’ :
puts(“Você selecionou Multiplicação”);
break ;
case ‘d’ :
puts(“Você selecionou Divisão”);
break ;
default :
puts(“Você escolheu uma opção inválida.”);
}
getch( );
}

No exemplo, temos um programa que descreve a opção


escolhida, a partir da seleção de um caractere no teclado. Caso o
caracter escolhido não 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 expressão 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 opção:\n + -Soma\n - -Subtração\n * ou x
-Multiplicação\n / -Divisão”);
x=getch( );
switch (x) {
case ‘+’ :
puts(“Você selecionou Soma”);
break ;
case ‘-’ :
puts(“Você selecionou Subtração”);
break ;
case ‘*’ :
case ‘x’ :
puts(“Você selecionou Multiplicação”);
break ;
case ‘/’ :
puts(“Você selecionou Divisão”);
break ;
default :
puts(“Você escolheu uma opção inválida.”);
}
getch( );
}

Exercícios

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 função sqrt( ) e em que protótipo está definida ?


________________________________________________________
______________________________________________________

5- Quais são os operadores lógicos em C ? Descreva sua ação


(significado) e a tabela verdade.
________________________________________________________
______________________________________________________

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

6- As expressões abaixo são verdadeiras ? (falso ou verdadeiro)


Se preferir utilize parênteses, para tornar o código 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 ternário 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- Faça um programa, utilizando if-else-if que simule uma


calculadora capaz de executar contas simples
(número,operador,número) utilizando os operadores
soma,subtração,multiplicação e divisão.
________________________________________________________
______________________________________________________

________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
___________________________________________________

11- Faça o mesmo programa, mas utilize o comando switch.


________________________________________________________
________________________________________________________
________________________________________________________ 103
________________________________________________________
________________________________________________________
__________________________________________________

12- Faça 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 número, letra maiúscula, letra minúscula, um espaço,
ou nenhum dos tipos mencionados.
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
__________________________________________________

14- Faça um programa que leia 3 valores numéricos 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 média escolar seja igual ou maior que 7. Se
a média for menor que 7, solicitar a nota de exame, somar com a
média anterior e obter nova média. Se a nova média for maior ou 104
igual a 5, apresentar uma mensagem dizendo que o aluno foi
aprovado em exame. Se o aluno não obter, após o exame, média
satisfatória apresentar uma mensagem dizendo que está retido.
Apresentar junto com as mensagens o valor da média do aluno para
qualquer condição.
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
__________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
__________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
________________________________________________________
__________________________________________________

105