Fundamentos de Programação 1 - Alcides Maya Tecnologia
Fundamentos de Programação 1 - Alcides Maya Tecnologia
Fundamentos de Programação 1 - Alcides Maya Tecnologia
Transforme seus PDFs em revista digital e aumente sua receita!
Otimize suas revistas digitais para SEO, use backlinks fortes e conteúdo multimídia para aumentar sua visibilidade e receita.
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” , ¬a1 );<br />
printf( “Digite a nota 2: “ );<br />
scanf( “%f” , ¬a2 );<br />
printf( “Digite a nota 3: “ );<br />
scanf( “%f” , ¬a3 );<br />
printf( “Digite a nota 4: “ );<br />
scanf( “%f” , ¬a4 );<br />
printf( “Digite a nota 5: “ );<br />
scanf( “%f” , ¬a5 );<br />
printf( “Digite a nota 6: “ );<br />
scanf( “%f” , ¬a6 );<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”, ¬a[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”, ¬a[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