Вы находитесь на странице: 1из 148

Instituto Federal de Educao, Cincia e Tecnologia.

Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

Algoritmos e Lgica de Programao


(Notas de Aula) (Parte II)

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

Linguagem de programao C
1. Fundamentos da Linguagem C
Neste capitulo sero vistos os fundamentos da linguagem C. O conceito de linguagem de programao, linguagens de alto e baixo nvel. Ser visto um pouco do histrico da criao da linguagem e a descrio das caractersticas mais importantes da linguagem C. Finalmente, ser visto o aspecto geral de um cdigo fonte escrito em C. 1.1 Linguagens de Programao Um programa de computador um conjunto instrues que representam um algoritmo para a resoluo de algum problema. Estas instrues so escritas atravs de um conjunto de cdigos (smbolos e palavras). Este conjunto de cdigos possui regras de estruturao lgica e sinttica prpria. Dizemos que este conjunto de smbolos e regras formam uma linguagem de programao. Podemos dividir, genericamente, as linguagens de programao em dois grandes grupos: as linguagens de baixo nvel e as de alto nvel: Linguagens de baixo nvel: So linguagens voltadas para a mquina, isto , so escritas usando as instrues do microprocessador do computador. So genericamente chamadas de linguagens Assembly. Vantagens: Programas so executados com maior velocidade de processamento. Os programas ocupam menos espao na memria. Desvantagens: Em geral, programas em Assembly tem pouca portabilidade, isto , um cdigo gerado para um tipo de processador no serve para outro. Cdigos Assembly no so estruturados, tornando a programao mais difcil. Linguagens de alto nvel: So linguagens voltadas para o ser humano. Em geral utilizam sintaxe estruturada tornando seu cdigo mais legvel. Necessitam de compiladores ou
Prof. MSc. Wagner Izzo Pgina 2

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

interpretadores para gerar instrues do microprocessador. Interpretadores fazem a interpretao de cada instruo do programa fonte executando-a dentro de um ambiente de programao, Basic e AutoLISP por exemplo. Compiladores fazem a traduo de todas as instrues do programa fonte gerando um programa executvel. Estes programas executveis (*.exe) podem ser executados fora dos ambientes de programao, C e Pascal por exemplo. As linguagens de alto nvel podem se distinguir quanto a sua aplicao em genricas como C, Pascal e Basic ou especficas como Fortran (clculo matemtico), GPSS (simulao), LISP (inteligncia artificial) ou CLIPPER (banco de dados). Vantagens: Por serem compiladas ou interpretadas, tem maior portabilidade podendo ser executados em varias plataformas com pouqussimas modificaes. Em geral, a programao torna-se mais fcil por causa do maior ou menor grau de estruturao de suas linguagens. Desvantagens: Em geral, as rotinas geradas (em linguagem de maquina) so mais genricas e portanto mais complexas e por isso so mais lentas e ocupam mais memria. 1.2 Linguagem C A linguagem C uma linguagem de alto nvel, genrica. Foi originalmente desenvolvida nos anos 70 por Dennis Ritchie na Bell (Telephone Laboratories Inc.) e teve seu uso restrito aos laboratrios Bell at 1978, quando Brian Kernighan e Ritchie publicaram uma descrio da linguagem (The C Programming Language). Essa descrio referenciada como K&R C. A linguagem C foi desenvolvida por programadores para programadores tendo como meta caractersticas de flexibilidade e portabilidade e, nasceu juntamente com o advento da teoria de linguagem estruturada e do computador pessoal. Assim, tornou-se rapidamente uma linguagem popular entre os programadores. Como o C foi desenvolvido no ambiente operacional UNIX, eles so estreitamente ligados, e muitos Sistemas Unix foram quase que totalmente desenvolvidos em C, alm de outras linguagens, dentre elas C++ e Java. A partir da publicao do livro (K&R C), numerosos compiladores foram escritos para vrios tipos de computadores. Isso gerou incompatibilidades entre diferentes implementaes da linguagem, diminuindo assim uma caracterstica muito importante, a sua portabilidade. No fim de 1989 foi aprovado o padro ANSI (American National Standards Institute) para a linguagem
Prof. MSc. Wagner Izzo Pgina 3

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

de programao C, que no ano seguinte tambm foi adotado como um padro Internacional (ISO/IEC 1899:1990). UNIX. 1.2.1 Histrico 1969: Desenvolvimento do UNIX (em um PDP 7 em linguagem Assembly). 1969: Desenvolvimento da linguagem BCPL, prxima do Assembly. 1970: Denis Ritchie desenha uma linguagem a partir do BCPL nos laboratrios da Bell Telephones, Inc. Chama a linguagem de B. 1978: Brian Kerningham junta-se a Ritchie para aprimorar a linguagem. A nova verso chama-se C. Pelas suas caractersticas de portabilidade e estruturao j se torna popular entre os programadores. Primeira edio do livro The C Programming Language, Kernighan & Ritchie 1988: A linguagem padronizada pelo American National Standard Institute: surge o ANSI C. 1990: A Borland International Co, fabricante de compiladores profissionais escolhe o C e o Pascal como linguagens de trabalho para o seu Integrated Development Enviroment (Ambiente Integrado de Desenvolvimento): surge o Turbo C. 1992: O C se torna ponto de concordncia entre tericos do desenvolvimento da teoria de Object Oriented Programming (programao orientada a objetos): surge o C++. A inteno do padro ANSI C o de prover a portabilidade dos programas escritos em C a uma grande gama de Sistemas Operacionais (S.O.), no somente ao

Prof. MSc. Wagner Izzo

Pgina 4

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

1.2.2 Caractersticas do C Entre as principais caractersticas do C, que levaram a que se tornasse uma das mais populares linguagens de programao, podemos citar: O C uma linguagem de alto nvel com uma sintaxe bastante estruturada e flexvel tornando sua programao bastante simplificada. O C tem um conjunto reduzido de instrues. As palavras chave em C so:
asm continue enum _fastcall _loadds register _saveregs virtual auto _cs extern goto near return _seg void break default export huge new short _ss volatile case delete _es if operator signed template while do far inline pascal sizeof this char double float int private static typedef class _ds for interrupt protected struct union const else friend long public switch unsigned

(as palavras-chave com tarja cinza so especficas do C++)

Programas em C so compilados, gerando programas com cdigo executvel eficiente. O compilador C gera cdigos mais enxutos e velozes do que muitas outras linguagens. O C permite a utilizao tanto de construes de alto nvel como de operadores de baixo nvel. O C permite acesso e programao direta do microprocessador. Com isto, rotinas cuja dependncia do tempo crtica, podem ser facilmente implementadas usando instrues em Assembly. Permite manipular ponteiros (endereos de memria). Alguma converso automtica entre tipos de dados (ao contrrio do Pascal). Embora estruturalmente simples (poucas funes intrnsecas), o C no perde funcionalidade pois permite a incluso de uma farta quantidade de rotinas do usurio. Os fabricantes de compiladores fornecem uma ampla variedade de rotinas prcompiladas em bibliotecas. Disponibilidade de compiladores em praticamente todos os ambientes operacionais (de desenvolvimento). O C uma linguagem de grande portabilidade..

Prof. MSc. Wagner Izzo

Pgina 5

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

1.2.3 A Portabilidade da linguagem C A razo para a portabilidade da linguagem C que ela tem um conjunto reduzido de instrues e deixa a maioria dos recursos dependentes do computador a cargo de suas bibliotecas de funes. Estas bibliotecas de funes ampliam as instrues bsicas e estimulam ao usurio a criao de novas bibliotecas de funes adicionais. O padro ANSI define alm da sintaxe e da semntica da linguagem de programao, uma biblioteca padro. Esta biblioteca est dividida em 15 reas, baseadas nos headers definidos pelo padro. Os headers so arquivos com extenso .h, que contm as definies de tipos, variveis e funes utilizadas pelo padro ANSI. 1.2.4 O Processo de Traduo da Linguagem

Fonte C Todo programa em C, independentemente de seu tamanho, consiste de uma ou mais funes que especificam as operaes computacionais a serem executadas. Estas funes e operaes, escritas em uma linguagem textual e compreensvel ao desenvolvedor, transformada em algo executvel em um computador, compondo assim uma traduo.

Prof. MSc. Wagner Izzo

Pgina 6

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

Pr-processador O pr-processador a primeira etapa do processo de traduo, e ser estudado em maior detalhe mais tarde. Contudo, veremos alguma informao mais bsica agora. O pr-processador atua apenas ao nvel do cdigo fonte, modificando-o. Trabalha apenas com texto. Algumas das suas funes so: remover os comentrios de um programa; interpretar directivas especiais (diretivas de compilao) a si dirigidas, que comeam pelo carcter #. Por exemplo: #include - insere o contedo de um arquivo de texto no arquivo corrente. Esses arquivos so usualmente designados por cabealhos (header files) e tm a extenso .h: #include <math.h> #include <stdio.h> #define - define um nome simblico cujas ocorrncias no arquivo sero substitudas por outro nome ou constante: #define 100 Compilador Etapa seguinte do processo de traduo, o compilador atua sobre o programa fonte (textual) recebido do pr-processador, fazendo uma verificao (esttica) sinttica e semntica do seu contedo (verificao de tipos, a verificao do uso adequado de argumentos em funes, etc. - a linguagem C em si, no uma linguagem com verificao de tipos rigorosa. Ela relativamente permissiva. Os compiladores atuais possuem chaves de compilao, que tornam este e outros critrios mais controlveis), caso no encontre erros, traduz o programa fonte diretamente em instrues de mquina, mas nem sempre diretamente executvel. MAX_ARRAY_SIZE - substitui todas as ocorrncias de MAX_ARRAY_SIZE por 100. - Insere o contedo do arquivo math.h com a declarao das funes matemticas da biblioteca standard. - Idem para as funes standard de entrada/sada.

Prof. MSc. Wagner Izzo

Pgina 7

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

Os compiladores normalmente permitem que pedaos de programas sejam compilados em separado, permitindo que possam ser agrupados em bibliotecas, para serem utilizados por outros programas. Alguns compiladores traduzem o programa fonte (texto) recebido do pr-processador para linguagem assembly (tambm texto). No entanto, so tambm comuns os compiladores capazes de gerarem diretamente o programa objeto (instrues do processador j em cdigo binrio), isto , j incluem o montador, como veremos a seguir.

Montador (Assmbler) O montador traduz o programa em linguagem assembly (texto) para programa objeto e, como j vimos, pode estar integrado no compilador. O programa objeto geralmente armazenado em arquivos com a extenso .o (unix) ou .obj (ms-dos). Ligador (Linker) Se o(s) programa(s) referencia(m) funes da biblioteca standard ou outras funes contidas em arquivos com cdigo fonte diferentes do principal (que contm a funo main() ), o linker combina todos os objetos com o resultado compilado dessas funes num nico arquivo com cdigo executvel. As referncias a variveis globais externas tambm so resolvidas pelo linker.

Utilizao de bibliotecas A linguagem C muito compacta. Muitas das funes que fazem parte de outras linguagens no esto diretamente includas na linguagem C. Temos como exemplo as operaes de entrada/sada, a manipulao de strings e certas operaes matemticas. A funcionalidade correspondente a estas e outras operaes no faz parte integrante da linguagem, mas est includa numa biblioteca externa, bastante rica e padro. Todas essas operaes so executadas por via da invocao de funes externas definidas nessa biblioteca padro. Num dos ltimos captulos sero fornecidos detalhes acerca de algumas das funes da biblioteca padro (standard) do C.

Prof. MSc. Wagner Izzo

Pgina 8

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

Qualquer programador poder desenvolver a sua prpria biblioteca de funes, podendo at substituir algumas das funes standard, e tambm utilizar outras bibliotecas comerciais j existentes (p. ex. NAG, PHIGS, etc). 1.3 Estrutura de um programa C Um programa em C constitudo de: um cabealho contendo as diretivas de compilador onde se definem o valor de constantes simblicas, declarao de variveis, incluso de bibliotecas, declarao de rotinas, etc. um bloco de instrues principal e outros blocos de rotinas. documentao do programa: comentrios.

Programa C
Diretivas ao pr-processador includes macros Declaraes globais funes variveis Definio das funes Programa Principal Main () { -------------}

O melhor caminho para aprender uma nova linguagem de programao, e sua estrutura, escrever programas nesta linguagem. Vamos criar nosso primeiro programa, explicando a sua estrutura, compil-lo, carrega-lo e executa-lo e verificar a sua resposta.

Prof. MSc. Wagner Izzo

Pgina 9

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

Exemplo 1: Imprima as palavras Meu primeiro programa.


Soluo: Passo 1: Crie o seguinte programa em um arquivo denominado exemplo1.c: #include <stdio.h> main() { printf("Meu primeiro programa\n"); }

No nosso exemplo, main, printf so funes. Normalmente podemos escolher qualquer nome para nossa funo, mas main uma palavra reservada em C e tem um significado especial para o programa: main o entry-point do programa, ou seja, o ponto por onde a execuo do programa comea. Isto nos leva a seguinte afirmao: Todo programa C deve ter um main. De uma forma mais genrica, toda funo possui: um nome seguido de uma lista de argumentos delimitada por ( e ) e estes separados por vrgula, com um corpo de programa associado em seqncia, delimitado por { e }, onde escrevemos as operaes computacionais desejadas, representadas por comandos individuais, terminados por ponto-evrgula. A funo printf, uma funo da biblioteca padro, definida no header <stdio.h>, que imprime uma cadeia de caracteres formatados, em um terminal (que no nosso caso o terminal de sada padro). Neste exemplo, ela tem um argumento Meu primeiro programa\n, que uma cadeia de caracteres, onde ltimo caracter o \n: esta seqncia de escape, diz ao terminal que o cursor dever pular para o incio da prxima linha. Uma descrio simplificada da funo printf pode ser obtida no apndice B. O header <stdio.h> est sendo includo logo na primeira linha de programa. A diretiva #include avisa ao compilador para incluir e compilar tambm tudo o que estiver contido no arquivo em seqncia, delimitado por < e > e que no nosso caso o stdio.h. A chamada de uma funo qualquer em C, pode ser feita diretamente pelo nome da funo, com os argumentos em seqncia delimitados por ( e ). As chaves { } so usadas para agrupar declaraes e comandos formando um comando composto ou bloco de comando, de modo que so sintticamente equivalentes a um nico comando. Podemos empreg-las a um bloco de comando isolado, como delimitadores de uma funo (como vimos acima e veremos com detalhes mais tarde) ou como delimitadores de controle de fluxo. 1.3.1 Macros C fornece certas extenses de linguagem por meio de um simples macroprocessador. Podemos ter 2 tipos de macros: incluso e substituio. No exemplo anterior foi vista a referncia a #include. Esta macro simplifica o manuseio de definies de funes, variveis, tipos etc..., comuns a vrios programas. Podemos definir os itens comuns a vrios programas em arquivos e inclu-los no nosso programa com a
Prof. MSc. Wagner Izzo Pgina 10

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

diretiva #include <nome>" ou "#include nome". Normalmente a diretiva #include usada para headers (arquivos de cabealho), mas o C permite que seja usada com qualquer arquivo. A diferena entre as expresses [ #include <arqu1.h> ] e [ #include arq1.h ] , o escopo de busca e localizao do arquivo mencionado.: Com a definio usando <arq1.h>, o compilador procura o arquivo na lista de caminho indicada para arquivos headers durante a fase de compilao. J com a definio usando arq1.h, o compilador busca o arquivo primeiro no diretrio corrente de compilao e em seguida procura o arquivo na lista de caminho indicada para arquivos headers durante a fase de compilao. A macro de substituio da forma #define nome expresso. Os nomes em um #define tem a forma de um identificador e o que vai ser substitudo o contedo da expresso contido no resto da linha Ex: #define SIM 1 Em geral h muito poucas restries gramaticais no que pode ser definido, pois a diretiva #define processada antes mesmo do passo de compilao em si. A regra bsica para o escopo de definio desta diretiva que ela tem validade do ponto onde definida at o fim do arquivo. possvel definir macros com argumentos, de forma que o texto da reposio dependa da forma como a macro chamada:
#define quadrado(x) x*x

Em um programa contendo esta definio, ao usarmos o segmento de cdigo abaixo em qualquer parte do programa:
qradrado(2)

O macroprocessador, substituir todos os segmentos por: 2*2 Se uma macro no couber em uma linha, ou for composta de mais de uma linha, o uso de uma \ ao final da linha indica que a sua definio continua na prxima linha.

Prof. MSc. Wagner Izzo

Pgina 11

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

1.3.2 Diretiva de desvio na compilao Os compiladores oferecem diretivas para controle de processamento de cdigo ainda em tempo de compilao, fazendo desvio condicional de um trecho de cdigo. O que estas diretivas fazem indicar ao compilador para compilar ou no um trecho de cdigo. A aplicao principal resolver diferenas de implementao entre os sistemas operacionais. As diretivas abordadas so:
#ifdef <Macro> ... #else .... #endif #if defined <macro> ... #else .... #endif #ifndef .... #else .... #endif

Os compiladores fazem uso de macros pr-definidas para indicar o ambiente, a CPU utilizada, nome do compilador etc... .Estas macros associadas s macros definidas pelo usurio, do uma potencialidade muito grande para se construir lgicas de compilao e conseqentemente de execuo. 1.3.3 Conjunto de caracteres Um programa fonte em C um texto no formatado escrito em um editor de textos usando um o conjunto padro de caracteres ASCII. A seguir esto os caracteres utilizados em C: Caracteres vlidos: a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 1 2 3 4 5 6 7 8 9 0 + - * / \ = | & ! ? # % ( ) { } [ ] _ . , : < > Caracteres no vlidos: @ $ Os caracteres acima so vlidos apenas em strings. Veja seo 2.1.4.

Prof. MSc. Wagner Izzo

Pgina 12

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

1.3.4 Comentrios Em C, comentrios podem ser escritos em qualquer lugar do texto para facilitar a interpretao do algoritmo. Para que o comentrio seja identificado como tal, ele deve ter um /* antes e um */ depois. Observe que no exemplo e0101.cpp todo o cabealho esta dentro de um comentrio. Exemplo: /* esta e uma linha de comentrio em C */ Observao: O C++ permite que comentrios sejam escritos de outra forma: colocando um // em uma linha, o compilador entender que tudo que estiver a direita do smbolo um comentrio. Observe no programa exemplo e0101.cpp as linhas de comentrios colocadas a direita dos comandos. Exemplo: // este e um comentrio valido apenas em C++ 1.3.5 Declarao de variveis Em C, como na maioria das linguagens, as variveis devem ser declaradas no inicio do programa. Estas variveis podem ser de vrios tipos: int (inteiro), float (real de simples preciso) e outras que sero vistas no capitulo 2. 1.3.6 Entrada e sada de dados Em C existem varias maneiras de fazer a leitura e escrita de informaes. Estas operaes so chamadas de operaes de entrada e sadia. Veremos no capitulo 4 algumas outras funes de entrada e sada de informaes via teclado e tela. No exemplo acima printf uma funo de escrita na tela, scanf uma funo de leitura de teclado.

Prof. MSc. Wagner Izzo

Pgina 13

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

1.3.7 Estruturas de controle A linguagem C permite uma ampla variedade de estruturas de controle de fluxo de processamento. Estas estruturas sero vistas em detalhes no captulo 5. Duas estruturas das estruturas bsicas (deciso e repetio) so muito semelhantes as estruturas usadas nas Pseudolinguagens algortmicas: Estrutura de Deciso: Permite direcionar o fluxo lgico para dois blocos distintos de instrues conforme uma condio de controle.
Pseudo-linguagem se condio ento bloco 1 seno bloco 2 fim se }; Linguagem C if(condio){ bloco 1; }else{ bloco 2;

Estrutura de Repetio: Permite executar repetidamente um bloco de instrues enquanto uma condio de controle seja satisfeita.
Pseudo-linguagem faa bloco enquanto condio Linguagem C do{ bloco; }while(condio);

Prof. MSc. Wagner Izzo

Pgina 14

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

2. Constantes e Variveis
Neste capitulo veremos como os dados constantes e variveis so manipulados pela linguagem C. O que so constantes inteiras, reais, caracteres e strings. Quais so as regras de atribuio de nomes a variveis e quais so os tipos de dados que o C pode manipular. Veremos tambm como so declaradas as variveis e as constantes simblicas usadas em um programa. 2.1 Constantes O C possui quatro tipos bsicos de constantes: inteiras, de ponto flutuante, caracteres e strings. Constantes inteiras e de ponto flutuante representam nmeros de um modo geral. Caracteres e strings representam letras e agrupamentos de letras (palavras). 2.1.1 Constantes inteiras Uma constante inteira um nmero de valor inteiro. De uma forma geral, constantes inteiras so seqncias de dgitos que representam nmeros inteiros. Nmeros inteiros podem ser escritos no formato decimal (base 10), hexadecimal (base 16) ou octal (base 8). Uma constante inteira decimal formada por uma seqncia de dgitos decimais: 0, 1,
2, 3, 4, 5, 6, 7, 8, 9.

Se a constante tiver dois ou mais dgitos, o primeiro no pode ser 0. (na verdade, pode ser 0 mas o compilador considerar esta constante como octal e no decimal) Exemplo: A seguir so mostradas algumas constantes inteiras decimais vlidas.
0 3 -45 26338 -7575 1010

Exemplo: Algumas constantes inteiras decimais invlidas.


1. 1,2 045 212-22-33 (ponto) (vrgula) (primeiro dgito 0: no constante decimal) (caracter ilegal: -)

Prof. MSc. Wagner Izzo

Pgina 15

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

Uma constante inteira hexadecimal formada por uma seqncia de dgitos decimais: 0,
1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F (ou a, b, c, d, e). Uma

constante hexadecimal deve comear por 0x. Neste caso, os dgitos hexadecimais podem ser minsculos ou maisculos. Exemplo: A seguir so mostrados algumas constantes inteiras hexadecimais vlidas.
0x0 0x3 0x4f5a 0x2FFE OxABCD 0xAaFf

Exemplo: Algumas constantes inteiras hexadecimais invlidas.


0x3. 0x1,e 0x ff FFEE 0Xfg34 (ponto) (vrgula) (espao) (no comea com 0x: no constante hexadecimal) (caracter ilegal: g)

Uma constante inteira octal formada por uma seqncia de dgitos octais: 0, 1, 2,
3, 4, 5, 6, 7. A constante octal deve ter o primeiro digito 0 para que o compilador a

identifique como tal. Exemplo: A seguir so mostrados algumas constantes octais vlidas.
00 -03 045 02633 07575 -0101

Exemplo: Algumas constantes inteiras octais invlidas.


010. 01,2 0 4 45 01784 (ponto) (vrgula) (espao) (primeiro digito no 0: no constante octal) (caracter ilegal: 8)

Exemplo: Monte um funo que imprima um nmero dado como seu argumento, em sua representao inteira decimal, octal e hexadecimal e imprima os valores inteiros de 0 a 16:
Prof. MSc. Wagner Izzo Pgina 16

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

Soluo: A funo printf, possui os seguintes formatos : %d para inteiro decimal %o para inteiro octal %x ou %X para inteiro hexadecimal

/*

Programa que imprime os valores de 0 a 16 em tres sistemas de numercao: decimal, octal, hexadecimal */

#include <stdio.h> int num;

void imprime(int _valor) { printf(" decimal - %02d == octal - %02o == hexadecimal - %02x \n", _valor, _valor, _valor); return(); } int main( ) { for (num=0;num<=16;num++) { printf("num -> %d ===>",num); imprime (num); } system("PAUSE"); }

2.1.2 Constantes de ponto flutuante Nmeros reais (no inteiros) so representados em base 10, por nmeros com um ponto decimal e (opcionalmente) um expoente. Um nmero ponto flutuante deve ter um ponto decimal que no pode ser substitudo por uma vrgula. Um nmero de ponto flutuante pode ser escrito em notao cientfica. Neste caso o x10 substitudo por e ou E. O nmero 1.23e4 representa 1.23 x 104 ou 12300. Exemplo: Nmeros de ponto flutuante vlidos.
0.234 125.65 .93 1.23e-9 -1.e2 10.6e18 -.853E+67

Prof. MSc. Wagner Izzo

Pgina 17

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

A forma de representao de um nmero real em C bastante flexvel. Exemplo: O nmero 314 pode ser representado por qualquer uma das seguintes formas:
314. 3.14e2 +3.14e+2 31.4e1 .314E+3 314e0

2.1.3 Constantes caracter Uma constante caracter uma letra ou smbolo colocado entre aspas simples. Exemplo: Abaixo esto representados algumas constantes caracteres.
a b X & {

Embora sejam visualizados como letras e smbolos as constantes caracteres so armazenadas internamente pelo computador como um nmero inteiro entre 0 e 255. O caracter A por exemplo, tem valor 65. Os valores numricos dos caracteres esto padronizados em uma tabela chamada de American Standard Code for Information Interchange Table ou simplesmente tabela ASCII. Veja apndice C. Certos cdigos de controle da tabela ASCII (como o line feed) ou caracteres especiais (como ') possuem representao especial no C. Esta representao chama-se seqncia de escape representada por uma barra invertida (\) e um caracter. Seqncias de escape so interpretadas como caracteres simples. Abaixo segue uma lista das principais seqncias de escape usadas no C.
Controle/Caracter nulo (null) campainha (bell) retrocesso (backspace) tabulao horizontal nova linha (new line) tabulao vertical alimentao de folha (form feed) retorno de carro (carriage return) Seqncia de escape \0 \a \b \t \n \v \f \r Valor ASCII 00 07 08 09 10 11 12 13

Prof. MSc. Wagner Izzo

Pgina 18

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

aspas (") apostrofo (') interrogao (?) barra invertida (\)

\ \r \? \\

34 39 63 92

2.1.4 Constantes string (cadeia de caracteres) Uma constante string consiste de um conjunto de caracteres colocados entre aspas duplas. Embora as instrues do C usem apenas os caracteres do conjunto padro ASCII, as constantes caracter e string podem conter caracteres do conjunto estendido ASCII: , , , , ... Todas as constantes string, mesmo que sejam escritas exatamente iguais, ocupam reas diferentes de armazenamento. Todo compilador C coloca automaticamente um caracter \0 no final de uma constante do tipo string, isto faz com que esta constante tenha um tamanho que corresponde a um byte a mais que o nmero de caracteres que usamos para represent-la. Exemplo: Abaixo seguem algumas constantes strings vlidas. Oba!
Caxias do Sul Joo Carlos da Silveira a \Teste\ \101--\x61 /* constante cadeias de caracter com 5 caracteres */ /* constante cadeias de caracter com 14 caracteres */ /* constante cadeias de caracter com 24 caracteres */ /* constante cadeias de caracter com 2 caracteres */ /* constante cadeias de caracter com 9 caracteres */ /* constante cadeias de caracter com 4 caracteres */

2.1.5 Constantes Simblicas Muitas vezes identificamos uma constante numrica por um smbolo: Pi = 3,14159 por exemplo. Podemos definir um nome simblico para esta constante, isto , podemos definir uma constante simblica que represente valor. 2.1.5.1 Constantes definidas pelo usurio O programador pode definir constantes simblicas em qualquer programa. Sintaxe: A sintaxe da instruo de definio de uma constante simblica :
Prof. MSc. Wagner Izzo Pgina 19

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

#define nome valor Onde #define uma diretiva de compilao que diz ao compilador para trocar as ocorrncias do texto nome por valor. Observe que no h ; no final da instruo pois trata-se de um comando para o compilador e no para o processador. A instruo #define deve ser escrita antes da instruo de declarao da rotina principal. Exemplo: a seguir definimos algumas constantes simblicas.
#define PI #define ON 3.14159 1

#define OFF 0 #define ENDERECO 0x378 void main(){ ...

No exemplo acima, definimos PI como 3.14159. Isto significa que todas as ocorrncias do texto PI ser trocado por 3.14159. Assim se escrevemos uma instruo:
rea = PI * raio * raio;

o compilador vai interpretar esta instruo como se fosse escrita assim:


rea = 3.14159 * raio * raio;

Poderamos escrever estas instrues assim:


float pi = 3.14159; rea = pi * rea * rea;

Prof. MSc. Wagner Izzo

Pgina 20

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

porm este tipo de instruo tem duas desvantagens: Primeiro, reserva 4 bytes de memria desnecessariamente. Segundo, esta instruo executada mais lentamente pois o processador precisa acessar a memria para verificar qual o valor de pi. Observe tambm que no exemplo definimos os nomes simblicos com letras maisculas. Isto no necessrio, podemos perfeitamente definir nomes simblicos usando letras minsculas, porm faz parte do jargo dos programadores C usar letras maisculas para definir constantes simblicas. O uso da diretiva #define no se restringe apenas ao apresentado acima, podemos usla para definir macro instrues. No veremos o uso de macros neste texto, procure mais detalhes na bibliografia recomendada. 2.1.5.2 Constantes pr-definidas Em alguns compiladores C, algumas constantes simblicas j esto pr-definidas. Estas constantes em geral definam alguns valores matemticos (, /2, e, etc.), limites de tipos etc. A seguir segue uma tabela contendo algumas (existem muitas outras) constantes simblicas prdefinidas no compilador Turbo C++ da Borland.
Biblioteca math.h math.h math.h math.h math.h limits.h limits.h Constante M_PI M_PI_2 M_PI_4 M_1_PI M_SQRT2 INT_MAX INT_MIN Valor 3.14159... 1.57079... 0,78539... 0,31830... 1,41421... 32767 -32768 Significado /2 /4 1/ 2 limite superior do tipo int limite inferior do tipo int

Cada uma das constantes acima esta definida em uma biblioteca. Uma biblioteca, em C, um arquivo pr-compilado chamado arquivo header (cabealho, em ingls). Em cada biblioteca esto agrupadas constantes e funes semelhantes (veja seo 3.7.2). Por exemplo, constantes e funes matemticas esto guardadas na biblioteca math.h (mathematical functions),
Prof. MSc. Wagner Izzo Pgina 21

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

constantes e funes de manipulao teclado e monitor esto guardadas na biblioteca conio.h (console input and output). Para que se possa usar a constante simblica em um programa preciso incluir a biblioteca na compilao do programa.

Sintaxe: A sintaxe de incluso de bibliotecas a seguinte: #include <nome_bib> onde nome_bib o nome da biblioteca que se deseja incluir. Esta instruo deve ser escrita antes do programa principal. Exemplo: O programa abaixo usa a constante predefinida M_PI para calcular a rea de um disco circular. #include <math.h> void main(){ float area, raio = 5.0; rea = M_PI * raio * raio; } 2.2 Identificadores Identificadores so os nomes das constantes, variveis e funes usadas no programa. Por exemplo raiz e MAX so nomes de variveis utilizadas no programa e0101.cpp. 2.2.1 Regras de sintaxe Os identificadores devem seguir as seguintes regras de construo: Os identificadores devem comear por uma letra (a - z , A - Z) ou um underscore ( _ ). O resto do identificador deve conter apenas letras, underscores ou dgitos (0 - 9). No pode conter outros caracteres. Em C, os identificadores podem ter at 32 caracteres.
Prof. MSc. Wagner Izzo Pgina 22

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

Em C, letras maisculas so diferentes de letras minsculas: Por exemplo: MAX, max, Max so nomes diferentes para o compilador. Esta propriedade chamada de case sensibility. Exemplo: os nomes abaixo so vlidos:
abc, y24, VetorPontosMovimentoRobo, nota_1, TAM_MAX.

Exemplo: os nomes abaixo no so vlidos:


3dia, vetor-1, pao&leite, iterao.

2.2.2 Palavras reservadas Existem certos nomes que no podem ser usados como identificadores. So as chamadas palavras reservadas (palavras_chave) e so de uso restrito da linguagem C (comandos, estruturas, declaraes, etc.). O conjunto de palavras reservadas foi apresentado ni tem1.2.2. 2.3 Tipos de dados Em C, como na maioria das linguagens, os dados so divididos tipos: inteiro, real, caracter, etc. Esta diviso se deve basicamente ao nmero de bytes reservados para cada dado. Cada tipo de dado possui um intervalo de valores permitidos. 2.3.1 Tipos bsicos A linguagem C suporta vrios tipos diferentes de dados, cada qual podendo ser representado de forma diferente em memria, mas todos estes tipos sero derivados de 4 tipos bsicos: char int float : um nico byte, capaz de conter um caracter do conjunto de caracteres local. : um inteiro, tipicamente refletindo o tamanho natural de inteiros da mquina hospedeira. : ponto flutuante em preciso simples.

Prof. MSc. Wagner Izzo

Pgina 23

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

Do ubl e

: ponto flutuante em preciso dupla.

A preciso destes objetos depende da mquina disponvel e do tamanho em bits/bytes necessrios para representa-los em memria:

TIPO
char int float double 8 32 32 64

TAMANHO
bits bits bits bits (1 (4 (4 (8 byte) bytes) bytes) bytes)

INTERVALO
-128 -2.147.483.648 3.4e-38 1.7e-308 a 127 a 2.147.483.647 a 3.4e38 a 1.7e308

2.3.2 Tipos modificados Alem dos tipos bsicos, existem qualificadores que podem ser aplicados a inteiros: short, long e unsigned. Os qualificadores short e long, referem-se a diferentes tamanhos de inteiros com sinal, mas em alguns compiladores permitido o uso de long e double para float (long float ou double float). Nmeros unsigned obedecem lei aritmtica mdulo 2n , onde n o nmero de bits usados para represent-lo (unigned sempre positivo).
TIPO
unsigned char signed char short int signed short int unsigned short int signed int unsigned int long int unsigned long int long double

TAMANHO
8 bits (1 byte) 8 bits (1 byte) 16 bits (2 bytes) 16 bits (2 bytes) 16 bits (2 bytes) 32 bits (4 bytes) 32 bits (4 bytes) 32 bits (4 bytes) 32 bits (4 bytes) 96 bits (12 bytes)

INTERVALO
0 a 255 -128 a 127 -32768 a 32767 -32768 a 32767 0 a 65535 -2.147.483.648 a 2.147.483.647 0 a 4.294.967.295 -2.147.483.648 a 2.147.483.647 0 a 4.294.967.295 3.4e-4932 a 1.1e4932 (???)

Alem destes tipos bsicos, temos 2 tipos especiais, o void e o enum, que veremos adiante, nos prximos captulos.
Prof. MSc. Wagner Izzo Pgina 24

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

Exemplo: Sabendo que sizeof um operador que retorna o tamanho em bytes alocados para um item de dados e que sua sintaxe [ int sizeof( <tipo ou varivel> ) ]. Defina variveis do tipo char,int, float e double, e imprima as quantidades de bytes alocadas para cada um.
/* Programa que imprime os variveis do tipo bsico */ #include <stdio.h> char a; int b; float c; double d; int main( ) { printf("Tamanhos printf("Caracter printf("Inteiro printf("Float printf("Double system("PAUSE"); } alocados:\n"); %d \n",sizeof(a)); %d \n",sizeof(b)); %d \n",sizeof(c)); %d \n",sizeof(d)); tamanhos alocados para

Neste programa temos a seguinte linha: /* Imprime o tamanho alocados par variveis do tipo bsico */ Tudo o que estiver entre um /* e um */ , no ser interpretado pelo compilador, ser ignorado. Usamos o texto entre esses smbolos como comentrios de programas C . Ainda neste programa, a funo printf, possui dois parmetros. O primeiro que uma seqncia de caracteres, e o segundo que a chamada do operador sizeof. Na seqncia de caracteres, temos os caracteres %d. Esta seqncia usada para informar que na posio indicada, deve ser impresso um nmero inteiro. O nmero inteiro que ser impresso o retorno do operador sizeof(segundo parmetro).

2.3.3 Strings Uma string um conjunto ordenado de caracteres que pode ser armazenado sob forma de um vetor um ponteiro. Estas estruturas de dados sero vistas em detalhe mais adiante. Por enquanto, nos basta saber como declarar e armazenar um conjunto caracter em uma varivel.

Prof. MSc. Wagner Izzo

Pgina 25

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

Sintaxe: Para declararmos uma varivel para receber um conjunto caracter devemos escrever: char* var; Exemplo: No exemplo seguinte a varivel nome foi declarada como conjunto caracter e em seguida recebe uma constante string. char* nome; nome = "Joo Carlos de Oliveira Andrade";

2.3.4 Declarao de variveis Para que se possa usar uma varivel em um programa, necessrio fazer uma declarao de varivel antes. A declarao de variveis simplesmente informa ao processador quais so os nomes utilizados para armazenar dados variveis e quais so os tipos usados. Deste modo o processador pode alocar (reservar) o espao necessrio na memria para a manipulao destas variveis. possvel declarar mais de uma varivel ao mesmo tempo, basta separ-las por vrgulas (,). Sintaxe: A sintaxe para declarao de variveis a seguinte: tipo variavel_1 [, variavel_2, ...] ; Onde tipo o tipo de dado e variavel_1 o nome da varivel a ser declarada. Se houver mais de uma varivel, seus nomes so separados por vrgulas. Exemplo: Declarao das variveis: int i; int x,y,z; char letra; float nota_1,nota_2,media; double num;
Prof. MSc. Wagner Izzo Pgina 26

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

No exemplo acima, i, x, y e z foram declaradas variveis inteiras. Assim elas podem armazenar valores inteiros de -2.147.483.648 a 2.147.483.647. Do mesmo modo letra foi declarada como varivel caracter podendo receber valores de -128 at 127 ou caracteres do conjunto padro ASCII. As variveis nota_1, nota_2 e media foram declaradas como ponto flutuante tipo float e num como ponto flutuante tipo double. A declarao de variveis feita, em geral, dentro de uma rotina. Por exemplo, a rotina principal main(). Deste modo se diz que est se fazendo uma declarao de variveis locais. Variveis locais podem ser referenciadas apenas dentro da rotina dentro da qual foi declarada, neste caso a rotina main(). Exemplo: Observe o uso da declarao de variveis no trecho de programa abaixo: void main(){ float raio, area; raio = 2.5; rea = 3.14 * raio * raio; } No exemplo anterior, as variveis area e raio foram declaradas como variveis locais tipo float. Assim o processador faz a alocao de dois espaos (endereos) de 4 bytes cada para armazenar as informaes, um para cada varivel. Na terceira linha, o processador coloca no endereo alocado para raio o valor 2.5. Depois, na quarta linha, o processador coloca o resultado da conta (19.625) no endereo de rea. possvel fazer a declarao de variveis fora de uma rotina. Neste caso diz-se que se fez a declarao de variveis globais. 2.3.5 Inicializao de variveis. Quando se faz a declarao de uma varivel est se determinando que tipo de dado ela vai receber. possvel, em C, declarar uma varivel e j armazenar nela um valor inicial. Chamamos este procedimento de inicializao de uma varivel. Sintaxe: A sintaxe para a inicializao de variveis :
Prof. MSc. Wagner Izzo Pgina 27

// declarao de variveis

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

tipo var_1 = valor_1 [, var_2 = valor_2, ...] ; Onde tipo o tipo de dado, var_1 o nome da varivel a ser inicializada e valor_1 o valor inicial da varivel. Exemplo: Inicializao de variveis: int i = 0, j = 100; float num = 13.5; char* titulo = " Programa Teste "; No exemplo anterior, i e j foram declaradas variveis tipo int. O valor inicial de i 0 e o de j 100. Do mesmo modo num foi declarada como varivel float com valor inicial de 13.5. Tambm a varivel titulo foi declarada como um conjunto caracter e recebeu como contedo inicial a string " Programa Teste ". 2.3.6 Converso de tipo (Casting) Algumas vezes queremos, momentaneamente, modificar o tipo de dado representado por uma varivel, isto , queremos que o dado seja apresentado em um tipo diferente do qual a varivel foi inicialmente declarada. Por exemplo: declaramos uma varivel como int e queremos, momentaneamente, que seu contedo seja apresentado como float. Este procedimento chamado de converso de tipo ou casting (moldagem, em ingls). Sintaxe: A sintaxe da instruo de converso de tipo : (tipo) varivel onde: tipo o nome do tipo ao qual queremos converter o dado armazenado em varivel. Exemplo: observe a converso de tipo feita no exemplo abaixo: int num; float valor = 13.0;
Prof. MSc. Wagner Izzo Pgina 28

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

num = (int)valor % 2; No exemplo acima a varivel valor foi declarada inicialmente como sendo do tipo float recebendo o valor inicial 13.0. Logo em seguida o contedo de valor convertido para o tipo int para realizar a operao mdulo (%) com o inteiro 2. Aqui a converso necessria pois a operao mdulo somente pode ser feita com inteiros. importante salientar que a converso de tipo feita com o dado armazenado em uma varivel mas a varivel continua tendo o seu tipo original. No exemplo acima a varivel valor e os dados nela armazenados continuam sendo do tipo float aps a converso. Veremos na seo 3.1 uma explicao mais detalhada do uso da converso de tipos.

2.3.7 Tipos Novos C fornece uma facilidade chamada typedef para que o usurio defina novos tipos de dados baseados em tipos j definidos. Uma vez definido um tipo de dado novas variveis podem ser declaradas em relao a esse novo tipo de dados. Sintaxe:
typedef tipo_j_definido novo_tipo;

Esses novos tipos podem ser simples (ilustrado no exemplo a seguir) ou complexos ( como ser visto mais adiante). Exemplo: (muito sismples)
typedef float real; typedef char letter; real sum = 0.0; /* o mesmo que float sum = 0.0 */

Prof. MSc. Wagner Izzo

Pgina 29

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

letter ch = 'A'; /* o mesmo que char */

Deve-se enfatizar que na verdade no criamos um novo tipo de dados, simplesmente criamos um novo nome para o tipo existente. No existe nada semnticamente que acrescentado a varivel definida com o novo nome criado para o tipo. H trs razes principais para o uso de declaraes typedef. A primeira de parametrizar um programa para se proteger contra problemas de transportabilidade (facilitar a portabilidade). Se usarmos o typedef para redefinir tipos de dados dependentes de mquina, somente os typedefs precisam ser mudados quando o programa transportado. A segunda que definindo novos nomes aos tipos, quando for necessrio mudar o tipo de um conjunto de variveis definidas com o mesmo tipo associado, basta mudar o typedef, todo o restante de cdigo preservado. A terceira que o typedef pode fornecer uma documentao mais fcil de entender. O novo nome pode ser mais esclarecedor no meio de um cdigo, do que a simples definio do tipo bsico. Exemplo 4: Sabendo que a frmula C=(5/9)(F-32) , converte um valor da tabela em graus Fahrenheit para seu correspondente em graus Celsius. Imprima os valores de converso para 0, 20, 40 ... 300.
Passo 1: Declare macros para inicio, fim e incremento da tabela. Declare variveis para armazenar os valores em Fahrenheit e Celsius, definindo o novos tipos de dados. Atribua os valores inicial, final e incremento respectivamente e o valor inicial a Fahrenheit. Faa um loop enquanto o valor Fahrenheit no corresponder ao ltimo valor.,imprimindo a correspondncia de valores Fahrenheit e Celsius.

Programa:
/*Imprime valores correspondentes entre Fahrenheit e Celsius no intervalo 0, 20, 40 ... 300 */ #define INICIO 0 /* limite inferior da tabela */ #define FIM 300 /* limite superior */ #define INCREMENTO 20 /*incremento */
Prof. MSc. Wagner Izzo Pgina 30

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

typedef float FAHRENHEIT ; typedef float CELSIUS; main( ) { FAHRENHEIT fahr; CELSIUS celsius; fahr = INICIO; while(fahr <= FIM) { celsius = (5.0/9.0) * (fahr 32.0); printf( F %4.0f C %6.1f \n,fahr,celsius); fahr = fahr + INCREMENTO; } }

Usamos um controle de loop do tipo lao que repete todas as linhas contidas no seu bloco de comandos, enquanto a condio entre-parnteses for verdadeira: while(<condio>) { .... <bloco de comandos > ... } O corpo de um while pode ter um ou mais comandos entre chaves, como no exerccio, ou um nico comando sem chaves. A endentao de forma correta em conjunto com o uso de espaos, enfatiza a estrutura lgica do programa, tornandoos fceis de serem entendidos. A maior parte do trabalho feita no corpo do lao. O controle do lao feito pelo operador menor ou igual (<=). A linha celsius=(5.0/9.0)*(farh-32.0);, computa o valor da frmula e atribui a varivel celsius. A razo de usarmos (5.0/9.0) e no (5/9), que esta ltima diviso interpretada como diviso inteira, perdendo a parte fracionria e como conseqncia o resultado seria ento zero. 2.3.8 Estruturas em C Uma estrutura uma coleo de uma ou mais variveis, possivelmente de tipos diferentes, colocadas juntas sob um nico nome para manipulao conveniente. As estruturas auxiliam na organizao de dados complexos, agrupando variveis inter-relacionadas como um todo, ao invs de entidades distintas. Sintaxe:
struct <nome> { <tipo> nome 1; .... <tipo> nome n;
Prof. MSc. Wagner Izzo Pgina 31

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

} <variveis>;

Assim em:
struct data { int dia; int ms; int ano; int dia_ano; char nome_mes[4]; } diax;

a varivel diax uma estrutura composta pelos campos da estrutura data. Para acessar um membro (campo) da estrutura, usamos o operador . . Ele conecta o nome da estrutura com o nome do campo.
diax.dia = 2;

Uma declarao de estrutura que no seguida por uma lista de variveis no aloca espao; ela simplesmente descreve o gabarito ou forma de uma estrutura. Se a declarao etiquetada, esta pode ser usada em definies posteriores de instncias da estrutura. Dada a definio acima:
Struct data d; /* define a varivel d como sendo uma estrutura do tipo data.

A estrutura pode ser inicializada:


struct data d = { 7,9,1822,250,set};

As estruturas podem ser aninhadas:


struct pessoa { char nome[TAM_NOME];
Prof. MSc. Wagner Izzo Pgina 32

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

char endereco [TAM_END]; struct data nascimento; };

Assim em:
struct pessoa vizinho;

a composio: vizinho.nascimento.dia, nos d o dia do nascimento da varivel vizinho. Podemos usar o recurso de definir novo tipo de dados em estruturas:
typedef struct datast { int dia; int ms; int ano; int dia_ano; char nome_mes[4]; } datanm;

Define um novo tipo de dado denominado datanm, e podemos definir:


datanm admissao;

ou
struct datast admissao;

As variveis definidas com a mesma estrutura podem ser atribudas diretamente: data entra,sai; .... entra=sai; 2.3.8.1 Vetores de estruturas
Pgina 33

Prof. MSc. Wagner Izzo

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

Considere as seguintes declaraes:


typedef struct { int dia; int ms; int ano; int dia_ano; char nome_mes[4]; } data;

typedef struct { int num; char nome[100]; data abertura; } conta; conta cliente[100];

Onde:
cliente um vetor que pode conter 100 elementos da estrutura conta.

Se quisermos acessar a 13 conta:


cliente[12]

Se quisermos saber o nome do cliente:


cliente[12].nome

Se quisermos saber o dia de abertura da conta:


cliente[12].abertura.dia

Exerccio: Construa um programa usando as estruturas acima e imprima os seus tamanhos.


Prof. MSc. Wagner Izzo Pgina 34

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

2.3.9 Unies Unies, assim como estruturas, contm membros cujos tipos podem ser diferentes. Contudo, os membros que compem uma unio compartilham a mesma rea de memria, enquanto cada membro de uma estrutura tem sua prpria rea de memria. Sintaxe:
union <tag> { membro 1; .... membro n; };

Exerccio: Defina uma estrutura e uma union contendo cada uma um char, um int e um float . Imprima o tamanho de cada uma. 2.3.10 Tipo Enumerado Os tipos enumerados no so mais do que uma lista de identificadores que funcionam como constantes inteiras. So muito semelhantes aos tipos enumerados do Pascal. Por exemplo:
enum days { sun, mon, tue, wed, thu, fri, sat }; enum days week1, week2; week1 = wed; week2 = sun;

Na declarao de cima o identificador sun fica associado ao valor 0, o identificador mon ao valor 1, e assim sucessivamente. possvel fazer cast (implcito ou explcito) para int, nos dois sentidos. No entando possvel, numa enumerao, associar os identicadores a outros valores, que no a sucesso que comea em 0. Por exemplo:
enum escapes {bell='\a', backspace='\b', tab='\t', newline='\n', vertical_tab='\v', return='\r'};
Prof. MSc. Wagner Izzo Pgina 35

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

mesmo possvel iniciar a sucesso de valores inteiros associados aos identificadores num valor diferente de 0, como na declarao seguinte:

enum months {jan=1, feb, mar, apr, may, jun, jul, ago, sep, oct, nov, dec};

2.3.11 Alinhamento Alguns compiladores, trabalham com o mapeamento de memria na alocao espelhando a mquina e/ou o sistema operacional envolvido. A grande maioria faz o que chamamos de alinhamento. O alinhamento nada mais do que a representao de uma estrutura em memria de forma natural. As CPUs e os sistemas operacionais, mapeiam a memria em blocos que variam de sistema para sistema. Alguns usam blocos de 2 bytes, 4 bytes e at mesmos de 8 bytes. Desta forma, existe uma unidade mnima de representao em memria, de maneira que independentemente de como voc associa os campos de uma estrutura, ela conter sempre um mltiplo desta unidade mnima. Assim se o alinhamento em uma CPU/S.O. de 2 bytes, no adianta definir uma estrutura com um nico campo do tipo char, a estrutura conter 2 bytes, e na hora de definir uma varivel contendo aquela estrutura, o tamanho ocupado por aquela varivel ser de 2 bytes (e no um byte como o esperado). A forma com que o compilador resolve o alinhamento tambm varia. Alguns compiladores, fornecem uma maneira de voc definir exatamente aquilo que voc precisa eliminando o alinhamento. Outros permitem que voc especifique que tipo de alinhamento o desejado (2 , 4 ou 8 bytes). E ainda outros que simplesmente no permitem que voc interfira no alinhamento, ele fica amarrado ao implementado pelo S.O. . A composio do alinhamento normalmente da seguinte forma: A estrutura tem que ser representada de forma que contenha os bytes agrupados refletindo o tamanho definido para o

Prof. MSc. Wagner Izzo

Pgina 36

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

alinhamento. Caso esteja faltando ou extrapole o nmero de bytes de representao, o compilador insere campos dummy para preencher a estrutura: Exemplo: Suponha que o alinhamento do S.O. seja de 4 bytes. Em uma estrutura o compilador age da seguinte forma:
struct exemplo { char a; int b; bytes entre a e b */ char c; short int d; float e; byte entre d e e*/ short int f; /* alocado 2 bytes e como o ltimo e a /* so inseridos mais 2 bytes */ }; /* desta forma esta estrutura conter 20 bytes ao final */ estrutura no mltipla de 4 */ /* um byte alocado */ /* mais dois bytes total 3 */ /* como o float tem 4 bytes, inserido um /* um byte alocado */ /* quatro bytes alocados inserido 3

Se arrumarmos a estrutura acima da seguinte forma:


struct exemplo { char a; char c; short int d; int b; float e; short int f; /* como o ltimo e a estrutura e a estrutura no mltipla de 4 */ /* so inseridos mais 2 bytes */ }; /* desta forma esta estrutura conter 18 bytes ao final */

2.3.12 Armazenamento

Prof. MSc. Wagner Izzo

Pgina 37

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

J vimos que as variveis em C so classificadas de acordo com seu tipo de dado. Podemos tambm nos referenciar a uma varivel quanto ao seu escopo (ou visibilidade). Existem quatro diferentes categorias em C: Automtica, externa, esttica e registrador. 2.3.12.1 Variveis automticas

As variveis automticas so aquelas que so declaradas dentro de uma funo e s so vlidas durante a execuo da mesma. Desta forma, o escopo de uma varivel automtica a funo onde ela declarada. A palavra-chave auto usada para explicitar uma varivel automtica, mas todas as variveis declaradas dentro de uma funo so automticas, a menos que se faa a explicitao de sua visibilidade. Portanto o uso de auto desnecessrio. Variveis definidas em funes diferentes so independentes, mesmo que tenham o mesmo nome. Uma varivel automtica no mantm seu valor quando o controle transferido para fora de uma funo. 2.3.12.2 Variveis externas

Variveis externas (ou globais) ao contrrio de variveis automticas, no esto restritas a uma nica funo. Seu alcance se estende do ponto em que foi definida ao final do programa. Podemos montar um programa-executvel, dividindo-o em diferentes conjuntos de funes agrupadas em arquivos diferentes. Cada arquivo que contm um conjunto de funes distintas denominado programa-fonte. Logo, um programa-executvel pode ser composto por um ou mais programas-fonte (arquivos diferentes). Visto que variveis externas so acessveis globalmente em um programa, mesmo que o programa seja composto de vrios arquivos, elas fornecem uma alternativa para argumento de funo e valores de retorno (mas no uma boa prtica de programao !!). Qualquer funo de um programa, pode acessar uma varivel externa, basta declarar o seu nome precedido pela palavra-reservada extern.

Prof. MSc. Wagner Izzo

Pgina 38

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

Ateno: se no programa-fonte onde a varivel externa ser usada, a declarao extern for feita no interior de uma funo, s esta ter acesso varivel. O escopo de variveis externas vai do ponto de sua declarao at o fim do programa. Elas so vlidas durante a execuo de um programa, ou seja, so permanentes, retm o seu valor. 2.3.12.3 Variveis estticas

Variveis estticas podem ser internas ou externas a uma funo. As internas so locais a uma funo particular, tem o mesmo escopo que as variveis automticas, mas ao contrrio destas, continuam a existir independente da ativao ou desativao da funo, seu valor no perdido. As externas somente sero conhecidas nos programas-fonte onde elas so declaradas. A declarao de uma varivel esttica feita com a palavra chave static antes do tipo da varivel. Exemplo:
static int tamanho;

2.3.12.4

Variveis registradores

A declarao register, avisa ao compilador que a varivel em questo ser largamente usada. Quando possvel, tais variveis so colocadas em registradores de mquina, acelerando o acesso a varivel. Na prtica temos algumas restries quanto ao uso de variveis register. Poucas variveis podem ser declaradas como tal. Em caso de excesso de declaraes register, o compilador simplesmente ignora a declarao. Nos compiladores o uso de variveis registradores impede a otimizao de cdigo feita pelo compilador: Exemplo: para declarar a como uma varivel register
register int a;

Prof. MSc. Wagner Izzo

Pgina 39

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

........ a = b; a = d;

Prof. MSc. Wagner Izzo

Pgina 40

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

3. Operadores, Expresses e Funes


Um programa tem como caracterstica fundamental a capacidade de processar dados. Processar dados significa realizar operaes com estes dados. As operaes a serem realizadas com os dados podem ser determinadas por operadores ou funes. Os operadores podem ser de atribuio, aritmticos, de atribuio aritmtica, incrementais, relacionais, lgicos e condicionais. Exemplo: o smbolo + um operador que representa a operao aritmtica de adio. O identificador sqrt() uma funo que representa a operao de extrair a raiz quadrada de um nmero. Uma expresso um arranjo de operadores e operandos. A cada expresso vlida atribudo um valor numrico. Exemplo: 4 + 6 uma expresso cujo valor 10. A expresso sqrt(9.0) tem valor 3.0. 3.1 Operador de Atribuio A operao de atribuio a operao mais simples do C. Consiste em atribuir valor de uma expresso a uma varivel. Sintaxe: A sintaxe da operao de atribuio a seguinte: identificador = expresso; onde identificador o nome de uma varivel e expresso uma expresso vlida (ou outro identificador). Exemplo: A seguir so mostradas algumas atribuies vlidas: a = 1; delta = b * b - 4. * a * c;
Prof. MSc. Wagner Izzo Pgina 41

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

i = j; Observe que o smbolo de atribuio ( = ) no tem o mesmo significado que o usual da matemtica que representa a igualdade de valores. Este smbolo, em C, representa a atribuio do valor calculado em expresso a varivel identificador. Em pseudo-linguagem o operador de atribuio representado como . Tambm no se pode confundir o operador de atribuio ( = ) com o operador relacional de igualdade ( == ) que ser visto na seo 3.5.1. Observe-se tambm que o operando esquerdo deve ser um identificador de varivel, isto , no pode ser uma constante ou expresso. Exemplo: A seguir so mostradas algumas atribuies invlidas: 1 = a; b + 1 = a; 3.1.1 Converso de tipo. Se os dois operandos de uma atribuio no so do mesmo tipo, o valor da expresso ou operador da direita ser convertido para o tipo do identificador da esquerda. Exemplo: Algumas atribuies com converso de tipo: int i; float r; i = 5; r = i ; // valor de i: 5 // valor de r: 5.0 // constante! // expresso!

A varivel i foi inicializada com o valor 5. Ao final da terceira instruo, r recebe o valor 5.0. Nestas converses podem ocorrer alteraes dos valores convertidos se o operando da esquerda for de um tipo que utilize menor numero de bytes que o operando da direita.

Prof. MSc. Wagner Izzo

Pgina 42

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

Exemplo: Algumas atribuies com converso de tipo e perda de informao: int i; float r = 654.321; i = r; // truncamento!

Aps a execuo deste trecho de programa o valor da varivel i ser 654 pois seu valor foi truncado durante a converso. Pode-se dizer que as converses potencialmente perigosas (onde h possibilidade de perda de informao) so: char int float double Observe que o compilador C ao encontrar esta operao pode gerar (ou no) algum aviso de ateno para o programador. Assim este detalhe pode gerar um erro de programao (bug) que passe desapercebido ao programador inexperiente. possvel dizer que a linguagem C possui tipos macios (soft types) pois a operao com variveis de tipos diferentes perfeitamente possvel. Esta caracterstica do C se contrape a algumas linguagens em que isto no possvel (Fortran, por exemplo). Estas linguagens possuem tipos duros (hard types). 3.1.2 Limites do intervalo do tipo de dado. Tambm importante observar que os tipos em C tem intervalos bem definidos e os resultados das operaes devem respeitar estes intervalos. Se a uma varivel for atribudo um valor que esteja fora dos seus limites ento este valor ser alterado. Exemplo: Observe as expresses abaixo, assuma que i seja uma varivel do tipo short int. i = 4999; i = 4999 + 1; i = 5000 + 30000; // o valor de i e // o valor de i e 4999 5000

// o valor de i e -30536

O valor de 35000 ultrapassou o limite superior do tipo int (32767).


Prof. MSc. Wagner Izzo Pgina 43

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

importante observar que em C, ao contrrio de outras linguagens, a ultrapassagem do limite de um tipo no interpretado como erro. Isto pode acarretar resultados inesperados para o programador desatento. 3.1.3 Atribuio mltipla. possvel atribuir um valor a muitas variveis em uma nica instruo. A esta operao d-se o nome de atribuio mltipla. Sintaxe: A sintaxe da atribuio mltipla seguinte: var_1 = [var_2 = ... ] expresso; onde var_1, var_2, ... so os identificadores de variveis e expresso uma expresso vlida. Observe que na atribuio mltipla as operaes ocorrem da direita para a esquerda, isto , inicialmente o valor de expresso atribudo a var_2 e depois o valor de var_2 atribudo a var_1. Deve-se tomar cuidado com as converses de tipo e limites de intervalo para atribuies de tipos diferentes. Exemplo: Observe a instruo de atribuio mltipla abaixo: as variveis inteiras i, j e k so todas inicializadas com o valor 1. E as variveis de dupla preciso max e min so inicializadas com o valor 0.0: int i, j, k; double max, min; i = j = k = 1; max = min = 0.0;

Prof. MSc. Wagner Izzo

Pgina 44

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

Programa Exemplo: O arquivo e0301.cpp traz um programa para visualizar alguns aspectos relacionados com o operador de atribuio. 3.2 Operadores Aritmticos Existem cinco operadores aritmticos em C. Cada operador aritmtico est relacionado a uma operao aritmtica elementar: adio, subtrao, multiplicao e diviso. Existe ainda um operador (%) chamado operador de mdulo cujo significado o resto da diviso inteira. Os smbolos dos operadores aritmticos so: Operador + * / % Operao adio. subtrao. multiplicao diviso mdulo (resto da diviso inteira)

Sintaxe: A sintaxe de uma expresso aritmtica : operando operador operando onde operador um dos caracteres mostrados acima e operando uma constante ou um identificador de varivel. Exemplo: Algumas expresses aritmticas:
1+2 a-4.0 b*c valor_1/taxa num%2

No existe em C, como existe em outras linguagens, um operador especfico para a operao de potenciao (ab). Existe, porm, uma funo de biblioteca (pow()) que realiza esta operao. Veja a seo 3.7 adiante. Embora as operaes do C sejam semelhantes as operaes aritmticas usuais da matemtica, alguns detalhes so especficos da linguagem, e devem ser observados.
Prof. MSc. Wagner Izzo Pgina 45

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

3.2.1 Restries de operandos Os operandos dos operadores aritmticos devem ser constantes numricas ou identificadores de variveis numricas. Os operadores +, -, *, / podem operar nmeros de todos os tipos (inteiros ou reais) porm o operador % somente aceita operandos inteiros. Exemplo: Expresses vlidas Expresso
6.4 + 2.1 7 - 2 2.0 * 2.0 6 / 3 47 % 2 5 4.0 2 1

Valor
8.5

Uma restrio ao operador de diviso (/) que o denominador deve ser diferente de zero. Se alguma operao de diviso por zero for realizada o correra um erro de execuo do programa (run-time error), o programa ser abortado e a mensagem divide error ser exibida. Exemplo: A expresso abaixo invlida pois o primeiro operando no um numero inteiro. Expresso 6.4 % 3 Valor invalido!

Podemos contornar o problema do operador inteiro da operao modulo usando o artifcio da converso de tipo (casting) mostrada na seo 2.3.6. Exemplo: Observe o trecho de programa abaixo:
int num; float valor = 13.0; num = valor % 2;
Prof. MSc. Wagner Izzo

// invlido!
Pgina 46

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

num = (int)valor % 2;

// vlido!

Observe que usamos a converso de tipo para que o dado armazenado em valor fosse transformado no tipo int assim a operao mdulo pode ser efetuada. 3.2.2 Converso de tipo O resultado de uma operao aritmtica depende dos tipos dos operandos. Se os operandos so do mesmo tipo o resultado ser do mesmo tipo. Se os operando forem de tipos diferentes ento haver uma converso de tipo tal que o tipo que ocupa menos espao de memria ser convertido para o tipo que ocupa mais espao de memria e o resultado ser deste tipo. Em geral: char int float double Esta uma regra geral, alguns compiladores podem ter outras regras de converso. Exemplo: Observe as converses de tipo abaixo: Expresso
6 + 2.0 7.000000 - 2.0000000000000 2 * 3.000000000000000

Valor
8.0 5.000000000000000 6.000000000000000

Converso
int float float double int double

Observe que estas converses podem gerar resultados surpreendentes para o programador desatento.

Prof. MSc. Wagner Izzo

Pgina 47

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

Exemplo: Observe as expresses abaixo. Assuma que as variveis num_i, num_f, den_i e den_f so inicializadas como:
int num_i = 7 , den_i = 2 ; float num_f = 7.0, den_f = 2.0;

Expresso
num_f / den_f num_f / den_i num_i / den_f num_i / den_i

Valor
3.5 3.5 3.5 3

Operandos
float / float float / int int int / float / int

Resultado
float float float int

Observe que no exemplo acima o valor da ltima expresso 3 e no 3.5. Isto ocorre porque como os dois operandos so tipo int o resultado e convertido para o tipo int e ocorre o truncamento. O truncamento da diviso inteira feito de modo a obter o menor valor absoluto. Em C caracteres so armazenados na memria como nmeros inteiros e por isso operaes aritmticas so permitidas com tipos char. Os valores usados so os correspondentes da tabela ASCII. Exemplo: Observe as expresses abaixo:
Expresso A + 1 A + B A + 32 Valor B a Converso 65 + 1 66

65 + 66 131 65 + 32 97

3.2.3 Precedncia de operadores Quando mais de um operador se encontram em uma expresso aritmtica as operaes so efetuadas uma de cada vez respeitando algumas regras de precedncia: Estas regras de precedncia so as mesmas da matemtica elementar. Os operadores de multiplicao (*), diviso (/) e mdulo (%) tem precedncia sobre os operadores de adio (+) e subtrao (-). Entre operadores de mesma precedncia as operaes so efetuadas da esquerda para a direita. Veja a tabela 3.1.
Prof. MSc. Wagner Izzo Pgina 48

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

Exemplo: efetuadas:
Expresso 1 + 2 - 3

Observe, nas expresses abaixo, o seu valor e a ordem das operaes


Valor 0 9 2 11 Ordem + * * / - + / % * +

24 - 3 * 5 4 - 2 * 6 / 4 + 1 6 / 2 + 11 % 3 * 4

A ordem de precedncia dos operadores pode ser quebrada usando-se parnteses: ( ). Os parnteses so, na verdade, operadores de mais alta precedncia e so executados primeiro. Parnteses internos so executados primeiro que parnteses externos. Exemplo:
Expresso 1 + (2 - 3) (24 - 3) * 5 (4 - 2 * 6) / 4 + 1 6 / ((2 + 11) % 3) * 4

Observe, nas expresses abaixo, o seu valor e a ordem das operaes


Valor 0 105 -1 24 Ordem - + - * * - / + + % / *

efetuadas:

Observe que os operadores e os operandos deste exemplo so os mesmos do exemplo anterior. Os valores, porm, so diferentes pois a ordem de execuo das operaes foi modificada pelo uso dos parnteses. Programa Exemplo: O arquivo e0302.cpp traz um programa para visualizar alguns aspectos relacionados com os operadores aritmticos. 3.3 Operadores de Atribuio Aritmtica Muitas vezes queremos alterar o valor de uma varivel realizando alguma operao aritmtica com ela. Como por exemplo: i = i + 1 ou val = val * 2. Embora seja
Prof. MSc. Wagner Izzo Pgina 49

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

perfeitamente possvel escrever estas instrues, foi desenvolvido na linguagem C uma instruo otimizada com o uso de operadores ditos operadores de atribuio aritmtica. Os smbolos usado so (+=, -=, *=, /= , %=). Deste modo as instrues acima podem ser rescritas como: i += 1 e val *= 2, respectivamente. Sintaxe: A sintaxe da atribuio aritmtica a seguinte:
var += exp; var -= exp; var *= exp; var /= exp; var %= exp;

onde var o identificador da varivel e exp uma expresso vlida. Estas instrues so equivalentes as seguintes:
var = var + exp; var = var - exp; var = var * exp; var = var / exp; var = var % exp;

Exemplo: Observe as atribuies aritmticas abaixo e suas instrues equivalentes:


Atribuio aritmtica i += 1; j -= val; num *= 1 + k; troco /= 10; resto %= 2; Instruo equivalente i = i + 1; j = j - val; num = num * (1 + k); troco = troco / 10; resto = resto % 2;

O operador de atribuio aritmtica tem precedncia menor que os outros operadores at aqui discutidos. Veja a tabela 3.1.

Prof. MSc. Wagner Izzo

Pgina 50

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

Programa Exemplo: O arquivo e0303.cpp traz um programa para visualizar alguns aspectos relacionados com os operadores de atribuio aritmtica. 3.4 Operadores Incrementais Em programao existem instrues muito comuns chamadas de incremento e decremento. Uma instruo de incremento adiciona uma unidade ao contedo de uma varivel. Uma instruo de decremento subtrai uma unidade do contedo de uma varivel. Existem, em C, operadores especficos para realizar as operaes de incremento (++) e decremento (--). Eles so genericamente chamados de operadores incrementais. Sintaxe: A sintaxe dos operadores incrementais a seguinte:
instruo equivalente ++ var var ++ -- var var -var = var + 1 var = var + 1 var = var - 1 var = var - 1

onde var o nome da varivel da qual se quer incrementar ou decrementar um unidade. Observe que existem duas sintaxes possveis para os operadores: pode-se colocar o operador esquerda ou direita da varivel. Nos dois casos o valor da varivel ser incrementado (ou decrementado) de uma unidade. Porm se o operador for colocado esquerda da varivel, o valor da varivel ser incrementado (ou decrementado) antes que a varivel seja usada em alguma outra operao. Caso o operador seja colocado direita da varivel, o valor da varivel ser incrementado (ou decrementado) depois que a varivel for usada em alguma outra operao. Exemplo: Observe o fragmento de cdigo abaixo e note o valor que as variveis recebem aps a execuo da instruo:
valor das variveis int a, b, c, i = 3;
Prof. MSc. Wagner Izzo

// a: ?

b: ?

c: ?

i: 3
Pgina 51

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

a = i++; b = ++i; c = --i;

// a: 3 // a: 3 // a: 3

b: ? b: 5 b: 5

c: ? c: ? c: 4

i: 4 i: 5 i: 4

Os operadores incrementais so bastante usados para o controle de laos de repetio, que sero vistos na seo 5.4. importante que se conhea exatamente o efeito sutil da colocao do operador, pois isto pode enganar o programador inexperiente. Os operadores incrementais tem a mais alta precedncia entre todos, sendo superados apenas pelos parnteses que tem precedncia ainda maior. Veja a tabela 3.1. Programa Exemplo: O arquivo e0304.cpp traz um programa para visualizar alguns aspectos relacionados com os operadores incrementais. 3.5 Operadores Relacionais e Lgicos A chave para a flexibilidade de um algoritmo a tomada de decises atravs da avaliao de condies de controle. Uma condio de controle uma expresso lgica que avaliada como verdadeira ou falsa. Uma expresso lgica construda com operadores relacionais e lgicos. 3.5.1 Operadores relacionais Operadores relacionais verificam a relao de magnitude e igualdade entre dois valores. So seis os operadores relacionais em C:
Operador > < >= <= == != Significado maior que menor que maior ou igual a (no menor que) menor ou igual a (no maior que) igual a no igual a (diferente de)

Sintaxe: A sintaxe das expresses lgicas :


Prof. MSc. Wagner Izzo Pgina 52

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

expresso_1 operador expresso_2 onde expresso_1 e expresso_2 so duas expresses numricas quaisquer, e operador um dos operadores relacionais. Ao contrrio de outras linguagens, em C no existem tipos lgicos, portanto o resultado de uma expresso lgica um valor numrico: uma expresso avaliada verdadeira recebe o valor 1, uma expresso lgica avaliada falsa recebe o valor 0. Se os operandos forem de tipos diferentes haver uma converso de tipo antes da avaliao da expresso. Esta converso de tipo feita de acordo com a regra mostrada na seo 3.2.2. Exemplo: Observe as expresses lgicas abaixo e verifique o resultado de sua avaliao. Admita que i e j so variveis int cujos valores so 5 e -3, respectivamente. As variveis r e s so float com valores 7.3 e 1.7, respectivamente.
Expresso i == 7 r != s i > r 6 >= i i < j s <= 5.9 Valor 0 1 0 1 0 1

Os operadores relacionais de igualdade (== e !=) tem precedncia menor que os de magnitude (>, <, >= e <=). Estes, por sua vez, tem precedncia menor que os operadores aritmticos. Operadores relacionais de mesma precedncia so avaliados da esquerda para a direita. Veja a tabela 3.1.

Prof. MSc. Wagner Izzo

Pgina 53

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

Exemplo: Observe as expresses lgicas abaixo e verifique o resultado de sua avaliao. Admita que m e n so variveis tipo int com valores 4 e 1, respectivamente.
Expresso m + n == 5 m != 2 * n > m 6 >= n < 3 - m m == n <= m > m Valor 1 1 0 0 Ordem de Operao + * <= == > >= > != < !=

3.5.2 Operadores lgicos So trs os operadores lgicos de C: &&, || e !. Estes operadores tem a mesma significao dos operadores lgicos Booleanos AND, OR e NOT. Sintaxe: A sintaxe de uso dos operadores lgicos:
expr_1 && expr_2 expr_1 || expr_2 !expr

onde expr_1 , expr_2 e expr so expresses quaisquer. Observe que os operadores lgicos atuam sobre expresses de quaisquer valores. Para estes operadores todo valor numrico diferente de 0 considerado 1. Exemplo: A seguir mostrado o valor lgico de uma expresso qualquer:
Expresso 0 1 1.0 0.4 -5.2 Valor lgico 0 1 1 1 1

onde expr_1 , expr_2 e expr so expresses quaisquer.

Prof. MSc. Wagner Izzo

Pgina 54

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

O resultado da operao lgica && ser 1 somente se os dois operandos forem 1, caso contrrio o resultado 0. O resultado da operao lgica || ser 0 somente se os dois operandos forem 0, caso contrrio o resultado 1. O resultado da operao lgica ! ser 0 se o operandos for 1, e 1 se o operando for 0. Abaixo mostra-se o resultado das possveis combinaes entre os operandos para cada operador lgico:
Operador &&: op_1 && op_2 op_1 op_2 1 1 0 0 1 0 1 0 Res 1 0 0 0 Operador ||: op_1 || op_2 op_1 op_2 1 1 0 0 1 0 1 0 Res 1 1 1 0

Operador !: !op

op 1 0

Res 0 1

O Operador && tem precedncia sobre o operador ||. Estes dois tm precedncia menor que os operadores relacionais. O operador ! tem a mesma precedncia que os operadores incrementais. Veja a tabela 3.1. Exemplo: Observe as expresses lgicas abaixo e verifique o resultado de sua avaliao. Admita que a, b e c so variveis tipo int com valores 0, 1 e 2, respectivamente.
Expresso a && b c > b || a < c a + b && !c - b !b && c || a Valor 0 1 1 0 > ! ! < + && || && || Ordem de Operao

Prof. MSc. Wagner Izzo

Pgina 55

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

Programa Exemplo: O arquivo e0305.cpp traz um programa para visualizar alguns aspectos relacionados com os operadores lgicos e relacionais. 3.5.3 Operadores lgicos bit-a-bit C prov um nmero de operadores para manipulao de bit. Eles no podem ser usados para float e double. So eles:
& | ^ << >> ~

E bit-a-bit OU inclusivo bit-a-bit OU exclusivo bit-a-bit deslocamento esquerda deslocamento direita complemento de um (unrio)

O operador & frequentemente usado para mascarar (desligar) algum conjunto de bits, por exemplo, a instruo: c = n & 0x007f; (onde c e n so inteiros de 2 bytes) , zera todos os bits de n com exceo dos 7 ltimos. Assim se n=45377 que corresponde a 0xb1c1 o resultado da operao ser: 0x0041.
n
1 0 1 1 0 0 0 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1

0x007f

C (0x0041) 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 O operador | usado para ligar bits: Considere valor=0x5555 uma varivel inteira de 2 bytes e MASC_ON uma macro definida como 0xAAAA . A expresso:
valor = valor | MASC_ON;

Produzir todos os bits ligados em valor. O operador ^ desliga os bits iguais e liga os bits diferentes:
A = 0xf0a5 ^ 0xff00
B1 1 1 0 0 B2 B1 & B2 B1 | B2 1 1 1 0 0 1 1 0 1 0 0 0

resulta em
B1 ^ B2 0 1 1 0

A = 0x0fa5

Prof. MSc. Wagner Izzo

Pgina 56

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

O operador unrio ~ fornece o complemento de um de um inteiro, isto ele converte cada bit 1 em 0 e vice-versa: A = ~0xf0a5 0x0f5a Os operadores de deslocamento << e >>, deslocam esquerda e a direita o seu operando esquerdo, pelo nmero de bits especificados pelo operando direito. Se x = 14:
x >> 1; x << 1;

x=7 (diviso por 2) x=28 (multiplicao por 2)

3.6

Operador Condicional O operador condicional (? :) usado em expresses condicionais. Uma expresso

condicional pode ter dois valores diferentes dependendo de uma condio de controle. Sintaxe: A sintaxe de uma expresso condicional : condio ? expresso_1 : expresso_2 onde expresso_1 e expresso_2 so duas expresses quaisquer, e condio uma expresso lgica que ser avaliada primeiro. Se o valor de condio for 1, isto , verdadeiro, ento a expresso condicional assumir o valor de expresso_1. Caso contrario assumir o valor de expresso_2. Uma expresso condicional equivalente a uma estrutura de deciso simples: se condio ento expressao_1 seno expressao_2 fim se Exemplo: Observe as expresses condicionais abaixo e verifique o resultado de sua avaliao. Admita que i, j e k so variveis tipo int com valores 1, 2 e 3, respectivamente.
Expresso
Prof. MSc. Wagner Izzo

Valor
Pgina 57

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

i ? j : k j > i ? ++k : --k k == i && k != j ? i + j : i - j i > k ? i : k

2 4 -1 3

O operador condicional tem baixa precedncia, precedendo, apenas, aos operadores de atribuio. Veja a tabela 3.1 (tem 3.8). Programa Exemplo: O arquivo e0306.cpp traz um programa para visualizar alguns aspectos relacionados com o operador condicional. 3.7 Funes de biblioteca Uma funo um sub-programa (tambm chamado de rotina). Esta funo recebe informaes, as processa e retorna outra informao. Por exemplo, podemos ter uma funo que receba um valor numrico, calcule seu logaritmo decimal e retorne o valor obtido. Existem dois tipos de funes: funes de biblioteca e funes de usurio. Funes de biblioteca so funes escritas pelos fabricantes do compilador e j esto pr-compiladas, isto , j esto escritas em cdigo de mquina. Funes de usurio so funes escritas pelo programador. Nesta seo trataremos somente das funes de biblioteca, funes de usurio sero vistas no captulo 6. 3.7.1 O uso de funes Antes de usar uma funo preciso saber como a funo esta declarada, isto , quais so os parmetros que a funo recebe e quais so os parmetros que a funo retorna. Estas informaes esto contidas no manual do usurio do compilador ou em sua documentao online. Sintaxe: A sintaxe de declarao de uma funo : tipo_ret nome(tipo_1, tipo_2, ...) onde nome o nome da funo, tipo_1, tipo_2, ... so os tipos (e quantidade) de parmetros de entrada da funo e tipo_ret o tipo de dado de retorno da funo. Alm dos
Prof. MSc. Wagner Izzo Pgina 58

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

tipos usuais vistos na seo 2.3, existe ainda o tipo void (vazio, em ingls) que significa que aquele parmetro inexistente. Exemplo: A funo cos() da biblioteca math.h declarada como:
double cos(double);

Isto significa que a funo tem um parmetro de entrada e um parmetro de sada, ambos so do tipo double. Exemplo: A funo getch() da biblioteca conio.h declarada como:
int getch(void);

Isto significa que a funo no tem parmetros de entrada e tem um parmetro int de sada. Para podermos usar um funo de biblioteca devemos incluir a biblioteca na compilao do programa. Esta incluso feita com o uso da diretiva #include colocada antes do programa principal. Exemplo: Assim podemos usar a funo no seguinte trecho de programa:
#include <math.h> void main(){ double h = 5.0; double co; double alfa = M_PI_4; co = h * cos(alfa); } // incluso de biblioteca // inicio do programa principal // hipotenusa // cateto oposto // angulo: /4 // calculo: uso da funo cos() // fim do programa

As funes tem alta precedncia, sendo mais baixa apenas que os parnteses. A tabela 3.1 mostra as precedncias de todos os operadores estudados neste captulo.

Prof. MSc. Wagner Izzo

Pgina 59

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

3.7.2 As bibliotecas disponveis e algumas funes interessantes A seguir segue uma lista de todas as bibliotecas disponveis no compilador Turbo C++ 3.0 Borland: Ao longo do texto veremos o uso de muitas funes cobrindo uma boa parte destas bibliotecas, porm o leitor que desejar tornar-se "fluente" na linguagem C pode (e deve) estudlas com profundidade.
alloc.h conio.h errno.h graphics.h locale.h setjmp.h stdio.h strstrea.h values.h assert.h ctype.h fcntl.h io.h malloc.h share.h stdiostr.h sys\stat.h bcd.h dir.h float.h iomanip.h math.h signal.h stdlib.h sys\timeb.h bios.h dirent.h fstream.h iostream.h mem.h stdarg.h stream.h sys\types.h complex.h dos.h generic.h limits.h process.h stddef.h string.h time.h

Vejamos algumas funes disponveis nas bibliotecas C. Biblioteca math.h


int abs(int i); double fabs(double d);

Calcula o valor absoluto do inteiro i e do real d, respectivamente.


double sin(double arco); double cos(double arco); double tan(double arco); double asin(double arco); double acos(double arco); double atan(double arco);

Funes trigonometricas do ngulo arco, em radianos.

Prof. MSc. Wagner Izzo

Pgina 60

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

double ceil(double num); double floor(double num);

Funcoes de arredondamento para inteiro. ceil() arredonda para cima. Ex. ceil(3.2) == 3.0; floor() arredonda para baixo. Ex. floor(3.2) == 4.0;
double log(double num); double log10(double num);

Funcoes logaritmicas: log() logaritmo natural (base e), log10() logaritmo decimal (base 10).
double pow(double base, double exp);

Potenciacao: pow(3.2,5.6) = 3.25.6.


double sqrt(double num);

Raiz quadrada: sqrt(9.0) = 3.0.

Biblioteca stdlib.h
int random(int num);

Gera um nmero inteiro aleatrio entre 0 e num - 1. Programa Exemplo: O arquivo e0307.cpp traz um programa para visualizar alguns aspectos relacionados com funes de biblioteca. 3.8 Precedncia entre os operadores do C A tabela 3.1 sumariza as regras de precedncia e de associatividade de todos os operadores em C (inclusive de operadores que ainda veremos mais tarde). Nesta tabela operadores na

Prof. MSc. Wagner Izzo

Pgina 61

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

mesma linha tem a mesma precedncia; as linhas esto em ordem decrescente de precedncia da forma que linhas superiores tem operadores com precedncia maior. Os operadores * . , so usados para acessar membros de estruturas. Os operadores & so os de indireo e endereo, respectivamente. E o operador , separa expresses uma boa prtica o uso de parnteses para compor expresses envolvendo operadores, principalmente para tornar sua visualizao mais clara.

em uma estrutura de controle de loop (todos estes veremos mais adiante).

Categoria
Parnteses funo incremental, lgico aritmtico aritmtico lgico bit a bit relacional relacional endereamento lgico bit a bit lgico bit a bit lgico lgico condicional atribuio separador
<<=

Operadores ( ) [ ]
nome()

Prioridade . &
ED ED ED ED ED

! ~ (cast)

++ sizeof *
* / % + -

<<
< > <=

>>
>=

ED ED ED ED ED ED ED ED ED ED ED
^=

== != &

^ |
&& || ?: = += -= *= /= %= >>= , &= |=

Tabela 3.1: Precedncia dos operadores. Maior precedncia no topo, menor precedncia na base.

A ordem em que argumentos de funes so avaliados, no especificado em C, pode variara de compilador para compilador. O comando abaixo:
printf( %d %d \n,++n, pot(2,n));
Prof. MSc. Wagner Izzo

/* ERRADO */
Pgina 62

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

pode e vai produzir resultados diferentes em mquinas com compiladores diferentes. A soluo escrever:
++n; printf( %d %d \n,n,pot(2,n));

Chamadas de funes, atribuies aninhadas e operadores de incremento e decremento, causam efeitos colaterais alguma varivel mudada como resultado da avaliao de uma expresso:
A[i]=i++;

Como vimos, a escrita de cdigo com dependncia na ordem de avaliao de expresses tambm no uma boa prtica de programao, e devem ser evitadas. Pode-se usar resultados intermedirios em variveis temporrias para assegurar uma seqncia particular.

Prof. MSc. Wagner Izzo

Pgina 63

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

4. Funes de Entrada e Sada


Para que um programa torne-se minimamente funcional preciso que ele receba dados do meio externo (teclado, mouse, portas de comunicao, drives de disco, etc.) e emita o resultado de seu processamento de volta para o meio externo (monitor, impressora, alto-falante, portas de comunicao, drives de disco, etc.). De outro modo: um programa deve trocar informaes com o meio externo. Em C, existem muitas funes pr-definidas que tratam desta troca de informaes. So as funes de entrada e sada do C. Nos exemplos mostrados nos captulos anteriores foram vistas algumas funes de entrada (scanf(), getch()) e algumas funes de sada (printf()). Neste captulo veremos, em detalhe, estas e outras funes de modo a permitir escrever um programa completo em C. Mostraremos, nas duas sees iniciais as mais importantes funes de entrada e sada de dados em C: as funes printf() e scanf(). A partir do estudo destas funes possvel escrever um programa propriamente dito com entrada, processamento e sada de dados. 4.1 Sada formatada: printf() Biblioteca: stdio.h Declarao: int printf (const char* st_contr [, lista_arg]); Propsito: A funo printf() (print formated) imprime dados da lista de argumentos lista_arg formatados de acordo com a string de controle st_contr. Esta funo retorna um valor inteiro representando o nmero de caracteres impressos. Esta funo imprime dados numricos, caracteres e strings. Esta funo dita de sada formatada pois os dados de sada podem ser formatados (alinhados, com nmero de dgitos variveis, etc.). Sintaxe: A string de controle uma mscara que especifica (formata) o que ser impresso e de que maneira ser impresso.
Prof. MSc. Wagner Izzo Pgina 64

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

Exemplo: Observe no exemplo abaixo as instrues de sada formatada e os respectivos resultados.


Instruo printf(Ola, Mundo!); printf(linha 1 \nlinha 2 ); Sada Ola, Mundo! linha 1 linha 2

Observe que na primeira instruo, a sada exatamente igual a string de controle. J na segunda instruo a impresso se deu em duas linhas. Isto se deve ao \n que representa o cdigo ASCII para quebra de linha (veja seo 2.1.3). Nesta mascara possvel reservar espao para o valor de alguma varivel usando especificadores de formato. Um especificador de formato marca o lugar e o formato de impresso das variveis contidas na lista variveis. Deve haver um especificador de formato para cada varivel a ser impressa. Todos os especificadores de formato comeam com um %. Exemplo: Observe no exemplo abaixo as instrues de sada formatada e os respectivos resultados. Admita que idade seja uma varivel int contendo o valor 29 e que tot e din sejam variveis float cujo valores so, respectivamente, 12.3 e 15.0.
Instruo: printf(Tenho %d anos de vida,idade); Sada: Tenho 29 anos de vida Instruo: printf(Total: %f.2 \nDinheiro: %f.2 \nTroco: %f.2,tot,din,din-tot); Sada: Total: 12.30 Dinheiro: 15.00 Troco: 2.70
Prof. MSc. Wagner Izzo Pgina 65

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

Depois do sinal %, seguem-se alguns modificadores, cuja sintaxe a seguinte:


% [flag] [tamanho] [.preciso] tipo [flag] justificao de sada: (Opcional) - justificao esquerda. + converso de sinal (sada sempre com sinal: + ou -) <espao> converso de sinal (sadas negativas com sinal, positivas sem sinal) [tamanho] especificao de tamanho (Opcional) n pelo menos n dgitos sero impressos (dgitos faltantes sero completados por brancos). 0n pelo menos n dgitos sero impressos (dgitos faltantes sero completados por zeros). [.preciso] especificador de preciso, dgitos a direita do ponto decimal. (Opcional) (nada) padro: 6 dgitos para reais. .0 nenhum digito decimal. .n so impressos n dgitos decimais. Tipo caracter de converso de tipo (Requerido) d inteiro decimal o inteiro octal x inteiro hexadecimal f ponto flutuante: [-]dddd.dddd. e ponto flutuante com expoente: [-]d.dddde[+/-]ddd c caracter simples s string

Programa Exemplo: O arquivo e0401.cpp contm um programa que ilustra o uso da funo printf() usando vrias combinaes de strings de controle e especificadores de formato.

Prof. MSc. Wagner Izzo

Pgina 66

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

4.2

Leitura formatada: scanf() Biblioteca: stdio.h Declarao: int scanf(const char* st_contr [, end_var, ...]); Propsito: A funo scanf() (scan formated) permite a entrada de dados numricos,

caracteres e 'strings' e sua respectiva atribuio a variveis cujos endereos so end_var. Esta funo dita de entrada formatada pois os dados de entrada so formatados pela string de controle st_contr. a um determinado tipo de varivel (int, float, char, ...). Sintaxe: O uso da funo scanf() semelhante ao da funo printf(). A funo l da entrada padro (em geral, teclado) uma lista de valores que sero formatados pela string de controle e armazenados nos endereos das variveis da lista. A string de controle formada por um conjunto de especificadores de formato, cuja sintaxe a seguinte:
% [*] [tamanho] tipo

* indicador de supresso (Opcional) <presente> Se o indicador de supresso estiver presente o campo no lido. Este supressor til quando no queremos ler um campo de dado armazenado em arquivo. <ausente> O campo lido normalmente. Tamanho especificador de tamanho(Opcional) n Especifica n como o numero mximo de caracteres para leitura do campo. <ausente> Campo de qualquer tamanho. Tipo define o tipo de dado a ser lido (Requerido) d inteiro decimal (int) f ponto flutuante (float) o inteiro octal (int)

Prof. MSc. Wagner Izzo

Pgina 67

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

x inteiro hexadecimal (int) i inteiro decimal de qualquer formato(int) u inteiro decimal sem sinal (unsigned int) s string (char*) c caracter (char) A lista de variveis o conjunto de (endereos) de variveis para os quais sero passados os dados lidos. Variveis simples devem ser precedidos pelo caracter &. Veja mais sobre endereos na seo 8.2.2. Programa exemplo: O arquivo e0402.cpp contm um programa que ilustra o uso da funo scanf() na leitura de dados. 4.3 Entrada de caracter individual: getchar() Biblioteca: stdio.h Declarao: int getchar(void); Propsito: A funo getchar() (get character) l um caracter individual da entrada padro (em geral, o teclado). Se ocorrer um erro ou uma condio de 'fim-de-arquivo' durante a leitura, a funo retorna o valor da constante simblica EOF (end of file)definida na biblioteca stdio.h. Esta funo permite uma forma eficiente de deteco de finais de arquivos. Esta funo dita line buffered, isto , no retorna valores at que o caracter de controle line feed (\n) seja lido. Este caracter, normalmente, enviado pelo teclado quando a tecla [enter] pressionada. Se forem digitados vrios caracteres, estes ficaro armazenados no buffer de entrada at que a tecla [enter] seja pressionada. Ento, cada chamada da funo getchar() ler um caracter armazenado no buffer. 4.4 Sada de caracter individual: putchar()
Pgina 68

Prof. MSc. Wagner Izzo

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

Biblioteca: stdio.h Declarao: int putchar(int c); Propsito: Esta funo putchar() (put character) imprime um caracter individual c na sada padro (em geral o monitor de vdeo). Programa Exemplo: O programa e0403.cpp mostra o uso das funes getchar() e putchar() em um programa que l caracteres do teclado e os reimprime convertidos para maisculos. 4.5 Leitura de teclado: getch(), getche() Biblioteca: conio.h Declarao: int getch(void);
int getche(void);

Propsito: Estas funes fazem a leitura dos cdigos de teclado. Estes cdigos podem representar teclas de caracteres (A, y, *, 8, etc.), teclas de comandos ( [enter], [delete], [Page
Up], [F1], etc.) ou combinao de teclas ([Alt] + [A], [Shift] + [F1], [Ctrl] + [Page Down], etc.).

Ao ser executada, a funo getch() (get character) aguarda que uma tecla (ou combinao de teclas) seja pressionada, recebe do teclado o cdigo correspondente e retorna este valor. A funo getche()(get character and echoe) tambm escreve na tela, quando possvel, o caracter correspondente. Cdigo ASCII: ao ser pressionada uma tecla correspondente a um caracter ASCII, o teclado envia um cdigo ao 'buffer' de entrada do computador e este cdigo lido. Por exemplo, se a tecla A for pressionada o cdigo 65 ser armazenado no buffer e lido pela funo.

Prof. MSc. Wagner Izzo

Pgina 69

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

Cdigo Especial: ao serem pressionadas certas teclas (ou combinao de teclas) que no correspondem a um caracter ASCII, o teclado envia ao 'buffer' do computador dois cdigos, sendo o primeiro sempre 0. Por exemplo, se a tecla [F1] for pressionada os valores 0 e 59 sero armazenados e a funo deve ser chamada duas vezes para ler os dois cdigos. Programa exemplo: O arquivo e0404.cpp mostra um programa para a leitura de teclado. Este programa usa a funo getch() para reconhecer teclas e combinao de teclas. Programa exemplo: O arquivo e0405.cpp mostra um programa para a leitura de teclado usando a funo getche(). 4.6 Escrita formatada em cores: cprintf() Biblioteca: conio.h Declarao: int cprintf (const char* st_contr [, lista_arg]); Propsito: Esta funo cprintf() (color print formated) permite a sada de dados numricos, caracteres e strings usando cores. O uso da funo cprintf() semelhante a printf()porm permite que a sada seja a cores. Para que a sada seja colorida necessrio definir as cores de fundo e de letra para a impresso antes do uso da funo.
Cores (Modo Texto) Cor Preto Azul Verde Cian Vermelho Magenta Marrom Cinza Claro
Prof. MSc. Wagner Izzo

Constante BLACK BLUE GREEN CYAN RED MAGENTA BROWN LIGHTGRAY

Valor 0 1 2 3 4 5 6 7

Fundo ok ok ok ok ok ok ok ok

Letra ok ok ok ok ok ok ok ok
Pgina 70

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

Cinza Escuro Azul Claro Verde Claro Cian Claro Vermelho Claro Magenta Claro Amarelo Branco Piscante

DARKGRAY LIGHTBLUE LIGHTGREEN LIGHTCYAN LIGHTRED LIGHTMAGENTA YELLOW WHITE BLINK

8 9 10 11 12 13 14 15 128

----------

ok ok ok ok ok ok ok ok ok

Estas definies so feitas pelas funes texcolor() e textbackground() cuja sintaxe :


textcolor(cor_de_letra); textbackground(cor_de_fundo);

onde cor_de_letra e cor_de_fundo so nmeros inteiros referentes as cores da palheta padro (16 cores, modo texto). Estes valores de cor so representadas por constantes simblicas definidas na biblioteca conio.h. Para se usar uma letra piscante deve-se adicionar o valor 128 ao valor da cor de letra. Alguns valores de cor no podem ser usados como cor de fundo. A relao acima mostra as cores, suas constantes simblicas e onde podem ser usadas: Exemplo: O trecho de programa abaixo imprime uma mensagem de alerta em amarelo piscante sobre fundo vermelho.
#include <conio.h> ... textbackground(RED); textcolor(YELLOW + BLINK); cprintf( Alerta: Vrus Detectado! ); ...

Programa Exemplo: O programa do arquivo e0406.cpp mostra todas as combinaes possveis de impresso colorida em modo texto.
Prof. MSc. Wagner Izzo Pgina 71

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

4.7

Sada sonora: sound(), delay(), nosound() Biblioteca: dos.h Declaraes: void sound(unsigned freq);
void delay(unsigned tempo); void nosound(void);

Propsito: A funo sound() ativa o alto-falante do PC com uma freqncia freq (Hz). A funo delay() realiza uma pausa (aguarda intervalo de tempo) de durao tempo (milisegundos). A funo nosound() desativa o alto-falante. Programa Exemplo: O uso destas funes muito simples mas produz resultados interessantes. No arquivo e0407.cpp temos um exemplo do uso de sons em programas. 4.8 Limpeza de tela: clrscr(), clreol() Biblioteca: conio.h Declaraes: void clrscr(void);
void clreol(void);

Propsito: A funo clrscr() (clear screen) limpa a janela de tela e posiciona o cursor na primeira linha e primeira coluna da janela (canto superior esquerdo da janela). A funo clreol() (clear to end of line) limpa uma linha desde a posio do cursor at o final da linha mas no modifica a posio do cursor. Ambas funes preenchem a tela com a cor de fundo definida pela funo textbackground(). 4.9 Posicionamento do cursor: gotoxy() Biblioteca: conio.h Declaraes: void gotoxy(int pos_x, int pos_y);

Prof. MSc. Wagner Izzo

Pgina 72

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

Propsito: Em modo texto padro, a tela dividida em uma janela de 25 linhas e 80 colunas. A funo gotoxy() permite posicionarmos o cursor em qualquer posio
(pos_x,pos_y) da tela. Sendo que a posio (1,1) corresponde ao canto superior esquerdo da

tela e a posio (80,25) corresponde ao canto inferior direito. Como as funes printf() e
cprintf() escrevem a partir da posio do cursor, podemos escrever em qualquer posio da

tela. 4.10 Redimencionamento de janela: window() Biblioteca: conio.h Declaraes: void window(int esq, int sup, int dir, int inf); Propsito: Esta funo permite redefinir a janela de texto. As coordenadas esq e sup definem o canto superior esquerdo da nova janela, enquanto as coordenadas inf e dir definem o canto inferior direito da nova janela. Para reativar a janela padro escreve-se a instruo
window(1,1,80,25). Quando uma janela definida, o texto que ficar fora da janela fica

congelado at que se redefina a janela original. 4.11 Monitorao de teclado: kbhit() Biblioteca: conio.h Declaraes: int kbhit(void); Propsito: Esta funo (keyboard hitting) permite verificar se uma tecla foi pressionada ou no. Esta funo verifica se existe algum cdigo no buffer de teclado. Se houver algum valor, ela retorna um nmero no nulo e o valor armazenado no buffer pode ser lido com as funes getch() ou getche(). Caso nenhuma tecla seja pressionada a funo retorna 0. Observe que, ao contrrio de getch(), esta funo no aguarda que uma tecla seja pressionada.

Prof. MSc. Wagner Izzo

Pgina 73

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

Programa Exemplo: O arquivo e0408.cpp contm um programa para exemplificar o uso das funes clrscr(), clreol(), gotoxy(), window(), kbhit().

Prof. MSc. Wagner Izzo

Pgina 74

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

5. Estruturas de Controle
Estruturas de controle permitem controlar a seqncia das aes lgicas de um programa. Basicamente, existem dois tipos de estruturas de controle: estruturas de repetio e estruturas de deciso. A estrutura de repetio permite que um bloco de instrues seja executado repetidamente uma quantidade controlada de vezes. A estrutura de deciso permite executar um entre dois ou mais blocos de instrues. Neste captulo estudaremos em detalhe as instrues do C que permitem implementar estas estruturas. 5.1 Condio de controle Em todas as estruturas, existe pelo menos uma expresso que faz o controle de qual bloco de instrues ser executado ou quantas vezes ele ser executado: o que chamamos de condio de controle. Uma condio de controle uma expresso lgica ou aritmtica cujo resultado pode ser considerado verdadeiro ou falso. Conforme vimos na seo 3.5, a linguagem C no possui, entretanto, variveis ou constantes lgicas, possui somente expresses numricas, assim quando uma expresso numrica se encontra em uma condio de controle, ela ser considerada falsa se seu valor for igual a zero, e verdadeira se seu valor for diferente de zero. Exemplo: Observe nas condies abaixo, seu valor numrico e seu significado lgico. Considere as variveis int i = 0, j = 3;
condio (i == 0) (i > j) (i) (j) valor numrico 1 0 0 3 significado lgico verdadeiro falso falso verdadeiro

Este fato deve ficar claro pois, nas estruturas que estudaremos neste captulo, quando for dito que uma condio falsa ou verdadeira quer se dizer que seu valor e igual a zero ou diferente de zero.

Prof. MSc. Wagner Izzo

Pgina 75

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

5.2

Estrutura do...while Esta uma estrutura bsica de repetio condicional. Permite a execuo de um bloco de

instrues repetidamente. Sua sintaxe a seguinte: Sintaxe:


do{ bloco }while(condio);

onde: condio uma expresso lgica ou numrica.


bloco um conjunto de instrues.

Esta estrutura faz com que o bloco de instrues seja executado pelo menos uma vez. Aps a execuo do bloco, a condio avaliada. Se a condio verdadeira o bloco executado outra vez, caso contrrio a repetio terminada. O fluxograma desta estrutura mostrada na figura 5.1:

bloco

condio?

Figura 5.1: Fluxograma da estrutura do...while.

Exemplo: No trecho abaixo, a leitura de um nmero feita dentro de um lao de repetio condicional. A leitura repetida caso o nmero lido seja negativo.
do{
Prof. MSc. Wagner Izzo Pgina 76

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

printf("Digite um nmero positivo:"); scanf("%f",&num); }while(num <= 0.0);

Programa exemplo: No arquivo e0501.cpp existe um programa que calcula o fatorial de um nmero. Este programa ilustra o uso da estrutura do...while. 5.3 Estrutura while A estrutura de repetio condicional while semelhante a estrutura do...while. Sua sintaxe a seguinte: Sintaxe:
while(condio){ bloco }

onde: condio uma expresso lgica ou numrica.


bloco um conjunto de instrues.

Esta estrutura faz com que a condio seja avaliada em primeiro lugar. Se a condio verdadeira o bloco executado uma vez e a condio avaliada novamente. Caso a
condio seja falsa a repetio terminada sem a execuo do bloco. Observe que nesta

estrutura, ao contrrio da estrutura do...while, o bloco de instrues pode no ser executado nenhuma vez, basta que a condio seja inicialmente falsa. O fluxograma desta estrutura mostrada na figura 5.2:

Prof. MSc. Wagner Izzo

Pgina 77

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

condio?

bloco

Figura 5.2: Fluxograma da estrutura while.

Exemplo: No trecho abaixo, calcula-se a preciso () do processador aritmtico do PC. A varivel eps tem seu valor dividido por 2 enquanto o processador conseguir distinguir entre 1 e 1+. Aps a execuo do lao, o valor de eps contm a preciso da mquina.
eps = 1.0; while(1.0 + eps > 1.0){ eps /= 2.0; }

Programa exemplo: No arquivo e0502.cpp existe um programa que calcula a raiz quadrada de um nmero real positivo usando o mtodo de Newton. Este programa ilustra o uso da estrutura while. 5.4 Estrutura for A estrutura for muito semelhante as estruturas de repetio vistas anteriormente, entretanto costuma ser utilizada quando se quer um nmero determinado de ciclos. A contagem

Prof. MSc. Wagner Izzo

Pgina 78

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

dos ciclos feita por uma varivel chamada de contador. A estrutura for , as vezes, chamada de estrutura de repetio com contador. Sua sintaxe a seguinte: Sintaxe:
for(inicializao; condio; incremento){ bloco }

onde: inicializao uma expresso de inicializao do contador.


condio uma expresso lgica de controle de repetio. incremento uma expresso de incremento do contador. bloco um conjunto de instrues a ser executado.

Esta estrutura executa um nmero determinado de repeties usando um contador de iteraes. O contador inicializado na expresso de inicializao antes da primeira iterao. Por exemplo: i = 0; ou cont = 20;. Ento o bloco executado e depois de cada iterao, o contador incrementado de acordo com a expresso de incremento. Por exemplo:
i++ ou cont -= 2. Ento a expresso de condio avaliada: se a condio for verdadeira,

o bloco executado novamente e o ciclo recomea, se a condio falsa termina-se o lao. Esta condio , em geral, uma expresso lgica que determina o ultimo valor do contador. Por exemplo: i <= 100 ou cont > 0. Exemplo: No trecho abaixo, o contador i inicializado com o valor 1. O bloco repetido enquanto a condio i <= 10 for verdadeira. nmeros 1, 2, ..., 9, 10.
for(i=1; i<=10; i++){ printf(" %d",i); }

O contador

incrementado com a instruo i++. Esta estrutura, deste modo, imprime os

Prof. MSc. Wagner Izzo

Pgina 79

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

interessante notar que a mesma estrutura lgica pode ser implementada usando as estruturas for ou do...while: Exemplo: As seguintes instrues so plenamente equivalentes:
i = 0; do{ bloco i++; }while(i <= 100); } for(i = 0; i <= 100; i++){ bloco

Podem existir mais de uma expresso de inicializao e de incremento na estrutura for. Estas expresses devem ser separadas por vrgula (,). Mas no pode haver mais de uma expresso de condio. Por exemplo: for(i=0, j=10; i<10; i++, j--){...} Programa exemplo: No arquivo e0503.cpp existe um programa que calcula a amplitude de um conjunto de valores. Este programa exemplifica o uso da estrutura for...

5.5

Estrutura de deciso if...else A estrutura if...else a mais simples estrutura de controle do C. Esta estrutura

permite executar um entre vrios blocos de instrues. O controle de qual bloco ser executado ser dado por uma condio (expresso lgica ou numrica). Esta estrutura pode se apresentar de modos ligeiramente diferentes. Nesta seo vamos apresentar separadamente cada uma das possibilidades de sintaxe. 5.5.1 Deciso de um bloco (if...) A estrutura de deciso de um bloco permite que se execute (ou no) um bloco de instrues conforme o valor de uma condio seja verdadeiro ou falso. O fluxograma desta estrutura mostrada na figura 5.3.

Prof. MSc. Wagner Izzo

Pgina 80

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

condio

bloco

Figura 5.3: Fluxograma da estrutura de deciso if...

Sintaxe: Deciso com um bloco:


if(condio){ bloco }

onde: condio uma expresso lgica ou numrica.


bloco um conjunto de instrues.

Se a condio verdadeira, o bloco executado. Caso contrrio, o bloco no executado. Exemplo: No trecho abaixo, se o valor lido for maior que 10, ento o seu valor redefinido como 10. Observe que o bloco constitui-se de um nica instruo.
printf("Digite o nmero de repeties: (mximo 10)"; scanf("%d",&iter); if(iter > 10){ iter = 10; }

Programa Exemplo: O arquivo e0504.cpp mostra um programa que utiliza a estrutura if... para emitir um sinal sonoro ao imprimir um nmero mltiplo de 4.

Prof. MSc. Wagner Izzo

Pgina 81

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

5.5.2

Deciso de dois blocos (if...else)

Tambm possvel escrever uma estrutura que execute um entre dois blocos de instrues. A figura 5.4 mostra o fluxograma correspondente a esta estrutura de deciso.

condio?

bloco 1

bloco 2

Figura 5.4: Fluxograma da estrutura de deciso if...else

Sintaxe: Deciso de dois blocos:


if(condio){ bloco 1; }else{ bloco 2; }

onde: condio uma expresso lgica ou numrica.


bloco 1 e bloco 2 so conjuntos de instrues.

Se a condio for verdadeira o bloco 1 executado. Caso contrrio, o bloco 2 executado. Exemplo: No trecho abaixo, se o valor de raiz*raiz for maior que num o valor de
raiz ser atribudo a max, caso contrario, ser atribudo a min. if(raiz*raiz > num){ max = raiz; }else{
Prof. MSc. Wagner Izzo Pgina 82

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

min = raiz; }

Programa Exemplo: O arquivo e0505.cpp mostra um programa que utiliza a estrutura if...else para determinar o tipo de razes de uma equao de segundo grau. 5.5.3 Deciso de mltiplos blocos (if...else if...) Tambm possvel escrever uma estrutura que execute um entre mltiplos blocos de instrues. A figura 5.5 mostra o fluxograma correspondente a esta estrutura de deciso.

Condio 1? V bloco 1

Condio 2? V bloco 2

Condio 3? V bloco 3

F ...

...

Figura 5.5: Fluxograma da estrutura de deciso if...else if.

Sintaxe: Deciso de mltiplos blocos:


if(condio 1){ bloco 1;

Prof. MSc. Wagner Izzo

Pgina 83

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

... }else if(condio N){ bloco N; }else{ bloco P }

onde: condio 1, condio 2, ... so expresses lgicas ou numricas.


bloco 1 , bloco 2,... so conjuntos de instrues.

Se a condio 1 for verdadeira o bloco 1 executado. Caso contrario, a condio


2 avaliada. Se a condio 2 for verdadeira o bloco 2 executado. Caso contrario, a condio 3 avaliada e assim sucessivamente. Se nenhuma condio verdadeira bloco P

executado. Observe que apenas um dos blocos executado. Exemplo: No trecho abaixo, uma determinada ao executada se o valor de num for positivo, negativo ou nulo.
if(num > 0){ a = b; }else if(num < 0){ a = b + 1; }else{ a = b - 1; }

Programa Exemplo: O arquivo e0506.cpp mostra um programa que utiliza a estrutura if...else if para determinar se um nmero maior, menor ou igual a outro. 5.6 Estrutura switch...case A estrutura switch...case uma estrutura de deciso que permite a execuo de um conjunto de instrues a partir de pontos diferentes, conforme o resultado de uma expresso inteira de controle. O resultado desta expresso comparado ao valor de cada um dos rtulos, e

Prof. MSc. Wagner Izzo

Pgina 84

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

as instrues so executadas a partir desde rtulo. A figura 5.6 mostra o fluxograma lgico desta estrutura.

expresso

rotulo 1 conjunto 1 rotulo 2

conjunto 2

...

rotulo N

conjunto N rotulo D

conjunto D

Figura 5.6: Fluxograma da estrutura switch...case.

Sintaxe: Esta estrutura possui a seguinte sintaxe:


switch(expresso){ case rtulo_1: conjunto_1 case rtulo_2: conjunto_2 ...
Prof. MSc. Wagner Izzo Pgina 85

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

case rtulo_n: conjunto n [default: conjunto d] }

onde:
expresso uma expresso inteira. rtulo_1,rtulo_2,...rtulo_n e rtulo_d so constantes inteiras. conjunto 1, conjunto 2, ..., conjunto n e conjunto d so

conjuntos de instrues. O valor de expresso avaliado e o fluxo lgico ser desviado para o conjunto cujo
rtulo igual ao resultado da expresso e todas as instrues abaixo deste rtulo sero

executadas. Caso o resultado da expresso for diferente de todos os valores dos rtulos ento
conjunto d executado. Os rtulos devem ser expresses constantes inteiras diferentes entre

si. O rtulo default opcional. Esta estrutura particularmente til quando se tem um conjunto de instrues que se deve executar em ordem, porm se pode comear em pontos diferentes. Exemplo: O trecho abaixo ilustra o uso da instruo switch em um menu de seleo. Neste exemplo, o programa iniciar o processo de usinagem de uma pea em um ponto qualquer dependendo do valor lido.
int seleo; printf("Digite estagio de usinagem:"); scanf("%d",&selecao); switch(seleo){ case 1: // desbaste grosso... case 2: // desbaste fino... case 3:
Prof. MSc. Wagner Izzo Pgina 86

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

// acabamento... case 4: // polimento... }

Programa Exemplo: O arquivo e0507.cpp mostra um programa que utiliza a estrutura switch para determinar o valor de um lanche. 5.7 Interrupo e desvio: break, continue, goto, exit() As instrues vistas anteriormente podem sofrer desvios e interrupes em sua seqncia lgica normal atravs do uso certas instrues. As instrues que veremos a seguir devem ser usadas com muita parcimnia, pois fogem da lgica estruturada tem a tendncia de tornar um programa incompreensvel. 5.7.1 A instruo break. Esta instruo serve para terminar a execuo das instrues de um lao de repetio (for, do...while, while) ou para terminar um conjunto switch...case. Quando em um lao de repetio, esta instruo fora a interrupo do lao independentemente da condio de controle. Exemplo: No trecho abaixo um lao de repetio l valores para o clculo de uma mdia. O lao possui uma condio de controle sempre verdadeira o que, a principio, um erro: lao infinito. Porm, a sada do lao se d pela instruo break que executada quando um valor negativo lido.
puts("digite valores:"); do{ puts("valor:"); scanf("%f",&val); if(val < 0.0){ break; } // sada do lao

Prof. MSc. Wagner Izzo

Pgina 87

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

num++; soma += val; }while(1); // sempre verdadeiro printf("mdia: %f",soma/num);

Exemplo: No exemplo acima, o uso da instruo break poderia ter sido evitado, como segue:
puts("digite valores:"); do{ puts("valor:"); scanf("%f",&val); if(val >= 0.0){ num++; soma += val; } }while(val >= 0.0); printf("mdia: %f",soma/num);

O outro uso da instruo break, em estruturas switch...case, serve para separar os conjuntos de instrues em cada case. Exemplo: Estrutura switch...case com a instruo break:
int tipo; puts("Selecione o sabor de sua pizza:"); puts("Muzzarela Calabreza Alho&Oleo:"); tipo = getch(); switch(tipo){ case M: // prepara pizza muzzarela... break; case C: // prepara pizza calabreza... break;
Prof. MSc. Wagner Izzo Pgina 88

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

case A: // prepara pizza Alho&Oleo... break; default: puts("Opcao incorreta"); }

Programa Exemplo: O arquivo e0508.cpp mostra um programa que utiliza a estrutura switch com a instruo break para simular um piano no teclado do computador. 5.7.2 A instruo continue. Esta instruo opera de modo semelhante a instruo break dentro de um lao de repetio. Quando executada, ela pula as instrues de um lao de repetio sem sair do lao. Isto , a instruo fora a avaliao da condio de controle do lao. Exemplo: No trecho abaixo revemos um lao de repetio l valores para o clculo de uma mdia. Se (val < 0.0) ento o programa salta diretamente para a condio de controle, sem executar o resto das instrues.
puts("digite valores:"); do{ puts("valor:"); scanf("%f",&val); if(val < 0.0){ continue; } num++; soma += val; }while(val >= 0.0); // se (val < 0.0) estas instrues // no so executadas! // ...fim do lao // se val negativo... // ...salta para...

printf("mdia: %f",soma/num);

5.7.3 A instruo goto.

Prof. MSc. Wagner Izzo

Pgina 89

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

Esta instruo chamada de desvio de fluxo. A instruo desvia o programa para um rtulo (posio identificada) no programa. So raros os casos onde a instruo goto necessria, no entanto, h certas circunstncias, onde usada com prudncia, ela pode ser til. Sintaxe: A sintaxe da instruo goto a seguinte:
goto rtulo; ... rtulo: ... onde rtulo um identificador vlido.

Exemplo: No trecho abaixo revemos um lao de repetio l valores para o clculo de uma mdia. Foram usadas duas instrues goto.
puts("digite valores:"); inicio: puts("valor:"); scanf("%f",&val); if(val < 0.0){ goto fim; } num++; soma += val; goto inicio; fim: // se (val < 0.0) estas instrues // no so executadas! // salta para inicio // rtulo // se val negativo... // ...salta para fim // rtulo

printf("mdia: %f",soma/num);

5.7.4 A funo exit(). Esta funo (no instruo) exit() , da biblioteca stdlib.h, uma funo que termina a execuo de um programa. Normalmente um programa terminado quando se executa a ltima sua instruo, porm pode-se terminar a execuo do programa a qualquer momento com o uso desta funo.
Prof. MSc. Wagner Izzo Pgina 90

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

A funo exit() tem a seguinte declarao: void exit(int status). Onde o argumento da funo um valor inteiro que ser passado para o Sistema Operacional: (varivel de sistema errorlevel no DOS). Exemplo: No trecho abaixo revemos um lao de repetio l valores para o clculo de uma mdia. Foi usado a funo exit para terminar a execuo do programa.
puts("digite valores:"); do{ puts("valor:"); scanf("%f",&val); if(val < 0.0){ printf("mdia: %f",soma/num); exit(0); } num++; }while(1); soma += val; // se val negativo... // imprime resultado // termina programa

Prof. MSc. Wagner Izzo

Pgina 91

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

6. Funes
Funes (tambm chamadas de rotinas, ou sub-programas) so a essncia da programao estruturada. Funes so segmentos de programa que executam uma determinada tarefa especfica. J vimos o uso de funes nos captulos anteriores: funes j providenciadas pelas bibliotecas-padro do C (como sqrt(), toupper(), getch() ou putchar()). possvel ao programador, alem disso, escrever suas prprias rotinas. So as chamadas funes de usurio ou rotinas de usurio. Deste modo pode-se segmentar um programa grande em vrios programas menores. Esta segmentao chamada de modularizao e permite que cada segmento seja escrito, testado e revisado individualmente sem alterar o funcionamento do programa como um todo. Permite ainda que um programa seja escrito por vrios programadores ao mesmo tempo, cada um escrevendo um segmento separado. Neste captulo, veremos como escrever funes de usurio em C. 6.1 Estrutura das funes de usurio A estrutura de uma funo de usurio muito semelhante a estrutura dos programas que escrevemos at agora. Uma funo de usurio constitui-se de um bloco de instrues que definem os procedimentos efetuados pela funo, um nome pelo qual a chamamos e uma lista de argumentos passados a funo. Chamamos este conjunto de elementos de definio da funo. Exemplo: o cdigo mostrado abaixo uma funo definida pelo usurio para calcular a mdia aritmtica de dois nmeros reais:
float media2(float a, float b){ float med; med = (a + b) / 2.0; return(med); }

Prof. MSc. Wagner Izzo

Pgina 92

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

No exemplo acima definimos uma funo chamada media2 que recebe dois argumentos tipo float: a e b. A mdia destes dois valores calculada e armazenada na varivel med declarada internamente. A funo retorna, para o programa que a chamou, um valor tambm do tipo float: o valor da varivel med. Este retorno de valor feito pela funo return()que termina a execuo da funo e retorna o valor de med para o programa que a chamou. Depois de definirmos uma funo, podemos us-la dentro de um programa qualquer. Dizemos que estamos fazendo uma chamada a funo. Exemplo: No exemplo abaixo chamamos a funo media2() dentro de um programa principal:
void main(){ float num_1, num_2, med; puts(Digite dois nmeros:); scanf(%f %f, &num_1, &num_2); med = media2(num_1, num_2); } // chamada a funo printf(\nA media destes nmeros e %f, med);

6.2

Definio de funes De modo formal, a sintaxe de uma funo a seguinte:


tipo_de_retorno nome_da_funo(tipo_1 arg_1, tipo_2 arg_2, ...){ [bloco de instrues da funo] }

A primeira linha da funo contm a declarao da funo. Na declarao de uma funo se define o nome da funo, seu tipo de retorno e a lista de argumentos que recebe. Em seguida, dentro de chaves {}, definimos o bloco de instrues da funo. O tipo de retorno da funo especifica qual o tipo de dado retornado pela funo, podendo ser qualquer tipo de dado mostrado na seo 2.3: int, float, etc. Se a funo no retorna nenhum valor para o programa que a chamou devemos definir o retorno como void, ou
Prof. MSc. Wagner Izzo Pgina 93

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

seja um retorno ausente. Se nenhum tipo de retorno for especificado o compilador entender que o retorno ser tipo int. Vale notar que existe apenas um valor de retorno para funes em C. No podemos fazer o retorno de dois ou mais valores como em algumas linguagens (no MatLab:
[media,desvio] = estat(a, b, c, d, e)). Porm isto no um limitao sria pois o

uso de ponteiros (cap. 8) contorna o problema. Por ser um identificador, o nome da funo segue as mesmas regras de definio de identificadores (veja seo 2.2). A lista de argumentos da funo especifica quais so os valores que a funo recebe. As variveis da lista de argumentos so manipuladas normalmente no corpo da funo (veja seo 6.5 adiante). A chamada de uma funo termina com a instruo return() que transfere o controle para o programa chamador da funo. Esta instruo tem duas finalidades: determina o fim lgico da rotina e o valor de retorno da funo. O argumento de return() ser retornado como valor da funo. 6.3 Localizao das funes Existem basicamente duas posies possveis para escrevermos o corpo de uma funo: ou antes ou depois do programa principal. Podemos ainda escrever uma funo no mesmo arquivo do programa principal ou em arquivo separado. 6.3.1 Corpo da funo antes do programa principal (no mesmo arquivo) Quando escrevemos a definio de uma funo antes do programa principal e no mesmo arquivo deste, nenhuma outra instruo necessria. A sintaxe geral para isto a seguinte: Sintaxe: Uma funo escrita antes do programa principal:
tipo nomef(...){ [corpo de funo] } void main(){
Prof. MSc. Wagner Izzo

// definio da funo

// programa principal
Pgina 94

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

... var = nomef(...) ... } // chamada da funo

Exemplo: Funo media2() escrita antes do programa principal.


float media2(float a, float b){ float med; med = (a + b) / 2.0; return(med); } void main(){ float num_1, num_2, med; puts(Digite dois nmeros:); scanf(%f %f, &num_1, &num_2); med = media2(num_1, num_2); } // chamada da funo printf(\nA media destes nmeros e %f, med); // programa principal // funo

Programa exemplo: No arquivo e0601.cpp existe um programa que calcula o maior valor entre dois nmeros digitados. Este programa faz uso da funo max()escrita pelo usurio. 6.3.2 Corpo da funo depois do programa principal (no mesmo arquivo) Quando escrevemos a definio de uma funo depois do programa principal e no mesmo arquivo deste, devemos incluir um prottipo da funo chamada. Um prottipo uma instruo que define o nome da funo, seu tipo de retorno e a quantidade e o tipo dos argumentos da funo. O prottipo de uma funo indica ao compilador quais so os tipos envolvidos. A sintaxe geral para isto a seguinte: Sintaxe: Uma funo escrita depois do programa principal:
void main(){ tipo nomef(...); // programa principal // prottipo da funo

Prof. MSc. Wagner Izzo

Pgina 95

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

... var = nomef(...) ... } tipo nomef(...){ [corpo de funo] } // definio da funo // chamada a funo

Exemplo: Funo media2() escrita depois do programa principal.


void main(){ float media2(float,float); float num_1, num_2, med; puts(Digite dois nmeros:); scanf(%f %f, &num_1, &num_2); med = media2(num_1, num_2); } float media2(float a, float b){ float med; med = (a + b) / 2.0; return(med); } // funo media2() // chamada a funo printf(\nA media destes nmeros e %f, med); // programa principal // prottipo de media2()

Observe que o prottipo de uma funo nada mais que a declarao da funo sem o seu corpo. Observe ainda que na lista de argumentos do prottipo podem ser escritos apenas os tipos dos argumentos. Programa exemplo: No arquivo e0602.cpp existe um programa que calcula o maior valor entre dois nmeros digitados. Este programa faz uso da funo max()escrita pelo usurio. 6.3.3 Corpo da funo escrito em arquivo separado Em C, como em muitas outras linguagens, permitido que o usurio crie uma funo em

Prof. MSc. Wagner Izzo

Pgina 96

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

um arquivo e um programa que a chame em outro arquivo distinto. Esta facilidade permite a criao de bibliotecas de usurio: um conjunto de arquivos contendo funes escritas pelo usurio. Esta possibilidade uma grande vantagem utilizada em larga escala por programadores profissionais. Quando escrevemos a definio de uma funo em arquivo separado do programa principal devemos incluir este arquivo no conjunto de arquivos de compilao do programa principal. Esta incluso feita com a diretiva #include. Esta diretiva, vista nas sees 2.4.2 e 3.7.1, instrui o compilador para incluir na compilao do programa outros arquivos que contem a definio das funes de usurio e de biblioteca.
Sintaxe: A sintaxe de incluso de funes de usurio a seguinte: #include path void main(){ ... var = nomef(...) ... } // chamada a funo // incluso da funo // programa principal

Na diretiva #include, indicamos entre aspas duplas o caminho de localizao do arquivo onde est definida a funo chamada.
Exemplo: A funo media2() est escrita em um arquivo separado. #include c:\tc\userbib\stat.h void main(){ float num_1, num_2, med; puts(Digite dois nmeros:); scanf(%f %f, &num_1, &num_2); med = media2(num_1, num_2); } // chamada a funo printf(\nA media destes nmeros e %f, med); // incluso da funo // programa principal

Prof. MSc. Wagner Izzo

Pgina 97

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

Programa exemplo: No arquivo e0603.cpp existe um programa que calcula o maior valor entre dois nmeros digitados. Este programa faz uso da funo max()escrita pelo usurio no arquivo e0604.cpp. Observao: Um arquivo pode conter a definio de uma ou mais funes. Em geral, quando o arquivo possui apenas uma funo ele nomeado com o mesmo nome da funo e extenso *.cpp ou *.c. Por exemplo, poderamos definir a funo media() no arquivo media.cpp. Quando um arquivo possui a definio de mais de uma funo, ele nomeado com a extenso *.h ou *.lib. Por exemplo: poderamos criar um conjunto de funes estatsticas chamadas media(), dsvpd(),
moda(), max(), min(), etc, definindo-as em um arquivo chamado stat.h.

6.4

Hierarquia de Funes Sempre possvel que um programa principal chame uma funo que por sua vez chame

outra funo... e assim sucessivamente. Quando isto acontece dizemos que a funo chamadora tem hierarquia maior (ou superior) a funo chamada. Ou que a funo chamadora est em um nvel hierrquico superior a funo chamada. Quando isto ocorre, devemos ter o cuidado de definir (ou incluir) as funes em ordem crescente de hierarquia, isto , uma funo chamada escrita antes de uma funo chamadora. Isto se deve ao fato de que o compilador deve conhecer uma funo antes de que chamada seja compilada. Programa exemplo: No arquivo e0605.cpp existe um jogo de jackpot que ilustra o uso de vrias rotinas por um programa principal. Observe tambm que estas funes chamam-se umas as outras.

Prof. MSc. Wagner Izzo

Pgina 98

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

Neste programa exemplo, os nveis hierrquicos das funes podem ser colocados da seguinte maneira:
main() regras() abertura() sorte() plim_plim() roleta() bip() saida() simnao()

imprimec() pinta()

No exemplo acima temos um primeiro nvel onde se encontra a funo main() (o programa principal tambm uma funo) que chama as funes x, y, z. A funo x por sua vez chamas as funes s, r, e t. Observe que neste exemplo os prottipos das funes esto colocados de modo a que as funes de menor hierarquia so escritas antes das funes de maior hierarquia. 6.5 Regra de escopo para variveis A regra de escopo define o mbito de validade de variveis. Em outras palavras define onde as variveis e funes so reconhecidas. Em C, uma varivel s pode ser usada aps ser declarada (ver seo 2.3.2). Isto por que o processador deve reservar um local da memria para armazenar os valores atribudos varivel. Porm o local, do programa, onde uma varivel declarada define ainda seu escopo de validade. Uma varivel pode ser local, global ou formal de acordo com o local de declarao. Variveis Locais: Uma varivel dita local, se for declarada dentro do bloco de uma funo. Uma varivel local tem validade apenas dentro do bloco onde declarada, isto significa que podem ser apenas acessadas e modificadas dentro de um bloco. O espao de memria alocado para esta varivel criado quando a execuo do bloco iniciada e destrudo quando encerrado, assim variveis de mesmo nome mas declaradas em blocos distintos, so para todos os efeitos, variveis distintas.

Prof. MSc. Wagner Izzo

Pgina 99

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

Exemplo: float media2(float a, float b){ float med; med = (a + b) / 2.0; return(med); } void main(){ float num_1, num_2, med; puts(Digite dois nmeros:); scanf(%f %f, &num_1, &num_2); med = media2(num_1, num_2); printf(\nA media destes nmeros e %f, med); }

No exemplo acima, med uma varivel local definida pela funo media(). Outra varivel med tambm definida pela funo main(). Para todos os efeitos estas variveis so distintas. Variveis Formais: Uma varivel formal uma varivel local declarada na lista de parmetros de uma funo. Deste modo, tem validade apenas dentro da funo onde declarada, porm serve de suporte para os valores passados pelas funes. As variaveis formais na declarao da funo e na chamada da funo podem ter nomes distintos. A nica exigncia de que sejam do mesmo tipo. Por serem variveis locais, os valores que uma funo passa para outra no so alterados pela funo chamada. Este tipo de passagem de argumentos chamado de passagem por valor pois os valores das variveis do programa chamador so copiados para as correspondentes variveis da funo chamada. Veremos no capitulo 8 como alterar os valores das variveis do programa chamador. Chamaremos esta passagem de passagem por endereo. No exemplo acima, a e b so parmetros formais declarados na funo media2(). Observe que a funo chamada com os valores de num_1 e num_2. Mesmo que os valores de
Prof. MSc. Wagner Izzo Pgina 100

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

a e b fossem alterados os valores de num_1 e num_2 no seriam alterados.

Variveis Globais: Uma varivel dita global, se for declarada fora do bloco de uma funo. Uma varivel global tem validade no escopo de todas as funes, isto , pode ser acessadas e modificada por qualquer funo. O espao de memria alocado para esta varivel criado no momento de sua declarao e destrudo apenas quando o programa encerrado. Exemplo: Uso de variveis globais.
float a, b, med; void media2(void){ med = (a + b) / 2.0; } void main(){ puts(Digite dois nmeros:); scanf(%f %f, &a, &b); media2(); printf(\nA media destes nmeros e %f, med); }

No exemplo acima, a, b, med so variveis globais definidas fora dos blocos das funes media() e main(). Deste modo ambas as funes tem pleno acesso as variveis, podendo ser acessadas e modificadas por quaisquer uma das funes. Assim no necessrio a passagem de parmetros para a funo. 6.6 Recursividade A recursividade talvez seja a mais importante vantagem das funes em C. Recurso o processo pelo qual uma funo chama a si mesma repetidamente um numero finito de vezes. Este recurso muito til em alguns tipos de algoritmos chamados de algoritmos recursivos. Vejamos um exemplo clssico para esclarecermos o conceito: calculo do fatorial de um nmero. A definio de fatorial :
n! = n . (n-1) . (n-2) . ... . 3 . 2 . 1
Prof. MSc. Wagner Izzo Pgina 101

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

0! = 1

onde n um numero inteiro positivo. Uma propriedade (facilmente verificvel) dos fatoriais que:
n! = n . (n-1)!

Esta propriedade chamada de propriedade recursiva: o fatorial de um numero pode ser calculado atravs do fatorial de seu antecessor. Ora, podemos utilizar esta propriedade para escrevermos uma rotina recursiva para o calculo de fatoriais. Para criarmos uma rotina recursiva, em C, basta criar uma chamada a prpria funo dentro dela mesma, como no exemplo a seguir. Programa exemplo: No arquivo e0606.cpp existe uma rotina recursiva para o calculo de fatoriais. Uma funo recursiva cria a cada chamada um novo conjunto de variveis locais. No existe ganho de velocidade ou espao de memria significativo com o uso de funes recursivas. Teoricamente uma algoritmo recursivo pode ser escrito de forma iterativa e vice-versa. A principal vantagem destes algoritmos que algumas classes de algoritmos [de inteligncia artificial, simulao numrica, busca e ordenao em arvore binaria, etc.] so mais facilmente implementadas com o uso de rotinas recursivas. O estudo deste tipo de algoritmo est, porm, alm do alcance deste texto.

Prof. MSc. Wagner Izzo

Pgina 102

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

7. Vetores
Neste captulo estudaremos o conceito de vetor, sua declarao e uso. Como so usados vetores em argumentos de funes. E, ainda, como trabalhar com vetores de mais de uma dimenso. 7.1 Introduo Em muitas aplicaes queremos trabalhar com conjuntos de dados que so semelhantes em tipo. Por exemplo o conjunto das alturas dos alunos de uma turma, ou um conjunto de seus nomes. Nestes casos, seria conveniente poder colocar estas informaes sob um mesmo conjunto, e poder referenciar cada dado individual deste conjunto por um nmero ndice. Em programao, este tipo de estrutura de dados chamada de vetor (ou array, em ingls) ou, de maneira mais formal estruturas de dados homogneas. Exemplo: A maneira mais simples de entender um vetor atravs da visualizao de um lista, de elementos com um nome coletivo e um ndice de referncia aos valores da lista.
n 0 1 2 3 4 nota 8.4 6.9 4.5 4.6 7.2

Nesta lista, n representa um nmero de referncia e nota o nome do conjunto. Assim podemos dizer que a 2a nota 6.9 ou representar nota[1] = 6.9 Esta no a nica maneira de estruturar conjunto de dados. Tambm podemos organizar dados sob forma de tabelas. Neste caso, cada dado referenciado por dois ndices e dizemos que

Prof. MSc. Wagner Izzo

Pgina 103

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

se trata de um vetor bidimensional (ou matriz)1. Vetores de mais de uma dimenso sero vistos na seo 7.5. 7.2 Declarao e inicializao de vetores

7.2.1 Declarao de vetores Em C, um vetor um conjunto de variveis de um mesmo tipo que possuem um nome identificador e um ndice de referncia. Sintaxe: A sintaxe para a declarao de um vetor a seguinte:
tipo nome[tam];

onde:
tipo o tipo dos elementos do vetor: int, float, double ... nome o nome identificador do vetor. As regras de nomenclatura de vetores so as

mesmas usadas em variveis (seo 2.2.1).


tam o tamanho do vetor, isto , o nmero de elementos que o vetor pode armazenar.

Exemplo: Veja as declaraes seguintes:


int idade[100]; // declara um vetor chamado 'idade' do tipo // 'int' que recebe 100 elementos. float nota[25]; // declara um vetor chamado 'nota' do tipo // 'float' que pode armazenar 25 nmeros. char nome[80]; // declara um vetor chamado 'nome' do tipo // 'char' que pode armazenar 80 caracteres.

Alguns autores preferem chamar todos os tipos de estruturas homogneas, no importando o numero de ndices de referncia (ou dimenses) de vetores. Outros preferem chamar de matrizes. Outros ainda distinguem vetores (uma dimenso) de matrizes (mais de uma dimenso), etc. No vamos entrar no mrito da questo (existem boas justificativas para todas as interpretaes) e, nesta apostila, vamos usar a primeira nomenclatura: toda estrutura homognea de dados ser chamada de vetor.

Prof. MSc. Wagner Izzo

Pgina 104

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

Na declarao de um vetor estamos reservando espao de memria para os elementos de um vetor. A quantidade de memria (em bytes) usada para armazenar um vetor pode ser calculada como:
quantidade de memria = tamanho do tipo * tamanho do vetor

Assim, no exemplo anterior, a quantidade de memria utilizada pelos vetores , respectivamente, 200(2x100), 100(4x25) e 80(80x1) bytes. 7.2.2 Referncia a elementos de vetor Cada elemento do vetor referenciado pelo nome do vetor seguido de um ndice inteiro. O primeiro elemento do vetor tem ndice 0 e o ltimo tem ndice tam-1. O ndice de um vetor deve ser inteiro. Exemplo: Algumas referncias a vetores:
#define MAX 5 int i = 7; float valor[10]; valor[1] = 6.645; valor[MAX] = 3.867; valor[i] = 7.645; valor[random(MAX)] = 2.768; valor[sqrt(MAX)] = 2.705; // NO vlido! // declarao de vetor

7.2.3 Inicializao de vetores Assim como podemos inicializar variveis (por exemplo: int j = 3;), podemos inicializar vetores. Sintaxe: A sintaxe para a inicializao dos elementos de um vetor :
tipo nome[tam] = {lista de valores}; onde:
Prof. MSc. Wagner Izzo Pgina 105

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

lista de valores uma lista, separada por vrgulas, dos valores de cada elemento

do vetor. Exemplo: Veja as inicializaes seguintes. Observe que a inicializao de nota gera o vetor do exemplo do incio desta seo.
int dia[7] = {12,30,14,7,13,15,6}; float nota[5] = {8.4,6.9,4.5,4.6,7.2}; char vogal[5] = {'a, e, i, o, u'};

Opcionalmente, podemos inicializar os elementos do vetor enumerando-os um a um. Exemplo: Observe que estas duas inicializaes so possveis:
int cor_menu[4] = {BLUE,YELLOW,GREEN,GRAY}; ou int cor_menu[4]; cor_menu[0] = BLUE; cor_menu[1] = YELLOW; cor_menu[2] = GREEN; cor_menu[3] = GRAY;

Programa Exemplo: O arquivo e0701.cpp contm um programa que mostra o uso de vetores: declarao, inicializao, leitura e escrita de elementos... 7.3 Tamanho de um vetor e segmentao de memria

7.3.1 Limites Na linguagem C, devemos ter cuidado com os limites de um vetor. Embora na sua declarao, tenhamos definido o tamanho de um vetor, o C no faz nenhum teste de verificao de acesso a um elemento dentro do vetor ou no.

Prof. MSc. Wagner Izzo

Pgina 106

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

Por exemplo se declaramos um vetor como int valor[5], teoricamente s tem sentido usarmos os elementos valor[0], ..., valor[4]. Porm, o C no acusa erro se usarmos
valor[12] em algum lugar do programa. Estes testes de limite devem ser feitos logicamente

dentro do programa. Este fato se deve a maneira como o C trata vetores. A memria do microcomputador um espao (fsico) particionado em pores de 1 byte. Se declaramos um vetor como int
vet[3], estamos reservando 12 bytes (3 segmentos de 4 bytes) de memria para armazenar os

seus elementos. O primeiro segmento ser reservado para vet[0], o segundo segmento para
vet[1] e o terceiro segmento para vet[2]. O segmento inicial chamado de segmento base,

de modo que vet[0] ser localizado no segmento base. Quando acessamos o elemento vet[i], o processador acessa o segmento localizado em base+i. Se i for igual a 2, estamos acessando o segmento base+2 ou vet[2](o ultimo segmento reservado para o vetor). Porm, se i for igual a 7, estamos a acessando segmento base+7 que no foi reservado para os elementos do vetor e que provavelmente est sendo usado por uma outra varivel ou contm informao espria (lixo). Observe que acessar um segmento fora do espao destinado a um vetor pode destruir informaes reservadas de outras variveis. Estes erros so difceis de detectar pois o compilador no gera nenhuma mensagem de erro... A soluo mais adequada sempre avaliar os limites de um vetor antes de manipul-lo. A princpio este fato poderia parecer um defeito da linguagem, mas na verdade trata-se de um recurso muito poderoso do C. Poder manipular sem restries todos os segmentos de memria uma flexibilidade apreciada pelos programadores. Programa Exemplo: O arquivo e0702.cpp contm um programa que mostra o acesso de elementos dentro e fora de um vetor. Note que o compilador no acusa nenhum erro de sintaxe! 7.3.2 Tamanho parametrizado

Prof. MSc. Wagner Izzo

Pgina 107

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

Na linguagem C no possvel, usando a sintaxe descrita acima, declarar um vetor com tamanho varivel. Exemplo: O trecho de cdigo seguinte faz uma declarao errada de vetor.
... int num; puts("Quantos nmeros?"); scanf("%d, &num); float valor[num]; ... // declarao de vetor (errado!)

Mas possvel declarar um vetor com tamanho parametrizado: usando uma constante simblica. Declaramos uma constante simblica (parmetro) com a diretiva #define no cabealho do programa e depois declaramos o vetor com esta constante simblica como tamanho do vetor. Deste modo podemos alterar o nmero de elementos do vetor antes de qualquer compilao do programa. Esta uma maneira simples de administrar o espao de memria usado pelo programa, e tambm testar os limites de um vetor. Programa Exemplo: O arquivo e0703.cpp contm um programa que mostra a declarao de um vetor com tamanho parametrizado. Mostra tambm o uso deste parmetro como teste de limite do vetor. Compile este programa com outros valores para o parmetro MAX e verifique que a execuo do programa alterada automaticamente. No capitulo seguinte, seo 8.5.1, ser vista uma maneira de declararmos um vetor com um nmero varivel de elementos, usando ponteiros. Este tipo de declarao chamada de alocao dinmica de memria. 7.4 Passando Vetores para Funes Vetores, assim como variveis, podem ser usados como argumentos de funes. Vejamos como se declara uma funo que recebe um vetor e como se passa um vetor para uma funo.

Prof. MSc. Wagner Izzo

Pgina 108

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

Sintaxe: Na passagem de vetores para funes usamos a seguinte sintaxe:


nome_da_funo(nome_do_vetor)

onde:
nome_da_funo o nome da funo que se est chamando. nome_do_vetor

o nome do vetor que queremos passar. Indicamos apenas o nome do vetor, sem ndices.

Sintaxe: Na declarao de funes que recebem vetores:


tipo_funo nome_funo(tipo_vetor nome_vetor[]){ ... } onde: tipo_funo o tipo de retorno da funo. nome_funo o nome da funo. tipo_vetor o tipo de elementos do vetor. nome_vetor o nome do vetor. Observe que depois do nome do vetor temos um ndice

vazio [] para indicar que estamos recebendo um vetor. Exemplo: Observe o exemplo abaixo: Na declarao da funo:
float media(float vetor[],float N){ ... } Na chamada da funo: void main(){ float valor[MAX]; // declarao do vetor ... med = media(valor, n); // passagem do vetor para a funo
Prof. MSc. Wagner Izzo Pgina 109

// declarao da funo

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

... }

Programa Exemplo: O arquivo e0704.cpp contm um programa que mostra a passagem de vetores para funes. Ateno: Ao contrrio das variveis comuns, o contedo de um vetor pode ser modificado pela funo chamada. Isto significa que podemos passar um vetor para uma funo e alterar os valores de seus elementos. Isto ocorre porque a passagem de vetores para funes feita de modo especial dito Passagem por endereo. Uma abordagem mais detalhada deste procedimento ser feita no captulo 8 sobre ponteiros. Portanto devemos ter cuidado ao manipularmos os elementos de um vetor dentro de uma funo para no modifica-los por descuido. Programa Exemplo: O arquivo e0705.cpp contm um programa que mostra a modificao de um vetor por uma funo. Neste caso a modificao desejada pois queremos ordenar os elementos do vetor. 7.5 Vetores Multidimensionais Vetores podem ter mais de uma dimenso, isto , mais de um ndice de referncia. Podemos ter vetores de duas, trs, ou mais dimenses. Podemos entender um vetor de duas dimenses (por exemplo) associando-o aos dados de um tabela. Exemplo: Um vetor bidimensional pode ser visualizado atravs de uma tabela.
nota 0 1 2 3 4 0 8.4 6.9 4.5 4.6 7.2 1 7.4 2.7 6.4 8.9 3.6 2 5.7 4.9 8.6 6.3 7.7

Prof. MSc. Wagner Izzo

Pgina 110

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

Nesta tabela representamos as notas de 5 alunos em 3 provas diferentes (matemtica, fsica e qumica, por exemplo). O nome nota o nome do conjunto, assim podemos dizer que a nota do 3o aluno na 2a prova 6.4 ou representar nota[2,1] = 6.4 . 7.5.1 Declarao e inicializao A declarao e inicializao de vetores de mais de uma dimenso feita de modo semelhante aos vetores unidimensionais. Sintaxe: A sintaxe para declarao de vetores multidimensionais :
tipo nome[tam_1][tam_2]...[tam_N]={{lista},{lista},...{lista}};

onde:
tipo o tipo dos elementos do vetor. nome o nome do vetor. [tam_1][tam_2]...[tam_N] o tamanho de cada dimenso do vetor. {{lista},{lista},...{lista}} so as listas de elementos.

Exemplo: vejamos algumas declaraes e inicializaes de vetores de mais de uma dimenso. Observe que a inicializao de nota gera a tabela do exemplo do incio desta seo.
float nota[5][3] = {{8.4,7.4,5.7}, {6.9,2.7,4.9}, {4.5,6.4,8.6}, {4.6,8.9,6.3}, {7.2,3.6,7.7}}; int tabela[2][3][2] = {{{10,15}, {20,25}, {30,35}}, {{40,45}, {50,55}, {60,65}};

Neste exemplo, nota um vetor duas dimenses ([][]). Este vetor composto de 5 vetores de 3 elementos cada. tabela vetor de trs dimenses ([][][]). Este vetor composto de 2 vetores de 3 sub-vetores de 2 elementos cada.
Prof. MSc. Wagner Izzo Pgina 111

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

7.5.2 Passagem de vetores multidimensionais para funes A sintaxe para passagem de vetores multidimensionais para funes semelhante a passagem de vetores unidimensionais: chamamos a funo e passamos o nome do vetor, sem ndices. A nica mudana ocorre na declarao de funes que recebem vetores: Sintaxe: Na declarao de funes que recebem vetores:
tipo_f funo(tipo_v vetor[tam_1][tam_2]...[tam_n]){ ... }

Observe que depois do nome do vetor temos os ndices contendo os tamanhos de cada dimenso do vetor. Exemplo: Observe o exemplo abaixo: Na declarao da funo:
int max(int vetor[5][7],int N, int M){ ... } // declarao da funo

Na chamada da funo:
void main(){ int valor[5][7]; // declarao do vetor ... med = media(valor, n); // passagem do vetor para a funo ... }

Programa Exemplo: O arquivo e0706.cpp contm um programa que mostra a manipulao de vetores bidimensionais: leitura de elementos, escrita, passagem para funes, etc.
Prof. MSc. Wagner Izzo Pgina 112

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

Observaes: Algumas observaes a respeito de vetores multidimensionais podem ser feitas: Do mesmo modo que vetores unidimensionais, os vetores multidimensionais podem ter seus elementos modificados pela funo chamada.
Os ndices dos vetores multidimensionais, tambm comeam em 0. Por exemplo: vet[0][0], o primeiro elemento do vetor.

Prof. MSc. Wagner Izzo

Pgina 113

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

8. Endereos e Ponteiros
Neste captulo veremos a definio e os principais usos de ponteiros. Veremos as operaes fundamentais com ponteiros , a estreita relao de ponteiros, vetores e strings e ainda, a alocao dinmica de memria e, a passagem de funes para funes com o uso de ponteiros. 8.1 Introduo Toda informao (dado armazenado em varivel simples ou vetor) que manipulamos em um programa est armazenado na memria do computador. Cada informao representada por um certo conjunto de bytes (Ver captulo 2). Por exemplo: caracter (char): 1 byte, inteiro (int): 4 bytes, etc. Cada um destes conjuntos de bytes, que chamaremos de bloco, tem um nome e um endereo de localizao especifica na memria. Exemplo: Observe a instruo abaixo:
int num = 17;

ao interpretar esta instruo, o processador pode especificar: Nome da informao: num Tipo de informao: int Tamanho do bloco (nmero de bytes ocupados pela informao): 4 Valor da informao: 17 Endereo da informao (localizao do primeiro byte): 8F6F:FFF2 (hexadecimal) Em geral, interessa ao programador apenas os nomes simblicos que representam as informaes, pois com estes nomes que so realizadas as operaes do seu algoritmo. Porm, ao processador interessa os endereos dos blocos de informao pois com estes endereos que vai trabalhar.
Prof. MSc. Wagner Izzo Pgina 114

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

Programa Exemplo: O arquivo e0801.cpp contm um programa com instrues para inspecionar o endereo de uma varivel, usando o recurso Inspect do Turbo C++. Observe que o endereo mostrado corresponde ao primeiro byte do bloco, mesmo que o bloco ocupe mais de um byte: No caso, um float ocupa um bloco de 4 bytes. 8.2 Ponteiros Ponteiros so variveis que contm endereos. Neste sentido, estas variveis apontam para algum determinado endereo da memria. Em geral, o ponteiro aponta para o endereo de alguma varivel declarada no programa. 8.2.1 Declarao de ponteiros. Quando declaramos um ponteiro, devemos declar-lo com o mesmo tipo (int, char, etc.) do bloco a ser apontado. Por exemplo, se queremos que um ponteiro aponte para uma varivel int (bloco de 4 bytes) devemos declar-lo como int tambm. Sintaxe: A sintaxe da declarao de um ponteiro a seguinte:
tipo_ptr *nome_ptr_1; ou tipo_ptr* nome_ptr_1, nome_ptr_2, ...;

onde:
tipo_ptr : o tipo de bloco para o qual o ponteiro apontar. * : um operador que indica que nome_ptr um ponteiro. nome_ptr_1, nome_ptr_2,...: so os nomes dos ponteiros (os nomes dos ponteiros

obedecem as mesmas regras da seo 2.2.1) Exemplo: Veja as seguintes instrues:


int *p; float* s_1, s_2;
Prof. MSc. Wagner Izzo Pgina 115

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

A primeira instruo declara um ponteiro chamado p que aponta para um inteiro. Este ponteiro aponta para o primeiro endereo de um bloco de dois bytes. Sempre necessrio declarar o tipo do ponteiro. Neste caso dizemos que declaramos um ponteiro tipo int. A segunda instruo declara dois ponteiros (s_1 e s_2) do tipo float. Observe que o * est justaposto ao tipo: assim todos os elementos da lista sero declarados ponteiros. 8.2.2 Operadores & e * Quando trabalhamos com ponteiros, queremos fazer duas coisas basicamente: conhecer endereo de uma varivel; conhecer o contedo de um endereo. Para realizar estas tarefas a linguagem C nos providencia dois operadores especiais:
o operador de endereo: & o operador de contedo: *

O operador de endereo (&) determina o endereo de uma varivel (o primeiro byte do bloco ocupado pela varivel). Por exemplo, &val determina o endereo do bloco ocupado pela varivel val. Esta informao no totalmente nova pois j a usamos antes: na funo scanf(). Exemplo: Quando escreve-se a instruo:
scanf("%d", &num);

estamos nos referindo ao endereo do bloco ocupado pela varivel num. A instruo significa: "leia o buffer do teclado, transforme o valor lido em um valor inteiro (4 bytes) e o armazene no bloco localizado no endereo da varivel num". Exemplo: Para se atribuir a um ponteiro o endereo de uma varivel escreve-se:
int *p, val=5;
Prof. MSc. Wagner Izzo

// declarao de ponteiro e varivel


Pgina 116

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

p = &val;

// atribuio

Observe que o ponteiro p deve ser declarado anteriormente com o mesmo tipo da varivel para a qual ele deve apontar. O operador contedo (*) determina o contedo (valor) do dado armazenado no endereo de um bloco apontado por um ponteiro. Por exemplo, *p determina contedo do bloco apontado pelo ponteiro p. De forma resumida: o operador (*) determina o contedo de um endereo. Exemplo: Para se atribuir a uma varivel o contedo de um endereo escreve-se:
int *p = 0x3f8, val; val = *p; // declarao de ponteiro e varivel // atribuio

Observaes: O operador endereo (&) somente pode ser usado em uma nica varivel. No pode ser usado em expresses como, por exemplo, &(a+b). O operador contedo (*) somente pode ser usado em variveis ponteiros. Programa Exemplo: O arquivo e0802.cpp contm um programa que mostra como se manipulam ponteiros e variveis. Como se transportam informaes entre ponteiros e variveis. 8.3 Operaes elementares com ponteiros Ponteiros so variveis especiais e obedecem a regras especiais. Deste modo, existem uma srie de operaes (aritmticas, lgicas, etc.) envolvendo ponteiros que so permitidas e outras no. A seguir so destacadas algumas operaes que podem ser executadas com ponteiros. A um ponteiro pode ser atribudo o endereo de uma varivel comum. Exemplo: Observe o trecho abaixo:
... int *p; int s;
Prof. MSc. Wagner Izzo Pgina 117

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

p = &s; ...

// p recebe o endereo de s

Um ponteiro pode receber o valor de outro ponteiro, isto , pode receber o endereo apontado por outro ponteiro, desde que os ponteiros sejam de mesmo tipo. Exemplo: Observe o trecho abaixo:
... float *p1, *p2, val; p1 = &val; p2 = p1; // p1 recebe o endereo de val... // ...e p2 recebe o contedo de p2 (endereo de val)

Um ponteiro pode receber um endereo de memria diretamente. Um endereo um numero inteiro. Em geral, na forma hexadecimal (0x....). Nesta atribuio devemos, em geral, forar uma converso de tipo usando casting para o tipo de ponteiro declarado. Exemplo: Observe o trecho abaixo:
... int *p1; float p2; p1 = 0x03F8; ... // endereo da porta serial COM1 p2 = (float)0x0FF6; // casting

A um ponteiro pode ser atribudo o valor nulo usando a constante simblica NULL (declarada na biblioteca stdlib.h). Um ponteiro com valor NULL no aponta para lugar nenhum! Algumas funes a utilizam para registrar uma atribuio ilegal ou sem sucesso (ver funo malloc() adiante) Exemplo: Observe o trecho abaixo:
Prof. MSc. Wagner Izzo Pgina 118

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

#include <stdlib.h> ... char *p; p = NULL; ...

Uma quantidade inteira pode ser adicionada ou subtrada de um ponteiro. A adio de um inteiro n a um ponteiro p far com que ele aponte para o endereo do n-simo bloco seguinte. Exemplo: Observe o trecho abaixo:
... double *p, *q, var; p = &var q = ++p; ... // q aponta para o bloco seguinte ao ocupado por var p = q - 5;// p aponta para o quinto bloco anterior a q

Dois ponteiros podem ser comparados (usando-se operadores lgicos) desde que sejam de mesmo tipo. Exemplo: Observe o trecho abaixo:
... if(px == py){ if(px > py){ if(px != py){ ... // se px aponta para o mesmo bloco que py ... // se px aponta para um bloco posterior a py ... // se px aponta para um bloco diferente de py ...

if(px == NULL) // se px nulo...

Programa Exemplo: O arquivo e0803.cpp contm um programa que mostra como se utilizam algumas operaes elementares com ponteiros com ponteiros.

Prof. MSc. Wagner Izzo

Pgina 119

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

8.4

Ponteiros, endereos e funes Porque usar ponteiros ? A primeira vantagem da utilizao de ponteiros em programas

talvez esteja relacionada a sua utilizao como argumentos de funes. 8.4.1 Passagem de dados por valor ou por referencia No captulo 6 (seo 6.5) afirma-se que o valor de uma varivel var de uma funo
fun_1() passada para uma outra funo fun_2() no podem ser alterado pela funo fun_2(). De fato, isto verdade se passamos o valor da varivel var para a funo fun_2().

Mas o valor de var pode ser alterado por fun_2() passando seu endereo. No primeiro caso, dizemos que a passagem de dados de uma funo para outra ocorreu por valor. No segundo caso, dizemos que houve uma passagem por referncia. Vejamos em detalhe uma definio destes tipos de passagem de dados entre funes: Passagem por Valor: A passagem por valor significa que passamos de uma funo para outra o valor de uma varivel, isto , a funo chamada recebe um cpia do valor da varivel. Assim qualquer alterao deste valor, pela funo chamada, ser uma alterao de uma cpia do valor da varivel. O valor original na funo chamadora no alterado pois o valor original e copia ficam em blocos de memria diferentes. Passagem por Referencia: A passagem por referencia significa que passamos de uma funo para outra o endereo de uma varivel, isto , a funo chamada recebe sua localizao na memria atravs de um ponteiro. Assim qualquer alterao no contedo apontado pelo do ponteiro ser uma alterao no contedo da varivel original. O valor original alterado. Sintaxe: A sintaxe da passagem de endereo a seguinte: na funo chamada:
tipof nomef(tipop nomep){ ...
Prof. MSc. Wagner Izzo Pgina 120

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

onde:
tipof o tipo de retorno da funo. nomef o nome da funo chamada. tipop o tipo do ponteiro (igual ao tipo da varivel passada). nomep o nome do ponteiro.

na funo chamadora:
... nomef(end_var); ...

onde:
nomef o nome da funo chamada. end_var o endereo da varivel passada como argumento.

Exemplo: Observe o exemplo abaixo:


void troca(int *p1, int *p1){ // declarao da funo // int temp; temp = *p1; *p1 = *p2; *p2 = temp; } void main(){ int a,b; scanf("%d %d",&a,&b); troca(&a,&b); printf("%d %d",a,b); } // programa principal // declarao das variveis // leitura das variveis // passagem dos endereos de a e b // imprime valores (trocados!) Observe: ponteiros // varivel temporria // temp recebe o contedo apontado por p1 // o contedo de p1 recebe o contedo de p2 // o contedo de p2 recebe o valor de temp

Prof. MSc. Wagner Izzo

Pgina 121

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

Neste exemplo temos uma funo troca() que troca entre si os valores de duas variveis. Esta funo recebe os endereos das variveis passadas pela funo main(), armazenando-os nos ponteiros p1 e p2. Dentro da funo, troca-se os contedos dos endereos apontados. Programa Exemplo: O arquivo e0804.cpp contm um programa que mostra a diferena entre a passagem de dados por valor e passagem por referencia. 8.4.2 Retorno de dados em funes A passagem por referencia permite que (formalmente) uma funo retorne quantos valores se desejar. Dissemos no captulo 6 (seo 6.2) que uma funo somente pode retornar um valor. Isto continua sendo valido pois o C assim define funes. Porem com o uso de ponteiros pode-se contornar esta situao. Vejamos: Imagine que queremos escrever uma funo stat() com a finalidade de calcular a media aritmtica e o desvio padro de um conjunto de dados. Observe: o retorno destes dados no pode ser via instruo return() pois isto no permitido. A soluo criar (na funo main(), por exemplo) duas variveis para armazenar os valores desejados (med e desvio, por exemplo) e ento passar os endereos destas variveis para a funo stat(). A funo recebe esses endereos e os armazena em ponteiros (pm e pd, por exemplo). Em seguida, faz os clculos necessrios, armazenando-os nos endereos recebidos. Ao trmino da execuo da funo os valores de med e desvio sero atualizados automaticamente. Este recurso bastante utilizado por programadores profissionais. Programa Exemplo: O arquivo e0805.cpp contm um programa que mostra o retorno de vrios dados de uma funo. Na verdade trata-se da passagem de valores por referencia.

Prof. MSc. Wagner Izzo

Pgina 122

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

8.4.3 Ponteiro como argumento de funo Observe que nos exemplos acima, a passagem de endereos foi feita atravs do operador endereo (&). Tambm possvel passar um endereo atravs de um ponteiro j que o contedo de um ponteiro um endereo. Exemplo: Observe o trecho de programa abaixo.
... float *p, x; p = &x; funo(p); // passagem do ponteiro com o endereo de x. ...

Programa Exemplo: O arquivo e0806.cpp contm um programa que mostra a passagem de endereo para uma funo usando um ponteiro. Observe a sintaxe alternativa para a funo scanf()! 8.5 Ponteiros, vetores e strings

8.5.1 Ponteiros e vetores No capitulo 7 foi mostrado que na passagem de vetores para funes especifica-se apenas o nome do vetor e que modificaes nos elementos do vetor dentro da funo chamada alteram os valores do vetor no programa chamador (seo 7.4). Isto se deve ao fato de que, na linguagem C, vetores so intimamente relacionados a ponteiros. Em C, o nome de um vetor tratado como o endereo de seu primeiro elemento. Assim ao se passar o nome de um vetor para uma funo est se passando o endereo do primeiro elemento de um conjunto de endereos de memria. Por exemplo, se vet um vetor, ento vet e &vet[0] representam o mesmo endereo. E mais, podemos acessar o endereo de qualquer elemento do vetor do seguinte modo: &vet[i] e equivalente a (vet + i). Aqui deve-se ressaltar que (vet + i) no

Prof. MSc. Wagner Izzo

Pgina 123

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

representa uma adio aritmtica normal mas o endereo do i-simo elemento do vetor vet (endereo contado a partir do endereo inicial vet[0]). Do mesmo modo que se pode acessar o endereo de cada elemento do vetor por ponteiros, tambm se pode acessar o valor de cada elemento usando ponteiros. Assim vet[i] equivalente a *(vet + i). Aqui se usa o operador contedo (*) aplicado ao endereo do isimo elemento do vetor vet. Programa Exemplo: O arquivo e0807.cpp contm um programa que mostra a equivalncia entre ponteiros e vetores. 8.5.2 Ponteiros e strings Como dissemos, vagamente na seo 2.3.4, uma string um conjunto ordenado de caracteres. Podemos, agora, dizer muito mais: Em C, uma string um vetor unidimensional de elementos caracteres ASCII, sendo o ultimo destes elementos o caracter especial \0. Sintaxe: As duas maneiras mais comuns de declararmos uma string so:
char nome[tam]; ou char *nome;

onde:
nome o nome do vetor de caracteres

tam o tamanho do vetor de caracteres Observe que sendo um vetor, uma string pode ser declarada tambm como um ponteiro. Alias a segunda declarao representa justamente isto. Sabendo isto podemos realizar uma grande variedade de manipulaes com strings e caracteres. Existe uma biblioteca padro C chamada string.h que providencia algumas funes de manipulao de strings muito teis.

Prof. MSc. Wagner Izzo

Pgina 124

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

Programa Exemplo: O arquivo e0808.cpp contm um programa que mostra algumas operaes usando-se strings (vetores e ponteiros). 8.6 Alocao Dinmica de Memria Os elementos de um vetor so armazenados seqencialmente na memria do computador. Na declarao de um vetor, (por exemplo: int vet[10]) dito ao processador reservar (alocar) um certo numero de blocos de memria para armazenamento dos elementos do vetor. Porm, neste modo de declarao, no se pode alocar um numero varivel de elementos (veja seo 7.3.2). A linguagem C permite alocar dinamicamente (em tempo de execuo), blocos de memria usando ponteiros. Dada a intima relao entre ponteiros e vetores, isto significa que podemos declarar dinamicamente vetores de tamanho varivel. Isto desejvel caso queiramos poupar memria, isto , no reservar mais memria que o necessrio para o armazenamento de dados. Para a alocao de memria usamos a funo malloc()(memory allocation) da biblioteca alloc.h. A funo malloc() reserva, seqencialmente, um certo numero de blocos de memria e retorna, para um ponteiro, o endereo do primeiro bloco reservado. Sintaxe: A sintaxe geral usada para a alocao dinmica a seguinte:
pont = (tipo *)malloc(tam);

onde:
pont o nome do ponteiro que recebe o endereo do espao de memria alocado. tipo o tipo do endereo apontado (tipo do ponteiro). tam o tamanho do espao alocado: numero de bytes.

A sintaxe seguinte, porem, mais clara:


pont = (tipo*)malloc(num*sizeof(tipo));

Prof. MSc. Wagner Izzo

Pgina 125

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

onde:
num o numero de elementos que queremos poder armazenar no espao alocado.

Exemplo: Se queremos declarar um vetor chamado vet, tipo int, com num elementos podemos usar o trecho abaixo:
... int *vet; ... // declarao do ponteiro vet = (int*)malloc(num*2); // alocao de num blocos de 2 bytes

ou ainda
... int *vet; // declarao do ponteiro vet = (int*) malloc(num * sizeof(int)); ...

Caso no seja possvel alocar o espao requisitado a funo malloc() retorna a constante simblica NULL. Sintaxe: Para liberar (desalocar) o espao de memria se usa a funo free(), cuja sintaxe a seguinte:
free(pont);

onde: pont o nome do ponteiro que contem o endereo do inicio do espao de memria reservado. Programa Exemplo: O arquivo e0809.cpp contm um programa que mostra como se utiliza a Alocao Dinmica de Memria.

Prof. MSc. Wagner Izzo

Pgina 126

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

8.7

Ponteiros para Funes At agora usamos ponteiros para apontar para endereos de memria onde se

encontravam as variveis (dados). Algumas vezes necessrio apontar para funes, isto , apontar para o endereo de memria que contem o inicio das instrues de uma funo. Quando assim procedemos, dizemos que usaremos ponteiros para funes. 8.7.1 Ponteiros como chamada de funo. Um uso de ponteiros para funes passar uma funo como argumento de outra funo. Mas tambm se pode usar ponteiros para funes ao invs de funes nas chamadas normais de funes. Sintaxe: A sintaxe de declarao de ponteiro para funes a seguinte:
tipo_r (*nome_p)(lista);

onde:
tipo_r o tipo de retorno da funo apontada. nome_p o nome do ponteiro que apontara para a funo. lista a lista de argumentos da funo.

Exemplo: Suponha que temos uma funo declarada como:


float fun(int a, int b){ ... }

o ponteiro correspondente ser:


float (*pt)(int,int);

Observe que o ponteiro para funo deve ser declarado entre parnteses. Observe tambm que o ponteiro e a funo retornam o mesmo tipo de dado e que tem os mesmos argumentos.

Prof. MSc. Wagner Izzo

Pgina 127

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

Sintaxe: Para atribuirmos o endereo de uma funo para um ponteiro usamos a seguinte sintaxe:
pont = &funo;

onde:
pont o nome do ponteiro. funo o nome da funo.

Se um ponteiro contem o endereo de uma funo, ele pode ser usado no lugar da chamada da funo. Exemplo: o trecho de programa abaixo usa um ponteiro para chamar uma funo:
float fun(int a,int b){ ... } void main(void){ float temp; float (*pt)(int,int); pt = &fun; temp = (*pt)(10,20); // eqivale a: temp = fun(10,20); ... }

Programa Exemplo: O arquivo e0810.cpp contm um programa que mostra como se utiliza o ponteiro para funo. 8.7.2 Passando uma funo como argumento de outra funo. Outra utilizao de ponteiros para funes na passagem de uma funo como argumento para outra funo. Para que isso ocorra necessitamos: Na declarao da funo a ser passada:
Prof. MSc. Wagner Izzo Pgina 128

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

i) Nada de especial, apenas a definio normal:


tipo nome_p(lista){ ... }

Exemplo:
float soma(float a,float b){ ... }

Na funo receptora: i) Declarar o ponteiro que recebe a funo passada na lista de argumentos:
tipo nome_r(..., tipo (*pt)(lista), ...){

Exemplo:
float grad(float x, float y, float (*p)(float,float)){

ii) Usar o ponteiro para funes nas chamadas da funo passada:


var = (*pt)(lista);

Exemplo:
valor = (*p)(x,y);

Na funo principal: i) Passar o nome da funo chamada para a funo receptora:


var = nome_g(... , nome_p , ...);

Exemplo:
g = grad(x,y,soma);

Prof. MSc. Wagner Izzo

Pgina 129

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

Programa Exemplo: O arquivo e0811.cpp contm um programa que mostra como se utiliza ponteiros na passagem de funes

Prof. MSc. Wagner Izzo

Pgina 130

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

Apndice A. Exemplo de Cdigos


Existem muitas linguagens de programao. Podemos escrever um algoritmo para resoluo de um problema por intermdio de qualquer linguagem. A seguir mostramos alguns exemplos de trechos de cdigos escritos em algumas linguagens de programao. Exemplo: trecho de um algoritmo escrito em Pseudo-linguagem que recebe um nmero num e escreve a tabuada de 1 a 10 para este valor:
leia num para n de 1 at 10 passo 1 faa tab num * n imprime tab fim faa

Exemplo: trecho do mesmo programa escrito em linguagem C:


scanf(&num); for(n = 1; n <= 10; n++){ tab = num * n; printf(\n %d, tab); };

Exemplo: trecho do mesmo programa escrito em linguagem Basic:


10 input num 20 for n = 1 to 10 step 1 30 let tab = num * n 40 print chr$ (tab) 50 next n

Prof. MSc. Wagner Izzo

Pgina 131

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

Exemplo: trecho do mesmo programa escrito em linguagem Fortran:


read (num); do 1 n = 1:10 tab = num * n write(tab) 10 continue

Exemplo: trecho do mesmo programa escrito em linguagem Assembly para INTEL 8088:
MOV CX,0 IN AX,PORTA MOV DX,AX LABEL: INC CX MOV AX,DX MUL CX OUT AX, PORTA CMP CX,10 JNE LABEL

Prof. MSc. Wagner Izzo

Pgina 132

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

Apndice B. Exerccios de programao

Captulo 4: Funes de Entrada e Sada


4.1 Faa um programa que leia 2 nmeros reais e imprima a mdia aritmtica entre eles. 4.2 Faa um programa escreva na tela o caracter ASCII e o respectivo cdigos hexadecimal de um valor decimal digitado pelo usurio. [Sugesto: Use a funo putchar()para escrever os caracteres]. 4.3 Faa um programa que leia um angulo (em graus) e imprima o valor do seno, coseno e tangente deste angulo. 4.4 Altere o programas 4.2 e 4.3 para que utilizem efeitos de impresso colorida.
3 4.5 O volume de um esfera de raio R V = 4 3 R . Faa um programa que leia um numero R e imprima o volume da esfera correspondente.

4.6 Faa um programa que leia uma frase e rescreva esta frase centralizada no topo da tela.

Captulo 5: Estruturas de Controle


5.1 Faa um programa que leia 3 nmeros e imprima o nmero de maior valor absoluto. 5.2 Faa um programa escreva na tela todos os caracteres ASCII, os respectivos cdigos decimais e hexadecimais. 5.3 Faa um programa que imprima os 10 primeiros nmeros primos. 5.4 Faa um programa que imprima os nmeros mpares no intervalo fechado [a, b] (a e b escolhidos pelo usurio). 5.5 Faa um programa que leia uma frase digitada e imprima um relatrio contendo: o nmero de palavras, o nmero de vogais e o nmero de letras digitadas. 5.6 Altere o programa 4.1 para que o usurio determine a quantidade de nmeros manipulados.

Prof. MSc. Wagner Izzo

Pgina 133

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

5.7 Faa um programa que imprima os N primeiros nmeros da srie de Fibonacci: 1, 1, 2, 3, 5, 8, 13,... A frmula de recorrncia para esta srie ni = ni 1 + ni 2 para i 2 pois n0 = n1 = 1 . 5.8 Altere o programa 5.1 para que o usurio determine a quantidade de nmeros manipulados. 5.9 Altere o programa 5.3 para que o usurio determine a quantidade de nmeros manipulados. 5.10 Faa um programa que leia os trs parmetros a, b, c de uma equao de segundo grau e escreva suas razes (reais ou complexas). 5.11 Faa um programa que execute um proteo de tela do seguinte modo: Ao iniciar o programa, um caracter (ou outro qualquer) percorra a tela em direes aleatrias apagando os caracteres de fundo. Ao se pressionar qualquer tecla o texto de fundo reaparece e o programa termina. Use as funes gettext() e puttext(). 5.12 Faa um programa que pea para o usurio adivinhar um nmero escolhido aleatoriamente entre 1 e 100. Se o usurio digitar um nmero errado, o programa responde o novo intervalo do nmero procurado. Se o usurio acertou o nmero procurado, o programa diz quantos palpites foram dados. Por exemplo: O nmero procurado est entre 1 e 100: Palpite: 45 O nmero procurado est entre 1 e 44: Palpite: 27 O nmero procurado est entre 28 e 44: Palpite: 36 Parabns! Voc acertou o nmero em 3 tentativas. 5.13 Faa um programa que leia um valor inteiro de 0 a 1000 escreva o seu valor por extenso. Por exemplo: Digite valor: 279 Extenso: duzentos e setenta e nove. 5.14 Faa um programa que coloque um caracter no centro da tela e permita o movimentao deste com o uso das setas. 5.15 Implemente um rastro para o caracter do programa 5.14. Sugesto: use os caracteres de preenchimento: 176d, 177d, 178d e 219d. 5.16 Faa um programa que desenhe um janela com bordas (simples ou duplas) em uma posio centralizada da tela. Pinte o interior da janela com alguma cor diferente do fundo da tela. [Sugesto: Use o lao for... para escrever as bordas e a funo clrscr() para pintar o interior da janela].

Captulo 6: Funes

Prof. MSc. Wagner Izzo

Pgina 134

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

6.1 Crie um funo float round(float r) que faa o arredondamento de nmeros reais: Por exemplo: 5 = round(5.4), 7 = round(6.5). 6.2 Crie uma funo int sim_nao(void) que espera o usurio pressionar as teclas [s] ou [n] retornando 1 ou 0 respectivamente. Se o usurio pressionar qualquer outra tecla um som (de advertncia) de 50 Hz por 250 ms emitido. 6.3 Transforme o programa do exerccio 5.16 em uma funo com a seguinte declarao: int borda(esq, sup, dir, inf, corf, corb) onde esq, sup, dir, inf so as posies das bordas, corf, corb as cores do fundo e da borda da janela respectivamente. A funo retorna 1 se houve algum erro na passagem dos parmetros ( esq > dir, por exemplo) e 0 caso contrrio. 6.4 Faa uma funo que determine se trs nmeros a, b, c formam um tringulo ou no. A funo deve ter a seguinte declarao int tringulo(float a, float b, float c) onde o valor de retorno tem o seguinte significado: 0: no forma tringulo, 1: tringulo qualquer, 2: tringulo issceles, 3: tringulo equiltero. 6.5 Faa uma funo que determine se um determinado numero primo ou no. A funo deve ter a seguinte declarao int primo(int N) onde N o valor a ser testado. A funo deve retornar 1 se N primo e 0 caso contrrio. [Sugesto: Altere o programa do exerccio 5.3]. 6.6 Transforme o programa do exerccio 5.7 em uma funo int fib(int n) que retorna o n-simo numero de Fibonacci. 6.7 A mdia elptica2 (ou aritmtico-geomtrica) de dois nmeros positivos a e b [a < b], calculada do seguinte modo: Chamando a n +1 = a n bn e bn +1 = ( a n + bn ) / 2 respectivamente as mdias geomtrica e aritmtica desses nmeros obtemos uma seqncia de nmeros a0, a1, a2, ... e b0, b1, b2, ... tal que a 0 < a1 < a 2 < < b2 < b1 < b0 . O limite desta seqncia m = a = b . Por exemplo: a mdia elptica de 4 e 7 5.5932... Faa uma funo double elip(double a, double b) que calcule a mdia elptica de a e b. [Sugesto: Use um lao while(a < b)...]. 6.8 O maior divisor comum dos inteiros positivos a e b, que abreviamos como mdc(a, b), o maior nmero m tal que m divisor tanto de a quanto de b. Por exemplo: 4 = mdc(20,16), 7 = mdc(21,7). O valor de m pode ser calculado com o seguinte algoritmo recursivo3, de Euclides: se a > b ento mdc(a, b) igual a b se resto(a, b) 0 mdc(b, resto(a, b)) caso contrrio. Faa uma funo recursiva para o clculo do mximo divisor comum de dois nmeros.

Descoberta pelo matemtico alemo Carl F. Gauss. Ver LIMA, E. L., Meu Professor de Matemtica,?, p.123 3 Ver SMITH, J. D. Design and Analysis of Algorithms, Boston: PWS-Kent Pub. Co. 1989 p.272 Prof. MSc. Wagner Izzo Pgina 135

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

6.9 Caso j no tenha feito assim, transforme a funo iterativa do exerccio 6.6 em uma funo recursiva.

Captulo 7: Vetores
7.1 Escreva um programa que leia um vetor de N nmeros inteiros,(N<=100), inverta a ordem dos elementos do vetor e imprima o vetor invertido. Por exemplo o vetor: {1, 3, 5, 7} ter seus elementos invertidos: {7, 5, 3, 1}. Observao: necessrio inverter os elementos do vetor. No basta imprimi-los em ordem inversa! 7.2 Escreva um programa que leia um vetor a de N nmeros reais, (N<=100),e um outro real k e construa e imprima um outro vetor b cujos elementos so os respectivos elementos de a multiplicados por k. Por exemplo: a = {1,2,3}, k = 5, b = {5,10,15}. 7.3 Escreva duas funes: uma que leia um vetor v de n nmeros inteiros, (n<=100), e outra que escreva este vetor. A declarao destas funes devem ser, respectivamente: void le_vet(int v, int n) e void escreve_vet(int v, int n). 7.4 Escreva um programa que leia um vetor gabarito de 10 elementos. Cada elemento de gabarito contem um numero inteiro 1, 2, 3, 4 ou 5 correspondente as opes corretas de uma prova objetiva. Em seguida o programa deve ler um vetor resposta, tambm de 10 elementos inteiros, contendo as respostas de um aluno. O programa deve comparar os dois vetores e escrever o numero de acertos do aluno. 7.5 Escreva uma funo int min_vet(float v[], int n) receba um vetor e retorne o ndice do menor elemento deste vetor. 7.6 Escreva uma funo int remove_dup(float v[], int n) receba um vetor e verifique a existncia de elementos duplicados. Caso no existam elementos duplicados retorne 0. Caso existam, remova estes elementos (deixando apenas um) e retorne o nmero de elementos removidos. 7.7 Escreva uma funo void insert(float v[], int n, float valor, int pos) que faa a insero de valor na posio pos do vetor v, deslocando os demais elementos. 7.8 Transforme o programa do exemplo e0705.cpp em uma funo void ordem(int v, int n) que ordene os elementos de um vetor v de n elementos inteiros. 7.9 Escreva uma funo int merge(float r[], float s[], float v[], int n, int m) receba um vetor r de n elementos e outro vetor s de m elementos e construa um vetor v com os elementos de r e s, ordenado e no duplicado. A funo deve retornar o tamanho do vetor v construdo. Sugesto: Utilize as funes dos exerccios 7.6, 7.7 e 7.8. 7.10 A funo do exerccio 7.9 pode ser entendida como uma funo que retorna a unio entre dois conjuntos. Escreva uma funo int intersec(float r[], float s[], float v[],

Prof. MSc. Wagner Izzo

Pgina 136

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

int n, int m) que construa um vetor v com a interseo entre r e s, ordenados. A funo deve retornar o tamanho do vetor v construdo. 7.11 Escreva uma funo void desordem(int v, int n) que desordene os elementos de um vetor v (no necessariamente ordenado) de n elementos inteiros. Sugesto: use o seguinte algoritmo: para i de n-1 at 0 faa j valor aleatrio entre 0 e i v[i] v[j] fim faa Observao: Esta rotina pode ser usada para simular o processo de embaralhar as cartas de um baralho. 7.12 Escreva uma funo int find(char v[], char t[], int m, int n) que receba um vetor v de m elementos e um vetor t de n elementos (n < m). Esta funo deve verificar a ocorrncia do padro t em v ou no. Se houver, deve retornar a posio inicial da primeira ocorrncia. Por exemplo: se v={As bananas do Panam so bacanas} e p={anas} deve retornar 6. Caso no haja ocorrncia, retorne -1. Observao: Algoritmos como esses so usados em editores de texto4. 7.13 O produto escalar entre dois vetores pode ser definido5 como: e = u v =

u v
i=0 i

, onde ui e vi so

os elementos do vetor. Escreva uma funo float prod_esc(float u, float v, int n) que receba dois vetores u e v de n elementos reais e retorne o valor do produto escalar entre eles. 7.14 O cdigo Morse foi muito usado no tempo do telgrafo para transmitir mensagens. Neste sistema cada smbolo (letra, numero ou sinal de pontuao) enviado por fio em uma serie de pulsos eltricos curtos ou longos (pontos ou traos) conforme a tabela abaixo: a .b -... c -.-. d -.. e . f ..-. g --. h .... i .. j .--k -.l .-.. m -n -. o --p .--. q --.r .-. s ... t u ..v ...w .-x -..y -.-z --.. 1 .---2 ..--3 ...-4 ....5 ..... 6 -.... 7 --... 8 ---.. 9 ----. 0 ----. .-.-.- ? ..--.. , --..-- : ---... Escreva um programa que leia uma frase digitada pelo usurio e emita pelo alto-falante do PC o som correspondente a uma transmisso completa em cdigo Morse. Sugesto: Crie uma tabela cdigo[40][5] em que cada linha represente um sinal contendo os nmeros 1 (ponto), 2 (trao) ou 0 (fim do cdigo). 7.15 Existe um problema famoso no xadrez chamado Problema das 8 damas: consiste em dispor sobre o tabuleiro (de 8 x 8 casas) do jogo um conjunto de 8 damas de tal forma que nenhuma dama fique na mesma linha, coluna ou diagonal que outra. Escreva um programa que calcule pelo menos uma soluo deste problema. Sugesto: crie um vetor tab[8][8] contendo 0 para uma casa vazia e 1
4 5

Ver o algoritmo de Knuth-Morris-Pratt em SMITH (op. Cit.), p 294 Ver SPIEGEL, M. R., Anlise Vetorial, So Paulo: McGraw-Hill. 1976, p. 23. Pgina 137

Prof. MSc. Wagner Izzo

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

para uma casa ocupada. Escreva uma funo que crie as configuraes e outra rotina que teste a soluo. 7.16 As populares calculadoras HP (Hewllet-Packard) usam a notao RPN (Reverse Polish Notation) para o clculo de expresses numricas. Este tipo de notao torna mais fcil o clculo de expresses complexas. Cada valor digitado guardado em uma pilha de dados e cada tecla de operao efetua uma operao entre os ltimos dois valores da pilha. Por exemplo, para efetuar a expresso 2+5*3 digitamos:
[5] (colocamos o primeiro valor na pilha), [enter] [3] (deslocamos 5 para a 2a posio da pilha e colocamos 3 para o 1o valor na pilha), [*] (efetuamos a multiplicao dos dois valores, o valor 15 aparece na 1a posio da pilha), [2] (deslocamos 15 para a 2a posio da pilha e colocamos 3 para o 1o valor na pilha) [+] (adicionamos 2 ao resultado, 17 aparece na 1a posio da pilha).

Escreva um programa que simule uma calculadora RPN de 4 operaes (+,-,*,/) utilizando vetores para representar a pilha de dados. 7.17 Reverse o nome de um antigo jogo de tabuleiro, que pode ser facilmente implementado em um computador: consiste de um tabuleiro de 3x3 casas, com um disco branco ou preto dispostos, inicialmente, de modo aleatrio em cada casa. [1][2][3] [4][5][6] [7][8][9] Ao selecionar uma das casas o jogador reverte a cor do disco daquela casa e de algumas casas vizinhas conforme o esquema acima. O objetivo do jogo reverter todas as casas para uma mesma cor. Escreva um programa que simule o tabuleiro do jogo de Reverse.

Ao pressionar [1] [2] [3] [4] [5] [6] [7] [8] [9]

Reverte: [1],[2] e [4] [2],[1] e [3] [3],[2] e [6] [4],[1] e [7] [5],[2],[4],[6] e [8] [6],[3] e [9] [7],[4] e [8] [8],[7] e [9] [9],[6] e [8]

7.18 Caso j no tenha feito assim, Rescreva o programa do exerccio 7.1 tornando-a recursiva. 7.19 Escreva uma funo que receba duas matrizes de ordem m e construa o produto matricial entre eles.

Captulo 8: Ponteiros

Prof. MSc. Wagner Izzo

Pgina 138

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

8.1 Rescreva a funo round() do exerccio 6.1 para que receba o endereo da varivel a ser arredondada. A nova funo deve ter a seguinte declarao void round(float *r) e deve arredondar o prprio numero passado. 8.2 Escreva uma funo void troca(int *a, int *b) que permuta entre si os valores de a e b. 8.3 Escreva uma funo void stat(float vet, int N, float *med, float *dsvpd) que receba um vetor de nmeros reais vet, seu tamanho N e calcule a mdia aritmtica med e o desvio padro6 dsvpd destes valores. 8.4 Escreva uma funo void extremos(float vet, int N, float *max, float *min) que receba um vetor de nmeros reais vet, seu tamanho N e determine o maior e o menor (max e min) destes valores. 8.5 Rescreva o programa do exemplo 7.1 para que, usando alocao dinmica de memria , construa um vetor de N elementos, sendo N digitado pelo usurio. 8.6 Escreva um programa que, usando alocao dinmica de memria, construa um vetor de N elementos gerados aleatoriamente no intervalo [0,10], sendo N digitado pelo usurio. Em seguida este programa deve chamar a funo remove_dup() do exerccio 7.6. necessria alguma modificao no cdigo desta funo? 8.7 Escreva uma rotina void graf(float a float b, float (*pf)(float)) que recebe um endereo de uma funo no ponteiro pf, os valores de extremos a e b e desenhe o grfico da funo apontado por pf.

Ver GIOVANNI, J. R., BONJORNO, J. R., Matemtica, vol. 3, So Paulo: FTD, s.d. p. 320. Pgina 139

Prof. MSc. Wagner Izzo

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

Apndice C. Tabela ASCII


As tabelas mostradas neste apndice representam os 256 cdigos usados nos computadores da famlia IBM. Esta tabela refere-se ao American Standard Code for Information

Interchange (cdigo padro americano para troca de informaes), que um conjunto de


nmeros representando caracteres ou instrues de controle usados para troca de informaes entre computadores entre si, entre perifricos (teclado, monitor, impressora) e outros dispositivos. Estes cdigos tem tamanho de 1 byte com valores de 00h a FFh (0 a 255 decimal). Podemos dividir estes cdigos em trs conjuntos: controle, padro e estendido. Os primeiros 32 cdigos de 00h at 1Fh (0 a 31 decimal), formam o conjunto de controle ASCII. Estes cdigos so usados para controlar dispositivos, por exemplo uma impressora ou o monitor de vdeo. O cdigo 0Ch (form feed) recebido por ima impressora gera um avano de uma pgina. O cdigo 0Dh (carriage return) enviado pelo teclado quando a tecla ENTER pressionada. Embora exista um padro, alguns poucos dispositivos tratam diferentemente estes cdigos e necessrio consultar o manual para saber exatamente como o equipamento lida com o cdigo. Em alguns casos o cdigo tambm pode representar um caracter imprimvel. Por exemplo o cdigo 01h representa o caracter (happy face). Os 96 cdigos seguintes de 20h a 7Fh (32 a 127 decimal) formam o conjunto padro ASCII. Todos os computadores lidam da mesma forma com estes cdigos. Eles representam os caracteres usados na manipulao de textos: cdigos-fonte, documentos, mensagens de correio eletrnico, etc. So constitudos das letras do alfabeto latino (minsculo e maisculo) e alguns smbolos usuais. Os restantes 128 cdigos de 80h at FFh (128 a 255 decimal) formam o conjunto estendido ASCII. Estes cdigos tambm representam caracteres imprimveis porem cada fabricante decide como e quais smbolos usar. Nesta parte do cdigo esto definidas os caracteres especiais: , , , ...

Prof. MSc. Wagner Izzo

Pgina 140

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

Dec.
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

Hex.
00h 01h 02h 03h 04h 05h 06h 07h 08h 09h 0Ah 0Bh 0Ch 0Dh 0Eh 0Fh 10h 11h 12h 13h 14h 15h 16h 17h 18h 19h 1Ah 1Bh 1Ch 1Dh 1Eh 1Fh NUL SOH STX ETX EOT ENQ ACK BEL BS HT LF VT FF CR SO SI DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS US

Controle
(Null) (Start of Heading) (Start of Text) (End of Text)

(End of Transmision) (Enquiry) (Acknowledge) (Bell) (Backspace) (Horizontal Tab) (Line Feed) (Vertical Tab) (Form Feed) (Carriage Return) (Shift Out) (Shift In) (Data Link Escape) (Device control 1) (Device control 2) (Device control 3) (Device control 4) (Negative Acknowledge) (Synchronous Idle) (End Transmission Block) (Cancel) (End of Media) (Substitute) (Escape) (File Separator) (Group Separator) (Record Separator) (Unit Separator)

Prof. MSc. Wagner Izzo

Pgina 141

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

Caracter
<espao>

Dec.
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61

Hex.
20h 21h 22h 23h 24h 25h 26h 27h 28h 29h 2Ah 2Bh 2Ch 2Dh 2Eh 2Fh 30h 31h 32h 33h 34h 35h 36h 37h 38h 39h 3Ah 3Bh 3Ch 3Dh

Caracter > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [

Dec.
62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91

Hex.
3Eh 3Fh 40h 41h 42h 43h 44h 45h 46h 47h 48h 49h 4Ah 4Bh 4Ch 4Dh 4Eh 4Fh 50h 51h 52h 53h 54h 55h 56h 57h 58h 59h 5Ah 5Bh

Caracter \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y

Dec.
92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121

Hex.
5Ch 5Dh 5Eh 5Fh 60h 61h 62h 63h 64h 65h 66h 67h 68h 69h 6Ah 6Bh 6Ch 6Dh 6Eh 6Fh 70h 71h 72h 73h 74h 75h 76h 77h 78h 79h

! " # $ % & ' ( ) * + , . / 0 1 2 3 4 5 6 7 8 9 : ; < =

Prof. MSc. Wagner Izzo

Pgina 142

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

Caracter z { | } ~
<delete>

Dec.
122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152

Hex.
7Ah 7Bh 7Ch 7Dh 7Eh 7Fh 80h 81h 82h 83h 84h 85h 86h 87h 88h 89h 8Ah 8Bh 8Ch 8Dh 8Eh 8Fh 90h 91h 92h 93h 94h 95h 96h 97h 98h

Caracter

Dec.
153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183

Hex.
99h 9Ah 9Bh 9Ch 9Dh 9Eh 9Fh A0h A1h A2h A3h A4h A5h A6h A7h A8h A9h AAh ABh ACh ADh AEh AFh B0h B1h B2h B3h B4h B5h B6h B7h

Caracter

Dec.
184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214

Hex.
B8h B9h BAh BBh BCh BDh BEh BFh C0h C1h C2h C3h C4h C5h C6h C7h C8h C9h CAh CBh CCh CDh CEh CFh DOh D1h D2h D3h D4h D5h D6h

Prof. MSc. Wagner Izzo

Pgina 143

Instituto Federal de Educao, Cincia e Tecnologia.


Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

Caracter Caracter Caracter

Dec.
215 216 217 218 219 220 221 222 223 224 225 226 227 228

Hex.
D7h D8h D9h DAh DBh DCh DDh DEh DFh E0h E1h E2h E3h E4h

243 244 245 246 247 248 249 250 251 252 253 254 255

F3h F4h F5h F6h F7h F8h F9h FAh FBh FCh FDh FEh FFh

Dec.
229 230 231 232 233 234 235 236 237 238 239 240 241 242

Hex.
E5h E6h E7h E8h E9h EAh EBh ECh EDh EEh EFh F0h F1h F2h

Dec.

Hex.
Pgina 144

Prof. MSc. Wagner Izzo

Instituto Federal de Educao, Cincia e Tecnologia. Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin

7 Tipos Estruturados
Um tipo simples aquele composto de elementos atmicos ou indivisveis (integer, real, boolean, char). Por outro lado um tipo estruturado consiste de uma composio de tipos simples. Vamos considerar, para a disciplina de Algoritmos, que existe somente um tipo estruturado: ARRAY (tambm chamado de VETOR).

Sintaxe
var identificador

integer real Incio .. fim

array

of char boolean

Semntica
Ser criada uma estrutura com um nmero fixo de elementos do tipo base.

Exemplo de declarao de variveis do tipo estruturado:

var notas : array [ 1..4 ] of real; notas


1 2 3 4

Exemplo de utilizao de variveis do tipo estruturado: notas[2] := 4.6; notas[1] := 6.2; notas[3] := 8.1; notas[4] := (notas[1]+ notas[2]+ notas[3])/3;
Disciplina:

Algoritmos e Lgica de Programao

Prof.: Wagner P. Izzo

Pgina 145

Instituto Federal de Educao, Cincia e Tecnologia. Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin
notas
1 6.2 2 4.6 3 8.1 4 6.3

Alguns algoritmos (programas) utilizando estruturas do tipo array. a) Busca simples Busca de um dado em uma tabela (cadeia) de n posies (elementos). O trmino da busca ocorre quando se acha o dado ou quando se percorreu toda a tabela e ele no foi encontrado. b) Busca simples com sentinela Busca de um dado em uma tabela (cadeia) de n posies (elementos). Fsicamente a tabela tem mais uma posio onde se insere o dado procurado. O trmino da busca ocorre quando se acha o dado. Se isto ocorrer na ltima posio da tabela, o dado no pertencia tabela original. c) Busca achar o menor e o maior elemento Busca do menor e do maior elemento em uma tabela (cadeia) de n posies (elementos). d) Ordenao mtodo da bolha Ordenao de uma tabela (cadeia) de n posies (elementos), usando o mtodo da bolha. Este mtodo consiste em se comparar cada elemento com o seguinte e, caso estejam fora de ordem, realiza-se uma troca. Ao chegar no final da cadeia, o processo ser repetido caso tenho havido alguma troca na ltima varredura. e) Ordenao mtodo do menor ou maior Ordenao de uma tabela (cadeia) de n posies (elementos), usando o mtodo do menor ou maior. Este mtodo consiste em se encontrar o menor (ou maior) elemento da cadeia e troca-lo com o elemento inicial (final) da cadeia considerada. Repetir o

Disciplina:

Algoritmos e Lgica de Programao

Prof.: Wagner P. Izzo

Pgina 146

Instituto Federal de Educao, Cincia e Tecnologia. Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin
processo considerando o elemento inicial (final) da tabela como sendo o seguinte (anterior) ao incio (fim) da tabela anteriormente considerada.

f) Busca Binria em tabela ordenada Busca binria em uma tabela (cadeia) de n posies (elementos) ordenada. J que a cadeia ordenada, este mtodo consiste em se comparar o dado com o elemento central. Se forem iguais, termina-se. Seno, repete-se o processo para a metade da cadeia que antecede o termo central, no caso deste elemento ser maior que o dado procurado, ou para a metade que o segue, caso contrrio.

Disciplina:

Algoritmos e Lgica de Programao

Prof.: Wagner P. Izzo

Pgina 147

Instituto Federal de Educao, Cincia e Tecnologia. Rio de Janeiro Campus Avanado Engenheiro Paulo de Frontin Exerccios de Fixao (lista 3)
1) Executando o programa abaixo, diga o que ser escrito pelo mesmo:
Program exercicio01; var n, quadrado: integer; begin n := 10; repeat quadrado := n * n; writeln ( quadrado ); n := n 1; until n=1; end.

2) Executando o programa abaixo, diga o que ser escrito pelo mesmo:


Program exercicio02; var A, Q, termo: integer; begin A := 1; Q := 3; termo := A; repeat writeln ( termo ); termo := termo * Q; until termo >= 2000; end.

3) Fazer um programa que:

Leia um nmero indeterninado de linhas contendo cada uma a idade de um indivduo. A ltima linha que no entrar nos clculos, contm o valor da idade igual a zero.

Calcule e escreva a idade mdia deste grupo de indivduos.

4) Tem-se um conjunto de dados contendo a altura e o sexo (M-masculino, F=feminino) de 50 pessoas. Fazer um programa que calcule e escreva:

A maior e a menor altura do grupo; A mdia de altura das mulheres; O nmero de homens.

Disciplina:

Algoritmos e Lgica de Programao

Prof.: Wagner P. Izzo

Pgina 148