18.04.2013 Views

Fundamentos de Programação 1 - Alcides Maya Tecnologia

Fundamentos de Programação 1 - Alcides Maya Tecnologia

Fundamentos de Programação 1 - Alcides Maya Tecnologia

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

1<br />

<strong>Fundamentos</strong> <strong>de</strong> <strong>Programação</strong><br />

ESCOLA<br />

<strong>Fundamentos</strong><br />

<strong>de</strong> <strong>Programação</strong>


Escola Alci<strong>de</strong>s <strong>Maya</strong> - Primeiro Módulo<br />

2


Sumário<br />

<strong>Fundamentos</strong> <strong>de</strong> <strong>Programação</strong> 1<br />

3<br />

<strong>Fundamentos</strong> <strong>de</strong> <strong>Programação</strong><br />

1 Introdução ....................................................................................................................................... 4<br />

2 Introdução à Linguagem C ............................................................................................................ 4<br />

3 Técnicas Básicas <strong>de</strong> <strong>Programação</strong> ................................................................................................. 8<br />

4 Estruturas <strong>de</strong> Controle – A Tomada <strong>de</strong> Decisões ....................................................................... 30<br />

5 Estruturas <strong>de</strong> Controle – Laços <strong>de</strong> Repetição ............................................................................ 43<br />

6 Estruturas <strong>de</strong> Dados Homogêneas I ............................................................................................ 52<br />

7 Estruturas <strong>de</strong> Dados Homogêneas II........................................................................................... 59<br />

8. <strong>Programação</strong> Estruturada ......................................................................................................... 64


Escola Alci<strong>de</strong>s <strong>Maya</strong> - Primeiro Módulo<br />

1 Introdução<br />

A disciplina <strong>de</strong> <strong>Fundamentos</strong> <strong>de</strong> <strong>Programação</strong> está ligada a <strong>de</strong> Lógica <strong>de</strong> <strong>Programação</strong> e vamos aplicar as<br />

estruturas lógicas utilizando a linguagem C.<br />

C é uma linguagem <strong>de</strong> programação <strong>de</strong> finalida<strong>de</strong> geral. Foi criada por Dennis M. Ritchie e Ken Thompson,<br />

na Bell Laboratories em 1972, e estava associada ao sistema operacional UNIX. A linguagem, entretanto não<br />

está ligada a um sistema operacional, hoje usamos C em DOS, Windows e Linux.<br />

C foi baseada na linguagem B <strong>de</strong> Thompson que era uma evolução da antiga Linguagem BCPL. B foi nomeada<br />

com a primeira letra <strong>de</strong> BCPL e C com a segunda.<br />

C é uma linguagem <strong>de</strong> “baixo nível”, que o <strong>de</strong>ixa especificar todos os <strong>de</strong>talhes em lógica <strong>de</strong> algoritmos para<br />

obter a máxima eficácia do computador. Mas C também é uma linguagem <strong>de</strong> alto nível que po<strong>de</strong> escon<strong>de</strong>r<br />

<strong>de</strong>talhes da arquitetura dos computadores, resultando no aumento da eficiência na programação.<br />

C foi escrita para que o programador possa planejar programas estruturados e modulares. O resultado é<br />

um programa mais legível e documentado. Hoje já po<strong>de</strong>mos programar <strong>de</strong> forma mo<strong>de</strong>rna utilizando a OOP<br />

(<strong>Programação</strong> Orientada para Objetos) e também a <strong>Programação</strong> voltada para Eventos.<br />

o padrão ansI C<br />

O comitê ANSI <strong>de</strong>senvolveu padrões para a linguagem C. Diversas <strong>de</strong>stas modificações tiveram a intenção<br />

<strong>de</strong> aumentar a flexibilida<strong>de</strong> da linguagem, enquanto outras tentaram padronizar características previamente<br />

<strong>de</strong>ixadas a cargo do implementador do compilador.<br />

Anteriormente, o único padrão era o livro: Linguagem <strong>de</strong> <strong>Programação</strong> C, <strong>de</strong> Brian Kernighan e Dennis Ritchie.<br />

Este livro não era específico em alguns <strong>de</strong>talhes da linguagem, o que levou a divergências entre os compiladores.<br />

O padrão ANSI tentou remover essas ambigüida<strong>de</strong>s. Embora algumas das modificações propostas pu<strong>de</strong>ssem<br />

causar problemas para alguns programas escritos anteriormente, elas não afetam muito o código existente. O<br />

padrão ANSI C proporciona uma oportunida<strong>de</strong> melhor para escrever um código C portátil. Entretanto, o padrão<br />

não corrige todas as áreas <strong>de</strong> confusão e, por causa da eficiência da interface da linguagem C, com o hardware<br />

da máquina, muitos programas sempre exigirão algumas revisões quando você os mover para um ambiente<br />

diferente.<br />

2 Introdução à LInguagem C<br />

Vamos agora ver alguns <strong>de</strong>talhes iniciais da linguagem.<br />

Primeiro programa em C<br />

Iniciaremos nosso estudo com um programa simples, que apenas escreve na tela <strong>de</strong> seu computador a frase:<br />

“meu primeiro programa”. Veja, abaixo, como é o programa:<br />

main( )<br />

{<br />

printf (“meu primeiro programa” );<br />

}<br />

Agora algumas consi<strong>de</strong>rações sobre o programa acima:<br />

• Um programa em C consiste <strong>de</strong> uma ou mais funções que especificam o que <strong>de</strong>ve ser feito. No exemplo<br />

acima main( ) é uma função. Qualquer programa em C começa com a função main( ) que marca o ponto inicial<br />

da execução do programa.<br />

• Todas as instruções <strong>de</strong>vem estar <strong>de</strong>ntro das chaves que iniciam e terminam a função, elas têm a mesma<br />

função que o begin e end em Pascal.<br />

4


<strong>Fundamentos</strong> <strong>de</strong> <strong>Programação</strong><br />

• A linha: printf (“Meu primeiro programa”); é uma chamada a função printf, com o argumento “Meu primeiro<br />

programa”, que é uma seqüência <strong>de</strong> caracteres entre aspas “. . . “, chamada <strong>de</strong>: ca<strong>de</strong>ia <strong>de</strong> caracteres, ou também<br />

string. A printf é uma função <strong>de</strong> biblioteca que escreve o argumento na tela do seu computador. Os parênteses<br />

<strong>de</strong>vem estar presentes mesmo quando não há argumentos.<br />

• As instruções C são sempre encerradas por um ponto-e-vírgula (;).<br />

Limpando a tela<br />

Seria interessante você colocar uma função para limpar a tela, antes <strong>de</strong> escrever a mensagem: “Meu primeiro<br />

programa”. Para fazer isto po<strong>de</strong>mos utilizar a função clrscr( ) que serve para este propósito. Veja as alterações<br />

feitas no programa abaixo:<br />

main( )<br />

{<br />

clrscr( );<br />

printf (“meu primeiro programa” );<br />

}<br />

a Função printf( )<br />

A função printf( ) é uma das funções <strong>de</strong> E/S (entrada e saída) que po<strong>de</strong>m ser usadas em C. Ela não faz parte<br />

da <strong>de</strong>finição <strong>de</strong> C, mas todos os sistemas têm uma versão <strong>de</strong> printf( ) implementada.<br />

Os parênteses indicam que estamos em uma função. Entre os parênteses estão as informações que são<br />

passadas pelo programa main( ) para a função printf( ), isto é “Meu primeiro programa”. Esta informação é<br />

chamada <strong>de</strong> argumento.<br />

Quando o programa encontra esta linha, passa o controle para a função printf( ) que imprime na tela do seu<br />

computador “Meu primeiro programa” e, quando encerra a execução, o controle é transferido novamente para a<br />

função main. Vamos ver o próximo exemplo:<br />

main( )<br />

{<br />

clrscr( );<br />

printf(“escola técnica alci<strong>de</strong>s maya\n”);<br />

printf(“estamos na etapa número: 2”);<br />

}<br />

A função printf( ) po<strong>de</strong> ter um ou vários argumentos. Na primeira printf temos o seguinte argumento: “escola<br />

técnica alci<strong>de</strong>s maya\n” on<strong>de</strong> encontramos a string: Escola Técnica Alci<strong>de</strong>s <strong>Maya</strong>, e também os caracteres<br />

“\n”.<br />

Este caractere \n é a notação C para o caractere <strong>de</strong> nova-linha, que provoca o avanço do cursor para o início<br />

da próxima linha. Se você omitir o \n, você verá como resultado as duas string´s escritas em apenas uma linha<br />

na tela.<br />

Além do caractere \n temos outros caracteres que estão na tabela abaixo:<br />

Código Significado<br />

\n Nova linha<br />

\t Tabulação<br />

\b Retrocesso<br />

\” Aspas<br />

\\ Barra<br />

5


Escola Alci<strong>de</strong>s <strong>Maya</strong> - Primeiro Módulo<br />

Formato inteiro <strong>de</strong>cimal<br />

Veja as alterações que fizemos no programa anterior:<br />

main( )<br />

{<br />

clrscr( );<br />

printf(“escola técnica alci<strong>de</strong>s maya\n”);<br />

printf(“estamos na etapa número: %d” , 2);<br />

}<br />

Agora, colocamos dois argumentos na segunda printf: “Estamos na etapa número: %d” , 2<br />

Estes dois argumentos são separados por uma virgula.<br />

A expressão <strong>de</strong> controle po<strong>de</strong> conter caracteres que serão exibidos na tela e códigos <strong>de</strong> formatação que<br />

indicam o formato em que os argumentos <strong>de</strong>vem ser impressos.<br />

No exemplo o código <strong>de</strong> formatação %d solicita a printf( ) imprimir o segundo argumento no formato <strong>de</strong> um<br />

número inteiro <strong>de</strong>cimal.<br />

escrevendo uma string na tela<br />

Além do código <strong>de</strong> formatação <strong>de</strong>cimal (%d), existe outros. No exemplo a seguir veremos o uso do código %s<br />

para escrever na tela uma string.<br />

main( )<br />

{<br />

clrscr( );<br />

printf(“o %s é um dos melhores transportes urbanos”, “metrô”);<br />

}<br />

Vamos agora escrever um programa com mais <strong>de</strong> uma instrução:<br />

main( )<br />

{<br />

clrscr( );<br />

printf(“o %s venceu <strong>de</strong> %d gols <strong>de</strong> diferença contra o time adversário”, “Inter” , 4);<br />

}<br />

Neste exemplo passamos dois argumentos para a função printf o %s do nome do time: “Inter” e o %d da<br />

quantida<strong>de</strong> <strong>de</strong> gols: 4.<br />

Vejamos o próximo exemplo:<br />

main( )<br />

{<br />

clrscr( );<br />

printf(“a letra %c ”, ´x´);<br />

printf(“pronuncia-se %s.”, “xis” );<br />

}<br />

Note que o ´x´ é <strong>de</strong>limitado por aspas simples enquanto que “xis” é <strong>de</strong>limitado por aspas duplas. Isto indica<br />

ao compilador como diferenciar um caractere <strong>de</strong> uma string.<br />

6


<strong>Fundamentos</strong> <strong>de</strong> <strong>Programação</strong><br />

A tabela, a seguir, mostra os códigos para impressão formatada <strong>de</strong> printf( );<br />

Código Significado<br />

%c Caracteres simples<br />

%d Decimal<br />

%f Ponto flutuante<br />

%s String <strong>de</strong> caracteres<br />

%u Decimal sem sinal<br />

%x Hexa<strong>de</strong>cimal<br />

exerCíCIos <strong>de</strong> FIxação<br />

Vamos agora realizar alguns exercícios <strong>de</strong> fixação para sedimentar em nossa mente os conhecimentos<br />

adquiridos:<br />

1. No programa abaixo há alguns problemas, faça as correções necessárias.<br />

main( )<br />

(<br />

clrscr( )<br />

printf(Temos %d aulas no semestre, 33 );<br />

)<br />

2. Qual será o resultado do programa abaixo:<br />

main( )<br />

(<br />

clrscr( )<br />

printf(“as notas escolares são: %d %d %d\n” , 4, 7, 9);<br />

)<br />

3. Neste outro programa o que será apresentado na tela do computador:<br />

main( )<br />

(<br />

clrscr( )<br />

printf(“%s \n %s \n %s” , “escola”, “técnica”,”alci<strong>de</strong>s maya” );<br />

)<br />

4. Faça um programa que contenha uma única instrução e escreva na tela:<br />

Esta é a primeira linha.<br />

Esta já é a segunda linha.<br />

7


Escola Alci<strong>de</strong>s <strong>Maya</strong> - Primeiro Módulo<br />

5. Escreva um programa que escreva na tela:<br />

UM<br />

DOIS<br />

TRES<br />

QUATRO<br />

6. Qual será a impressão obtida na tela por cada uma <strong>de</strong>stas instruções? Assuma que fazem parte <strong>de</strong> um<br />

programa completo.<br />

a) printf (“Boa Tar<strong>de</strong> ! Maria.”);<br />

printf (“Você já lanchou ? \n”);<br />

b) printf(“Escola Técnica\nAlci<strong>de</strong>s <strong>Maya</strong>\n”);<br />

8. Faça um programa que escreva na tela o teu nome, o nome da tua mãe e o nome da tua avó, todos em<br />

linhas diferentes na tela. (Use o \n).<br />

9. Faça um programa que escreva na tela uma mensagem do tipo: “Eu tenho 23 anos”, sendo que a ida<strong>de</strong><br />

<strong>de</strong>verá ser um argumento do tipo inteiro <strong>de</strong>cimal. (Use o %d).<br />

10. Faça um programa que numere as linhas da tela (cada linha com um número).<br />

3 téCnICas BásICas <strong>de</strong> <strong>Programação</strong><br />

A partir <strong>de</strong>ste momento vamos ter um contato direto com a parte pratica da Lógica <strong>de</strong> <strong>Programação</strong>.<br />

Variáveis<br />

O computador possui uma área <strong>de</strong> armazenamento temporária conhecida como memória. A memória do<br />

computador po<strong>de</strong> ser entendida como uma seqüência finita <strong>de</strong> caixas, que num dado momento, guardam algum<br />

tipo <strong>de</strong> informação, como um número, uma letra, uma palavra, uma frase, etc, não importa, basta saber que lá<br />

sempre existe alguma informação.<br />

O computador, para po<strong>de</strong>r trabalhar com algumas <strong>de</strong>stas informações, precisa saber on<strong>de</strong>, na memória, o<br />

dado está localizado.<br />

Fisicamente, cada caixa, ou cada posição <strong>de</strong> memória, possui um en<strong>de</strong>reço, ou seja, um número, que indica<br />

on<strong>de</strong> cada informação está localizada, este número é representado através da notação hexa<strong>de</strong>cimal, tendo o<br />

tamanho <strong>de</strong> quatro, ou mais bytes. Abaixo segue alguns exemplos:<br />

en<strong>de</strong>reço Físico Informação<br />

3000:B712 “João”<br />

2000:12EC 45<br />

3000:0004 ‘J’<br />

Como po<strong>de</strong> ser observado, o en<strong>de</strong>reçamento das posições <strong>de</strong> memória através <strong>de</strong> números hexa<strong>de</strong>cimais é<br />

perfeitamente compreendido pela máquina, mas para nós humanos torna-se uma tarefa complicada.<br />

Pensando nisto, as linguagens <strong>de</strong> computador facilitaram o manuseio, por parte dos programadores, das<br />

posições <strong>de</strong> memória da máquina, permitindo, que, ao invés <strong>de</strong> trabalhar diretamente com o número hexa<strong>de</strong>cimal,<br />

fosse possível dar nomes diferentes a cada posição <strong>de</strong> memória.<br />

Tais nomes seriam <strong>de</strong> livre escolha do programador.<br />

Com este recurso, os programadores ficaram livres dos en<strong>de</strong>reços físicos (números hexa<strong>de</strong>cimais) e passaram<br />

a trabalhar com en<strong>de</strong>reços lógicos (nomes dados pelos próprios programadores).<br />

8


<strong>Fundamentos</strong> <strong>de</strong> <strong>Programação</strong><br />

Desta forma, o exemplo acima, po<strong>de</strong>ria ser alterado para ter o seguinte aspecto:<br />

en<strong>de</strong>reço Físico Informação<br />

Cliente “João”<br />

Ida<strong>de</strong> 45<br />

Inicial ‘J’<br />

Como tínhamos dito, os en<strong>de</strong>reços lógicos são como caixas, que num dado instante guardam algum tipo <strong>de</strong><br />

informação. Mas é importante saber que o conteúdo <strong>de</strong>sta caixa não é algo fixo, permanente, na verda<strong>de</strong>, uma<br />

caixa po<strong>de</strong> conter diversas informações, ou seja, como no exemplo acima, a caixa (en<strong>de</strong>reço lógico) rotulada <strong>de</strong><br />

“Cliente” num dado momento contém a informação “João”, mas em um outro momento, po<strong>de</strong>rá conter uma outra<br />

informação, por exemplo “Pedro”.<br />

Com isto queremos dizer que o conteúdo <strong>de</strong>stas caixas (en<strong>de</strong>reço lógico) po<strong>de</strong>m variar, isto é, po<strong>de</strong>m sofrer<br />

alterações em seu conteúdo.<br />

Tendo este conceito em mente, a partir <strong>de</strong> agora iremos chamar as caixas ou en<strong>de</strong>reços lógicos, <strong>de</strong><br />

Variáveis.<br />

Desta forma po<strong>de</strong>mos dizer que uma variável é uma posição <strong>de</strong> memória representada por um Nome simbólico<br />

(atribuído pelo programador), a qual contém, num dado instante uma informação.<br />

Variáveis na linguagem C<br />

Uma variável em C é um espaço <strong>de</strong> memória reservado para armazenar um certo tipo <strong>de</strong> dado com um nome<br />

para referenciar o seu conteúdo.<br />

Em um programa a variável po<strong>de</strong>rá conter um valor em um <strong>de</strong>terminado momento e um outro valor em outro<br />

momento. Veja o programa a seguir:<br />

main( )<br />

{<br />

int num;<br />

num = 2;<br />

printf(“este é o número: %d \n” , num);<br />

num = 5 + 10;<br />

printf(“este é o número: %d \n” , num);<br />

}<br />

Agora algumas consi<strong>de</strong>rações sobre o programa acima:<br />

• Na linha int num; é a <strong>de</strong>claração da variável, que tem nome: num e tipo: int, ou seja, irá armazenar valores<br />

numéricos inteiros.<br />

• Na linha num = 2; estamos atribuindo a variável o valor 2 (dois), portanto o en<strong>de</strong>reço <strong>de</strong> memória<br />

i<strong>de</strong>ntificado como num contém neste instante o número 2 (dois).<br />

• Na linha printf(“Este é o número: %d \n” , num); estamos apresentado o conteúdo <strong>de</strong>sta variável.<br />

• Na linha num = 5 + 10; estamos efetuando um cálculo e atribuindo a variável o resultado <strong>de</strong>ste cálculo,<br />

portanto a variável num contém neste instante o número 15 (quinze).<br />

• Na linha printf(“Este é o número: %d \n” , num); estamos apresentando o conteúdo <strong>de</strong>sta variável.<br />

9


Escola Alci<strong>de</strong>s <strong>Maya</strong> - Primeiro Módulo<br />

nomes das variáveis<br />

Para nomearmos variáveis, geralmente, seguimos algumas regras, que, conforme o livro Linguagem <strong>de</strong><br />

<strong>Programação</strong> C, <strong>de</strong> Brian Kernighan e Dennis Ritchie, elas seriam as seguintes:<br />

• Os nomes das variáveis são construídos com letras e dígitos.<br />

• O primeiro caractere <strong>de</strong>ve ser uma letra.<br />

• O caractere <strong>de</strong> sublinha “_” vale como uma letra; ele é útil para aumentar a clareza <strong>de</strong> nomes muito longos<br />

<strong>de</strong> variáveis. Exemplo: data_<strong>de</strong>_nascimento.<br />

• Letras em maiúsculo e minúsculo são diferentes; uma prática tradicional em C é <strong>de</strong> usar letras minúsculas<br />

para vaiáveis. CASA, Casa, casa, representam variáveis diferentes.<br />

• Somente os primeiros oito caracteres <strong>de</strong> um nome interno são significativos, embora mais caracteres<br />

possam ser usados.<br />

• Naturalmente é melhor escolher nomes <strong>de</strong> variáveis que tenham algum significado, que estejam<br />

relacionados com a finalida<strong>de</strong> da variável, e que sejam diferenciados tipograficamente.<br />

<strong>de</strong>clarações das variáveis<br />

Na <strong>de</strong>claração <strong>de</strong> uma variável instruímos ao programa reservar uma quantida<strong>de</strong> <strong>de</strong> memória apropriada<br />

para armazenar o tipo especificado e indicar que o seu conteúdo será referenciado pelo nome dado.<br />

Se você tiver mais <strong>de</strong> uma variável do mesmo tipo, po<strong>de</strong>rá <strong>de</strong>clará-las <strong>de</strong> uma única vez, separando seus<br />

nomes por virgulas.<br />

int ida<strong>de</strong>, casa, livro;<br />

O local indicado para <strong>de</strong>clarar as variáveis é logo após a chave inicial da função main, veja o exemplo<br />

abaixo:<br />

main( )<br />

{<br />

int num, nota1, nota2, nota3, nota4, media;<br />

.<br />

.<br />

.<br />

.<br />

.<br />

}<br />

Antes <strong>de</strong> prosseguir, temos uma observação importante: “Em C todas as variáveis <strong>de</strong>vem ser <strong>de</strong>claradas<br />

antes <strong>de</strong> serem utilizadas”.<br />

tipos <strong>de</strong> variáveis<br />

O tipo <strong>de</strong> uma variável informa a quantida<strong>de</strong> <strong>de</strong> memória, em bytes, que está irá ocupar.<br />

tipo Bit Bytes escala<br />

char 8 1 -128 a 127<br />

int 16 2 -32768 a 32767<br />

float 32 4 3.4 E -38 a 3.4 E +38<br />

double 64 8 1.7 E -308 a 1.7 E +308<br />

O tipo char é capaz <strong>de</strong> conter um caractere. O tipo int po<strong>de</strong>rá conter números inteiros (ex.: 35, 0, -56) e o tipo<br />

float e double po<strong>de</strong>rá conter números reais (35, 0, -56, 1.2, -45.897).<br />

10


<strong>Fundamentos</strong> <strong>de</strong> <strong>Programação</strong><br />

C provê os modificadores <strong>de</strong> tipo como o short que é um inteiro curto que varia <strong>de</strong> –32.763 até 32.762 e<br />

também o long que é um inteiro longo e que varia <strong>de</strong> –2.147.483.648 até 2.147.483.647.<br />

main( )<br />

{<br />

int ida<strong>de</strong>;<br />

char inicial;<br />

float tempo;<br />

ida<strong>de</strong> = 25;<br />

inicial = ´C´;<br />

tempo = 17.25;<br />

printf(“a inicial do meu nome é: %c \n” , inicial);<br />

printf(“minha ida<strong>de</strong> é: %d anos\n” , ida<strong>de</strong>);<br />

printf(“meu tempo na prova foi <strong>de</strong> %f minutos \n” , tempo);<br />

}<br />

Agora algumas consi<strong>de</strong>rações sobre o programa anterior:<br />

• Na linha int ida<strong>de</strong>; é a variável, do tipo inteiro, que irá conter a ida<strong>de</strong>.<br />

• Na linha char inicial; é a variável, do tipo caractere, que irá conter a letra inicial <strong>de</strong> um nome.<br />

• Na linha float tempo; é a variável, do tipo ponto flutuante, que irá conter o tempo em minutos.<br />

• Na linha ida<strong>de</strong> = 25; é a inicialização da variável ida<strong>de</strong>.<br />

• Na linha inicial = ’C’; é a inicialização da variável inicial.<br />

• Na linha tempo = 17.25; é a inicialização da variável tempo.<br />

• Na linha printf(“A inicial do meu nome é: %c \n” , inicial); é a apresentação do conteúdo da variável<br />

inicial.<br />

• Na linha printf(“Minha ida<strong>de</strong> é: %d anos\n” , ida<strong>de</strong>); é a apresentação do conteúdo da variável ida<strong>de</strong>.<br />

• Na linha printf(“Meu tempo na prova foi <strong>de</strong> %f minutos \n” , tempo); é a apresentação do conteúdo da<br />

variável tempo.<br />

operadores<br />

Veremos agora o conteúdo relacionado a operadores aritméticos e operadores <strong>de</strong> atribuição.<br />

C é uma linguagem rica em operadores. Alguns são mais usados que outros, como é o caso dos operadores<br />

aritméticos que executam operações aritméticas.<br />

operadores aritméticos<br />

Para efetuar cálculos matemáticos temos os seguintes operadores aritméticos:<br />

operador ação exemplo resultado<br />

- Subtração 5 – 1 4<br />

+ Adição 5 + 1 6<br />

* Multiplicação 5 * 2 10<br />

/ Divisão 10 / 2 5<br />

% Resto da divisão 11%2 1<br />

11


Escola Alci<strong>de</strong>s <strong>Maya</strong> - Primeiro Módulo<br />

operador <strong>de</strong> atribuição<br />

Em C, o sinal <strong>de</strong> igual não tem a interpretação dada em matemática. Representa a atribuição da expressão<br />

à direita ao nome da variável à esquerda. Por exemplo:<br />

num = 2000;<br />

atribui o valor 2000 a variável num. A ação é executada da direita para a esquerda <strong>de</strong>ste operador.<br />

C aceita várias atribuições numa mesma instrução:<br />

laranjas = bergamotas = cenouras = abacates = 80;<br />

A seguir temos um programa que usa vários operadores aritméticos e converte temperatura Fahrenheit em<br />

seu correspon<strong>de</strong>nte Celsius.<br />

main( )<br />

{<br />

float ftemp, ctemp;<br />

ftemp = 120;<br />

ctemp = ( ftemp – 32.0 ) * ( 5.0 / 9.0 );<br />

printf(“temperatura em graus Celsius é: %f” , ctemp);<br />

}<br />

Agora algumas consi<strong>de</strong>rações sobre o programa acima:<br />

• Na linha float ftemp, ctemp; é a <strong>de</strong>claração <strong>de</strong> duas variáveis, do tipo float, que irá conter a temperatura<br />

em graus Fahrenheit e Celsius.<br />

• Na linha ftemp = 120; estamos utilizando o operador <strong>de</strong> atribuição que armazena a temperatura <strong>de</strong> 120<br />

graus Fahrenheit na variável ftemp.<br />

• Na linha ctemp = ( ftemp – 32.0 ) * ( 5.0 / 9.0 ); estamos efetuando o cálculo <strong>de</strong> conversão da temperatura<br />

em Fahrenheit para Celsius e atribuindo o resultado do cálculo para a variável ctemp. Note que colocamos<br />

parênteses em ftemp – 32.0. Se você lembra um pouco <strong>de</strong> álgebra, a razão estará clara. Nós queremos que 32<br />

seja subtraído <strong>de</strong> ftemp antes <strong>de</strong> multiplicarmos por 5 e dividirmos por 9. A multiplicação e a divisão são feitas<br />

antes da soma ou subtração.<br />

• Na linha printf(“Temperatura em graus Celsius é: %f” , ctemp); estamos apresentando o resultado do<br />

cálculo.<br />

12


<strong>Fundamentos</strong> <strong>de</strong> <strong>Programação</strong><br />

ComentárIos<br />

Comentários po<strong>de</strong>m ser colocados em qualquer lugar <strong>de</strong> seu programa. Comentários são recomendados<br />

para documentar a lógica utilizada no programa. Tudo que começa com dois caracteres, chamados símbolos <strong>de</strong><br />

comentários, barra-asterisco (/*) e terminam por asterisco-barra (*/), são comentários e o conteúdo entre eles<br />

não será verificado pelo compilador.<br />

No programa abaixo mostraremos vários comentários:<br />

/* Exercício 015<br />

* Este programa calcula<br />

* a ida<strong>de</strong> <strong>de</strong> uma pessoa<br />

* em dias<br />

*/<br />

main( )<br />

{<br />

float anos, dias; /* <strong>de</strong>claração <strong>de</strong> variáveis */<br />

anos = 12; /* inicializa a variável anos */<br />

dias = anos * 365; /*calcula ida<strong>de</strong> em dias*/<br />

printf(“a ida<strong>de</strong> em dias é: %f \n” , dias); /* apresentar o resultado */<br />

}<br />

exerCíCIos <strong>de</strong> FIxação<br />

1. Faça um programa que armazene a quilometragem inicial <strong>de</strong> um carro. Depois <strong>de</strong> uma viagem, armazenar<br />

a quilometragem final do carro. Calcular e apresentar a distância percorrida pelo carro.<br />

2. Faça um programa que armazene as notas <strong>de</strong> um aluno (serão 4 notas, portanto, teremos 4 variáveis).<br />

Calcule a média do aluno e armazene em uma variável, <strong>de</strong>pois apresente a média do aluno (use variáveis do tipo<br />

inteiro).<br />

3. Faça um programa que armazene as notas <strong>de</strong> um aluno (serão 4 notas, portanto, teremos 4 variáveis).<br />

Calcule a média do aluno e armazene em uma variável, <strong>de</strong>pois apresente a média do aluno (use variáveis do tipo<br />

ponto flutuante).<br />

4. Faça um programa que calcule e apresente o valor do volume <strong>de</strong> uma lata <strong>de</strong> óleo, utilizando a fórmula:<br />

volume = 3.14159 * raio² * altura. Obs.: Atribua valores a variável raio e altura.<br />

5. Faça um programa que calcule e apresente o volume <strong>de</strong> uma caixa retangular, por meio da fórmula:<br />

volume = comprimento * largura * altura. Obs.: Atribua valores a variável comprimento, largura e altura.<br />

6. Faça um programa que leia dois valores inteiros para as variáveis A e B, e efetuar a troca dos valores <strong>de</strong><br />

forma que a variável A passe a possuir o valor da variável B e a variável B passe a possuir o valor da variável A.<br />

Apresentar na tela os novos valores das variáveis A e B.<br />

7. Faça um programa que leia quatro números inteiros e apresentar o resultado da adição <strong>de</strong>stes números.<br />

(A + B + C + D)<br />

8. Faça um programa que leia quatro números inteiros e apresentar o resultado da multiplicação <strong>de</strong>stes<br />

números. (A * B * C * D)<br />

13


Escola Alci<strong>de</strong>s <strong>Maya</strong> - Primeiro Módulo<br />

9. Indique com um X quais dos dados abaixo são do tipo inteiro.<br />

( ) 1000<br />

( ) “0”<br />

( ) “-900”<br />

( ) -456<br />

( ) 34<br />

( ) ‘C’<br />

( ) 0<br />

( ) –1.56<br />

( ) 34.76<br />

10. Indique com um X quais dos dados abaixo são do tipo float.<br />

( ) -678<br />

( ) “0.87”<br />

( ) 99.8<br />

( ) “cinco”<br />

( ) 34<br />

( ) ‘C’<br />

( ) 45.8976<br />

( ) –1.56<br />

( ) 34.76<br />

Funções <strong>de</strong> entrada e saída<br />

O computador não é uma máquina isolada, pois ele precisa se comunicar com o mundo exterior, com<br />

ví<strong>de</strong>o, impressora, teclado, discos, fitas, etc. Para realizar esta comunicação existem comandos que permitem<br />

que informações sejam exibidas, por exemplo, no ví<strong>de</strong>o, como também existem comandos que permitem que<br />

informações sejam colocadas na memória do computador através do teclado do PC.<br />

Os comandos que iremos ver são os comandos para LER e ESCREVER, respectivamente, comando <strong>de</strong><br />

entrada e <strong>de</strong> saída.<br />

entrada, Processamento e saída<br />

Para criar um programa que seja executável <strong>de</strong>ntro <strong>de</strong> um computador, <strong>de</strong>ve-se ter em mente três coisas: a<br />

entrada <strong>de</strong> dados, o seu processamento e a saída <strong>de</strong>les.<br />

Sendo assim, todo programa estará trabalhando com estes três conceitos. Se os dados forem entrados <strong>de</strong><br />

forma errada, serão conseqüentemente processados <strong>de</strong> forma errada e resultarão em respostas erradas.<br />

Desta forma, dizer a alguém que foi erro do computador é ser um tanto “medíocre”. E isto é o que mais<br />

ouvimos quando nosso saldo está errado e vamos ao banco fazer uma reclamação ou quando recebemos uma<br />

cobrança in<strong>de</strong>vida. Se houve algum erro, é porque foi causado por falha humana. Realmente é impossível um<br />

computador errar por vonta<strong>de</strong> própria, pois vonta<strong>de</strong> é uma coisa que os computadores não têm.<br />

O processo <strong>de</strong> execução <strong>de</strong> um programa ocorre segundo o exposto, após a entrada <strong>de</strong> dados com a<br />

instrução leia e a sua saída com a instrução escreva. O processamento será uma conseqüência da manipulação<br />

das variáveis <strong>de</strong> ação.<br />

Uma entrada e uma saída po<strong>de</strong>rá ocorrer <strong>de</strong>ntro <strong>de</strong> um computador <strong>de</strong> diversas formas. Por exemplo, uma<br />

entrada po<strong>de</strong>rá ser feita via teclado. Uma saída po<strong>de</strong>rá ser feita em ví<strong>de</strong>o.<br />

As funções <strong>de</strong> biblioteca da linguagem C, mais comuns para a entrada e saída <strong>de</strong> dados são a printf() e a<br />

scanf().<br />

14


<strong>Fundamentos</strong> <strong>de</strong> <strong>Programação</strong><br />

a função printf( )<br />

A função printf( ) é uma das funções <strong>de</strong> saída <strong>de</strong> dados da linguagem C, que você já utilizou na Aula 1.<br />

A função scanf( )<br />

A função scanf( ) é o complemento <strong>de</strong> printf( ) e nos permite fazer a entrada <strong>de</strong> dados do teclado.<br />

Sua sintaxe é uma expressão <strong>de</strong> controle seguida por uma lista <strong>de</strong> argumentos separados por virgulas. Os<br />

argumentos <strong>de</strong> scanf( ) <strong>de</strong>vem ser en<strong>de</strong>reços <strong>de</strong> variáveis, cuja sintaxe será apresentada a seguir:<br />

scanf( “expressão <strong>de</strong> controle”, lista <strong>de</strong> argumentos);<br />

A expressão <strong>de</strong> controle contem códigos <strong>de</strong> formatação, sempre precedida por um sinal <strong>de</strong> %<br />

(percentagem).<br />

A lista <strong>de</strong> argumentos <strong>de</strong>ve consistir nos en<strong>de</strong>reços das variáveis, on<strong>de</strong> serão armazenados os valores lidos.<br />

C oferece um operador para tipos básicos chamados operador <strong>de</strong> en<strong>de</strong>reço e referenciado pelo símbolo & que<br />

retorna o en<strong>de</strong>reço do operando, voltaremos a este assunto quando será abordado a aula <strong>de</strong> pointers.<br />

Para exemplificar o que estamos apresentando, veremos no programa a apresentação do conteúdo<br />

armazenado em uma variável e o en<strong>de</strong>reço da variável.<br />

main( )<br />

{<br />

int num;<br />

num = 2;<br />

printf(“Conteúdo da variável.......: %d \n” , num);<br />

printf(“en<strong>de</strong>reço <strong>de</strong>cimal............: %u \n” , &num);<br />

printf(“en<strong>de</strong>reço Hexa<strong>de</strong>cimal....: %u \n” , &num);<br />

}<br />

Agora algumas consi<strong>de</strong>rações sobre o programa acima:<br />

• Na <strong>de</strong>claração int num; estamos <strong>de</strong>clarando a variável inteira num.<br />

• Na linha seguinte num = 2; estamos inicializando a variável com o número inteiro 2.<br />

• Na linha printf(“Conteúdo da variável.......: %d \n” , num); a função printf vai apresentar o conteúdo da<br />

variável através do código <strong>de</strong> formatação “%d” e na linha seguinte, através do código “%u” o en<strong>de</strong>reço da variável<br />

num. Repare que o nome da variável vem precedido do caractere “&”, indicando que é o en<strong>de</strong>reço da variável.<br />

Um en<strong>de</strong>reço <strong>de</strong> memória é visto como um número inteiro sem sinal, por isso usamos o “%u”.<br />

Mas o que este programa tem a ver com a entrada <strong>de</strong> dados?<br />

Nada, apenas estamos apresentando a você o en<strong>de</strong>reço da variável, já que para ler um valor para uma<br />

variável, utilizando a função scanf, temos que informar o en<strong>de</strong>reço da variável.<br />

No programa abaixo, ao invés <strong>de</strong> inicializar o valor da variável, como em num = 2; vamos ler um número<br />

qualquer e <strong>de</strong>pois apresentá-lo.<br />

main( )<br />

{<br />

int num;<br />

printf(“digite um número: “);<br />

scanf(“%d” , &num);<br />

15


Escola Alci<strong>de</strong>s <strong>Maya</strong> - Primeiro Módulo<br />

printf(“o número digitado foi: %d “ , num);<br />

}<br />

Agora algumas consi<strong>de</strong>rações sobre o programa acima:<br />

• Na <strong>de</strong>claração int num; estamos <strong>de</strong>clarando a variável inteira num.<br />

• Na linha printf(“Digite um número: “); informamos ao usuário que ele <strong>de</strong>verá digitar um número.<br />

• Na linha seguinte scanf(“%d” , &num); estamos esperando que o usuário digite um número inteiro e<br />

pressione a tecla ENTER. Nunca esqueça que ao usar a função scanf você <strong>de</strong>ve informar o en<strong>de</strong>reço da variável<br />

para on<strong>de</strong> vamos ler alguma coisa, caso contrário você terá surpresas <strong>de</strong>sagradáveis no teu programa.<br />

• Na última linha printf(“O número digitado foi: %d “ , num); a função printf vai apresentar o conteúdo da<br />

variável num.<br />

Veja na tabela a seguir os códigos básicos <strong>de</strong> formatação da função scanf( )<br />

Código Função<br />

%c Leia um único caractere<br />

%d Leia um inteiro <strong>de</strong>cimal<br />

%f Leia um número em ponto flutuante<br />

Agora vamos fazer um exemplo ligeiramente mais difícil. O próximo programa pe<strong>de</strong> ao usuário o comprimento<br />

em “jardas”, e então escreve na tela o valor convertido em “pés” e “polegadas”.<br />

main( )<br />

{<br />

int jardas, pes, polegadas;<br />

printf(“digite o comprimento a ser convertido: “); /* entrada <strong>de</strong> dados */<br />

scanf(“%d” , &jardas);<br />

polegadas = 36 * jardas;<br />

pes = 3 * jardas;<br />

/* processamento */<br />

printf(“ %d jardas = %d pés \n” , jardas, pés ); /* saída <strong>de</strong> dados */<br />

printf(“ %d jardas = %d polegadas \n” , jardas, polegadas );<br />

}<br />

Agora algumas consi<strong>de</strong>rações sobre o programa acima:<br />

• Na <strong>de</strong>claração int jardas, pes, polegadas; estamos <strong>de</strong>clarando as variáveis inteiras jardas, pés,<br />

polegadas.<br />

• Na linha printf(“Digite o comprimento a ser convertido: “); solicitamos ao usuário que ele <strong>de</strong>verá digitar um<br />

comprimento.<br />

• Na linha seguinte scanf(“%d” , &jardas); estamos esperando que o usuário digite um número inteiro e<br />

pressione a tecla ENTER. Este número será armazenado na variável: jardas.<br />

• Nas duas linhas seguintes: polegadas = 36 * jardas; e na linha pes = 3 * jardas; estamos calculando a<br />

conversão <strong>de</strong> jardas em polegadas e a conversão <strong>de</strong> jardas em pés.<br />

• E, finalmente nas duas últimas chamadas a função printf, estamos apresentando o resultado das<br />

conversões realizadas.<br />

16


17<br />

<strong>Fundamentos</strong> <strong>de</strong> <strong>Programação</strong><br />

Observação importante: veja como ficaram visíveis, neste programa, as três partes básicas do processamento<br />

<strong>de</strong> dados: entrada, processamento e saída, <strong>de</strong>stacadas no programa através dos comentários.<br />

Se em cada programa, nos concentrássemos nestas partes básicas, já teríamos meta<strong>de</strong> da solução do<br />

programa resolvida. Veja o exemplo a seguir:<br />

Exemplo – Faça um programa que leia um número inteiro qualquer, que representa o comprimento em jardas.<br />

Sabendo-se que esta medida <strong>de</strong> comprimento po<strong>de</strong>rá ser transformada em polegadas multiplicando-se pelo<br />

número 36, e que po<strong>de</strong>rá ser transformada em pés multiplicando-se pelo número 3, calcular e apresentar este<br />

valor convertido em pés e polegadas.<br />

Conforme o enunciado do programa <strong>de</strong>vemos procurar i<strong>de</strong>ntificar os elementos básicos do processamento<br />

<strong>de</strong> dados, ou seja, a entrada, o processamento e a saída <strong>de</strong> dados, fazendo algumas perguntas. Veja abaixo:<br />

Entrada <strong>de</strong> dados<br />

Pergunta: O que <strong>de</strong>vemos ler?<br />

Resposta: Um número inteiro que represente o comprimento em jardas.<br />

Pergunta: Temos que ler mais alguma coisa?<br />

Resposta: Não<br />

Processamento <strong>de</strong> dados<br />

Pergunta: O que <strong>de</strong>vemos fazer com esta informação lida?<br />

Resposta: Calcular a conversão <strong>de</strong> jardas para polegadas e pés.<br />

Pergunta: Como fazemos isto?<br />

Resposta: Matematicamente 1 jarda correspon<strong>de</strong> a 3 pés e 1 jarda correspon<strong>de</strong> a 36 polegadas.<br />

Devemos multiplicar o valor lido por 3 e obteremos a quantida<strong>de</strong> <strong>de</strong> pés.<br />

Também, multiplicar o valor lido por 36 e obteremos a quantida<strong>de</strong> <strong>de</strong> polegadas.<br />

Pergunta: Tem mais algum calculo para fazer?<br />

Resposta: Não<br />

Saída <strong>de</strong> dados<br />

Pergunta: Depois <strong>de</strong> calcular a conversão o que <strong>de</strong>vemos fazer?<br />

Resposta: Apresentar os valores convertidos.<br />

Pergunta: Tem mais alguma coisa para apresentar?<br />

Resposta: Não<br />

Po<strong>de</strong>mos então encerrar o programa.<br />

Estas são algumas consi<strong>de</strong>rações importantes, mas gostaria <strong>de</strong> ressaltar o seguinte:<br />

“Se todos os programadores fizessem o algoritmo do programa, antes <strong>de</strong> começar a codificar o programa,<br />

muitas dores <strong>de</strong> cabeça e tempo perdidos seriam eliminados, pois encontrar um erro <strong>de</strong> sintaxe da linguagem é<br />

fácil, mas encontrar um erro <strong>de</strong> lógica no programa é 10 vezes mais difícil”.<br />

Se você é um programador experiente, antes <strong>de</strong> codificar o programa, você faz o algoritmo, e ao fazelo<br />

você estará i<strong>de</strong>ntificando, automaticamente os elementos do processamento <strong>de</strong> dados, que é a entrada o<br />

processamento e a saída.


Escola Alci<strong>de</strong>s <strong>Maya</strong> - Primeiro Módulo<br />

exercícios <strong>de</strong> Fixação<br />

Desenvolva os exercícios abaixo:<br />

1. Faça um programa que leia e armazene em variáveis dois números inteiros quaisquer. Calcular e apresentar<br />

a soma entre eles.<br />

2. Faça um programa que leia e armazene em variáveis dois números em ponto flutuantes. Calcular e<br />

apresentar a diferença entre eles.<br />

3. Faça um programa que leia e armazene dois números quaisquer. Calcular e apresentar o produto entre<br />

eles.<br />

4. Faça um programa que leia e armazene em variáveis dois números inteiros quaisquer. Calcular e apresentar<br />

o resto da divisão <strong>de</strong> um pelo outro.<br />

5. Faça um programa que leia um número do tipo ponto flutuante e outro número inteiro. Calcular e apresentar<br />

a divisão do número do tipo ponto flutuante pelo número inteiro.<br />

6. Faça um programa que leia e armazene em variáveis quatro notas escolares (entre 0 e 10) <strong>de</strong> um aluno.<br />

Calcular e apresentar a média final do aluno.<br />

7. Faça um programa que leia e armazene em variáveis uma letra e um número. No final apresentar a letra<br />

e o número lido.<br />

8. Faça um programa que leia e armazene a ida<strong>de</strong> <strong>de</strong> uma pessoa em anos. Calcular e apresentar a<br />

quantida<strong>de</strong> <strong>de</strong> dias, a quantida<strong>de</strong> <strong>de</strong> horas, a quantida<strong>de</strong> <strong>de</strong> minutos e <strong>de</strong> segundos <strong>de</strong>s<strong>de</strong> o nascimento.<br />

9. Faça um programa que leia a receita e a <strong>de</strong>spesa <strong>de</strong> uma empresa. Calcular e apresentar o seu lucro.<br />

10. Faça um programa que leia o número <strong>de</strong> i<strong>de</strong>ntificação <strong>de</strong> um funcionário, o seu número <strong>de</strong> horas<br />

trabalhadas no mês, o valor que recebe por hora. Calcular o salário total <strong>de</strong>ste funcionário, sabendo-se que ele<br />

é pago para trabalhar por hora. No final apresentar o salário total <strong>de</strong>ste funcionário.<br />

exemplos <strong>de</strong> aula<br />

Na disciplina <strong>de</strong> lógica apresentamos alguns exemplos <strong>de</strong> aula que agora reproduzimos escritos em linguagem<br />

C para que você possa fazer uma comparação entre eles.<br />

Primeiro exemplo<br />

Desenvolver um programa que efetue o cálculo da área <strong>de</strong> uma circunferência, apresentando a área<br />

calculada.<br />

algoritmo<br />

Para efetuar o cálculo da área <strong>de</strong> uma circunferência é necessário conhecer a fórmula que executa este<br />

cálculo sendo esta: A = pR², em que A é a variável que conterá o resultado do cálculo da área, p é o valor <strong>de</strong> pi<br />

(3.14159), sendo uma constante na fórmula) e R o valor do raio. Sendo assim, basta estabelecer:<br />

1 – Ler um valor para o raio, no caso a variável R;<br />

2 – Estabelecer que PI possui o valor 3,14159;<br />

3 – Efetuar o cálculo da área, elevando ao quadrado o valor <strong>de</strong> R e multiplicando por PI;<br />

4 – Apresentar o valor da variável A.<br />

A fórmula para o cálculo da área passará a ser escrita como: A 3.14159 * R h 2 ou se você preferir po<strong>de</strong>rá<br />

escrever da seguinte forma: A 3.14159 * R * R.<br />

18


Codificação em Linguagem C<br />

main( )<br />

{<br />

float A,R;<br />

clrscr( );<br />

printf ( “digite o raio da circunferência: “ );<br />

scanf ( “%f”, &r );<br />

a = 3.14159 * r * r;<br />

printf ( “a área da circunferência e: %f”, a );<br />

getch( );<br />

}<br />

19<br />

<strong>Fundamentos</strong> <strong>de</strong> <strong>Programação</strong><br />

segundo exemplo<br />

Construir um programa que efetue o cálculo do salário líquido <strong>de</strong> um professor. Para fazer este programa, você<br />

<strong>de</strong>verá possuir alguns dados, tais como: valor da hora aula, número <strong>de</strong> horas trabalhadas no mês e percentual <strong>de</strong><br />

<strong>de</strong>sconto do INSS. Em primeiro lugar, <strong>de</strong>ve-se estabelecer qual será o seu salário bruto para efetuar o <strong>de</strong>sconto<br />

e ter o valor do salário líquido.<br />

algoritmo<br />

1 – Estabelecer a leitura da variável HT (Horas trabalhadas no mês);<br />

2 – Estabelecer a leitura da variável VH (valor hora aula);<br />

3 – Estabelecer a leitura da variável PD (Percentual <strong>de</strong> <strong>de</strong>sconto <strong>de</strong> INSS);<br />

4 – Calcular o salário bruto (SB), sendo este a multiplicação das variáveis HT e VH;<br />

5 – Calcular o total <strong>de</strong> <strong>de</strong>sconto (TD) com base no valor <strong>de</strong> PD dividido por 100;<br />

6 – Calcular o salário líquido (SL), <strong>de</strong>duzindo o <strong>de</strong>sconto do salário bruto;<br />

7 – Apresentar os valores dos salários bruto e líquido: SB e SL.<br />

Codificação em Linguagem C<br />

main( )<br />

{<br />

int Ht;<br />

float VH, PD, TD, SB, SL;<br />

clrscr( );<br />

printf(“digite a quantida<strong>de</strong> <strong>de</strong> horas trabalhadas no mes: “);<br />

scanf(“%d”, &Ht);<br />

printf(“digite o valor da hora aula: “);<br />

scanf(“%f”, &VH);<br />

printf(“digite o percentual <strong>de</strong> <strong>de</strong>sconto do Inss: “);<br />

scanf(“%f”, &Pd);<br />

sB = Ht * VH;<br />

td = (Pd/100) * sB;


Escola Alci<strong>de</strong>s <strong>Maya</strong> - Primeiro Módulo<br />

sL = sB - td;<br />

printf(“o valor do salario bruto e.....: %12.2f\n”, sB);<br />

printf(“o valor do salario liquido e...: %12.2f\n”, sL);<br />

getch( );<br />

}<br />

exercícios <strong>de</strong> aula<br />

Abaixo são apresentados exercícios, sugiro que você os faça sem ver a solução pronta do mesmo, utilize a<br />

solução para verificar se você fez corretamente.<br />

Primeiro exercício<br />

Desenvolver um programa que leia dois valores numéricos e apresente o resultado da soma dos quadrados<br />

dos valores lidos.<br />

algoritmo<br />

1 – Ler um valor para a variável A e outro para a variável B;<br />

2 – Efetuar o cálculo do quadrado dos valores lidos, atribuindo os resultados as variáveis QA e QB;<br />

3 – Somar o quadrado dos valores lidos atribuindo o resultado a variável R;<br />

4 – Apresentar o valor da variável R.<br />

Codificação em Linguagem C<br />

main( )<br />

{<br />

int a, B, Qa, QB, r;<br />

clrscr( );<br />

printf(“digite um numero..................: “);<br />

scanf(“%d”, &a);<br />

printf(“digite outro numero..............: “);<br />

scanf(“%d”, &B);<br />

Qa = a * a;<br />

QB = B * B;<br />

r = Qa + QB;<br />

printf(“a soma dos quadrados e.....: %d”, r);<br />

getch( );<br />

}<br />

segundo exercício<br />

Desenvolver um programa que apresente o resultado do cálculo da área <strong>de</strong> um trapézio.<br />

Algoritmo<br />

O cálculo da área do trapézio é: área = ( bMaior + bMenor * altura ) / 2, então:<br />

20


<strong>Fundamentos</strong> <strong>de</strong> <strong>Programação</strong><br />

1 – Ler um valor para a base maior atribuindo a variável bMaior;<br />

2 – Ler um valor para a base menor atribuindo a variável bMenor;<br />

3 – Ler um valor para a altura atribuindo a variável altura;<br />

4 – Efetuar o cálculo da área atribuindo a variável area;<br />

5 – Apresentar o valor da variável area.<br />

Codificação em Linguagem C<br />

main( )<br />

{<br />

float area, bMaior, bMenor, altura;<br />

clrscr( );<br />

printf(“digite o valor da base maior...: “);<br />

scanf(“%f”, &bmaior);<br />

printf(“digite o valor da base menor...: “);<br />

scanf(“%f”, &bmenor);<br />

printf(“digite o valor da altura.......: “);<br />

scanf(“%f”, &altura);<br />

area = ((bmaior + bmenor) * altura) / 2;<br />

printf(“a area do trapezio e...........: %5.2f”, area);<br />

getch( );<br />

}<br />

<strong>de</strong>talhes adicionais da Linguagem C<br />

Veremos agora alguns <strong>de</strong>talhes interessantes da Linguagem C.<br />

Operadores<br />

Já tínhamos visto os operadores aritméticos e <strong>de</strong> atribuição. Vamos agora complementar o assunto vendo os<br />

operadores <strong>de</strong> incremento e <strong>de</strong>cremento, os operadores aritméticos <strong>de</strong> atribuição e os operadores relacionais.<br />

Operadores <strong>de</strong> incremento (+ +) e <strong>de</strong>cremento (--)<br />

O operador <strong>de</strong> incremento (+ +) incrementa <strong>de</strong> um seu operando, ou seja, ele obtém o valor do operando e<br />

acrescenta um a este valor, é o somar mais um.<br />

Em um primeiro instante isto parece uma coisa difícil <strong>de</strong> se enten<strong>de</strong>r, mas analise o programa abaixo e verás<br />

que é muito fácil.<br />

main( )<br />

{<br />

int num;<br />

num = 2;<br />

printf(“Valor inicial = %d \n” , num);<br />

num = num + 1;<br />

printf(“novo valor = %d \n” , num);<br />

}<br />

21


Escola Alci<strong>de</strong>s <strong>Maya</strong> - Primeiro Módulo<br />

Agora algumas consi<strong>de</strong>rações sobre o programa acima:<br />

• Na <strong>de</strong>claração int num; estamos <strong>de</strong>clarando a variável inteira num. Na linha seguinte num = 2; estamos<br />

inicializando a variável com o número inteiro 2.<br />

• Na próxima linha printf(“Valor inicial = %d \n” , num); está sendo apresentado o valor inicial da variável<br />

num.<br />

• Na linha num = num + 1; estamos somando um ao valor inicial da variável num, e é isto que chamamos<br />

<strong>de</strong> incrementar (somar um), e então na última linha apresentamos o valor final <strong>de</strong> num que <strong>de</strong>verá ser: “três”<br />

Agora veja o mesmo programa, mas utilizando o operador <strong>de</strong> incremento.<br />

main( )<br />

{<br />

int num;<br />

num = 2;<br />

printf(“Valor inicial = %d \n” , num);<br />

num++;<br />

printf(“novo valor = %d \n” , num);<br />

}<br />

Agora algumas consi<strong>de</strong>rações sobre o programa acima:<br />

• A única diferença <strong>de</strong>ste programa para o anterior é a linha num++; on<strong>de</strong> estamos somando um ao valor<br />

inicial da variável num.<br />

Mas, haveria uma outra forma <strong>de</strong> escrever o mesmo programa, veja as alterações a seguir:<br />

main( )<br />

{<br />

int num;<br />

num = 2;<br />

printf(“Valor inicial = %d \n” , num++ );<br />

printf(“novo valor = %d \n” , num);<br />

}<br />

encontrou as diferenças?<br />

• Neste programa apagamos a linha num++; porque colocamos o incremento na linha anterior printf(“Valor<br />

inicial = %d \n” , num++ ); on<strong>de</strong> você <strong>de</strong>ve notar que ao final da printf estamos usando o incremento do num++.<br />

Você <strong>de</strong>ve estar se perguntando: “Mas não seria apresentado o valor 3 já na primeira printf?” E a resposta é:<br />

“Não, estamos usando a regra <strong>de</strong> precedência, neste programa primeiro ele apresenta o valor <strong>de</strong> num para<br />

<strong>de</strong>pois incrementa-lo”.<br />

Este operador trabalha <strong>de</strong> dois modos. O primeiro modo é chamado pré-fixado e o operador aparece antes do<br />

nome da variável. O segundo modo é o pós-fixado em que o operador aparece seguindo o nome da variável.<br />

Em ambos os casos, a variável é incrementada. Porém quando ++num é usado numa instrução, num e<br />

incrementada antes <strong>de</strong> seu valor ser usado, e quando num++ estiver numa instrução, num é incrementada<br />

<strong>de</strong>pois <strong>de</strong> seu valor ser usado. Veja o exemplo a seguir.<br />

22


main( )<br />

{<br />

int n,x;<br />

n = 5;<br />

x = n++;<br />

printf(“Valor <strong>de</strong> x = %d \n” , x);<br />

printf(“Valor <strong>de</strong> n = %d \n” , n);<br />

}<br />

23<br />

<strong>Fundamentos</strong> <strong>de</strong> <strong>Programação</strong><br />

Veja o que aconteceu neste programa:<br />

• Na linha n = 5; atribuímos o valor 5 a variável n<br />

• Na linha seguinte x = n++; o valor <strong>de</strong> n é atribuído a x e <strong>de</strong>pois n é incrementada <strong>de</strong> 1, tornando seu valor<br />

6.<br />

• Na primeira printf a saída será: Valor <strong>de</strong> x = 5 e na outra vai ser: Valor <strong>de</strong> n = 6 comprovando que quando<br />

o operador é pós-fixado ele incrementa o valor da variável <strong>de</strong>pois <strong>de</strong> seu valor ser usado.<br />

Vejamos o mesmo exemplo utilizando agora o operador <strong>de</strong> incremento sendo utilizado pré-fixado.<br />

main( )<br />

{<br />

int n,x;<br />

n = 5;<br />

x = ++n;<br />

printf(“Valor <strong>de</strong> x = %d \n” , x);<br />

printf(“Valor <strong>de</strong> n = %d \n” , n);<br />

}<br />

Veja o que aconteceu neste programa:<br />

• Na linha n = 5; atribuímos o valor 5 a variável n<br />

• Na linha seguinte x = ++n; o valor <strong>de</strong> n é incrementada <strong>de</strong> 1 tornando seu valor 6, e atribuído a x.<br />

• Na primeira printf a saída será: Valor <strong>de</strong> x = 6 e na outra vai ser: Valor <strong>de</strong> n = 6 comprovando que quando<br />

o operador é pré-fixado ele incrementado <strong>de</strong> um e <strong>de</strong>pois o seu valor ser usado.<br />

Operadores aritméticos <strong>de</strong> atribuição +=, -=, *=, /=, %=<br />

Nestes operadores é usado um nome <strong>de</strong> variável a sua esquerda e uma expressão a sua direita. A operação<br />

consiste em atribuir um novo valor a variável que <strong>de</strong>pen<strong>de</strong>rá do operador e da expressão à direita.<br />

Se n é uma variável, exp uma expressão e op um operador aritmético, então:<br />

n op= exp;<br />

Equivale a<br />

n = (n) op (exp);


Escola Alci<strong>de</strong>s <strong>Maya</strong> - Primeiro Módulo<br />

Exemplos:<br />

i + = 2; equivale a i = i + 2;<br />

x *= y+1; equivale a x = x * (y+1);<br />

t /= 2.5; equivale a t = t / 2.5;<br />

p %= 5; equivale a p = p % 5;<br />

d -= 3; equivale a d = d - 3;<br />

Uma expressão com estes operadores são mais compactos e normalmente produzem um código <strong>de</strong> máquina<br />

mais eficiente.<br />

Exercícios <strong>de</strong> Fixação<br />

1. Analise o programa abaixo e informe os valores apresentados na tela:<br />

main( )<br />

{<br />

int a=1, b=2, c=3, d;<br />

d = a;<br />

printf(“%d \n” , d); /* valor <strong>de</strong> d: _________ */<br />

d = b++;<br />

printf(“%d \n” , d); /* valor <strong>de</strong> d: _________ */<br />

d = ++c;<br />

printf(“%d \n” , d); /* valor <strong>de</strong> d: _________ */<br />

a += b;<br />

printf(“%d \n” , a); /* valor <strong>de</strong> a: _________ */<br />

c *= b;<br />

printf(“%d \n” , c);<br />

}<br />

/* valor <strong>de</strong> c: _________ */<br />

2. Assuma que todas as variáveis são do tipo int. Encontre o valor <strong>de</strong> cada uma <strong>de</strong>las e escreva um programa<br />

que as imprima para verificar os resultados:<br />

a) x = ( 2 + 1 ) * 6;<br />

b) y = ( 5 + 1 ) / 2 * 3;<br />

c) i = j = ( 2 + 3 ) / 4;<br />

d) a = 3 + 2 * ( b = 7 / 2 );<br />

e) c = 5 + 10 % 4 / 2;<br />

3. Reescreva as seguintes instruções usando os operadores <strong>de</strong> incremento e <strong>de</strong>cremento:<br />

num = num + 1;<br />

num = num – 1;<br />

24


<strong>Fundamentos</strong> <strong>de</strong> <strong>Programação</strong><br />

4. Reescreva as seguintes instruções usando os operadores aritméticos <strong>de</strong> atribuição:<br />

num1 = num1 + num2;<br />

num2 = num2 – num1;<br />

5. Analise o programa abaixo e informe os valores apresentados na tela:<br />

main( )<br />

{<br />

int num=0;<br />

printf(“%d \n” , num); /* valor <strong>de</strong> num: _________ */<br />

printf(“%d \n” , num++); /* valor <strong>de</strong> num: _________ */<br />

printf(“%d \n” , num);<br />

}<br />

/* valor <strong>de</strong> num: _________ */<br />

6. Analise o programa abaixo e informe os valores apresentados na tela:<br />

main( )<br />

{<br />

int num=0;<br />

printf(“%d \n” , num); /* valor <strong>de</strong> num: _________ */<br />

printf(“%d \n” , ++num); /* valor <strong>de</strong> num: _________ */<br />

printf(“%d \n” , num);<br />

}<br />

/* valor <strong>de</strong> num: _________ */<br />

7. Analise o programa abaixo e informe os valores apresentados na tela:<br />

main( )<br />

{<br />

int num=0;<br />

printf(“%d \n” , num); /* valor <strong>de</strong> num: _________ */<br />

printf(“%d \n” , - -num); /* valor <strong>de</strong> num: _________ */<br />

printf(“%d \n” , num);<br />

}<br />

/* valor <strong>de</strong> num: _________ */<br />

25


Escola Alci<strong>de</strong>s <strong>Maya</strong> - Primeiro Módulo<br />

8. Analise o programa abaixo e informe os valores apresentados na tela:<br />

main( )<br />

{<br />

int num=0;<br />

printf(“%d \n” , num); /* valor <strong>de</strong> num: _________ */<br />

printf(“%d \n” , num- -); /* valor <strong>de</strong> num: _________ */<br />

printf(“%d \n” , num);<br />

}<br />

/* valor <strong>de</strong> num: _________ */<br />

9. Analise o programa abaixo e informe os valores apresentados na tela:<br />

main( )<br />

{<br />

int num=0;<br />

num += 10;<br />

printf(“%d \n” , num); /* valor <strong>de</strong> num: _________ */<br />

num += 10;<br />

printf(“%d \n” , num);<br />

}<br />

/* valor <strong>de</strong> num: _________ */<br />

strings – um tipo especial <strong>de</strong> caracteres<br />

Em nosso primeiro programa colocamos na tela do computador, através da função printf uma seqüência <strong>de</strong><br />

caracteres entre aspas “Meu primeiro programa”, lembra ?<br />

Havia escrito que po<strong>de</strong>mos chamá-la <strong>de</strong> “ca<strong>de</strong>ia <strong>de</strong> caracteres” ou <strong>de</strong> “String”. Usaremos, a partir <strong>de</strong>ste<br />

momento, apenas “String”.<br />

String é uma das mais importantes formas <strong>de</strong> dados em C e é usada para armazenar e manipular textos como<br />

palavras, nomes e sentenças.<br />

String é um vetor unidimensional do tipo char terminada pelo caractere null.<br />

Composta <strong>de</strong> uma série <strong>de</strong> caracteres, a <strong>de</strong>finição <strong>de</strong> string como sendo um vetor do tipo char é bastante<br />

razoável.<br />

Cada caractere <strong>de</strong> uma string po<strong>de</strong> ser acessado como um elemento do vetor o que proporciona uma gran<strong>de</strong><br />

flexibilida<strong>de</strong> aos programas que processam textos.<br />

Na string a seguir: “Alci<strong>de</strong>s <strong>Maya</strong>” cada caractere ocupa um byte <strong>de</strong> memória e o último caractere é sempre<br />

‘\0´(null). Veja uma representação <strong>de</strong> como é uma string no computador:<br />

A l c I d e s M a y a \0<br />

No exemplo acima temos uma série <strong>de</strong> elementos do vetor <strong>de</strong> caracteres, sendo que o primeiro elemento,<br />

on<strong>de</strong> está a letra “A” é o elemento 0 (zero) do vetor. O segundo elemento, on<strong>de</strong> está a letra “l” é o elemento 1 (um)<br />

do vetor. O terceiro elemento, on<strong>de</strong> está a letra “c” é o elemento 2 (dois) do vetor e assim sucessivamente.<br />

A l c I d e s M a y a \0<br />

0 1 2 3 4 5 6 7 8 9 10 11 12<br />

26


<strong>Fundamentos</strong> <strong>de</strong> <strong>Programação</strong><br />

Variáveis que armazenam uma string<br />

Uma das maneiras <strong>de</strong> receber uma string do teclado é através da função scanf( ) pelo formato %s.<br />

main( )<br />

{<br />

char nome[16];<br />

printf(“digite seu nome: “);<br />

scanf(“%s” , &nome[0]);<br />

printf(“olá, %s, tudo bem?” , nome);<br />

}<br />

Agora algumas consi<strong>de</strong>rações sobre o programa acima:<br />

• Na <strong>de</strong>claração: char nome[16]; <strong>de</strong>claramos a variável nome do tipo char que tem um tamanho <strong>de</strong> 16<br />

caracteres, reservando o último elemento da string para o caracter \0 (null).<br />

• Na linha printf(“Digite seu nome: “); você encontra uma string entre as aspas<br />

• Na próxima linha scanf(“%s” , &nome[0]); temos a função scanf() que vai ler uma string e armazenar na<br />

variável nome. Você <strong>de</strong>ve ter notado que usamos o operador & prece<strong>de</strong>ndo o segundo argumento <strong>de</strong> scanf() e<br />

também que estamos fazendo referência ao primeiro elemento do vetor [0]. Visto que o nome <strong>de</strong> um vetor é o<br />

seu en<strong>de</strong>reço inicial po<strong>de</strong>ríamos usar a scanf() da seguinte forma: scanf(“%s” , nome); que o resultado seria o<br />

mesmo.<br />

• Na última linha printf(“Olá, %s, tudo bem?” , nome); estamos apresentando o conteúdo do vetor.<br />

Lendo strings com a Função scanf()<br />

Ler uma string consiste em dois passos: reservar espaço <strong>de</strong> memória para armazená-la e usar alguma função<br />

que permita a sua entrada.<br />

O primeiro passo é <strong>de</strong>clarar a string especificando o seu tamanho, sempre com um espaço a mais para o<br />

caracter \0 (null).<br />

char nome[16];<br />

Uma vez reservado o espaço necessário você po<strong>de</strong> usar a função scanf() para receber a string. A função<br />

scanf() é bastante limitada para a leitura <strong>de</strong> strings.<br />

Por exemplo, consi<strong>de</strong>re a seguinte execução do Exercício 26.<br />

Digite seu nome: Alci<strong>de</strong>s <strong>Maya</strong><br />

Olá, Alci<strong>de</strong>s, tudo bem?<br />

O programa subitamente eliminou o último nome.<br />

Lembre-se <strong>de</strong> que scanf() usa qualquer espaço em branco para terminar a entrada. O resultado é que não<br />

existe uma forma <strong>de</strong> digitar um texto <strong>de</strong> múltiplas palavras numa única variável usando scanf().<br />

A função scanf() é usada, principalmente para ler uma mistura <strong>de</strong> tipos <strong>de</strong> dados numa mesma instrução.<br />

Por exemplo, se em cada linha <strong>de</strong> entrada quisermos ler o nome <strong>de</strong> um material do estoque, o seu número do<br />

estoque e o seu preço, scanf() se adaptam perfeitamente.<br />

Lendo strings com a Função gets()<br />

A função gets() é bastante conveniente para a leitura <strong>de</strong> strings.<br />

O seu propósito é ler uma string da sua entrada padrão, que por “<strong>de</strong>fault” é o teclado.<br />

Visto que uma string não tem um tamanho pre<strong>de</strong>terminado, gets( ) Iê caracteres até encontrar o <strong>de</strong> nova linha<br />

(´\n’) que é gerado pressionando-se a tecla [Enter]. Todos os caracteres anteriores ao ‘\n’ são armazenados na<br />

string e é então incluído o caractere ´\0´.<br />

Caracteres brancos como espaços e tabulações são perfeitamente aceitáveis como parte da string. Eis um<br />

27


Escola Alci<strong>de</strong>s <strong>Maya</strong> - Primeiro Módulo<br />

exemplo simples:<br />

main( )<br />

{<br />

char nome[16];<br />

printf(“Digite seu nome: “);<br />

gets(nome);<br />

printf(“Olá, %s, tudo bem?” , nome);<br />

)<br />

Agora algumas consi<strong>de</strong>rações sobre o programa acima:<br />

• No programa anterior usamos scanf(“%s” , &nome[0]); mas agora, utilizamos gets(nome); que po<strong>de</strong>rá ler<br />

mais <strong>de</strong> uma palavra separada por espaço em branco. A função gets( ) é exatamente o que procurávamos: agora<br />

o programa lembrará todo o nome.<br />

Agora ao digitarmos duas ou mais palavras, será armazenado o nome completo.<br />

Se forem digitadas as palavras “Alci<strong>de</strong>s <strong>Maya</strong>”, teremos o resultado apresentado como no exemplo abaixo:<br />

Digite seu nome: Alci<strong>de</strong>s <strong>Maya</strong><br />

Olá, Alci<strong>de</strong>s <strong>Maya</strong>, tudo bem?<br />

OBSERVAÇÃO: Se você digitar um nome maior que o espaço reservado para o string, (15 caracteres no<br />

programa acima) o programa segue armazenando os dados na memória do computador, sem fazer qualquer<br />

consistência em relação ao tamanho do string, po<strong>de</strong>ndo armazenar em cima da área <strong>de</strong> programa, que está na<br />

memória do computador.<br />

Experimente rodar o programa acima digitando as seguintes palavras: “Escola Técnica Alci<strong>de</strong>s <strong>Maya</strong>”, e veja<br />

o que po<strong>de</strong>rá acontecer.<br />

Inicializando strings<br />

O compilador oferece uma forma <strong>de</strong> inicialização <strong>de</strong> strings consi<strong>de</strong>ravelmente mais simples:<br />

char nome[ ] = “Ana”;<br />

Enquanto os caracteres simples são colocados entre aspas simples, a string é colocada entre aspas duplas.<br />

O uso da segunda forma causa a inclusão automática do caractere ‘\0´, ou seja teremos a seguinte string na<br />

memória.<br />

A n a \0<br />

0 1 2 3<br />

main( )<br />

{<br />

char nome[ ] = “alci<strong>de</strong>s maya”;<br />

printf(“olá, %s, tudo bem?” , nome);<br />

}<br />

28


<strong>Fundamentos</strong> <strong>de</strong> <strong>Programação</strong><br />

Agora algumas consi<strong>de</strong>rações sobre o programa acima:<br />

• Na linha char nome[ ] = “Alci<strong>de</strong>s <strong>Maya</strong>”; estamos <strong>de</strong>clarando a variável nome que é do tipo vetor <strong>de</strong><br />

caracteres e já está sendo inicializada com o valor “Alci<strong>de</strong>s <strong>Maya</strong>”, ele terá um tamanho <strong>de</strong> 13 caracteres, já<br />

contando o lugar reservado para o \0 (null).<br />

exercícios <strong>de</strong> Fixação<br />

1. Faça um programa que leia o nome <strong>de</strong> 2 pessoas e armazene os nomes lidos (use a função scanf para ler<br />

os nomes). Depois escreva na tela os nomes lidos.<br />

2. Faça um programa que leia o nome <strong>de</strong> 2 pessoas e armazene os nomes lidos (use a função gets para ler<br />

os nomes). Depois escreva na tela os nomes lidos.<br />

3. Faça um programa que leia três frases. As frases <strong>de</strong>verão ser armazenadas e <strong>de</strong>pois ser apresentadas na<br />

tela.<br />

4. Faça um programa que <strong>de</strong>clare uma string <strong>de</strong> 80 caracteres <strong>de</strong> espaço em branco. Depois escrever 25<br />

printf´s que imprimam esta string na tela. O que acontece?<br />

5. Faça um programa que leia o teu nome, o nome da tua mãe e escreva na tela o teu nome e o nome da tua<br />

mãe, cada um em uma linha da tela.<br />

6. Quais das <strong>de</strong>clarações <strong>de</strong> string está correta?<br />

( ) string nome[80];<br />

( ) char nome(80);<br />

( ) char nome[80];<br />

( ) char nome = 80;<br />

( ) Nenhuma alternativa acima<br />

7. Qual das funções é mais apropriada para ler uma string composta por várias palavras?<br />

( ) scanf<br />

( ) printf<br />

( ) puts<br />

( ) gets<br />

( ) Nenhuma alternativa acima<br />

8. Assuma a seguinte inicialização:<br />

char nome[] = “Escola Alci<strong>de</strong>s <strong>Maya</strong>”;<br />

Como você se refere à string “<strong>Maya</strong>” (as últimas 4 letras da string)?<br />

9. Qual é o erro da instrução abaixo?<br />

nome = “Alci<strong>de</strong>s <strong>Maya</strong>”;<br />

29


Escola Alci<strong>de</strong>s <strong>Maya</strong> - Primeiro Módulo<br />

10. Qual é o último caractere <strong>de</strong> uma string?<br />

( ) \n<br />

( ) \t<br />

( ) \s<br />

( ) \0<br />

( ) Nenhuma alternativa acima<br />

4 estruturas <strong>de</strong> ControLe – a tomada <strong>de</strong> <strong>de</strong>CIsões<br />

Foi visto anteriormente como trabalhar com entrada, processamento e saída utilizando funções, variáveis e<br />

operadores. Apesar <strong>de</strong> já se conseguir solucionar problemas e transforma-los em programas, os recursos até<br />

aqui estudados são limitados, pois haverá momentos em que um <strong>de</strong>terminado valor <strong>de</strong>ntro <strong>de</strong> um programa<br />

necessitará ser tratado para se efetuar um processamento mais a<strong>de</strong>quado.<br />

Imagine a seguinte situação: um programa que apresente a média escolar <strong>de</strong> um aluno. Até aqui, muito<br />

simples, mas além <strong>de</strong> calcular a média, o programa <strong>de</strong>ve apresentar se ele está aprovado ou reprovado segundo<br />

a análise <strong>de</strong> sua média.<br />

Observe que aqui será necessário verificar a média do aluno para então tomar uma <strong>de</strong>cisão no sentido <strong>de</strong><br />

apresentar a sua real situação: aprovado ou reprovado.<br />

Tomar esta <strong>de</strong>cisão implica em comparar a média com um valor numérico, e para realizar esta comparação<br />

utilizamos operadores relacionais que veremos a seguir.<br />

Operadores relacionais<br />

Os operadores relacionais são usados para fazer comparações. São eles:<br />

Operador Ação Exemplo Resultado<br />

> maior do que 5 > 2 V<br />

>= maior ou igual 5 >= 7 F<br />

< menor do que 5 < 7 V<br />

valor2) );<br />

printf(“valor1 < valor2 é %d \n” , (valor1 < valor2) );<br />

printf(“valor1 >= valor2 é %d \n” , (valor1 >= valor2) );<br />

30


printf(“valor1 0) estamos testando o número digitado para saber se o mesmo é maior do que zero. Se<br />

o resultado <strong>de</strong>sta expressão for verda<strong>de</strong>ira a linha printf (“O número digitado é positivo”); será executada.<br />

• Repare que o comando abaixo do if foi colocado alguns espaços mais para <strong>de</strong>ntro da linha, este processo<br />

<strong>de</strong> codificação é chamado <strong>de</strong> “e<strong>de</strong>ntação”. Isto facilita a leitura <strong>de</strong> um programa em qualquer linguagem. Para<br />

o compilador não é necessário a e<strong>de</strong>ntar, mas para os programadores, quando estão <strong>de</strong>purando erros <strong>de</strong><br />

programação, é extremamente útil.


Escola Alci<strong>de</strong>s <strong>Maya</strong> - Primeiro Módulo<br />

exemplo <strong>de</strong> aula<br />

Primeiro exemplo<br />

Desenvolver um programa que leia dois valores numéricos. Efetuar a adição e apresentar o seu resultado<br />

caso o valor somado seja maior que 10.<br />

algoritmo<br />

1 – Ler um valor para a variável A e outro valor para a variável B;<br />

2 – Efetuar a soma dos valores incógnitos A e B, atribuindo o valor da soma na variável X;<br />

3 – Apresentar o valor da soma contido na variável X, caso o valor <strong>de</strong> X seja maior que 10.<br />

Codificação em Linguagem C<br />

main( )<br />

{<br />

int a,B,x;<br />

clrscr( );<br />

printf ( “digite um número: “ );<br />

scanf ( “%d”, &a );<br />

printf ( “digite outro número: “ );<br />

scanf ( “%d”, &B );<br />

x = a + B;<br />

if ( x > 10 )<br />

printf ( “a soma dos números ée: %d “, x );<br />

getch( );<br />

}<br />

<strong>de</strong>svio Condicional Composto<br />

O comando if-else, on<strong>de</strong> o if significa “se” e o else significa “senão” é utilizado para fazer um “Desvio<br />

Condicional Composto”.<br />

Sua forma geral é:<br />

if (expressão)<br />

comando_1;<br />

else<br />

comando_2;<br />

On<strong>de</strong> a expressão é avaliada; se for verda<strong>de</strong>ira (isto é, se a expressão tiver um valor diferente <strong>de</strong> zero), o<br />

comando_1 é executado. Se for falsa (isto é, se a expressão tiver um valor igual a zero) e se houver uma parte<br />

else, o comando_2 é executado.<br />

Continuaremos o estudo do “if-else” com um programa simples, que lê um número do teclado e escreve na<br />

tela <strong>de</strong> seu computador se o número digitado é positivo ou se é negativo.<br />

32


main( )<br />

{<br />

int num;<br />

printf (“digite um número: “ );<br />

scanf (“%d” , &num);<br />

33<br />

<strong>Fundamentos</strong> <strong>de</strong> <strong>Programação</strong><br />

if (num > 0)<br />

printf (“o número digitado é positivo”);<br />

else<br />

printf (“o número digitado é negativo”);<br />

}<br />

Agora algumas consi<strong>de</strong>rações sobre o programa acima:<br />

• Declaramos uma variável numérica do tipo inteiro e pedimos para o usuário digitar um número.<br />

• Na linha if (num > 0) estamos testando o número digitado para saber se o mesmo é maior do que zero. Se<br />

o resultado <strong>de</strong>sta expressão for verda<strong>de</strong>ira a linha printf (“O número digitado é positivo”); será executada.<br />

• Na linha else (senão for um número maior do que zero) estamos indicando para o programa executar a<br />

linha printf (“O número digitado é negativo”);<br />

exemplo <strong>de</strong> aula<br />

Primeiro exemplo<br />

Desenvolver um programa que ler dois valores numéricos e efetuar a adição. Caso o valor somado seja maior<br />

ou igual a 10, <strong>de</strong>verá ser apresentado somando a ele mais 5; caso o valor somado não seja maior ou igual a 10,<br />

este <strong>de</strong>verá ser apresentado subtraindo 7.<br />

algoritmo<br />

1 – Ler um valor para a variável A e outro valor para a variável B;<br />

2 – Efetuar a soma dos valores incógnitos A e B, atribuindo o valor da soma na variável X;<br />

3 – Verificar se X é maior ou igual a 10; caso seja verda<strong>de</strong>iro, calcule R x + 5. Senão calcule R X – 7.<br />

Codificação em Linguagem C<br />

main( )<br />

{<br />

int a,B,x,r;<br />

clrscr( );<br />

printf ( “digite um numero: “ );<br />

scanf ( “%d”, &a );<br />

printf ( “digite outro numero: “ );<br />

scanf ( “%d”, &B );<br />

x = a + B;<br />

if ( x >= 10 )<br />

r = x + 5;


Escola Alci<strong>de</strong>s <strong>Maya</strong> - Primeiro Módulo<br />

else<br />

r = x - 7;<br />

printf ( “o resultado do calculo e: %d “, r );<br />

getch( );<br />

}<br />

múltiplos comandos <strong>de</strong>ntro <strong>de</strong> um if<br />

Quando <strong>de</strong>sejamos agrupar comandos, criando um bloco <strong>de</strong> comandos, utilizamos o abre chaves “{“ e fecha<br />

chaves “}” para encapsular estes comandos.<br />

No if é a mesma coisa, caso vários comandos sejam necessários no corpo do comando if, eles <strong>de</strong>vem estar<br />

entre chaves.<br />

Sua forma geral é:<br />

if (expressão)<br />

{<br />

comando_11;<br />

comando_12;<br />

comando_13;<br />

}<br />

else<br />

{<br />

comando_21;<br />

comando_22;<br />

}<br />

On<strong>de</strong> a expressão é avaliada; se for verda<strong>de</strong>ira os comando_11, comando_12 e o comando_13 são<br />

executados. Se for falsa o comando_21 e o comando_22 são executados.<br />

O programa abaixo dá um exemplo <strong>de</strong> como encapsulamos comandos.<br />

main( )<br />

{<br />

int num;<br />

printf (“digite um número: “ );<br />

scanf (“%d” , &num);<br />

if (num > 0)<br />

{<br />

printf (“o número “);<br />

printf (“digitado é “);<br />

printf (“positivo”);<br />

}<br />

34


else<br />

{<br />

printf (“o número digitado é “);<br />

printf (“negativo”);<br />

}<br />

}<br />

exercícios <strong>de</strong> Fixação<br />

Vamos fazer alguns exercícios<br />

35<br />

<strong>Fundamentos</strong> <strong>de</strong> <strong>Programação</strong><br />

1. FUP que leia dois números quaisquer, e escreva o maior <strong>de</strong>les.<br />

2. FUP que leia dois números quaisquer, e escreva o menor <strong>de</strong>les.<br />

3. FAÇA UM PROGRAMA que leia dois números quaisquer, e escreva o resultado do cálculo do maior<br />

dividido pelo menor.<br />

4. FAÇA UM PROGRAMA que leia a receita e a <strong>de</strong>spesa <strong>de</strong> uma empresa e apresente se ela está com<br />

LUCRO ou com PREJUÍZO.<br />

5. FAÇA UM PROGRAMA que leia 4 notas escolares <strong>de</strong> um aluno. Calcule e apresente a média. Sabendo-se<br />

que a média <strong>de</strong> aprovação da escola é 7, apresente a informação se o aluno foi APROVADO ou REPROVADO.<br />

6. FAÇA UM PROGRAMA que leia dois números e apresente o sinal do produto entre eles. Consi<strong>de</strong>re que<br />

somente números diferentes <strong>de</strong> zero serão digitados.<br />

7. FAÇA UM PROGRAMA que leia um número e escreva “maior do que 100”, se o número digitado for maior<br />

que 100 e escreva “menor do que 100”, se o número for menor do que 100.<br />

8. FAÇA UM PROGRAMA que leia um código:1 – sinal vermelho, 2 – sinal ver<strong>de</strong>. Baseado no código digitado<br />

diga para o pe<strong>de</strong>stre que está esperando no sinal:“SIGA” ou “ESPERE”<br />

9. FAÇA UM PROGRAMA que leia a quantida<strong>de</strong> <strong>de</strong> vitórias e a quantida<strong>de</strong> <strong>de</strong> <strong>de</strong>rrotas <strong>de</strong> um time <strong>de</strong> futebol.<br />

Escrever BOM se o número <strong>de</strong> vitórias for maior que o número <strong>de</strong> <strong>de</strong>rrotas, caso contrário escrever RUIM.<br />

<strong>de</strong>svio Condicional enca<strong>de</strong>ado<br />

Existem casos em que é necessário estabelecer verificação <strong>de</strong> condições sucessivas, em que uma <strong>de</strong>terminada<br />

ação po<strong>de</strong>rá ser executada se um conjunto anterior <strong>de</strong> instruções ou condições for satisfeito. Sendo a ação<br />

executada, ela po<strong>de</strong>rá ainda estabelecer novas condições. Isto significa utilizar uma condição <strong>de</strong>ntro <strong>de</strong> outra<br />

condição. Este tipo <strong>de</strong> estrutura po<strong>de</strong>rá possuir diversos níveis <strong>de</strong> condição, sendo chamadas <strong>de</strong> aninhamentos<br />

ou enca<strong>de</strong>amentos.<br />

exemplos <strong>de</strong> aula<br />

Primeiro exemplo<br />

Desenvolver a lógica para um programa que efetue o cálculo do reajuste <strong>de</strong> salário <strong>de</strong> um funcionário.<br />

Consi<strong>de</strong>re que o funcionário <strong>de</strong>verá receber um reajuste <strong>de</strong> 15% caso seu salário seja menor que 500. Se o<br />

salário for maior ou igual a 500, mas menor ou igual a 1000, seu reajuste será <strong>de</strong> 10%; caso seja ainda maior<br />

que 1000, o reajuste <strong>de</strong>verá ser <strong>de</strong> 5%”.<br />

algoritmo<br />

Perceba que o problema em questão estabelece três condições para calcular o reajuste do salário do<br />

funcionário, sendo:<br />

• Salário 500, mas 1000, reajuste será <strong>de</strong> 5%<br />

Estas condições <strong>de</strong>verão ser enca<strong>de</strong>adas, pois todas as possibilida<strong>de</strong>s <strong>de</strong> reajuste <strong>de</strong>verão ser cercadas.<br />

Sendo assim, observe o algoritmo abaixo:


Escola Alci<strong>de</strong>s <strong>Maya</strong> - Primeiro Módulo<br />

1 – Definir uma variável para o salário reajustado: novo_salario;<br />

2 – Ler um valor para a variável salário;<br />

3 – Verificar se o valor <strong>de</strong> salario


<strong>Fundamentos</strong> <strong>de</strong> <strong>Programação</strong><br />

3 - FAÇA UM PROGRAMA que leia o código <strong>de</strong> uma mercadoria e que escreva o nome do produto conforme<br />

tabela abaixo:<br />

1 – Sabão<br />

2 – Vassoura<br />

3 – Detergente<br />

4 - FAÇA UM PROGRAMA que leia dois números e o código <strong>de</strong> uma operação matemática (+, -, *, /) e que<br />

apresente o resultado da operação. Por exemplo: se forem digitados os números [2] e [5] e a operação [-], será<br />

apresentado o resultado [-3].<br />

Operadores Lógicos<br />

Os operadores lógicos, como o próprio nome diz, avaliam uma expressão lógica e retornam valores também<br />

lógicos, ou seja, verda<strong>de</strong>iro ou falso.<br />

Em várias ocasiões na tomada <strong>de</strong> <strong>de</strong>cisões temos que usar os operadores lógicos.<br />

Os operadores lógicos mais comuns são: .e., .ou., .não., representados em português estruturado, mas que<br />

em linguagem C são respectivamente &&, ||, !.<br />

A tabela seguinte apresenta todos os operadores lógicos da linguagem C:<br />

Operador Representação Descrição<br />

&& .e.<br />

verda<strong>de</strong>iro.<br />

Efetua a operação lógica E. Se ambas as expressões forem verda<strong>de</strong>iras, então o resultado será<br />

|| .ou. Efetua a operação OU. Se uma das expressões (ou ambas) for verda<strong>de</strong>ira, então o resultado<br />

será verda<strong>de</strong>iro.<br />

! .não. Efetua a operação lógica NÃO. Inverte o estado lógico <strong>de</strong> uma expressão; se ela for verda<strong>de</strong>ira,<br />

tona-a falsa e vice-versa.<br />

Para enten<strong>de</strong>r melhor como funcionam os operadores lógicos, vamos analisar cada um <strong>de</strong>les.<br />

O Operador Lógico &&<br />

O operador lógico && (.E.) po<strong>de</strong> ser visto como um conector lógico. Imagine que você possua dois fios ligados<br />

a uma lâmpada e a uma bateria. A lâmpada somente acen<strong>de</strong>rá se você tiver ligado ambos os fios aos pólos da<br />

bateria. Acompanhe esse exemplo no seguinte diagrama:<br />

Fio vermelho ligado Frio preto ligado Lâmpada acen<strong>de</strong><br />

Falso Falso Falso<br />

Verda<strong>de</strong>iro Falso Falso<br />

Falso Verda<strong>de</strong>iro Falso<br />

Verda<strong>de</strong>iro Verda<strong>de</strong>iro Verda<strong>de</strong>iro<br />

Exemplos <strong>de</strong> Aula<br />

Primeiro exemplo<br />

Desenvolver um programa que leia um número. Informar se o número digitado está na faixa <strong>de</strong> 20 a 90.<br />

Algoritmo<br />

1 – Ler um valor para a variável num;<br />

2 – Se o valor digitado estiver na faixa <strong>de</strong> 20 a 90 apresentar uma mensagem informando.<br />

37


Escola Alci<strong>de</strong>s <strong>Maya</strong> - Primeiro Módulo<br />

Codificação em Linguagem C<br />

main( )<br />

{<br />

int num;<br />

clrscr( );<br />

printf ( “Digite um número: “ );<br />

scanf ( “%d”, &num );<br />

if (num >= 20 && num 0 e < 90, se for verda<strong>de</strong>: “ângulo está no primeiro quadrante”<br />

3 – Verificar se o ângulo digitado é > 90 e < 180, se for verda<strong>de</strong>: “ângulo está no segundo quadrante”<br />

4 – Verificar se o ângulo digitado é > 180 e < 270, se for verda<strong>de</strong>: “ângulo está no terceiro quadrante”<br />

5 – Verificar se o ângulo digitado é > 270 e < 360, se for verda<strong>de</strong>: “ângulo está no quarto quadrante”<br />

Codificação em Linguagem C<br />

main( )<br />

{<br />

int angulo;<br />

clrscr( );<br />

printf ( “Digite um angulo: “ );<br />

scanf ( “%d”, &angulo );<br />

if (angulo > 0 && angulo < 90)<br />

printf ( “Angulo no primeiro quadrante” );<br />

else<br />

if (angulo > 90 && angulo < 180)<br />

printf ( “Angulo no segundo quadrante” );<br />

else<br />

if (angulo > 180 && angulo < 270)<br />

printf ( “Angulo no terceiro quadrante” );<br />

else<br />

38


if (angulo > 270 && angulo < 360)<br />

printf ( “Angulo no quarto quadrante” );<br />

getch( );<br />

}<br />

39<br />

<strong>Fundamentos</strong> <strong>de</strong> <strong>Programação</strong><br />

Operador Lógico: .ou.<br />

O operador do tipo .ou. é utilizado quando pelo menos um dos relacionamentos lógicos (quando houver mais<br />

<strong>de</strong> um relacionamento) <strong>de</strong> uma condição necessita ser verda<strong>de</strong>iro. Abaixo, é apresentada a tabela <strong>de</strong> <strong>de</strong>cisão<br />

para este tipo <strong>de</strong> operador:<br />

Condição 1 Condição 2 Resultado<br />

Falsa Falsa Falso<br />

Verda<strong>de</strong>ira Falsa Verda<strong>de</strong>iro<br />

Falsa Verda<strong>de</strong>ira Verda<strong>de</strong>iro<br />

Verda<strong>de</strong>ira Verda<strong>de</strong>ira Verda<strong>de</strong>iro<br />

Consi<strong>de</strong>re agora, como exemplo, que você <strong>de</strong>seja escrever uma carta. Se você tiver uma máquina <strong>de</strong> escrever<br />

ou (OR) um microcomputador, po<strong>de</strong> tranqüilamente satisfazer seu <strong>de</strong>sejo. Acompanhe o diagrama em seguida:<br />

Exemplos <strong>de</strong> Aula<br />

Tem máquina Tem computador Po<strong>de</strong> escrever<br />

Falso Falso Falso<br />

Verda<strong>de</strong>iro Falso Verda<strong>de</strong>iro<br />

Falso Verda<strong>de</strong>iro Verda<strong>de</strong>iro<br />

Verda<strong>de</strong>iro Verda<strong>de</strong>iro Verda<strong>de</strong>iro<br />

Primeiro exemplo<br />

Desenvolver um programa que leia o código relativo ao sexo (masculino=1 ou feminino=2). Se for digitado um<br />

código correto informar que o código é válido, caso contrário informar que o código é inválido.<br />

Algoritmo<br />

1 – Ler um código numérico para a variável codigo;<br />

2 – Se o código digitado for igual a 1 ou igual a 2 apresentar uma mensagem informando que o código é válido<br />

caso contrário informar que o código é inválido.


Escola Alci<strong>de</strong>s <strong>Maya</strong> - Primeiro Módulo<br />

Codificação em Linguagem C<br />

main( )<br />

{<br />

int codigo;<br />

clrscr( );<br />

printf( “digite 1 - para sexo masculino\n” );<br />

printf( “digite 2 - para sexo feminino: “ );<br />

scanf( “%d”, &codigo );<br />

if ( codigo == 1 || codigo == 2 )<br />

printf ( “o código do sexo e válido” );<br />

else<br />

printf ( “o código do sexo e inválido” );<br />

getch( );<br />

}<br />

o operador lógico .ou. é escrito em C através do operador | | (barra,barra).<br />

operador Lógico: .não.<br />

O operador do tipo .não. é utilizado quando houver necessida<strong>de</strong> <strong>de</strong> estabelecer a inversão do resultado<br />

lógico <strong>de</strong> uma <strong>de</strong>terminada condição. Se a condição for verda<strong>de</strong>ira, será consi<strong>de</strong>rada falsa. Se a condição for<br />

falsa, será consi<strong>de</strong>rada verda<strong>de</strong>ira. Abaixo, é apresentada a tabela <strong>de</strong> <strong>de</strong>cisão para este tipo <strong>de</strong> operador:<br />

Condição Resultado<br />

Falsa Verda<strong>de</strong>iro<br />

Falsa Verda<strong>de</strong>iro<br />

Consi<strong>de</strong>re agora, como exemplo, que se você possui um carro e o pneu está furado, você não (NOT) po<strong>de</strong><br />

viajar. É o que mostra a tabela abaixo:<br />

exemplos <strong>de</strong> aula<br />

Primeiro exemplo<br />

Pneu está furado Po<strong>de</strong> viajar<br />

Falso Verda<strong>de</strong>iro<br />

Verda<strong>de</strong>iro Falso<br />

Desenvolver a lógica para um programa que somente efetue o cálculo <strong>de</strong> C (A + B) * X, se o valor da<br />

variável X não for maior que 5. Qualquer valor <strong>de</strong> 5 para baixo efetuará o cálculo C (A + B) * X.<br />

Se forem informados os valores 5, 1 e 2, respectivamente, para as variáveis A, B e X, resultará para a<br />

variável C o valor 12, pois o valor 2 da variável X é controlado pela instrução se .não. (X > 5) então, como<br />

sendo verda<strong>de</strong>iro, uma vez que não é maior que 5. Sendo assim, os valores 5 e 1 são somados resultando 6 e<br />

multiplicados por 2 resultando 12.<br />

Mas se forem informados os valores 5, 1 e 6, respectivamente, para as variáveis A, B e X, resultará para a<br />

variável C o valor 24, pois o valor 6 da variável X é controlado pela instrução se. não. (X > 5) então, como sendo<br />

falso. Sendo assim, os valores 5 e 1 são subtraídos resultando 4 e multiplicados por 6 resultando 24.<br />

40


<strong>Fundamentos</strong> <strong>de</strong> <strong>Programação</strong><br />

algoritmo<br />

1 – Ler um valor numérico para a variável A ,B, X;<br />

2 – Se .não. (X > 5) então calcular: C (A + B) * X caso contrário calcular: C (A – B) * X<br />

3 - Apresentar o valor do resultado do cálculo.<br />

Codificação em Linguagem C<br />

main( )<br />

{<br />

int A, B, C, X;<br />

clrscr( );<br />

printf( “\nDigite um numero qualquer.....: “);<br />

scanf ( “%d”,&A );<br />

printf( “\nDigite outro numero qualquer..: “);<br />

scanf ( “%d”,&B );<br />

printf( “\nDigite mais um numero qualquer: “);<br />

scanf ( “%d”,&X );<br />

if ( !(X > 5) )<br />

C = (A + B) * X;<br />

else<br />

C = (A - B) * X;<br />

printf ( “O resultado do calculo e: %d”, C );<br />

getch( );<br />

}<br />

O operador lógico .não. é escrito em C através do operador ! (exclamação).<br />

exercícios <strong>de</strong> aula<br />

Primeiro exercício<br />

Ler três valores para os lados <strong>de</strong> um triângulo, consi<strong>de</strong>rando lados como: A, B e C. Verificar se os lados<br />

fornecidos formam realmente um triângulo, e se for esta condição verda<strong>de</strong>ira, <strong>de</strong>verá ser indicado qual tipo <strong>de</strong><br />

triângulo foi formado: isósceles, escaleno ou eqüilátero.<br />

algoritmo<br />

Para estabelecer este algoritmo, é necessário em primeiro lugar saber o que realmente é um triângulo. Se<br />

você não souber o que é um triângulo, conseqüentemente não conseguirá resolver o problema.<br />

Triângulo é uma forma geométrica (polígono) composta por três lados, sendo que cada lado é menor que<br />

a soma dos outros dois lados. Perceba que isto é uma regra (uma condição) e <strong>de</strong>verá ser consi<strong>de</strong>rada. É um<br />

triângulo quando A


Escola Alci<strong>de</strong>s <strong>Maya</strong> - Primeiro Módulo<br />

Se não, verificar se A=B ou A=C ou B=C, sendo verda<strong>de</strong> o triângulo é isósceles; caso contrário, o triângulo<br />

é escaleno.<br />

3 – Caso os lados fornecidos não caracterizem um triângulo, avisar a ocorrência.<br />

Codificação em Linguagem C<br />

main( )<br />

{<br />

float A, B, C;<br />

clrscr( );<br />

printf( “Digite um lado do triangulo.....: “ );<br />

scanf (“%f”,&A );<br />

printf( “Digite outro lado do triangulo..: “ );<br />

scanf (“%f”,&B );<br />

printf( “Digite o outro lado do triangulo: “ );<br />

scanf (“%f”,&C );<br />

if ( A < B + C && B < A + C && C < A + B)<br />

if ( A == B && B == C )<br />

printf (“Triangulo eqüilátero”);<br />

else<br />

if ( A == B || A == C || C == B )<br />

printf (“Triangulo Isósceles”);<br />

else<br />

printf (“Triangulo Escaleno”);<br />

else<br />

printf( “As medidas não formam um triangulo” );<br />

getch( );<br />

}<br />

exercícios <strong>de</strong> Fixação<br />

1 - FAÇA UM PROGRAMA que leia as coor<strong>de</strong>nadas <strong>de</strong> um ponto no plano (x,y) e escreva o quadrante ao<br />

qual pertence o ponto no plano. No primeiro quadrante x e y são positivos. No segundo quadrante y é positivo.<br />

No terceiro quadrante nem x nem y é positivo. No quarto quadrante x é positivo.<br />

2 - FAÇA UM PROGRAMA que leia o QI <strong>de</strong> uma pessoa e escreva uma mensagem baseada na tabela abaixo.<br />

Observe que os colchetes i<strong>de</strong>ntificam um intervalo fechado e os parênteses i<strong>de</strong>ntificam um intervalo aberto.<br />

[ 000, 030 ) - Ameba<br />

[ 030, 050 ) - Débil Mental<br />

[ 050, 070 ) - Regular<br />

[ 070, 100 ) - Normal<br />

[ 100, 150 ] - Gênio<br />

Outros - QI inválido<br />

42


<strong>Fundamentos</strong> <strong>de</strong> <strong>Programação</strong><br />

3 - FAÇA UM PROGRAMA que leia três notas <strong>de</strong> uma pessoa. Calcular a média e apresentar um conceito<br />

conforme a tabela abaixo:<br />

[ 10, 09 ] - A<br />

( 09, 07 ] - B<br />

( 07, 04 ] - C<br />

( 04, 00 ] - D<br />

4 - A empresa XYZ & Cia Ltda <strong>de</strong>cidiu conce<strong>de</strong>r um aumento <strong>de</strong> salários a seus funcionários <strong>de</strong> acordo com<br />

a tabela abaixo:<br />

saLárIo atuaL índICe <strong>de</strong> aumento<br />

De 0 até 400 15%<br />

Acima <strong>de</strong> 400 até 700 12%<br />

Acima <strong>de</strong> 700 até 1000 10%<br />

Acima <strong>de</strong> 1000 até 1800 7%<br />

Acima <strong>de</strong> 1800 até 2500 4%<br />

Acima <strong>de</strong> 2500 0%<br />

FAÇA UM PROGRAMA que leia o número do funcionário, o seu salário atual. Calcular e apresentar o valor<br />

do salário já corrigido.<br />

5 estruturas <strong>de</strong> ControLe – Laços <strong>de</strong> rePetIção<br />

Como já foi visto na disciplina <strong>de</strong> Lógica <strong>de</strong> <strong>Programação</strong>, existem ocasiões em que é necessário efetuar<br />

a repetição <strong>de</strong> um trecho <strong>de</strong> programa um <strong>de</strong>terminado número <strong>de</strong> vezes. Neste caso, po<strong>de</strong>rá ser criado um<br />

looping que efetue o processamento <strong>de</strong> um <strong>de</strong>terminado trecho, tantas vezes quantas forem necessárias. Os<br />

loopings também são chamados <strong>de</strong> laços <strong>de</strong> repetição.<br />

Vamos agora implementar estas estruturas em linguagem C.<br />

Por exemplo, imagine um programa que peça a leitura <strong>de</strong> um valor para a variável num, multiplique esse valor<br />

por 3, colocando a resposta na variável result e apresente o valor obtido, repetindo esta seqüência por cinco<br />

vezes, conforme mostrado abaixo:<br />

Codificação em Linguagem C<br />

main( )<br />

{<br />

int num, result;<br />

printf(“\nDigite um número: “);<br />

scanf(“%d” , &num);<br />

result = num * 3;<br />

printf(“\nO número multiplicado por 3 é: %d” , result);<br />

printf(“\nDigite um número: “);<br />

scanf(“%d” , &num);<br />

result = num * 3;<br />

printf(“\nO número multiplicado por 3 é: %d” , result);<br />

43


Escola Alci<strong>de</strong>s <strong>Maya</strong> - Primeiro Módulo<br />

printf(“\nDigite um número: “);<br />

scanf(“%d” , &num);<br />

result = num * 3;<br />

printf(“\nO número multiplicado por 3 é: %d” , result);<br />

printf(“\nDigite um número: “);<br />

scanf(“%d” , &num);<br />

result = num * 3;<br />

printf(“\nO número multiplicado por 3 é: %d” , result);<br />

printf(“\nDigite um número: “);<br />

scanf(“%d” , &num);<br />

result = num * 3;<br />

printf(“\nO valor digitado multiplicado por 3 é: %d” , result);<br />

}<br />

Para estes casos existem comandos apropriados para efetuar a repetição <strong>de</strong> <strong>de</strong>terminados trechos <strong>de</strong><br />

programas o número <strong>de</strong> vezes que for necessário. A principal vantagem <strong>de</strong>ste recurso é que o programa passa<br />

ater um tamanho menor, po<strong>de</strong>ndo sua amplitu<strong>de</strong> <strong>de</strong> processamento ser aumentada sem alterar o tamanho do<br />

código <strong>de</strong> programação. Desta forma, po<strong>de</strong>-se <strong>de</strong>terminar repetições com números variados <strong>de</strong> vezes.<br />

repetição do tipo: teste Lógico no início do looping<br />

Caracteriza-se por uma estrutura que efetua um teste lógico no início <strong>de</strong> um looping, verificando se é permitido<br />

executar o trecho <strong>de</strong> instruções subordinado a esse looping. A estrutura em questão é <strong>de</strong>nominada <strong>de</strong> enquanto,<br />

sendo conseguida com a utilização do conjunto <strong>de</strong> instruções enquanto...faça...fim_enquanto.<br />

A estrutura enquanto...faça...fim_enquanto tem o seu funcionamento controlado por <strong>de</strong>cisão. Sendo assim,<br />

po<strong>de</strong>rá executar um <strong>de</strong>terminado conjunto <strong>de</strong> instruções enquanto a condição verificada for Verda<strong>de</strong>ira. No<br />

momento em que esta condição se torna Falsa, o processamento da rotina é <strong>de</strong>sviado para fora do looping. Se<br />

a condição for Falsa logo <strong>de</strong> início, as instruções contidas no looping são ignoradas.<br />

No início <strong>de</strong>sta aula fizemos um programa que fazia a leitura <strong>de</strong> um valor para a variável num, multiplicava<br />

esse valor por 3, colocando a resposta na variável result e apresentava o valor obtido, repetindo esta seqüência<br />

por cinco vezes, porque não conhecíamos a estrutura enquanto...faça...fim_enquanto, agora vamos fazer o<br />

mesmo exemplo utilizando a estrutura para o controle do laço <strong>de</strong> repetição.<br />

exercícios <strong>de</strong> aula<br />

Primeiro exemplo<br />

Desenvolver um programa que faça a leitura <strong>de</strong> um valor para a variável num, multiplique esse valor por 3,<br />

colocando a resposta na variável result e apresentar o valor obtido, repetindo esta seqüência por cinco vezes.<br />

algoritmo<br />

1 – Criar uma variável para servir <strong>de</strong> contador com valor inicial 1;<br />

2 – Enquanto o valor do contador for menor ou igual a 5, processar os passos 3, 4, 5 e 6<br />

3 – Ler um valor para a variável num;<br />

4 – Efetuar a multiplicação do valor <strong>de</strong> num por 3, atribuindo o resultado em result;<br />

5 – Apresentar o valor calculado contido na variável result;<br />

6 – Acrescentar +1 a variável do tipo contador, <strong>de</strong>finida no passo 1;<br />

7 – Quando contador for maior que 5, encerrar o processamento do looping.<br />

44


Codificação em Linguagem C<br />

main( )<br />

{<br />

int num, result, cont;<br />

clrscr( );<br />

cont = 1;<br />

while ( cont


Escola Alci<strong>de</strong>s <strong>Maya</strong> - Primeiro Módulo<br />

Codificação em Linguagem C<br />

main( )<br />

{<br />

int num,result;<br />

char resp;<br />

clrscr( );<br />

resp = ‘S’;<br />

while( resp == ‘S’ )<br />

{<br />

printf ( “\nDigite um numero: “ );<br />

scanf ( “%d”, &num );<br />

result = num * 3;<br />

printf ( “O numero multiplicado por 3 e: %d \n”, result );<br />

printf ( “Deseja continuar? “ );<br />

resp = getch( );<br />

}<br />

}<br />

exercícios <strong>de</strong> Fixação<br />

Utilizando a estrutura while os exercícios abaixo:<br />

1. FAÇA UM PROGRAMA que escreva na tela os números <strong>de</strong> 0 até 20.<br />

2. FAÇA UM PROGRAMA que escreva na tela os números pares <strong>de</strong> 0 até 20.<br />

3. FAÇA UM PROGRAMA que escreva na tela os números <strong>de</strong> 20 até 0<br />

4. FAÇA UM PROGRAMA que leia 10 valores inteiros e escreva no final a soma dos valores lidos.<br />

5. FAÇA UM PROGRAMA que leia 10 valores inteiros e escreva no final a média dos valores lidos.<br />

6. FAÇA UM PROGRAMA que leia 20 valores e escreva no final a soma dos valores positivos e a média dos<br />

negativos.<br />

7. FAÇA UM PROGRAMA que leia números até que o usuário não queira mais digitar os números. No final<br />

escrever a soma dos valores positivos e a soma dos valores negativos.<br />

Repetição do tipo: Teste Lógico no fim do looping<br />

A estrutura em questão é <strong>de</strong>nominada <strong>de</strong> repita, sendo conseguida com a utilização do conjunto <strong>de</strong> instruções<br />

repita...até_que.<br />

A estrutura repita...até_que tem o seu funcionamento controlado por <strong>de</strong>cisão. Porém, irá efetuar a execução <strong>de</strong><br />

um conjunto <strong>de</strong> instruções pelo menos uma vez antes <strong>de</strong> verificar a valida<strong>de</strong> da condição estabelecida. Diferente<br />

da estrutura enquanto que executa somente um conjunto <strong>de</strong> instruções, enquanto a condição é verda<strong>de</strong>ira.<br />

Desta forma repita tem seu funcionamento em sentido contrário a enquanto, pois sempre irá processar um<br />

conjunto <strong>de</strong> instruções no mínimo uma vez até que a condição se torne verda<strong>de</strong>ira. Para a estrutura repita um<br />

conjunto <strong>de</strong> instruções é executado enquanto a condição se mantém Falsa até que ela seja Verda<strong>de</strong>ira.<br />

exemplos <strong>de</strong> aula<br />

Primeiro exemplo<br />

Desenvolver um programa que faça a leitura <strong>de</strong> um valor para a variável num, multiplique esse valor por 3,<br />

colocando a resposta na variável result e apresentar o valor obtido, repetindo esta seqüência por cinco vezes.<br />

É o mesmo exemplo utilizado na estrutura enquanto para que você possa fazer uma comparação entre as<br />

estruturas.<br />

46


<strong>Fundamentos</strong> <strong>de</strong> <strong>Programação</strong><br />

algoritmo<br />

1 – Criar uma variável para servir <strong>de</strong> contador com valor inicial 1;<br />

2 – Ler um valor para a variável num;<br />

3 – Efetuar a multiplicação do valor <strong>de</strong> num por 3, atribuindo o resultado em result;<br />

4 – Apresentar o valor calculado contido na variável result;<br />

5 – Acrescentar +1 a variável do tipo contador, <strong>de</strong>finida no passo 1;<br />

6 – Repita os passos 2, 3, 4 e 5 até que o contador seja maior que 5.<br />

Codificação em Linguagem C<br />

main( )<br />

{<br />

int num,result;<br />

int cont;<br />

clrscr( );<br />

cont = 1;<br />

do<br />

{<br />

printf ( “\ndigite um numero: “ );<br />

scanf ( “%d”, &num );<br />

result = num * 3;<br />

printf ( “o numero multiplicado por 3 e: %d \n”, result );<br />

cont = cont + 1;<br />

}<br />

while ( cont


Escola Alci<strong>de</strong>s <strong>Maya</strong> - Primeiro Módulo<br />

Codificação em Linguagem C<br />

main( )<br />

{<br />

int num,result;<br />

char resp;<br />

clrscr( );<br />

do<br />

{<br />

printf ( “\nDigite um numero: “ );<br />

scanf ( “%d”, &num );<br />

result = num * 3;<br />

printf ( “O numero multiplicado por 3 e: %d \n”, result );<br />

printf ( “Deseja continuar? “ );<br />

resp = getch( );<br />

}<br />

while( resp == ‘S’ );<br />

}<br />

exercícios <strong>de</strong> Fixação<br />

Vamos fazer alguns exercícios<br />

1. FAÇA UM PROGRAMA que leia números até que o usuário não queira mais digitar os números. No final<br />

escrever a soma dos valores lidos.<br />

2. FAÇA UM PROGRAMA que leia números até que o usuário não queira mais digitar os números. No final<br />

escrever a média dos valores lidos.<br />

3. FAÇA UM PROGRAMA que leia números até que o usuário não queira mais digitar os números. No final<br />

escrever a soma dos valores positivos e a soma dos valores negativos.<br />

4. FAÇA UM PROGRAMA que leia números até que o usuário não queira mais digitar os números. No final<br />

escrever a soma dos valores positivos e a média dos valores negativos.<br />

repetição do tipo: Variável <strong>de</strong> Controle<br />

Anteriormente, foram vistas duas formas <strong>de</strong> elaborar looping. Uma usando o conceito enquanto e a outra<br />

usando o conceito repita. Foi visto também como elaborar rotinas que efetuaram a execução <strong>de</strong> um looping um<br />

<strong>de</strong>terminado número <strong>de</strong> vezes com a utilização <strong>de</strong> um contador (por meio <strong>de</strong> uma variável <strong>de</strong> controle).<br />

Porém, existe uma possibilida<strong>de</strong> <strong>de</strong> facilitar o uso <strong>de</strong> contadores finitos sem fazer uso das duas estruturas<br />

anteriores, <strong>de</strong>ixando-as para utilização <strong>de</strong> loopings em que não se conhece <strong>de</strong> antemão o número <strong>de</strong> vezes que<br />

uma <strong>de</strong>terminada seqüência <strong>de</strong> instruções <strong>de</strong>verá ser executada. Os loopings que possuem um número finito <strong>de</strong><br />

execuções po<strong>de</strong>rão ser processador por meio <strong>de</strong> estrutura <strong>de</strong> laços contados do tipo para, sendo conseguida<br />

com a utilização do conjunto <strong>de</strong> instruções para...<strong>de</strong>...até...passo...faça...fim_para.<br />

A estrutura para...<strong>de</strong>...até...passo...faça...fim_para tem o seu funcionamento controlado por uma variável<br />

<strong>de</strong>nominada contador. Sendo assim, po<strong>de</strong>rá executar um <strong>de</strong>terminado conjunto <strong>de</strong> instruções um <strong>de</strong>terminado<br />

número <strong>de</strong> vezes.<br />

exemplos <strong>de</strong> aula<br />

Primeiro exemplo<br />

Desenvolver um programa que faça a leitura <strong>de</strong> um valor para a variável num, multiplique esse valor por 3,<br />

colocando a resposta na variável result e apresentar o valor obtido, repetindo esta seqüência por cinco vezes.<br />

É o mesmo exemplo utilizado na estrutura enquanto para que você possa fazer uma comparação entre as<br />

estruturas.<br />

48


<strong>Fundamentos</strong> <strong>de</strong> <strong>Programação</strong><br />

algoritmo<br />

1 – Definir um contador, variando <strong>de</strong> 1 a 5;<br />

2 – Ler um valor para a variável num;<br />

3 – Efetuar a multiplicação do valor <strong>de</strong> num por 3, atribuindo o resultado em result;<br />

4 – Apresentar o valor calculado contido na variável result;<br />

5 – Repitir os passos 2, 3, 4 e 5 até que o contador seja encerrado.<br />

Codificação em Linguagem C<br />

main( )<br />

{<br />

int num,result;<br />

int cont;<br />

clrscr( );<br />

for( cont=1; cont


Escola Alci<strong>de</strong>s <strong>Maya</strong> - Primeiro Módulo<br />

terceiro exemplo<br />

Desenvolver um programa que escreva na tela os números <strong>de</strong> 10 até 1.<br />

Repare que estamos <strong>de</strong>sejando escrever os números na seguinte seqüência: 10, 9, 8, 7, 6, 5, 4, 3, 2, 1.<br />

Algoritmo<br />

1 – Definir um contador, variando <strong>de</strong> 10 a 1;<br />

2 – Apresentar o valor contido na variável contador;<br />

5 – Repitir o passo 2 até que o contador seja encerrado.<br />

Codificação em Linguagem C<br />

main( )<br />

{<br />

int cont;<br />

clrscr( );<br />

for( cont=10; cont


<strong>Fundamentos</strong> <strong>de</strong> <strong>Programação</strong><br />

Neste programa o usuário é quem vai <strong>de</strong>terminar o fim da leitura das notas, ou seja, você <strong>de</strong>verá perguntar<br />

ao usuário se ele <strong>de</strong>seja continuar digitando notas.<br />

10 - FAÇA UM PROGRAMA que leia códigos e execute tarefas, conforme tabela abaixo:<br />

0 – Encerra o programa<br />

1 – Inclui uma unida<strong>de</strong> no estoque<br />

2 – Exclui uma unida<strong>de</strong> no estoque<br />

3 – Mostra o total disponível no estoque<br />

4 – Mostra o total <strong>de</strong> entradas no estoque<br />

5 – Mostra o total <strong>de</strong> saídas no estoque<br />

Outro código escrever: “Código Inválido”<br />

11 - FAÇA UM PROGRAMA para controlar o acesso <strong>de</strong> pessoas a um restaurante. O restaurante possui uma<br />

capacida<strong>de</strong> <strong>de</strong> 40 vagas, que não po<strong>de</strong>rá ser ultrapassada. O controle se dará através <strong>de</strong> códigos, conforme a<br />

tabela:<br />

0 – FIM<br />

1 – ENTRA UMA PESSOA (escrever: “Entrou”)<br />

2 – SAI UMA PESSOA (escrever: “Saiu”)<br />

3 – MOSTRAR QUANTOS LUGARES ESTÃO DISPONÍVEIS<br />

4 – MOSTRAR O TOTAL DE PESSOAS QUE ENTRARAM<br />

5 – MOSTRAR O TOTAL DE PESSOAS QUE SAÍRAM<br />

Outro código escrever: “Código Inválido”<br />

12 - FAÇA UM PROGRAMA que calcule o <strong>de</strong>sconto do imposto <strong>de</strong> renda. O programa <strong>de</strong>verá perguntar<br />

quando a pessoa <strong>de</strong>seja encerrar o programa (“Deseja fazer outro cálculo? (S/N)”). O programa <strong>de</strong>ve pedir<br />

o valor do salário, calcular e apresentar o valor do <strong>de</strong>sconto baseado na seguinte informação:<br />

Salário até R$ 900,00 é isento (Não paga imposto <strong>de</strong> renda)<br />

Salário acima <strong>de</strong> R$ 900,00 até R$ 1.800,00 para 15% <strong>de</strong> imposto <strong>de</strong> renda<br />

Salário acima <strong>de</strong> R$ 1.800,00 para 27% <strong>de</strong> imposto <strong>de</strong> renda<br />

13 - FAÇA UM PROGRAMA que leia o peso das pessoas que querem entrar em um elevador. A capacida<strong>de</strong><br />

máxima do elevador é <strong>de</strong> 15 pessoas ou 800 Kg, o que ocorrer primeiro. O programa <strong>de</strong>ve ler o peso da pessoa<br />

que <strong>de</strong>seja entrar, se a sua entrada não fizer com que seja ultrapassado qualquer um dos limites, <strong>de</strong>verá escrever:<br />

“PODE ENTRAR”, caso contrário, ou seja, ultrapassando os limites, <strong>de</strong>verá escrever: “NÃO PODE ENTRAR:<br />

ELEVADOR LOTADO” e encerrar o programa, mostrando o número <strong>de</strong> pessoas transportadas e o peso total<br />

transportado.<br />

14 - FAÇA UM PROGRAMA que leia dois números e a operação <strong>de</strong>sejada ( + , - , * , / ) e que escreva na<br />

tela o resultado da operação. O programa <strong>de</strong>pois <strong>de</strong> apresentar o resultado <strong>de</strong>verá perguntar quando a pessoa<br />

<strong>de</strong>seja encerrar o programa (“Deseja fazer outro cálculo? (S/N)”). Se a reposta for S <strong>de</strong>verá pedir outros<br />

números e a operação <strong>de</strong>sejada, se a resposta for N <strong>de</strong>verá encerrar o programa.<br />

15 - Em uma fábrica <strong>de</strong> chocolates, foi <strong>de</strong>signado ao programador, fazer um programa que calcule o <strong>de</strong>sconto<br />

<strong>de</strong> INSS dos funcionários. Este programa <strong>de</strong>ve ler o nome do funcionário e o valor do salário bruto. Calcular o<br />

<strong>de</strong>sconto do INSS levando em consi<strong>de</strong>ração o seguinte:<br />

f) Para salários até R$ 500,00 a alíquota <strong>de</strong> INSS será <strong>de</strong> 8%<br />

g) Para salários acima <strong>de</strong> R$ 500,00 até R$ 1.000,00 a alíquota <strong>de</strong> INSS será <strong>de</strong> 10%<br />

h) Para salários acima <strong>de</strong> R$ 1.000,00 a alíquota <strong>de</strong> INSS será <strong>de</strong> 12%<br />

Para cada funcionário <strong>de</strong>verá ser apresentado na tela:<br />

a) Nome do Funcionário<br />

b) Salário Bruto<br />

c) Taxa <strong>de</strong> INSS<br />

d) Valor <strong>de</strong> INSS<br />

e) Salário Líquido<br />

Após estas apresentações o programa <strong>de</strong>verá fazer uma pergunta: “Deseja fazer mais algum cálculo? (S/N)”,<br />

se a resposta for afirmativa o programa <strong>de</strong>verá continuar com os dados do próximo funcionário, caso contrário<br />

51


Escola Alci<strong>de</strong>s <strong>Maya</strong> - Primeiro Módulo<br />

<strong>de</strong>verá ser terminado.<br />

16 - FAÇA UM PROGRAMA que possibilite calcular a área total <strong>de</strong> uma residência (sala, cozinha, banheiro,<br />

quartos, área <strong>de</strong> serviço, quintal, garagem, etc). O programa <strong>de</strong>ve solicitar a entrada do nome, a largura e<br />

o comprimento <strong>de</strong> um <strong>de</strong>terminado cômodo. Em seguida, <strong>de</strong>ve apresentar a área do cômodo lido e também<br />

uma mensagem solicitando do usuário a confirmação <strong>de</strong> continuar calculando novos cômodos. Caso o usuário<br />

responda que “NÃO”, o programa <strong>de</strong>ve apresentar o valor total acumulado da área resi<strong>de</strong>ncial.<br />

6 estruturas <strong>de</strong> dados Homogêneas I<br />

Durante os pontos estudados em Desvios condicionais e Estruturas <strong>de</strong> repetição, percebeu-se que o po<strong>de</strong>r <strong>de</strong><br />

programação tornou-se maior, antes limitado somente ao que foi estudado em técnicas básicas <strong>de</strong> programação.<br />

Porém, tendo o domínio das técnicas anteriores, ainda correr-se-á o risco <strong>de</strong> não conseguir resolver alguns tipos<br />

<strong>de</strong> problemas, pois foram trabalhadas até aqui apenas variáveis simples que somente armazenam um valor por<br />

vez.<br />

Vamos agora apresentar uma técnica <strong>de</strong> programação que permitirá trabalhar como o agrupamento <strong>de</strong> várias<br />

informações <strong>de</strong>ntro <strong>de</strong> uma mesma variável, sendo sempre do mesmo tipo <strong>de</strong> dado, e por esta razão é chamado<br />

<strong>de</strong> estrutura <strong>de</strong> dados homogênea.<br />

A utilização <strong>de</strong>ste tipo <strong>de</strong> estrutura <strong>de</strong> dados recebe diversos nomes, como: variáveis in<strong>de</strong>xadas, variáveis<br />

compostas, variáveis subscritas, arranjos, vetores, matrizes, tabelas em memória ou arrays (do inglês). São<br />

vários os nomes encontrados, a que nós iremos tratar por matrizes.<br />

matrizes <strong>de</strong> uma dimensão ou vetores<br />

Este tipo <strong>de</strong> estrutura é conhecida como matrizes unidimensionais ou também <strong>de</strong> vetor. Caracteriza-se por<br />

ser <strong>de</strong>finida uma única variável dimensionada com um <strong>de</strong>terminado tamanho. A dimensão <strong>de</strong> uma matriz é<br />

constituída por uma constante inteira positiva. Os nomes dados às matrizes seguem as mesmas regras <strong>de</strong><br />

nomes utilizados para i<strong>de</strong>ntificar as variáveis simples.<br />

Para ter uma idéia <strong>de</strong> como utilizar matrizes em uma <strong>de</strong>terminada situação consi<strong>de</strong>re o seguinte problema:<br />

“Em uma Escola Técnica <strong>de</strong> Informática, há um professor que faz 6 avaliações durante o semestre. Gostaríamos<br />

<strong>de</strong> fazer um programa que leia as 6 notas <strong>de</strong> um aluno. No final calcular e apresentar a média do aluno”.<br />

Desta forma será necessário somar as 6 notas <strong>de</strong> cada aluno e calcular a sua média. A tabela a seguir<br />

apresenta um aluno, suas notas bimestrais e a coluna da média do aluno que <strong>de</strong>verá ser calculada.<br />

Aluno Nota 1 Nota 2 Nota 3 Nota 4 Nota 5 Nota 6 Média<br />

1 4.0 6.0 5.0 3.0 7.5 4.0 ?<br />

Agora basta escrever um programa para efetuar o cálculo da média <strong>de</strong> cada aluno.<br />

Vamos começar pelo cálculo da média <strong>de</strong> cada aluno, iremos representar as notas <strong>de</strong> cada aluno pelas<br />

variáveis: nota1, nota2, nota3, nota4, nota5, nota6, e para o cálculo da média a variável media, todas do tipo<br />

real.<br />

algoritmo<br />

1 – Ler as notas do aluno para as variáveis nota1, nota2, nota3, nota4, nota5, nota6;<br />

2 – Efetuar a soma das notas e a divisão <strong>de</strong>las por 6, atribuindo o seu resultado para a variável media;<br />

3 – Apresentar o valor da variável media após a operação <strong>de</strong> soma e divisão dos valores fornecidos.<br />

Com o conhecimento adquirido até este momento, seria então elaborado um programa que efetuaria a leitura<br />

<strong>de</strong> cada nota, a soma <strong>de</strong>las e a divisão do valor da soma por 6, obtendo-se <strong>de</strong>sta forma a média do aluno.<br />

52


Codificação em Linguagem C<br />

main( )<br />

{<br />

float nota1;<br />

float nota2;<br />

float nota3;<br />

float nota4;<br />

float nota5;<br />

float nota6;<br />

float soma;<br />

float media;<br />

printf( “Digite a nota 1: “ );<br />

scanf( “%f” , &nota1 );<br />

printf( “Digite a nota 2: “ );<br />

scanf( “%f” , &nota2 );<br />

printf( “Digite a nota 3: “ );<br />

scanf( “%f” , &nota3 );<br />

printf( “Digite a nota 4: “ );<br />

scanf( “%f” , &nota4 );<br />

printf( “Digite a nota 5: “ );<br />

scanf( “%f” , &nota5 );<br />

printf( “Digite a nota 6: “ );<br />

scanf( “%f” , &nota6 );<br />

soma = nota1 + nota2 + nota3 + nota4 + nota5 + nota6;<br />

media = soma / 6;<br />

printf ( “A média do aluno foi: %f \n” , media );<br />

}<br />

53<br />

<strong>Fundamentos</strong> <strong>de</strong> <strong>Programação</strong><br />

Perceba que para receber as notas foram utilizadas 6 variáveis. Com a técnica <strong>de</strong> matrizes po<strong>de</strong>ria ter sido<br />

utilizada apenas uma variável com a capacida<strong>de</strong> <strong>de</strong> armazenar 6 valores.<br />

operações básicas com matrizes <strong>de</strong> uma dimensão<br />

Uma matriz <strong>de</strong> uma dimensão ou vetor será representada por seu nome e seu tamanho (dimensão) entre<br />

colchetes. Desta forma seria uma matriz nota[6], sendo seu nome nota, possuindo um tamanho <strong>de</strong> 6.<br />

Isto significa que po<strong>de</strong>rão ser armazenados em nota até 6 elementos. Perceba que na utilização <strong>de</strong> variáveis<br />

simples existe uma regra: uma variável somente po<strong>de</strong> conter um valor por vez. No caso das matrizes, po<strong>de</strong>rão<br />

armazenar mais <strong>de</strong> um valor por vez, pois são dimensionadas exatamente para este fim. Desta forma po<strong>de</strong>rse-á<br />

manipular uma quantida<strong>de</strong> maior <strong>de</strong> informação com pouco trabalho <strong>de</strong> processamento. Deve-se apenas<br />

consi<strong>de</strong>rar que com relação à manipulação dos elementos <strong>de</strong> uma matriz, eles ocorrerão <strong>de</strong> forma individualizada,<br />

pois não é possível efetuar a manipulação <strong>de</strong> todos os elementos do conjunto ao mesmo tempo.<br />

No caso do exemplo do cálculo da média do aluno, ter-se-ia então uma única variável in<strong>de</strong>xada (a matriz)<br />

contendo todos os valores das 8 notas. Isto seria representado da seguinte forma:


Escola Alci<strong>de</strong>s <strong>Maya</strong> - Primeiro Módulo<br />

nota[0] = 4.0<br />

nota[1] = 6.0<br />

nota[2] = 5.0<br />

nota[3] = 3.0<br />

nota[4] = 7.5<br />

nota[5] = 4.0<br />

Observe que o nome é um só. O que muda é a informação indicada <strong>de</strong>ntro dos colchetes.<br />

A esta informação dá-se o nome <strong>de</strong> índice, sendo este o en<strong>de</strong>reço em que o elemento está armazenado. É<br />

necessário que fique bem claro que o elemento é o conteúdo da matriz, neste caso os valores das notas. No caso<br />

<strong>de</strong> nota[0] = 4.0, o número 0 é o índice; o en<strong>de</strong>reço on<strong>de</strong> cujo elemento é 4.0 está armazenado.<br />

atribuição <strong>de</strong> uma matriz<br />

Anteriormente, foram utilizadas várias instruções para po<strong>de</strong>r <strong>de</strong>finir e montar um programa. No caso da<br />

utilização <strong>de</strong> matrizes, será <strong>de</strong>finida a instrução conjunto que indicará em português estruturado a utilização<br />

<strong>de</strong> uma matriz, tendo como sintaxe: conjunto[] <strong>de</strong> , sendo que será a<br />

indicação dos valores inicial e final do tamanho do vetor e se o vetor em questão utilizar valores<br />

reais, inteiros, lógicos ou caracteres.<br />

Leitura <strong>de</strong> dados <strong>de</strong> uma matriz<br />

A leitura <strong>de</strong> uma matriz é processada passo a passo, um elemento por vez. A instrução <strong>de</strong> leitura é leia seguida<br />

da variável mais o índice. A seguir, são apresentados o fluxograma e a codificação em português estruturado da<br />

leitura das notas dos alunos, cálculo da média e a sua apresentação.<br />

Codificação em Linguagem C<br />

main( )<br />

{<br />

float nota[6];<br />

float soma;<br />

float media;<br />

int indice;<br />

clrscr( );<br />

soma = 0;<br />

for( indice = 0; indice < 6; indice++ )<br />

{<br />

printf ( “digite a nota %d do aluno: “, indice+1 );<br />

scanf ( “%f”, &nota[indice] );<br />

soma = soma + nota[indice];<br />

}<br />

media = soma / 6;<br />

printf ( “a media do aluno e: %4.1f”, media );<br />

getch( );<br />

}<br />

Observe que na linguagem C o índice começa com o valor zero, pois o en<strong>de</strong>reço do primeiro elemento da<br />

matriz em C é zero, o en<strong>de</strong>reço do segundo elemento da matriz em C é um e assim sucessivamente.<br />

54


<strong>Fundamentos</strong> <strong>de</strong> <strong>Programação</strong><br />

A tabela a seguir, mostra como ficarão os valores armazenados na matriz em linguagem C:<br />

matriz: nota<br />

índice elemento<br />

0 4.0<br />

1 6.0<br />

2 5.0<br />

3 3.0<br />

4 7.5<br />

5 4.0<br />

esCrIta dos dados <strong>de</strong> uma matrIz<br />

O processo <strong>de</strong> escrita <strong>de</strong> uma matriz é bastante parecido com o processo <strong>de</strong> leitura <strong>de</strong> seus elementos. Para<br />

esta ocorrência <strong>de</strong>verá ser utilizada a instrução escreva seguida da indicação da variável e seu índice.<br />

Supondo que após a leitura das 6 notas, houvesse a necessida<strong>de</strong> <strong>de</strong> apresenta-las antes da apresentação<br />

do valor da média. Abaixo são apresentados o fluxograma e a codificação em português estruturado da escrita<br />

das 6 notas antes <strong>de</strong> ser apresentado o cálculo da média.<br />

Codificação em Linguagem C<br />

main( )<br />

{<br />

float nota[6];<br />

float soma;<br />

float media;<br />

int indice;<br />

clrscr( );<br />

soma = 0;<br />

for( indice = 0; indice < 6; indice++ )<br />

{<br />

printf ( “digite a nota %d do aluno: “, indice+1 );<br />

scanf ( “%f”, &nota[indice] );<br />

soma = soma + nota[indice];<br />

}<br />

media = soma / 6;<br />

for( indice = 0; indice < 6; indice++ )<br />

printf ( “a nota %d do aluno e: %4.1f \n”, indice+1, nota[índice] );<br />

printf ( “a media do aluno e: %4.1f”, media );<br />

getch( );<br />

}<br />

exemplos <strong>de</strong> aula<br />

Para <strong>de</strong>monstrar a utilização <strong>de</strong> uma matriz em um exemplo um pouco maior, consi<strong>de</strong>re como problemas os<br />

exemplos apresentados em seguida:<br />

55


Escola Alci<strong>de</strong>s <strong>Maya</strong> - Primeiro Módulo<br />

Primeiro exemplo<br />

Desenvolver um programa que efetue a leitura <strong>de</strong> <strong>de</strong>z elementos <strong>de</strong> uma matriz A tipo vetor. Construir uma<br />

matriz B <strong>de</strong> mesmo tipo, observando a seguinte lei <strong>de</strong> formação: se o valor do índice for par, o valor <strong>de</strong>verá ser<br />

multiplicado por 5, sendo ímpar, <strong>de</strong>verá ser somado com 5. Ao final mostrar o conteúdo da matriz A e B<br />

algoritmo<br />

Este exemplo <strong>de</strong> resolução estará mostrando como fazer o tratamento da condição do índice.<br />

1 – Iniciar o contador <strong>de</strong> índice, variável índice como 1 em um contador até 10;<br />

2 – Ler os 10 valores, um a um;<br />

3 – Verificar se o índice é par se sim multiplica por 5, se não soma 5. Criar a matriz B;<br />

4 – Apresentar o conteúdo das duas matrizes.<br />

Deverá ser verificado se o valor do índice em um <strong>de</strong>terminado momento é par (ele será par quando dividido<br />

por 2 obtiver resto igual a zero). Sendo a condição verda<strong>de</strong>ira, será atribuído na matriz B[índice] a multiplicação<br />

do elemento da matriz A[índice] por 5. Caso o valor do índice seja ímpar, será atribuído na matriz B[índice] a<br />

soma do elemento da matriz A[índice] por 5.<br />

Codificação em Linguagem C<br />

main( )<br />

{<br />

int matriza[10];<br />

int matrizB[10];<br />

int indice;<br />

int resp;<br />

clrscr( );<br />

for( indice = 0; indice < 10; indice++ )<br />

{<br />

printf ( “digite um valor numerico inteiro: “ );<br />

scanf ( “%d”, &matriza[indice] );<br />

}<br />

for( indice = 0; indice < 10; indice++ )<br />

{<br />

resp = indice %;<br />

if ( resp == 0 )<br />

matrizB[indice] = matriza[indice] * 5;<br />

else<br />

matrizB[indice] = matriza[indice] + 5;<br />

}<br />

for( indice = 0; indice < 10; indice++ )<br />

printf ( “\nConteudo da matriz a indice %d = %d”, indice, matriza[indice] );<br />

for( indice = 0; indice < 10; indice++ )<br />

printf ( “\nConteudo da matriz B indice %d = %d”, indice, matrizB[indice] );<br />

getch( );<br />

}<br />

56


segundo exemplo<br />

57<br />

<strong>Fundamentos</strong> <strong>de</strong> <strong>Programação</strong><br />

Desenvolver um programa que efetue a leitura <strong>de</strong> <strong>de</strong>z elementos <strong>de</strong> uma matriz A do tipo vetor. No final,<br />

apresente o total da soma <strong>de</strong> todos os elementos que sejam ímpares.<br />

algoritmo<br />

Perceba que em relação ao primeiro exemplo, este apresenta uma diferença: o primeiro pedia para verificar<br />

se o índice era par ou ímpar. Neste exemplo, está sendo solicitado que analise a condição do elemento e não<br />

do índice. Já foi alertado anteriormente para se tomar cuidado para não confundir elemento com índice. Vamos<br />

a solução:<br />

1 – Iniciar o contador <strong>de</strong> índice, variável índice como 1 em um contador até 10;<br />

2 – Ler os 10 valores, um a um;<br />

3 – Verificar se o elemento é ímpar; se sim efetuar a soma dos elementos;<br />

4 – Apresentar o total somado <strong>de</strong> todos os elementos ímpares da matriz.<br />

Observe que quando se faz menção ao índice indica-se a variável que controla o contador <strong>de</strong> índice, e no<br />

caso do exemplo anterior, a variável índice. Quando se faz menção ao elemento, indica-se matrizA[índice] pois<br />

<strong>de</strong>sta forma está se pegando o valor armazenado e não a sua posição <strong>de</strong> en<strong>de</strong>reço.<br />

Codificação em Linguagem C<br />

main( )<br />

{<br />

int matriza[10];<br />

int indice;<br />

int resp;<br />

int soma;<br />

clrscr( );<br />

soma = 0;<br />

for( indice = 0; indice < 10; indice++ )<br />

{<br />

printf ( “digite um valor numerico inteiro: “ );<br />

scanf ( “%d”, &matriza[indice] );<br />

}<br />

for( indice = 0; indice < 10; indice++ )<br />

{<br />

resp = matriza[indice] % 2;<br />

if ( resp == 1 )<br />

soma = soma + matriza[indice];<br />

}<br />

printf ( “\na soma dos elementos ímpares é: %d” , soma );<br />

getch( );<br />

}


Escola Alci<strong>de</strong>s <strong>Maya</strong> - Primeiro Módulo<br />

exercícios <strong>de</strong> Fixação<br />

1 – Desenvolva os algoritmos, seus respectivos fluxogramas e proceda a codificação em português estruturado<br />

os seguintes programas:<br />

2. Faça um programa para ler 10 elementos <strong>de</strong> uma matriz tipo vetor e apresenta-los<br />

3. Faça um programa para ler 8 elementos em uma matriz A tipo vetor. Construir uma matriz B <strong>de</strong> mesma<br />

dimensão com os elementos da matriz A multiplicados por 3. O elemento B[1] <strong>de</strong>verá ser atribuído pelo elemento<br />

A[1] * 3, o elemento B[2] atribuído pelo elemento A[2] * 3 e assim por diante, até 8. Apresentar a matriz B.<br />

4. Faça um programa para ler duas matrizes A e B com 20 elementos. Construir uma matriz C, on<strong>de</strong> cada<br />

elemento <strong>de</strong> C é a soma do elemento correspon<strong>de</strong>nte <strong>de</strong> A com B. Apresentar a matriz C.<br />

5. Faça um programa que leia 15 elementos <strong>de</strong> uma matriz A do tipo vetor. Construir uma matriz B <strong>de</strong> mesmo<br />

tipo, observando a seguinte lei <strong>de</strong> formação: “Todo elemento <strong>de</strong> B <strong>de</strong>verá ser o quadrado do elemento <strong>de</strong> A<br />

correspon<strong>de</strong>nte”. Apresentar as matrizes A e B.<br />

6. Faça um programa para ler uma matriz A do tipo vetor com 15 elementos. Construir uma matriz B <strong>de</strong><br />

mesmo tipo, sendo que cada elemento da matriz B seja o fatorial do elemento correspon<strong>de</strong>nte da matriz A .<br />

Apresentar as matrizes A e B.<br />

7. Faça um programa para ler duas matrizes A e B com 15 elementos cada. Construir uma matriz C, sendo<br />

esta a junção das duas outras matrizes. Desta forma C <strong>de</strong>verá ter o dobro <strong>de</strong> elementos, ou seja 30. Apresentar<br />

a matriz C.<br />

8. Faça um programa para ler duas matrizes do tipo vetor, sendo A com 20 elementos e B com 30 elementos.<br />

Construir uma matriz C, sendo esta a junção das duas outras matrizes. Desta forma C <strong>de</strong>verá ter a capacida<strong>de</strong><br />

<strong>de</strong> armazenar 50 elementos. Apresentar a matriz C.<br />

9. Faça um programa para ler 20 elementos <strong>de</strong> uma matriz A tipo vetor e construir uma matriz B <strong>de</strong> mesma<br />

dimensão com os mesmos elementos da matriz A, sendo que <strong>de</strong>verão estar invertidos. Ou seja, o primeiro<br />

elemento <strong>de</strong> A passa a ser o último <strong>de</strong> B, o segundo elemento <strong>de</strong> A passa a ser o penúltimo <strong>de</strong> B e assim por<br />

diante. Apresentar as matrizes A e B.<br />

10. Faça um programa para ler três matrizes (A, B e C) <strong>de</strong> uma dimensão com 5 elementos cada. Construir<br />

uma matriz D, sendo esta a junção das três outras matrizes. Desta forma D <strong>de</strong>verá ter o triplo <strong>de</strong> elementos, ou<br />

seja 15. Apresentar os elementos da matriz D.<br />

11. Faça um programa para ler uma matriz A do tipo vetor com 20 elementos. Construir uma matriz B do<br />

mesmo tipo da matriz A, sendo que cada elemento <strong>de</strong> B seja o somatório do elemento correspon<strong>de</strong>nte da matriz<br />

A . Se o valor do elemento <strong>de</strong> A[1] for 5, B[1] <strong>de</strong>verá ser 10, se o valor do elemento <strong>de</strong> A[2] for 7, B[2] <strong>de</strong>verá ser<br />

14 e assim por diante.<br />

12. Faça um programa para ler uma matriz A do tipo vetor com 10 elementos. Construir uma matriz B do<br />

mesmo tipo da matriz A, sendo que cada elemento <strong>de</strong> B <strong>de</strong>verá ser o valor negativo do elemento correspon<strong>de</strong>nte<br />

da matriz A . Desta forma, se o valor do elemento <strong>de</strong> A[1] for 8, B[1] <strong>de</strong>verá ser -8, se o valor do elemento <strong>de</strong> A[2]<br />

for 3, B[2] <strong>de</strong>verá ser -3 e assim por diante.<br />

13. Faça um programa para ler uma matriz A tipo vetor com 10 elementos. Construir uma matriz B <strong>de</strong> mesmo<br />

tipo, sendo que cada elemento <strong>de</strong> B <strong>de</strong>verá ser a meta<strong>de</strong> <strong>de</strong> cada elemento <strong>de</strong> A . Apresentar os elementos das<br />

matrizes A e B.<br />

14. Faça um programa que efetue o cálculo <strong>de</strong> uma tabuada <strong>de</strong> um número qualquer e armazene os resultados<br />

em uma matriz A <strong>de</strong> uma dimensão para 10 elementos. Apresentar os valores armazenados na matriz.<br />

15. Ler 20 elementos (valores reais) para temperaturas em graus Celsius em uma matriz A <strong>de</strong> uma dimensão<br />

do tipo vetor. O programa <strong>de</strong>verá apresentar a menor, a maior e a média das temperaturas lidas.<br />

16. Ler 25 elementos (valores reais) para temperaturas em graus Celsius em uma matriz A <strong>de</strong> uma dimensão<br />

do tipo vetor. Construir uma matriz B <strong>de</strong> mesmo tipo e dimensão, em que cada elemento da matriz B <strong>de</strong>verá<br />

ser a conversão da temperatura em graus Fahrenheit do elemento correspon<strong>de</strong>nte da matriz A . Apresentar os<br />

elementos das matrizes A e B.<br />

17. Ler 12 elementos inteiros para uma matriz A <strong>de</strong> uma dimensão do tipo vetor. Construir uma matriz B <strong>de</strong><br />

mesmo tipo e dimensão, observando a seguinte lei <strong>de</strong> formação: “Todo elemento da matriz A que for ímpar <strong>de</strong>verá<br />

ser multiplicado por 2 e armazenado na matriz B; caso contrário, o elemento da matriz A <strong>de</strong>verá ser armazenado<br />

na matriz B sem nenhum cálculo”. Apresentar os elementos das matrizes A e B.<br />

18. Ler 15 elementos reais para uma matriz A <strong>de</strong> uma dimensão do tipo vetor. Construir uma matriz B <strong>de</strong><br />

mesmo tipo e dimensão, observando a seguinte lei <strong>de</strong> formação: “Todo elemento da matriz A que possuir índice<br />

par <strong>de</strong>verá ter seu elemento dividido por 2; caso contrário, o elemento da matriz A <strong>de</strong>verá ser multiplicado por<br />

1.5”. Apresentar os elementos das matrizes A e B.<br />

58


<strong>Fundamentos</strong> <strong>de</strong> <strong>Programação</strong><br />

19. Faça um programa que leia uma matriz numérica <strong>de</strong> 10 elementos. No final apresentar quantos números<br />

são positivos e quantos são negativos<br />

20. Faça um programa que leia uma matriz numérica <strong>de</strong> 10 elementos. No final encontrar nesta matriz o<br />

maior valor lido, apresentando a sua posição na matriz e o seu valor.<br />

21. Faça um programa que leia uma matriz numérica <strong>de</strong> 10 elementos. No final encontrar nesta matriz o<br />

menor valor lido, apresentando a sua posição na matriz e o seu valor.<br />

22. Faça um programa que leia uma matriz numérica <strong>de</strong> 10 elementos. No final encontrar nesta matriz o<br />

maior valor lido e o menor valor lido<br />

23. Faça um programa que leia uma matriz numérica chamada notas <strong>de</strong> 10 elementos. Ler valores para o<br />

vetor e, após ter lido, <strong>de</strong>terminar a media dos valores contidos no vetor<br />

24. Em uma Escola Técnica <strong>de</strong> Informática, há um professor que faz 6 provas. Faça um programa que leia<br />

as notas <strong>de</strong>stas provas para um vetor notas. No final calcular e apresentar a média do aluno e o resultado obtido<br />

conforme a tabela a seguir:<br />

[00,05) - Reprovado<br />

[05,07) - Recuperação<br />

[07,09) - Satisfatório<br />

[09,10] - Ótimo<br />

7 estruturas <strong>de</strong> dados Homogêneas II<br />

No capítulo anterior trabalhamos com o agrupamento <strong>de</strong> várias informações <strong>de</strong>ntro <strong>de</strong> uma mesma variável,<br />

<strong>de</strong> mesmo tipo <strong>de</strong> dado, chamada <strong>de</strong> estrutura <strong>de</strong> dados homogênea, ou seja, matrizes, do tipo vetor. Agora<br />

iremos trabalhar com uma estrutura um pouco mais complexa, também chamada <strong>de</strong> matrizes, mas <strong>de</strong> mais <strong>de</strong><br />

uma dimensão.<br />

matrizes com mais <strong>de</strong> uma dimensão<br />

Anteriormente, houve contato com o uso <strong>de</strong> uma única variável in<strong>de</strong>xada com apenas uma dimensão (uma<br />

coluna e várias linhas), quando foi utilizado o exemplo para efetuar o cálculo da média do aluno. A partir <strong>de</strong>ste<br />

ponto, serão apresentadas tabelas com mais colunas, sendo assim, teremos variáveis no sentido horizontal e<br />

vertical.<br />

Com o conhecimento adquirido até este ponto, você tem condições suficientes para elaborar um programa<br />

que leia as notas dos alunos, calcule a média <strong>de</strong> cada aluno e no final apresente a média <strong>de</strong> toda a turma,<br />

utilizando-se <strong>de</strong> matrizes bidimensionais.<br />

Porém, cuidado, é necessário manter um controle <strong>de</strong> cada índice em cada matriz para um mesmo aluno.<br />

Para facilitar o trabalho com estruturas <strong>de</strong>ste porte é que serão utilizadas matrizes com mais dimensões. A<br />

mais comum é a matriz <strong>de</strong> duas dimensões por se relacionar diretamente com a utilização <strong>de</strong> tabelas.<br />

Matrizes com mais <strong>de</strong> duas dimensões são utilizadas com menos freqüência, mas po<strong>de</strong>rão ocorrer em<br />

momentos em que se necessite trabalhar com um número maior <strong>de</strong> dimensões, porém estas são fáceis <strong>de</strong><br />

utilizar, se estivermos dominando bem a utilização <strong>de</strong> uma matriz com duas dimensões.<br />

É importante consi<strong>de</strong>rar que na manipulação <strong>de</strong> uma matriz unidimensional é utilizada uma única instrução<br />

<strong>de</strong> looping. No caso <strong>de</strong> matrizes com mais dimensões, <strong>de</strong>verão ser utilizadas o número <strong>de</strong> loopings relativo ao<br />

tamanho <strong>de</strong> sua dimensão. Desta forma, uma matriz <strong>de</strong> duas dimensões <strong>de</strong>verá ser controlada com dois loopings<br />

<strong>de</strong> três dimensões <strong>de</strong>verá ser controlada por três loopings e assim por diante.<br />

Em matrizes <strong>de</strong> mais <strong>de</strong> uma dimensão os seus elementos são também manipulados <strong>de</strong> forma individualizada,<br />

sendo a referência feita sempre por meio <strong>de</strong> dois índices; o primeiro para indicar a linha e o segundo para indicar<br />

a coluna.<br />

Para você ter uma idéia <strong>de</strong> como utilizar matrizes <strong>de</strong> duas dimensões vamos utilizar o mesmo exemplo<br />

que usamos no capítulo anterior, mas agora com um número maior <strong>de</strong> alunos: “Em uma Escola Técnica <strong>de</strong><br />

Informática, há um professor que faz 4 avaliações durante o semestre. Gostaríamos <strong>de</strong> fazer um programa que<br />

leia as 4 notas <strong>de</strong> cada aluno da turma (turma com 8 alunos), calcule e apresente a média <strong>de</strong> cada aluno.”.<br />

59


Escola Alci<strong>de</strong>s <strong>Maya</strong> - Primeiro Módulo<br />

Veja como ficaria nossa tabela com as notas e as médias <strong>de</strong> cada aluno:<br />

aluno nota 1 nota 2 nota 3 nota 4<br />

1 4.0 6.0 5.0 3.0<br />

2 6.0 7.0 5.0 8.0<br />

3 9.0 8.0 9.0 6.0<br />

4 3.0 5.0 4.0 2.0<br />

5 4.0 6.0 6.0 8.0<br />

6 7.0 7.0 7.0 7.0<br />

7 8.0 7.0 6.0 5.0<br />

8 6.0 7.0 2.0 9.0<br />

Operações básicas com matrizes <strong>de</strong> duas dimensões<br />

Uma matriz <strong>de</strong> duas dimensões está sempre fazendo referência a linhas e a colunas e é representada por<br />

seu nome e seu tamanho (dimensão) entre colchetes.<br />

Desta forma é uma matriz <strong>de</strong> duas dimensões nota[8][4] , on<strong>de</strong> seu nome é nota, possuindo um tamanho <strong>de</strong><br />

8 linhas e 4 colunas, ou seja, é uma matriz <strong>de</strong> 8 por 4 (8 x 4). Isto significa que po<strong>de</strong>m ser armazenados em nota<br />

até 32 elementos.<br />

Para armazenar as 4 notas do primeiro aluno <strong>de</strong>veríamos fazer algo como visto abaixo:<br />

nota[0] [0] = 4.0<br />

nota[0] [1] = 6.0<br />

nota[0] [2] = 5.0<br />

nota[0] [3] = 3.0<br />

Observe que o nome é um só. O que muda é a informação indicada <strong>de</strong>ntro dos colchetes. No primeiro<br />

colchete está a informação da linha e no segundo colchete está a informação da coluna.<br />

Para armazenar as 4 notas do segundo aluno <strong>de</strong>veríamos fazer o seguinte:<br />

nota[1] [0] = 6.0<br />

nota[1] [1] = 7.0<br />

nota[1] [2] = 5.0<br />

nota[1] [3] = 8.0<br />

Para armazenar as 4 notas do terceiro aluno <strong>de</strong>veríamos fazer o seguinte:<br />

nota[2] [0] = 9.0<br />

nota[2] [1] = 8.0<br />

nota[2] [2] = 9.0<br />

nota[2] [3] = 6.0<br />

E assim sucessivamente até que se armazene as notas <strong>de</strong> todos os oito alunos.<br />

Atribuição <strong>de</strong> uma Matriz<br />

Uma matriz <strong>de</strong> duas dimensões é atribuída pela instrução conjunto já utilizada para <strong>de</strong>finir o uso <strong>de</strong> uma<br />

matriz <strong>de</strong> uma dimensão, sendo bastante parecidas em sua referência.<br />

A sintaxe é: variável : conjunto[:] <strong>de</strong> , sendo que e<br />

são a indicação do tamanho da tabela e o tipo da matriz, que po<strong>de</strong>rá ser formada<br />

por valores reais, inteiros, lógicos ou caracteres.<br />

60


<strong>Fundamentos</strong> <strong>de</strong> <strong>Programação</strong><br />

Leitura <strong>de</strong> dados <strong>de</strong> uma matriz<br />

A leitura <strong>de</strong> uma matriz <strong>de</strong> duas dimensões, assim como das matrizes <strong>de</strong> uma dimensão é processado passo<br />

a passo, um elemento por vez. A instrução <strong>de</strong> leitura é leia seguida da variável mais os seus índices. A seguir,<br />

são apresentados o fluxograma e a codificação em português estruturado da leitura das notas dos alunos, cálculo<br />

da média e a sua apresentação.<br />

Observe que está sendo consi<strong>de</strong>rada a leitura <strong>de</strong> 4 notas <strong>de</strong> 8 alunos. Assim sendo, a tabela em questão<br />

armazena 32 elementos. Um <strong>de</strong>talhe a ser consi<strong>de</strong>rado é a utilização <strong>de</strong> duas variáveis para controlar os dois<br />

índices <strong>de</strong> posicionamento <strong>de</strong> dados na tabela. Anteriormente, utilizamos a variável índice para controlar as<br />

posições dos elementos <strong>de</strong>ntro da matriz, ou seja, a posição em nível <strong>de</strong> linha. Neste exemplo a variável índice<br />

passa a ser tratada como lin, controlando a posição da linha, e a segunda variável será tratada como col,<br />

controlando a posição da coluna. Muitos programadores utilizam i no lugar <strong>de</strong> lin e utilizam j no lugar <strong>de</strong> col.<br />

Analisando o fluxograma, temos a inicialização das variáveis lin e col como 1, ou seja, a leitura será efetuada<br />

na primeira linha da primeira coluna. Em seguida é iniciado em primeiro lugar o looping da variável lin para<br />

controlar a posição em relação às linhas e <strong>de</strong>pois é iniciado o looping da variável col para controlar a posição em<br />

relação às colunas.<br />

Veja que, ao serem iniciados os valores para o preenchimento da tabela, eles são colocados na posição<br />

nota[1,1], lembrando que o primeiro valor <strong>de</strong>ntro dos colchetes representa a linha e o segundo representa a<br />

coluna.<br />

Será digitado então, para o primeiro aluno a primeira nota. Depois é incrementado mais 1 em relação à<br />

coluna, sendo colocada para a entrada a posição nota[1,2], linha 1 coluna 2. Desta forma, será digitado para o<br />

primeiro aluno a segunda nota.<br />

Quando o contador <strong>de</strong> coluna atingir o valor 4, ele será encerrado e será efetuado o cálculo e a apresentação<br />

da média. Em seguida o contador da variável lin será incrementado com mais 1, tornando-se 2. Será então<br />

inicializado novamente o contador col em 1, permitindo que seja digitado um novo dado na posição nota[2,1].<br />

O mecanismo <strong>de</strong> preenchimento esten<strong>de</strong>r-se-á até que o contador <strong>de</strong> linhas atinja o seu último valor, no<br />

caso 8. Esse looping é o principal, tendo a função <strong>de</strong> controlar o posicionamento na tabela por aluno. O segundo<br />

looping, mais interno, controla o posicionamento das notas.<br />

Codificação em Linguagem C<br />

main( )<br />

{<br />

float nota[8][4];<br />

float soma, media, valor;<br />

int lin, col;<br />

clrscr( );<br />

for( lin = 0; lin < 8; lin++ )<br />

{<br />

soma = 0;<br />

for( col = 0; col < 4; col++ )<br />

{<br />

printf ( “digite a nota %d do aluno %d : “, col+1, lin+1 );<br />

scanf ( “%f”, &valor );<br />

nota[lin][col] = valor;<br />

soma = soma + nota[lin][col];<br />

}<br />

61


Escola Alci<strong>de</strong>s <strong>Maya</strong> - Primeiro Módulo<br />

media = soma / 4;<br />

printf ( “a media do aluno e: %4.1f \n”, media );<br />

}<br />

getch( );<br />

}<br />

exemplos <strong>de</strong> aula<br />

Para <strong>de</strong>monstrar a utilização <strong>de</strong> uma matriz <strong>de</strong> duas dimensões, consi<strong>de</strong>re os exemplos apresentado sem<br />

seguida:<br />

Primeiro exemplo<br />

Desenvolver um programa que efetue a leitura das receitas e <strong>de</strong>spesas dos primeiros 6 meses <strong>de</strong> uma<br />

empresa. Calcular e armazenar o resultado mensal da empresa.<br />

Algoritmo<br />

1 – Ler as receitas <strong>de</strong> cada mês<br />

2 – Ler as <strong>de</strong>spesas <strong>de</strong> cada mês<br />

3 – Calcular o resultado <strong>de</strong> cada mês subtraindo a receita da <strong>de</strong>spesa<br />

4 – Apresentar as receitas, as <strong>de</strong>spesas e o resultados <strong>de</strong> cada mês<br />

Pela característica do programa a ser <strong>de</strong>senvolvido, seria i<strong>de</strong>al utilizarmos uma matriz 3 x 6, para armazenar<br />

estes dados. Nas colunas teremos os meses, nas linhas teremos respectivamente receitas, <strong>de</strong>spesas e resultados,<br />

veja o <strong>de</strong>senho a seguir:<br />

Receitas<br />

Despesas<br />

Resultados<br />

Janeiro Fevereiro Março Abril Maio Junho<br />

Codificação em Linguagem C<br />

main( )<br />

{<br />

float caixa[3][6];<br />

float valor;<br />

int lin, col;<br />

clrscr( );<br />

lin = 0;<br />

for( col = 0; col < 6; col++ )<br />

{<br />

printf ( “digite a receita do mes %d: “, col+1 );<br />

scanf ( “%f”, &valor );<br />

caixa[lin][col] = valor;<br />

}<br />

lin = 1;<br />

for( col = 0; col < 6; col++ )<br />

62


{<br />

printf ( “digite a <strong>de</strong>spesa do mes %d: “, col+1 );<br />

scanf ( “%f”, &valor );<br />

caixa[lin][col] = valor;<br />

}<br />

for( col = 0; col < 6; col++ )<br />

caixa[2][col] = caixa[0][col] - caixa[1][col];<br />

for( col = 0; col < 6; col++ )<br />

{<br />

printf ( “a receita do mes %d e: %.2f \n”, col+1, caixa[0][col] );<br />

printf ( “a <strong>de</strong>spesa do mes %d e: %.2f \n”, col+1, caixa[1][col] );<br />

printf ( “o resultado do mes %d e: %.2f \n”, col+1, caixa[2][col] );<br />

}<br />

getch( );<br />

}<br />

<strong>Fundamentos</strong> <strong>de</strong> <strong>Programação</strong><br />

exerCíCIos <strong>de</strong> FIxação<br />

1 – Desenvolva os algoritmos, seus respectivos fluxogramas e proceda a codificação em português estruturado<br />

os seguintes programas:<br />

1. Faça um programa para ler duas matrizes A e B, cada uma <strong>de</strong> duas dimensões com 5 linhas e 3 colunas.<br />

Construir uma matriz C <strong>de</strong> mesma dimensão, que é formada pela soma dos elementos da matriz A com os<br />

elementos da matriz B. Apresentar a matriz C.<br />

2. Faça um programa para ler duas matrizes A e B, cada uma com 7 elementos. Construir uma matriz C, <strong>de</strong><br />

duas dimensões, em que a primeira coluna <strong>de</strong>verá ser formada pelos elementos da matriz A e a segunda coluna<br />

<strong>de</strong>verá ser formada pelos elementos da matriz B. Apresentar a matriz C.<br />

3. Faça um programa para ler 20 elementos para uma matriz qualquer, consi<strong>de</strong>rando que ela tenha o tamanho<br />

<strong>de</strong> 4 linhas por 5 colunas, em seguida apresentar a matriz.<br />

4. Faça um programa para ler uma matriz A <strong>de</strong> uma dimensão com 10 elementos. Construir uma matriz<br />

C <strong>de</strong> duas dimensões com três colunas, em que a primeira coluna da matriz C é formada pelos elementos da<br />

matriz A somados com mais 5, a segunda coluna é formada pelo valor do cálculo da fatorial <strong>de</strong> cada elemento<br />

correspon<strong>de</strong>nte da matriz A e a terceira e última coluna <strong>de</strong>verá ser formada pelos quadrados dos elementos<br />

correspon<strong>de</strong>ntes da matriz A . Apresentar a matriz C.<br />

5. Faça um programa para ler duas matrizes A e B, cada uma com uma dimensão pra 12 elementos. Construir<br />

uma matriz C <strong>de</strong> duas dimensões, sendo que a primeira coluna da matriz C <strong>de</strong>verá ser formada pelos elementos<br />

da matriz A multiplicados por 2 e a segunda coluna <strong>de</strong>verá ser formada pelos elementos da matriz B subtraídos<br />

<strong>de</strong> 5. Apresentar a matriz C.<br />

6. Faça um programa para ler uma matriz A <strong>de</strong> duas dimensões com 5 linhas e 4 colunas. Construir uma matriz<br />

B <strong>de</strong> mesma dimensão, on<strong>de</strong> cada elemento da matriz B <strong>de</strong>verá ser o fatorial <strong>de</strong> cada elemento correspon<strong>de</strong>nte<br />

da matriz A . Apresentar ao final as matrizes A e B.<br />

7. Faça um programa para ler uma matriz A <strong>de</strong> duas dimensões com 4 linhas e 5 colunas, armazenando<br />

nessa matriz os valores das temperaturas em graus Celsius. Construir uma matriz B <strong>de</strong> mesma dimensão,<br />

sendo que cada elemento da matriz B <strong>de</strong>verá ser o valor da temperatura em graus Fahrenheit <strong>de</strong> cada elemento<br />

correspon<strong>de</strong>nte da matriz A . Apresentar ao final as matrizes A e B.<br />

8. Faça um programa para ler uma matriz A <strong>de</strong> duas dimensões com 5 linhas e 5 colunas. Construir uma<br />

matriz B <strong>de</strong> mesma dimensão, sendo que cada elemento da matriz B <strong>de</strong>verá ser o dobro <strong>de</strong> cada elemento<br />

correspon<strong>de</strong>nte da matriz A, com exceção para os valores situados na diagonal principal (posições B[1,1], B[2,2],<br />

B[3,3], B[4,4] e B[5.5] ) os quais <strong>de</strong>verão ser o triplo <strong>de</strong> cada elemento correspon<strong>de</strong>nte da matriz A . Apresentar<br />

63


Escola Alci<strong>de</strong>s <strong>Maya</strong> - Primeiro Módulo<br />

ao final a matriz B.<br />

9. Faça um programa para ler uma matriz A <strong>de</strong> duas dimensões com 7 linhas e 7 colunas. Construir uma<br />

matriz B <strong>de</strong> mesma dimensão, sendo que cada elemento da matriz B <strong>de</strong>verá ser o somatório <strong>de</strong> cada elemento<br />

correspon<strong>de</strong>nte da matriz A, com exceção para os valores situados na diagonal principal (posições B[1,1], B[3,3],<br />

B[5.5] e B[7,7] ) os quais <strong>de</strong>verão ser o fatorial <strong>de</strong> cada elemento correspon<strong>de</strong>nte da matriz A . Apresentar ao final<br />

a matriz B.<br />

10. Faça um programa para ler uma matriz A <strong>de</strong> duas dimensões com 6 linhas e 5 colunas. Construir uma<br />

matriz B <strong>de</strong> mesma dimensão, que <strong>de</strong>verá ser formada do seguinte modo: para cada elemento par da matriz A<br />

<strong>de</strong>verá ser somado 5 e para cada elemento ímpar da matriz A <strong>de</strong>verá ser subtraído 4. Apresentar ao final a matriz<br />

A e B.<br />

11. Faça um programa para ler uma matriz A <strong>de</strong> duas dimensões com 4 linhas e 4 colunas. Apresentar o<br />

somatório dos elementos situados na diagonal principal (posições A[1,1], A[2,2], A[3,3], A[4.4] ) da referida<br />

matriz.<br />

12. Faça um programa que leia uma matriz A <strong>de</strong> duas dimensões com 15 linhas e 15 colunas. Apresentar o<br />

somatório dos elementos pares situados na diagonal principal da referida matriz.<br />

13. Faça um programa que leia uma matriz A <strong>de</strong> duas dimensões com 7 linhas e 7 colunas. Ao final apresentar<br />

o total <strong>de</strong> elementos pares existentes <strong>de</strong>ntro da matriz.<br />

14. Faça um programa que leia uma matriz <strong>de</strong> duas dimensões com 7 linhas e 7 colunas. Ao final apresentar<br />

o total <strong>de</strong> elementos positivos, o total <strong>de</strong> elementos negativos e o total <strong>de</strong> elementos cujo valor é zero.<br />

15. Faça um programa que leia uma matriz numérica <strong>de</strong> duas dimensões <strong>de</strong> 5 linhas e 8 colunas. No final<br />

encontrar e apresentar <strong>de</strong>sta matriz o maior valor lido e o menor valor lido.<br />

16. Faça um programa que leia uma matriz <strong>de</strong> duas dimensões com 5 linhas e 5 colunas. Apresentar o<br />

somatório dos elementos positivos situados na diagonal principal da referida matriz.<br />

8. PRogRAMAção ESTRuTuRADA<br />

Funções I<br />

A partir <strong>de</strong>sta aula serão estudados a aplicação e o uso <strong>de</strong> Funções.<br />

Quando apren<strong>de</strong>mos conceitos <strong>de</strong> sub-rotinas em algoritmos, também falávamos sobre Funções.<br />

Estas sub-rotinas também são conhecidas pela <strong>de</strong>nominação <strong>de</strong> módulos, sub-programas, ou subalgoritmos.<br />

Na linguagem C as sub-rotinas são tratadas como FUNÇÕES.<br />

Na realida<strong>de</strong>, não importa como são chamadas, o que importa é a forma como funcionam e como <strong>de</strong>vem ser<br />

aplicadas em um programa, e é isto que iremos apren<strong>de</strong>r a partir <strong>de</strong>ste momento.<br />

Iremos rever o conceito <strong>de</strong> criação estruturada <strong>de</strong> programas, pois para escrever um programa <strong>de</strong> computador<br />

necessita-se <strong>de</strong> estudo (levantamento <strong>de</strong> todas as necessida<strong>de</strong>s e <strong>de</strong>talhes do que <strong>de</strong>verá ser feito) e metodologia<br />

(regras básicas que <strong>de</strong>verão ser seguidas).<br />

Sem a aplicação <strong>de</strong> métodos não será possível resolver gran<strong>de</strong>s problemas; quando muito, pequenos<br />

problemas.<br />

as sub-rotinas<br />

No geral, problemas complexos exigem algoritmos complexos. Mas sempre é possível dividir um problema<br />

gran<strong>de</strong> em problemas menores. Desta forma, cada parte menor tem um algoritmo mais simples, e é esse trecho<br />

menor que é chamado <strong>de</strong> sub-rotina. Uma sub-rotina é na verda<strong>de</strong> um programa, e sendo um programa po<strong>de</strong>rá<br />

efetuar diversas operações computacionais (entrada, processamento e saída) e <strong>de</strong>verá ser tratada como foram<br />

os programas projetados até este momento. As sub-rotinas são utilizadas na divisão <strong>de</strong> algoritmos complexos,<br />

permitindo assim possuir a modularização <strong>de</strong> um <strong>de</strong>terminado problema, consi<strong>de</strong>rado gran<strong>de</strong> e <strong>de</strong> difícil<br />

solução.<br />

Quando trabalhamos com esta técnica, po<strong>de</strong>-se <strong>de</strong>parar com a necessida<strong>de</strong> <strong>de</strong> dividir uma sub-rotina em<br />

outras tantas quantas forem necessárias, buscando uma solução mais simples <strong>de</strong> uma parte do problema maior.<br />

O processo <strong>de</strong> dividir sub-rotinas em outras é <strong>de</strong>nominado Método <strong>de</strong> Refinamento Sucessivo.<br />

64


<strong>Fundamentos</strong> <strong>de</strong> <strong>Programação</strong><br />

o método top-down<br />

Des<strong>de</strong> muito tempo este é um dos processos mais simples e mais utilizados pelos programadores.<br />

O processo <strong>de</strong> programar um computador torna-se bastante simples quando aplicado o método <strong>de</strong> utilização<br />

<strong>de</strong> sub-rotinas (módulos <strong>de</strong> programas). Porém, a utilização <strong>de</strong>ssas sub-rotinas <strong>de</strong>verá ser feita com aplicação<br />

do método top down.<br />

Um método bastante a<strong>de</strong>quado para a programação <strong>de</strong> um computador é trabalhar com o conceito <strong>de</strong><br />

programação estruturada, pois a maior parte das linguagens <strong>de</strong> programação utilizadas atualmente também é, o<br />

que facilita a aplicação <strong>de</strong>ste processo <strong>de</strong> trabalho.<br />

O método mais a<strong>de</strong>quado para a programação estruturada é o Top-Down (De cima para baixo) o qual se<br />

caracteriza basicamente por:<br />

• Antes <strong>de</strong> iniciar a construção do programa, o programador <strong>de</strong>verá ter em mente as tarefas principais que<br />

este <strong>de</strong>verá executar. Não é necessário saber como funcionarão, somente saber quantas são.<br />

• Conhecidas todas as tarefas a serem executadas, tem-se em mente como <strong>de</strong>verá ser o programa principal,<br />

o qual vai controlar todas as outras tarefas distribuídas em suas sub-rotinas.<br />

• Tendo <strong>de</strong>finido o programa principal, é iniciado o processo <strong>de</strong> <strong>de</strong>talhamento para cada sub-rotina. Desta<br />

forma são <strong>de</strong>finidos vários algoritmos, um para cada rotina em separado, para que se tenha uma visão do que<br />

<strong>de</strong>verá ser executado em cada módulo <strong>de</strong> programa. Existem programadores que estabelecem o número máximo<br />

<strong>de</strong> linhas <strong>de</strong> programa que uma rotina <strong>de</strong>verá possuir. Se o número <strong>de</strong> linhas ultrapassa o limite preestabelecido,<br />

a rotina em <strong>de</strong>senvolvimento é dividida em outra sub-rotina (é neste ponto que se aplica o método <strong>de</strong> refinamento<br />

sucessivo).<br />

o método top-down faz com que o programa tenha uma estrutura semelhante a um organograma.<br />

A utilização do método “<strong>de</strong> cima para baixo” permite que seja efetuado cada módulo <strong>de</strong> programa em<br />

separado. Desta forma, cada um po<strong>de</strong> ser testado separadamente garantindo que o programa completo esteja<br />

sem erro ao seu término.<br />

Outro <strong>de</strong>talhe a ser consi<strong>de</strong>rado é que muitas vezes existem em um programa trechos <strong>de</strong> códigos que são<br />

repetidos várias vezes. Esses trechos po<strong>de</strong>rão ser utilizados como sub-rotinas, proporcionando um programa<br />

menor e mais fácil <strong>de</strong> ser alterado num futuro próximo.<br />

A utilização <strong>de</strong> sub-rotinas e o uso do método Top-Down na programação permitem ao programador elaborar<br />

rotinas exclusivas. Por exemplo, uma rotina somente para entrada, outra para a parte <strong>de</strong> processamento e outra<br />

para saída dos dados.<br />

aplicação prática do uso <strong>de</strong> sub-rotinas<br />

As sub-rotinas po<strong>de</strong>m ser subdivididas em dois tipos: Procedimentos e Funções. Entre estes dois tipos <strong>de</strong><br />

sub-rotinas existem algumas diferenças, mas o conceito é o mesmo para ambas.<br />

Um Procedimento é um bloco <strong>de</strong> programa contendo início e fim e será i<strong>de</strong>ntificado por um nome, por meio<br />

do qual será referenciado em qualquer parte do programa principal ou do programa chamador da rotina.<br />

Quando uma sub-rotina é chamada por um programa, ela é executada e ao seu término o controle <strong>de</strong><br />

processamento retorna automaticamente para a primeira linha <strong>de</strong> instrução após a linha que efetuou a chamada<br />

<strong>de</strong> sub-rotina.<br />

Uma função também é um bloco <strong>de</strong> programa, como são os procedimentos, contendo inicio e fim e sendo<br />

i<strong>de</strong>ntificada por um nome, por meio do qual também será referenciada em qualquer parte do programa principal.<br />

Uma sub-rotina <strong>de</strong> função é na verda<strong>de</strong> muito parecida com uma sub-rotina <strong>de</strong> procedimento. A sua principal<br />

diferença está no fato <strong>de</strong> uma função retornar um <strong>de</strong>terminado valor.<br />

As funções formam o alicerce da programação em C. Você faz toda a programação C <strong>de</strong>ntro <strong>de</strong> uma função,<br />

porque todos os programas <strong>de</strong>vem incluir main, que é uma função.<br />

Em outras linguagens como Pascal, são utilizados procedimentos e funções, FORTRAN utiliza somente<br />

funções e a linguagem Assembly utiliza somente procedimentos.<br />

A linguagem C utiliza somente funções com e sem retorno <strong>de</strong> valores, tornando-se um pouco diferente na<br />

qualificação <strong>de</strong> sub-rotinas e funções, conforme a lógica <strong>de</strong> programação.<br />

Mas, não se preocupe, isto não irá mudar a forma como você vai trabalhar na linguagem C.<br />

Exercício <strong>de</strong> Aula<br />

65


Escola Alci<strong>de</strong>s <strong>Maya</strong> - Primeiro Módulo<br />

Vamos criar um programa <strong>de</strong> calculadora que apresente um menu <strong>de</strong> seleções no programa principal. Esse<br />

menu <strong>de</strong>verá dar ao usuário a possibilida<strong>de</strong> <strong>de</strong> escolher uma entre quatro operações aritméticas. Escolhida a<br />

opção <strong>de</strong>sejada, <strong>de</strong>verá ser solicitada à entrada <strong>de</strong> dois números e <strong>de</strong>pois <strong>de</strong> processada a operação, <strong>de</strong>verá<br />

ser exibido o resultado.<br />

Este programa <strong>de</strong>verá ser um conjunto <strong>de</strong> cinco rotinas, sendo uma principal e quatro secundárias. A rotina<br />

principal efetuará o controle das quatro rotinas secundárias que, por sua vez, pedirão a leitura <strong>de</strong> dois valores,<br />

farão a operação e apresentarão o resultado obtido. A figura a seguir apresenta um organograma com a idéia <strong>de</strong><br />

hierarquização das rotinas do programa. A quinta opção não se caracteriza por ser uma rotina, apenas a opção<br />

que vai encerrar o looping <strong>de</strong> controle do menu.<br />

Tendo uma idéia da estrutura geral do programa, será escrito em separado cada algoritmo com os seus<br />

<strong>de</strong>talhes <strong>de</strong> operação. Primeiro o programa principal e <strong>de</strong>pois as outras rotinas, <strong>de</strong> preferência na mesma or<strong>de</strong>m<br />

em que estão mencionadas no organograma.<br />

É i<strong>de</strong>al que você codifique o programa aos poucos, como por exemplo: na <strong>de</strong>finição do programa acima,<br />

primeiro vamos testar o menu e ver se a interação entre as partes funciona.<br />

Veja no programa a seguir:<br />

main( )<br />

{ /* chave incial da main */<br />

char opcao;<br />

while(opcao != ‘5’)<br />

{ /* chave inicial do laço while */<br />

clrscr( );<br />

printf(“1 - adicao\n”);<br />

printf(“2 - subtracao\n”);<br />

printf(“3 - multiplicacao\n”);<br />

printf(“4 - divisao\n”);<br />

printf(“5 - Fim do programa\n”);<br />

printf(“escolha uma opcao: “);<br />

opcao = getch( );<br />

switch(opcao)<br />

{ /* chave inicial do switch */<br />

case ‘1’:<br />

somar( );<br />

break;<br />

case ‘2’:<br />

subtrair( );<br />

break;<br />

case ‘3’:<br />

multiplicar( );<br />

break;<br />

case ‘4’:<br />

dividir( );<br />

break;<br />

case ‘5’:<br />

printf(“\nencerrando o programa”);<br />

break;<br />

<strong>de</strong>fault:<br />

66


<strong>Fundamentos</strong> <strong>de</strong> <strong>Programação</strong><br />

printf(“\nopcao invalida”);<br />

} /* chave final do switch */<br />

printf(“\nPressione uma tecla para continuar”);<br />

getch( );<br />

} /* chave final do laço while */<br />

} /* chave final da main */<br />

somar( )<br />

{<br />

printf(“\nFuncao <strong>de</strong> soma”);<br />

}<br />

subtrair( )<br />

{<br />

printf(“\nFuncao <strong>de</strong> subtracao”);<br />

}<br />

multiplicar( )<br />

{<br />

printf(“\nFuncao <strong>de</strong> multiplicacao”);<br />

}<br />

dividir( )<br />

{<br />

printf(“\nFuncao <strong>de</strong> Divisao”);<br />

}<br />

agora algumas consi<strong>de</strong>rações sobre o programa anterior:<br />

• Na linha char opcao; <strong>de</strong>claramos a variável do tipo char para armazenar a opção <strong>de</strong> menu escolhida pelo<br />

usuário.<br />

• Na linha seguinte while(opcao != ‘5’) é o controle do laço <strong>de</strong> repetição: “Faça enquanto opção diferente <strong>de</strong><br />

5”.<br />

• Logo após limpamos a tela e colocamos as opções do menu.<br />

• Para ver a opção do usuário codificamos: opcao = getch( );<br />

• Para verificar qual opção digitada pelo usuário foi escolhida a estrutura switch que é a mais a<strong>de</strong>quada<br />

quanto temos várias opções <strong>de</strong> um menu.<br />

• No tratamento do primeiro caso, ou seja, se o usuário digitou 1 é para fazer a soma. Colocamos neste<br />

case a linha: somar( ); que é a chamada para a função somar.<br />

• No tratamento dos <strong>de</strong>mais casos utilizamos a chamada para a função<br />

subtrair( ); , multiplicar( ); e dividir( );<br />

• Depois da chave final da função main( ) colocamos a <strong>de</strong>claração da funções<br />

Se tudo funcionou corretamente nos comandos da função main, vamos agora fazer as modificações<br />

necessárias em cada uma das funções. Devemos, então codificar os comandos para a execução das tarefas <strong>de</strong><br />

67


Escola Alci<strong>de</strong>s <strong>Maya</strong> - Primeiro Módulo<br />

cada uma das funções.<br />

Veja como ficou a parte do programa relativa as funções somar, subtrair, multiplicar e dividir:<br />

somar( )<br />

{<br />

float valorA, valorB, result;<br />

printf(“\nrotina <strong>de</strong> soma\n”);<br />

printf(“digite um valor para a: “);<br />

scanf(“%f”,&valora);<br />

printf(“digite um valor para B: “);<br />

scanf(“%f”,&valorB);<br />

result = valora + valorB;<br />

printf(“a soma <strong>de</strong> a com B e: %5.2f\n”,result);<br />

}<br />

subtrair( )<br />

{<br />

float valorA, valorB, result;<br />

printf(“\nrotina <strong>de</strong> subtracao\n”);<br />

printf(“digite um valor para a: “);<br />

scanf(“%f”,&valora);<br />

printf(“digite um valor para B: “);<br />

scanf(“%f”,&valorB);<br />

result = valora - valorB;<br />

printf(“a subtracao <strong>de</strong> a com B e: %5.2f\n”,result);<br />

}<br />

multiplicar( )<br />

{<br />

float valorA, valorB, result;<br />

printf(“\nrotina <strong>de</strong> multiplicacao\n”);<br />

printf(“digite um valor para a: “);<br />

scanf(“%f”,&valora);<br />

printf(“digite um valor para B: “);<br />

scanf(“%f”,&valorB);<br />

result = valora * valorB;<br />

printf(“a multiplicacao <strong>de</strong> a com B e: %5.2f\n”,result);<br />

}<br />

dividir( )<br />

{<br />

float valorA, valorB, result;<br />

printf(“\nrotina <strong>de</strong> divisao\n”);<br />

printf(“digite um valor para a: “);<br />

scanf(“%f”,&valora);<br />

68


printf(“digite um valor para B: “);<br />

scanf(“%f”,&valorB);<br />

result = valora / valorB;<br />

printf(“a divisao <strong>de</strong> a com B e: %5.2f\n”,result);<br />

}<br />

Novas consi<strong>de</strong>rações sobre o programa::<br />

69<br />

<strong>Fundamentos</strong> <strong>de</strong> <strong>Programação</strong><br />

• Na linha float valorA, valorB, result; <strong>de</strong>claramos as variáveis para ler os valores <strong>de</strong> A, <strong>de</strong> B e para armazenar<br />

o resultado da operação matemática.<br />

• Nas linhas seguintes pedidos para o usuário entrar com os dados relativos aos valores <strong>de</strong> A e <strong>de</strong> B<br />

• Efetuamos o processamento (cálculo da operação matemática)<br />

• Apresentamos os resultado do cálculo<br />

Funções II<br />

Funções divi<strong>de</strong>m gran<strong>de</strong>s tarefas <strong>de</strong> computação em tarefas menores. Funções apropriadas po<strong>de</strong>m<br />

freqüentemente escon<strong>de</strong>r <strong>de</strong>talhes <strong>de</strong> operação <strong>de</strong> partes <strong>de</strong> programa que não necessitam conhecê-las,<br />

esclarecendo o todo, e facilitando mudanças. Você usou a printf( ) sem conhecer <strong>de</strong>talhes <strong>de</strong> sua programação.<br />

Provavelmente a principal razão da existência <strong>de</strong> funções é impedir que o programador tenha <strong>de</strong> escrever o<br />

mesmo código repetidas vezes.<br />

Funções simples<br />

Vamos recordar como fazemos uma função <strong>de</strong> maneira bem simples analisando o programa abaixo:<br />

main( )<br />

{<br />

clrscr( );<br />

poemsg( );<br />

printf(“Pressione uma tecla”);<br />

getch( );<br />

}<br />

poemsg( )<br />

{<br />

printf(“Função que põe uma a mensagem na tela\n”);<br />

}<br />

Agora algumas consi<strong>de</strong>rações sobre o programa anterior:<br />

• A função principal é sempre a função main( ), é a partir <strong>de</strong>la que chamamos a função poemsg( ).<br />

• Os comandos da função main( ) estão encapsuladas entre as chaves ({...})<br />

• Os comandos da função poemsg( ) também estão encapsuladas entre as chaves ({...})<br />

• Na primeira linha <strong>de</strong> comando da função main( ) temos: clrscr( ); on<strong>de</strong> estamos chamando a função que<br />

limpa a tela<br />

• Na segunda linha <strong>de</strong> comando da função main( ) temos: poemsg( ); on<strong>de</strong> estamos chamando a função<br />

que põe uma mensagem na tela.<br />

• Repare que quando chamamos uma função ela vem acompanhada <strong>de</strong> ponto-e-vírgula (;)<br />

• Após a chave final da função main( ) vem a <strong>de</strong>claração da função poemsg( )<br />

• Repare que quando <strong>de</strong>claramos uma função ela não vem acompanhada <strong>de</strong> ponto-e-vírgula (;)


Escola Alci<strong>de</strong>s <strong>Maya</strong> - Primeiro Módulo<br />

Consi<strong>de</strong>rações importantes<br />

Como você po<strong>de</strong> ver, a estrutura <strong>de</strong> uma função C é bastante semelhante a da função main( ). A única<br />

diferença é que main( ) possui um nome especial, e é a função que dá inicio ao seu programa.<br />

Todo programa em C começa com a função main( ).<br />

Todas as funções em C começam com um nome seguido <strong>de</strong> parênteses e, após isto, chaves que envolvem<br />

o corpo da função.<br />

Do mesmo modo que chamamos uma função <strong>de</strong> biblioteca C (printf( ), getch( ), etc.) chamamos nossas<br />

próprias funções como em poemsg( ).<br />

Os parênteses que seguem o nome são necessários para que o compilador possa diferenciar a chamada a<br />

uma função <strong>de</strong> uma variável que você esqueceu <strong>de</strong> <strong>de</strong>clarar.<br />

A chamada a uma função constitui uma instrução <strong>de</strong> programa, <strong>de</strong>ve ser encerrada por ponto-e-vlrgula.<br />

Entretanto, na <strong>de</strong>finição <strong>de</strong> uma função, o ponto-e-vírgula não po<strong>de</strong> ser usado.<br />

Variáveis locais<br />

Cada função po<strong>de</strong> chamar outras funções. As variáveis que são <strong>de</strong>claradas <strong>de</strong>ntro <strong>de</strong> uma função são<br />

chamadas variáveis locais e são conhecidas somente <strong>de</strong>ntro <strong>de</strong> seu próprio bloco.<br />

Um bloco começa quando o computador encontra uma chave <strong>de</strong> abertura ({) e termina quando o computador<br />

encontra uma chave <strong>de</strong> fechamento (}).<br />

Um dos aspectos mais importantes que você <strong>de</strong>ve enten<strong>de</strong>r sobre as variáveis locais é que elas existem<br />

apenas durante a execução do bloco <strong>de</strong> código on<strong>de</strong> estão <strong>de</strong>claradas; isto é, uma variável local é criada quando<br />

se entra em seu bloco e <strong>de</strong>struída na saída.<br />

Vejamos o programa a seguir:<br />

main( ) {<br />

char nome[ ]=”Escola Tecnica Alci<strong>de</strong>s <strong>Maya</strong>”;<br />

printf(“%s \n”,nome);<br />

poemsg( );<br />

printf(“Pressione uma tecla”);<br />

}<br />

poemsg( )<br />

{<br />

char nome[ ]=”Possui professores <strong>de</strong>dicados e competentes\n”;<br />

printf(“%s \n”,nome);<br />

}<br />

Agora algumas consi<strong>de</strong>rações sobre o programa:<br />

• A variável do tipo string <strong>de</strong>clarada na função main( ), não tem nada a ver com a variável <strong>de</strong>clarada <strong>de</strong>ntro<br />

da função poemsg( ), são duas variáveis distintas entre si, e internas a cada função, por isto que não ocorre erro<br />

ou conflito entre elas, apesar <strong>de</strong> possuírem os mesmos nomes.<br />

Vejamos mais um exemplo para ficar bem claro estas informações:<br />

main( ) {<br />

char nome1[ ]=”Fred”;<br />

char nome2[ ]=”Vilma”;<br />

printf(“%s e %s são casados\n”, nome1, nome2);<br />

poemsg( );<br />

70


printf(“%s e %s se amam\n”, nome1, nome2);<br />

printf(“Pressione uma tecla”);<br />

}<br />

poemsg( )<br />

{<br />

char nome1[ ]=”Barney”;<br />

char nome2[ ]=”Bety”;<br />

printf(“%s e %s são casados\n”, nome1, nome2);<br />

}<br />

71<br />

<strong>Fundamentos</strong> <strong>de</strong> <strong>Programação</strong><br />

Agora algumas consi<strong>de</strong>rações sobre o programa:<br />

• Veja que as variáveis nome1 e nome2 da função main( ), permanecem com as mesmas informações antes<br />

e <strong>de</strong>pois da chamada da função poemsg( ).<br />

Variáveis globais<br />

Nos programas utilizados até agora foram utilizadas variáveis <strong>de</strong>claradas <strong>de</strong>ntro das funções, ou seja, <strong>de</strong>ntro<br />

<strong>de</strong> seu próprio bloco, consi<strong>de</strong>radas, portanto privadas ao bloco on<strong>de</strong> foram <strong>de</strong>clarada e nenhuma outra função<br />

tem acesso direto a elas. O mesmo é verda<strong>de</strong>iro para variáveis <strong>de</strong> outras funções.<br />

Cada variável local numa rotina passa a existir somente quando a função é chamada e <strong>de</strong>ixa <strong>de</strong> existir<br />

quando a função termina.<br />

Devido às variáveis locais virem e irem com a ativação da função, elas não retêm seus valores <strong>de</strong> uma<br />

chamada para outra, e <strong>de</strong>vem ser explicitamente inicializadas a cada ativação. Se elas não forem inicializadas,<br />

conterão lixo.<br />

Como uma alternativa, é possível <strong>de</strong>finir variáveis que sejam externas a todas as funções, isto é, variáveis<br />

globais que possam ser acessadas pelo nome por qualquer função que assim o <strong>de</strong>sejar.<br />

Visto que as variáveis externas sejam globalmente acessíveis, po<strong>de</strong>m ser usadas, ao invés <strong>de</strong> listas <strong>de</strong><br />

argumentos, para comunicar dados entre funções. Além do mais, <strong>de</strong>vido às variáveis externas existirem<br />

permanentemente, ao invés <strong>de</strong> aparecerem com a ativação e <strong>de</strong>sativação <strong>de</strong> funções, elas retêm seus valores<br />

mesmo quando as funções que as acessam <strong>de</strong>ixam <strong>de</strong> existir.<br />

Uma variável externa <strong>de</strong>ve ser <strong>de</strong>finida fora <strong>de</strong> qualquer função; isso aloca armazenamento para as mesmas.<br />

A variável <strong>de</strong>ve também ser <strong>de</strong>clarada em cada função que <strong>de</strong>sejar acessa-la; isso po<strong>de</strong> ser feito por uma<br />

<strong>de</strong>claração explícita extern ou implicitamente pelo contexto.<br />

Vamos ver um pequeno programa que possa exemplificar o uso <strong>de</strong> variáveis externas.<br />

char nome1[ ]=”Fred”;<br />

char nome2[ ]=”Vilma”;<br />

main( )<br />

{<br />

extern char nome1[ ];<br />

extern char nome2[ ];<br />

printf(“%s e %s sao casados\n”, nome1, nome2);<br />

poemsg( );<br />

printf(“%s e %s se amam\n”, nome1, nome2);


Escola Alci<strong>de</strong>s <strong>Maya</strong> - Primeiro Módulo<br />

printf(“Pressione uma tecla”);<br />

getch( );<br />

}<br />

poemsg( )<br />

{<br />

extern char nome1[ ];<br />

extern char nome2[ ];<br />

printf(“%s e %s sao casados\n”, nome1, nome2);<br />

}<br />

Agora algumas consi<strong>de</strong>rações sobre o programa:<br />

• Veja que a <strong>de</strong>claração das variáveis nome1 e nome2 antes da função main( ), isto i<strong>de</strong>ntifica estas variáveis<br />

como sendo variáveis globais, ou seja, externas.<br />

• No inicio da função main( ) e também da função poemsg( ), <strong>de</strong>claramos o uso das variáveis globais com a<br />

<strong>de</strong>claração: extern char nome1[ ]; e extern char nome2[ ]; com isto estamos informando ao programa que vamos<br />

usar as variáveis globais <strong>de</strong>claradas antes <strong>de</strong> main( ).<br />

Consi<strong>de</strong>rações importantes<br />

As variáveis globais costumam ser chamadas <strong>de</strong> variáveis externas na linguagem C.<br />

Em main( ), as variáveis externas nome1 e nome2 são <strong>de</strong>finidas nas primeiras linhas do exemplo acima, que<br />

<strong>de</strong>finem seus tipos e alocam área <strong>de</strong> armazenamento para as mesmas.<br />

Sintaticamente <strong>de</strong>finições externas são iguais às <strong>de</strong>clarações que já usamos anteriormente, mas, como<br />

ocorrem fora das funções, as variáveis são externas.<br />

Antes <strong>de</strong> uma função usar uma variável externa, o nome da mesma <strong>de</strong>ve ser conhecido pela função. Uma<br />

maneira <strong>de</strong> fazer isso é escrever uma <strong>de</strong>claração extern na função; a <strong>de</strong>claração é igual à anterior, exceto que é<br />

precedida da palavra-chave extern<br />

Em certas circunstâncias, a <strong>de</strong>claração extern po<strong>de</strong> ser omitida. Se a <strong>de</strong>finição externa <strong>de</strong> uma variável ocorrer<br />

no arquivo fonte antes <strong>de</strong> seu uso numa função particular, então não há a necessida<strong>de</strong> <strong>de</strong> uma <strong>de</strong>claração extern<br />

na função. As <strong>de</strong>clarações extern em main( ) e poemsg( ) são, portanto, redundantes.<br />

De fato, a prática comum é colocar a <strong>de</strong>finição <strong>de</strong> todas as variáveis externas no início do arquivo fonte e,<br />

então, omitir todas as <strong>de</strong>clarações extern.<br />

Se o programa está em vários arquivos fonte, e uma variável é <strong>de</strong>finida em, digamos, arquivo1 e usada<br />

em arquivo2, então uma <strong>de</strong>claração extern é necessária no arquivo2 para conectar as duas ocorrências da<br />

variável.<br />

Baseado nisto o programa anterior po<strong>de</strong>ria ter sido escrito da seguinte forma:<br />

char nome1[ ]=”Fred”;<br />

char nome2[ ]=”Vilma”;<br />

main( )<br />

{<br />

clrscr( );<br />

printf(“%s e %s sao casados\n”, nome1, nome2);<br />

poemsg( );<br />

printf(“%s e %s se amam\n”, nome1, nome2);<br />

72


printf(“Pressione uma tecla”);<br />

getch( );<br />

}<br />

poemsg( )<br />

{<br />

printf(“%s e %s sao casados\n”, nome1, nome2);<br />

}<br />

73<br />

<strong>Fundamentos</strong> <strong>de</strong> <strong>Programação</strong><br />

Você <strong>de</strong>ve observar que estamos usando as palavras <strong>de</strong>claração e <strong>de</strong>finição cuidadosamente quando nos<br />

referimos a variáveis externas nessa seção. “Definição” refere-se ao local on<strong>de</strong> a variável está sendo criada ou<br />

à qual é atribuída uma área <strong>de</strong> armazenamento; “<strong>de</strong>claração” refere-se ao local on<strong>de</strong> a natureza da variável é<br />

dada, sem alocação <strong>de</strong> área <strong>de</strong> armazenamento.<br />

A propósito, há uma tendência <strong>de</strong> se fazer com que tudo em vista seja uma variável extern porque simplifica<br />

aparentemente a comunicação – listas <strong>de</strong> argumentos são curtas e as variáveis estão sempre on<strong>de</strong> você as quer.<br />

Mas variáveis externas estão sempre lá, mesmo quando você não as quer.<br />

Este estilo <strong>de</strong> codificação é cheio <strong>de</strong> perigos porque leva a programas cujas conexões <strong>de</strong> dados não são<br />

óbvias – variáveis po<strong>de</strong>m ser mudadas <strong>de</strong> modo inesperado e inadvertidamente, e o programa é difícil <strong>de</strong><br />

modificar se o for necessário.<br />

Nós ainda não tratamos funções com passagem <strong>de</strong> argumentos, mas logo vamos ver como isto funciona, e<br />

ai então, po<strong>de</strong>remos i<strong>de</strong>ntificar melhor o uso <strong>de</strong>stas variáveis.<br />

Refinamento Sucessivo<br />

O refinamento sucessivo é uma técnica <strong>de</strong> programação que possibilita dividir uma função em outras funções.<br />

Deve ser aplicado com muito critério para que o programa a ser construído não se torne <strong>de</strong>sestruturado e difícil<br />

<strong>de</strong> ser compreendido por você ou por outras pessoas.<br />

Na aula anterior vimos um programa que utilizava um menu na rotina principal e 4 funções para efetuar<br />

cálculos básicos (soma, subtração, multiplicação e divisão).<br />

Neste programa po<strong>de</strong>mos aplicar esta técnica, aliada a <strong>de</strong>claração <strong>de</strong> variáveis externas.<br />

Por exemplo: a entrada e a saída são efetuadas com as mesmas variáveis. Observe que as variáveis valorA,<br />

valorB e result são <strong>de</strong>finidas quatro vezes, uma em cada função.<br />

A solução é <strong>de</strong>finir as variáveis valorA, valorB e result como externas e construir mais duas funções, uma para<br />

a entrada e a outra para a saída. As quatro funções atuais serão diminuídas em números <strong>de</strong> linhas, pois tudo o<br />

que se repete nas funções será retirado.<br />

Veja no programa a seguir a <strong>de</strong>finição das variáveis externas e a <strong>de</strong>finição das duas novas funções <strong>de</strong><br />

entrada e <strong>de</strong> saída. Perceba nas funções estão sendo <strong>de</strong>claradas as variáveis que serão utilizadas pela função,<br />

fazendo uso do conceito <strong>de</strong> variáveis externas.<br />

float valorA, valorB, result;<br />

main( )<br />

{<br />

char opcao=0;<br />

while(opcao != ‘5’)<br />

{<br />

clrscr( );<br />

printf(“1 - adicao\n”);


Escola Alci<strong>de</strong>s <strong>Maya</strong> - Primeiro Módulo<br />

printf(“2 - subtracao\n”);<br />

printf(“3 - multiplicacao\n”);<br />

printf(“4 - divisao\n”);<br />

printf(“5 - Fim do programa\n”);<br />

printf(“escolha uma opcao: “);<br />

opcao = getch( );<br />

switch(opcao)<br />

{<br />

case ‘1’:<br />

somar( );<br />

break;<br />

case ‘2’:<br />

subtrair( );<br />

break;<br />

case ‘3’:<br />

multiplicar( );<br />

break;<br />

case ‘4’:<br />

dividir( );<br />

break;<br />

case ‘5’:<br />

printf(“\nencerrando o programa”);<br />

break;<br />

<strong>de</strong>fault:<br />

printf(“\nopcao invalida”);<br />

}<br />

printf(“\nPressione uma tecla para continuar”);<br />

getch( );<br />

}<br />

}<br />

somar( )<br />

{<br />

printf(“\nrotina <strong>de</strong> soma\n”);<br />

entrada( );<br />

result = valora + valorB;<br />

saida( );<br />

}<br />

subtrair( )<br />

{<br />

printf(“\nrotina <strong>de</strong> subtracao\n”);<br />

entrada( );<br />

result = valora - valorB;<br />

saida( );<br />

}<br />

74


multiplicar( )<br />

{<br />

printf(“\nrotina <strong>de</strong> multiplicacao\n”);<br />

entrada( );<br />

result = valora * valorB;<br />

saida();<br />

}<br />

dividir( )<br />

{<br />

printf(“\nrotina <strong>de</strong> divisao\n”);<br />

entrada( );<br />

result = valora / valorB;<br />

saida( );<br />

}<br />

entrada( )<br />

{<br />

printf(“digite um valor para a: “);<br />

scanf(“%f”,&valora);<br />

printf(“digite um valor para B: “);<br />

scanf(“%f”,&valorB);<br />

}<br />

saida( )<br />

{<br />

printf(“o resultado <strong>de</strong> a com B e: %5.2f\n”,result);<br />

}<br />

Agora algumas consi<strong>de</strong>rações sobre o programa anterior:<br />

75<br />

<strong>Fundamentos</strong> <strong>de</strong> <strong>Programação</strong><br />

• Antes da função main( ), <strong>de</strong>finimos as variáveis externas: float valorA, valorB, result;<br />

• Nas funções <strong>de</strong> cálculo <strong>de</strong>claramos as variáveis externas: extern float valorA, valorB, result;<br />

• Também nas funções <strong>de</strong> cálculo fizemos a chamada da função <strong>de</strong> entrada <strong>de</strong> dados: entrada( );<br />

• E conseqüentemente a chamada da função <strong>de</strong> saída <strong>de</strong> dados: saida( );<br />

• Na nova função <strong>de</strong> entrada <strong>de</strong>claramos as variáveis externas: extern float valorA, valorB;<br />

• Na nova função <strong>de</strong> saída <strong>de</strong>claramos a variável externa: extern float result;<br />

Funções III<br />

As funções formam o alicerce da programação. Conforme você aumentar a sua prática em programação,<br />

seus programas tomarão uma aparência modular quando você começar a programação com funções.<br />

Estilos e Protótipos das Funções<br />

As funções em C foram gran<strong>de</strong>mente modificadas durante o processo <strong>de</strong> padronização ANSI. Este novo<br />

padrão <strong>de</strong> C é gran<strong>de</strong>mente baseado no protótipo <strong>de</strong> funções usado em C++. Conforme você lê vários artigos,<br />

livros, e revistas sobre C, verá diversas variações usadas para <strong>de</strong>screver as funções.


Escola Alci<strong>de</strong>s <strong>Maya</strong> - Primeiro Módulo<br />

Prevendo a necessida<strong>de</strong> que você vai encontrar em <strong>de</strong>finir o tipo <strong>de</strong> função a ser utilizada vamos introduzir<br />

aqui o conhecimento sobre protótipo <strong>de</strong> funções.<br />

Protótipos <strong>de</strong> Funções<br />

As <strong>de</strong>clarações <strong>de</strong> função começam com o protótipo da função C. O protótipo da função é simples e é incluído<br />

no início do código do programa para notificar o compilador do tipo e do número <strong>de</strong> argumentos que uma função<br />

utilizará.<br />

Embora outras variações sejam legais, sempre que possível você <strong>de</strong>ve utilizar a forma do protótipo <strong>de</strong> função<br />

que é uma réplica da linha <strong>de</strong> <strong>de</strong>claração da função. Vamos fazer isto através <strong>de</strong> exemplos, então nos próximos<br />

exemplos você terá uma noção mais aprofundada sobre os protótipos das funções.<br />

Funções que não retornam um valor e não recebem argumentos<br />

O programa a seguir exemplifica um programa que não recebe nenhum argumento e não retorna nenhum<br />

valor. A <strong>de</strong>claração void foi batizada pelo comitê ANSI para a função que não retornam nada e não recebem<br />

nada.<br />

void somar(void);<br />

main( )<br />

{<br />

somar( );<br />

printf(“\nPressione uma tecla para continuar”);<br />

}<br />

void somar(void)<br />

{<br />

int valora, valorB, result;<br />

printf(“\nrotina <strong>de</strong> soma\n”);<br />

printf(“digite um valor para a: “);<br />

scanf(“%d”,&valora);<br />

printf(“digite um valor para B: “);<br />

scanf(“%d”,&valorB);<br />

result = valora + valorB;<br />

printf(“a soma <strong>de</strong> a com B e: %d\n”,result);<br />

}<br />

agora algumas consi<strong>de</strong>rações sobre o programa anterior:<br />

• Antes da função main( ), <strong>de</strong>claramos o protótipo da função somar: void somar(void); on<strong>de</strong> o primeiro void<br />

está i<strong>de</strong>ntificando que a função somar não retorna nenhuma informação para a função chamadora. O segundo<br />

void que está entre parênteses informa que a função chamadora não vai passar nenhum argumento para a<br />

função chamada.<br />

• Após a chave final do main (}) é <strong>de</strong>finida a função somar: void somar(void) que <strong>de</strong>ve ser coerente com o<br />

seu protótipo antes da função main.<br />

Funções que retornam um valor<br />

O programa a seguir exemplifica o retorno <strong>de</strong> uma informação da função chamada.<br />

int somar(void);<br />

76


main( )<br />

{<br />

int soma;<br />

soma = somar( );<br />

printf(“a soma <strong>de</strong> a com B e: %d\n”, soma);<br />

printf(“\nPressione uma tecla para continuar”);<br />

}<br />

int somar(void)<br />

{<br />

int valora, valorB, result;<br />

printf(“\nrotina <strong>de</strong> soma\n”);<br />

printf(“digite um valor para a: “);<br />

scanf(“%d”,&valora);<br />

printf(“digite um valor para B: “);<br />

scanf(“%d”,&valorB);<br />

result = valora + valorB;<br />

77<br />

<strong>Fundamentos</strong> <strong>de</strong> <strong>Programação</strong><br />

return(result);<br />

}<br />

Agora algumas consi<strong>de</strong>rações sobre o programa anterior:<br />

• Antes da função main( ), <strong>de</strong>claramos o protótipo da função somar: int somar(void); on<strong>de</strong> i<strong>de</strong>ntificamos que<br />

a função somar vai retornar um valor inteiro.<br />

• Dentro do main( ) <strong>de</strong>claramos a variável soma para receber o valor retornado int soma;<br />

• Ainda <strong>de</strong>ntro do main( ) armazenamos o resultado retornado da função somar na variável soma através<br />

da linha <strong>de</strong> comando: soma = somar( );<br />

• No início da função somar ela está <strong>de</strong>finida da seguinte forma: int somar(void)<br />

• Dentro da função somar temos o retorno <strong>de</strong> um valor inteiro através linha <strong>de</strong> comando: return(result);<br />

O comando return<br />

Nos programas anteriores mostramos funções que retornam ao programa que chamou quando encontram a<br />

chave ( } ) que termina a função. Não há necessida<strong>de</strong> <strong>de</strong> uma instrução return.<br />

O comando return causa a atribuição <strong>de</strong> qualquer expressão entre parênteses a função que chamadora.<br />

Então quando somar( ) é chamada por main( ) a variável soma adquire o valor do calculado pela função somar.<br />

A variável soma é local a main( ), mas o valor <strong>de</strong> result é mandado para main( ) pelo comando return. Este<br />

valor po<strong>de</strong>, então, ser atribuído a uma variável ou fazer parte <strong>de</strong> alguma expressão.<br />

O comando return tem dois usos importantes:<br />

Primeiro: você po<strong>de</strong> usar return( ) para <strong>de</strong>volver um valor e retornar, imediatamente, para a próxima instrução<br />

do código <strong>de</strong> chamada.<br />

Segundo: você po<strong>de</strong> usá-lo, sem os parênteses, para causar uma saída imediata da função na qual ele se<br />

encontra; isto é, return fará com que a execução do programa volte para o código <strong>de</strong> chamada assim que o<br />

computador encontrar este comando, o que ocorre, em geral, antes da última instrução da função.<br />

Você po<strong>de</strong> colocar mais <strong>de</strong> um comando return em suas funções.<br />

Uma das limitações do comando return( ) é que ele po<strong>de</strong> retornar somente um único valor à função que<br />

chama.


Escola Alci<strong>de</strong>s <strong>Maya</strong> - Primeiro Módulo<br />

Funções que recebem argumentos e retornam um valor<br />

O programa a seguir é uma variação do programa anterior, que exemplifica a passagem <strong>de</strong> informações entre<br />

a função chamadora e a função chamada.<br />

int somar(int valorA, int valorB);<br />

main( )<br />

{<br />

int soma, vala, valB;<br />

clrscr( );<br />

printf(“digite um valor para a: “);<br />

scanf(“%d”, &vala);<br />

printf(“digite um valor para B: “);<br />

scanf(“%d”, &valB);<br />

soma = somar(vala, valB);<br />

printf(“a soma <strong>de</strong> a com B e: %d\n”, soma);<br />

printf(“\nPressione uma tecla para continuar”);<br />

getch( );<br />

}<br />

int somar(int valora, int valorB)<br />

{<br />

int result;<br />

printf(“\nrotina <strong>de</strong> soma\n”);<br />

result = valora + valorB;<br />

return(result);<br />

}<br />

Agora algumas consi<strong>de</strong>rações sobre o programa:<br />

• Antes da função main( ), <strong>de</strong>claramos o protótipo da função somar: int somar(int valorA, int valorB); on<strong>de</strong><br />

i<strong>de</strong>ntificamos que a função somar vai retornar um valor inteiro e vai receber como argumento dois valores inteiros<br />

valorA e valorB.<br />

• Dentro do main( ) <strong>de</strong>claramos a variável soma para receber o valor retornado int soma,valA,valB; e também<br />

as variáveis que on<strong>de</strong> serão digitados os valores a serem passados como argumentos para a função somar.<br />

• Ainda <strong>de</strong>ntro do main( ) armazenamos o resultado retornado da função somar na variável soma através<br />

da linha <strong>de</strong> comando: soma = somar(valA, valB);<br />

• No início da função somar ela está <strong>de</strong>finida da seguinte forma: int somar(void)<br />

• Dentro da função somar temos o retorno <strong>de</strong> um valor inteiro através linha <strong>de</strong> comando: return(result);<br />

78


<strong>Fundamentos</strong> <strong>de</strong> <strong>Programação</strong><br />

Funções IV<br />

As funções po<strong>de</strong>m ser utilizadas da forma mais simples possível, como as que não recebem nenhuma<br />

informação e também não retornam nenhuma informação. Mas po<strong>de</strong>m ser um pouco mais sofisticadas po<strong>de</strong>ndo<br />

receber informações <strong>de</strong> quem as chamou e se for necessário retornar uma informação para a função que a<br />

chamou.<br />

Vamos rever estes conceitos, com maiores <strong>de</strong>talhes, para que você não tenha dúvidas.<br />

Protótipos <strong>de</strong> Funções<br />

Na aula anterior estudamos que as <strong>de</strong>clarações <strong>de</strong> uma função começam com o protótipo da função C. O<br />

protótipo da função é simples e é incluído no início do código do programa para notificar o compilador do tipo e<br />

do número <strong>de</strong> argumentos que uma função utilizará. Veja a sintaxe <strong>de</strong>ste protótipo:<br />

tipo_<strong>de</strong>_ retorno nome_da_função( tipo(s)_argum nome(s)_argum );<br />

Veja o significado <strong>de</strong>sta sintaxe:<br />

• A função po<strong>de</strong> ser do tipo void, int, float e assim por diante, específicado em tipo_<strong>de</strong>_retorno.<br />

• O nome_da_função é um nome significativo para <strong>de</strong>screver a função.<br />

• Se for passado alguma informação para a função, <strong>de</strong>vemos fornecer um tipo_argum seguido por um<br />

nome_argum.<br />

Os tipos <strong>de</strong> argumentos também po<strong>de</strong>m ser do tipo void, int, float, etc. Po<strong>de</strong>mos passar muitos valores para<br />

a função repetindo o tipo <strong>de</strong> argumento e nome separados por uma vírgula.<br />

A própria função é um pedaço <strong>de</strong> código encapsulado que segue a <strong>de</strong>finição da função main .<br />

A função têm a seguinte sintaxe:<br />

tipo_<strong>de</strong>_retorno nome_da_função( tipo(s)_argum nome(s)_argum )<br />

{<br />

.<br />

.<br />

(<strong>de</strong>claração <strong>de</strong> dados e corpo da função)<br />

.<br />

.<br />

return( );<br />

}<br />

Notamos que a primeira linha da função é idêntica (exceto pela ausência do ponto-e-vírgula (;)) à do protótipo<br />

que é listado no início <strong>de</strong> um programa.<br />

Vejamos um exemplo <strong>de</strong> um programa utilizando uma função.<br />

int somar( int x, int y ); /* protótipo da função */<br />

main( )<br />

{<br />

int a,b,c;<br />

a=5;<br />

b=93;<br />

c = somar( a, b ); /* chamada da função */<br />

79


Escola Alci<strong>de</strong>s <strong>Maya</strong> - Primeiro Módulo<br />

printf(“%d + %d = %d\n”, a, b, c);<br />

}<br />

int somar( int x, int y ) /* <strong>de</strong>claração da função */<br />

{<br />

int z;<br />

z = x + y;<br />

return(z);<br />

}<br />

/* tipo <strong>de</strong> retorno da função */<br />

Veja algumas consi<strong>de</strong>rações sobre o programa acima:<br />

• Antes da função main( ), <strong>de</strong>claramos o protótipo da função somar: int somar( int x, int y ); on<strong>de</strong> o protótipo<br />

explica que a função aceitará dois argumentos int e retorna um valor tipo int. Na verda<strong>de</strong>, o padrão ANSI sugere<br />

que toda a função seja prototipada num arquivo <strong>de</strong> cabeçalho separado. Como po<strong>de</strong>mos presumir, é assim que<br />

os arquivos <strong>de</strong> cabeçalho são associados às suas bibliotecas C apropriadas. Para programas simples, você po<strong>de</strong><br />

incluir o protótipo da função <strong>de</strong>ntro do corpo do programa<br />

• Na chamada da função: c = somar( a, b ); estamos atribuindo o valor <strong>de</strong> retorno da função a uma<br />

variável<br />

• Logo após a chave final da função main temos a <strong>de</strong>claração da função: int somar( int x, int y ) , que não<br />

tem ponto-e-vírgula.<br />

• E finalmente, antes da chave final da função: return(z); retornamos para a função chamadora o resultado<br />

do cálculo.<br />

Chamada por valor<br />

No programa anterior, os argumentos foram passados por valor para a função somar.<br />

Quando variáveis são passadas <strong>de</strong>ssa maneira, uma cópia do valor da variável é passada para a função.<br />

Como uma cópia é passada, a variável no programa <strong>de</strong> chamada não é alterada.<br />

Chamar uma função por valor é um meio popular <strong>de</strong> passar informações para uma função e é o método<br />

padrão em C.<br />

A limitação <strong>de</strong>sta técnica (“chamada por valor”) é que somente um valor é retornado pela função.<br />

Chamada por referência<br />

Em uma chamada por referência, o en<strong>de</strong>reço do argumento, e não seu valor, é passado para a função. Esta<br />

passagem exige menos memória pelo programa do que a chamado por valor.<br />

Quando usamos uma chamada por referência, as variáveis na chamada do programa po<strong>de</strong>m ser alteradas.<br />

A vantagem <strong>de</strong>sta técnica (“chamada por referência”) é que mais <strong>de</strong> um valor po<strong>de</strong> ser retornado pela<br />

função.<br />

Vejamos o programa anterior utilizando esta técnica:<br />

int somar( int *x, int *y );<br />

main( )<br />

{<br />

int a,b,c;<br />

a=5;<br />

b=93;<br />

80


c = somar( &a, &b );<br />

printf(“%d + %d = %d\n”, a, b, c);<br />

}<br />

int somar( int *x, int *y )<br />

{<br />

int z;<br />

z = *x + *y;<br />

return(z);<br />

}<br />

Veja algumas consi<strong>de</strong>rações sobre o programa acima:<br />

81<br />

<strong>Fundamentos</strong> <strong>de</strong> <strong>Programação</strong><br />

• Antes da função main( ), <strong>de</strong>claramos o protótipo da função somar: int somar( int *x, int *y ); on<strong>de</strong> o protótipo<br />

informa que a função aceitará dois argumentos int passados como uma chamada por referência.<br />

• Na chamada da função: c = somar( &a, &b ); estamos passando os en<strong>de</strong>reços <strong>de</strong> memória das variáveis<br />

a e b, permitindo que se possa alterar o conteúdo <strong>de</strong>stas variáveis <strong>de</strong>ntro da função chamada, o que não ocorre<br />

no exemplo acima. (No próximo programa vamos ver um exemplo on<strong>de</strong> isto é realizado)<br />

• Após a função main temos a <strong>de</strong>claração da função: int somar( int *x, int *y )<br />

• No comando: z = *x + *y; po<strong>de</strong>mos lê-lo da seguinte forma: “O conteúdo apontado pela variável x será<br />

somado ao conteúdo apontado pela variável y e atribuído a variável z”.<br />

• E na linha: return(z); retornamos para a função chamadora o resultado do cálculo.<br />

Vejamos um exemplo, que utiliza melhor esta técnica:<br />

void somar( int *x, int *y, int *z );<br />

main( )<br />

{<br />

int a,b,c;<br />

a = 5;<br />

b = 93;<br />

somar( &a, &b, &c );<br />

printf(“%d + %d = %d\n”, a, b, c);<br />

}<br />

void somar( int *x, int *y, int *z )<br />

{<br />

*x = 10;<br />

*y = 20;<br />

*z = *x + *y;<br />

}<br />

Veja algumas consi<strong>de</strong>rações sobre o programa acima:


Escola Alci<strong>de</strong>s <strong>Maya</strong> - Primeiro Módulo<br />

• Na <strong>de</strong>claração do protótipo da função somar: void somar( int *x, int *y, int *z ); informamos que esta função<br />

não irá retornar nenhum informação (void), e que a função aceitará três argumentos int passados como uma<br />

chamada por referência.<br />

• Note que na função main, antes da chamada da função somar, estamos atribuindo um valor para a variável<br />

a: a = 5; e outro para a variável b: b = 93;<br />

• Na chamada da função: somar( &a, &b, &c ); estamos passando os en<strong>de</strong>reços <strong>de</strong> memória das variáveis<br />

a, b e c, permitindo que se possa alterar o conteúdo <strong>de</strong>stas variáveis <strong>de</strong>ntro da função chamada. Nesta função<br />

não estamos atribuíndo um valor <strong>de</strong> retorno a nenhuma variável, porque a função foi <strong>de</strong>clarada como void<br />

• Após a função main temos a <strong>de</strong>claração da função: void somar( int *x, int *y, int *z )<br />

• Dentro <strong>de</strong>sta função estamos alterando o conteúdo das variáveis a e b, através dos comandos <strong>de</strong><br />

atribuição: *x = 10; (Lê-se: “O conteúdo apontado pela variável x recebe o valor 10”, significando que o conteúdo<br />

da variável a será alterado após esta atribuição), o mesmo ocorrendo com a variável b na atribuição: *y = 20;<br />

Neste momento o conteúdo inicial da variável a e b é substituído pelos novos valores atribuidos através da<br />

variáveis que apontam para seus en<strong>de</strong>reços ( *x e *y ).<br />

• No comando: *z = *x + *y; po<strong>de</strong>mos lê-lo da seguinte forma: “O conteúdo apontado pela variável x será<br />

somado ao conteúdo apontado pela variável y e atribuído ao conteúdo apontado pela variável z”.<br />

• E não temos comando <strong>de</strong> return nesta função.<br />

Funções V<br />

Nesta aula vamos tratar dos Argumentos das Funções, que são parâmetros passados para as funções, ou<br />

seja, informações que são levadas da função chamadora para a função chamada.<br />

Estes argumentos são opcionais, algumas funções po<strong>de</strong>m não receber argumentos enquanto outras po<strong>de</strong>m<br />

receber diversos argumentos.<br />

Os argumentos po<strong>de</strong>m ser misturados, ou seja, po<strong>de</strong>mos utilizar diversos tipos <strong>de</strong> dados.<br />

Argumentos <strong>de</strong> Função Formais e Reais<br />

A <strong>de</strong>finição <strong>de</strong> uma função contém uma lista <strong>de</strong> argumentos (ou parâmetros) chamada lista <strong>de</strong> argumentos<br />

formais. A lista po<strong>de</strong> estar vazia ou po<strong>de</strong> conter qualquer combinação <strong>de</strong> tipos, como inteiro, ponto flutuante ou<br />

caracteres.<br />

Quando a função é realmente chamada <strong>de</strong> <strong>de</strong>ntro do corpo do programa, uma lista <strong>de</strong> argumentos passa<br />

para a função. Esta lista é chamada <strong>de</strong> lista <strong>de</strong> argumentos reais.<br />

Função sem argumentos - void<br />

Na ausência <strong>de</strong> argumentos da função, po<strong>de</strong>mos usar o void. Usar void é a<strong>de</strong>quado, mas não necessário.<br />

O programa a seguir tem uma função simples chamada poemsg que não recebe argumentos e não retorna<br />

um valor. A função main chama a função poemsg. Quando poemsg completa a sua tarefa, o controle retorna para<br />

a função main.<br />

void poemsg (void);<br />

main( )<br />

{<br />

printf(“este programa apresenta a soma <strong>de</strong> dois números\n”);<br />

poemsg( );<br />

}<br />

void poemsg (void)<br />

{<br />

int a = 4;<br />

int b = 7;<br />

int c = 0;<br />

c = a + b;<br />

82


printf (“%d + %d = %d” , a, b, c);<br />

}<br />

Algumas consi<strong>de</strong>rações sobre o programa acima:<br />

Função com argumento <strong>de</strong> inteiros - int<br />

83<br />

<strong>Fundamentos</strong> <strong>de</strong> <strong>Programação</strong><br />

• Na <strong>de</strong>claração do protótipo da função poemsg: void poemsg (void); informamos que esta função não<br />

requer nenhum argumento <strong>de</strong> entrada e não irá retornar nenhuma informação (void)<br />

Função com argumento <strong>de</strong> caracteres - char<br />

Caracteres po<strong>de</strong>m ser passados para uma função. No exemplo a seguir, um caractere será esperado do<br />

teclado na função main e passado para a função poechar. A função getch será utilizada para ler um caracter do<br />

teclado e retornar o valor do caractere digitado, sem apresentá-lo na tela.<br />

Nós estamos acostumados a usar esta função para esperar uma tecla qualquer e seguir na execução do<br />

programa, ou em um menu <strong>de</strong> escolha, para saber qual a opção teclada pelo usuário.<br />

Na biblioteca padrão da linguagem C, estas outras funções <strong>de</strong> caractere estão relacionadas com getch: getc,<br />

getchar e getche.<br />

void poechar (char c);<br />

main( )<br />

{<br />

char caracter;<br />

printf(“Pressione uma tecla qualquer\n”);<br />

caracter = getch( );<br />

poechar(caracter);<br />

}<br />

void poechar (char c)<br />

{<br />

printf (“o caracter digitado foi..........................: %c\n” ,c);<br />

printf (“o código asCII do caracter digitado é: %d\n” ,c);<br />

}<br />

Algumas consi<strong>de</strong>rações sobre o programa acima:<br />

• Na <strong>de</strong>claração do protótipo da função poechar: void poechar (char c); informamos que esta função requer<br />

um dado do tipo char e que não irá retornar nenhuma informação (void)<br />

• Na linha: caracter = getch( ); é lido o valor do caracter digitado<br />

• Na linha: poechar(caracter); é passado para a função poechar o caracter digitado<br />

• Na primeira linha da função poechar é apresentado o caracter digitado com o comando: printf (“O<br />

caracter digitado foi..........................: %c\n” ,c);<br />

• E aproveitando apresentamos o valor ASCII do caracter digitado utilizando o parâmetro %d do caracter<br />

digitado com o comando: printf (“O código ASCII do caracter digitado é: %d\n” ,c);


Escola Alci<strong>de</strong>s <strong>Maya</strong> - Primeiro Módulo<br />

Neste programa, um único int será lido do teclado com a função scanf. Esse int será passado para a função<br />

raio. A função raio utiliza o raio fornecido para calcular e escrever a área <strong>de</strong> um círculo, o volume da esfera e a<br />

área da superfície da esfera.<br />

void raio (int r);<br />

main( )<br />

{<br />

int vlraio;<br />

printf(“Informe o raio, como um valor inteiro: “);<br />

scanf(“%d”, &vlraio);<br />

raio(vlraio);<br />

}<br />

void raio (int r)<br />

{<br />

float area, volume, superficie;<br />

area = 3.14159 * (float) (r*r);<br />

superficie = 3.14159 * 4.0 * (float) (r*r);<br />

volume = 3.14159 * 4.0 / 3.0 * (float) (r*r*r);<br />

printf (“o raio ‚......................: %d\n” ,r);<br />

printf (“a área do círculo....: %f\n” ,area);<br />

printf (“A área da esfera .....: %f\n” ,superficie);<br />

printf (“o volume da esfera..: %f\n” ,volume);<br />

}<br />

Algumas consi<strong>de</strong>rações sobre o programa acima:<br />

• Na <strong>de</strong>claração do protótipo da função raio: void raio (int r); informamos que esta função requer um dado<br />

do tipo int e que não irá retornar nenhuma informação (void)<br />

• Na função main vamos ler o valor do raio e chamar a função que faz os cálculos passando como argumento<br />

o valor do raio na linha: raio(vlraio);<br />

• Note que <strong>de</strong>ntro da função raio, estamos recebendo como parâmetro a variável r que possui o raio.<br />

• Veja também que nos cálculos estamos fazendo o uso <strong>de</strong> um cast (float) na frente da linha que utiliza o<br />

parâmetro r, que é inteiro, forçando o cálculo para ser convertido para float, é isto que significa o cast.<br />

Função com argumento em ponto flutuante - float<br />

Os números em ponto flutuante são tão simples <strong>de</strong> ser passados como argumentos quanto os inteiros. No<br />

exemplo a seguir vamos ler o salário bruto <strong>de</strong> uma pessoa e a taxa <strong>de</strong> INSS para o <strong>de</strong>sconto da previdência<br />

social. A função que calcula o salário líquido vai receber estes dois parâmetros, calcular e apresentar o valor do<br />

salário líquido.<br />

84


void calc_sal ( float sb, float tx );<br />

main( )<br />

{<br />

float salbruto, txinss;<br />

printf(“digite o valor do salário bruto: “);<br />

scanf(“%f”, &salbruto);<br />

printf(“digite a taxa <strong>de</strong> <strong>de</strong>sconto do Inss: “);<br />

scanf(“%f”, &txinss);<br />

calc_sal (salbruto, txinss);<br />

}<br />

float calc_sal ( float sb, float tx )<br />

{<br />

float saliq;<br />

saliq = sb - (sb * tx / 100);<br />

printf(“o valor do salário líquido é: %12.2f\n”, saliq);<br />

}<br />

Algumas consi<strong>de</strong>rações sobre o programa acima:<br />

85<br />

<strong>Fundamentos</strong> <strong>de</strong> <strong>Programação</strong><br />

• Na <strong>de</strong>claração do protótipo da função calc_sal: void calc_sal ( float sb, float tx ); informamos que esta<br />

função requer dois dados do tipo float e que não irá retornar nenhuma informação.<br />

• Na função main vamos ler o valor do salário bruto e a taxa <strong>de</strong> <strong>de</strong>sconto do inss chamamos a função<br />

calc_sal, que calcula e apresenta o salário líquido.<br />

Funções VI<br />

Nesta aula vamos tratar dos inúmeros tipos <strong>de</strong> funções. Um tipo <strong>de</strong> função é o tipo <strong>de</strong> valor retornado pela<br />

função. Na aula anterior os nossos exemplos não retornavam nenhum valor e, portanto elas eram do tipo void.<br />

Agora iremos trabalhar com várias funções que retornam tipos <strong>de</strong> dados diferentes.<br />

Função do tipo void<br />

Nós já trabalhamos com os tipos <strong>de</strong> função void, <strong>de</strong> modo que o próximo exemplo será um pouco mais<br />

elaborado. Na linguagem C a informação numérica po<strong>de</strong> ser formatada em hexa<strong>de</strong>cimal, <strong>de</strong>cimal e octal, mas<br />

não em binário. A especificação <strong>de</strong> dados no formato binário é útil quando você estiver usando aritmética binária<br />

ou <strong>de</strong>senvolvendo máscaras <strong>de</strong> bits.<br />

A função binario converte um número <strong>de</strong>cimal informado pelo teclado para uma representação binária. Os<br />

dígitos binários são armazenados individualmente numa matriz. Para visualizar o número binário, você precisa<br />

escrever o conteúdo da matriz.


Escola Alci<strong>de</strong>s <strong>Maya</strong> - Primeiro Módulo<br />

void binario ( int numero );<br />

main( )<br />

{<br />

int numero;<br />

printf(“digite um numero <strong>de</strong>cimal: “);<br />

scanf(“%d”, &numero);<br />

printf(“este numero em binario e: “);<br />

binario(numero);<br />

}<br />

void binario ( int numero )<br />

{<br />

int i=0;<br />

int matriz[40];<br />

matriz[0]=0;<br />

if(numero)<br />

{<br />

while(numero != 0)<br />

{<br />

matriz[i] = (numero % 2);<br />

numero /= 2;<br />

i++;<br />

}<br />

--i;<br />

}<br />

for( ; i >= 0; i-- )<br />

printf(“%d”, matriz[i]);<br />

}<br />

Algumas consi<strong>de</strong>rações sobre o programa acima:<br />

• Na <strong>de</strong>claração do protótipo da função binario: void binario ( int numero ); informamos que esta função<br />

requer um argumento do tipo inteiro e que a função não irá retornar nenhuma informação;<br />

• A função binario está convertendo o número para binário fazendo divisões sucessivas por dois. O número<br />

na base <strong>de</strong>z será o quociente da divisão anterior. O resto, após cada divisão, será um ou zero. O resto será o<br />

dígito binário.<br />

86


<strong>Fundamentos</strong> <strong>de</strong> <strong>Programação</strong><br />

Função do tipo char<br />

A função maiuscula aceita um argumento char e retorna um argumento também char.<br />

char maiuscula ( char letra );<br />

main( ) {<br />

char letramai, letramin;<br />

printf(“digite uma letra minúscula: “);<br />

scanf( “%c”, &letramin);<br />

letramai = maiuscula ( letramin );<br />

printf( “a letra digitada em maiúsculo é: %c “, letramai);<br />

}<br />

char maiuscula ( char letra )<br />

{<br />

if (letra >= ‘a’ && letra = ‘a’ && letra


Escola Alci<strong>de</strong>s <strong>Maya</strong> - Primeiro Módulo<br />

Algumas consi<strong>de</strong>rações sobre o programa acima:<br />

• Na <strong>de</strong>claração do protótipo da função cubo: int cubo ( int numero ); informamos que esta função requer um<br />

argumento do tipo int e que a função não irá retornar um argumento também do tipo int;<br />

• Na função o cálculo é realizado <strong>de</strong>ntro do próprio retorno: return(numero * numero * numero);<br />

exercícios <strong>de</strong> Fixação<br />

1. Faça um programa que efetue o cálculo <strong>de</strong> uma prestação em atraso. Para tanto, utilize a fórmula PREST<br />

= VALOR + (VALOR * (TAXA / 100) * TEMPO). O programa <strong>de</strong>verá chamar uma função que faça a entrada<br />

dos dados e o cálculo da prestação e retorne o valor <strong>de</strong>ste cálculo para a função principal (main). Finalmente<br />

apresentar o valor da prestação.<br />

2. Faça um programa que possua uma função que efetue e permita apresentar o somatório dos N primeiros<br />

números inteiros. (1+2+3+4+5+6+...+N). Esta função <strong>de</strong>verá receber da função principal (main) o número N e<br />

no final esta mesma função <strong>de</strong>verá retornar o valor do somatório, que <strong>de</strong>verá ser apresentado ao usuário pela<br />

função principal (main).<br />

3. Faça um programa que possua uma função para calcular e apresentar o valor <strong>de</strong> uma potência <strong>de</strong> um<br />

número qualquer. Ou seja, ao informar para a função o número e sua potência, <strong>de</strong>verá ser apresentado o<br />

seu resultado. Por exemplo, se for mencionado no programa principal a função POTENCIA(2,3), <strong>de</strong>verá ser<br />

apresentado o valor 8.<br />

4. Faça um programa que possua uma função para calcular e apresentar a série <strong>de</strong> Fibonacci <strong>de</strong> N termos.<br />

A série <strong>de</strong> Fibonacci é formada pela seqüência: 1, 1, 2, 3, 5, 8, 13, 21, 34,...etc. Está série caracteriza-se pela<br />

soma <strong>de</strong> um termo posterior com o seu anterior subseqüente. A função main <strong>de</strong>ve apenas chamar a função que<br />

calcula a série <strong>de</strong> Fibonacci.<br />

5. Faça um programa que efetua a leitura <strong>de</strong> um número inteiro e apresente uma mensagem informando se<br />

o número é par ou ímpar. Usar uma função que i<strong>de</strong>ntifique se o número é par ou ímpar.<br />

6. Faça um programa que apresente um menu com as seguintes opções <strong>de</strong> cálculos:<br />

• Calcular a área do quadrado<br />

• Calcular a área do retângulo<br />

• Calcular a área do circulo<br />

• Encerrar o programa<br />

Estes cálculos <strong>de</strong>vem ser realizados em funções, ou seja, <strong>de</strong>verá ter uma função para cada tipo <strong>de</strong> cálculo.<br />

Cada função <strong>de</strong>verá ter entrada <strong>de</strong> dados (digitação dos dados para o cálculo), processamento dos dados<br />

(cálculos propriamente ditos) e a saída <strong>de</strong> dados (apresentação dos resultados dos cálculos).<br />

7. Faça um programa que apresente um menu com as seguintes opções e efetue os respectivos cálculos<br />

através <strong>de</strong> funções:<br />

• Calcular o volume <strong>de</strong> uma lata <strong>de</strong> óleo<br />

• Calcular o volume <strong>de</strong> uma caixa<br />

• Encerrar o programa<br />

8. Em uma Escola Técnica <strong>de</strong> Informática, há um professor que faz 6 provas. Faça um programa para<br />

calcular a média dos alunos <strong>de</strong> uma escola. O programa <strong>de</strong>verá ter um menu com as seguintes informações:<br />

• Calcular a média<br />

• Encerrar o programa<br />

O cálculo da média <strong>de</strong>verá ser realizado em uma função on<strong>de</strong> <strong>de</strong>verá ser solicitado o valor das 6 notas<br />

escolares, efetuar o cálculo da média e apresentar no final o resultado obtido conforme a tabela a seguir:<br />

[00,05) - Reprovado<br />

[05,07) - Recuperação<br />

[07,09) - Satisfatório<br />

[09,10] - Ótimo<br />

9. Faça um programa para ler uma temperatura em graus Celsius. Criar uma função que converte a<br />

temperatura <strong>de</strong> Celsius para Fahrenheit. A fórmula <strong>de</strong> conversão é F ( 9 * C + 160 ) / 5, sendo F a temperatura<br />

em Fahrenheit e C a temperatura em Celsius. A função <strong>de</strong> conversão <strong>de</strong>ve receber como entrada <strong>de</strong> dados<br />

a temperatura em Celsius em tipo <strong>de</strong> dado float, fazer a conversão e retornar o valor convertido em graus<br />

Fahrenheit.<br />

88


<strong>Fundamentos</strong> <strong>de</strong> <strong>Programação</strong><br />

10. Faça um programa para ler uma temperatura em graus Fahrenheit. Criar uma função que converte a<br />

temperatura <strong>de</strong> Fahrenheit para Celsius. A fórmula <strong>de</strong> conversão é C ( F – 32 ) * ( 5 / 9 ), sendo F a temperatura<br />

em Fahrenheit e C a temperatura em Celsius. A função <strong>de</strong> conversão <strong>de</strong>ve receber como entrada <strong>de</strong> dados a<br />

temperatura em Fahrenheit em tipo <strong>de</strong> dado float, fazer a conversão e retornar o valor convertido em graus<br />

Celsius.<br />

11. Faça um programa que leia um caracter do teclado. Criar uma função que irá converter esta letra para uma<br />

letra minúscula e retorna-la.<br />

12. Faça um programa que leia dois números. Criar uma função chamada potencia que eleva o primeiro<br />

número a uma potência inteira do segundo número e retorna o valor calculado. Por exemplo, se for lido os<br />

números 2 e 3, a função irá calcular 2³ ou seja 2 * 2 * 2<br />

13. Faça um programa que leia e calcule a área <strong>de</strong> um retângulo. O programa <strong>de</strong>verá ter uma função que<br />

leia a base e a altura do retângulo, calcule a área e retorne o valor do resultado que <strong>de</strong>verá ser apresentada na<br />

função main. Fórmula: Área do retângulo = base * altura.<br />

14. Faça um programa que leia e calcule a área <strong>de</strong> um triângulo. O programa <strong>de</strong>verá ter uma função que<br />

leia a base e a altura do retângulo, calcule a área e retorne o valor do resultado que <strong>de</strong>verá ser apresentada na<br />

função main. Fórmula: Área do triângulo = (base * altura) / 2.<br />

15. Faça um programa que leia e calcule a área <strong>de</strong> um trapézio. O programa <strong>de</strong>verá ter uma função que leia<br />

a base maior, a base menor e a altura do trapézio, calcule a área e retorne o valor do resultado que <strong>de</strong>verá ser<br />

apresentada na função main. Fórmula: Área do trapézio = ((base maior + base menor) /2) * altura.<br />

16. Faça um programa que leia e calcule a área <strong>de</strong> um círculo. O programa <strong>de</strong>verá ter uma função que<br />

leia o raio do círculo, calcule a área e retorne o valor do resultado que <strong>de</strong>verá ser apresentada na função main.<br />

Fórmula: Área do círculo = PI * r².<br />

Bibliografia utilizada:<br />

1. MANZANO, JOSÉ AUGUSTO N. G. – Algoritmos: Lógica para Desenvolvimento <strong>de</strong> <strong>Programação</strong>, Editora<br />

Érica, São Paulo, 2000.<br />

2. MANZANO, JOSÉ AUGUSTO N. G. – Lógica estruturada para <strong>Programação</strong>, Editora Érica, São Paulo,<br />

2001.<br />

3. BOHI, MARILYN – Guia para programadores, Editora Campus, Rio <strong>de</strong> Janeiro, 1988.<br />

4. ALCIDES MAYA - Polígrafo Técnicas <strong>de</strong> <strong>Programação</strong> – Porto Alegre, 2001<br />

5. ALCIDES MAYA - Polígrafo Algoritmo – Porto Alegre, 2001<br />

6. REIS, ANTONIO – Manual Básico <strong>de</strong> Linguagem C, Porto Alegre, 2000.<br />

7. Outras fontes – Internet, Revistas e Periódicos.<br />

89

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!