Você está na página 1de 97

Linguagem C

Prefcio

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

Prof Call
10

Captulo 1 Introduo

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

Origem
Foi inventada e implementada inicialmente pr Dennis M. Ritchie e Ken Thompson em um DEC PDP-11 utilizando o sistema operacional UNIX, em 1972. Linguagem C com padro formado pelo ANSI

BCPL

Desenvolveu a Linguagem C (dcada de 70) Linguagem antiga, mas ainda em uso na Europa. Originou a Linguagem B. ANSI : Padro que define um conjunto completo de funes de E/S que pode ser utilizado para ler e escrever qualquer tipo de dado.

Linguagem de Mdio Nvel


Para computadores, uma linguagem de nvel mdio. No significa que menos poderosa ou menos desenvolvida. Linguagem C combina elementos de linguagem de alto nvel com funcionalidade de linguagem Assembly. Permite a manipulao de bits, bytes e endereos. Bit: Sinnimo de dgito binrio; 0 ou 1. Byte: Caractere de 8 bits Endereo: Nele esto contidas as memrias do computador. Linguagem C tem velocidade de Linguagem de Mquina muito utilizada em editores, compiladores, gerenciadores de banco de dados, etc...

12

Nvel mais alto: Ada , Modula-2 , Pascal , Cobol , Fortran , Basic. Mdio Nvel: C , Forth , Macro-assembler.

Nvel mais baixo: Assembler.

Um cdigo em C muito portvel !

OBS: Portabilidade significa que possvel adaptar um software escrito para um tipo de computador a outro. Exemplo: Programa para um Apple Mac Intosh
Compilador

Programa p/ um IBM-PC

Palavras-Chaves: A Linguagem C possui apenas 32 palavras-chaves. Se formos comparar, a linguagem Basic (p/ IBM-PC) contm 159 palavras-chaves !

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

Linguagem no estruturada: Fortran, Basic, Cobol. Linguagem estruturada: Pascal, C ,Modula-2, Ada.
13

Obs: O termo Linguagem estruturada em blocos no rigorosamente aplicvel em C. Linguagem C simplesmente referida como Linguagem Estruturada. Linguagens estruturadas tendem a ser modernas, pois os programadores a consideram mais fceis.

Funo = Sub-rotina isolada Permite definir e codificar separadamente as tarefas de um programa. Aps ter sido criada (a funo), permite ser utilizada em vrias situaes, sem criar efeitos inesperados em outras partes do programa. Outro meio de estruturar o cdigo em C criando-se um bloco de cdigo. Este bloco escrito no programa entre chaves: { } Isto faz com que o programador conceitue a verdadeira natureza da rotina. A linguagem C prope ao usurio planejar programas estruturados e modulares. O resultado um programa mais legvel e documentado.

Linguagem para Programadores


Nem todas linguagens de computadores so para programadores !!! Por exemplo: Linguagem Basic foi criada para os usurios que no precisam, necessariamente, ser programadores e assim resolverem problemas relativamente simples em seus computadores. A linguagem C foi criada, influnciada e testada por programadores profissionais. Ela proporciona:
14

Poucas restries e reclamaes; Funes isoladas; Estruturas de bloco; Conjunto compacto de palavras-chaves.

possvel tornar um cdigo escrito, compil-lo e rod-lo em outra mquina com pouca ou nenhuma modificao. Esta portabilidade economiza tempo e dinheiro !

Interpretadores e Compiladores
Os termos, interpretadores e compiladores referem-se a maneira como um programa executado. Exemplo: Basic - normalmente interpretada C - compilada Interpretadores e compiladores so simplesmente programas sofisticados que operam sobre o cdigo-fonte do seu programa. Interpretador: L o cdigo-fonte de seu programa uma linha por vez, para depois finalizar (RUN). Compiladores: L o programa inteiro de uma s vez e o converte em um cdigo-objeto, com isso o programa executado diretamente. Palavras-Chaves de C:
auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while
15

O compilador, se no houver erros, gera um programa em disco com o sufixo .Obj com as instrues j traduzidas. Este programa no pode ser executado at que seje criado um produto final em disco com o sufixo .Exe , produto este feito por um programa chamado Linkeditor . Com isso a velocidade de execuo do programa pode ser de 20 vezes mais rpida do que quando o programa interpretado. Mais vantagens: Se o programa j foi compilado e linkeditado, no ser mais necessria a presena do compilador. Programas .Exe no podem ser alterados, com isso o cdigo fonte estar protegido. Obs: Linkeditor: Une funes compiladas separadamente em um programa. Combina as funes da Biblioteca C padro com o cdigo escrito pelo programador. A sada do linkeditor um programa executvel. Tempo de compilao: Refere-se ao tempo durante o qual o compilador l os arquivos-fonte e gera o cdigo-objeto. Um erro em tempo de compilao um erro de sintaxe descoberto durante a compilao. So regras a serem seguidas ao digitar comandos. Para Sintaxe: evitar um erro no programa, indispensvel a ateno quanto sintaxe de C. O compilador avisar ao usurio, no caso de um erro. Tempo de execuo: Tempo durante o qual um programa roda .

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

16

Modelo de programa C
Em muitos compiladores acrescidas diversas palavraschaves para explorar melhor os processadores 8088/8086. As mais comuns so: asm _ss interrupt _cs cdecl near _ds far pascal _es huge

Todas palavras-chaves em C so minsculas, else uma palavra-chave, mas ELSE no ! A palavra-chave no pode ser utilizada como uma varivel ou nome de uma funo. A nica funo que sempre deve estar presente : main ( ) a primeira funo a ser chamada quando a execuo do programa comea, embora no seja tecnicamente parte da linguagem C. A funo main( ) no utilizada como varivel.

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

Alguns compiladores C tem seu prprio linkeditor, enquanto outros usam o linkeditor padro fornecido pelo sistema operacional.

Compilao Separada
Para programas longos, permitido que um programa esteja contido em vrios arquivos e que cada arquivo seje compilado separadamente. Com isso podemos mudar o cdigo de um arquivo, sem recompilar o programa todo.

Compilando um Programa em C
Para compilarmos um programa em C, devemos: Criar o programa ; Compilar o programa ; Linkeditar o programa com funes necessrias da biblioteca. Para alguns compiladores necessrio usar um editor separado para criar o programa. Os compiladores s aceitam arquivos de texto padro para o editor.

Mapa de memria de C

Pilha

Heap > 4 regies da memria Variveis Globais Cdigo do Programa

Obs: Acima temos um mapa conceitual.


18

Pilha: Guarda o estado atual da CPU. Heap: Memria livre, a disposio do programa C. Variveis Globais: So criadas e acessadas independentemente. Cdigo do Programa: O compilador gera o cdigo. Cdigo-fonte: o programa que pode ser lido; a entrada para o compilador C. Cdigo-objeto: Traduz o cdigo-fonte em linguagem de mquina; a entrada para o linkeditor.

19

Captulo 2 Elementos Bsicos de C

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

A funo main ( )
Um programa em C constitudo de: Ttulo: main ( ) , parte principal de qualquer programa C. Corpo do Programa: iniciado por uma chave { , e terminado por outra chave } . Uma funo, que necessariamente estar presente denominada de main ( ), que a primeira funo a ser chamada quando o programa executado. main ( )  Contm um esboo do que o programa faz; inicia a execuo do programa. main ( ) primeira funo a ser executada { inicia o corpo da funo } termina a funo Os parnteses ( ) aps o nome indicam que esta uma funo. Toda funo deve ser iniciada por uma chave de abertura e encerrada por uma chave de fechamento. Devemos nos preocupar com o layout do programa, pois se um programa for bem organizado, conseqentemente ser mais simples de se ler e entender.

Nome da funo { instruo; instruo; { instruo; } instruo; }


21

Quando aberta uma chave {, deslocamos o cdigo de programa direita desta, e quando fechamos uma chave }, deslocamos para a esquerda. Obs: Letra minscula para formao escrita de variveis, funes e comandos. Letra maiscula para constantes.

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

/* */

Exemplo correto: /* Primeiro programa em C */ main ( ) { printf (Programando em C ); }

Exemplo incorreto: swi/*isso no funciona*/tch

ou /*este progr./*no funciona*/

22

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

/* Exemplo de comentrio em vrias linhas */ Muitos programadores inserem um grande comentrio descritivo ao incio dos cdigos. Isto tambm ocorre quando desenvolvido programas em partes separadas por pessoas distintas e depois unidos num produto final.

A funo printf ( )

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

23

A sintaxe para a funo printf ( ) :

printf ( expresso de controle , lista de argumentos) A expresso de controle pode conter caracteres que sero, por sua vez, demonstrados na tela do computador e comandos de formato ( cdigos de formatao ) que indicam a forma em que os argumentos devem ser impressos. A funo printf( ) pode ter um nico ou vrios argumentos. Obs: Os argumentos so separados por vrgula ( , ). Exemplo: /* primeiro exemplo */ main( ) { printf(O resultado do jogo foi %d x 0,2); } Na primeira linha do programa temos um comentrio sugerindo um ttulo ou nome do programa. Todo comentrio fica a critrio do programador, sendo assim no obrigatrio o uso deste. A funo main( ) a seguir inicia a parte executvel. A chave de abertura utilizada para que o compilador possa ler as instrues. Em seguida a funo printf( ) passa a ter o controle. O texto a ser impresso est compreendido entre aspas duplas e o cdigo de formatao %d indica que ser impresso um nmero decimal. Este nmero decimal o 2 que se encontra na lista de argumentos. A linha de instruo finalizada por um ponto-vrgula ; fato este fundamental para concluir uma linha de instruo. A chave de fechamento encerra o corpo do programa e o texto impresso no monitor de vdeo ser: O resultado do jogo foi 2 x 0

Cdigos de caracteres de Escape

24

A tabela abaixo demonstra os cdigos de C para caracteres que no podem ser inseridos diretamente atravs do teclado. A funo printf( ) aceita todos eles. Os caracteres de escape comeam com uma barra invertida \ seguida por uma letra que seleciona um cdigo de controle. Cdigo de escape \a \b \n \t \f \v \r \o \N \xN \ \\ \? \ Significado alarme ou alerta (beep) retrocesso, retorna o cursor de uma coluna. nova linha, muda de linha tabulao horizontal no vdeo ou impressora. limpa a tela do vdeo ou passa para a prxima pgina da impressora. tabulao vertical no vdeo ou na impressora. retorno do cursor, fica na primeira posio da linha. nulo, fim de uma string. valor octal , imprime na base octal ( onde N uma constante octal ). valor hexadecimal, imprime na base hexadecimal(onde N uma cte.hexa) aspas ( ). barra invertida ( \ ). ponto de interrogao. apstrofo ( ).

Obs: Como a barra invertida \ tem uso especial na linguagem C, devemos associar duas barras invertidas \\ para representar uma.

Exemplo:
25

. main ( ) { printf (\n\tisto um teste.); } O programa acima pula uma linha (\n), posiciona o cursor na prxima coluna de tabulao (\t) e escreve no monitor de vdeo como segue abaixo.
1 coluna 2 linha

> Isto um teste

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

Comandos de formato printf.


26

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

Cdigos printf( )

Formato

%c ............................. caractere %d ou %i ................... ................... inteiros decimais com sinal. %u ............................. inteiros decimais sem sinal. %o ............................. octal . %x ou %X .................. hexadecimal . %e ou %E .................. notao cientfica . %f ou %F................... %F................... ponto flutuante decimal. %g ............................. usa %e ou %f, o que for mais curto. %G ............................ usa %E ou %F o que for mais curto. %s .............................. strings de caractere. %% ............................ escreve o smbolo % ............................ (porcentagem). %ld ............................ decimal longo. %lf ............................. ponto flutuante longo (DOUBLE). Um comando de formato comea com um smbolo percentual (%), e seguido pelo cdigo de formato. A ordem da combinao sempre ser da esquerda para a direita. Exemplo: . .
printf(Estamos %s\na linguagem %c.,aprendendo,C);

. . Ser impresso no vdeo o seguinte texto:

Estamos aprendendo a linguagem C.

A funo printf imprimir inicialmente a palavra Estamos; logo aps receber a instruo que dever ser impresso

27

uma string de caractere. Nesta string ser localizado o conjunto de caracteres envolvidos por aspas duplas aps o trmino do texto a ser impresso. Um cdigo de escape \n comanda o cursor para a prxima linha, quando ento ser impresso a continuao da sentena a linguagem precedida de um caractere C identificado por um outro comando de formato (%c). Lembre-se: Os argumentos, no caso aprendendo e C so separados por vrgula. Ponto flutuante decimal: Quando deseja-se imprimir um nmero com casas decimais , utilizamos o comando de formato %f. Exemplo: Desejamos imprimir apenas com 3 casas decimais o nmero 87,3466798. Ento digitamos: printf (O nmero %.3f, 87.3466798); A sada ser: 87.347

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

Exerccios
28

1- Comente resumidamente a origem da Linguagem C. ________________________________________________________ ________________________________________________________ _____________________________________________________ 2 - O que vem a ser Interpretadores e Compiladores ? ________________________________________________________ ________________________________________________________ ________________________________________________________ ____________________________________________________ 3 - Cite 4 caracteres de escape e seus significados. ________________________________________________________ ________________________________________________________ _____________________________________________________ 4 - Para que servem os comentrios ? ________________________________________________________ ______________________________________________________ 5 - Porque os programadores costumam utilizar comentrios ? ________________________________________________________ ______________________________________________________ 6 - O que uma funo ? ________________________________________________________ ______________________________________________________ 7 - O que faz um Linkeditor ? ________________________________________________________ ________________________________________________________ _____________________________________________________ _______________________________________________________

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

29

9 - O que string e quais os tipos ? ________________________________________________________ ________________________________________________________ _____________________________________________________ 10 - Qual a sintaxe da funo printf ( ) ? ________________________________________________________ ______________________________________________________ 11 - Explique a funo main ( ) : ________________________________________________________ ______________________________________________________ 12 - Esboce o Mapa conceitual da memria C :

13 - O que faz a Biblioteca C ? ________________________________________________________ ________________________________________________________ _____________________________________________________ 14 - Cite 4 comandos de formato printf e explique sua forma de formatao: ________________________________________________________ ________________________________________________________ ________________________________________________________ ____________________________________________________

15 - O que falta para a linha do programa abaixo ser executada com sucesso ? .
printf(A linguagem %c de %s m%cdio,C,nive, )

30

. ________________________________________________________ ________________________________________________________ _____________________________________________________ 16 - Faa um programa que imprima seus dados pessoais, como o nome, RG, idade, endereo, utilizando todas as funes e comandos vistos at este captulo. ________________________________________________________ ________________________________________________________ ________________________________________________________ ________________________________________________________ ________________________________________________________ __________________________________________________ 17 - Analise o programa abaixo e descreva, em ordem, o que ser impresso no vdeo:
. main ( ) /*programa teste*/ { printf(O nmero %.2f o %s\n de um %clculo do produto\t\%d x 15,6789\\n\?,376.2936,resultado,C,24);

________________________________________________________ ________________________________________________________ ________________________________________________________ ____________________________________________________ 18 - Elabore um programa que imprima o n10 em octal e o n538 em hexadecimal: ________________________________________________________ ________________________________________________________ ________________________________________________________ ____________________________________________________

31

Captulo 3 Iniciao de Variveis

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

32

Constantes
Constantes referem-se a valores fixos que o programa no pode alterar. A maneira como cada constante representada depende do seu tipo. Ou seja: Constantes inteiras so descritas como nmeros sem componentes fracionrios. Exemplo: 20 e -150 Constantes em ponto flutuante requerem o ponto decimal seguida pela parte fracionria do nmero. Exemplo: 3.141592 Obs: Em C utilizamos o ponto antes da parte fracionria. proibido, neste caso, o uso da vrgula ! Constantes de caractere so envolvidas por aspas simples . Exemplo: 'a' e '+' Uma constante cadeia de caracteres envolvida pos aspas duplas Exemplo: "linguagem C" Dependendo de como deseja-se o resultado atravs do dado obtido, teremos duas formas de digitar o mesmo programa. Exemplo: . . main( ) { printf("O resultado obtido e:%d.",5); }  No exemplo acima a constante 5,ser impressa no formato decimal. Ou ......
33

. . main( ) { printf("O resultado obtido 5"); } Imprimir tambm, alm do texto o nmero 5. Embora o 2exemplo mais simples, no devemos dispensar o intuito do 1 exemplo, pois se nos defrontarmos com um programa que exija atravs da entrada de dados(teclado) um certo dado necessrio que este seja encontrado pelo comando de formato para que seja possvel a sua impresso.

Tipos de Constantes
Existem trs tipos de constantes em C: literais, simblicas e objeto. Uma constante literal um valor digitado diretamente em um comando ou expresso de um programa. Exemplo : pi=3.1415; MAX=0xff; /*hexadecimal*/ distancia=4.3E+09; ch='h'; Constantes simblicas so aquelas, que atravs de diretivas, fazem com que o compilador signifique/traduza algo. Exemplo: # define PI 3.14159

Uma diretiva #define tem trs partes: a palavra-chave #define, um nome e um valor. Sendo assim, se considerarmos o exemplo de diretiva acima, o programa poder utilizar PI em vrios locais do programa.
34

Exemplo:

int i, j ; i= PI; j= PI*3;

 A diretiva #define no define um objeto. Ela define um nome simblico para um valor literal. Quando o compilador encontra um nome simblico tal como PI, ele substitui esse smbolo por 3.14159 exatamente como se fosse digitado o nmero diretamente. Obs: Diretivas, sero tpicos de assunto que sero vistos em captulos posteriores. A constante-objeto, tambm conhecida por constantes tipificadas, um agrupamento de constante literal com varivel. Ou seja, assim como as variveis, elas ocupam espao de memria, mas, da mesma forma que as constantes, seus valores no podem ser modificados.

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

Veremos, ento, na tela do monitor de vdeo: conta = 200 resposta = 200 Obs: int - varivel a ser vista posteriormente.

Variveis

35

As Variveis so o aspecto fundamental de qualquer linguagem de computador. Uma varivel uma posio de memria, com um nome para referenciar o seu contedo, que usada para guardar um valor que pode ser modificado pelo programa. A forma geral para declarar uma varivel :
Nome de um tipo de varivel nome da varivel ;

Em C, o nome de uma varivel no tem nenhuma relao com seu tipo.

Tipos de Variveis
Tipo Tamanho Bit / Bytes 1 1 1 2 2 2 4 4 4 8 10 escala/abrangncia

char 8 unsigned char 8 signed char 8 int 16 unsigned int 16 signed int 16 long 32 unsigned long int 32 float 32 double 64 long double 80

-128 a 127 0 a 255 -128 a 127 -32768 a 32767 0 a 65535 o mesmo que int -2147483648 a 2147483647 0 a 4294967295 3,4E-38 a 3,4E+38 1,7E-308 a 1,7E+308 3,4E-4932 a 3,4E+4932

Podemos observar na tabela acima, que na linguagem C existem 4 tipos de variveis bsicas: char , int , float e double .

36

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

Significado das Variveis Bsicas


Vejamos ento o siginificado das Variveis bsicas: char - uma palavra-chave (ou varivel) que indica caracteres ASCII . int - Valores inteiros na faixa de -32768 32767 . float - Dgitos de preciso (c/casas decimais) na faixa de 3,4E-38 3,4E+38 . double - Dgitos de preciso na faixa de 1,7E-308 1,7E+308 .

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

O programa possui trs variveis: int , char e float. E a elas dado um nome. Obs: Observe que a cada trmino da instruo usamos ponto-vrgula

37

Posteriormente associamos a varivel um valor, seja em nmeros ou caracteres. A varivel int aceita apenas nmeros inteiros, no exemplo a ela foi associado o n 5. A varivel float acatar nmeros com ponto flutuante (c/casa decimal). J a varivel tipo char armazenar caracteres ASCII. Se for nico caractere, este dever ser envolvido em aspas simples. Mas no caso de uma cadeia de caractere (mais de um caractere) este dever ser identificado atravs de uma matriz e estar contido entre chaves e aspas duplas (exemplo posterior). Por fim aps nomearmos as variveis e a elas associarmos valores, a execuo do programa resultar em: A fabricao de 5 terminais de vdeo na empresa B gasta apenas 13.46 minutos de hora. O nmero 5 impresso pelo comando de formato %d pois trata-se de nmero decimal; um nico caractere B expresso por %c e o tempo identificado com apenas 2 casas decimais e arredondado. Exemplo de programa: . . main( ) { int x=30; char y[12]={900 pessoas}; char z=Z; printf(No dia %d haviam %s\n,x,y); printf(no teatro para assistir a pea %c.,z); } Observe neste exemplo que possvel em uma linha de instruo associarmos ao mesmo tempo o nome e o valor varivel. A varivel char y ter como atribuio uma cadeia de caracteres que sero impressos atravs do comando de formato %c.

Porque a matriz [12] ? Utilizando a palavra-chave char podemos declarar uma string (cadeia de caracteres) que so, em C, terminadas em nulo. Isto quer dizer que terminam com um byte zero, tambm chamado de caractere nulo. A linguagem C acrescenta esse byte

38

automaticamente s strings literais, mas a responsabilidade sempre existir ao programador para garantir que as strings estejam corretamente terminados. Exemplo: char string[12]={Linguagem C}; O conjunto entre aspas duplas contm 11 caracteres (strings literais ). Sendo assim, ao declararmos o array=12 (array significa tabela, leque) estamos garantindo o byte zero (caractere nulo). Nada impede de declararmos arrays maiores, o importante garantirmos pelo menos um caractere adicional, chamado de caractere nulo ao array. Podemos concluir ento, que a utilizao de array em C significa a criao de matrizes. O resultado do programa ser: No dia 30 haviam 900 pessoas no teatro para assistir a pea Z. Nota: ASCII A tabela ASCII tem 256 cdigos. Dispe de nmeros de 0 a 127(decimal) cobrindo letras, dgitos de 0 a 9, caracteres de pontuao e caracteres de controle como salto de linha, tabulao, etc... Os computadores IBM usam 128 caracteres adicionais com cdigos de 128 a 255 que consistem em smbolos de lnguas estrangeiras e caracteres grficos. No fim da apostila temos a tabela ASCII !!! A forma de representar um caractere de cdigo acima de 127 decimal : \xdd

... onde dd representa o cdigo de caractere em notao hexadecimal; e pode ser usado na expresso de controle de printf( ) como qualquer outro caractere. O exemplo a seguir mostra a possibilidade de imprimirmos caracteres grficos, utilizando a tabela ASCII.
39

. . main( ) { printf(\xe1 \xe8 \xfo \xf6 \xe3 ); } Resultado:

Variveis Globais e Locais


Quando uma varivel for utilizada pelo programa, devese defini-las, para isto basta indicar seu tipo e nome. Exemplo: int a, b; double despesas; main( ) { int d, e; . . } As variveis a, b e despesas so variveis globais pois so vlidas para todo o programa em virtude de terem sido declaradas fora da funo main( ). As variveis d e e so consideradas locais a funo main( ), pois foram declaradas dentro da mesma.

Exerccios
1 - O que uma Constante Literal ? Cite um exemplo: ________________________________________________________ ________________________________________________________ _____________________________________________________
40

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

_________________________________________________ _______________________________________________ 6 - Cite 4 variveis bsicas em C explicando seu significado e tamanho em C. ________________________________________________________ ________________________________________________________ _____________________________________________________ 7 - Faa um programa utilizando 3 variveis bsicas. ________________________________________________________ ________________________________________________________

41

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

_______________________________________________________ ________________________________________________________ _____________________________________________________

11 - Qual tipo de varivel utilizamos para nmeros com casa decimal ________________________________________________________ ______________________________________________________ 12 - Qual a abrangncia da varivel long double ? ________________________________________________________ ______________________________________________________ 13 - Cite 2 modificadores de tipo e explique um deles.
42

________________________________________________________ ______________________________________________________ 14 - O que so variveis Globais e Locais ? ________________________________________________________ ________________________________________________________ _____________________________________________________ 15 - O que so constantes simblicas ? ________________________________________________________ ________________________________________________________ _____________________________________________________ 16 - Assinale V (verdadeiro) ou F (falso) : ( ) Uma constante possui valor fixo e altervel. ( ) Constante-objeto um agrupamento de constante literal com varivel. ( ) Uma varivel uma posio de memria que usada para guardar um valor que no pode ser modificado pelo programa.

Captulo 4
43

Operadores

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

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

44

bit. A linguagem C possui tambm alguns operadores especiais para tarefas particulares.

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

Nome da Varivel = Expresso

Devemos memorizar que, o sinal de igual( = ) no tem a mesma interpretao dada em matemtica. Ou seja, o sinal = em C, somente representar a atribuio da expresso direita ao nome da varivel esquerda. Exemplo: PI = 3.1415 ; Kilo = 1000 ;

A linguagem C aceita vrias atribuies (atribuies mltiplas) na mesma instruo; ou seja, em um nico comando. Exemplo: x = y = z = 80 ;

Em programas profissionais, valores so atribudos variveis usando esse mtodo. Exemplo de programa:
45

. main( ) { int x ; x = y = 30 ; printf(O resultado foi %d,y); }

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

+ * / %

..................... soma ..................... subtrao ..................... multiplicao ..................... diviso ..................... mdulo de diviso (resto)

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

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

46

printf(\n ou X\xf6Y = %.1f, b/c ); /* diviso */

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

Exemplo: . . int ABC = 123; /*letras maisculas*/ . . printf(Os nmeros so %d, ABC); . . .................ou . . int Valor=30; /*letras maisculas e minsculas*/

47

. . printf(O resultado %d,Valor); . . O no cumprimento desta norma em C, acarretar erro ao compilarmos o programa !

Operador Unrio
Indica a troca do sinal algbrico do valor, ou seja um operador que multiplica o seu operando por -1 . Exemplo: resultado_A= -3 ; resultado_B= - resultado_A ;

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

Operadores de Incremento e Decremento


A linguagem C dispem de dois operadores no encontrados em outras linguagens; so eles:

Operador de incremento...... + + ......adiciona 1 ao seu operando Operador de decremento..... - - ......subtrai 1 ao seu operando
Este um dos fatores, em que podemos em C, comprimir comandos de programa. Em outras palavras:

Exemplo:

x=x+1; .... o mesmo que ++x;

x=x-1; .... o mesmo que --x;

48

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

Exemplo:

x=x+1; .... o mesmo que x++;

x=x-1; .... o mesmo que x--;

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

1exemplo: (pr-fixado) a=6; b=++a; printf ( a = %d, b = %d , a , b ); Imprimir: a=7,b=7 2exemplo: (ps-fixado) a=6; b=a++; printf( a = %d , b = %d , a , b ); Imprimir: a=7,b=6
49

A anlise vale tambm para o operador de decremento(--)

Exemplo: main( ) /*ps-fixado*/ { int a = 0 ; printf(%d um nmero nulo \n,a ); printf(%d indica vazio \n,a- - ); printf(%d um nmero negativo.,a); } Imprimir: 0 um nmero nulo 0 indica vazio -1 um nmero negativo. Exemplo: main( ) /*pr-fixado*/ { int a = 0 ; printf(%d um nmero nulo \n, a ); printf(%d um nmero negativo \n,- - a); printf(%d um ndecrescente em relao ao ao zero,a ); } Imprimir: 0 um nmero nulo -1 um nmero negativo -1 um ndecrescente em relao ao zero Obs: Se as duas linhas abaixo so equivalentes, pergunta-se por que no preferir uma a outra ? x = x + 1 ; /*funciona, mas no o ideal*/ x + + ; /* prefervel */
50

A maioria dos compiladores C produzem o cdigo-objeto muito mais rpido e eficiente para as operaes se incremento e/ou decremento. Por essa razo, devemos usar os operadores de incremento e decremento sempre que possvel ! Precedncia Devemos atentar quanto a precedncia dos operadores. Todo compilador C tem um calculador de expresses prprio que disseca as expresses do cdigo-fonte e constri instrues no cdigo compilado para calcular resultados das expresses. O calculador de expresses obedece rigorosamente as regras de ordem de precedncia e avaliao. Na ausncia de parnteses, uma expresso calculada usando um conjunto de regras padro.

Exemplo: conta = a + b * h ; 1 passo: calcula-se b * h e em seguida.... 2 passo: ...soma-se com a e atribui o resultado varivel conta. Em C, multiplicao e diviso so efetuadas antes da soma e subtrao. Porm, caso desejamos, dependendo da finalidade da expresso matemtica, somar-se ou subtrair-se antes da multiplicao ou diviso, ser necessrio o uso dos parnteses. Exemplo: conta = ( a + b ) * h ; Alguns parnteses, embora tecnicamente desnecessrios, tornam as intenes do programador perfeitamente claras. Exemplo: conta = ( ( a * b ) / c ) + ( d - e ) ; Primeiramente a multiplicado por b, porque esta sub-expresso est no interior dos parnteses aninhados. O resultado dividido por c, enquanto que e subtrado de d independentemente. Finalizando, a soma efetuada, atribuindo-se o resultado varivel conta.

51

Operadores Atribuio

Aritmticos

de

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

Forma geral:

Nome da varivel

Op.aritmtico de atribuio

Expresso ;

As expresses com estes operadores so mais compactas e normalmente produzem um cdigo de mquina mais eficiente. Exemplos: a+=3 ; /* equivale a: a=a+3 */ b- = 2 ;/* equivale a: b=b- 2 */ c *=4;/* equivale a: c=c4*/ d/=1;/* equivale a: d=d1*/ e%=5;/* equivale a: e=e%5*/ Exemplo de programa: . main( ); { int a=2; int b=3; printf(valor = %d\n,a); a+=b;/*equivale a: a=2+3*/ printf(valor = %d\n,a); a+=b;/*equivale a: a=5+3*/ printf(valor = %d\n,a);

52

} Imprimir: valor = 2 valor = 5 valor = 8

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

Operador > >= < <= == !=

Ao maior que maior ou igual que menor que menor ou igual que igualdade diferente

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

Exemplo de diagrama:

se a>2

53

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

Concluso do programa

O operador relacional de igualdade (= =) representado por dois sinais de igual. Um erro comum o ato de usar um nico sinal de igual como operador. Neste caso o compilador no acusar erro, pois como em C toda expresso tem um valor verdadeiro ou falso, este no seria um erro de programa e sim do programador. Exemplo: . main( ); { int a=10; printf(\nO nmero igual a 100 ? %d,a==100); a=50; printf(\nO nmero igual a 50 ?%d,a==50); printf(\n0...................falso e 1...........verdadeiro); } Imprimir: O nmero igual a 100? 0 O nmero igual a 50? 1 0.....................falso e 1.................verdadeiro Obs: A anlise seria inversa para o operador != (diferente).
54

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

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

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

Precedncia dos Operadores em C


Operadores em ordem de precedncia:................ + + , - * , / , % + , > , >= , < , <= = = , != = , += , - = , * = , / = , %=

maior

, (vrgula)

menor
55

Exerccios
1 - Quais os operadores aritmticos bsicos em C ? ________________________________________________________ ________________________________________________________ _____________________________________________________ 2 - Rescreva a seguinte instruo usando operador de incremento. soma = soma +1 ; _______________________________________________________ 3 - Os operadores relacionais so usados para: ( assinale o correto ) a) trocar valores lgicos por variveis ; b) distinguir diferentes tipos de variveis ; c) representar operaes aritmticas ou d) comparar valores . 4 - A forma geral do operador de atribuio : ________________________________________________________ ______________________________________________________ 5 - Qual a funo do calculador de expresses em C ? ________________________________________________________ ________________________________________________________ _____________________________________________________

56

6 - Qual a forma geral do Operador Aritmtico de Atribuio ? ________________________________________________________ ______________________________________________________ 7 - O que entende-se por verdadeiro e falso em C ? ________________________________________________________ ________________________________________________________ _____________________________________________________ 8 - Qual ser o valor de y ? x=5; y = x ==5; ________________________________________________________ ______________________________________________________ 9 - Como funcionam os Operadores de Incremento e Decremento ? ________________________________________________________ ________________________________________________________ ________________________________________________________ ____________________________________________________ 10 - Faa um programa utilizando o Operador de Incremento prfixado . ________________________________________________________ ________________________________________________________ ________________________________________________________ ________________________________________________________ ________________________________________________________ ________________________________________________________ _________________________________________________ 11 - O programa abaixo utiliza que operador ? main ( ) { int x=2 ; printf (%d um nmero positivo,x--);

57

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

12 - O sinal de igual = em C, significa: ________________________________________________________ ______________________________________________________ 13 - Descreva a equivalncia: j /= 2 ____________________ x += y ____________________ h %=10 ____________________ c*3.1415 ___________________ M - =12 ____________________ 14 - Escreva um programa que contenha 4 variveis e imprima sua mdia aritmtica. (Utilizar variveis do tipo int e float). ________________________________________________________ ________________________________________________________ ________________________________________________________ ________________________________________________________ ________________________________________________________ ________________________________________________________ _________________________________________________ 15 - Analise e descreva o que o programa imprime: main ( ) { float x , y, A ; x = 3.5 ; y = 6.5;

58

printf ( valor1 = %.2f \n, x+y); x*=y ; printf ( valor2 = %.3f \n,x); y - =x ; printf ( valor3 = %.2f \n,y); A=x+y; printf ( valor 4 igual a 6,3 ? %.d,A==6.3); printf (\n 0..........falso e 1........verdadeiro); } Imprimir: ________________________________________________________ ________________________________________________________ ________________________________________________________ ________________________________________________________ ___________________________________________________ 16 - Cite o motivo de usarmos o operador vrgula . ________________________________________________________ ________________________________________________________ _____________________________________________________ 17 - Demonstre a precedncia dos operadores em C . ________________________________________________________ ________________________________________________________ ________________________________________________________ ________________________________________________________ ________________________________________________________ __________________________________________________ 18 - Qual o resultado impresso ? main ( ); { int a , b ; float c ; a = ((20*1*3) + 4) + (16/2); b = (6/2+4) - 3*1.5; c = a/b ; printf ( O resultado %.2f, c+=3);

59

} ________________________________________________________ ________________________________________________________ ________________________________________________________ ____________________________________________________ 19 - O programa abaixo possui erros de execuo. Demonstre-os: main ( ); int a = b = 20 , printf (%d equivale a %d,a,b); printf (Com incremento fica %d, ++a) printf (*pr-fixado*); } Correes se necessrias: _____________________________ _____________________________ _____________________________ _____________________________ Imprimir ento: _____________________________________ _____________________________________ _____________________________________

20 - O que representa x+++y ? Porque ? a) x++ + y b) x + ++y c) x + y d) x - y

60

Captulo 5
Prprocessador de C

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

61

A diretiva #define Exerccios

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

62

Diretivas do pr-processador

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

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

Ento, podemos definir que diretivas do pr-processador so instrues para o compilador, antes do processo de compilao ser iniciado. E as linhas normais de um programa so instrues para o microcomputador.

ANSI Padro que define um conjunto completo de funes de E/S que pode ser utilizado para ler e escrever qualquer tipo de dado.
63

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

# include # define # if # ifdef # ifndef # undef # else # endif # elif # line # error # pragma
Alguns critrios so adotados para o correto uso das diretivas. Todas as diretivas comeam com o smbolo escopo # . Cada diretiva deve estar na sua prpria linha. As diretivas, por conveno, aparecem no incio do programa ( antes de main( ) ) ou antes de uma funo particular . Mas nada impede que sejam colocadas em qualquer parte do programa, desde que corretamente.

A diretiva #include
Sabemos que diretivas minilinguagens embutidas em C. so, de certo modo,
64

A diretiva #include instrui o compilador a ler outro programa, chamado de arquivo-fonte, adicionado quele que contm a diretiva #include.

O nome de um arquivo-fonte, quando associado uma diretiva, deve estar sempre envolvido por aspas duplas ( )ou smbolos de maior e menor ( > e < ) . Sua forma geral : # include nome do arquivo-fonte ou # include <nome do arquivo-fonte> Esta linha de instruo, vista em sua forma geral, chamada de arquivo-cabealho e compilada para as rotinas de arquivos em disco da biblioteca. Ou seja, o arquivo ser localizado de forma definida pelo fabricante do compilador ( caso em que o nome do arquivo-fonte esteje envolvido por chaves angulares ). Se o nome do arquivo-fonte estiver entre aspas, a busca do arquivo ser no diretrio atual e se no for encontrado a busca repetida como se o nome do arquivo estiver envolvido por chaves angulares. Os arquivo-fontes so criados pelo fabricante e variam conforme a verso do software. Um programador pode criar um programa de rotina contendo, por exemplo, vrias frmulas e coloc-lo em uma diretiva. Assim no haver a necessidade de reescrever este programa para utiliz-lo em outro programa. Exemplo: /* prog.1 */ main( ) { . . / * prog.2 * / #include <prog.1> main( ) { .

65

} }

Geralmente, uma verso de um software (no caso do Turbo C++), acompanha arquivos-fontes criados pelo fabricante com prottipos que podero ser usados pelo usurio/programador sempre que o programa desejar. Por exemplo: A funo printf( ) requer um prottipo que encontrado atravs da diretiva que contm o arquivo-fonte especfico. * Exemplos de arquivos-fonte contidos na diretiva # include . < stdio.h > necessria a sua utilizao quanto ao fato de obter-se a sada de dados impressa na tela do vdeo. < conio.h > arquivo-fonte que contm o prottipo para o uso da funo clrscr ( )- utilizado para limpar a tela , da funo getche( )- utilizado para entrada de dados via teclado. < dos.h > pausa da utilizamos este arquivo-fonte para obter a tela aps a execuo da sada de dados - delay( ). Algumas verses trazem um nmero maior ou reduzido de diretivas, ocasionando uma maior ou menor concentrao de arquivosfonte. Ou seja, podemos encontrar o prottipo de uma funo em diretivas diferentes dependendo da verso do software. OBS: Se ao digitarmos um programa e for detectado um ou mais erros devido a falta de prottipos, uma mensagem ir aparecer, e atravs do help, poderemos localizar em que diretiva encontra-se o arquivo-fonte necessrio para a plena compilao e execuo do programa. Nos exemplos expostos ao longo do curso, ser abordado a explicao quanto a utilizao de novos arquivos-fontes ou funes ligadas a eles. O nome do arquivo-fonte pode ser expresso no programa em letras maisculas ou minsculas. A forma geral de uma diretiva no inclui ponto e vrgula ( ; ).

66

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

Imprimir: Linguagem C No programa utilizada a diretiva #include e trs arquivos-fonte. <stdio.h> - utilizado para exibir a sada de dados. Este prottipo contm uma linguagem prpria que instrui o processador antes da compilao. <conio.h> - arquivo-fonte solicitado para a utilizao da funo clrscr( ), funo esta que limpa a tela antes ou aps a apresentao de um dado/texto ou resultado. Sua forma geral : clrscr( ) . < dos.h > - arquivo-fonte que instrui o processador quanto ao correto funcionamento da funo delay( ) , funo esta utilizada para obter um retardo ou pausa antes de concluir o programa propriamente dito. Sua forma geral : delay (<tempo>) ; onde: tempo digitado em milisegundos. Exemplo: delay (1000); O tempo de retardo resultar em 1 segundo.

67

A diretiva #define
Esta diretiva, como seu prprio nome sugere, tem a funo de definir um identificador (macro) e uma string que o substituir toda vez que for encontrado no arquivo-fonte. A diretiva #define, neste caso, definir constantes simblicas com nomes apropriados. A forma geral desta diretiva : # define macro string

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

68

Dever haver espaos entre o identificador (macro) e a string, para evidentemente separ-los. A clareza do cdigo aumenta com o uso de macros permitindo assim o uso de nomes sugestivos para as expresses. Um dos exemplos de programa, na qual recomendvel o uso da diretiva #define, a de utilizarmos uma constante vrias vezes no programa. Ou seja, podemos definir um valor a uma constante, no qual em cada vez que a solicitarmos, poderemos escrev-la apenas citando seu identificador. Exemplo: # include <stdio.h> # include <conio.h> # include <dos.h> # define PI 3.14159 main( ) { float L=30; /*podemos resumir em uma s linha: */ float R=18;/* float L=30,R=18; */ clrscr( ); printf (A rea : %.3f, PI*R*R); printf (\nO volume : %.3f, PI*R*R*L); delay(3000); } Imprimir: A rea :1017.875 O volume :30536.255 O programa acima utiliza trs diretivas includes no qual possuem os prottipos para a pausa, limpar a tela, e impresso das respostas no vdeo. A diretiva #define associa o identificador PI a uma string 3.14159, assim sempre que o identificador for mencionado o programa o substitui pela string. Esta diretiva tambm possui outra forte caracterstica: O nome do macro pode ter argumentos. Isto significa que toda vez que o nome do macro encontrado, os argumentos a ele associados podem

ser substitudos pelos argumentos reais encontrados no programa.

69

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

Imprimir:

35.100 110.214

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

Outro exemplo: # include <stdio.h>


70

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

Imprimir: A rea da esfera 56.55

Quando o programa encontrar o macro rea, substituir sua definio (raio) pela equao 2*PI*X*X. O valor de X ser o valor contido na varivel raio .

Exerccios
1- Qual a forma geral da diretiva # define ? ________________________________________________________ ______________________________________________________
71

2- Cite, segundo o padro ANSI, algumas diretivas contidas em C. ________________________________________________________ ______________________________________________________ 3- Defina o que so diretivas do pr-processador de C. ________________________________________________________ ________________________________________________________ _____________________________________________________ 4- Cite 3 exemplos de arquivos-fontes contidos na diretiva #include.
________________________________________________________________ ________________________________________________________

_______________________________________________________ 5- A funo printf( ) requer um prottipo que encontrado atravs da diretiva que contm o arquivo-fonte especfico. No caso da diretiva #include citamos como exemplo stdio.h , conio.h e dos.h . Explique quando estes prottipos so utilizados. ________________________________________________________ ________________________________________________________ ________________________________________________________ ________________________________________________________ ________________________________________________________ __________________________________________________

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

________________________________________________________ __________________________________________________ 7- Cite dois exemplos de prottipos utilizados na diretiva #define e explique-os: ________________________________________________________ ________________________________________________________ ________________________________________________________ ________________________________________________________ ___________________________________________________ 8- Assinale Verdadeiro ( V ) ou Falso ( F ) . ( ) A diretiva #define possui uma forte caracterstica , na qual o nome do macro no pode ter argumentos. ( ) O pr-processador C um programa contido no compilador que altera o programa-fonte antes da compilao. ( ) A diretiva #define define constantes simblicas ou macros. A diretiva #include inclui um programa-fonte no seu programa. ( ) Macros aumentam a clareza do cdigo, pois no permitem a utilizao de nomes sugestivos para expresses. ( ) Um dos exemplos de programa, na qual recomendvel o uso da diretiva #define, a de utilizarmos uma constante vrias vezes no programa. 9- O que so Strings ? Explique: ________________________________________________________ ________________________________________________________ ________________________________________________________ ____________________________________________________

10- Faa um programa que apresente o resultado da adio e multiplicao, baseando-se na utilizao da propriedade distributiva, ou seja, quando forem lidas as variveis A, B, C e D , estas devero ser somadas e multiplicadas A com B, A com C e A com D; B com C e B com D; e finalmente C com D.
73

________________________________________________________ ________________________________________________________ ________________________________________________________ ________________________________________________________ ________________________________________________________ ________________________________________________________ ________________________________________________________ ________________________________________________ 11- Calcular e apresentar o valor do volume de uma lata ,utilizando a diretiva #define. Sendo a frmula: Volume = PI x R x R x Altura. Raio= 0,12 metros e Altura = 354 centmetros. ________________________________________________________ ________________________________________________________ ________________________________________________________ ________________________________________________________ ________________________________________________________ ________________________________________________________ _________________________________________________ 12- Elaborar um programa que contenha 6 variveis e imprima sua mdia aritmtica. (Utilizar variveis do tipo int e float). ________________________________________________________ ________________________________________________________ ________________________________________________________ ________________________________________________________ ________________________________________________________ ________________________________________________________ _________________________________________________

13- Elaborar um programa que contenha as diretivas #include e #define e que utilize os prottipos stdio.h, conio.h, dos.h. ________________________________________________________ ________________________________________________________ ________________________________________________________

74

________________________________________________________ ________________________________________________________ ________________________________________________________ ________________________________________________________ ________________________________________________________ _______________________________________________ 14- O programa abaixo funciona ? Porque ? # include <stdio.h> #define RESULTADO(X) printf(%.2f\n,Y) main( ) { float A=40.3; float B; B=A * 3.14; resultado(A); resultado(B); } ________________________________________________________ ________________________________________________________ _____________________________________________________

Captulo 6
75

Operadores de endereo

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

Funo scanf( )

Esta funo a rotina de entrada pelo console de uso geral, implementada em todos compiladores C. L todos os tipo de dados intrnsecos e converte nmeros ao formato interno apropriado, similar

76

a funo printf( ) no que consiste em uma expresso de controle seguida por uma lista de argumentos. S que a lista de argumentos de scanf( ), devem ser endereos de variveis ! O prottipo para scanf( ) est em stdio.h, e sua sintaxe : scanf ( expresso de controle , lista de argumentos);

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

Especificadores de formato da funo scanf( ) :

%c ............. %d ou %i ....... %e ............. %f ou %g ....... %l ............. %lf ............ %o ............. %p ............. %s ............. %u ............. %x ............. % ..............

L um nico caractere L um inteiro decimal L um n em notao cientfica L um n em ponto flutuante L um inteiro longo L um double L um inteiro octal L um ponteiro L uma string(cadeia de caracteres) L um decimal sem sinal L um hexadecimal Busca por uma cadeia de caractes

Operador de endereo
A Linguagem C oferece um operador chamado Operador de Endereo representado pelo smbolo & (e comercial) que resulta o endereo do operando.

77

Toda varivel ocupa uma certa localizao na memria, e seu endereo o do primeiro byte ocupado por ela. Nota: Endereo o nome que o computador usa para identificar uma varivel. Todas as variveis utilizadas para receber valores, atravs de scanf( ), devem ser passadas pelos seus endereos. Se referenciarmos uma varivel x precedida por & (&x), a funo scanf( ) devolver o endereo do primeiro byte onde x est guardada. Nota: Uma memria de computador dividida em bytes que so numerados de 0 at o limite mximo de memria. Exemplo: 0 ............................16Mbytes (16.384 Kbytes) limite de memria
Exemplo de Programa:
/* Programa Clculo de Rentabilidade */ # include <stdio.h> # include <conio.h> # include <dos.h> main( ) { float valor_principal, juros, rentabilidade; clrscr( ); printf (Digite o valor principal:); scanf (%f,&valor_principal); printf (Digite a taxa de juros (%):); scanf (%f,&juros); rentabilidade = valor_principal * (juros/100); printf(A rentabilidade foi de r$%.2f,rentabilidade); delay (3000); }

Funcionamento do Programa: O arquivo-fonte <stdio.h> da diretiva #include, possui o prottipo para as funes printf( ) e scanf( ). J o arquivo-fonte <conio.h> possibilita a funo clrscr( ) de limpar a tela do monitor
78

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

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

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

Operadores de E/S atravs do controle


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

Em algumas situaes, a funo scanf( ), no se adapta perfeitamente a finalidade ou desempenho de um programa. Por exemplo: necessrio pressionarmos enter depois da sua entrada para que scanf( ) termine a leitura. A biblioteca de C permite a opo de funes que lem um caractere no instante em que digitado, sem esperar enter .
80

O sistema de E/S pelo console um flexvel mecanismo para transferir dados entre dispositivos. Vejamos algumas funes que nos permite averiguar a funcionabilidade deste evento.

As funes getch( ) e getche( )


O prottipo para essas funes so encontrados em conio.h A funo getch( ) l o caractere do teclado, mas no permite que seja impresso, espera at que uma tecla seja pressionada e ento retorna imediatamente. No aceita argumentos e devolve o caractere para a funo que a chamou. Exemplo de programa:
/* Programa Exemplo_1 */ # include <stdio.h> # include <conio.h> main( ) { char caractere; clrscr( ); printf (Digite um caractere : ); caractere = getch( ); printf(\nO caractere pressionado :%c.,caractere); getch( ); }

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

O programa ento aguardar que o usurio pressione qualquer tecla, e quando o fizer ser lido por outra funo getch( ) retornando imediatamente a listagem de programao. A funo getche( ) tem a princpio o mesmo funcionamento da funo dita anteriormente, exceto quanto a

81

impresso ! Ela permite que o caractere, ora digitado, seja impresso simultaneamente na tela. Esta observao pode ser melhor visualizada se substituirmos na linha 9 do programa anterior,getche( ) por getch( ) . Assim.... caractere = getche ( ); Quando for digitado algum caractere, este ser impresso e reimpresso atravs de printf( ).

As funes getchar( ) e putchar( )


O prottipo para essas funes est contido em stdio.h. A funo getchar( ) l um caractere do teclado e s termina a leitura deste, ou seja, s devolver o valor aps pressionarmos enter. Permite que o caractere digitado seja impresso simultaneamente. A funo putchar( ) devolve o caractere escrito imprimindo-o na tela do monitor de vdeo a partir da posio atual do cursor. Tambm est definido no arquivo stdio.h. A funo putchar( ) o complemento de getchar( ). Exemplo de programa:
/* Programa Exemplo_2 */ # include <stdio.h> # include <conio.h> main( ) { char caractere; clrscr( ); printf (Digite um caractere e veja seu sucessor:); caractere = getchar ( ); putchar (caractere + 1 ); getch( ); }

O programa utiliza a diretiva stdio.h que contm os prottipos pasa as funes printf( ), getchar( ) e putchar( ). Os prottipos para as funes clrscr( ) e getch( ) esto em conio.h . O programa sugere um caractere que ser lido por getchar( ) e impresso simultaneamente; logo aps, putchar( ) possibilita a impresso do
Funcionamento:
82

sucessor do caractere anteriomente digitado. A funo getch( ) aguarda uma tecla ser pressionada para finalizar o programa.

As funes gets( ) e puts( )


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

Exemplo de programa:

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

No exemplo, o programa utiliza a diretiva stdio.h pois contm os prottipos para as funes printf( ) , gets( ) e scanf( ). Os prottipos para as funes clrscr( ) e getch( ) esto em conio.h .
83

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

A funo puts( ) utilizada quando deseja-se um cdigo altamente otimizado, de fcil uso ! Esta funo o complemento de gets( ) e imprime na tela uma nica string por vez seguido por uma nova linha. Reconhece os cdigos de escape de printf( ) assim como o null (\0) como fim de string. Uma chamada a puts( ) requer menos tempo do que a mesma chamada a printf( ) pelo fato de puts( ) escrever apenas strings caractere. Exemplo de programa:
/* Programa Exemplo_2 */ #include <stdio.h> #include <conio.h> main( ) { char nome [50]; clrscr( ); puts (Qual o seu nome ?); gets (nome); puts; puts (Ol); puts (nome); puts (tudo bem ?); getch( ); }

O exemplo de programa, solicitar atravs de um texto o nome do usurio, que por sua vez ser lido por gets( ). Se, por exemplo, o nome digitado for RONALDO o programa imprime:
Qual o seu nome ? RONALDO
84

Ol RONALDO tudo bem ?

Comparando printf( ) com puts( ) : Exemplo: ... o mesmo que:


printf(%s\n,nome); puts(nome);

Obs: A funo puts( ) imprime somente uma string. Para a impresso de um nmero maior de strings necessrio o uso de printf( ). Podemos utilizar o operador de endereo em puts( ). Se acrescentarmos ao programa Exemplo_2 as linhas:
puts(Seu apelido ); puts(&nome[2]); puts(?);

....ser visualizado:
Qual o seu nome? RONALDO Ol RONALDO Tudo bem? Seu apelido NALDO ?

O operador nos possibilita a determinar o nmero de caracteres iniciais que no devero ser impressos.

Exerccios
1 Defina Operador de Endereo: ________________________________________________________ ________________________________________________________ _____________________________________________________
85

2 Qual a sintaxe da funo scanf( ) ? ________________________________________________________ ______________________________________________________ 3 Por que uma string finalizada pelo caractere null ? ________________________________________________________ ______________________________________________________ 4 D 5 exemplos de especificadores de formato scanf( ) e explique a sua utilizao. ________________________________________________________ ________________________________________________________ ________________________________________________________ ________________________________________________________ ___________________________________________________ 5 Por que a funo scanf( ) considerada limitada para a leitura de strings ? ________________________________________________________ ______________________________________________________ 6 O programa funciona corretamente? Por que ?
#include <stdio.h> #include <conio.h> main( ) { char PALAVRA [50]; clrscr( ); puts(Escreva uma palavra:); scanf(%c,PALAVRA); puts(PALAVRA); getch( ); }

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

86

________________________________________________________ ____________________________________________________ 8 Para ler uma string de caracteres qual funo deve ser utilizada: getchar( ) ou gets( ) ? Explique: ________________________________________________________ ________________________________________________________ ________________________________________________________ ____________________________________________________ 9 Se for digitada a palavra FUNO, o que ser visualizado na tela aps a execuo do programa ?
#include <stdio.h> #include <conio.h> main( ) { char palavra; clrscr( ); puts(Digite uma palavra:); palavra = getchar( ); putchar(palavra); getch( ); }

________________________________________________________ ________________________________________________________ ________________________________________________________ ____________________________________________________ 10-No exerccio anterior, se utilizssemos gets( ), quais as modificaes necessrias para o correto funcionamento? O que seria impresso ?

________________________________________________________ ________________________________________________________ ________________________________________________________ ________________________________________________________ ________________________________________________________ ________________________________________________________ _________________________________________________


87

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

Captulo 7
88

Decises e Seleo mltipla

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

Comandos de Seleo
Em C, os comandos de seleo direcionam o fluxo de um programa utilizando expresses relacionais que controlam quais comandos sero executados com base em uma ou em outra condio. Muitos comandos em C contam com um teste condicional que determina o curso da ao. Uma condio, poder ser falsa ou

89

verdadeira; ou seja, diferente de zero ou zero. Esse mtodo, para verdadeiro e falso, permite que rotinas sejam codificadas com eficincia. Um comando de deciso executa uma srie de instrues, se for necessrio repete a seqncia at que uma certa condio seja encontrada e decide entre aes alternativas.

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

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

Neste exemplo, ao executar o programa, solicitado um nmero. A funo scanf( ) possibilita a entrada atravs do teclado, de um nmero que ser atribudo varivel x . O comando if efetuar a seqncia de condies at que encontre a verdadeira. if ( x>=0 ) Se x for maior ou igual a zero
90

if( x<100 )

e menor que cem.................

Se o nmero digitado satisfaz a condio, ento ser impresso: O nmero menor que uma centena ! uma nica vez, caso contrrio no imprimir nada e aguardar pressionarmos uma tecla para finalizar o programa ( atravs de getch( ) ). Sintaxe : if ( expresso de controle ) comando ;
Obs: comando pode ser um bloco de comandos, um nico comando

ou nada ( comandos vazios ).

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

Sintaxe:

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


Exemplo: . . main ( ) { clrscr( ); int a,b; puts(Digite dois valores:\n);

91

scanf(%d,&a); scanf(%d,&b); if (a < b) { if (b < 10)printf(O 2nmero menor que 10\n); puts(O 1 nmero menor que o 2nmero); } getch( ); }
Funcionamento:

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

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

Se a expresso de controle for verdadeira, o programa executar comando 1; do contrrio executar comando 2. Ambos os comandos terminam com ponto-e-vrgula, como de resto, todos os comandos em C.
Exemplo:
. . main( ) { clrscr( ); int a,b,c,d; float e; puts(Digite 4 valores inteiros:); scanf(%d%d%d%d,&a,&b,&c,&d); e=(a+b+c+d)/4; if(a < b) puts(O 1nmero menor que o ltimo nmero digitado); else printf(A mdia aritmtica dos nrs digitados :%.1f,e); getch( ); }

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

O comando if-else-if
Tambm chamada de escada if-else-if ou rvore de deciso devido a sua aparncia na listagem do programa, faz com que as condies sejam avaliadas de cima para baixo. Encontrada a
93

condio verdadeira, o comando associado a ela executado fazendo com que o restante da escada seja contornado. Esta coleo de comandos if com clusulas else pode conter um else final para garantir no mnimo que um comando seja relacionado.

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

Um comando if inicia a seleo mltipla executando o comando 1 se a condio 1 for verdadeira. Se a condio 2 for verdadeira, o comando 2 executado e assim por diante para tantas condies e comandos necessrios. Obs: Apenas um dos comandos ser selecionado. Se nenhuma das condies for verdadeira, um else final ser executado, assegurando total controle sobre as aes do programa para todas as possveis condies.

Exemplo: . . main( ) { clrscr( ); char x; puts(Escolha apenas uma das letras: a,b ou c ); scanf(%c,&x); if(x==a) printf(O incremento de a :%c\n,++x);

94

else if (x==b) printf(O incremento de b :%c\n,++x); else if (x==c) printf(O incremento de c :%c\n,++x); else puts(Voc no digitou uma letra vlida !); puts(Pressione uma tecla p/finalizar); getch( ); } Funcionamento:

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

O operador alternativo

Em C, existe uma forma compacta de representar uma instruo if-else simples. Tambm chamado de Operador ternrio ( o nico em C), o ? requer trs operandos.
Sintaxe: Expresso 1 ? Expresso 2 : Expresso 3 ;

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

Exemplo:
95

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

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

Uma outra diretiva foi utilizada com o prottipo <math.h> que possui diversas definies usadas pela biblioteca de matemtica. A funo sqrt( ) devolve a raiz quadrada de um nmero positivo. Sua sintaxe : sqrt( x ); onde x o nmero que se quer extrair a raiz quadrada.

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

96

Operadores lgicos: operador && || ! ao AND OR NOT

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

x y x&&y x||y !x !y 0 0 0 0 1 1 0 1 0 1 1 0 1 0 0 1 0 1 1 1 1 1 0 0 Obs: Assim como toda expresso relacional, a lgica produz como

resultado o zero (falso) ou 1 (verdadeiro).


Precedncia dos operadores:

maior

menor

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

Exemplo 1: . . if ((a>=10) && (a<=100)) comando ; . .

No exemplo acima deseja-se executar um comando se a varivel a estiver compreendida entre 10 e 100. L-se: Se a for maior ou igual a 10 e menor ou igual a 100.........

97

Neste caso, o comando ser executado se, to somente, as condies forem verdadeiras.
Exemplo 2 : . . if ((a<10) || (a>100)) comando ; . .

No exemplo 2, se qualquer uma das condies for verdadeira, ou se ambas forem verdadeiras, o comando ser executado; do contrrio ignorado. L-se: Se a for menor que 10 ou maior que 100 ....... Obs: Se observarmos a precedncia dos operadores, podemos escrever o exemplo anterior da seguinte forma:
. . if (a<10 || a>100) comando; . .

Porm o efeito o mesmo, mas para torn-lo mais claro conveniente utilizarmos parnteses extras. O operador NOT ( ! ) utilizado para inverter a lgica de uma condio (verdadeira ou falsa). Exemplo:
. if (!(x>10)) comando ; . L-se: Se x no for maior que 10 ...............

Ento o comando ser executado somente se x for menor que 10 . permitido a combinao de vrias condies em uma expresso.
Exemplo: 40>10&&!(40<7)||6>=4
98

Neste caso, a condio verdadeira .

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

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

O comando switch usa um ou mais rtulos case, cada um especificando uma constante diferente a ser comparada com a expresso entre parnteses que deve ser de valor inteiro ou caractere. Quando um determinado caso for verdadeiro, a seqncia de comandos associada a este ser executada at que o comando break ou fim do comando switch seja alcanado. Se nenhum caso for verdadeiro o comando default executado. O default opcional e, se no estiver presente, nenhuma ao ser realizada se todos os testes falharem. Pode haver uma ou mais instrues (no precisam estar entre chaves) seguindo cada case. Os rtulos dos casos devem ser

99

todos diferentes. O comando break causa uma sada imediata do switch, porm se no existir, o programa segue executando todas as instrues dos casos posteriores. Devemos envolver por chaves o corpo de switch . Cada rtulo case termina com dois-pontos e no pode existir sozinho, ou seja, fora de switch .
Exemplo:
#include <stdio.h> #include <conio.h> main( ) { clrscr( ); char x ; puts(Selecione a opo:\n a -Soma\n b -Subtrao\n c Multiplicao\nd-Diviso); x=getch( ); switch (x) { case a : puts(Voc selecionou Soma); break ; case b : puts(Voc selecionou Subtrao); break ; case c : puts(Voc selecionou Multiplicao); break ; case d : puts(Voc selecionou Diviso); break ; default : puts(Voc escolheu uma opo invlida.); } getch( ); }

No exemplo, temos um programa que descreve a opo escolhida, a partir da seleo de um caractere no teclado. Caso o caracter escolhido no coincida com algum case , ser impressa uma mensagem comandada por default. Note que os dois comandos (case e default) devem estar dentro do corpo de switch. Obs.: A expresso do comando switch deve ter valor inteiro ou caractere.
100

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

Exerccios
1- Descreva o funcionamento do comando if . ________________________________________________________ ________________________________________________________ _____________________________________________________ 2- Para que serve o comando break ?
101

________________________________________________________ ______________________________________________________ 3- Qual a sintaxe do comando if-else-if . ________________________________________________________ ________________________________________________________ ________________________________________________________ ________________________________________________________ ___________________________________________________ 4- Para que serve a funo sqrt( ) e em que prottipo est definida ? ________________________________________________________ ______________________________________________________ 5- Quais so os operadores lgicos em C ? Descreva sua ao (significado) e a tabela verdade. ________________________________________________________ ______________________________________________________

a&&b

a||b

!a

!b

6- As expresses abaixo so verdadeiras ? (falso ou verdadeiro) Se preferir utilize parnteses, para tornar o cdigo mais claro. ( ( ( ( ( ) 70>20&&!(70<8)||6>=5 ) 1<2||2>=3 ) 4*2-7<=4-8 )6>=5&&5!=2||2<4 )++15>15||70!=60+7&&5>=5/1
102

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

________________________________________________________ ________________________________________________________ ________________________________________________________ ____________________________________________________ 8- O que ser impresso se: int x=10, y=3, z=5 ; float a=5.5 , b=17.3 ; float c, d ; Resposta a) c=x>20?printf(%.2f,a):printf(%d,z); ____________________ b) c=a=5.5?printf(%d,y):printf(%d,y); ____________________ c) d=a<=b?printf(%.2f,b):printf(%d,x); ____________________ d) c=a!=b?printf(%.3f,b-a):printf(%d,y); ___________________ e) d=y>x-z?printf(%d,y):printf(%d,x); ____________________ 9- Explique o funcionamento do comando switch. ________________________________________________________ ________________________________________________________ ________________________________________________________ ________________________________________________________ ___________________________________________________ 10- Faa um programa, utilizando if-else-if que simule uma calculadora capaz de executar contas simples (nmero,operador,nmero) utilizando os operadores soma,subtrao,multiplicao e diviso. ________________________________________________________ ______________________________________________________ ________________________________________________________ ________________________________________________________ ________________________________________________________ ________________________________________________________ ___________________________________________________ 11- Faa o mesmo programa, mas utilize o comando switch. ________________________________________________________ ________________________________________________________ ________________________________________________________

103

________________________________________________________ ________________________________________________________ __________________________________________________ 12- Faa um programa utilizando if-else que identifique se a letra digitada vogal ou consoante. ________________________________________________________ ________________________________________________________ ________________________________________________________ ________________________________________________________ ___________________________________________________ 13- Elabore um programa que seja capaz de identificar se o caracter digitado um nmero, letra maiscula, letra minscula, um espao, ou nenhum dos tipos mencionados. ________________________________________________________ ________________________________________________________ ________________________________________________________ ________________________________________________________ ________________________________________________________ __________________________________________________ 14- Faa um programa que leia 3 valores numricos e os apresente em ordem crescente. ________________________________________________________ ________________________________________________________ _____________________________________________________

________________________________________________________ ________________________________________________________ ________________________________________________________ ____________________________________________________ 15- Elabore um programa que leia quatro valores referentes a quatro notas escolares de um aluno e imprima dizendo que o aluno foi aprovado, desde que a mdia escolar seja igual ou maior que 7. Se a mdia for menor que 7, solicitar a nota de exame, somar com a mdia anterior e obter nova mdia. Se a nova mdia for maior ou

104

igual a 5, apresentar uma mensagem dizendo que o aluno foi aprovado em exame. Se o aluno no obter, aps o exame, mdia satisfatria apresentar uma mensagem dizendo que est retido. Apresentar junto com as mensagens o valor da mdia do aluno para qualquer condio. ________________________________________________________ ________________________________________________________ ________________________________________________________ ________________________________________________________ ________________________________________________________ __________________________________________________ ________________________________________________________ ________________________________________________________ ________________________________________________________ ________________________________________________________ ________________________________________________________ __________________________________________________ ________________________________________________________ ________________________________________________________ ________________________________________________________ ________________________________________________________ ________________________________________________________ __________________________________________________

105

Você também pode gostar