Escolar Documentos
Profissional Documentos
Cultura Documentos
Iniciação À Comp
Iniciação À Comp
Crditos: 04
Ementa
Descrio
Nesta disciplina apresentaremos a configurao bsica de um computador, de modo que
o aluno tenha uma compreenso geral de sua arquitetura. Estudaremos em seguida uma
linguagem de programao imperativa, permitindo capacitar o aluno na programao de
resolues de problemas numricos.
Objetivos
Ao final da disciplina o aluno dever ser capaz de:
267
Contedo
Unidade I
Unidade II
Algoritmos
1. Algoritmos
2. Abordagem dividir para conquistar
3. Algoritmo TrocarPneuFurado
Refinamento do passo 1
Refinamento do passo 1.5
4. Algoritmo TrocarLmpadaQueimada
5. Exerccios
6. Solucionando um problema
Fases de resoluo
Fase de implementao
7. Atitude tudo
Unidade III
Introduo programao
1. Conceitos bsicos
2. Memria e variveis
3. Dando nome s variveis
4. Tipos de variveis
5. Declarando uma varivel
6. Atribuindo valor a uma varivel
7. Constantes
268
Unidade IV
Unidade V
Unidade VI
Unidade VII
Unidade VIII
Funes
1. Qual o objetivo de uma funo?
2. A estrutura de uma funo
3. Criando uma funo
269
Unidade IX
Ponteiros
1. Um pouco mais sobre as funes
A memria e os endereos
Endereo e valor
2. Utilizao de ponteiros
I. Criar um ponteiro
II. Enviar um ponteiro a uma funo
III. Outro modo de enviar um ponteiro a uma funo
3. Um problema estranho?
4. Resumo
5. Teste
Unidade X
Arrays
1. Os arrays e a memria
2. Declarando um array
3. Como acessar um elemento
4. Atribuindo valores a um array
5. Arrays e ponteiros
6. Listando um array
7. Inicializando um array
8. Passagem de arrays como parmetros
9. Arrays de duas ou mais dimenses
10. Teste
270
Iniciao Computao
Unidade I Componentes bsicos de um computador
1. Situando a temtica
Os computadores esto cada vez mais presentes no dia-a-dia dos cidados. Mesmo aqueles que
no os utilizam diretamente tm essas mquinas ligadas s suas vidas. Basta nascer para que as
informaes referentes ao novo cidado passem a fazer parte de algum banco de dados, por
exemplo, o do hospital onde a criana nasceu. Ao registr-la, o pai (a me) estar contribuindo
para alimentar outro banco de dados, o do cartrio de registros civis. Ao iniciar seus estudos
oficiais, novas informaes sero transferidas para os computadores, desta vez os da escola. E
assim ser por toda a vida, imagino. A informao deve ser armazenada e disseminada no
momento necessrio. Seria bom ento entender um pouco sobre essas mquinas que nos
acompanham por toda a vida.
2. Problematizando a temtica
Os computadores so sistemas eletrnicos de processamento de dados, compostos de uma parte
fsica, denominada hardware e de uma parte lgica, denominada software. O hardware formado
por um conjunto de funes lgicas, geralmente associadas a um ou mais equipamentos fsicos,
capazes de executar determinadas tarefas. Iniciamos os nossos estudos sobre programao
apresentando uma noo sobre a configurao bsica de um computador.
3. Conhecendo a temtica
3.1 Unidades funcionais bsicas
As funes lgicas associadas ao hardware de um computador so geralmente agrupadas em
blocos chamados de unidades funcionais. Um computador possui as seguintes unidades
funcionais bsicas, compostas de circuitos eletrnicos especficos:
UC
UAL
CPU
Entrada
Sada
Registradores
Teclado
Mouse
Leitor de disquete
Scanner
Tela sensvel
Leitor de CD, DVD
Memria
Principal
Monitor (Vdeo)
Impressora
Gravador de disquete
Gravador de CD, DVD
271
para o meio exterior. A transmisso fsica desses dados se d por meio de dispositivos especiais.
Na figura acima so listados alguns dispositivos que tm a finalidade de realizar essas tarefas. Os
dispositivos que realizam tarefas relacionadas funo de entrada so conhecidos como
dispositivos de entrada de dados. De modo anlogo, os dispositivos que realizam tarefas
relacionadas funo de sada so conhecidos como dispositivos de sada de dados. Alguns
dispositivos so capazes de executar entrada e sada de dados.
3.3 Dispositivos de Entrada de Dados
Exemplos de alguns dispositivos de entrada de dados: teclado, mouse, scanner. Existem outros,
como microfone (dispositivo de entrada de som), monitores de vdeo sensveis ao toque, light-pen,
joystick, etc.
Teclado
Mouse
Scanner
Impressora
projetor
Monitor
Leitor/Gravador
de CDs
Leitor/Gravador
de disquetes
272
Leitor/Gravador
de HDs
Memria 256 MB
273
Nos dias atuais, uma CPU est completamente embutida em uma pastilha, denominada chip, de
dimenses reduzidas. As primeiras CPUs integradas em um nico chip foram a CPU 4004 e a
CPU 8008. Hoje esses chips so mais conhecidos no mercado pelo nome de processador ou
microprocessador.
Em 1974 a Intel fabricou o 8080, o primeiro microprocessador a ser usado em larga escala nos
chamados "computadores pessoais". Antes dele, os microcomputadores eram usados apenas em
laboratrios cientficos, em fbricas e em universidades.
III - Registradores, memrias especiais, de alta velocidade, localizadas no interior de um
microprocessador, enquanto a memria principal externa a este. Cada registrador possui uma
funo especfica. Dentre os registradores destacam-se os seguintes:
Contador de programa (PC - Program Counter), que aponta para a prxima instruo a
executar.
Registro de instruo (IR - Instruction Register) que armazena a instruo em execuo.
Outros registros que permitem o armazenamento de resultados intermedirios.
Clock
Clock um circuito oscilador que tem a funo de sincronizar a velocidade de transferncia de
dados entre duas partes durante um processamento. Por exemplo, a transferncia de dados entre
o processador e a memria principal. Essa velocidade de transferncia (freqncia) medida em
ciclos por segundo, ou Hertz.
A velocidade de acesso dentro do processador maior que na memria principal. Os
processadores Pentium-100, Pentium II-300, acessam a memria principal a 66 MHz.
3.9 Sistemas Operacionais
Sistemas operacionais so conjuntos de programas que permitem explorar (fazer funcionar) o
computador. Atualmente os sistemas operacionais mais conhecidos so Windows e Linux.
Um computador um conjunto de materiais inertes. So as diversas camadas de software
que fazem com que ele funcione. Quando ligado rede eltrica, uma primeira camada de
software, sempre a mesma, posta em ao. Esta camada foi gravada diretamente no hardware:
a BIOS (Basic Input/Output System). Esta camada realiza certo nmero de verificaes e de
testes (presena de diversos perifricos, volume de memria, etc). Aps isso o sistema
operacional assume o controle.
o sistema operacional que permite aos humanos dialogar com os computadores.
Segundo o grau de convivialidade do sistema, esse dilogo ser mais ou menos amigvel,
podendo ser textual, grfico ou uma mistura desses. A partir do sistema operacional o usurio
pode ento lanar os aplicativos (programas especficos).
3.10 Os arquivos em informtica
Todo arquivo visto e tratado do mesmo modo pelo sistema operacional em vista de seu
armazenamento em disco. Tecnicamente, um arquivo um conjunto de bits formando uma
entidade identificada por um nome e uma extenso seguindo a forma: nome.ext.
Somente a sua extenso capaz de determinar a natureza e assinalar ao sistema operacional o
que esse arquivo capaz de fazer. Assim, um arquivo .doc reconhecido como um programa
Word, um arquivo .xls reconhecido como um arquivo do Excel e esses softwares so carregados
na memria para execuo. Alguns arquivos de imagens (.jpeg ou .jpg, .gif, .png, etc.) necessitam
de um visualizador de imagens instalado no computador para que essas imagens possam ser
exibidas na tela. Por padro, est previsto que esses arquivos podem ser abertos no Internet
Explorer, capaz de exibi-los a partir de pginas da Internet.
Dependendo do sistema operacional, existem regras com mais ou menos restries para dar
nomes aos arquivos. No MS-DOS, antigo sistema operacional, os nomes de arquivo deveriam ter
no mximo 8 caracteres com uma extenso de trs caracteres. A partir do Windows 95 os nomes
dos arquivos passaram a ter at 256 caracteres (incluindo o caminho onde se encontra o arquivo,
por exemplo, C:\programas\C\programa1.exe).
274
Unidade II - Algoritmos
1. Situando a temtica
Programar uma cincia ou uma arte? A computao uma cincia, porem programar est mais
para arte. A programao requer certo dom. Mas isto podemos desenvolver com esforo e
pacincia. Assim como aprendemos a pintar, tambm podemos aprender a programar. Alguns
requisitos so necessrios, verdade. Para desenvolvermos programas que realizem algumas
proezas matemticas, necessrio que tenhamos algum conhecimento para matemtico,
seno, como program-las? Qualquer que seja a natureza de nossos programas, existem
algumas regras bsicas a serem seguidas. Primeiramente, preciso entender o enunciado do
problema a ser resolvido e ento partirmos para encontrar uma soluo. O estudo do domnio de
um problema conhecido no mundo da computao como anlise. A apresentao de uma
soluo para esse problema faz parte do que se chama projeto. Como os domnios (lgebra,
geometria, trigonometria, etc) so vastos e variados, procuramos seguir uma metodologia de
resoluo de problemas. o que faremos a seguir no estudo dos algoritmos.
2. Problematizando a temtica
Suponhamos o seguinte problema: trocar o pneu furado de um carro (voc j passou por este tipo
de problema?). Parece que estamos diante de um problema simples, mas tentemos explicar a um
rob como proceder para realizar tal tarefa. Veremos um enfoque denominado dividir para
conquistar, que nos ajudar bastante nessa e outras tarefas.
3. Conhecendo a temtica
3.1 Algoritmos
Definio: conjunto finito, ordenado e no ambguo de passos necessrios para realizar uma
tarefa. Esse conjunto apresenta as seguintes caractersticas:
possui um ponto de parada, isto , sua execuo finita;
recebe dados de entrada e, em funo desses, produz dados de sada.
Algoritmo Receita de bolo
Um algoritmo pode ser correto ou no. Um algoritmo correto produz uma sada correta e pra,
enquanto que um algoritmo incorreto produz uma sada incorreta ou no pra.
3.2 Abordagem dividir para conquistar
Essa abordagem, muito utilizada em informtica, consiste em dividir o problema inicial em vrios
subproblemas, recursivamente. Cada subproblema , logicamente, mais simples que o problema
inicial. Esse procedimento de diviso continua at que sejam encontrados subproblemas, que
possam ser resolvidos de forma simples ou trivial.
275
Refinamento
1.
2.
3.
4.
5.
6.
7.
276
Esses passos e refinamentos seriam importantes para a realizao dessas tarefas por uma
mquina. Um ser humano faz essas coisas intuitivamente, mas as mquinas...
3.5 Exerccios
1 Elabore um algoritmo para fazer pipoca em uma panela de fogo, usando manteiga, sal e
milho.
2 Elabore um algoritmo para realizar uma chamada telefnica local.
3 Elabore um algoritmo para realizar uma chamada telefnica de longa distncia (interurbana).
4 Elabore um algoritmo que simule sua sada de casa pela manh. Comece com o passo
dormindo na cama e inclua todas as suas atividades matinais.
5 Elabore um algoritmo para calcular as razes reais de uma equao do 2 grau. Se a equao
no tiver razes reais, isto deve ser mencionado como resposta.
Fase de
resoluo do
problema
Problema
Algoritmo
Passo nico
Fase de
implementao da
soluo
Programa de
computador
277
278
5. Referncias
1. Salvetti, Dirceu D., Barbosa, Lisbete M., Algoritmos. Pearson Education do Brasil, 1998
2. Pinheiro Neto. Augusto A., Notas de aula, 2001.
279
2. Problematizando a temtica
O computador uma mquina estranha, o mnimo que se pode dizer. Ele entende apenas
aquilo que est codificado somente com 0s e 1s. Esse tipo de linguagem denominado
linguagem de mquina, ou de baixo nvel. Imaginemos, por exemplo, que a operao de somar
seja representada por 11001100 e que desejemos somar 2 com 3. Para transmitir essa ordem a
um computador, temos que escrever uma instruo equivalente a esta: 11001100 00000010
00000011. Felizmente, as linguagens de programao atuais esto bem mais prximas das
linguagens naturais, aquelas que os homens utilizam para se comunicarem. Existem diversas
linguagens de programao que podem ser utilizadas na implementao de algoritmos.
Estudaremos a seguir uma das mais importantes hoje em dia, a linguagem C.
3. Conhecendo a temtica
3.1 Conceitos bsicos
Linguagens de alto nvel
As linguagens atuais com as quais se escreve programas para computadores so estruturadas
(possuem estruturas de controle), mais prximas da linguagem natural e com certo formalismo
matemtico. Essas linguagens so chamadas de linguagens de Alto Nvel. Exemplos de
linguagens de alto nvel.
C, C++, Java, Pascal, Visual Basic, Delphi, PHP, etc...
Programa fonte e programa executvel
Os programas escritos em linguagens de alto nvel, aqueles escritos pelo programador, so
geralmente chamados de programas fonte, pois ali so codificados os conhecimentos necessrios
para a soluo de determinada tarefa. Uma vez traduzido para a linguagem de mquina, aquela
dos 0s e 1s, o programa resultante recebe o nome de programa executvel.
Tradutores
Tradutores so programas especiais que traduzem um programa fonte para linguagem de
mquina. Alguns programas so ditos compilados e outros interpretados. O que isso? Existem
tradutores que, quando da traduo do programa fonte, traduzem cada linha e a executam
imediatamente. Nesse caso diz-se que houve uma interpretao do programa fonte e esse tipo de
tradutor denominado interpretador. Quando a traduo se d por inteiro e to somente aps seu
trmino o programa executado, diz-se que ocorreu uma compilao e esse tipo de tradutor
denominado compilador. Programas compilados so mais rpidos do que programas
interpretados.
Importante! Existe um compilador diferente para cada linguagem de alto nvel. Isso lgico. As
linguagens sendo diferentes, no se traduz C do mesmo modo que Delphi, por exemplo.
280
Programa de
traduo para
linguagem
binria
Programa
Fonte
Compilador/
Interpretador
Programa
traduzido
em
linguagem
de mquina
Programa
Executve
l
Fonte
Veremos em seguida que mesmo para uma nica linguagem como C, por exemplo, existem vrios
compiladores diferentes. H compiladores escritos pela Microsoft, GNU, etc. Felizmente esses
compiladores so quase idnticos.
Linguagens de altssimo nvel
So fceis de utilizar, possuem vrios elementos de linguagem que podem ser arrastados para a
rea do programa e o seu cdigo ento gerado automaticamente, digamos "grande pblico",
como Visual Basic. Essas linguagens apresentam alguns inconvenientes: elas custam caro e so
limitadas plataforma. Se o compilador for voltado plataforma Windows, por exemplo, no
espere fazer um programa desenvolvido com ele funcionar sob Linux ou Macintosh. Enfim, no
podemos fazer tudo que desejarmos com esse tipo de linguagem. Perceba que estamos de certa
forma limitados.
As linguagens de alto nvel so um pouco mais difceis que Visual Basic, mas com uma linguagem
deste tipo, como C ou C++, aprendemos muito mais sobre programao e funcionamento dos
computadores. Aps aprendermos uma linguagem deste tipo, somos capazes de aprender mais
facilmente uma outra linguagem de programao. O programador torna-se ento mais autnomo.
Em particular C e C++ so linguagens muito populares. Elas so utilizadas para programar uma
grande parte dos softwares mais conhecidos. Enfim, programando em C ou C++, o programador
est livre de comprar softwares carssimos. Programar em C ou C++ , geralmente, gratuito.
Qualidades de um programador
Um programador deve ter certas qualidades:
pacincia: se um programa no funcionar da primeira vez, preciso saber perseverar!
bom senso: no preciso ser to forte em matemtica, mas isso no impede de se ter
que refletir!
Calma: no se d tapa no computador
281
comum utilizarmos um programa 3-em-1 que combina editor de texto, compilador e depurador.
Esses programas so tambm chamados de IDE "Integrated Development Environment".
Exemplos de IDE para programar em C: Bloodshed Dev-C++ e Code::Blocks.
Em nosso curso escreveremos os programas fonte no bloco de notas (notepad) se o sistema
operacional for Windows ou no KEdit (ou outro editor de texto que acompanhe a verso instalada)
se o sistema operacional for Linux. Isto nos restringe aos conhecimentos da linguagem de
programao, o que mais interessante para quem est iniciando. Aps conhecermos bem a
sintaxe e a semntica da linguagem, usar uma interface tipo IDE ser fcil. Acredite.
Vejamos o esquema abaixo. Ele bastante simples, mas do necessitamos saber para
programar.
Endereo
Valor
145
3.8028322
0.8272555
39014768
...
...
n-1
940.5118
282
Enfim, e isto muito importante, a linguagem C (como C++) faz diferena entre as letras
maisculas e minsculas. Ento Brasil, bRasil e brasil so nomes que representariam trs
variveis distintas. Veja alguns exemplos de nomes vlidos de variveis:
Vidamedia, vida_media, vida_Media, VidaMedia, num_de_telefone, bola215, etc
Cada programador tem sua maneira prpria de nomear as variveis. Uma maneira bastante
utilizada :
Comear os nomes de variveis por maisculas.
Se houver vrias palavras no nome da varivel, colocar uma maiscula no incio de cada
palavra. VidaMedia, por exemplo.
283
Observemos que int e long so parecidos. Antes no era assim (um int era menor que um long),
mas hoje as memrias evoluram e temos bastante espao para escrever nmeros grandes sem
grandes preocupaes com a memria. Por razes de compatibilidade, a linguagem C guarda os
dois tipos. Na prtica utilizamos principalmente os tipos char, long e double. Voc ver que na
maior parte do tempo manipularemos nmeros inteiros (tanto melhor, pois so mais fceis de
utilizar).
Ateno com os nmeros decimais. O computador no conhece a vrgula decimal. Em seu lugar
utilizaremos o ponto. No devemos escrever 273,45, mas 273.45!
Isso ainda no tudo! Alm dos tipos que armazenam nmeros inteiros (char, int, long,...) j
vistos, existem outros ditos unsigned (sem sinal) que podem armazenar apenas nmeros
positivos. Para utiliz-los basta escrever a palavra unsigned antes do nome do tipo.
unsigned char 0 a 255
unsigned int 0 a 4 294 967 295
unsigned long 0 a 4 294 967 295
A vantagem de utilizar tipos unsigned que podemos armazenar nmeros duas vezes maiores
(char pra em 128 enquanto unsigned char vai at 255, por exemplo). Por que criar trs tipos para
os nmeros inteiros? Um s tipo no seria suficiente? Sim, mas no incio foram criados vrios
tipos para economizar memria. A tabela a seguir mostra o espao necessrio para armazenar os
tipos.
284
Por exemplo, se desejamos criar uma varivel de nome TotalDePontos do tipo long, basta digitar
a linha seguinte:
long TotalDePontos;
Isso tudo!
Outros exemplos:
long NotaDeFisica;
double TotalRecebido;
unsigned long NumeroDeEspacosNaLeituraDeUmTextoLongo;
Ateno! A declarao das variveis deve ser feita no incio das funes. O texto no quadro
abaixo um cdigo de programa escrito em C. Um programa em C formado por vrios trechos
de cdigo com um formato especial denominado funo. Todo programa possui uma funo
principal chamada main, essa a nica no programa abaixo. No se preocupe, aprenderemos aos
poucos a escrever um programa.
#include <stdio.h>
int main(int argc, char *argv[])
{
// Incio da funo
long TotalDePontos;
system("PAUSE");
return 0;
// Fim da funo
}
Algumas explicaes
Na verdade se passa alguma coisa, mas no possvel
v-la. Quando a execuo do programa chega linha de
declarao da varivel TotalDePontos ele solicita ao
computador permisso para utilizar um espao de sua
memria principal.
Se tudo vai bem, o computador responde pois no,
faa como se estivesse em sua casa . O nico
problema que poderia acontecer seria no haver mais espao disponvel na memria do
computador, mas isso ser um caso extremo. possvel declarar mais de uma varivel em uma
mesma linha do programa. Por exemplo, long a, b, c;
Isso criar trs variveis de tipo long denominadas a, b e c.
3.6 Atribuindo valor a uma varivel
tudo que h de mais simples. Para atribuir o valor 8 varivel TotalDePontos basta escrever:
TotalDePontos = 8;
285
#include <stdio.h>
int main(int argc, char *argv[])
{
// Incio da funo
long TotalDePontos;
TotalDePontos = 8 ;
system("PAUSE");
return 0;
// Fim da funo
}
286
Por enquanto saiba que, se quisermos exibir um nmero inteiro, precisamos utilizar o
especificador %d e para exibir um nmero decimal precisamos utilizar o especificador %f.
Os especificadores de formato so geralmente utilizados dentro de um texto explicativo, como no
exemplo anterior. preciso, entretanto indicar para a funo printf qual o valor a ser exibido. Para
isso preciso escrever o nome da varivel que contm esse valor aps o texto contendo o
especificador, aps uma vrgula. Vejamos outros exemplos:
printf("O valor de a eh %d ", a1);
printf("Foram encontrados %d resultados ", r);
No primeiro exemplo %d indica que um valor inteiro deve ser exibido na tela do computador e
esse valor est armazenado em a1. No segundo exemplo esse valor est armazenado na varivel
r.
Por enquanto veremos os programas prontos e aprenderemos cada vez mais sobre suas
estruturas. Pelo que temos visto podemos tirar algumas concluses:
Um programa comea sempre com a instruo #include<stdio.h>, isto indica que uma
biblioteca de funes de nome stdio deve ser includa automaticamente no programa e isto
feito, no se preocupe.
O cabealho da funo principal ser sempre int main().
Aps // vem um comentrio, que no executado, serve apenas de documentao.
system("PAUSE"); fixa a tela de modo que possamos ver a resposta.
return 0 indica um fim normal do programa.
#include <stdio.h>
int main()
{
long TotalDePontos = 5;
// No incio o alunos possui 5 pontos
printf("Voce possui %d pontos \n", TotalDePontos);
printf("**** H U M M M ****\n");
// O aluno errou uma questo
TotalDePontos = 4;
// Ele acaba de perder um ponto!
printf("Ah, agora voce so tem %d pontos!\n\n", TotalDePontos);
system("PAUSE");
return 0;
}
Este programa produz a seguinte sada:
Voce possui 5 pontos
**** H U M M M ****
Ah, agora voce so tem 4 pontos!
Pressione uma tecla para continuar...
Exibir vrias variveis em um nico printf
possvel exibir o valor de vrias variveis em um nico printf. Para tanto, suficiente indicar %d
ou %f onde se deseja que os valores sejam impressos e em seguida indicar as variveis que
contm esses valores, obedecendo ordem em que os especificadores foram indicados,
separadas por vrgula.
Exemplo.
printf("Voce tem %d pontos e faltam %d perguntas", TotalDePontos, p);
3.9 Recuperando uma entrada
As variveis vo comear a ficar mais interessantes agora. Vamos solicitar ao usurio (aquele que
est operando o computador) que digite um nmero. Vamos aprender a recuperar essa entrada e
a armazenar em um determinado lugar na memria principal. Para solicitar ao usurio que entre
287
com uma determinada informao pelo teclado utiliza-se a funo scanf. Essa funo se parece
com a funo printf. Deve-se colocar um %d ou %f, entre aspas, para indicar um inteiro ou um
decimal a ser digitado.
Veja um exemplo.
scanf("%d", &idade);
Coloca-se apenas %d (ou %f) entre as aspas. No esquecer de colocar o smbolo & antes do
nome da varivel que vai receber o valor. E por que esse & antes do nome da varivel?
preciso que voc acredite em mim. Eu explicarei isso mais tarde. No o fao agora para no
embolar o meio de campo. Quando o programa encontra um scanf ele faz uma pausa e espera
que o usurio digite um valor. Esse valor ser armazenado na varivel idade. Veja um pequeno
exemplo.
#include <stdio.h>
int main()
{
long idade = 0; // inicializa a varivel com 0
printf("Qual a sua idade? ");
scanf("%d", &idade); // Solicita a entrada de idade com scanf
printf("Ah ! Voce tem %d anos!\n\n", idade);
system("PAUSE");
return 0;
}
Sada:
Qual a sua idade? 20
Ah! Voce tem 20 anos!
Pressione uma tecla para
continuar...
Pronto! Voc compreendeu o princpio. Graas funo scanf o computador pode interagir com o
usurio.
Observe que nada nos impede de digitar outra coisa que um nmero inteiro:
Se digitarmos um nmero decimal como 34.56, por exemplo, ele ser truncado
imediatamente e s a parte inteira armazenada. Neste caso, 34 armazenado na
varivel idade.
Se digitarmos letras, a varivel no muda de valor. Permanece ento com o valor 0 (valor
com que foi inicializada). Se a varivel no tivesse sido inicializada, o programa imprimiria
qualquer coisa. Percebem a importncia da inicializao das variveis?
3.10 Testes
1. Quando se declara uma varivel, qual memria utilizada?
( ) Registros
( ) Memria cache
( ) Memria RAM
( ) Disco rgido
2. Qual memria no apagada quando o computador desligado?
( ) Registros
( ) Memria cache
( ) Memria RAM
( ) Disco rgido
3. Qual desses no um nome vlido de varivel?
( ) scanf
( ) coordenadaDaJanela
( ) desconto_total
288
5. Referncias
289
2. Problematizando a temtica
J sabemos que o computador uma calculadora muito potente com a qual podemos realizar as
seguintes operaes bsicas com muita simplicidade:
Adio
Subtrao
Multiplicao
Diviso
Mdulo (eu explicarei o que isto)
Quando desejamos fazer outras operaes mais complicadas, temos que as programar, isto ,
explicar ao computador como faz-las. Felizmente existe uma biblioteca de funes matemticas
j prontas que acompanha a linguagem C. Neste caso no necessrio programar as operaes,
mas simplesmente conhecer a interface das funes correspondentes, ou seja, saber como utilizlas.
3. Conhecendo a temtica
3.1 Primeiros passos
Vamos comear pela adio. Para fazer uma adio se utiliza o smbolo + (sem brincadeira). O
resultado de um clculo, geralmente, deve ser armazenado em uma varivel.
Ateno! Na maioria das vezes, representaremos apenas a parte do programa fonte que estiver
sendo discutida. Lembre-se de completar o cdigo do programa comeando por
#include <stdlib.h>
#include <stdio.h>
..............................
Vejamos um exemplo de um trecho de programa que realiza uma soma.
..............................
long resposta = 0;
..............................
resposta = 13 + 7;
No necessrio ser um gnio em matemtica para saber que a varivel resposta armazenar o
valor 20 aps a execuo desse trecho de programa. Claro que nada exibido na tela como
resposta. Para ver o resultado na tela, como j sabemos, necessrio utilizar a funo printf. Em
algum lugar do programa poderamos ter printf(17 + 3 = %d, resposta);. O resultado na tela seria
17 + 3 = 20.
Isso tudo para a adio. Para as outras operaes o procedimento o mesmo apenas o smbolo
do operador muda. Os operadores so representados pelos smbolos:
Adio: +
Subtrao: Multiplicao: *
Diviso: /
Mdulo: %
290
As trs primeiras operaes so realizadas de modo natural, conhecido por quase todos. Apenas
as operaes de diviso e de mdulo merecem um pouco de reflexo, pois existem algumas
consideraes especficas relacionadas com os tipos envolvidos.
3.2 A diviso
As divises funcionam normalmente em um computador quando no sobram restos. Por exemplo,
8/2 4, mas 7/2 que deveria ser 3.5 3 e sobra um resto 1. Observe.................................
long resposta = 0;
.............................
resposta = 7/2;
printf ("7 / 2 = %d", resposta);
..............................
Sada.
7/2=3
Eis aqui um problema. Sabemos que 7/2=3.5, mas o resultado apresentado foi 3. Ocorre que a
varivel resposta do tipo long, portanto inteiro, por isso o computador truncou o resultado
ficando apenas com a sua parte inteira. Se resposta tivesse sido declarada como float ou double
o resultado seria 3.500000. Faa as modificaes no programa fonte e execute-o novamente para
ver o resultado.
Se quisermos que o computador mostre o bom resultado (3.5) ser necessrio transformar os
nmeros 7 e 2 para decimais. Isso feito escrevendo-se 7.0 e 2.0 (so os mesmos nmeros, mas
agora o computador vai entend-los como nmeros decimais e, portanto efetuar uma diviso de
decimais). Na verdade, basta escrever um dos nmeros no formato decimal (com ponto decimal).
A linguagem C reconhecer a expresso como sendo do tipo decimal e efetuar a operao
corretamente.
.....................................
double resposta = 0;
....................................
resposta = 7.0 / 2.0;
printf ("7 / 2 = %f", resposta);
......................................
Sada
7 / 2 = 3.500000
Observe que o especificador de formato utilizado foi %f, para nmeros decimais. Mas ateno, s
vezes se deseja realmente que o resultado seja um valor inteiro, nesse caso o resultado inicial (3)
estaria correto.
Esta propriedade dos nmeros inteiros muito importante. Tenha sempre em mente que 5/2=2,
8/5=1, 6/7=0, etc. Para obter um resultado decimal necessrio que os operandos sejam
nmeros decimais: 5.0/2.0=2.5, 8.0/5.0=1.6, 6.0/7.0=0.857143, etc.
De fato, na diviso 5/2, o computador responde questo quantas vezes o nmero 2 est dentro
do nmero 5? Resposta, 2 (duas vezes).
Voc agora deve estar se perguntando como fazer ento para recuperar o resto da diviso?
Esse o nosso prximo passo.
3.3 Primeiros passos
O mdulo uma operao matemtica que permite se obter o resto da diviso de dois nmeros
inteiros. Talvez seja uma operao menos conhecida que as anteriores, mas de grande
importncia nos clculos realizados por computadores. Como mostrado anteriormente, o operador
de mdulo representado por %. Veja os exemplos:
7%2=1
ler: o resto da diviso de 7 por 2
28 % 5 = 3
ler: o resto da diviso de 28 por 5
291
10 % 2 = 0
#include <stdio.h>
#include <stdlib.h>
int main()
{
long resposta = 0, num1 = 0, num2 = 0;
// ** solicitar num1 e num2 ao usurio **
printf("Entre com o valor de num1: ");
scanf("%d", &num1);
printf("Entre com o valor de num2: ");
scanf("%d", &num2);
Sada
Entre com o valor de num1: 52
Entre com o valor de num2: 30
52 + 30 = 82
Experimente agora seguir o mesmo procedimento para que a sua calculadora execute as outras
operaes bsicas, ou seja, modifique o programa acima para que ele execute as operaes de
subtrao, multiplicao e diviso.
3.5 Abreviaes: incremento e decremento
Existem em C tcnicas que permitem abreviar a escrita de certas operaes. Essas abreviaes
tm por objetivo agilizar a digitao e tornar o cdigo mais conciso.
Incremento
Quase sempre, um programador se depara com um problema bem simples, mas de grande
importncia: aumentar de 1 o valor de certa varivel.
Imagine que um programa trabalhe com uma varivel denominada Total e que se deseje
aumentar de 1 o valor dessa varivel. Como faz-lo se o seu valor atual no conhecido?
Soluo: Total = Total + 1;
O que se passa em um computador ao encontrar uma instruo como esta? Bem, ele sempre
avaliar a expresso que se encontra do lado direito da instruo de atribuio (representada pelo
292
smbolo =) e armazenar o seu resultado na varivel que se encontra do lado esquerdo. Assim, na
unidade de aritmtica e lgica (UAL), ele somar 1 ao valor atual da varivel Total e substituir o
valor armazenado em Total pelo valor da expresso calculada.
Na memria
Na UAL
Na memria
total
Antes
30
total
30+1
Depois
31
Observe que nessa instruo escreve-se duas vezes o nome de uma mesma varivel (Total). Os
programadores achando isso muito cansativo resolveram ento abrevi-la. A instruo seguinte
faz exatamente a mesma coisa que a anterior e escreve-se menos: Total++;
Este recurso muito usado nos programas escritos em C. Voc ter oportunidade de comprovar
este fato.
Decremento
Esta operao o inverso daquela denominada incremento. Trata-se de retirar 1 do valor de uma
varivel. Ento, de modo anlogo operao de incremento tem-se: Total = Total - 1; equivalente
a Total--;
3.6 Outras abreviaes
Existem outras abreviaes que funcionam sob o mesmo princpio que o de incremento
(decremento) visto anteriormente, porem de forma mais geral. Essas abreviaes funcionam para
todas as operaes bsicas. A tabela abaixo mostra essas abreviaes.
Operao
total = total +5
total = total -5
total = total *5
total = total /5
total = total %5
Abreviao
total += 5
total -= 5
total *= 5
total /= 5
total %= 5
293
conjunto de funes foi escrito por outros programadores e servem, de certo modo, para evitar
que os programadores atuais reinventem a roda a cada novo programa.
J utilizamos as funes printf et scanf da biblioteca stdio.h. Existem outras bibliotecas de
programas, dentre elas uma denominada math.h, que contm diversas funes matemticas j
prontas, isto , j programadas.
Tenha em mente, por exemplo, que a linguagem C no sabe calcular potncia. Se escrevermos 43
o computador no saber executar essa operao, pois ele no sabe o que isso significa. Para a
realizao desse clculo necessrio indicar no incio do programa a incluso de uma biblioteca
que contenha a funo responsvel por ele.
Essa indicao feita por: #include <math.h>
Uma vez feita essa indicao, podemos utilizar todas as funes dessa biblioteca. As principais
funes existentes na biblioteca math so:
fabs
Esta funo retorna o valor absoluto de um nmero, isto , |x| (sua notao matemtica).
O valor absoluto de um nmero o seu valor positivo:
Ao passar o valor -78 para a funo, ela retornar 78.
Ao passar o valor 175 para a funo, ela retornar 175.
........................................................
double absoluto = 0, x=-42;
absoluto = fabs(x); // absoluto receber o valor 42
........................................................
A funo fabs retorna um valor double por isso devemos declarar a varivel absoluto (aquela que
vai receber o retorno da funo) como sendo do tipo double. Existe uma funo similar a fabs na
biblioteca "stdlib.h", a funo abs. Essa funo funciona do mesmo modo que fabs, mas
somente para valores inteiros. Devemos ento declarar a varivel que vai receber o retorno da
funo como sendo do tipo int.
ceil
Esta funo retorna o menor nmero inteiro maior que o nmero decimal que lhe passado como
argumento. Por exemplo, ao passar 18.33 como argumento para a funo ela retorna 19. Esta
funo retorna um valor do tipo double.
.........................................................
double teto = 0, valor1 = 18.33;
teto = ceil(valor1);
// teto valer 19
//Programa floor, ceil
floor
Esta funo funciona como
a precedente, mas retorna o
maior inteiro menor do que
o valor decimal passado
como
argumento.
Por
exemplo, ao passar 18.99
como argumento para a
funo ela retorna 18.
Vejamos um programa que
exemplifica
as
duas
funes.
#include <stdio.h>
int main(void)
{
double base=0, valor2=18.99;
float teto=0, valor1=18.33;
teto=ceil(valor1);
base=floor(valor2);
printf("Base = %f\n", base);
printf("Teto = %f\n", teto);
printf("Tamanho de base (em bytes) = %d\n", sizeof(base));
printf("Tamanho de teto (em bytes) = %d\n", sizeof(teto));
getch();
return 0;
}
294
Outras funes.
funo
pow(n, p)
sqrt(n)
argumentos
(double|float|int, double|float|int)
(double|float|int)
sin(x)
cos(x)
tan(x)
asin(x)
acos(x)
atan(x)
exp(x)
log(x)
log10(x)
em radianos
em radianos
em radianos
double
double
double
double
double
double
retorna
double|float|int (np)
double ( n )
double (seno de x)
double (cosseno de x)
double (tangente de x)
double (arco seno de x)
double (arco cosseno de x)
double (arco tangente de x)
double ( e x )
double (loge x)
double (log10 x)
3.8 Testes
1. Qual o smbolo de multiplicao na linguagem C?
( )*
( )+
( )/
( )-
( )%
( )5
( )4
( ) 15
(
(
(
(
(
)0
)1
)4
) 12
) 14
long numero = 4;
numero--;
numero *= 4;
numero %= 12;
numero += 1;
6. Qual das funes abaixo se deve utilizar para que 13.25 seja arredondado para 14?
( ) pow ( ) ceil
( ) floor
( ) sqrt
295
5. Referncias
296
2. Problematizando a temtica
As funes mais utilizadas para entrada ou sada so:
scanf
printf
Sempre que um programa precisar de dados iniciais vindos do mundo exterior, esses devero ser
inseridos no programa por uma funo de leitura. isso que faz a funo scanf. De modo
anlogo, os dados produzidos como resultado de processamento interno so exibidos, enviados
para o mundo exterior, via a funo printf. Vejamos alguns detalhes sobre essas funes.
3. Conhecendo a temtica
3.1 Algumas consideraes sobre a funo scanf
Consideremos o comando scanf(%d, &n);. Trata-se aqui da leitura de um valor que dever ser
armazenado na varivel n. Para administrar corretamente a varivel n, a funo scanf precisa
conhecer o seu tipo. No exemplo acima, o primeiro parmetro da funo, representado pela
seqncia de caracteres %d indica ao compilador C que a varivel de tipo inteiro (int). Se a
varivel n pertencesse a um outro tipo, outro caractere seria usado no lugar de d. Essa seqncia
de caracteres conhecida pelo nome especificador de formato. O segundo parmetro da funo
(&n) indica o endereo na memria do computador, onde a varivel n ser armazenada. O
computador se encarrega de calcular esse endereo. O programador apenas deve escrever o
parmetro &n para que o computador saiba que no programa o valor armazenado naquele
endereo ser conhecido por n. O endereo de uma varivel x representado, portanto, pela
expresso &x.
3.2 Algumas consideraes sobre a funo printf
O primeiro argumento dessa funo sempre uma seqncia de caracteres. Explicamos o
funcionamento dessa funo com a ajuda de alguns exemplos.
1.
printf(bom dia);
Quando essa instruo encontrada, a funo printf se encarrega de escrever na tela do
computador a seqncia bom dia.
2.
297
printf(%d, 5);
A funo printf substitui o especificador de formato %d pelo primeiro parmetro situado
aps a vrgula, neste caso o inteiro 5. Lembre que o caractere d em um especificador de
formato representa um nmero inteiro.
Seja o programa
#include <stdio.h>
int main()
{
int altura=185;
float peso=80.5;
char nome[10]="Joao";
printf("%s mede %d cm e pesa %f kg", nome, altura, peso);
getch();
return 0;
}
4.
getch(): aguarda a prxima tecla ser pressionada. Isto permite ao usurio ver na tela o resultado
exibido pelo programa.
298
A instruo return 0; ao fim da funo main permite enviar o valor 0 ao sistema o que significa,
por conveno, que o programa terminou normalmente. O envio desse valor obrigatrio em C,
pois a funo main declarada como sendo do tipo int, logo espera um valor desse tipo.
3.3 Vamos praticar um pouco
Digitemos o programa abaixo. Antes de execut-lo, procure entender como sero a sua entrada e
a sua sada. O objetivo que ele seja auto-explicativo.
Alguns comentrios.
- algumas palavras esto sem acentuao, pois isto no permitido na linguagem C, salvo nos
comentrios;
- o texto entre os smbolos /* e */ um comentrio e, portanto, no ser compilado;
- a primeira chamada funo printf serve para orientar o usurio sobre o que ele deve fazer
quando da execuo deste programa (o que ele deve fazer mesmo?). Experimente retirar esse
comando do programa. Ele funcionar corretamente, mas o usurio saber o que o computador
estar esperando como entrada de dados?
- na instruo scanf("%d %d %d",&a,&b,&c); os especificadores de formato (%d) podem ser
separados por espao ou no, isto no tem influncia no programa;
- a cada especificador de formato na funo scanf corresponde, em ordem, um argumento a ser
lido do teclado;
- as prximas chamadas funo printf servem para imprimir (exibir na tela do computador) os
valores das variveis a, b e c;
- no incio de cada chamada a printf h uma ordem para o computador mudar de linha (\n);
- getch() permite que o usurio veja o resultado na tela (fixa a tela de execuo do programa).
Experimente retirar esse comando do programa e tire suas prprias concluses.
299
computador com dados do mundo exterior a fim de que ele possa realizar alguns processamentos
indicados no algoritmo implementado como soluo de um problema, por outro precisamos ver os
resultado obtidos. Bem formatar esses procedimentos de entrada e sada implica em apresentar
um trabalho legvel e compreensvel. De nada adianta um programa que tenha um bom
desempenho nos seus procedimentos internos se no somos capazes de aliment-los de forma
adequada e amigvel, com facilidade.
5. Referncias
1. Ascencio, Ana F G., Campos, Edilene A V., Fundamentos da Programao de
Computadores: Algoritmos, Pascal, C/C++ e Java, 2 edio, Pearson Education, 2007.
2. Hutchison, Robert C., Just, Steven B., Programming using the C language. Mcgraw-Hill
Book Company, 1988.
3. Kernighan, Brian W., Ritche, Dennis M., Le langage C, Masson, 1986.
300
2. Problematizando a temtica
Uma condio o resultado de um teste de comparao. Imaginemos que um programa deve
executar a funo A ou a funo B de acordo com o valor da mdia aritmtica calculada a partir de
trs notas. Se o valor da mdia for maior ou igual a 7, ento deve ser executada a funo A, caso
contrrio deve ser executada a funo B. Assim, em que condio deve ser executada a funo
A? Obviamente essa funo dever ser executada se o resultado da comparao entre a mdia
calculada e o valor 7 for "a mdia superior ou igual a 7".
Os smbolos de comparao utilizados na linguagem C so listados na tabela abaixo.
Smbolo Significado
==
>
igual a
superior a
<
inferior a
>=
superior ou igual a
<=
!=
inferior ou igual a
diferente de
3. Conhecendo a temtica
3.1 A estrutura if ... else
O teste if
Este teste consiste em realizar uma operao de comparao e indicar o que deve ser feito
quando o resultado da comparao verdadeiro. Isto codificado assim:
onde expr uma expresso de comparao. A parte do programa
escrita entre as chaves { e } denominada um bloco de instrues,
tambm chamada simplesmente bloco. A semntica dessa instruo
: se o valor da expresso expr for True (verdadeiro), ento o
computador dever executar o bloco de instrues pertencente
instruo e, em seguida, executar a prxima instruo aps o if. Caso
o valor da expresso condicional seja False (falso), a prxima
instruo aps o if ser executada.
if (expr)
{
Bloco de instrues
}
prxima instruo
301
.....
True
expr
Bloco
False
prxima
instruo
Problema1. Testar a varivel idade, correspondente idade de uma pessoa. Se o valor dessa
idade for maior do que ou igual a 18, imprimir uma mensagem informando esse fato.
if (idade>=18)
{
printf( voce eh maior de idade ) ;
}
prxima instruo;
#include <stdio.h>
int main()
{
long idade = 25;
if (idade >= 18)
{
printf("Voce eh maior de idade!\n");
}
system("PAUSE"); // ou getch()
return 0;
}
302
.....
expr
True
Bloco
True
False
Bloco
False
prxima
instruo
O teste else if ... para dizer "caso contrrio, se ..."
Quando o primeiro teste no funcionar e a situao exigir, Bloco False poder conter outro if ...
else. Vejamos o exemplo a seguir.
if (idade >= 18)
{
printf("voce eh maior de idade");
}
else if ( idade >= 12 )
{
printf("voce eh um adolescente");
}
else
{
printf("Paciencia, voce ainda eh uma criana");
}
prxima instruo
2. se a expresso (idade>=18)
avaliada False, o Bloco Else
executado. Notar que esse bloco
um if ... else. Assim, a segunda
expresso de comparao (idade >
12)
avaliada.
Se
True,
printf("voce eh um adolescente");
executada.
Se
False,
printf("Paciencia, voce ainda eh uma criana"); executada. Em qualquer dos casos, aps a
execuo de printf, prxima instruo ser executada.
303
.....
expr
True
Bloco
True
True
Bloco
True
False
expr
False
Bloco
False
prxima
instruo
printf("Saida do IF\n");
system("pause"); // ou getch();
return 0;
304
i
1
2
3
4
intervalo
n<0
0 n < 20
20 n <100
n >= 100
Conectivo AND
(smbolo: &&)
A
B
A && B
True
True
True
True
False
False
False
True
False
False False
False
A
True
True
False
False
Conectivo OR
(smbolo: ||)
B
A || B
True
True
False
True
True
True
False
False
Teste AND
Para saber se o valor de n pertence ao intervalo 2 do problema anterior (0 n < 20) basta
escrever: if(n>=0 && n<20) ... Em portugus se diria: se n maior do que ou igual a 0 e menor do
que 20 ... Trata-se de uma condio composta. Ela ser verdadeira apenas se as duas condies
envolvidas forem verdadeiras.
Teste OU
Para saber se uma pessoa possui mais de 20 anos ou se o seu saldo bancrio superior a 5000
reais basta escrever: if(idade>20 || saldo>5000) ... Observe que se pelo menos uma das
condies for verdadeira ento a condio composta tambm o ser.
Teste NOT
Para saber se uma pessoa no menor de idade basta escrever: if(!(idade>=18)) ... Observe
que se a condio (idade>=18) verdadeira a sua negao (!(idade>=18)) falsa. A comparao
!(idade>=18) corresponde em portugus expresso idade no maior ou igual a 18.
305
Uso de = em teste de igualdade. Para testar se uma pessoa tem exatamente 18 anos,
devemos escrever if(idade == 18)
Uso de ponto-e-vrgula no fim da linha que contm um if. Lembrar que if um teste de
condio. Coloca-se ponto-e-vrgula no fim de uma instruo e no de um teste de
condio.
Um valor boolean
Importante! A varivel b do cdigo acima representa um valor boolean. Diz-se que uma varivel
que s pode receber os valores 0 ou 1 do tipo boolean. Na verdade, em C no existe este tipo.
H uma conveno na linguagem C de modo que 0 associado ao boolean False e qualquer
outro valor associado ao boolean True. Em C++, a linguagem C orientada a objeto, um novo tipo
foi criado especialmente para conter esses valores. Em C, geralmente as variveis que guardaro
valores boolean so declaradas do tipo int.
Os valores Booleans nas condies
Geralmente fazemos testes sobre variveis booleans. Se a varivel "maior" vale 1 ou qualquer
outro valor diferente de 0 e temos a instruo if(maior) {printf(maior de idade)}; ... o resultado
exibido a expresso maior de idade, pois a varivel "maior" diferente de zero, portanto True.
Quando sabido que a varivel pode conter um nmero fazemos o teste na forma if(varivel ==
1). Se a varivel s pode conter os valores 0 ou 1, fazemos o teste na forma if(varivel). Sempre
que possvel, bom encurtar os caminhos.
306
if (idade == 2)
{ printf("Ola bebe!");}
else if (idade == 6)
{ printf("Oi crianca!");}
else if (idade == 12)
{ printf ("Oi jovem!");}
else if (idade == 16)
{ printf ("Oi adolescente!");}
else if (idade == 18)
{ printf ("Salve adulto!");}
else if (idade == 68)
{ printf ("Ola vovo !");}
else
{ printf ("????????????? ");}
Existem seis comparaes a serem feitas. Para no repetir essas comparaes, nova forma de
represent-las foi desenvolvida. O trecho de programa abaixo mostra essa nova forma.
switch (idade)
{
case 2: printf ("Ola bebe!");
break;
case 6: printf ("Oi crianca!");
break;
case 12: printf ("Oi jovem!");
break;
case 16: printf ("Oi adolescente!");
break;
case 18: printf ("Salve adulto!");
break;
case 68: printf ("Ola vovo!");
break;
default: printf ("?????????????");
break;
}
Sempre que possvel, bom escrever utilizando o comando switch, mais prtico. necessrio
colocar uma instruo break, obrigatoriamente ao fim de cada caso. Esquecer de faz-lo faz com
que o computador continue a executar as instrues seguintes, o que no faz parte da lgica da
instruo switch.
Enfim, o caso "default" corresponde ao else j visto. Se a varivel no vale nenhum dos valores
testados acima o computador executa esta opo.
307
Exemplo de um menu
O programa abaixo pode ser utilizado como modelo para a construo de outros menus.
// em um restaurante
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
long menu;
308
3.6 Teste
1. O que significa o smbolo <= ?
( ) Superior ( ) Inferior ( ) Superior ou igual ( ) Inferior ou igual ( ) Diferente de
2. Se a varivel n vale 0, o que exibido pelo trecho de programa abaixo?
if (n != 0)
printf ("Siga em frente.");
else
printf ("Aguarde um pouco.");
( ) Siga em frente.
( ) Aguarde um pouco
309
5. Quanto valer a varivel resp aps as instrues abaixo? A varivel a vale 200 e b um
Boolean que vale False.
resp = (b || a >= 200) ? 20 : 30;
resp = (resp == 20 && (b && a >= 200)) ? 40 : 50;
( ) 20
( ) 30
( ) 40
( ) 50
5. Referncias
1. Ascencio, Ana F G., Campos, Edilene A V., Fundamentos da Programao de
Computadores: Algoritmos, Pascal, C/C++ e Java, 2 edio, Pearson Education, 2007.
2. Hutchison, Robert C., Just, Steven B., Programming using the C language. MGraw-Hill
Book Company, 1988.
3. Kernighan, Brian W., Ritche, Dennis M., Le langage C, Masson, 1986.
310
instrues
instrues
..................
instrues
A existncia da condio nos laos necessria para impedir que as instrues fiquem sendo
executadas indefinidamente. Ento, ao criarmos um lao, criamos tambm, implicitamente, uma
condio. A condio significa: repetir este lao enquanto (at que) a condio seja
verdadeira .
2. Problematizando a temtica
Suponhamos que necessitemos imprimir todos os nmeros naturais de 1 at 100. Uma maneira
de faz-lo chamarmos 100 vezes a funo printf tendo como argumento em cada chamada o
nmero natural desejado. uma soluo, mas com certeza a menos indicada. Imagine se
tivssemos de imprimir os 1000 primeiros nmeros naturais. As repeties nos oferecem um
modo confortvel de realizarmos esta tarefa, como veremos.
3. Conhecendo a temtica
3.1 O lao while
A estrutura de um lao while
while ( <condio> )
{
}
Bloco de instrues
311
#include<stdio.h>
main()
{
int n=0;
while (n>=0)
{
printf("Digitar um numero positivo ou nulo: ");
scanf("%d", &n);
}
printf("Obrigado! \n") ;
system(" pause ") ;
return 0 ;
}
O programa continuar executando as instrues do lao enquanto o valor digitado for positivo ou
nulo e sair do mesmo to logo seja digitado um nmero negativo.
Graficamente, a semntica da instruo while pode ser representada assim:
condio
prxima
instruo
false
true
Bloco de
instrues
Semntica While
Vamos fazer algo mais interessante, executar um lao certo nmero de vezes. Para isso deve-se
criar uma varivel que "contar" o nmero de vezes que o lao ser executado. Essa varivel
dever valer 0 antes do lao e ser incrementada dentro deste cada vez que o mesmo for
executado. A operao "incremento" como sabemos, consiste em aumentar de 1 o valor de uma
varivel. Por exemplo, x++ incrementa o valor da varivel x de uma unidade.
312
cont = o
cont = 1
cont = 2
cont = 3
cont = 4
cont = 5
cont = 6
cont = 7
cont = 8
cont = 9
....................
long cont = 0;
while (cont < 10)
{
printf("cont = %d\n ",cont);
cont++;
}
.....................
Procure explicar como isto aconteceu. Ao compreendermos o que se passou poderemos nos
divertir aumentado o valor do limite 10 para 100, 1000, etc.
Evitemos a todo custo cairmos em um lao infinito, a menos que este seja o nosso propsito. s
vezes esses laos so necessrios. Na programao de jogos, por exemplo.
3.2 O lao do ... while
Este tipo de lao bastante similar ao lao while, porm menos utilizado. A diferena entre as
duas instrues est na colocao fsica da condio dentro dos laos. Neste tipo de lao a
condio aparece aps o bloco enquanto que em while a condio colocada antes do bloco. Isto
quer dizer que as instrues internas ao lao do ... while so executadas pelo menos uma vez.
Graficamente, a semntica da instruo do ... while pode ser representada assim:
Bloco de
instrues
true
condio
false
prxima
instruo
313
.....................
long cont = 0;
do
{
printf("cont = %d\n",cont);
cont++;
} while (cont<10);
.....................
.............................
long cont;
for (cont = 0; cont < 10; cont++)
{
printf("cont = %d\n",cont);
}
...............................
A varivel cont no foi inicializada a zero quando de sua declarao, mas poderia ter sido.
Vejamos o que h entre os parnteses pois l que se encontra todo o interesse do lao for. Na
verdade, existem trs instrues, separadas por vrgulas, dentro desses parnteses:
A inicializao: esta instruo utilizada para preparar a varivel cont. Em nosso caso,
ela foi inicializada com zero.
314
A condio: como para o lao while, a condio que diz se o bloco deve ser repetido.
Enquanto a condio for verdadeira o bloco executado.
O incremento: esta ltima instruo executada ao fim de cada execuo do bloco para
atualizar a varivel de controle. s vezes utilizado um decremento no lugar de um
incremento. s vezes tambm, se utiliza outras operaes como cont += 2; para avanar
de 2 em 2, por exemplo.
( ) repeat
( ) do.. while
( ) while
( ) 1 vez
( ) 2 vezes
( ) 12 vezes ( ) 13 vezes
( ) 1 vez
(
(
(
(
Linha n1
Linha n3
Linha n5
Linha n7
) for (cont = 1; cont < 9 ; cont += 2)
) for (cont = 1; cont <= 7 ; cont ++)
) for (cont = 0; cont < 9 ; cont += 2)
) for (cont = 1; cont < 8 ; cont ++)
#include<stdio.h>
int main()
{
int cont = 0;
for(cont=1; cont<=100; cont++)
printf("Eu devo entregar minhas tarefas em dia.");
}
315
5. Referncias
1. Ascencio, Ana F G., Campos, Edilene A V., Fundamentos da Programao de
Computadores: Algoritmos, Pascal, C/C++ e Java, 2 edio, Pearson Education, 2007.
2. Hutchison, Robert C., Just, Steven B., Programming using the C language. MGraw-Hill
Book Company, 1988.
3. Kernighan, Brian W., Ritche, Dennis M., Le langage C, Masson, 1986.
316
funo
system(" pause" );
return 0;
}
As diretivas de pr-processador comeam sempre por # e so geralmente colocadas no incio do
arquivo fonte. Em seguida aparece a funo main, a funo principal de todo programa. Nas
unidades anteriores permanecemos sempre dentro desta funo, ou seja, todos os clculos e
outros processamentos foram feitos no interior da funo main. Na prtica, quase nenhum
programa escrito unicamente dentro da funo main. Vamos ento aprender a dividir a soluo
de um problema em vrias partes, cada uma dessas partes ser uma funo.
2. Problematizando a temtica
Um programa que realiza vrias tarefas pode ser escrito como uma nica funo, a funo
principal, main. Entretanto, essa estratgia torna o programa difcil de ser lido e mesmo
desenvolvido. Por isso, costume dos analistas subdividirem um problema complexo em
subproblemas, menos complexos obviamente, e resolver cada um desses por meio de uma
funo. Esse mtodo conhecido como dividir para conquistar. Aprenderemos a programar
essas unidades de programa agora.
3. Conhecendo a temtica
3.1 Objetivo de uma funo
Uma funo executa aes e retorna um resultado. As aes realizadas por uma funo
dependem, geralmente, de alguns parmetros iniciais denominados de entrada e o resultado
produzido denominado sada.
Esquematicamente, podemos representar uma funo assim:
entrada
sada
Processamento
Funo
317
Uma funo ento um elemento lgico de programao que comporta trs etapas:
1. Entrada: informaes necessrias ao processamento so passadas funo.
2. Processamento: operaes realizadas, geralmente a partir das entradas.
3. Sada: terminado o processamento, a funo retorna um resultado.
Imaginemos uma funo que calcule a soma de dois valores inteiros. Podemos represent-la
esquematicamente como abaixo, onde a e b so valores inteiros.
a
a
Somar a e b
a+b
Em geral as funes so mais complexas que o exemplo acima, mas esses so os conceitos a
conservar: entrada de parmetros, processamento a ser realizado e sada do resultado produzido.
3.2 A estrutura de uma funo
A estrutura de uma funo bem simples. Vejamos um modelo.
tipo nomedaFuno(parmetros)
Algumas consideraes:
318
Uma funo pode ser definida tambm aps a funo principal. Neste caso, o seu prottipo deve
ser declarado antes da funo main. Aps a funo main coloca-se ento a funo que est
sendo definida.
Usar ou no os prottipos uma deciso do programador. O seu uso indica ao compilador que a
funo por ele representada ser definida (codificada) aps a funo main. Caso uma funo seja
codificada aps a funo main, sem o uso de prottipo, o compilador acusar um erro, pois
quando o nome da funo aparecer, pela primeira vez, na funo main, ele no o reconhecer
como nome de uma funo e o tratar como uma varivel no declarada acusando, portanto erro
por falta de declarao de varivel.
319
#include <stdio.h>
long soma2(long p1, long p2)
{
return p1+p2;
}
Neste caso, no foi necessrio declararmos a varivel
resposta uma vez que no a utilizamos.
Observe que acima a funo soma2 est sendo chamada a partir da lista de parmetros da
instruo printf.
C
F 32
=
.
100
180
Ento, de posse dessa informao vamos escrever uma funo que transforme uma temperatura
dada em Celsius para Fahrenheit. Escreveremos apenas a funo. Escreva o programa principal
(a funo main).
/* funo converso: Celsius em Fahrenheit */
float converte(long C)
{
long F = 0;
F = 180*C/100+32;
return F;
}
1.
2.
3.
4.
320
Pronto! Agora s escrever a funo main. Uma dica: a chamada funo tempo pode ser assim
tempo(n);.
III. rea de um retngulo
A rea de um retngulo dada por: largura * altura.
Nossa funo AreaRetangulo deve receber dois parmetros, largura e altura e retornar a rea
calculada.
/* funo AreaRetangulo */
IV. Um menu
Acompanhe o exemplo abaixo. Trata-se da elaborao de um menu, onde podemos escolher qual
operao ser executada: o clculo da rea de um crculo, de um quadrado, de um retngulo ou
de um trapzio. Este roteiro poder ser utilizado para a elaborao de outros menus. Basta fazer
as adaptaes que se fizerem necessrias.
321
/* funo menu */
long menu()
{
int escolha= 0;
while (escolha < 1 || escolha> 4)
{
printf("Menu :\n");
printf("1 : Para calcular a area de um circulo\n");
printf("2 : Para calcular a area de um quadrado\n");
printf("3 : Para calcular a area de um retangulo\n");
printf("4 : Para calcular a area de um trapezio\n");
printf("Sua escolha ? ");
scanf("%d", &escolha);
}
return escolha;
}
322
Texto da
funo menu
Texto da
funo main
3.6 Teste
1. O que acontece aps um return?
323
5. Referncias
1. Ascencio, Ana F G., Campos, Edilene A V., Fundamentos da Programao de
Computadores: Algoritmos, Pascal, C/C++ e Java, 2 edio, Pearson Education, 2007.
2. Hutchison, Robert C., Just, Steven B., Programming using the C language. MGraw-Hill
Book Company, 1988.
3. Kernighan, Brian W., Ritche, Dennis M., Le langage C, Masson, 1986.
324
Unidade IX - Ponteiros
1. Situando a temtica
Nesta unidade estudaremos um novo tipo de dado, os ponteiros. Veremos como eles funcionam e
para que servem. quase impossvel hoje em dia escrever programas em C sem fazer uso dos
ponteiros. Mesmo sem saber ns j o utilizamos quando realizamos leituras com a funo scanf. A
noo de ponteiros importante para lidarmos com outro tipo de dado muito utilizado denominado
array. Mesmo que o escopo deste texto no cubra outros tipos de dados abstratos de grande
utilizao na computao, importante saber, principalmente para aqueles que pretendem
avanar mais no estudo de resoluo de problemas com o uso de computador, que vrios desses
tipos de dados so implementados base de ponteiros. A ttulo de ilustrao sobre esses tipos
citamos: rvores e listas encadeadas.
2. Problematizando a temtica
Um problema estranho
Escrever uma funo que retorne 2 ou mais valores.
Isso parece ser "Impossvel"!
Sabemos que uma funo tem as seguintes caractersticas:
Retorna um nico valor ou no retorna valor algum
Se uma funo do tipo T ento ela retorna um valor do tipo T
Vamos adquirir os conhecimentos necessrios para solucionar problemas deste tipo.
3. Conhecendo a temtica
3.1 Um pouco mais sobre funes
Retomemos o problema de transformar segundos em horas, minutos e segundos, apresentado na
unidade IX.
/* funo tempo: segundos em horas, minutos e segundos */
void tempo(int s)
{
int ss, mm, hh, t;
ss = s%60; // resto da diviso de s por 60
t = s/60;
// quociente inteiro de s por 60
mm = t%60; // resto da diviso de t por 60
hh = t/60;
// quociente inteiro de t por 60
printf(%d segundos = %d horas, %d minutos e %d segundos, s,hh,mm,ss);
}
Observamos que a funo do tipo void, isto , no retorna valor algum. De fato, o resultado
calculado impresso na prpria funo. Por que no foi possvel retornar esses valores para a
funo main?
Quando passamos uma varivel para uma funo, como argumento, uma cpia dessa varivel
feita e passada para a funo. Assim, se na funo main existir uma varivel de nome s, que
represente o nmero de segundos a ser transformado, a varivel s na funo tempo no a
mesma que aquela de main. Trata-se apenas de uma cpia. Tudo se passa da mesma forma caso
as variveis correspondentes tenham nomes distintos.
325
cpia
de c
cpia
de b
cpia
de a
Observemos que na funo main, ao ser executada a instruo x = f(a,b,c); so criadas cpias
dos parmetros reais (as variveis a, b e c) e essas cpias so passadas para a funo f. Na
funo f, as cpias transmitidas recebem os nomes x, y e z, respectivamente, parmetros formais.
Assim, se alguma alterao ocorrer nos valores de x, y ou z essa alterao no afetar os valores
de a, b ou c, pois isso ocorreu apenas na cpia dessas variveis ficando os seus originais
intactos.
A soluo do problema proposto, como veremos, apenas um exemplo da utilidade dos
ponteiros.
A memria e os endereos
Endereo
Valor
145
3.8028322
0.8272555
39014768
Endereo e valor
Ao criarmos uma varivel soma do tipo long, por exemplo,
...
...
escrevemos:
long soma = 300; e o programa solicita ao sistema operacional
n-1
940.5118
permisso para utilizar a memria. Como resposta o sistema
operacional indica em qual endereo o programa pode
armazenar um valor de tipo long para a varivel soma. Alis, este um dos papis principais de
um sistema operacional, gerenciar a alocao de memria para os programas.
Voltemos nossa instruo. O valor 300 armazenado em alguma parte da memria, digamos no
endereo 1540. A partir de ento, a palavra soma no programa substituda, via compilador,
pelo endereo 1540. A cada ocorrncia da palavra soma no programa, o computador verifica
ento o endereo 1540. Para o programador tudo bastante transparente. Basta escrever soma
em uma expresso aritmtica, em uma instruo de leitura (scanf) ou impresso (printf). Vejamos,
printf("A variavel soma vale: %d", soma);
Resultado na tela:
Sabemos exibir o valor de uma varivel, mas poderamos exibir o seu endereo? Para exibir o
endereo de uma varivel deve-se utilizar o especificador de formato %p (p da palavra ponteiro)
na instruo printf. De outro modo, enviamos funo printf no a varivel soma, mas seu
endereo. E para fazer isso devemos colocar o smbolo & antes do nome da varivel. J fazemos
326
isto habitualmente quando utilizamos a funo scanf. Ento para imprimir o endereo da varivel
soma devemos escrever
printf("O endereo da variavel soma eh: %p", &soma);
Resultado na tela:
O que aparece na tela um nmero sim. Um nmero hexadecimal, no lugar dos nmeros
decimais aos quais estamos acostumados. Esse o endereo da varivel soma na memria do
computador, designado pelo sistema operacional como explicado acima.
Se trocarmos %p por %d na instruo printf acima obtemos um nmero decimal como sada.
Entretanto, %p foi implementado especialmente para exibir endereos, por isso preferimos esta
notao.
Ateno! Ao executarmos um programa em computadores diferentes, o endereo de uma
varivel ser certamente diferente de um computador para outro. Isso depende dos programas
que esto carregados na memria dos computadores. No esqueamos que o sistema
operacional que se encarrega de gerenciar a memria. , portanto impossvel saber a priori em
que endereo uma varivel ser alocada.
Em resumo,
soma: exibe o VALOR da varivel.
&soma: exibe o ENDEREO da varivel.
Com soma o computador l o valor da varivel na memria e reenvia esse valor. Com &soma,
o computador nos dir em que endereo se encontra a varivel.
3.2 Utilizao de ponteiros
At este ponto utilizamos variveis apenas para conter nmeros. A partir de agora vamos
aprender a criar variveis que contero endereos: exatamente a isto que chamamos de
ponteiros. Ponteiro uma varivel que contm um endereo.
Poderamos nos perguntar, mas os endereos no so nmeros tambm? Sim, mas neste caso
esses nmeros tm um significado particular: eles representam o endereo de outra varivel na
memria.
I. Criar um ponteiro
Para criar uma varivel de tipo ponteiro, devemos colocar o smbolo * no incio do nome da
varivel.
Exemplo.
Podemos tambm escrever:
long *nomeDoPonteiro;
long *p1, *p2, *p3;
long* p1, p2, p3;
Como temos visto ao longo deste curso, muito importante iniciarmos as variveis quando de
suas declaraes. ainda mais importante faz-lo com os ponteiros. Para iniciar um ponteiro
devemos escrever:
A constante NULL indica que o ponteiro p1 no contm nenhum endereo.
Essa instruo reservar um espao na memria do computador como se
estivssemos criando uma varivel normal. A diferena entre uma varivel
ponteiro e as outras variveis j vistas que o contedo desta ser o endereo de outra varivel.
Exemplo. A primeira linha significa: "Criar uma varivel de
tipo long com valor 300". A segunda linha significa: "Criar
long soma = 300;
uma varivel de tipo ponteiro cujo valor o endereo da
long *pointSoma = &soma;
varivel soma".
long *p1 = NULL;
327
Observao. No existe um tipo ponteiro como existem os tipos int, long, etc. Ento, no
podemos escrever, por exemplo, ponteiro pointSoma; em seu lugar escrevemos long
*pointSoma; como visto acima. Isto quer dizer que a varivel pointSoma um apontador para uma
varivel de tipo long. Se a varivel soma fosse de tipo int, ento pointSoma deveria ser um
apontador para uma varivel de tipo int e escreveramos assim: int *pointSoma;
Representao grfica.
soma
pointSoma
Endereo
Valor
145
3.8028322
135
300
39014768
15648
135
n-1
940.5118
x
......................
int x=100, *p=NULL;
p=&x;
35846
100
p
16315
328
35846
p uma varivel que aponta para uma varivel de tipo int, seu valor um endereo [valor
de p = 35846]
329
330
/* programa novotempo */
#include<stdio.h>
void novotempo(long* pontHoras, long* pontMinutos, long* pontSegundos);
int main(int argc, char *argv[])
{
long horas = 0, minutos = 0, segundos=0, segtemp=0;
// Entrar com o nmero de segundos
printf("Digite o numero de segundos a transformar: ");
scanf(("%", &segundos);
segtemp=segundos
novotempo(&horas, &minutos, &segundos);
variveis: com elas que temos trabalhado at aqui. Criar uma varivel muito simples:
basta indicar seu nome e seu tipo.
long minhaVariavel = 0; // varivel criada na memria (valor 0)
Se escrevemos &minhaVariavel, obtemos o endereo da varivel na memria
331
ponteiros: so variveis um pouco particulares, pois elas tomam por valor o endereo de
outras variveis. Para criar um ponteiro vazio (que no contm endereo de nenhuma
varivel) escrevemos assim:
long *meuPonteiro = NULL;
Um ponteiro torna-se til quando lhe atribumos por valor o endereo de uma varivel.
long *meuPonteiro = &minhaVariavel;
O resultado exatamente o mesmo salvo que no primeiro caso passamos por um ponteiro para
acessar a varivel.
3.5 Teste
1. Qual dos tipos abaixo corresponde a um ponteiro?
( ) int
( ) double*
( ) long
2. Se digitamos &bola, o que obtemos?
( ) O endereo de bola
( ) O valor de bola
( ) O valor da varivel apontada por bola
3. Se digitamos *total, o que obtemos?
( ) O endereo de total
( ) O valor de total
( ) O valor da varivel apontada por total
4. Por qual valor devemos inicializar um ponteiro?
( ) NOTHING
( ) NULL
( ) MAIN
( ) ADDRESS
5. Examine o cdigo seguinte:
long num = 25;
long *ponteiro = #
Supor que num se encontre no endereo 1400 da memria do computador e ponteiro se encontre
no endereo 3800. Se na seqncia do programa for solicitada a impresso de *ponteiro, que
valor ser exibido na tela?
(
(
(
(
(
) 3800
) 25
) 1400
)0
) impresso impossvel
332
5. Referncias
1. Ascencio, Ana F G., Campos, Edilene A V., Fundamentos da Programao de
Computadores: Algoritmos, Pascal, C/C++ e Java, 2 edio, Pearson Education, 2007.
2. Hutchison, Robert C., Just, Steven B., Programming using the C language. MGraw-Hill
Book Company, 1988.
3. Kernighan, Brian W., Ritche, Dennis M., Le langage C, Masson, 1986.
333
Unidade X - Arrays
1. Situando a temtica
Nesta unidade aprenderemos a criar variveis do tipo array. Os arrays so muito utilizados
em C, pois eles so muito prticos. Comearemos explicando o funcionamento dos arrays na
memria de um computador. A compreenso desse funcionamento conduz o programador a
construir programas mais confiveis. Afinal de contas sempre bom compreender o porqu das
coisas.
2. Problematizando a temtica
Ao trabalharmos com um conjunto de valores, podemos faz-lo de modo a utilizar cada valor uma
nica vez. Se for este o caso, medida que esses valores forem sendo lidos o processamento
necessrio executado e ficaremos satisfeitos. O que ocorre na prtica porm diferente.
Imaginemos que se deseje calcular a distncia entre cada elemento de um conjunto e a mdia
aritmtica desses valores. Obviamente, precisaremos de cada valor para calcular a mdia. Em
seguida, precisaremos outra vez de cada valor para calcular as diferenas. E onde esto esses
valores agora? Se o conjunto possuir 100 elementos, por exemplo, podemos dar um nome a cada
elemento, mas isso seria um trabalho enorme. Os arrays permitem resolver este tipo de problema
sem maiores preocupaes.
3. Conhecendo a temtica
3.1 Os arrays e a memria
Arrays so seqncias de variveis de mesmo tipo, situadas em posies contguas na memria.
Concretamente, trata-se de vrias variveis de mesmo tipo, portando o mesmo nome e
diferenciadas apenas por um ou mais ndices. O nmero de ndices de uma varivel determina a
dimenso do array a que ela pertence. Assim, se para identificar uma determinada varivel
precisamos utilizar dois ndices, ento essa varivel pertence a um array de duas dimenses.
Geralmente chamamos de elementos as variveis de um array.
Exemplo. Seja um array de 4 elementos alocado na posio (endereo) 1800. Dizer que um array
est armazenado no endereo 1800 apenas uma forma de nos expressarmos. Na verdade, o
array comea nessa posio. Vejamos o esquema abaixo.
Endereo
Valor
...
2293600
52
2293601
10
2293602
-65
2293603
94
...
334
long x[4];
/* Programa array1
#include<stdio.h>
int main()
{
long x[4];
x[0]=52;
x[1]=10;
x[0]=-65;
x[0]=94;
printf("%d", x);
getch();
return 0;
}
*/
Ateno! Como o nome de um array um ponteiro, podemos utilizar o smbolo * para conhecer o
valor do primeiro elemento de um array. Assim, printf("%d", *x); e printf("%d", x[0]); so
equivalentes. Experimente.
335
Tambm possvel obter o valor do segundo elemento escrevendo *(x+1) (endereo do array +1).
Para os demais elementos o raciocnio o mesmo, *(x+2) referencia o valor do terceiro elemento
e assim por diante.
3.6 Listando um array
Para listar todos os elementos de um array devemos fazer uso de um comando de repetio.
Seria muito incmodo escrever um printf para cada elemento. Imagine s se o array possusse
800 elementos! Vejamos um exemplo com uso do comando for.
/* programa array2 */
#include<stdio.h>
int main(int argc, char *argv[])
{
long x[4], i = 0;
x[0] = 15;
x[1] = -45;
x[2] = 218;
x[3] = 14;
for (i = 0 ; i < 4 ; i++)
{
printf("%d\n", x[i]);
}
getch();
return 0;
}
Ateno! No tente exibir o valor de x[4]. Um array com 4 elementos possui ndices 0, 1, 2 e 3. Se
tentarmos exibir x[4] ocorrer um erro de execuo e o sistema operacional encerrar o programa
avisando que o este tentou acessar um endereo que no lhe pertence.
3.7 Inicializando um array
Agora que sabemos percorrer um array somos
capazes de inicializar todos os seus elementos
com zero, por exemplo, com o uso de um lao.
Tente faz-lo antes de ver o programa ao lado.
A sada deve ser algo como:
x=0000000000
Outro modo de inicializar um array
Podemos tambm inicializar um array de modo
mais automtico. Essa tcnica consiste em
escrever x[4]={valor1, valor2, valor3, valor4}
quando da declarao do array. De modo geral,
basta escrever os valores entre chaves e
separados por vrgula.
336
Observemos que:
1. vetor em main um ponteiro
2. v em imprimir um ponteiro
A funo imprimir toma como parmetro um ponteiro para o tipo long e o tamanho de um array
para saber at onde esto os seus elementos.
Importante: existe outro modo de indicar que uma funo recebe array. Em vez de indicar que a
funo espera um long *v, podemos escrever assim:
void imprimir(long v[], long comp)
Este comando equivalente ao usado no cdigo apresentado acima, mas a presena dos
colchetes lembra ao programador que a funo est aguardando um array. Isto permite evitar
confuses. Esta forma bastante utilizada.
Exerccios
importante escrever vrias funes que trabalhem sobre arrays para que nos tornemos
prticos sobre este assunto.
1. Criar uma funo de nome somaVetor que retorne a soma de todos os elementos de um array.
Utilize um return para retornar o valor calculado. Como incentivo aqui est o prottipo da
funo somaVetor.
long somaVetor(long vetor[ ], long comp);
2. Criar uma funo mediaVetor que calcule e retorne a mdia aritmtica dos elementos do
vetor. (Ateno. O valor de uma mdia sempre um nmero decimal).
3. Criar uma funo copiarVetor que tenha como argumentos 2 arrays. O contedo do primeiro
array dever ser copado para o segundo. Prottipo:
void copiarVetor(long v1[ ], long v2[ ], long comp);
4. Criar uma funo maxVetor1 que dever atribuir o valor 0 a cada elemento do array que lhe
passado como parmetro, desde que esse elemento tenha um valor que seja superior a um
valor mximo tambm recebido por parmetro. Prottipo:
void maxVetor1(long v[ ], long comp, long max);
337
5. Criar uma funo ordenaVetor que classifique os elementos de um array em ordem crescente.
Se um array inicialmente possui os elementos {21, 30, 17, 8}, nesta ordem, ao fim da operao
ele dever se apresentar como {8, 17, 21, 30}.
3.9 Arrays de duas ou mais dimenses
Para utilizarmos arrays de duas ou mais dimenses precisamos declar-los como fazemos para
qualquer outra varivel. A declarao de um array de duas dimenses semelhante declarao
de arrays com uma nica dimenso. Devemos indicar explicitamente quantos elementos existem
em cada dimenso. Vejamos como declarar um array de inteiros de nome X, com 10 elementos
em uma dimenso e 8 elementos em outra:
int X[10][8] ;. Simples no?
Os arrays de uma e duas dimenses recebem nomes especiais. Os arrays de uma dimenso so
chamados de vetor e os de duas dimenses recebem o nome de matriz.
Exemplo de programao usando matriz.
Vamos escrever um programa para preencher uma matriz de nome Nota, que represente as notas
de 10 alunos de uma turma em 3 disciplinas. Trata-se de distribuir essas notas em uma estrutura
de duas dimenses. Acompanhe o nosso raciocnio. Consideraremos uma matriz de 3 linhas,
cada linha representando uma disciplina, e 10 colunas, uma para cada nota de um aluno. Nossa
estrutura tem a seguinte aparncia.
notas
disciplinas
Como imaginamos, a matriz deve ser declarada como int Nota[3][10].
Atribuindo valor aos elementos de um array
A atribuio de valores aos elementos de uma matriz se d do mesmo modo que para as outras
variveis j vistas, ou seja, podemos faz-lo por atribuio direta ou por leitura via teclado (como
uso da funo scanf). No podemos esquecer que as matrizes possuem dois ndices. Assim,
podemos escrever Nota[0,3]=8,5; para indicarmos que o aluno 3 obteve 8,5 como nota na
disciplina 1. As disciplinas sero representadas por 0, 1, 2 (linha 0, linha 1, linha2). No se
desespere. Lembre-se que os ndices dos arrays comeam em 0(zero). Por isso, a primeira linha
tem ndice 0, a segunda ndice 1, e assim por diante. O mesmo ocorre com relao s colunas.
Ento o elemento da terceira linha e sexta coluna representado por Nota[2,5]. A atribuio de
valores via teclado se d como auxlio de um comando de
#include<stdio.h>
repetio. Lembremos do que j foi dito antes: cada
int main(){
conceito estudado importante e deve ser acumulado, para
int i,j;
uso futuro, medida que os programas vo ficando mais
int X[3][4];
complexos. Vejamos um modelo para a leitura de dados via
for (i=0; i<3; i++)
teclado e atribuio aos elementos de uma matriz.
{
printf("Leitura da linha %d\n", i);
for (j=0; j<4; j++)
{
printf("elemento %d ", j);
scanf("\n%f", X[i,j]) ;
}
}
getch();
return 0;
}
338
Observe bem, aps a leitura de um nmero, no h mudana de linha, a menos que esse nmero
seja o ltimo da sua linha.
Na plataforma Moodle, o aluno encontrar vrios outros exemplos com matrizes assim como
muitos exerccios.
3.10 Teste
1. Qual das linhas abaixo cria um array de double com 10 elementos?
( ) double* vetor[10];
( ) double vetor{10};
( ) double vetor[10];
( ) double vetor[9];
2. Qual o valor do primeiro ndice de um array?
( )0
( )1
( ) -1
3. Qual dos prottipos abaixo no permite a passagem do array vetor como parmetro?
( ) void f(long vetor[], long comp);
( ) void f(long vetor, long comp);
( ) void f(long *vetor, long comp);
4. Qual o outro modo de inicializar o array vetor com estes valores?
long vetor[4];
vetor[0] = 10;
vetor[1] = 23;
vetor[2] = 505;
vetor[3] = 8;
( ) long vetor[4] = 10, 23, 505, 8;
( ) long vetor[4] = [10, 23, 505, 8];
( ) long vetor[4] = (10, 23, 505, 8);
( ) long vetor[4] = {10, 23, 505, 8};
Para no esquecer.
339
4. Referncias
1. Ascencio, Ana F G., Campos, Edilene A V., Fundamentos da Programao de
Computadores: Algoritmos, Pascal, C/C++ e Java, 2 edio, Pearson Education, 2007.
2. Hutchison, Robert C., Just, Steven B., Programming using the C language. MGraw-Hill
Book Company, 1988.
3. Kernighan, Brian W., Ritche, Dennis M., Le langage C, Masson, 1986.
340