Prévia do material em texto
www.cliqueapostilas.com.br
Fundação Universidade do Tocantins (UNITINS)
F981p Análise e Desenvolvimento de Sistemas / Fundação Universidade do
Tocantins; EADCON. Palmas: Editora Educon, 2008.
320 p.: il.
Nota: Caderno de Conteúdo e Atividades 1º período de Análise
e Desenvolvimento de Sistemas (apostila)
1. Analista de Sistemas – Formação. I. EADCON. II. Título.
CDD 378
22. ed.
Ficha Catalográfica elaborada pela UNITINS. Bibliotecária – Rozangela Martins da Silva CRB2/1019
Direitos desta edição reservados à UNITINS.
É proibida a reprodução total ou parcial desta obra sem autorização expressa da UNITINS.
FUNDAÇÃO UNIVERSIDADE DO TOCANTINS
Reitor
Humberto Luiz Falcão Coelho
Vice-Reitor
Lívio William Reis de Carvalho
Pró-Reitor de Graduação
Galileu Marcos Guarenghi
Pró-Reitor de Pós-Graduação e Extensão
Claudemir Andreaci
Pró-Reitora de Pesquisa
Antônia Custódia Pedreira
Pró-Reitora de Administração e Finanças
Maria Valdênia Rodrigues Noleto
Diretor de EaD e Tecnologias Educacionais
Marcelo Liberato
Coordenador Pedagógico
Geraldo da Silva Gomes
Coordenador do Curso
Igor Yepes
www.cliqueapostilas.com.br
Computação Básica ........................................................................................5
Aula 1 – História da computação ............................................................................ 11
Aula 2 – Componentes básicos do computador ......................................................... 27
Aula 3 – Sistemas posicionais de numeração ............................................................ 37
Aula 4 – Operações aritméticas no sistema binário de numeração .............................. 53
Aula 5 – Classificação de software .......................................................................... 63
Aula 6 – Noções básicas de redes de computadores e banco de dados ...................... 71
Aula 7 – Profissões na área de Informática ............................................................... 79
Algorítmos e Programação...........................................................................93
Aula 1 – Introdução à programação em Linguagem C ............................................... 99
Aula 2 – Operadores ........................................................................................... 115
Aula 3 – Estruturas de controle .............................................................................. 125
Aula 4 – Modularização em C: uso de Funções ...................................................... 137
Aula 5 – Estruturas de dados homogêneas (vetores e matrizes) e
heterogêneas (estruturas) ......................................................................... 147
Aula 6 – Ponteiros e alocação dinâmica ................................................................. 157
Aula 7 – Arquivos ................................................................................................ 163
Lógica de Programação ..............................................................................175
Aula 1 – Fundamentos da Lógica para Programação ............................................... 181
Aula 2 – Formas de representação de um algoritmo ................................................ 193
Aula 3 – Tipos de dados: variáveis e constantes ...................................................... 211
Aula 4 – Operadores e expressões ........................................................................ 223
Sumário
www.cliqueapostilas.com.br
Aula 5 – Arquivos ................................................................................................ 233
Aula 6 – Estruturas de controle .............................................................................. 243
Aula 7 – Modularização....................................................................................... 257
Matemática para Computação ...................................................................265
Aula 1 – Teoria dos Conjuntos ............................................................................... 271
Aula 2 – Análise e Simbolização de Proposições .................................................... 283
Aula 3 – Tabela-verdade ....................................................................................... 291
Aula 4 – Relações de Implicação e Equivalência ..................................................... 297
Aula 5 – Predicados e introdução à Álgebra de Boole ............................................. 305
Aula 6 – Funções Booleanas ................................................................................. 313
Aula 7 – Simplificações de Funções e Mapas de Karnaugh ...................................... 317
www.cliqueapostilas.com.br
www.cliqueapostilas.com.br
Cr
éd
it
os
EQUIPE UNITINS
Organização de Conteúdos Acadêmicos
Alexandre T. Rossini
Alex Coelho
Evanderson S. de Almeida
Marcelo Ribeiro de Oliveira
Vinícius de Miranda Rios
Coordenação Editorial
Maria Lourdes F. G. Aires
Assessoria Editorial
Darlene Teixeira Castro
Assessoria Produção Gráfica
Katia Gomes da Silva
Revisão Didático-Pedagógica
Sibele Letícia Rodrigues de Oliveira Biazotto
Revisão Lingüístico-Textual
Sibele Letícia Rodrigues de Oliveira Biazotto
Revisão Digital
Sibele Letícia Rodrigues de Oliveira Biazotto
Projeto Gráfico
Douglas Donizeti Soares
Irenides Teixeira
Katia Gomes da Silva
Ilustração
Geuvar S. de Oliveira
Capa
Igor Flávio Souza
EQUIPE FAEL
Coordenação Editorial
Leociléa Aparecida Vieira
Assessoria Editorial
William Marlos da Costa
Revisão
Juliana Camargo Horning
Lisiane Marcele dos Santos
Programação Visual e Diagramação
Denise Pires Pierin
Kátia Cristina Oliveira dos Santos
Rodrigo Santos
Sandro Niemicz
William Marlos da Costa
www.cliqueapostilas.com.br
A
pr
es
en
ta
çã
o
Você está recebendo o material da disciplina de Computação Básica. O
conteúdo está apresentado em sete aulas. Na primeira, veremos a história
da computação; na segunda, os componentes básicos do computador; e, na
terceira, você conhecerá os sistemas posicionais de numeração.
A continuidade dos estudos se dará por meio do estudo das operações
aritméticas no sistema binário de numeração, o que será visto na quarta
aula; na quinta, classificaremos software. A sexta aula será dedicada a um
conteúdo muito importante: noções básicas de redes de computadores e banco
de dados.
Para terminarmos os estudos referentes a esta disciplina, analisaremos as
profissões na área de Informática.
Com o intuito de combinar reflexões teóricas com propostas práticas,
este material não só trará contribuições relevantes para o aprendizado da
Computação Básica, como também motivará você para um trabalho mais
prazeroso com esse conteúdo.
Desejamos bons estudos!
Prof. Alexandre T. Rossini
Prof. Alex Coelho
Prof. Evanderson S. de Almeida
Prof. Marcelo Ribeiro de Oliveira
Prof. Vinícius de Miranda Rios
www.cliqueapostilas.com.br
Pl
an
o
de
E
ns
in
o
EMENTA
História da computação. Componentes básicos do computador. Sistemas
posicionais de numeração. Operações aritméticas no sistema binário de nume-
ração. Classificação de software. Noções básicas de redes de computadores
e banco de dados. Profissões na área de informática.
OBJETIVOS
Conhecer a história da computação, os componentes básicos do •
computador e os sistemas posicionais de numeração.
Reconhecer as operações• aritméticas no sistema binário de numeração.
Adquirir noções básicas de redes de computadores e banco de dados.•
Estudar a classificação de • Software.
CONTEÚDO PROGRAMÁTICO
História da Computação•
Componentes básicos do computador•
Sistemas posicionais de numeração•
Operações• aritméticas no sistema binário denumeração
Classificação de • software
Noções básicas de redes de computadores e banco de dados•
Profissões na área de Informática•
www.cliqueapostilas.com.br
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 9
BIBLIOGRAFIA
ALMEIDA, Marcus Garcia de. Fundamentos de informática. 2. ed. Rio de
Janeiro: Brasport, 2002.
BROOKSHEAR, J. Glenn. Ciência da computação: uma visão abrangente.
7. ed. Porto Alegre: Bookman, 2004.
MARÇULA, Marcelo; BENINI FILHO, Pio Armando. Informática: conceitos e
aplicações. São Paulo: Érica, 2005.
POLLONI. Enrico G. F.; FEDELI, Ricardo Daniel; PERES, Fernando Eduardo.
Introdução à Ciência da Computação. São Paulo: Thomson, 2003.
VELLOSO, Fernando de Castro. Informática: conceitos básicos. 7. ed. Rio de
Janeiro: Campus, 2004.
www.cliqueapostilas.com.br
www.cliqueapostilas.com.br
AULA 1 • COMPUTAçãO BÁSICA
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 11
Objetivos
Esperamos que, ao final desta aula, você seja capaz de:
visualizar o panorama da evolução dos computadores, composto por •
descobertas da ciência e invenções de cientistas em diversos momentos
da história;
compreender a atual realidade em que a tecnologia de produção de •
computadores se encontra.
Pré-requisitos
Como esta aula é a primeira de uma série e esta disciplina é a encarre-
gada de introduzir o estudo do conhecimento dos computadores e afins, não
há necessidade de que você tenha algum conhecimento específico da área
computacional. Recomenda-se, porém, que estude atentamente, procurando
traçar um paralelo de cada assunto abordado com a realidade atual da tecno-
logia computacional, a fim de visualizar as semelhanças existentes daquelas
com os padrões da atualidade. As informações históricas aqui contidas servirão
de base primordial para a compreensão de aspectos tecnológicos computacio-
nais conhecidos e, até mesmo, as emergentes facetas que a comunidade cien-
tífica da computação venha a apresentar.
Introdução
Você visualizará, nesta primeira aula, a linha do tempo da evolução dos
computadores, seus cientistas e povos que contribuíram para sua formação.
Vale a pena lembrar que tal linha não será vista exaustivamente, uma vez
que é inviável discorrer sobre milhares de inventos e povos que contribuíram
de alguma forma para tal evolução, mas, sim, sobre aqueles que serviram de
Aula 1
História da computação
www.cliqueapostilas.com.br
AULA 1 • COMPUTAçãO BÁSICA
12 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
marco nesta caminhada tecnológica. Antes disso, porém, você compreenderá
algo sobre o que venha a ser um dado e uma informação, além de diferenciar
dados analógicos de dados digitais.
1.1 Dados
O ser humano sempre processou dados. Desde o momento em que um
cidadão antigo coletava pedras para representar a quantidade de ovelhas de
seu rebanho, ou escrevia nas paredes das cavernas, em cartões perfurados para
controlar o posicionamento e o movimento de agulhas do tear, ou até o tempo
em que grandes transações bancárias são efetuadas entre duas mega empresas
situadas em continentes distintos, deparamo-nos com a definição de dados.
1.2 O que é dado e o que é informação?
Dados são pequenas unidades de informação que, ao serem aplicadas em
determinada direção, resultam em unidade de informação maior, de alguma
utilidade mais apreciada, ou melhor, a informação em si. Por exemplo, se
unirmos o dados “R”, “$” aos dados “1,50”, teremos a informação R$ 1,50.
Repare que os dados não parecem ter muito sentido para nós, porém o valor
R$ 1,50 já significa algo muito interessante.
Da mesma forma, o R$ 1,50 pode ser considerado um dado, se compa-
rado a uma lista de receitas e despesas em uma planilha de orçamento domés-
tico, que seria, aqui, a informação. Os dados e seu processamento são um
elemento tão abstrato e, ao mesmo tempo, de utilidade tão concreta que, por
muitas vezes, temos dificuldade em distinguir quando estão em uma situação
que os envolva significativamente.
1.3 Escrita é armazenamento de dados
A necessidade de escrever, armazenar e comunicar informações por meio
de símbolos (repare, nesta situação, os dados!) é notada desde os primeiros
registros humanos que a arqueologia pode nos fornecer. A escrita é prove-
niente dos sumérios. As pinturas rupestres (observadas nas cavernas, nos perí-
odos em que se acredita que sejam dos primórdios da humanidade), o uso do
ábaco (uma máquina antiga de calcular, contemporânea ao alfabeto, ambos
criados na região do mediterrâneo) e de outros aparelhos ao longo da história,
até alcançar a tecnologia dos dias atuais, envolvendo micro, mini e super
computadores, mostram que o armazenamento de dados e seu processamento
www.cliqueapostilas.com.br
AULA 1 • COMPUTAçãO BÁSICA
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 13
sempre foram uma forma especial, usada pela humanidade, para exercer
controle do meio à sua volta.
1.4 Dados analógicos e digitais
Antes de prosseguirmos no tour pela linha do tempo da evolução dos compu-
tadores, entenderemos sobre a definição de dados analógicos e digitais.
1.4.1 Dados analógicos
O Dicionário Michaelis define o termo analógico como “[...] dado repre-
sentado por outras grandezas que podem variar segundo o sistema mecânico,
elétrico ou eletrônico empregado”. De fato, informações analógicas podem
possuir estados variáveis e indefinidos pelo homem.
Pensemos em um rádio de comunicação de uma torre de controle de
tráfego aéreo comunicando-se com o rádio de uma aeronave em pleno vôo.
Eles, supondo possuírem rádios analógicos, estão sintonizados em uma deter-
minada freqüência, por exemplo, 900,023Mhz. Repare que a freqüência de
comunicação possui três casas após a vírgula. Mas, mesmo que o receptor
do rádio do avião estivesse sintonizado a 900,0237Mhz (quatro casas após
a vírgula), a comunicação ainda assim seria possível entre torre e aeronave
(talvez com algum chiado). Isso se dá devido ao fato de que um valor analó-
gico poderá assumir infinitos estados, tal qual o comprimento de uma onda,
propagando-se no espaço. O valor possui largura tal que, embora possa ser
detectado algum padrão ou média de tamanho ou largura, tais medidas nunca
serão exatas, podendo ser subdividas em infinitas partes.
Outro exemplo é o próprio relógio analógico. O ponteiro dos segundos
percorre uma volta completa em 60 segundos. Logo, se dividirmos 360° por
60, obteríamos seis. Isso significa que o ponteiro percorre seis unidades da
circunferência a cada segundo. Porém, analogicamente falando, poderemos
dividir o segundo em 100 centésimos; logo, se dividirmos 6 unidades da circun-
ferência por 100, teremos 0,06 unidades da circunferência sendo percorridos
pelo ponteiro a cada centésimo de segundo. Creio que você já tenha deduzido
que poderíamos ficar aqui calculando infinitamente quantas frações de circun-
ferência estaríamos percorrendo em determinada fração de tempo. Inclusive,
se assim o fizéssemos, chegaríamos a um valor tão pequeno que não teríamos
uma nomenclatura oficial para definirmos tão pequenos intervalos. Porém o
fato é que eles existem e são divididos em infinitas partes.
www.cliqueapostilas.com.br
AULA 1 • COMPUTAçãO BÁSICA
14 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
1.4.2 Dados digitais
Quando olhamos o ponteiro dos segundos se movendo, por causa de
nossa capacidade humana limitada de capturar movimentos com clareza até,
no máximo, na casa dos centésimos de segundos, temos a impressão de que
o ponteiro se tele-transporta de seis em seis unidades de circunferência a cada
segundo. Porém, se filmarmos tal ponteiro em movimento e depois assistirmos
ao vídeo em câmera lenta, o que visualizaremos será justamente algo parecido
com o que vemos no ponteirodos minutos ou das horas sem câmera lenta.
Os dados analógicos, por serem infinitos, chegam a atrapalhar os estudos
dos cientistas que, para possibilitarem a execução prática de suas teorias,
precisam discretizar, isto é, limitar a aplicação de um dado analógico infinito
para um conjunto de estados finitos. Retornando ao assunto do ponteiro dos
segundos, o cientista poderá, para tornar viável a aplicação de sua teoria,
considerar que o ponteiro realmente se tele-transporta de seis em seis unidades
de circunferência a cada segundo para, então, projetar o relógio digital, com
o desenho de um ponteiro no visor do relógio, que realmente aparece em
pontos distantes de seis em seis unidades a cada segundo.
Verifica-se, então, que uma informação analógica poderá ser infinitamente
mais rica que uma informação digital e, ao mesmo tempo, toda a infinidade
de riqueza que possui poderá ser desprezada sem prejuízo para a solução
concreta que foi alcançada, como é o caso do relógio digital. Basta, para ele,
possuir 60 dígitos que a circunferência já estará modelada, ignorando-se os
infinitos pontos entre cada um dos 60 pontos requeridos.
Afinal, o que concluir sobre dados analógicos e digitais?
Conclua que uma informação ou dado digital (referente a dígito), embora
limitada, é capaz de possuir toda a precisão necessária para que um objetivo
seja alcançado (e a prova disso são os computadores que usamos na atuali-
dade, na maioria, digitais). O mundo em que vivemos é altamente analógico
(embora o termo altamente analógico seja uma redundância, faço questão
de deixar dessa forma, para ficar claro a infinidade de sua definição). Já os
computadores que criamos são digitais, ou seja, limitados, porém essa limi-
tação poderá ser grande o suficiente para representar, sem perdas significa-
tivas (até mesmo imperceptíveis ao ser humano), um modelo real, por exemplo,
as fotos, vídeos e músicas armazenadas e reproduzidas por computador. Um
exemplo de armazenamento digital sem perdas são os textos digitais.
www.cliqueapostilas.com.br
AULA 1 • COMPUTAçãO BÁSICA
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 15
Após essas constatações, veremos a evolução da tecnologia computa-
cional ao longo do tempo.
1.5 Linha histórica da evolução tecnológica computacional
Ao longo dessa viagem pela linha de evolução dos computadores, veri-
fica-se que os inventores, a partir de uma necessidade pessoal e, não raro,
coletiva, motivaram-se a criar máquinas que facilitassem, agilizassem e até
mesmo permitissem determinadas atividades ou cálculos.
Nessa linha histórica, iremos considerar suas subdivisões de acordo com
a estrutura de Marçula e Beninni (2005) e Tanenbaum (2007). Agruparemos
os diferentes momentos em que se sucedem as facetas da evolução científica
e os distintos componentes que foram usados como marco da posição digital
da época.
1.6 “Iniciando do começo”
Os chineses inventaram o ábaco. Você já deve conhecê-lo, pois o mesmo
é muito divulgado como elemento didático nas escolas e citado em várias
palestras e conferências.
Embora a humanidade antiga soubesse armazenar números e símbolos,
os cálculos matemáticos, embora realizados, no ábaco, por exemplo, não
eram, na maioria das vezes, armazenados ou escritos. Assim, não se poderia
guardar uma equação do segundo grau, por exemplo, e se discretizar alguma
teoria. Mas, com a ajuda dos hindus, que criaram o zero escrito, isso já se
tornou possível.
2000 a.C. – O ábaco chinês é a primeira ferramenta de cálculo de que
se tem notícia. É uma calculadora primitiva, composta por varetas e anéis
de madeira, representando unidades, dezenas e centenas. Os chineses não
sabiam que estavam fornecendo uma grande ajuda teórica na organização
dos computadores. O ábaco é muito popular e até hoje ainda é usado, princi-
palmente em países orientais.
1614 – Logaritmos são definidos por John Napier, nascido na Escócia.
1623 – Wilhelm Schickard cria a primeira máquina de calcular, de acordo
com os historiadores, pois, infelizmente, ela desapareceu durante a guerra dos
trinta anos. Ela realizava operações de divisão e multiplicação e tinha uma
estrutura mecânica baseada em rodas dentadas.
www.cliqueapostilas.com.br
AULA 1 • COMPUTAçãO BÁSICA
16 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
1644 – Blaise Pascal (1623-1662) (inclusive, Pascal é o nome de uma
linguagem de programação muito conhecida, batizada assim em homenagem
a esse cientista) constrói o que a história entende como a primeira calculadora,
batizada por ele de Pascalene, ou Pascalina. Ele a criou para auxiliar seu
pai (preparação de impostos). Tal máquina também usava uma roda dentada
contendo justamente dez dentes, um para cada algarismo decimal (ou dígito
decimal! Uma máquina digital!). A pascalina realizada subtrações e somas.
1673 – Gottfried Wilhelm Leibnitz (1646-1716), matemático e filósofo,
melhorou o projeto da Pascalina, construindo, assim, uma máquina capaz
de dividir, multiplicar, subtrair, somar e calcular a raiz quadrada. Os historia-
dores confirmam seu pensamento: “ele sonhava que um dia todo o raciocínio
pudesse ser substituído pelo girar de uma alavanca”.
1801 – Joseph Marie Jacquard (1752-1834) foi um mecânico nascido
na frança que criou uma máquina mecânica de tear (a primeira máquina
programável, controlada por cartões perfurados, tamanho grande) capaz de
criar bonitos desenhos enredados no próprio tecido. Sua invenção fez muito
sucesso na França e, em sete anos, milhares de máquinas de tear já estavam
em operação no país.
Até aqui, podemos dizer que chegamos ao fim da era mecânica. Veja
como ela trouxe a base sem a qual não teríamos chegado onde estamos hoje,
e as malhas de nossas roupas não poderiam ter lindos e detalhados enfeites
intrínsecos e costurados. Vamos prosseguir para verificar como as máquinas
e descobertas daquela era influenciaram na continuidade desse processo
evolutivo.
1.7 A era dos dígitos
No decorrer do processo, logo vemos a necessidade de utilizar
computadores para realizar atividades repetitivas e rotineiras, principalmente
cálculos de precisão diferencial. No século XIX, vemos por, exemplo, que as
invenções de Charles Babbage expandem a visão do tamanho do potencial
computacional para a humanidade. Prossigamos em nossa caminhada...
1820 – Charles Babbage (1792-1871), matemático nascido na Inglaterra,
projeta a máquina analítica, uma máquina diferencial calculadora de polinô-
mios. Essa máquina calcularia automaticamente, além de somas e subtrações
e outros cálculos básicos, a conversão de números de uma base para outra (da
base binária para a decimal, por exemplo). Babbage ficou conhecido com o
www.cliqueapostilas.com.br
AULA 1 • COMPUTAçãO BÁSICA
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 17
Pai do computador, uma vez que seu invento muito se aproximava do conceito
de computador que temos na atualidade.
Tal máquina, que fora financiada por algum tempo pelo governo britânico,
era puramente mecânica, sendo composta por um engenho central (olha só,
uma CPU!), uma memória, engrenagens e alavancas. Utilizava cartões perfu-
rados e possuía dispositivos de entrada e saída de dados.
Por fim, infortunadamente, Charles Babbage parecia estar à frente da
tecnologia de sua época, pois a mesma não estava suficientemente avançada
para fornecer a base de que ele precisava para avançar em suas pesquisas
e construir peças mecânicas de que precisaria. O governo britânico acabou
por suspender o financiamento de Babbage e, com isso, o cientista não teve
condições de finalizar o próprio projeto e a calculadora analítica nunca foi
construída. Vale a pena ressaltar que as máquinas, até o século XIX, funcio-
navam na base decimal (e hoje funcionam na base binária!).
No século XX, a máquinade Babbage finalmente foi construída (e hoje,
inclusive, por universidades, com certo sabor saudosista), porém Babbage não
viveu tempo suficiente para ver seu invento concretizado.
1842 – Ada Byron (1815-1852), Condessa de Lovelace, filha de Lord
Byron (poeta), foi considerada a primeira programadora da história (hoje,
existe uma linguagem batizada de Ada, em sua homenagem), inclusive, antes
mesmo do computador, como conhecemos, ter sido inventado. Ela escreveu
várias instruções para serem interpretadas pela máquina analítica de Babbage.
O Conceito de Subrotina partiu dela, que também aprendeu a valorizar os
laços de repetições (loop): basta em algum lugar de um cartão, inserir infor-
mações para que a leitora de cartões retornasse para outro cartão anterior,
concretizando-se assim o efeito de repetição de uma seqüência de instruções.
Ada também imaginava as vantagens, caso pudesse trabalhar com os desvios
condicionais (if).
1854 – George Boole (1815-1864) publicou as bases da lógica booleana
(Booleana em homenagem ao próprio cientista). Tais bases determinam que
equações matemáticas algébricas podem expressar os conceitos da lógica, em
que variáveis (unidades de memória que armazenam valores) assumiriam os
valores 0 e 1 (ex.: verdadeiro ou falso).
Graças a essa contribuição de George Boole, os cientistas puderam pensar
em um computador que fosse utilizável para qualquer fim.
www.cliqueapostilas.com.br
AULA 1 • COMPUTAçãO BÁSICA
18 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
1.8 Máquinas de computar
1889 – As idéias de Charles Babbage são mescladas às práticas com
cartões perfurados por um estatístico americano preocupado com a demora na
contagem da população. Até então, a contagem completa da população norte-
americana demorava sete anos. Após a aplicação computacional de Babbage
com a máquina de Hollerith (inclusive esse era, e ainda é, o nome dado aos
contracheques de pagamento de funcionários), o tempo para contagem popu-
lacional reduziu pela metade, três anos e meio.
1896 – Aqui, a Companhia de máquinas de tabular é criada (Tabulating
Machine Company).
1924 – Bem, se foi difícil saber que empresa era essa que fora citada ante-
riormente, saiba que neste ano ela muda seu nome para International Business
Machine, ou a famosa IBM.
1904 – A Válvula é criada por John A. Fleming. Tal componente é composto
por um envoltório de vidro que contém dois eletrodos. A válvula interrompe ou
permite a passagem de corrente elétrica, dependendo de como a energia
passa por dentro da mesma. Veja a utilidade disso: com corrente elétrica,
temos o Bit um; sem corrente elétrica, o bit zero.
1937 – Allan M. Turing, utilizando-se da álgebra de boole, da tecno-
logia de entrada e saída via cartões perfurados e da válvula expõe minucio-
samente uma máquina computacional de propósito múltiplo. Essa iniciativa
foi a pioneira no sentido de alguém, o próprio usuário (ou seja, não vem
definido de fábrica), poder decidir que cálculos ou operações a máquina irá
realizar. A consciência com o conceito de programação que temos hoje não
é mera coincidência.
1.9 Primeira geração de computadores – Válvula (1945-1955)
De acordo com o progresso da história, é possível agrupar quatro diferentes
gerações, notadas sempre por um marco, um evento revolucionário que permitia
à tecnologia saltar consideravelmente em direção a um estado mais evoluído.
1946 – John Presper Eckert (1919-1995) e John Mauchly (1907-1980), ambos
engenheiros, projetaram o Eletronic Numeric Integrator And Calculator (ENIAC).
Ele possuía 18.000 válvulas, 1.500 relés, pesava 30 toneladas e consumia
140Kw de energia (ocupava o tamanho de um prédio pequeno, com 90m2,
e conseguia realizar 500 operações de multiplicação por segundo, ou 5.000
www.cliqueapostilas.com.br
AULA 1 • COMPUTAçãO BÁSICA
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 19
somas, no mesmo período de tempo). O ENIAC foi projetado para fins bélicos
(iniciou no apogeu da Segunda Guerra Mundial) porém somente após vários
meses o término da guerra, em 1946, esse teve sua construção concluída.
O ENIAC dispunha, para sua programação, de 6.000 interruptores de
ajuste e uma imensa quantidade de soquetes. Tanenbaum (2007) compara:
“Uma verdadeira floresta de cabos e jumpers”. Programar em painéis elétricos
realmente era difícil, lento, tedioso e mecânico.
A partir dessas dificuldades, John Von Neumann propôs um modelo conhe-
cido como Máquina de Von Neumann. Esse modelo é composto por cinco
partes básicas: uma unidade de controle, uma memória de trabalho (arma-
zena os dados), unidades de entrada e saída (impressora) e CPU, composta
por uma unidade lógica aritmética e por um acumulador.
1.10 Segunda geração de computadores – transistores (1955-1965)
Isso mesmo, os transistores (Inventado nos Laboratórios da Bell, em 1948
por Willian Shockley, Walter Brattain e Jhon Bardeen) substituíram as válvulas.
A válvula era e é uma grande consumidora de energia elétrica. O transistor é
muito mais rápido e barato que a válvula, além de consumir bem menos energia
elétrica e ser mais durável. Os Estados Unidos conseguiram, por exemplo, com
o uso de transistor, sair à frente da antiga URSS na corrida espacial.
1963 – O monitor de vídeo, talvez, hoje, o mais conhecido periférico de
saída, começa a ser usado como tal. Antes dele, os resultados de processa-
mentos eram vistos impressos em papel.
1964 – Agora é a vez de o mouse aparecer. Ele foi apresentado por
Douglas Engelbart como um periférico de entrada de dados. Antes dele, a
entrada somente poderia ser feita via os famosos cartões perfurados.
John Kemeny cria a linguagem BASIC que, no momento, servia como um
software que intermediava a relação entre a linguagem de programação e o
hardware. Note que isso muito se assemelha ao sistema operacional (popular-
mente representado pelo Microsoft Windows ou GNU/Linux).
1.11 Terceira geração de computadores – circuitos
integrados (1965–1980)
O circuito integrado foi inventado em 1958 por Robert Noyce. Dessa vez,
o tal circuito integrado não é um substituto do transistor, mas sim um conglo-
www.cliqueapostilas.com.br
AULA 1 • COMPUTAçãO BÁSICA
20 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
merado de transistores. Mais especificamente, nessa geração, dezenas, e até
centenas deles, em um pequeno espaço (o chip) de silício.
Nessa fase, verifica-se o famoso fenômeno da miniaturização dos compu-
tadores: com o circuito integrado (CI), tornou-se possível a construção de
computadores menores, mais rápidos e mais baratos do que os da geração
anterior já transistorizados. A mudança foi drástica: computadores que tinham
tamanhos de salas reduziram ao tamanho de geladeiras, ainda grande, se
comparados com os de hoje, certo? Mas concorde que o impacto, aqui, já foi
gigantesco para a época que, aliás, não é tão distante de hoje.
1967 – A primeira calculadora digital, precursora das calculadoras
de bolso, hoje é apresentada pela empresa Texas Instruments. Tal máquina
realizava as quatro operações fundamentais: soma, subtração, multipli-
cação e divisão.
1968 – A empresa Intel (hoje, a maior fabricante de microprocessadores
do mundo) é criada por Robert Noyce, Andy Groove e Gordon Moore.
1969 – Nasce a rede Arpanet, por meio da interligação de quatro univer-
sidades, pelo departamento de defesa dos Estados Unidos. A Arpanet é a
precursora da WWW – Rede mundial de computadores ou, simplesmente,
a Internet.
1970 – O Sistema operacional (SO) UNIX (curiosidade: o conhecido GNU/
Linux de hoje é um UNIX) é desenvolvido por Ken Thompson e Dennis Ritchie.
O UNIX foi o primeiro SO portável (sistema que pode funcionar em diferentes
tipos de computadores) a ser desenvolvido.
A partir dessa parte da história, você irá notar(se já não tiver notado) que
convive com boa parte da tecnologia. Estamos nos aproximando da geração
atual com a qual convivemos.
1.12 Quarta geração de computadores –
integração em escala muito grande (1973, 1980-?)
Na terceira geração, notamos centenas de transistores em um único chip.
Agora, na quarta geração, os cientistas obtiveram dezenas de milhares,
centenas de milhares e milhões de transistores em um único chip (Very Large
Scale Integration (VLSI) – integração em escala muito alta) ou seja, ainda, de um
CI, porém, em um nível de miniaturização muitíssimo elevado. A essa altura da
evolução, é sensato que o chip tenha mudado de nome: Microchip.
www.cliqueapostilas.com.br
AULA 1 • COMPUTAçãO BÁSICA
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 21
Se o Microchip é o marco dessa geração, logo os computadores constru-
ídos com tais são os microcomputadores. Dessa vez, as máquinas alcançaram
tamanhos muito menores, evoluindo de geladeiras a cadernos (isso mesmo,
traduzindo, notebooks), e indo a um tamanho ainda menor.
1973 – O termo PC (personal computer) e CP (computador pessoal) é
utilizado pioneiramente quando a Xerox lança um computador batizado como
Alto, com fins de uso pessoal. Repare nas características desse CP: compa-
tível com uso de mouse, possuindo um nível alto de conectividade em rede
e dispondo de interface gráfica. Realmente, características que podem ser
usadas para descrever nossos computadores.
1975 – O BASIC é adaptado para rodar nos microcomputadores daquele
tempo (por meio do conhecido Bill Gates e Paul Allen).
1976 – Nasce a Apple (significa maçã, que é, inclusive, a logomarca da
companhia) criada por Steve Jobs e Stephen Wozniak, com o intuito de se
projetar CPs.
1977 – O Apple 2, o Atari 500 e o Commodore 64 são lançados respec-
tivamente pelas empresas Apple, Atari e Commodore. O Apple 2 foi consa-
grado como o primeiro sucesso de mercado na área de computação pessoal.
1980 – O primeiro computador portátil, um avô para o notebook Osborne-1
com seus 11 quilos, surge no mercado. Um ano depois do Osborne-1, a
Compaq se estabelece como empresa líder no mercado de portáteis, lançado
sua cópia clonada, portátil, do IBM-PC.
A arquitetura, Reduced Instruction Set (RISC) – conjunto reduzido de
instruções, começa a ser aceita no lugar de dificultosas arquiteturas (CISC).
Abordagens maiores sobre RISC e CISC serão vistas na próxima aula.
1981 – O IBM-PC é lançado pela IBM, com o processador Intel 8088 e o
SO MS-DOS, feito pela Microsoft. Esse CP surge com desempenho (velocidade
e memória) muito superior ao dos concorrentes. Você provavelmente possui
um PC em sua casa ou local de trabalho ou estudo. Ele é um sucesso que
permanece até os dias de hoje. A arquitetura IBM PC foi aberta ao público
pela própria empresa. O resultado disso foi a perda de Mercado pela IBM
(ruim para a IBM) e a popularização do padrão IBM para o mercado (bom
para o mundo, para nós, usuários). É notável a popularidade do padrão IBM
(aberto) quando comparamos, por exemplo, à popularidade do Apple (padrão
fechado, proprietário). Quem lucrou mesmo com essa história foi a Microsoft,
www.cliqueapostilas.com.br
AULA 1 • COMPUTAçãO BÁSICA
22 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
uma vez que, para cada computador vendido, mesmo de arquitetura aberta,
era quase que provável que uma licença de uso do MS-DOS seria vendida
para uso juntamente com a máquina.
1992 – O computador Alpha, revolucionário, de 64 bits, é lançado pela
DEC. Um computador RISC, cuja velocidade ultrapassava e posicionava-se muito
mais à frente da velocidade de qualquer outro computador pessoal da época.
A história registra o intervalo de tempo de dez anos para que os compu-
tadores RISC de 64 bits fizessem sucesso no mercado, atuando principalmente
como servidores de alta performance.
1.13 “Quinta geração de computadores” – computadores invisíveis
O que, ou como seria a quinta geração de computadores?
O Japão já teve interesse em ditar como seria a computação de quinta
geração: computadores quânticos. Isso causou um grande temor por partes
das indústrias americanas e européias. Porém o fato é que o Japão não teve
êxito em suas pesquisas e logo o assunto foi abafado.
Constatações históricas nos mostram que a quinta geração não é marcado
por uma mudança ou salto grandioso de tecnologia, como constatado nas
gerações anteriormente citadas, mas sim uma mudança de paradigma: os
computadores atingiriam tamanhos menores (constatando que a miniaturi-
zação continua a ocorrer) ao ponto de não serem notados pelo ser humano: a
geração do computador invisível.
1993 – A Apple lança o computador Newton. Esse marcou o momento
por mostrar que os computadores poderiam ser feitos em invólucros menores
do que uma fita cassete portátil. Recebia entrada de dados dos usuários a
partir de uma caneta, assemelhando-se aos conhecidos e populares Personal
Digital Assistants (PDAs) – agendas eletrônicas, por exemplo, o Palm Tungsten
ou Pocket PCs.
Embora os PDAs sejam realmente menores, até mesmo que os Notebooks,
não são eles quem descrevem a característica dessa nova geração, mas sim os
computadores realmente invisíveis como aqueles embutidos dentro de automó-
veis, aviões, fornos microondas, máquinas de lavar, vídeo games, etc.
Como se pode notar, os computadores invisíveis estão em toda a parte e,
se você, leitor, estiver na cidade e olhar à sua volta, provavelmente constatará
(mesmo não podendo ver) a presença de algum computador, microchip ou
www.cliqueapostilas.com.br
AULA 1 • COMPUTAçãO BÁSICA
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 23
controlador eletrônico em um raio de 15 a 100 metros. Como Tanenbaum
afirma: “Eles serão parte da estrutura da vida diária, abrindo portas, acen-
dendo luzes, distribuindo dinheiro e milhares de outras coisas”.
Chegamos ao fim desta primeira aula. E quanta informação você recebeu!
Muito do que foi visto já fez ou ainda faz parte do seu dia-a-dia ou de seus
pais ou de professores mais experientes, afinal convive com a quarta geração
e entende a presença de uma quinta geração eminente. E, a partir de agora,
desafio você a relacionar na história todos os tipos de computadores com os
quais você venha a ter contato. É hora de situar-se na história para compre-
ender cada vez mais o porquê de nossa situação tecnológica atual e poder
projetar tendências de futuro para a mesma.
Síntese da aula
Nesta primeira aula, você aprendeu detalhes esclarecedores sobre dados
analógicos e digitais. Principalmente, viajou no tempo da história da compu-
tação, aprendendo as características dos computadores de cada geração
que a tecnologia nos trouxe, incluindo a geração atual, sendo capaz de se
posicionar quanto às previsões sobre os rumos a serem tomados pela tecno-
logia vigente.
Atividades
1. Como diferenciar dado de informação?
2. Cite cinco formas variadas de se armazenar dados.
3. Você vê alguma vantagem do relógio digital sobre o analógico (considere
apenas a funcionalidade de relógio)?
4. Qual o nome da máquina criada por Blaise Pascal?
5. Qual o nome da máquina criada por Charles Babbage?
6. Por que Babbage ficou conhecido com o Pai do Computador?
7. Cite as quatro palavras-chave das quatro gerações de computadores. Por
que devemos nos lembrar delas?
8. Qual a relação da válvula com a álgebra booleana?
9. Descreva a razão de ser do fenômeno de miniaturização.
10. O que são computadores invisíveis?
www.cliqueapostilas.com.br
AULA 1 • COMPUTAçãO BÁSICA
24 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Comentário das atividades
Os objetivos desta aula foram introdutórios aos estudos sobre Tecnologia
da Informação, bem como históricos, a fim de situar o aluno quantoao nível
de evolução que alcançamos. As atividades 1, 2 e 3 mensuram a captação da
parte introdutória deste assunto, abordando conceitos de dados, informação, e
naturezas analógica e digital. As atividades 4, 5, 6 e 7 mensuram a absorção
do conteúdo histórico exposto. As atividades 8, 9 e 10 verificam a capacidade
de o aluno de raciocinar sobre os conceitos explanados, bem como “palpitar”
sobre as tendências de futuro tecnológico.
Na atividade 1, dado pode ser diferenciado de informação quando deter-
minada informação pode ser subdividida em partes menores os dados que a
compõem.
Na atividade 2, podemos citar as seguintes formas de se armazenar dados:
agrupamento de pedras, escrita em paredes de cavernas, escrita em papel,
meio magnético, meio óptico.
Na atividade 3, quanto à funcionalidade de relógio (marcar as horas), o
relógio analógico é equivalente ao relógio digital.
Na atividade 4, o nome da máquina criada por Blaise Pascal foi Pascalene
ou Pascalina.
Na atividade 5, a máquina criada por Charles Babbage foi a máquina
analítica.
Na atividade 6, Babbage ficou conhecido como o Pai do Computador
devido ao seu invento muito se aproximar ao conceito de computador que
temos na atualidade: possuía um engenho central, uma memória, engrenagens
e alavancas. Utilizava cartões perfurados e possuía dispositivos de entrada e
saída de dados.
Na atividade 7, as respectivas palavras-chave das 4 gerações de compu-
tadores são: válvula, transistor, circuito integrado, microchip. Lembrar dessas
palavras nos faz recuperar, em nossa mente, a linha histórica da evolução dos
computadores.
Na atividade 8, a válvula interrompe ou permite a passagem de corrente
elétrica, dependendo de como a energia passa por dentro da mesma. Com isso,
percebemos dois estados físicos definidos: com corrente elétrica, temos o bit um
(verdadeiro); sem corrente elétrica, o bit zero (falso). Eis aí dois estados, o sufi-
ciente para realizar quaisquer cálculos baseados em álgebra booleana.
www.cliqueapostilas.com.br
AULA 1 • COMPUTAçãO BÁSICA
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 25
Na atividade 9, a miniaturização foi uma conseqüência natural obtida
conforme as gerações vão se estabelecendo. Cada geração é definida por
componentes elétricos cada vez menores. Diminuindo-se os componentes, logo
diminuem-se o tamanho dos computadores compostos pelos mesmos.
Na atividade 10, computadores invisíveis são uma nomenclatura sugerida
para todo objeto de uso humano que contenha, dentro de si (embutidos), micro-
processadores ou microcontroladores. Essa realidade nos coloca dentro de um
mundo em que estamos cercados de utensílios computadorizados, muitos deles
usados por nós tão automaticamente que, por muitas vezes, não atentamos que
estamos interagindo com um computador, daí o fenômeno da invisibilidade do
computador.
Referências
MARÇULA, Marcelo; BENINI FILHO, Pio Armando. Informática: conceitos e
aplicações. São Paulo: Érica, 2005.
TANENBAUM, Andrew S. Organização estruturada de computadores. São
Paulo: Prentice Hall, 2007.
Na próxima aula
Agora que você já visualizou a linha do tempo da evolução dos compu-
tadores, na próxima aula, você irá estudar sobre a estrutura física (hardware)
básica dos computadores da atualidade. Conhecer as facetas internas dos
computadores modernos lhe dará maior embasamento e autoridade tanto
para discutir sobre os mesmos quanto para desenvolver programas que sejam
executados nessas plataformas.
Anotações
www.cliqueapostilas.com.br
AULA 1 • COMPUTAçãO BÁSICA
26 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
www.cliqueapostilas.com.br
AULA 2 • COMPUTAçãO BÁSICA
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 27
Objetivos
Esperamos que, ao final desta aula, você seja capaz de:
conhecer os principais componentes formadores do computador •
moderno;
compreender, conceitualmente, o modo de execução de instruções de •
um computador.
Pré-requisitos
Chegamos à segunda aula, que abordará um tema conceitual, porém não
menos importante para o curso, que recomenda fortemente o estudo da aula ante-
rior. O estudo da aula anterior se faz importante devido ao fato de ser a base
teórica para uma melhor compreensão dos componentes atuais formadores do
computador moderno, que serão estudados nesta aula. Ter conhecimentos sobre,
por exemplo, a máquina Von Neumann, o armazenamento de dados e outros impor-
tantes conceitos é condição necessária para que você possa ter o melhor proveito
desta e de outras aulas de nossa disciplina e, conseqüentemente, do curso.
Introdução
Você conhecerá, nesta segunda aula, os componentes internos e externos
que formam o computador contemporâneo de nossa época. Veremos como
esses componentes se relacionam entre si para que o conceito de computador se
torne uma realidade prática e, portanto, útil para a resolução de problemas.
2.1 Componentes do computador
O computador, relembrando a máquina Von Neumann, é composto por:
CPU (nesse caso, representada pela unidade lógica aritmética e pela unidade
de controle), memória e unidades de entrada e saída.
Aula 2
Componentes básicos
do computador
www.cliqueapostilas.com.br
AULA 2 • COMPUTAçãO BÁSICA
28 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Andrew Tanenbaum (2007) define que “um computador digital consiste
em um sistema interconectado de processadores, memórias e dispositivos de
entrada/saída”.
Atualmente, os computadores seguem esse mesmo princípio de compo-
sição. Eles se diferem do modelo de Von Neumann no aspecto do processador,
ou CPU, que, em nossa realidade, estão em um único microchip, se é que isso,
um reposicionamento, pode ser considerado uma diferença significante.
Visto isso, os componentes principais do computador são: CPU, memória
e a placa mãe. Em resumo, a CPU é responsável por processar os dados,
a memória tem a funcionalidade de armazenar os dados pré e pós-proces-
sados, e a placa mãe é o barramento (canal de comunicação) onde a CPU e a
memória se localizam conectadas por meio de slots (conectores), permitindo,
assim, que o processador acesse aos dados na memória, processe-os e os
retorne para a mesma.
2.2 A Memória Principal – RAM (Random Access Memmory)
O termo RAM, Random Access Memmory traduz-se por Memória de Acesso
Aleatório. Trata-se da memória de trabalho com a qual o processador comuni-
ca-se. O termo aleatório quer dizer que a memória poderá ser acessada, para
operações de escrita e leitura, em qualquer posição. Existem milhares de posi-
ções de memória, a depender da capacidade do pente de memória instalado
em sua placa mãe.
Considere, para efeito didático, uma posição de memória em um
pente como sendo um dos apartamentos de um prédio. Cada apartamento
pode conter apenas um morador (em termos técnicos, um caractere, por
exemplo, a letra “A”). O processador poderá, então, dependendo do
programa que está executando, inserir um caractere em uma posição de
memória, retirar um caractere de uma posição, substituir um caractere
que estava previamente armazenado em uma posição por outro caractere,
copiar um caractere de uma posição de memória para outra da posição
de memória. Repare que a memória tem de ser de rápido acesso, uma vez
que os computadores perfazem milhões de acessos à memória durante o
tempo em que estão funcionando, dependendo dos programas que esti-
verem sendo executados.
Um exemplo didático de uso da memória seria, por exemplo, os seis passos
descritos a seguir.
www.cliqueapostilas.com.br
AULA 2 • COMPUTAçãO BÁSICA
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO29
1. Processador insere o número um na posição de memória 002.
2. Processador insere o número dois na posição de memória 003.
3. Processador lê o número contido na posição de memória 002.
4. Processador lê o número contido na posição de memória 003.
5. Processador soma os números lidos e armazena o resultado na posição
de memória 101.
6. Processador insere o número três na posição de memória 003.
Você é capaz de dizer qual o resultado da soma armazenado na posição
de memória 101? Se você respondeu três, acertou. Uma possível resposta,
porém, errada, seria cinco. Está errada uma vez que, embora o processador
tenha alterado o conteúdo na posição 003 de dois para três, isso em nada
influenciou o conteúdo da posição 101.
A Memória Principal (RAM) não processa nada. Ela é um repositório de
dados, acessada pelo processador. Ela também é volátil, ou seja, se você
desligar o computador, todos os dados contidos nela irão se perder. A propó-
sito, a memória que não se perde, em que os documentos que digitamos ficam
armazenados, é de outra natureza. Documentos de textos e planilhas, sistema
operacional e outros dados persistentes ficam armazenados em dispositivos de
memória de massa, por exemplo, os discos rígidos, conhecidos também como
memória secundária.
Estudemos, agora, o processador, que tem como função a comunicação,
por meio da via de comunicação fornecida pela placa mãe, com a memória
principal.
2.3 A Unidade Central de Processamento – UCP
A Unidade Central de Processamento é a principal parte do computador.
Você pode referir-se a ela como CPU (Central Processing Unit), UCP (Unidade
Central de Processamento) ou, simplesmente, processador.
Um computador poderá até sobreviver, conceitualmente, sem memória ou
mesmo sem uma placa mãe, mas, se não possuir um processador, não pode
ser nem considerado como um computador propriamente dito: talvez seja outro
equipamento como um pen-drive, mas nunca um computador. O termo compu-
tador nos lembra do verbo computar, que quer dizer calcular ou, mais espe-
cificamente, executar cálculos e operações próprias de um computador. Ora,
www.cliqueapostilas.com.br
AULA 2 • COMPUTAçãO BÁSICA
30 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
se um computador é aquilo que realiza cálculos, logo, presumimos que ele
precisará ter uma espécie de cérebro eletrônico, ou uma cabeça eletrônica que
possa pensar ao menos o suficiente para resolver os cálculos para os quais o
mesmo foi designado para realizar.
A CPU age, então, como o cérebro do computador, tendo a função de
obter dados ou instruções de algum lugar que, no caso de um computador, é a
memória de trabalho (será vista em seguida, ainda nesta aula), verificar estas
instruções e depois executá-las, uma após a outra.
Vamos desmistificar o processador aqui: ele não é um elemento mágico que
busca as informações e as processa de forma desconhecida. No parágrafo ante-
rior, utilizamos verbos de ação como obter, verificar e executar. Para cada um
destes verbos, existem barramentos e circuitos elétricos e eletrônicos que desem-
penham e possibilitam a comunicação entre os componentes internos ao próprio
processador. Porém não é aconselhável, por fins didáticos, que você se aprofunde
ao nível dos projetos eletrônicos de construção e um processador, pois esse não
é o objetivo deste curso. Projetar processadores, bem como circuitos eletrônicos
e componentes para computadores, como interfaces de vídeo tridimensionais ou
modems para acesso a Internet, etc., são objetivos de cursos específicos como,
por exemplo, engenharia eletrônica e engenharia da computação.
Diferentes partes compõem a UCP: UC (Unidade de Controle), ULA (Unidade
Lógica Aritmética) e Registradores (Pequenas memórias de alta velocidade).
2.3.1 Unidade de Controle – UC
A Unidade de Controle tem a função de obter dados e instruções na memória
principal, determinando sua tipologia. É ela a porta de entrada e saída que o
processador usa para comunicar-se, via sinais elétricos, com a memória prin-
cipal. Por exemplo, se a ULA precisar armazenar o número binário 0012 na
posição de memória 0002, ele solicitará à UC que realize tal procedimento.
2.3.2 Unidade Lógica Aritmética – ULA
A Unidade Lógica Aritmética efetua diversas operações matemáticas, como
adição e subtração, multiplicação e divisão, e de lógica booleana (lembra G.
Boole? Se não, aconselhamos que você dê uma pequena pausa neste ponto
de leitura, retorne à aula anterior e reveja as explanações sobre George Boole
e a lógica binária), como o OR (ou) booleano (você estudará isso com deta-
lhes na disciplina Lógica de Programação) com a finalidade de se executar as
instruções (o programa).
www.cliqueapostilas.com.br
AULA 2 • COMPUTAçãO BÁSICA
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 31
2.3.3 Registradores
Os Registradores são pequenas memórias que servem para auxiliar o
processador, armazenando resultados temporários, durante o processo de
cálculo. Pense que o processador teria de se esforçar muito mais para realizar
operações sem esses registradores internos, pois, se assim fosse, teria de utilizar
a memória principal, que está mais longe, externa ao processador.
Existem registradores com funções genéricas e específicas que são muito
mais rápidos do que aqueles, porém são preparados para responder a
apenas um tipo fixo de operação, enquanto os genéricos, diversas, tal qual
a memória principal. Os registradores são memórias internas para uso geral,
usados pela ULA para armazenar dados (caracteres, números binários) que
estão sendo processados.
Exemplo de registradores gerais: AX, BX, usados para armazenar números
binários. Exemplo de registrador específico: IP, Instruction Pointer, armazena
a referência do endereço da memória principal (RAM) que contém a próxima
instrução a ser executada.
2.4 Executando-se uma instrução
A Memória principal armazena dados que serão buscados pela UC
(unidade de controle) da CPU e adicionados nesses registradores. Em seguida,
a ULA realiza operações sobre os dados que estão nos registradores, também
armazenando o resultado das operações neles. Por fim, UC copia o valor dos
registradores para dentro de um endereço (posição) de memória principal.
A enumeração a seguir representa uma seqüência de pequenas fases que
são reproduzidas para cada instrução que a CPU executa. A mesma tem uma
denominação comum de ciclo buscar-decodificar-executar.
1. Transportar a instrução seguinte da memória principal para o registrador.
2. Modificar o ponteiro de instrução (IP) indicando a próxima instrução.
3. Estabelecer qual o tipo da instrução transportada.
4. Caso a instrução utilize uma seqüência de dados na memória prin-
cipal, estabelecer onde está seqüência de dados se encontra.
5. Transportar a seqüência de dados, se necessário, para algum regis-
trador da UCP.
6. Executar a instrução.
7. Retorno à fase 1 (isso fará com que se execute a próxima instrução,
contida no registrador IP, alterado pela etapa 2).
www.cliqueapostilas.com.br
AULA 2 • COMPUTAçãO BÁSICA
32 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
2.5 RISC versus CISC
Ao longo a história, a Apple projetou seu processador e acabou compe-
tindo com a Intel, também com um processador próprio. Ambas competiam
pelo espaço no mercado de processadores. A Intel lidera essa concorrência de
forma geral, principalmente no que se diz respeito aos computadores pessoais.
Você deve estar habituado a ouvir, mesmo na televisão, sobre os processa-
dores Intel, por exemplo, Pentium, Celeron, etc.
Existe uma diferença básica entre os dois processadores dessas duas
companhias aqui: a quantidade de instruções que eles podem realizar. A Apple
utiliza um conjunto reduzido de instruções (RISC), enquanto a Intel utilizaum
conjunto complexo de instruções (CISC).
Um processador RISC segue a regra de que, internamente, deverá possuir o
menor número de micro instruções possível. Por exemplo, ao invés de conter uma
instrução para multiplicar (x), basta possuir a instrução de somar (+) e deixar que
o programador que queira multiplicar 5x2 realize a operação 2+2+2+2+2. Isso
torna a vida do programador mais difícil, pois o mesmo terá de codificar instru-
ções complexas que precisar para alcançar seu objetivo. O programa resultante,
porém, ao ser executado, será feito em alta velocidade pelo processador RISC.
Um processador CISC segue a regra de que, internamente, deverá possuir
vários conjuntos de instruções para realizar diversas operações. Isso significa
que ele possuirá tanto a operação de soma (+), quanto à de multiplicação (x).
Isso facilita a vida do programador, que terá à sua disposição um leque de
instruções prontas de fábrica (a Intel) a fim de alcançar seus objetivos.
Não há como definir qual o melhor dos processadores. Alguns autores
defendem o RISC como sendo o mais performático e puro dos processadores;
outros defendem que a complexidade trazida pelo CISC facilita a vida dos desen-
volvedores. De fato: os processadores RISC costumam ser mais rápidos que os
processadores CISC. Mais rápido nem sempre significa melhor. Os computadores
da Apple (power pc, I-mac), não são tão populares no Brasil, mas sim nos EUA.
São preferidos quando o assunto é, por exemplo, processamento de vídeo, som e
gráfico, realizado por empresas de jogos eletrônicos, maquetes virtuais, etc.
Mesmo assim, o processador Intel é o mais popular por seguir uma regra de
retro compatibilidade com programas construídos para outros processadores
da mesma marca, mesmo que ultrapassados. Isso significa que um programa
feito para um processador Intel 4x86 (antigo) terá grandes chances de ser
executado em um Pentium IV (novo). Ter essa vantagem de retro compatibili-
dade coloca a Intel em posição comercial privilegiada, uma vez que os progra-
www.cliqueapostilas.com.br
AULA 2 • COMPUTAçãO BÁSICA
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 33
madores de sistemas e aplicativos terão menos trabalho: codificarão uma só
vez e verão o seu programa funcionar em várias versões futuras da Intel.
Chegamos ao fim de nossa segunda aula. Agora você está ciente de
importantes informações que nortearão de maneira significativa as decisões
que você tomará em relação à programação e demais relacionamentos asso-
ciados ao computador.
Repare, também, o quanto a primeira aula apresentou aspectos fundamen-
tais sobre a evolução dos componentes de nossos computadores, o que fez
com que você recebesse a informação dessa aula de forma racional e funda-
mentada. Leve para sempre, em sua mente, esses conceitos aqui expostos, pois
você irá usá-los como, no mínimo, pano de fundo para o desenvolvimento de
aplicações, preparação de conteúdos, ministração de palestras e seminários e
os estudos da maioria das disciplinas que serão vistas neste curso e que sejam
relacionadas ao computador moderno.
Síntese da aula
Nesta segunda aula, você conheceu os componentes fundamentais do
computador moderno e aprendeu detalhes conceituais sobre os mesmos, além
de entender diferenças entre arquiteturas de processadores e o modo como um
computador executa instruções.
Atividades
1. Cites os três componentes principais de um computador moderno.
2. Associe um verbo chave para cada um dos componentes que você citou na
primeira questão.
3. Cites os componentes que compõem a CPU.
4. Descreva as funções da ULA.
5. Qual o papel da UC?
6. O que é RAM e qual a sua função?
7. Qual a diferença entre os registradores da CPU e a memória principal
(RAM)?
8. Qual a função do IP (Instruction Pointer) no processo de se executar uma
instrução?
9. Explique a frase: “Para o RISC, quanto menor, melhor”.
10. Se o RISC é mais rápido que o CISC, qual o motivo da Intel, típica fabri-
cante de processadores CISC, ser líder de mercado?
www.cliqueapostilas.com.br
AULA 2 • COMPUTAçãO BÁSICA
34 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Comentário das atividades
Os objetivos desta aula foram pertinentes aos estudos introdutórios sobre
os modernos computadores da atualidade, mais especificamente, sobre aqueles
mais utilizados pela maioria da população mundial, inclusive, de arquitetura já
previamente anunciada ou descrita por grandes ícones da informática atuantes
em momentos históricos passados. As atividades de 1 a 10 mensuram o aprendi-
zado sobre os principais componentes formadores dos computadores modernos.
Na atividade 1, os três componentes que formam o computador moderno
são CPU, Memória Principal e Placa Mãe.
Na atividade 2, o verbo associado à CPU é processar (dados), o verbo
associado à memória principal é armazenar (dados) e o verbo associado à
placa mãe é comunicar (dados).
Na atividade 3, os componentes que compõem a CPU são ULA (Unidade
Lógica Aritmética), UC (Unidade de Controle e Registradores).
Na atividade 4, a ULA possui a função de realizar operações matemá-
ticas, como multiplicação, divisão, soma, subtração, raiz quadrada, etc, bem
como a realização e operações lógicas booleanas.
Na atividade 5, o papel da UC é servir como porta de entrada e saída
para com a memória principal, transportando dados dos registradores para a
memória principal e vice-versa.
Na atividade 6, RAM é a memória principal, também conhecida como
memória de trabalho, e sua função é armazenar dados que poderão ser tanto
informações de planilhas (carregadas da memória de massa) quanto instruções
de programas.
Na atividade 7, a diferença principal entre os registradores da CPU e
memória RAM é a localização física (registradores ficam dentro da própria
CPU, enquanto a RAM fica externa à CPU, conectada ao processador via
barramento da placa mãe), o tamanho (registradores são quantidades muito
pequenas de memória, se comparadas à RAM) e a velocidade de acesso
(Registradores são muito mais rápidos que a RAM).
Na atividade 8, dentro processo de se executar um instrução a função do
IP (Instruction Pointer) é armazenar o endereço (da memória RAM) da próxima
instrução a se executada pela ULA.
Na atividade 9, a frase “Para o RISC, quanto menor, melhor” faz uma
alusão à filosofia de fabricação de processadores RISC, que é direcionada ao
www.cliqueapostilas.com.br
AULA 2 • COMPUTAçãO BÁSICA
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 35
projeto do menor número de micro instruções possível para alcançar, com isso,
maior performance (velocidade) de execução.
Na atividade 10, embora o padrão RISC seja mais rápido do que o padrão
CISC, os processadores CISC da Intel facilitam a vida dos desenvolvedores de
software devido ao grande leque de instruções disponíveis, bem como ao prin-
cípio a retro compatibilidade empregado pela empresa, que preza pelo fato
de um programa, construído uma única vez, poder executar em futuras versões
de seu processador CISC.
Referência
TANENBAUM, Andrew S. Organização estruturada de computadores. São
Paulo: Prentice Hall, 2007.
Na próxima aula
Agora que você já compreendeu detalhes importantes sobre a arquitetura
de computadores modernos (sua estrutura física) e conheceu detalhes de seus
componentes internos, você está pronto para se aprofundar na maneira como
o computador armazena suas informações, ou seja, utilizando-se do sistema de
numeração binário. Também verá a importância da conversão inter-sistemas
numéricos, principalmente entre o sistema binário (usado pelo computador) e
o sistema decimal (usado pelo homem).
Anotações
www.cliqueapostilas.com.br
AULA 2 • COMPUTAçãO BÁSICA
36 1º PERÍODO • ANÁLISEE DESENVOLVIMENTO DE SISTEMAS • UNITINS
www.cliqueapostilas.com.br
AULA 3 • COMPUTAçãO BÁSICA
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 37
Objetivo
Esperamos que, ao final desta aula, você seja capaz de:
compreender os sistemas de representação numérica de base 2, 8, 10 •
e 16 e suas conversões.
Pré-requisitos
Para iniciar os estudos desta aula, é importante conhecer a história da
computação, estudado na primeira aula deste caderno, para que fique mais
clara a necessidade e a importância dos sistemas posicionais de numeração.
Também se faz necessário ter noções dos componentes básicos do compu-
tador, conteúdos vistos na aula dois, uma vez que são eles que fazem uso de
uma das representações que será estudada nesta aula: o sistema binário.
Introdução
Ao longo da evolução humana, desde os primórdios, quantificar coisas,
objetos, rebanhos, entre outros, emergiu como uma necessidade. Assim, os
números se tornaram presentes, desde cedo, na civilização.
Entretanto a representação numérica da forma como a conhecemos hoje
não é uma invenção que apareceu de um dia para o outro e nem conseqüência
de uma única mente inventiva. A utilização dos dedos da mão para representar
quantidade, ou seja, alguma grandeza numérica, talvez seja a primeira forma
que apareceu. Hoje em dia parece natural essa forma de representação, afinal
é comum vermos crianças indicarem suas idades com os dedos da mão.
Pedras, nós em cordas, marcas em um osso e símbolos unitários pintados
nas paredes de cavernas também são outras formas de representação numérica.
Imagine-se nas cavernas representando o número quinze nas paredes desta forma:
| | | | | | | | | | | | | | |. É fácil perceber que é uma tarefa exaustiva.
Aula 3
Sistemas posicionais
de numeração
www.cliqueapostilas.com.br
AULA 3 • COMPUTAçãO BÁSICA
38 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Um pouco mais adiante na história, apareceram os números romanos (até
hoje utilizados para referenciar séculos) utilizado em todo o império romano.
Nessa forma de representação, ou nesse sistema numérico, letras são os
símbolos utilizados para representar quantidades. Nesse sentido, cada letra
representa uma quantidade pré-definida. Veja exemplos na tabela 1.
Tabela 1 – Exemplos de números representados no sistema numérico romano
ROMANA REPRESENTAçãO
I Um
II Dois
III Três
IV Quatro
V Cinco
IX Nove
X Dez
C Cem
CXVI Cento e dezesseis
D Quinhentos
DCXX Seiscentos e vinte
M Mil
MMVIII Dois mil e oito
Contudo o sistema romano, apesar de amplamente utilizado pelo império,
é um sistema numérico que apresenta deficiências em operações aritméticas.
Outras formas de representações surgiram ao longo da civilização. Entre essas
outras formas, surgiram os algarismos arábicos. Segundo Weber (2004), com
os seguintes símbolos (0, 1, 2, 3, 4, 5, 6, 7, 8, 9):
٠, ٩, ٨, ٧, ٦, ٥, ٤, ٣, ٢, ١
Note que nessa representação (ao contrário da romana) aparece o número
zero, uma invenção indo-arábica das mais importantes da humanidade. Nessa
forma de representação numérica, dez símbolos diferentes são utilizados para
se representar qualquer número natural. Esse sistema numérico é o mais ampla-
mente conhecido e utilizado atualmente e é conhecido como sistema decimal
ou sistema numérico posicional de base 10.
Além dos sistema decimal, outros sistemas numéricos se destacam e são
importantes para a computação: o binário (sistema numérico posicional de
base 2), o octal (sistema numérico posicional de base 8) e o hexadecimal
(sistema numérico posicional de base 16).
www.cliqueapostilas.com.br
AULA 3 • COMPUTAçãO BÁSICA
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 39
Mas você já parou para pensar e tentar descobrir o porquê da popula-
rização da sistema de base 10 em relação aos dos demais tipos de base?
A resposta é simples. Lembra-se de que no início da aula foi exposto que os
dedos talvez tenha sido a primeira forma de representação numérica pelo
ser humano e é uma representação natural? Pois bem, a reposta está aí. O
sistema decimal se destaca exatamente porque o ser humano tem 10 dedos.
Ao contrário do que muita gente pensa, de que o sistema decimal é mais
fácil de se trabalhar, os demais sistemas funcionam exatamente iguais aos de
base 10. Entretanto podemos achar mais simples o decimal exatamente por
estarmos acostumados desde criança com essa forma de representação.
Como veremos a seguir, todas as representações posicionais são regidas
por uma única lei: lei de formação.
Vejamos como se compoe um número pela lei de formação:
Número = an ∙ b
n + an-1 ∙ b
n-1 + an-2 ∙ b
n-2 + ... + a0 ∙ b
0
em que:
b = base do número (exemplo: base 2, 8, 10 e 16)
n = quantidade de algarismos - 1
an = algarismos de acordo com sua posição (daí o nome sistema posicional)
Exemplo
O número 1982 no sistema decimal é composto por 1 milhar, 9 centenas,
8 dezenas e 2 unidades.
1000 + 900 + 80 + 2 = 1982
Esse número pode ser decomposto também da seguinte maneira:
1982 = 1000 + 900 + 80 + 2
= 1x1000 + 9x100 + 8x10 + 2x1
= 1x103 + 9x102 + 8x101 + 2x100
Note que a última linha é a representação do número 1982 no sistema
decimal pela lei de formação. Nesse sentido, a idéia é adotar pesos dife-
rentes para posições diferentes de algarismos (idéia de representação posi-
cional). Assim, quanto mais à esquerda, maior seu peso, sempre 10 (base)
vezes maior.
www.cliqueapostilas.com.br
AULA 3 • COMPUTAçãO BÁSICA
40 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
3.1 Sistema binário (Base 2)
Vimos que o sistema decimal (base 10) utiliza dez símbolos diferentes
para representar qualquer número natural. No sistema binário, como o próprio
nome diz, existem apenas 2 símbolos para se representar: 0 (zero) e 1 (um).
Como já foi exposto anteriormente, o sistema binário obedece à lei de
formação. Vejamos.
O número 1001, no sistema binário, de acordo com a
lei de formação, é composto da seguinte forma:
1 = 1x23 + 0x22 + 0x21 + 1x20
O número 11011, no sistema binário, de acordo com a
lei de formação, é composto da seguinte forma:
11011 = 1x24 + 1x23 + 0x22 + 1x21 + 1x20
Idoeta e Capuano (1998, p. 2) expõem que, no sistema binário
para representarmos a quantidade zero, utilizamos o algarismo
0, para representarmos a quantidade um, utilizamos o alga-
rismo 1. E para representarmos a quantidade dois, se nós não
possuímos o algarismo 2 nesse sistema? É simples. No sistema
decimal, nós não possuímos o algarismo dez e representamos
a quantidade de uma dezena utilizando o algarismo 1 seguido
do algarismo 0. Neste caso, o algarismo 1 significa que temos
um grupo de uma dezena e o algarismo 0 nenhuma unidade,
o que significa dez.
Essa mesma idéia está presente também no sistema binário, proveniente da
lei de formação. Para se representar o número dois, é utilizado o algarismo 1
seguido do algarismo 0. Assim, o algarismo 1 representa dois elementos (base 2
ao invés de 10 do sistema decimal) e 0 representa nenhuma unidade.
Ao contrário do decimal, em que cada posição de algarismo recebe um
nome (unidade, dezena, centena, milhar, etc), no binário cada algarismo é
chamado de bit (binary digit – dígito binário, em português). As denominações
no sistema binário aparecem pela quantidade de bits. Veja tabela 2.
Tabela 2 – Nibble, Byte, Word
BITS DENOMINAçãO
4 Nibble
8 Byte
16 Word
www.cliqueapostilas.com.br
AULA 3 • COMPUTAçãO BÁSICA
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 41
Gates (1995) apresenta uma forma diferente, no intuito de facilitar
o entendimento, sobre o sistemanumérico binário. Gates introduz uma
idéia diferente de como iluminar um ambiente. Imagine um quarto com
uma única lâmpada de 250 watts. Contudo suponha que, ao invés de
uma, o quarto tenha 8 lâmpadas de menor intensidade (de 1 a 128
watts). Veja figura 1.
Lâmpada
de 128
watts
Lâmpada
de 64
watts
Lâmpada
de 32
watts
Lâmpada
de 16
watts
Lâmpada
de 8
watts
Lâmpada
de 4
watts
Lâmpada
de 2
watts
Lâmpada
de 1
watts
interruptor interruptor interruptor interruptor interruptor interruptor interruptor interruptor
Figura 1 – Lâmpadas de intensidade diferentes com seus interruptores
Fonte: Gates (1995).
No ambiente, há um interruptor para cada lâmpada e elas são arranjadas
em ordem crescente de potência da direita para a esquerda, ou seja, a de
maior potência está mais à esquerda e a de menor mais à direita (note que é a
mesma idéia dos pesos da lei de formação). Dessa forma, ao ligar e desligar
os interruptores, é possível ajustar a iluminação do ambiente.
Se quiser somente 1 watt de luz, liga só o interruptor mais à direita. Se
quiser 191 watts, liga todos os interruptores, com exceção do da lâmpada
de 64 watts. Assim como se você quiser ajustar o nível de iluminação em
137 watts, ligam-se as lâmpadas de 128, 8 e 1 watts, como representado
na figura 2.
Lâmpada
de 128
watts
Lâmpada
de 64
watts
Lâmpada
de 32
watts
Lâmpada
de 16
watts
Lâmpada
de 8
watts
Lâmpada
de 4
watts
Lâmpada
de 2
watts
Lâmpada
de 1
watts
interruptor interruptor interruptor interruptor interruptor interruptor interruptor interruptor
Figura 2 – Interruptores ajustados para produzir 137 watts
Fonte: Gates (1995).
www.cliqueapostilas.com.br
AULA 3 • COMPUTAçãO BÁSICA
42 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Gates (1995, p. 41) complementa que
para encurtar ainda mais a notação, você pode registrar cada
“desligado” com 0 e cada “ligado”com 1. O que significa
que, em vez de escrever “ligado, desligado, desligado, desli-
gado, ligado, desligado, desligado, ligado”, vale dizer, ligue
a primeira, a quarta e a oitava das oito lâmpadas e deixe
as outras desligadas, você escreve a mesma informação como
1, 0, 0, 0, 1, 0, 0,1, 1 ou 10001001, um número binário. No
caso, é 137.
A idéia de ligar e desligar interruptores é a que está por trás do sistema
binário, como vimos. A princípio pode até parecer complicado, mas no
sistema decimal essa mesma idéia é utilizada, regida pela lei de formação.
3.2 Sistema octal (Base 8)
O sistema octal, intuitivamente, nos induz que nesse sistema de numeração
existem oito símbolos diferentes para se representar qualquer número natural,
são eles: 0, 1, 2, 3, 4, 5, 6 e 7.
O sistema octal também obedece à lei de formação. Vejamos.
O número 735 no sistema octal, de acordo com a lei
de formação, é composto da seguinte forma:
735 = 7x82 + 3x81 + 5x80
3.3 Sistema hexadecimal (Base 16)
O sistema hexadecimal possui 16 símbolos de representações. Como já
vimos, os algarismos arábicos são apenas dez e, sendo assim, faltam ainda
seis algarismos. Desse modo, o sistema hexadecimal fica constituído pelos
seguintes símbolos ordenados crescentemente:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F
Note que A=10, B=11, C=12, D=13, E=14 e F=15. Lourenço e outros
(1996, p. 7) dizem que “outros símbolos poderiam ser utilizados para repre-
sentar as quantidades maiores que 9, porém, as letras foram escolhidas pela
facilidade de manuseio”.
A lei de formação também rege o sistema hexadecimal, uma vez que ele
também é um sistema de representação posicional.
www.cliqueapostilas.com.br
AULA 3 • COMPUTAçãO BÁSICA
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 43
Exemplo
O número A29F no sistema hexadecimal, de acordo com a lei de formação, é
composto da seguinte forma:
A29F = Ax163 + 2x162 + 9x161 + Fx160
10x163 + 2x162 + 9x161 + 15x160
3.4 Padrões de representação
De acordo com Lourenço e outros (1996), existem vários padrões para se
representar os números em diferentes bases. Os mais comuns são:
utilizar uma letra após o número para indicar a base;•
colocar o número entre parênteses e a base como um índice do número.•
Exemplos
Sistema decimal: 1673D ou (1673)10
Sistema binário: 1001B ou (135)2
Sistema octal: 753O ou (753)8
Sistema hexadecimal: F3AH ou (F3A)16
3.5 Tabela de conversão entre bases
Já vimos a idéia de alguns dos principais sistemas de representação posi-
cional de números: decimal, binário, octal e hexadecimal. Conhecer suas equi-
valências é de extrema importância para as conversões que serão estudadas
mais adiante e são apresentadas na tabela 3.
Tabela 3 – Tabela de equivalência entre as bases 2, 8, 10 e 16
BASE 10 BASE 2 BASE 8 BASE 16
0 0 0 0
1 1 1 1
2 10 2 2
3 11 3 3
4 100 4 4
5 101 5 5
6 110 6 6
7 111 7 7
8 1000 10 8
9 1001 11 9
10 1010 12 A
11 1011 13 B
12 1100 14 C
13 1101 15 D
14 1110 16 E
15 1111 17 F
www.cliqueapostilas.com.br
AULA 3 • COMPUTAçãO BÁSICA
44 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Faz-se necessário acrescentar que, assim como no sistema decimal, adicio-
nando-se zeros à esquerda de um número em qualquer outra base, seu valor
não é alterado.
Exemplos
a) 43610 = 043610 = 0043610 = 00043510
b) 111012 = 0111012 = 00111012 = 000111012
c) 6178 = 06178 = 006178 = 0006178
d) F4316 = 0F4316 = 00F4316 = 000F4316
3.6 Conversões de qualquer base para a base 10
Para se converter um número de qualquer representação posicional para a
base 10, basta aplicar a lei de formação, substituindo b pela base do número
a ser converto e an por seus algarismos.
Exemplos
(11011)2:
b = 2 (base do número)
n = 5 – 1 = 5 (quantidade de algarismos – 1)
1x24 + 1x23 + 0x22 + 1x21 + 1x20
16 + 8 + 0 + 2 + 1 = (27)10
(3D9)16:
b = 16 (base do número)
n = 3 – 1 = 2 (quantidade de algarismos – 1)
3x162 + Dx161 + 9x160
3x162 + 13x161 + 9x160
768 + 208 + 9 = (985)10
3.7 Conversão da base 2 para qualquer base
Acabamos de ver que, para se converter um número de qualquer base para
o sistema decimal, é utilizada a lei de formação que são, basicamente, suces-
sivas multiplicações dos algarismos por seus pesos. Agora queremos o inverso,
do sistema decimal para as demais bases. Sendo assim, precisamos realizar a
operação matemática inversa que utilizamos anteriormente, ou seja, a divisão.
www.cliqueapostilas.com.br
AULA 3 • COMPUTAçãO BÁSICA
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 45
Lourenço e outros (1996, p. 9) dizem que
dado um número inteiro escrito na base 10, para se obter seu
equivalente em uma base b qualquer, divide-se o número por
b tantas vezes quantas necessárias para que o quociente da
divisão seja menor que b. O último quociente da divisão e
os restos das divisões sucessivas, tomados na ordem inversa,
correspondem ao número na base b.
Exemplo
(125)10 : ( ? )2
125 ÷ 2 = 62 e resto = 1
62 ÷ 2 = 31 e resto = 0
31 ÷ 2 = 15 e resto = 1
15 ÷ 2 = 7 e resto = 1
7 ÷ 2 = 3 e resto = 1
3 ÷ 2 = 1 e resto = 1
1 < 2 (base desejada)
Quando o quociente é menor que a base desejada, pára de se efetuar as
divisões. O resultado da conversão é o último quociente concatenado com os
restos das divisões do fim para o começo. Dessa forma, obtém (1111101)2.O
mesmo exemplo anterior por ser visto na figura 3.
125 2
1 62 2
0 31 2
1 15 2
1 7 2
1 3 2
1 1
sentido da leitura
(125)10 = (1111101)2
Figura 3 – Exemplo de múltiplas divisões na conversão do número (125)10 para a base 2
Fonte: Lourenço e outros (1996).
www.cliqueapostilas.com.br
AULA 3 • COMPUTAçãO BÁSICA
46 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
3.8 Conversão entre base 2 e 16
A conversãoentre os sistemas binário e hexadecimal pode ser feita direta-
mente, sem a necessidade de operações aritméticas. Isso ocorre porque existe
uma estreita relação entre esses dois sistemas posicionais de representação.
Afinal, o número 16 (base do sistema hexadecimal) pode ser expresso como 24
(repare o dois do sistema binário na base). Ou seja, os números hexadecimais
podem ser vistos como uma representação compacta dos números binários. A
conversão da base 2 para a base 16 é realizada da seguinte forma:
segmenta-se o número em parte de 4 (repare que quatro é a potência •
de 24) algarismos da direita para a esquerda;
cada segmento é convertido diretamente para o seu equivalente em •
hexadecimal (de acordo com a tabela 3).
Exemplo
(1010011011)2
0010 1001 1011
2 9 B
A conversão da base 16 para a base 2 é realizada da seguinte forma:
cada algarismo hexadecimal é convertido diretamente para o seu •
equivalente em binário com quatro bits (de acordo com a tabela 3).
Exemplo
(54B)16
5 4 B
0101 0100 1011
3.9 Conversão entre as bases 2 e 8
A conversão entre as bases 2 e 8 também pode ocorrer diretamente, assim
como entre as bases 2 e 16. Isso porque também há uma relação entre essas
duas bases, afinal 8 também pode ser reescrito como 23. A conversão é direta,
contudo, ao invés de se formar grupos de quatro algarismos, formam-se grupos
de três algarismos.
www.cliqueapostilas.com.br
AULA 3 • COMPUTAçãO BÁSICA
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 47
Exemplo
(1010011011)2
001 010 011 011
1 2 3 3
Por outro lado, a conversão de um número octal em binário procede-se
de modo idêntico ao da conversão da base 16 para a base 2. Assim, cada
algarismo octal é convertido diretamente para o seu equivalente em binário de
três bits (de acordo com a tabela 3).
Exemplo
(543)8
5 4 3
101 100 011
3.10 Conversão entre as bases 8 e 16
Falta apenas vermos mais uma conversão entre as bases analisadas. Para
converter um número octal em hexadecimal é preciso realizar um passo interme-
diário por meio do sistema binário. É simples de enxergar isso, uma vez que não
conseguimos reescrever o número 16 na base 8 elevado a alguma potência.
Contudo ambos podem ser reescritos respectivamente como 24 e 23, tendo ambos
como base 2, ou seja, podem ser reduzidos diretamente para o sistema binário.
Exemplo
(543)8
5 4 3
101 100 011
Encontrado o binário, realiza-se a conversão da base 2
para a base 16.
0001 0110 0011
1 6 3
www.cliqueapostilas.com.br
AULA 3 • COMPUTAçãO BÁSICA
48 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Na conversão de hexadecimal para octal, também é necessário um passo
intermediário em que se utiliza o sistema binário. Assim, converte-se o número
da base 16 para a base 2 e, em seguida, este para a base 8.
Exemplo
(1F4B)16
1 F 4 B
0001 1111 0100 1011
Encontrado o binário, se realiza a conversão da base 2 para a base 8.
001 111 101 001 011
1 7 5 1 3
3.11 Conversão de números fracionários
Os números fracionários também podem ser representados nas bases 2, 8
e 16. Afinal, esses números podem ser representados na base 10. Para isso,
basta ampliar a aplicação da lei de formação:
Número = anb
n + an–1b
n–1 + an–2b
n–2 + ... + a0b
0 + a–1b
–1 + a–2b
–2 + ... + a–mb
–m
Parte inteira Parte fracionária
em que:
b = base do número (exemplo: base 2, 8, 10 e 16).
n = quantidade de algarismos da parte inteira – 1.
an = algarismos de acordo com sua posição.
m = quantidade de algarismos da parte fracionária.
Vejamos alguns exemplos de conversão de números fracionários de outras
bases para a base 10.
a) Base 2 para base 10
1101,0112 = 1 x 2
3 + 1 x 22 + 0 x 21 + 1 x 20 + 0 x 2-1 + 1 x 2-2 + 1 x 2-3
= 8 + 4 + 0 + 1 + (0/2) + (1/4) + (1/8) = 13,37510
www.cliqueapostilas.com.br
AULA 3 • COMPUTAçãO BÁSICA
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 49
b) Base 8 para base 10
51,348 = 5 x 8
1 + 1 x 80 + 3 x 8-1 + 4 x 8-2
= 40 + 1 + (3/8) + (4/64) = 41,437510
c) Base 16 para base 10
1F,5C016 = 1 x 16
1 + 15 x 160 + 5 x 16-1 + 12 x 16-2 + 0 x 16-3
= 1 + 15 + (5/16) + (12/256) + (0/4096) = 16,35937510
A conversão da base 10 para as bases 2, 8 e 16 é um pouco diferente da
parte fracionária. A parte inteira é convertida separadamente pelas divisões
sucessivas. Para a parte fracionária, utiliza-se o processo das multiplicações
sucessivas pela base desejada.
Exemplos
a) Base 10 para a base 2
7,42710 = parte inteira: 1112
parte fracionária:
0,25 0,50 0,0 FINAL
x 2 x 2
0,50 1,0
0 1
7,42710 = 111,012
b) Base 10 para a base 2 (dízima periódica)
6,410 = parte inteira: 1102
parte fracionária:
0,4 x 2 = 0,8 0
0,8 x 2 = 1,6 1
Repetição 0,6 x 2 = 1,2 1
0,2 x 2 = 0,4 0
0,4 x 2 = 1,8 1
6,410 = 110,01100110011001100110...2
www.cliqueapostilas.com.br
AULA 3 • COMPUTAçãO BÁSICA
50 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
c) Base 10 para a base 8
26,210 = parte inteira: 328
parte fracionária: 146314361...8 (dízima periódica)
0,2 x 8 = 1,6 1
0, 6 x 8 = 4,8 4
0,8 x 8 = 6,4 6
0,4 x 8 = 3,2 3
0,2 x 8 = 1,6 1
d) Base 10 para a base 16
69,124610 = parte inteira: 4516
parte fracionária: 1FE516... (não periódica)
Estamos chegando ao fim desta aula, em que expusemos que existem
vários sistemas de numeração. Dentre os sistemas de numeração, os de repre-
sentação posicional (atribuição de pesos para cada posição de algarismo) se
destacam pela facilidade de realização de operações aritméticas, que serão
estudadas na próxima aula.
Síntese da aula
O ser humano desde sempre teve a necessidade de quantificar coisas, por
isso a importância de sistemas numéricos. Além disso, com as representações
numéricas torna-se possível realizar tarefas antes complexas de forma trivial.
Dentre as várias formas de representações, destacam-se a decimal (com dez
símbolos de representações), a binária (com dois símbolos) – amplamente
utilizada nos computadores, a octal (com oito símbolos) e a hexadecimal (com
dezesseis símbolos).
Diante disso, foi explicado durante a aula como se realizar conversões
entre essas quatro formas de representação, que obedecem a uma única
lei: a lei de formação. Basicamente, a lei de formação atribui pesos para
as posições de cada algarismo de um número (idéia de sistema posicional).
Por fim, foi apresentado como se representar números fracionários nas bases
2, 8 e 16.
www.cliqueapostilas.com.br
AULA 3 • COMPUTAçãO BÁSICA
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 51
Atividades
1. Realize a conversão dos números a seguir de acordo com as bases
indicadas.
a) (F46A)16 = ( ? )10 c) (1001101)2 = ( ? )16
b) (295)10 = ( ? )2 d) (1A42)16 = ( ? )8
e) (765)8 = ( ? )10 g) (101,001)2 = ( ? )10
f) (1024)10 = ( ? )16 h) (B1,5)16 = ( ? )10
2. Leia as afirmativas a seguir sobre conversão de bases.
I. O número (765)10, (765)8 e (765)16 são iguais.
II. O número (11001110)2 é maior que (D1)16.
III. Os números (11101010)2 e (504C)16 são números pares.
Assinale a alternativa correta:
a) Somente I é verdadeira.
b) Somente II é falsa.
c) Somente III é verdadeira.
d) Todas as alternativas são verdadeiras.
Comentário das atividades
Na atividade 1, basta utilizar as conversões vistas durante a esta aula.
Assim, as respostas corretas são (F46A)16 = (62570)10, (295)10 = (100100111)2,
(1001101)2 = (4D)16, (1A42)16 = (15102)8, (765)8 = (501)10, (1024)10 =
(400)16, (101,001)2 = (5,125)10, (B1,5)16 = (177,8)10.
Já na atividade 2, a resposta correta é a letra (c). O item (I) é falso porque
(765)10 = (1375) 8 = (2FD)16. Já no item (II), o número (11001110)2 = 206 é
menor que (D1)16 = (209)10, por issoé falsa. O item (III) é o único verdadeiro,
pois (11101010)2 = (234)10 e (504C)16 = (20556)10. É necessário acrescentar
que todo número binário terminado em 0 é par, assim como todo número octal
terminado em 0, 2, 4 e 6, decimal terminado em 0, 2, 4, 6 e 8, e hexadecimal
terminado em 0, 2, 4, 6, 8, A, C, E são pares. Os demais são ímpares. Se
você conseguiu resolver estas atividades significa que compreendeu os sistemas
de representação numérica de base 2, 8, 10 e 16 e suas conversões, que é o
objetivo desta aula.
www.cliqueapostilas.com.br
AULA 3 • COMPUTAçãO BÁSICA
52 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Referências
GATES, Bill. A estrada do futuro. São Paulo: Companhia das Letras, 1995.
IDOETA, Ivan V.; CAPUANO, Francisco G. Elementos de eletrônica digital.
28. ed. São Paulo: Érica, 1998.
LOURENÇO, Antonio C.; CRUZ, Eduardo C. A.; FERREIRA, Sabrina R.;
CHOUERI JÚNIOR, Salomão. Circuitos digitais. São Paulo: Érica, 1996.
WEBER, Raul F. Fundamentos de arquitetura de computadores. 3. ed. Porto
Alegre: Sagra Luzzatto, 2004.
Na próxima aula
Estudaremos as operações aritméticas no sistema binário e, assim, daremos
continuidade ao que foi visto nesta aula, mas em uma abordagem de opera-
ções matemáticas.
Anotações
www.cliqueapostilas.com.br
AULA 4 • COMPUTAçãO BÁSICA
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 53
Objetivo
Esperamos que, ao final desta aula, você seja capaz de:
realizar as operações aritméticas no sistema binário de numeração •
utilizando números inteiros e de ponto flutuante.
Pré-requisitos
Para iniciarmos os estudos sobre operações aritméticas no sistema binário
de numeração, é de suma importância o conhecimento dos sistemas posicio-
nais de numeração, vistos na aula 3. O sistema binário é um dos sistemas
posicionais de numeração, por isso a necessidade de estar familiarizado com
esse tipo de sistema numérico.
Introdução
O sistema binário é um sistema de numeração posicional representado, em
que todos os número são representados pelo conjunto de caracteres formados
apenas por dois símbolos, 0 (zero) e 1 (um).
Os computadores digitais trabalham internamente com esse tipo de sistema,
que também são denominamos como bits e podem representar qualquer tipo de
número armazenado na memória. Esses números podem representar inteiros,
ponto flutuante, negativos ou positivos.
A manipulação desses números por meio de aritmética simples e por meio
de aritmética de ponto-flutuante é realizada utilizando algoritmos diversos, os
quais serão apresentados durante esta aula.
4.1 Aritmética em sistemas binários
Os números podem ser representados utilizando qualquer base, seja ela
binária, octal, decimal, hexadecimal ou outra qualquer. Para a computação
Aula 4
Operações aritméticas no
sistema binário de numeração
www.cliqueapostilas.com.br
AULA 4 • COMPUTAçãO BÁSICA
54 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
o sistema binário é o mais adequado devido à facilidade de implemen-
tação via hardware dos símbolos que representam esse sistema por meio de
circuitos lógicos.
No sistema binário, as operações aritméticas podem ser estendidas dire-
tamente do mecanismo de cálculo utilizado no sistema decimal, que é mais
comum para os seres humanos.
4.2 Notação de números binários positivos e negativos
Em aplicações práticas, os números binários devem ser representados com
sinal. Uma maneira de fazer isso é adicionar um bit de sinal ao número. Esse
bit é adicionado à esquerda do número. Se for 0, o número em questão é posi-
tivo; caso seja 1, o número é negativo.
Outra forma de representação de números negativos bastante utilizada é o
complemento de 2. Para obtermos o complemento de 2 de um número binário,
precisamos inicialmente converter o número em seu complemento de 1. O
complemento de 1 de um número binário obtém-se trocando cada bit pelo seu
complemento. A seguir, soma-se 1 ao complemento de 1, obtendo-se assim o
complemento de 2.
Um exemplo de notação em complemento de 2 é descrita na tabela 1.
Tabela 1 – Complementos de 1 e de 2
BINÁRIO COMPLEMENTO DE 1 COMPLEMENTO DE 2
11100110 00011001 00011010
10100010 01011101 01011110
00100100 11011011 11011100
4.3 Adição em sistemas binários
Na adição, os números são somados um a um da direita pra esquerda
com os carries (vai 1) sendo passados para o próximo bit à esquerda. A tabela
básica para soma de binários está ilustrada na tabela 2.
Tabela 2 – Tabela básica da operação binária de adição
PRIMEIRO OPERANDO SEGUNDO OPERANDO RESULTADO DA ADIçãO
0 0 0
0 1 1
1 0 1
1 1 0, e vai 1
www.cliqueapostilas.com.br
AULA 4 • COMPUTAçãO BÁSICA
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 55
Se um carry ocorre no bit mais significativo, é gerada uma nova posição
à esquerda do último bit, semelhante à aritmética decimal. A figura 1 ilustra
uma simples adição, e a figura 2, uma adição em que ocorre carry no bit
mais significativo.
(vai um) 1 1
6 = 0 1 1 0
+ 7 = 0 1 1 1
13 = 1 1 0 1
Figura 1: Operação de adição com carries ocorrendo antes do bit mais significativo
(vai um) 1 1 1
10 = 0 1 0 1 0
+ 7 = 0 0 1 1 1
17 = 1 0 0 0 1
Figura 2: Operação de adição com carry ocorrendo no bit mais significativo
No caso da operação de adição gerar um carry no bit mais significativo,
acontece o que chamamos de overflow.
Overflow ocorre quando somamos dois operandos positivos e
obtemos um resultado negativo, ou vice-versa (CASTRO, 2005).
Na operação de adição em números com notação em complemento de 2,
somam-se os dois números e descarta-se o carry. Vejamos o exemplo demons-
trado na figura 3.
(vai um) 1 1 1 1 1 1
15 = 0 0 0 0 1 1 1 1
- 6 = 1 1 1 1 1 0 1 0
9 = 1* 0 0 0 0 1 0 0 1
Figura 3: Soma de números binários em complemento de 2 (*Carry descartado)
4.4 Subtração em sistemas binários
A subtração utiliza também os mesmos princípios da operação reali-
zada em sistemas decimais. Na tabela 3, exemplificamos a tabela básica de
subtração em números binários.
www.cliqueapostilas.com.br
AULA 4 • COMPUTAçãO BÁSICA
56 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Tabela 3 – Tabela básica da operação binária de subtração
PRIMEIRO OPERANDO SEGUNDO OPERANDO RESULTADO DA SUBTRAçãO
0 0 0
0 1
1, vai 1 para ser subtraído no
dígito seguinte
1 0 1
1 1 0
Para exemplificar melhor, mostraremos um exemplo descrito na figura 4.
* * *
14 = 1 1 1 0
–7 = 0 1 1 1
7 = 0 1 1 1
Figura 4: Operação de subtração entre dois números
Quando temos 0 menos 1, precisamos “pedir emprestado” do elemento
vizinho. Esse empréstimo vem valendo 2 (dois), pelo fato de ser um número
binário (10). Então, no caso da coluna 0 – 1 = 1, a operação realizada na
verdade foi 2 – 1 = 1. Esse processo se repete e o elemento que cedeu o
empréstimo e valia 1 passa a valer 0. Os asteriscos marcam os elementos
que emprestaram para seus vizinhos. Quando acontecer de o número que
emprestará não poder emprestar para ninguém, então o pedido passa para o
próximo elemento e esse zero recebe o valor de 1.
A maneira mais eficiente de se implementar a subtração é utilizando a
notação binária com complemento de dois. Assim, ao invés de implementarmos
a subtração, faz-se o complemento de dois no minuendo e soma-se os dois
valores. Um exemplo dessa característica da subtração de números binários é
a mostrada na figura 5.
7 = 00111
2 = 00010
7 – 2 => 00111 – 00010 => 00111 + (11101 + 00001) => 00111 +
11110 => 100101
Figura 5: Subtração utilizando notação de complemento de dois.
4.5 Multiplicação em sistemas binários
A multiplicação é realizada por meio dos mesmos métodos do sistemadecimal, a única diferença é no momento de somar os termos resultantes da
operação, o qual obedece às regras da adição de números binários.
www.cliqueapostilas.com.br
AULA 4 • COMPUTAçãO BÁSICA
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 57
Na figura 6 é mostrado um exemplo de como se comporta a multiplicação
de dois números.
1 0 1 1 Multiplicando
X 1 0 1 0 Multiplicador
0 0 0 0
+ 1 0 1 1
+ 0 0 0 0
+ 1 0 1 1
1 1 0 1 1 1 0
Figura 6: Exemplo de multiplicação com binários
A tabela básica para multiplicação de números binários é mostrada na
tabela 4.
Tabela 4 – Tabela básica da operação binária de multiplicação
PRIMEIRO
OPERANDO
SEGUNDO
OPERANDO
RESULTADO DA
MULTIPLICAçãO
0 0 0
0 1 0
1 0 0
1 1 1
Uma observação importante a respeito da multiplicação de números biná-
rios é que os números de bits do produto final é maior do que o número de
bits do multiplicando ou do multiplicador, como fica evidente na figura 4. Além
disso, a multiplicação também precisa tratar a ocorrência do overflow.
Castro (2005), levando em consideração os dígitos binários 0 e 1,
diz que temos apenas duas possibilidades de escolha, a cada passo da
multiplicação:
coloque uma cópia do multiplicando no lugar apropriado, se o dígito •
do multiplicador for igual a 1;
coloque 0 no lugar apropriado, se o dígito do multiplicador for igual a 0.•
Considerando isso, Castro (2005) diz que é necessário desenvolver um
algoritmo em hardware que seja eficiente para realizar a multiplicação.
Um método elegante de multiplicar números com sinal recebeu o nome de
Algoritmo de Booth. O Algoritmo de Booth funciona com base em que a partir
do momento que você pode adicionar ou subtrair números binários, você pode
chegar a um produto qualquer.
www.cliqueapostilas.com.br
AULA 4 • COMPUTAçãO BÁSICA
58 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
O algoritmo utiliza a notação em complemento de 2 e foi inventado em
1951 por Andrew D. Booth, enquanto fazia cristalografia no Colégio Birkbeck,
em Bloomsbury, Londres.
4.6 Divisão em sistemas binários
A divisão em sistemas binários é feita utilizando-se das mesmas técnicas
dos outros sistemas, bastando para isso obedecer a algumas regras na hora
da subtração.
Na divisão do número 6 pelo número 2, temos a operação mostrada na
figura 7, na qual o quociente é 3.
1 1 0 1 0
– 1 0 1 1
0 1 0
– 1 0
0 0
Figura 7: Exemplo de divisão com binários
4.7 Aritmética de ponto-flutuante
Números de ponto-flutuante normalmente são difíceis de serem repre-
sentados computacionalmente, pois os mesmos podem ser muito extensos ou
podem ser infinitos.
As operações aritméticas utilizando números de ponto-flutuante são muito
onerosos e, por isso, foi necessário implementá-los em hardware para que
pudessem ter um desempenho aceitável.
Mano (1998) descreve os algoritmos que podem ser utilizados nas opera-
ções aritméticas de ponto flutuante, pois como muitos computadores não
possuem a aritmética de ponto-flutuante implementada em hardware, é preciso
tratá-la via software. Os algoritmos são os a seguir.
4.7.1 Soma e subtração
Verifica-se se uma das mantissas a operar é zero; caso afirmativo:
se for uma soma e uma das parcelas for zero – o resultado é igual a •
outra parcela;
se for uma subtração e o subtraendo for zero – o resultado é igual ao •
minuendo;
www.cliqueapostilas.com.br
AULA 4 • COMPUTAçãO BÁSICA
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 59
se for uma subtração e o minuendo for zero – o resultado é igual ao •
subtraendo, com o sinal invertido.
Se não houver zeros:
reduzir ao mesmo expoente (o maior);•
somar / subtrair as mantissas;•
normalizar o resultado.•
4.7.2 Multiplicação
Verifica-se se uma das mantissas a operar é zero; caso afirmativo, o resul-
tado é zero.
Se não houver zeros:
somar os expoentes;•
multiplicar as mantissas;•
normalizar o resultado.•
4.7.3 Divisão
Verifica-se se uma das mantissas a operar é zero; caso afirmativo:
se o divisor é zero, é impossível e dispara uma exceção de divisão •
por zero;
se o dividendo é zero, o resultado é igual a zero.•
Se não houver zeros:
subtrair os expoentes;•
dividir as mantissas;•
normalizar o resultado.•
Para se padronizar a implementação de aritmética de ponto-flutuante em
CPUs, foi criado em 1985 o padrão IEEE 754, o qual está implementado
atualmente na grande maioria das CPUs. O padrão IEEE 754 dita algumas
características citadas em Viana (2005), que são:
a base de representação é a binária;•
as operações devem ser executadas em precisão estendida com uso •
de dígitos de guarda e expoente deslocado;
o uso do expoente deslocado, também chamado característica, tem •
por objetivo eliminar o sinal do expoente.
www.cliqueapostilas.com.br
AULA 4 • COMPUTAçãO BÁSICA
60 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Nas operações aritméticas em ponto-flutuante, após cada operação é
realizado o arredondamento, por isso as operações de adição, subtração,
multiplicação e divisão não associativas nem distributivas.
Além dos erros que podem ser ocasionados por arredondamento, alguns
efeitos afetam a qualidade dos cálculos, como cancelamento, propagação de
erros, instabilidade numérica e mau condicionamento. Esses quatro tipos de
erros são relatados da seguinte forma:
o cancelamento ocorre na subtração de dois números quase iguais, •
pois o expoente permanece o mesmo e os dígitos iniciais são todos
zeros, perdendo-se dígitos significativos do resultado;
a propagação de erros ocorre quando uma ou mais somas parciais •
têm o expoente maior do que a soma final;
a instabilidade numérica ocorre se um resultado intermediário é conta-•
minado por um erro de arredondamento. Esse erro pode influenciar
todos os resultados subseqüentes que dependem desse valor, propa-
gando, assim, os erros de arredondamento;
problemas cujos resultados dependem continuamente dos dados de •
entrada são ditos bem postos, em oposição aos problemas mal postos,
mal condicionados ou críticos.
Síntese da aula
Nesta aula, vimos que as operações aritméticas sobre números binários
obedecem sempre aos mesmos princípios das operações em outras bases.
Pudemos conhecer também alguns algoritmos que possibilitam que as opera-
ções fiquem mais velozes quando implementadas em hardware. Também
vimos, na aula 4, que a aritmética de ponto flutuante é bem mais complicada
e ajuda a entender melhor as dificuldades de desenvolvimento de circuitos
que suportam aritmética de ponto-flutuante. As operações aritméticas sobre
números binários são de extrema importância para os computadores digitais
atuais, pois somente com uma aritmética simples e eficiente podemos chegar a
unidades lógicas e aritméticas aceitáveis.
Atividade
1. Desenvolva as operações aritméticas envolvendo os seguintes números
binários:
www.cliqueapostilas.com.br
AULA 4 • COMPUTAçãO BÁSICA
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 61
a) 01110011 + 01110101
b) 11010001 – 00101111
c) 11011010 * 11010
d) 11011000 / 10
Comentário da atividade
Na atividade 1, trabalharemos a capacidade de o aluno desenvolver as opera-
ções aritméticas básicas utilizando números binários. Os resultados das operações
são os seguintes, utilizando o método de resolução proposto na lição 4:
a) (vai um) 1 1 1 1 1 1
0 1 1 1 0 0 1 1
+ 0 1 1 1 0 1 0 1
1 1 1 0 1 0 0 0
b) (empresta) * * * * *
1 1 0 1 0 0 0 1
– 0 0 1 0 1 1 1 1
1 0 1 0 0 0 1 0
c) 1 1 0 1 1 0 1 0
x 1 1 0 1 0
0 0 0 0 0 0 0 0
+ 1 1 0 1 1 0 1 0
+ 0 0 0 0 0 0 0 0
1 1 0 1 1 0 1 0
+ 1 1 0 1 1 0 1 0
1 0 1 1 0 0 0 1 0 0 1 0 0
d) 1 1 0 1 1 0 0 0 1 0
1 0 1 1 0 1 1 0 0
0 1 0
1 00 0 1 1
1 0
0 1 0
1 0
0 0 0 0
www.cliqueapostilas.com.br
AULA 4 • COMPUTAçãO BÁSICA
62 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Referências
CASTRO, F. C. C. Eletrônica digital. Porto Alegre: PUC-RS, 2002.
CASTRO, M. C. S. Organização de computadores I. Rio de Janeiro: Universidade
do Estado do Rio de Janeiro, 2005.
MANO, R. Representação de dados. Disponível em: <http://wwwusers.rdc.
puc-rio.br/rmano/rd6aritr.html>. Acesso em: 20 dez. 2007.
VIANA, G. V. R. Padrão IEEE 754 para aritmética binária de ponto flutuante.
Fortaleza: Universidade Estadual do Ceará, 2005.
Na próxima aula
Veremos as classificações de software que podem servir para diversos fins.
Anotações
www.cliqueapostilas.com.br
AULA 5 • COMPUTAçãO BÁSICA
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 63
Objetivo
Esperamos que, ao final desta aula, você seja capaz de:
identificar e compreender as características quanto à classificação dos •
softwares livres e proprietários, bem como suas sub-divisões.
Pré-requisitos
Para iniciarmos os estudos sobre as classificações de software, é interes-
sante que tenha sido absorvido todo o conteúdo das aulas anteriores. Isso dará
embasamento teórico para que possam ser interpretados todos os conceitos
e características que serão considerados nesta aula e são de extrema impor-
tância para o mercado.
Introdução
A criação de software, ou como conhecido popularmente programa
para computador, consiste em uma área da ciência da computação muito
importante, em que é considerada a criação de produtos de software por
meio da utilização de ferramentas de desenvolvimento, pagas ou não, além
de considerar todo um patrimônio intelectual e ideológico de seus criadores
(MOLINARI, 2007).
Esse tema, por sua vez, apresenta diversas vertentes e discussões que
devem ser consideradas quanto à distribuição e comercialização de um
produto de software. Entre tais vertentes, temos a criação de software
proprietário ou livre, que consiste no ponto central de muitas discussões.
Assim, nesta aula, serão apresentados os principais conceitos e caracte-
rísticas que o auxiliarão a compreender tais classificações de software.
Bons estudos!
Aula 5
Classificação de software
www.cliqueapostilas.com.br
AULA 5 • COMPUTAçãO BÁSICA
64 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
5.1 Software livre
Desde os primórdios da história da computação, quando do início da
criação de software para os computadores gigantescos, para não se dizer
jurássicos, um tema é bastante discutido nas rodas de desenvolvedores, a
classificação do software. Isso se deve a aspectos existentes no processo de
criação de um software, que envolve tanto direitos autorais quanto intelectuais
que devem ser respeitados. Nos últimos anos, a vertente de software livre tem
ganhado considerável força devido ao fato da crescente visão de que, segundo
a Free Software Foundation (FSF) (2007), “Software Livre é uma questão de
liberdade, não de preço. Para entender o conceito, você deve pensar em liber-
dade de expressão, não em cerveja grátis”.
Isso define com clareza a intenção por trás de um software livre, em que a
caracterização como livre ou não, não consiste necessariamente em sua gratui-
dade. Mas você deve estar se perguntando: “mas não é gratuito? Onde está
a liberdade nisso então?” Fique calmo, iremos trabalhar com mais detalhes as
subdivisões dessa interessante classificação de software.
Toda essa controvérsia deve-se ao fato de existir muita confusão quanto à
utilização do termo livre, uma vez que vem do inglês free, que pode ser tradu-
zido tanto como gratuito ou mesmo livre. O ponto central do software livre
se baseia na idéia de se dar liberdade para que usuários executem, copiem,
distribuam, estudem, aperfeiçoem e modifiquem um software levando em consi-
deração suas características, expectativas e necessidades, contribuindo para
uma visão construtivista e evolucionária em que diversas pessoas podem traba-
lhar para torná-lo melhor (OSI, 2007).
Agora você deve estar se questionando: “mas como trabalhar para torná-lo
melhor se foi outra pessoa que o criou, o que posso fazer?” Aí entra uma
caracte rística importantíssima de um software livre, que consiste na disponibili-
zação de seu código fonte para que outras pessoas possam utilizar, alterar ou
mesmo re-distribuir o software com suas alterações. Isso contribui sensivelmente
para que diversas pessoas tenham acesso à informação, difundindo conheci-
mento e incentivando a pesquisa científica (FSF, 2007).
A (FSF, 2007) menciona que, para que um software seja considerado livre,
ele deve necessariamente possuir os quatro princípios da liberdade. São elas:
liberdade n.• o 0: o usuário deve ter a liberdade de executar o programa,
para qualquer propósito;
www.cliqueapostilas.com.br
AULA 5 • COMPUTAçãO BÁSICA
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 65
liberdade n.• o 1: o usuário deve ter a liberdade de estudar e adaptar o
programa para as suas necessidades. O acesso ao código-fonte é um
pré-requisito para essa liberdade;
liberdade n.• o 2: o usuário deve ter a liberdade de redistribuir cópias
de modo que possa ajudar ao próximo;
liberdade n.• o 3: o usuário deve ter a liberdade de aperfeiçoar o
programa e disponibilizar seus aperfeiçoamentos, de modo a benefi-
ciar toda a comunidade. O acesso ao código-fonte é um pré-requisito
para esta liberdade.
Quando se trabalha com um tema como a classificação de software, é importante se
conhecer em sua essência todos os conceitos que a diferenciam, e assim formar opinião
consiste sobre o assunto. Então, sugerimos que sejam realizadas leituras a materiais
complementares, como os existentes no site da Free Software Foundation (<http://www.
gnu.org>) ou no site da Open Source Iniciative (<http://www.opensource.org>).
Saiba mais
Como pode ser visto, o acesso ao código fonte é um dos pilares para a
caracterização de um software livre. Isso não significa que o mesmo não seja
comercial, muito pelo contrário. A idéia de se ganhar dinheiro com software
livre não está na venda de produtos fechados, mas sim na venda de serviços
de qualidade que estão, a todo momento, expostos, sendo colocados à prova
e ao julgamento da comunidade (MOLINARI, 2007).
Um software, quando se diz livre, geralmente está regido pela GPL
(General Public License), que consiste na designação da licença para software
livre criada por Richard Stallman no final da década de 1980, regido pela
Free Software Foundation, sendo utilizado por grandes projetos, como o do
sistema operacional Linux (FSF, 2007). Assim, esta vertente da classificação de
software pode ser divida em duas sub-divisões, que são: Open Source e Livre
Comercial, tratados a seguir.
5.1.1 Open Souce
Esse tipo de software segue todos os preceitos citados até aqui nesta aula,
no qual o código fonte é distribuído e é permitido que esse seja modificado e
redistribuído, levando em consideração os princípios de liberdade do software
original. Isso auxilia na prevenção de sua utilização sem fins comerciais, estando
www.cliqueapostilas.com.br
AULA 5 • COMPUTAçãO BÁSICA
66 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
sujeitos aos termos da licença GPL. Alguns exemplos de softwares open source
são o kernel do sistema operacional Linux e o projeto Web Apache TomCat,
que podem ser alterados e redistribuídos (FSF, 2007).
5.1.2 Livre comercial
Como já mencionado nesta aula, o software livre não exclui a possibili-
dade de sua utilização comercialmente, sendo distribuído mediante o paga-
mento. Porém isso, comercialmente, é comprometido, uma vez que está sob
as regras impostaspela GPL no qual, apesar do software ser comerciali-
zado, pode ser livremente distribuído sem ônus algum (FSF, 2007). Em sua
maioria, esse tipo de software trabalha com a idéia de agregação de valores
que o tornem diferenciado da versão open source, como o empacotamento
e venda com outros softwares integrados, ou como a venda de hadware
que se comportem melhor devido à sua compatibilidade com o software.
Diversos exemplos podem ser citados, como as distribuições Linux Red Hat e
Mandrake. Nesse tipo de software, ainda é preservada a característica de
código fonte aberto.
Podem ser encontrados diversos softwares gratuitos, porém sem a dispo-
nibilização do código fonte, o que compromete a caracterização deste como
software livre, devido aos aspectos de liberdade, alteração e redistribuição,
fazendo com que indiretamente o usuário fique preso, de alguma maneira, a
empresas. São eles:
1. versões Freeware: nesse caso, o software é gratuito, podendo ser utili-
zado sem limite de tempo e poder ser copiado e distribuído livremente.
Exemplo: Java Sun, Microsoft Internet Explorer;
2. versões Adware: são gratuitos, porém utilizam publicidade, no caso
banners ou links de patrocinadores, que custeiam o desenvolvimento
e manutenção em troca de marketing, e podem ser copiados e distri-
buídos livremente. Assim como o freeware, não é disponibilizado o
código fonte. Exemplo: Adobe Acrobat.
Então, lembre-se: nem sempre um software gratuito é livre e, no caso,
quando um determinado software é livre não é o caso de deixar comple-
tamente de ser comercial. Conforme apresentado até aqui nesta aula, fica
claro que existem diversas possibilidades quanto à exploração das caracte-
rísticas do software livre, seja em sua mais forma mais essencial ou mesmo
comercialmente. Porém existem pessoas e empresas que pregam a utilização
www.cliqueapostilas.com.br
AULA 5 • COMPUTAçãO BÁSICA
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 67
da vertente mais comercial dos softwares, no qual são considerados direitos
autorais e ideológicos envolvendo custo ou, como também são conhecidos,
os softwares proprietários.
O software livre é muito utilizado no contexto acadêmico, porém nada impede ou
mesmo inviabiliza que um software desenvolvido sobre um ambiente puramente acadê-
mico tenha fins comerciais de mercado, um exemplo claro disso consiste no Google,
que foi desenvolvido em um ambiente universitário.
Pensando sobre o assunto
5.2 Software proprietário
Depois de conhecida toda a ideologia existente por trás dos softwares
livres, chegou a vez de discuti-lo como um bem material que envolve custos
e até mesmo segredos de mercado. Opiniões quanto ao software livre como
uma grande utopia, ou como uma idéia muito à frente de seu tempo, podem
ser encontradas facilmente na Internet e no mercado.
O que é pregado em defesa do software proprietário é melhor analisado
quando utilizada uma analogia. Por exemplo: um grande chefe de cozinha,
por cozinhar muito bem, tem todo o direito de abrir um restaurante e vender
suas deliciosas iguarias. Ninguém pode obrigá-lo a ensinar ou mesmo a distri-
buir suas receitas gratuitamente para que os outros a utilizem. Alguns chefes
fazem questão de compartilhar seus conhecimentos, já outros não, ficando a
critério do cliente o pagamento ou não pela degustação da iguaria.
Assim, voltando ao software, o que é fornecido tem um preço que é defi-
nido de acordo com a utilidade que este software tem para uma determinada
pessoa que pague o valor sugerido, mesmo que outros discordem completa-
mente desse ponto de vista (MOLINARI, 2007).
Um software comercial ou proprietário é distribuído sem a disponibi-
lização de seu código fonte, sendo normalmente comercializado sob os
termos de licença de uso, e não de propriedade. O que acontece nesse
caso é que, ao adquirir um software, uma pessoa está se comprometendo
somente a utilizá-lo, sem direito algum sob aspectos de comercialização ou
mesmo de sua redistribuição, sob penas e multas severas. Exemplos desse
tipo de software é o sistema operacional Microsoft Windows e o assistente
gráfico Corel Draw.
www.cliqueapostilas.com.br
AULA 5 • COMPUTAçãO BÁSICA
68 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Alguns softwares se utilizam de licenças um tanto quanto diferentes, como a
Postcardware e a StampwareCardware, no qual o desenvolvedor exige o feedback
por parte dos usuários da ferramenta por meio de postais ou cartas para só então
liberar o registro do software.
Saiba mais
Uma grande quantidade de softwares proprietários disponibiliza versões
gratuitas para testes e pode ser classificada como:
shareware• : software que, após certo tempo de utilização, ou mesmo
número de utilizações, indisponibiliza suas funcionalidades, sendo
necessário o registro, no caso o pagamento de uma taxa ao proprie-
tário do software, ou sua exclusão do computador. Muitas empresas
proprietárias que desenvolvem software optam pela agregação de
serviços aos usuários registrados, a fim de fidelizar o cliente;
demo• : serve como um demonstrativo para análise da viabilidade da
aquisição do produto. É muito comum a utilização dessa modalidade
de distribuição em jogos, que disponibilizam fases, possibilitam a cons-
trução de opinião (se vale ou não a pena adquirir o produto), e são
uma versão que não expira e nem pode ser registrada, sendo neces-
sária a substituição de todo o software, caso opte por adquiri-lo;
trial• : é semelhante à distribuição demo, porém se aplica geralmente
a softwares funcionais, como editores de texto e planilhas eletrônicas,
limitando-os de maneira a não permitir, por exemplo, a edição de
trabalhos ou mesmo não possibilitando que sejam realizadas a persis-
tência deles na máquina, ou seja, salvar os documentos. Geralmente
são liberados todos os recursos do software, limitando somente alguns
pontos chaves. Assim, pode ser utilizado todo o potencial da ferra-
menta para aprendizado por tempo indeterminado, porém sempre se
lembrando das limitações já citadas.
Em sua maioria, os softwares proprietários são conhecidos como Software Box, ou
melhor, softwares de caixinha. Compra-se um produto finalizado e o usuário tem
pouco ou senão nenhum poder de alteração, de manipulação sobre o que está sendo
adquirido ou mesmo poder para sua customização.
Pensando sobre o assunto
www.cliqueapostilas.com.br
AULA 5 • COMPUTAçãO BÁSICA
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 69
Finalizando esta aula, é interessante considerarmos que as divisões de
softwares apresentadas não são as únicas disponíveis, mas as principais
e mais utilizadas para a classificação de software. Essas classificações
refletem a idéia e a vontade de como os programas de computadores
devem ser utilizados, segundo a visão do desenvolvedor e proprietário
dos direitos.
Existem ainda diversos métodos que podem ser utilizados na classificação
de software como, por exemplo, a permissão de utilização de software gratui-
tamente, em que é possível que haja um processo de reciprocidade por meio
de uma doação voluntária por parte dos usuários.
Outro exemplo de classificação das distribuições de software consiste na
iniciativa da Microsoft em lançar seus produtos sob licença Shared Source,
isso devido a apelos principalmente da comunidade européia quanto à dispo-
nibilização do código fonte. Sob esse tipo de licença, a Microsoft permite
que parceiros, empresas e governo tenham acesso ao código fonte de seus
produtos, minimizando incidentes que, segundo muitos, caracterizam um mono-
pólio do mercado de software, porém sem que seja permitida a alteração e
redistribuição dos produtos da empresa (OSI, 2007).
Isso provoca discussões que mostram como é difícil definir qual a melhor
forma de distribuição de software.As classificações apresentadas nesta aula
apontam para diversos pontos que devem ser considerados e que influen-
ciam diretamente na contextualização e, por conseqüência, classificação dos
softwares, como valores culturais e contribuições sociais. São vertentes comple-
tamente diferentes que apresentam prós e contras, mas que, com certeza,
contribuem para um melhor modelo de produção de conhecimento e dissemi-
nação da informação, cada uma à sua maneira.
Síntese da aula
Nesta aula, apresentamos as características e conceitos relacionados a
classificação de software. Esses podem ser divididos em duas vertentes: a
livre e a considerada proprietário. Além disso, conhecemos nomenclaturas
comuns a classificação dos softwares como: freeware, adware, shareware,
demo e trial. Cada uma destas distribuições caracteriza o software quanto às
suas limitações e tempo de utilização. Finalizando, são apresentadas algumas
classificações menos conhecidas, como a Shared Source.
www.cliqueapostilas.com.br
AULA 5 • COMPUTAçãO BÁSICA
70 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Atividades
1. Diversos aspectos e características podem ser utilizados para que um
software seja considerado livre. Porém, com certeza, os quatro princípios
de liberdades exigidos pela GPL (General Public Lincense) são os mais
conceituados. Quais são eles e em que consistem? Justifique sua resposta.
2. Quanto aos softwares proprietários, podem ser distribuídos como versões
de teste. Dessa forma, qual a diferença entre as versões shareware e trial?
Comentário das atividades
Na atividade 1, os quatro princípios da liberdade consistem em aspectos que
interferem diretamente na classificação de um software livre, assim o primeiro
princípio consiste na liberdade que os usuários devem possuir para a execução
do software para qualquer que seja o seu propósito. O segundo princípio consiste
na liberdade que o usuário deve possuir para estudar, analisar e adaptar o
programa as necessidades. Para tanto, é necessário que o código fonte esteja
disponível ao usuário. O terceiro princípio consiste na liberdade que o usuário
deve possuir para a distribuição de cópias alteradas ou não por ele. Finalizando
os princípios, o usuário deve possuir a liberdade de aperfeiçoar o software e,
além disso, disponibilizar de modo a proporcionar o bem de outros.
Já na questão 2, a diferença existente entre as distribuições de teste proprie-
tárias shareware e trial consiste no fato de que a primeira limita a utilização
de recursos por meio do tempo ou mesmo quantidade de vezes que o software
é utilizado; já o segundo tipo, o Trial, limita a utilização do software por meio
da indisponibilização e limitação dos recursos do programa, por exemplo, a
funcionalidade para salvar documentos.
Referências
FSF, Free Software Foundation. Free Software. Disponível em: <http://www.
gnu.org>. Acesso em: 20 dez. 2007.
MOLINARI, Leonardo. Gerência de configuração: técnicas e práticas no desen-
volvimento do software. Florianópolis: Visual Books, 2007.
OSI, Open Source Iniciative. Open Source. Disponível em: <http://www.open-
source.org>. Acesso em: 20 dez. 2007.
Na próxima aula
Veremos os conceitos relacionados a noções básicas tanto de redes de
computadores quanto de banco de dados.
www.cliqueapostilas.com.br
AULA 6 • COMPUTAçãO BÁSICA
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 71
Objetivos
Esperamos que, ao final desta aula, você seja capaz de:
compreender quais são os tipos de redes existentes e como elas são •
interligadas entre si;
entender o funcionamento de um banco de dados e como ele é útil •
para manipular informações.
Pré-requisitos
Para o aprendizado desta aula, não há necessidade de conhecimentos
anteriores, apenas que você tenha força de vontade para conhecer novas
tecnologias e procure saber mais sobre o que será falado aqui em sites e livros
relacionados com essas duas áreas.
Introdução
A interligação de computadores ou uma rede de computadores se faz
necessário pelo fato de que há uma grande facilidade em trocar informações
sem a necessidade de mídias como disquete, CD ou DVD, como também
compartilhar informações e aplicativos. Os bancos de dados têm como finali-
dade gerar uma determinada informação por meio de um agrupamento logi-
camente coerente de dados.
Organizações com centenas de escritórios dispersos por uma extensa
área geográfica podem, com um simples apertar de um botão, examinar o
status atual de suas filiais mais remotas. À medida que cresce nossa capa-
cidade de colher, processar e distribuir informações torna-se ainda maior a
demanda por formas de processamento de informações ainda mais sofisti-
cadas (TANENBAUM, 2004).
Aula 6
Noções básicas de redes de
computadores e banco de dados
www.cliqueapostilas.com.br
AULA 6 • COMPUTAçãO BÁSICA
72 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
6.1 Tipos de redes de computadores
De acordo com a distância em que os computadores se encontram,
podemos classificá-los em alguns tipos, conhecidos como:
redes locais• (LAN – Local Área Network): são interligações entre compu-
tadores em uma área geralmente menor que 10km, de alta velocidade
e de baixas taxas de erro;
redes metropolitanas• (MAN – Metropolitan Área Network): são interli-
gações entre computadores em uma área geralmente maior que 10km,
podendo alcançar até 100km;
redes geograficamente distribuídas• (WAN – Wide Área Network): são
interligações entre computadores em uma área geralmente maior que
100km, em que o alcance pode se tornar até inter-continental.
Mais recentemente, surgiu um novo tipo de classificação chamado de Rede
de Área Pessoal ou PAN (Personal Area Network), que consiste na interligação
de dispositivos, como fone de ouvido, ou até mesmo celulares e computadores
em que há um compartilhamento de dados por meio de redes bluetooth.
6.2 Topologias de redes de computadores
Os computadores podem ser interligados de várias formas entre si. Dependendo
de como essa interligação foi feita, podemos classificá-las em:
barramento• – é um tipo de ligação multiponto em que há apenas uma
única via de conexão e o acesso é compartilhado entre todos os compu-
tadores nela conectados. Por não haver um tipo de hierarquia no envio
de dados, nesse tipo de topologia de rede podem ocorrer “colisões de
dados”, ou seja, mistura de dados no transcorrer da transmissão;
• anel – é um tipo de ligação fechada em que os computadores são interli-
gados em seqüência na forma de um anel. As informações trocadas entre
os computadores são preferencialmente unidirecionais, mas podem ser
em qualquer direção. Um grande problema desse tipo de topologia de
rede é que, se um falhar, toda comunicação pode ser comprometida;
estrela• – é um tipo de ligação ponto-a-ponto em que há um gerenciador
central em que toda a comunicação é passada obrigatoriamente, com
isso será garantido que a informação enviada seja entregue correta-
mente ao seu destino. Esse tipo de topologia de rede é o mais usado
na atualidade.
www.cliqueapostilas.com.br
AULA 6 • COMPUTAçãO BÁSICA
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 73
Tanto na ligação ponto-a-ponto como na multiponto podemos ter três tipos de comuni-
cações usadas no enlace dos dados, que são: simplex, usa apenas um dos sentidos
do enlace; a half-duplex, que utiliza os dois sentidos do enlace, mas um por vez; e a
full-duplex, que utiliza os dois sentidos do enlace simultaneamente.
Saiba mais
Podemos observar que o meio de transmissão entre cada uma dessas inter-
ligações de computadores é diferenciado, como veremos na seção a seguir.
6.3 Meios de transmissão de redes de computadores
Os computadores, as impressoras, entre outros tipos de hardware comu-
nicam-se entresi por meio de um sistema físico de comunicação pelo qual
os dados são transmitidos. Esse sistema pode ser classificado em três tipos,
que são:
cabo coaxial• : é um cabo de cobre que conduz sinais elétricos reves-
tido de uma malha ou trança metálica isolante;
cabo de pares trançado• : são cabos entrelaçados em forma de espiral
com a finalidade de isolar interferências de campos eletromagné-
ticos quando há uma transmissão de dados na condução de sinais
elétricos. O máximo de comprimento de um cabo de pares trançado
é de 100 m;
cabo de fibra óptica• : são cabos que transmitem dados por meio
de feixes de luz e que podem chegar a grandes distâncias. Seu
revestimento é feito de uma mistura de vidro, plástico e outros
componentes.
Outro meio físico de comunicação é o ar, as chamadas redes wi-fi ou wireless como,
por exemplo, ondas de rádio digital, satélites e espectro de difusão, que também
podem transmitir dados a grandes distâncias e em grandes velocidades.
Saiba mais
Para que haja uma comunicação de dados entre computadores, impres-
soras, scanners e etc, há necessidade de alguns tipos de dispositivos para
interligá-los. Na seção a seguir, veremos alguns desses tipos.
www.cliqueapostilas.com.br
AULA 6 • COMPUTAçãO BÁSICA
74 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
6.4 Dispositivos de transmissão de dados
Os dispositivos de redes a seguir são classificados em dois tipos: ativos e
passivos. Os ativos são equipamentos de rede que têm regras pré-definidas,
podendo escolher o melhor caminho de transmissão; já os passivos são equi-
pamentos de rede que não têm regras pré-definidas atuando somente como
um elo entre outros dispositivos. Esses dispositivos são:
pontes• (bridges) – são dispositivos que têm como objetivo expandir ou
segmentar uma rede de computadores que utilizam o mesmo proto-
colo, utilizando-se de protocolos distintos;
roteadores• (routers) – são dispositivos que têm como objetivo interligar
redes de computadores fisicamente distintas, determinando por qual
caminho a informação deve seguir para chegar ao seu destinatário;
repetidores• (repeaters) – são dispositivos que têm como objetivo rege-
nerar o sinal atenuado pela distância, ou seja, aumenta a potência do
sinal para que consiga atingir grandes distâncias;
concentrador• (hub) – são dispositivos com a finalidade de interligar
vários computadores entre si. Por não comportar grandes volumes de
dados, são recomendados para redes pequenas. Isso ocorre pelo fato
de receber um sinal de um computador e o envia a todos os outros
computadores da rede;
comutador• (switch) – são dispositivos semelhantes ao Hub, com a dife-
rença de que possuem inteligência, ou seja, o sinal recebido por ele
de um computador é enviado para o computador específico sem que
os outros recebam essa informação.
Na comunicação entre esses dispositivos, temos quatro tipos de envio de dados, que
são: anycast, em que a transmissão da informação é enviada e distribuída ao receptor
mais próximo definido pelo roteador; broadcast, em que a transmissão da informação
é enviada a muitos receptores ao mesmo tempo; multicast, em que a informação é
enviada a vários receptores simultaneamente, utilizando a melhor estratégia de rotea-
mento; e unicast, em que a transmissão da informação é feita a um único receptor.
Saiba mais
Após se falar tanto em comunicação de dados, veremos a seguir como são
classificados os bancos de dados, seus usuários e como os dados podem ser
gerenciados por um aplicativo.
www.cliqueapostilas.com.br
AULA 6 • COMPUTAçãO BÁSICA
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 75
6.5 Tipos de banco de dados
Os bancos de dados podem ser classificados em quatro tipos distintos, dois
praticamente em desuso e outros dois ainda em uso, que são atualmente usados
por grandes SGBDs (Sistemas Gerenciadores de Banco de Dados) como MySQL,
PostgreSQL entre outros. Esses bancos de dados são classificados como:
hierárquico• – é organizado como árvores e consiste em uma coleção
de registros conectados entre si por ligações. Cada raiz é um pseu-
donó em que cada nó é um registro;
rede• – é semelhante ao modelo hierárquico, com o diferencial de que
cada registro filho pode ser ligado em mais de um registro pai;
relacional• – os dados são armazenados em tabelas e apresentados
por meio de relações. É baseado na teoria dos conjuntos e na lógica
de predicados;
orientado ao objeto• – os dados são armazenados na forma de objetos que
obedecem a propriedades que são integradas a uma estrutura de dados.
Para a manipulação de um banco de dados, existem alguns tipos de usuá-
rios, cada um com a sua função e com um envolvimento diferente dentro desse
contexto. A seguir, veremos como são classificados esses usuários.
6.6 Usuários de banco de dados
Para distinguir a função em que cada usuário exerce em um banco de
dados, podemos classificá-los como:
administradores de banco de dados• (DBA) – é o usuário chefe, com
a função de supervisionar e gerenciar os recursos fornecidos e que
serão utilizados pelo banco de dados, além de permitir ou não o
acesso à base;
• analistas de banco de dados – são os projetistas, identificam a estru-
tura apropriada para o armazenamento dos dados, tem uma proxi-
midade maior com os usuário finais para poder moldar o banco de
dados, de acordo com o que necessitam;
usuário finais• – são as pessoas que utilizam o banco de dados apenas
para consultar, modificar e gerar algum tipo de relatório.
A seguir, veremos como é composto um SGBD (Sistema de Gerenciamento
de Banco de Dados) e suas principais funções.
www.cliqueapostilas.com.br
AULA 6 • COMPUTAçãO BÁSICA
76 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
6.7 Sistema de Gerenciamento de Banco de Dados (SGBD)
É uma coleção de programas que facilita a manipulação de uma base de
dados. As principais funções de um SGBD são:
controle de redundância• – não permite que a mesma informação seja
gravada em locais diferentes, o que ocasiona um problema na atuali-
zação dos dados;
compartilhamento de dados• – utiliza-se de um ambiente multiusuário
em que os dados são compartilhados em acessos simultâneos;
controle de acesso• – cada usuário tem um tipo de permissão para
acesso ao banco de dados, somente o que for permitido pelo dba
será acessado;
controle de transações• – toda transação deve ser realizada sem
falhas ou interrupções, como, por exemplo, a atualização de uma
conta bancária;
múltiplas interfaces• – há possibilidade de se programar, realizar
consultas e interagir por meio de menus em linguagem natural;
relacionamento entre dados• – os dados são variados e estão inter-
relacionados de várias maneiras, representando um complexo relacio-
namento entre si;
backup• – deve-se ter uma facilidade para recuperar falhas e possibi-
litar a cópia da base para não haver a perda de dados.
Pode-se observar que um SGDB tem várias funcionalidades para que a
informação, que é o principal objeto de armazenamento, possa estar segura e
com um conjunto de acessórios para seu uso.
Hoje, no mercado, temos muitos SGBDs de grande poder de armazenamento e segu-
rança, como, por exemplo, MySQL, PostgreSQL, Oracle, SQL Server entre outros.
Saiba mais
Na próxima seção, veremos como é feita a manipulação e definição dos
dados por meio de comandos que utilizamos para ajudar na construção de
uma tabela de geração de informação.
www.cliqueapostilas.com.br
AULA 6 • COMPUTAçãO BÁSICA
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 77
6.8 Structured Query Language (SQL)
Desenvolvida pela IBM em meados dos anos 60, tem como objetivo ser
uma interface entre o usuário e o SGBD para manipular e definir os dados.
O SQL é compostode comandos de manipulação chamado de DDL (Data
Definition Language), como o create, drop, de definição de dados chamado
de DML (Data Manipulation Language), como o insert, update, delete e select
e de controle de dados, chamado de DCL (Data Control Language), como
o grant e o revoke, com o objetivo de ajudar os usuários na construção de
tabelas e geração de informação coerente.
Por meio do SQL, podemos realizar tarefas de cancelamento ou atuali-
zação dos dados por meio de dois comandos chamados rollback e commit,
ou seja, a cada dado gravado, é realizado um commit efetivando sua
gravação. Caso haja uma falha no momento da gravação dos dados, o
banco de dados retorna ao passo anterior por meio do rollback.
Algumas das características de uma linguagem SQL são:
manipulação de várias tabelas;•
união de uma instrução SQL dentro de outra instrução SQL;•
é simples, sem a necessidade de especificar o método de acesso aos •
dados;
vários usuários podem utilizar um banco de dados como: adminis-•
trador do banco de dados, especialista de banco de dados, progra-
madores e usuário final;
utiliza-se de uma interface para o uso interativo com o banco de dados.•
Finalizando esta aula, podemos verificar que as redes de computadores e
os bancos de dados estão em todos os seguimentos de empresas e em pleno
uso, já que, por exemplo, a interligação das informações de uma matriz com
suas filiais são de suma importância para o bom rendimento dos produtos
produzidos pela mesma.
Síntese da aula
Nesta aula, vimos conceitos e características de uma rede de computadores e
banco de dados em que podemos enviar informações de um computador para o
outro por meio de conexões de variados tipos e a longas distâncias. Além disso,
podemos guardar essas informações e manipulá-las de acordo com as permissões
de cada usuário por meio de um SGBD.
www.cliqueapostilas.com.br
AULA 6 • COMPUTAçãO BÁSICA
78 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Atividades
1. Em que consiste uma rede de computadores?
2. Qual a finalidade de um SGBD (Sistema de Gerenciamento de Banco de
Dados)?
Comentário das atividades
Na atividade 1, uma rede de computadores consiste em fazer uma interli-
gação de computadores independente da distância em que se encontram, por
meio de um determinado meio de comunicação, passando por um dispositivo
ativo ou passivo como hubs, roteadores, switchs ou bridges.
Já na atividade 2, podemos dizer que um SGBD tem como finalidade geren-
ciar e armazenar informações de forma que seus usuários possam construir,
definir e manipular uma base de dados para as mais diversas finalidades.
Referências
RAMALHO, J. A. SQL: a linguagem dos bancos de dados. 2. ed. São Paulo:
Berkeley, 1999.
SOUSA, L. B. Redes de computadores: dados, voz e imagem. São Paulo: Érica.
1999.
TANENBAUM, A. S. Redes de computadores. 4. ed. Rio de Janeiro: LTC, 2004.
WIKIPEDIA. Banco de Dados. Disponível em: <http://pt.wikipedia.org/wiki/
Banco_de_dados>. Acesso em: 20 dez. 2007.
______. Broadcast. Disponível em: <http://pt.wikipedia.org/wiki/Broadcast>.
Acesso em: 20 dez. 2007.
______. Rede de computadores. Disponível em: <http://pt.wikipedia.org/wiki/
Rede_de_computadores>. Acesso em: 20 dez. 2007.
Na próxima aula
Veremos os tipos de profissões, as definições e como é o profissional de
cada uma delas.
Anotações
www.cliqueapostilas.com.br
AULA 7 • COMPUTAçãO BÁSICA
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 79
Objetivos
Esperamos que, ao final desta aula, você seja capaz de:
conhecer as áreas de formação profissional mais comuns na área de •
informática e ainda a situação da regulamentação das profissões;
entender as diferenças entre os diversos tipos de profissionais na área •
de informática.
Pré-requisitos
O entendimento das aulas anteriores o tornará capaz de identificar os diversos
segmentos atuais da área de Informática, tais como: comunicação de dados, cons-
trução de softwares, arquitetura física de componentes de informática, entre outros.
Introdução
Atualmente, com o avanço diário dos recursos computacionais, a informá-
tica está inserida nos mais diversos segmentos produtivos da sociedade. Junto
a essa realidade, soma-se o fato de os computadores terem se tornado, hoje,
um acessório tão comum quanto uma TV ou geladeira nos lares, estabeleci-
mentos comerciais e industriais.
Diante desses fatores, torna-se indispensável a contratação de profissio-
nais cada vez mais especializados para atender esses diversos segmentos,
formando, assim, várias áreas de atuação profissional dentro da informática.
Anteriormente, esse campo era formado por apenas quatro tipos de profissio-
nais: analista, programador, operador e digitador.
Conheceremos, nesta aula, um pouco mais sobre as principais profissões
na área de informática e ainda como anda a situação da regulamentação do
registro profissional para todos que já atuam ou pretendem atuar nesta área.
Aula 7
Profissões na área
de Informática
www.cliqueapostilas.com.br
AULA 7 • COMPUTAçãO BÁSICA
80 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
7.1 Formação acadêmica
Como a Informática está presente em todos os segmentos do setor
produtivo e ainda pelo motivo de os computadores terem tornado-se objetos
tão comuns, amplia-se a necessidade de formação acadêmica voltada para
esta área.
Na corrida para as especializações, surgem cursos com os mais diferentes
nomes, mas possuindo currículos similares, formando profissionais para atuar
em atividades semelhantes, o que ocasiona certa confusão entre os estudantes
e até mesmo entre os próprios profissionais.
Devido ao fato de que as profissões da área de informática não são regu-
lamentadas, ou seja, não existe um órgão fiscalizador, as universidades têm
total liberdade para adotar o nome do curso. Como exemplo disso, temos
os cursos de Informática, Análise de Sistemas, Ciência da Computação,
Engenharia de Computação, Engenharia de Informação, Sistemas de
Informação entre outros.
Vamos agora conhecer um pouco mais as profissões relacionadas à área
da informática.
7.1.1 Cursos de Formação Superior
Conheceremos agora alguns cursos de formação de nível superior mais
comuns na maioria das universidades públicas e particulares.
a) Engenharia da Computação
O Engenheiro da Computação trata de assuntos relativos à hardware
(máquinas) que trabalham isoladamente (PCs) ou que compõem uma
rede (ou sistema) de comunicações. É o responsável pela arquitetura da
rede e da organização física de computadores e periféricos. Também
projeta e constrói alguns tipos de hardware – computadores, teclados,
monitores, impressoras, chips, placas de som e de vídeo, e ainda equi-
pamentos de automação industrial e até mesmo de robótica.
O planejamento e administração da rede de computadores de uma
empresa também estão entre suas atribuições. Devido ao seu vasto
conhecimento da área, ainda é capaz de criar sistemas operacio-
nais, desenvolver linguagens específicas e realizar atividades de
pesquisas tecnológicas.
Esse curso tem duração média de cinco anos.
www.cliqueapostilas.com.br
AULA 7 • COMPUTAçãO BÁSICA
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 81
b) Bacharel em Ciência da Computação
O bacharel em Ciência da Computação tem seu foco principalmente no
desenvolvimento dos programas (softwares). Ele pode, ainda, organizar
e desenvolver aplicativos (programas aplicados a determinado processo
de trabalho) de acesso a bancos de dados ou ainda elaborar sistemas
mais complexos, usados por bancos, lojas comerciais entre outros.
Pode ainda trabalhar com marketing e vendas, dando consultoria na
escolha de equipamentos e na assistência técnica, planejando e anali-
sando novos produtos,segundo a necessidade do mercado.
Esse curso tem duração média de quatro anos.
c) Analista de Sistemas
O Analista de Sistemas é o profissional que atua na concepção, na
aplicação e na manutenção dos programas. Cabe a ele a adminis-
tração do fluxo de informações geradas por uma rede de computa-
dores e também a manutenção dos computadores.
Este curso tem duração média de 4 anos.
Nos Estados Unidos, não existe diferença entre Engenharia da Computação e Ciência
da Computação, diferentemente do Brasil, onde a diferença básica é que Ciência da
Computação é um curso mais prático, enquanto Engenharia de Computação é um
pouco mais amplo, com conteúdos de Engenharia Elétrica, Engenharia de Sistemas e
mesmo de Ciência da Computação.
Saiba mais
7.1.2 Escolhendo uma área de atuação
A partir das formações de nível superior anteriormente mencionadas, que
podem ser encontradas nas mais diversas universidades do Brasil, podemos
escolher algumas áreas específicas de atuação.
A seguir, veremos alguns exemplos de áreas específicas.
a) Administrador de Banco de Dados
Responsável pela manutenção e refinamento de bancos de dados corpo-
rativos. A formação recomendada para esta área é a graduação em
Engenharia da Computação, Processamento de Dados, Informática.
www.cliqueapostilas.com.br
AULA 7 • COMPUTAçãO BÁSICA
82 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Dentre suas atividades, destacamos manutenção e refinamento de bancos
de dados, alterações na estrutura do banco para expansão e adapta-
ções de sistemas, monitoramento e identificação de falhas para aper-
feiçoamento de bancos de dados, coordenação de programadores.
b) Administrador de Redes
Responsável pela instalação, configuração e manutenção dos sistemas
operacionais e de todos os serviços implementados; pesquisa de solu-
ções de tecnologia; apoio à área de desenvolvimento de aplicações;
suporte de último nível para as equipes de apoio aos usuários; confi-
guração e manutenção do nível de segurança da rede.
c) Analista de Segurança
Responsável pela segurança da rede (equipamento, sistemas operacio-
nais de servidores e clientes e programas utilizados). Também monitora
tentativas de invasão e uso indevido de recursos da rede, além de definir
e manter as regras de uso dos recursos computacionais da empresa.
d) Analista de Sistemas
Responsável pelo levantamento das necessidades do cliente e pela
elaboração de um modelo conceitual do sistema a ser desenvolvido.
Suas principais atividades são: levantamento de requisitos do sistema,
definição de cronogramas, prototipação e modelagem de dados,
desenvolvimento, testes, coordenação de implementação.
e) Analista de Software Básico
Profissional responsável por desenvolver e implementar sistemas de auto-
mação e tempo real, assim como sistemas embutidos, fazendo uso de
aplicações de baixo nível e de conhecimentos sobre sistemas de redes.
Suas principais atividades dependem da empresa onde o profissional
atue, ele pode estar envolvido com diversas áreas, tais como análise de
requisitos e projetos, implementação de sistemas, entre outras.
f) Analista de Suporte
Profissional responsável pela instalação e configuração de software e
hardware. A Análise de Suporte é uma atividade muito abrangente,
que inclui desde as tarefas mais simples, como suporte ao usuário de
Windows e Office, por exemplo, até as mais especializadas, como
suporte a servidores.
www.cliqueapostilas.com.br
AULA 7 • COMPUTAçãO BÁSICA
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 83
Suas principais atividades envolvem instalação e configuração de
ambiente para o usuário (incluindo sistemas operacionais e principais
aplicativos); instalação e configuração de servidores; desenho da rede
interna da empresa.
g) Auditor de Sistemas
Profissional encarregado em auditar sistemas e redes corporativas,
identificando fraudes e outros tipos de irregularidade, além de analisar
políticas e investimentos necessários para a estrutura de informática
do cliente.
Suas principais atividades envolvem a definição de estruturas de
controles internos, identificar e quantificar fraudes, analisar investi-
mentos e riscos, manter contato com o departamento técnico e de
negócios da empresa.
h) Engenheiro de Hardware
Profissional responsável por conceber projetos hardware para compu-
tadores, telecomunicações e outros tipos de equipamento eletrônico,
com destaque para sistemas especialistas dedicados (controladores
programáveis como sistemas de distribuição de eletricidade, infra-es-
trutura de telefonia celular etc.).
Suas principais atividades envolvem concepção e análise de projetos,
elaboração de relatórios técnicos detalhados, coordenação de
suporte e de manutenção de hardware e, eventualmente, elaboração
de protótipos.
i) Engenheiro de Software
Profissional responsável por criar, manter e auditar metodologias de
desenvolvimento de sistemas em uma empresa.
Suas principais atividades envolvem criação, manutenção e auditoria
de metodologias de desenvolvimento de sistemas; acompanhamento
das métricas de desempenho e qualidade dos produtos gerados,
comparando-as com as métricas-padrão do mercado; adequação do
padrão de qualidade e desempenho dos projetos e produtos gerados
com um planejamento financeiro, dentro da capacidade financeira
da empresa; e seleção e triagem de produtos e serviços da área de
software e sistemas que a empresa venha buscar externamente.
www.cliqueapostilas.com.br
AULA 7 • COMPUTAçãO BÁSICA
84 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
j) Engenheiro de Telecomunicações
Profissional que monta, opera e faz manutenção de redes. Na área
comercial, cria e adapta serviços de telecomunicação para clientes
corporativos. Em planejamento, o profissional cria as redes que
poderão dar suporte aos serviços obtidos pela área comercial.
Suas principais atividades são a de manter em funcionamento o equipa-
mento, impedindo interrupções no sistema; especificar o hardware que
vai construir a rede; fazer contato com fornecedores para adquirir novas
tecnologias; e relacionar as necessidades dos clientes com as tecnolo-
gias existentes, propondo novos serviços e novas composições de rede.
k) Programador Web
Profissional responsável pelo desenvolvimento de aplicações para Web.
Suas principais atividades são o desenvolvimento em HTML, aplica-
ções para Internet e intranets, sites de comércio eletrônico.
l) Técnico em Hardware
Profissional que faz a manutenção da estrutura de hardware de uma
empresa, identificando a causa de problemas nas máquinas (se são de
hardware ou de software), e que soluciona os físicos.
Suas principais atividades envolvem a manutenção de computadores,
com diagnóstico e reparo das falhas - encaminhando as de software
para os profissionais encarregados.
m) Webdesigner
Responsável pela criação e adaptação de identidade visual, manu-
tenção de páginas, digitalização e tratamento de imagens, diagra-
mação, animações e confecção de banners.
n) Webdeveloper
Profissional especializado em desenvolvimento para Web. Utiliza o
Webdevelopment como uma especialização da programação normal,
ajustando-a às características próprias da Web e, assim, tornando-a dife-
rente do desenvolvimento de sistemas para desktop ou cliente-servidor.
Suas principais atividades envolvem a análise de requisitos dos clientes,
análise de sistema, modelagem de banco de dados, estimativas de
tempo de desenvolvimento, codificação e testes.
www.cliqueapostilas.com.br
AULA 7 • COMPUTAçãO BÁSICA
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 85
o) Webmaster
Responsável pela estrutura, desenvolvimento, design e gerência de
sites, gerencia uma equipe envolvida com o ambiente Web,desde a
infra-estrutura até o desenvolvimento de sites completos.
7.2 A regulamentação das profissões no Brasil
As profissões de Informática são, hoje, umas das poucas que ainda não
possuem um órgão regulamentador. Ao contrário do que ocorre com as profis-
sões da área de Direito, Medicina, Odontologia, Contabilidade, Jornalismo,
Administração, entre outras, qualquer pessoa que acredite possuir conhe-
cimento e competência suficientes para atuar na área e disponibilizar seus
serviços ao mercado pode atuar como profissional da área de Informática.
A Informática brasileira enfrenta hoje um sério e real problema: Conselhos
de outras profissões já estabelecidas estão avançando sobre a área na tenta-
tiva de se apropriar de atribuições profissionais que até o presente foram exer-
cidas livremente no país.
Várias tentativas foram feitas para solidificar esta profissão como algo inde-
pendente e bem definido, com seu espaço próprio no mercado de trabalho.
Sindicatos e associações profissionais e empresariais foram fundados.
Entretanto, esta consolidação não se dá.
Um dos motivos que levam a pensar profundamente sobre a regulamen-
tação da Informática é acabar com a concorrência injusta de pessoas que
fazem cursos de curta duração e já saem exercendo atividades nesta área e
muitas vezes realizam trabalhos de baixa qualidade o que acaba por causar
uma má impressão sobre os profissionais desta área.
A regulamentação de uma profissão tem como objetivo a proteção da
sociedade contra falsos profissionais, garantindo assim que, ao se contratar
algum serviço, tenha-se certeza de que aquele profissional está qualificado a
prestá-lo, e que ele será responsável por quaisquer danos – sejam eles mate-
riais, físicos, ou de qualquer natureza – que porventura venham a ser causados
em decorrência de seu trabalho. Hoje, um médico é responsável pela perda de
um paciente, mesmo que seja causada por uma falha em um sistema compu-
tacional que ele estava utilizando, quando, na verdade, o profissional que
projetou e implementou aquele sistema (que deve ser da área de Informática)
é quem deveria assumir tal responsabilidade.
www.cliqueapostilas.com.br
AULA 7 • COMPUTAçãO BÁSICA
86 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
7.2.1 O Projeto de Lei
Há quase 10 anos, desde a proposição inicial do projeto, tramita na
Câmara dos Deputados o Projeto de Lei 7.109/06, de autoria do deputado
Bonifácio Andrada (PSDB-MG), que dispõe sobre a regulamentação do exer-
cício das profissões de Informática, cria o Conselho Federal, os Conselhos
Regionais e outras providências.
A seguir, estão listados alguns Projetos de Lei (PL) com tentativas de regu-
lamentar a profissão:
PL815/1995;•
PL 2194/1996 em 01/agosto/1996;•
PL 981/1999 em 20/maio/1999;•
PL 6639/2002 em 24/abril/2002;•
PL 1561/2003 em 29/julho/2003;•
PL 1746/2003 em 08/agosto/2003;•
PL 1947/2003 em 09/setembro/2003;•
PL 7109/2006.•
Síntese da aula
Nesta aula, você aprendeu que a formação acadêmica na área de Informática
possui diversos nomes, com currículos similares e também com formações diferen-
ciadas, devido ao fato de não possuir um órgão que regulamente as atividades
dos profissionais na área de informática. Como exemplo disso, temos os cursos
de Informática, Análise de Sistemas, Ciência da Computação, Engenharia de
Computação, Engenharia de Informação, Sistemas de Informação entre outros.
Você conheceu alguns cursos de formação de nível superior mais comuns
na maioria das universidades públicas e particulares que são os de:
Engenharia da Computação: trata de assuntos relativos à • hardware
(máquinas) que trabalham isoladamente (PCs) ou que compõem uma
rede (ou sistema) de comunicações;
Bacharel em Ciência da Computação: tem seu foco principalmente no •
desenvolvimento dos programas (softwares);
Analista de Sistemas: atua na concepção, na aplicação e na manu-•
tenção dos programas.
www.cliqueapostilas.com.br
AULA 7 • COMPUTAçãO BÁSICA
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 87
A partir das formações de nível superior anteriormente mencionadas, que
podem ser encontradas nas mais diversas universidades do Brasil, podemos
escolher algumas áreas específicas de atuação, tais como:
Administrador de Banco de Dados: responsável pela manutenção e •
refinamento de bancos de dados corporativos;
Administrador de Redes: responsável pela instalação, configuração e manu-•
tenção dos sistemas operacionais e de todos os serviços implementados;
Analista de Segurança: responsável pela segurança da rede, monito-•
rando tentativas de invasão e uso indevido dos recursos da rede;
Analista de Sistemas: responsável pelo levantamento das necessidades •
do cliente e pela elaboração de um modelo conceitual do sistema a
ser desenvolvido;
Analista de • Software Básico: responsável por desenvolver e imple-
mentar sistemas de automação e tempo real;
Analista de Suporte: responsável pela instalação e configuração de •
software e hardware;
Auditor de Sistemas: encarregado de auditar sistemas e redes corpora-•
tivas, identificando fraudes e outros tipos de irregularidades;
Engenheiro de • Hardware: responsável por conceber projetos hardware
para computadores, telecomunicações e outros tipos de equipamento
eletrônico;
Engenheiro de • Software: responsável por criar, manter e auditar meto-
dologias de desenvolvimento de sistemas em uma empresa;
Engenheiro de Telecomunicações: monta, opera e faz manutenção de •
redes. Na área comercial, cria e adapta serviços de telecomunicação
para clientes corporativos;
Programador • Web: responsável pelo desenvolvimento de aplicações
para Web;
Técnico em • Hardware: faz a manutenção da estrutura de hardware
de uma empresa, identifica a causa de problemas nas máquinas e
soluciona os físicos;
Webdesigner: responsável pela criação e adaptação de identidade •
visual, manutenção de páginas, digitalização e tratamento de imagens,
diagramação, animações e confecção de banners;
www.cliqueapostilas.com.br
AULA 7 • COMPUTAçãO BÁSICA
88 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Webdeveloper• : desenvolvimento para Web. Utiliza o Webdevelopment
como uma especialização da programação normal, ajustando-a às
características próprias da Web;
Webmaster• : responsável pela estrutura, desenvolvimento, design e
gerência de sites, gerencia uma equipe envolvida com o ambiente Web,
desde a infra-estrutura até o desenvolvimento de sites completos.
Você pôde entender que as profissões de informática são, hoje, umas das
poucas que ainda não possuem um órgão regulamentador.
Entendeu que a informática brasileira enfrenta hoje um sério e real
problema: conselhos de outras profissões já estabelecidas estão avançando
sobre a área na tentativa de se apropriar de atribuições profissionais que até
o presente foram exercidas livremente no país.
Pôde compreender também que um dos motivos que levam a pensar sobre a
regulamentação da informática é acabar com a concorrência injusta de pessoas
que fazem cursos de curta duração e já saem exercendo atividades nesta área e
também a proteção da sociedade contra falsos profissionais, garantindo assim
que, ao se contratar algum serviço, tenha-se certeza de que aquele profissional
está qualificado a prestá-lo, e que ele será responsável por quaisquer danos.
Você tomou conhecimento que existem alguns Projetos de Lei há quase dez
anos. Desde a proposição inicial do projeto, tramita na Câmara dos Deputados o
Projeto de Lei 7.109/06, de autoria do deputado Bonifácio Andrada (PSDB-MG),
que dispõe sobre a regulamentação do exercício das profissões de Informática,
cria o Conselho Federal, os Conselhos Regionais e outras providências.
Atividades
1. Analise as assertivas e destaque, entreas atribuições de um profissional que
obteve a formação em Engenharia da Computação, qual(is) podemos citar.
I. Trata de assuntos relativos à hardware (máquinas) que trabalham isolada-
mente (PCs) ou que compõem uma rede (ou sistema) de comunicações.
II. Responsável pela arquitetura da rede e da organização física de compu-
tadores e periféricos. Projeta e constrói alguns tipos de hardware.
III. Atua na concepção, na aplicação e na manutenção dos programas e
aplicativos.
IV. Planejamento e administração da rede de computadores de uma
empresa também estão entre suas atribuições.
www.cliqueapostilas.com.br
AULA 7 • COMPUTAçãO BÁSICA
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 89
Assinale a alternativa incorreta:
a) Somente I e IV estão corretas.
b) I, II e III estão corretas.
c) Somente a III está incorreta.
d) Todas as alternativas estão corretas.
2. A respeito da regulamentação profissões da área de informática, podemos
afirmar que:
I. as profissões de Informática são, hoje, umas das poucas que ainda não
possuem um órgão regulamentador, ao contrário do que ocorre com as
profissões da área de Direito, Medicina, Odontologia, Contabilidade,
Jornalismo, Administração, entre outras;
II. a regulamentação de uma profissão tem como objetivo a proteção
da sociedade contra falsos profissionais, garantindo assim que, ao se
contratar algum serviço, tenha-se certeza de que aquele profissional está
qualificado a prestá-lo, e que ele será responsável por quaisquer danos;
III. são alguns Projetos de Lei com tentativas de regulamentar a profissão:
PL815/1995, PL 2194/1996 em 01/agosto/1996, PL 981/1999 em 20/
maio/1999, PL 1947/2003 em 09/setembro/2003, PL 7109/2006;
IV. a informática brasileira enfrenta hoje um sério e real problema, no
qual os conselhos de outras profissões já estabelecidas estão tentando
se apropriar de atribuições profissionais da área de informática.
Assinale a alternativa incorreta:
a) Somente I e IV estão corretas.
b) Somente I, III e IV estão corretas.
c) Somente a I está incorreta.
d) Todas as alternativas estão corretas.
3. Leia atentamente as afirmações, assinalando com um (V) as afirmativas
verdadeiras e com (F) as falsas.
( ) Um Administrador de Banco de Dados é o responsável pela manu-
tenção e refinamento de bancos de dados corporativos.
( ) O Analista de Segurança é o responsável pela segurança da rede
(equipamento, sistemas operacionais de servidores e clientes e
programas utilizados). Também monitora tentativas de invasão e
www.cliqueapostilas.com.br
AULA 7 • COMPUTAçãO BÁSICA
90 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
uso indevido dos recursos da rede, além de definir e manter as
regras de uso dos recursos computacionais da empresa.
( ) Analista de Sistemas é o responsável pelo levantamento das neces-
sidades do cliente e pela elaboração de um modelo conceitual do
sistema a ser desenvolvido. Entre suas principais atividades, estão
a manutenção e refinamento de bancos de dados, as alterações
na estrutura do banco para expansão e adaptações de sistemas,
monitoramento e identificação de falhas para aperfeiçoamento
de bancos de dados.
( ) Um Administrador de Redes é o responsável pela instalação, confi-
guração e manutenção dos sistemas operacionais e de todos os
serviços implementados, além da configuração e manutenção do
nível de segurança da rede.
Agora, assinale a alternativa que corresponde à sua resposta.
a) V, V, F, V
b) F, V, F, V
c) F, F, V, V
d) V, V, V, F
4. Ainda sobre as áreas de atuação dos profissionais de informática, indique
a alternativa incorreta quanto às atribuições de cada profissional.
a) Webmaster é o responsável pela estrutura, desenvolvimento,
design e gerência de sites, gerencia uma equipe envolvida com o
ambiente Web, desde a infra-estrutura até o desenvolvimento de
sites completos.
b) Engenheiro de Software Profissional é responsável pela instalação e
configuração de software e hardware; instalação e configuração de
ambiente para o usuário (incluindo sistemas operacionais e principais
aplicativos); instalação e configuração de servidores; e desenho da
rede interna da empresa.
c) O Engenheiro de Telecomunicações é o profissional que monta, opera
e faz manutenção de redes. Na área comercial, cria e adapta serviços
de telecomunicação para clientes corporativos. Em planejamento, o
profissional cria as redes que poderão dar suporte aos serviços obtidos
pela área comercial.
www.cliqueapostilas.com.br
AULA 7 • COMPUTAçãO BÁSICA
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 91
d) Engenheiro de Hardware é o profissional responsável por conceber
projetos hardware para computadores, telecomunicações e outros
tipos de equipamento eletrônico.
Comentário das atividades
Para a atividade 1, se você escolheu a opção (c), você acertou! Isso
mesmo, a concepção, na aplicação e na manutenção dos programas e apli-
cativos é uma atribuição própria do Analista de Sistemas, o Engenheiro de
Computação atua principalmente nas áreas relativas a hardware de equi-
pamentos computacionais. Parabéns, se você respondeu corretamente, pois
alcançou uns dos nossos objetivos, que é o de conhecer a diferença entre as
áreas formação profissional mais comuns na área de informática. Caso sua
resposta tenha sido diferente, você deverá rever a aula!
Para a atividade 2, a resposta correta é a alternativa (d). Parabéns,
se você acertou, pois significa que atingiu um dos nossos objetivos de
entender sobre a situação de regulamentação profissional das áreas de
informática. Caso sua resposta tenha sido outra, você deverá voltar ao
conteúdo que trata das regulamentação das profissões da área de infor-
mática e buscar listar os pontos críticos pela não regulamentação dos
profissionais desta área.
Na atividade 3, se você optou pela alternativa (a), parabéns! A
alternativa falsa das afirmativas é a terceira, uma vez que o Analista de
Sistemas é o responsável somente pelo levantamento das necessidades
do cliente e pela elaboração de um modelo conceitual do sistema a ser
desenvolvido. As atividades de manutenção e refinamento de bancos de
dados, as alterações na estrutura do banco para expansão e adaptações
de sistemas, monitoramento e identificação de falhas para aperfeiçoa-
mento de bancos de dados são atividades próprias do Administrador de
Banco de Dados.
Para a atividade 4, se você escolheu a alternativa (b), você acertou! O
Engenheiro de Software Profissional é responsável por criar, manter e auditar
metodologias de desenvolvimento de sistemas em uma empresa. Suas princi-
pais atividades envolvem criação, manutenção e auditoria de metodologias
de desenvolvimento de sistemas; acompanhamento das métricas de desem-
penho e qualidade dos produtos gerados, comparando-as com as métricas-
padrão do mercado.
www.cliqueapostilas.com.br
AULA 7 • COMPUTAçãO BÁSICA
92 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Referências
ALMEIDA, Marcus Garcia de. Fundamentos de Informática. 2. ed. Rio de
Janeiro: Brasport, 2002.
BROOKSHEAR, J. Glenn. Ciência da Computação: uma visão abrangente.
7. ed. Porto Alegre: Bookman, 2004.
MARÇULA, Marcelo; BENINI FILHO, Pio Armando. Informática: conceitos e
aplicações. São Paulo: Érica, 2005.
POLLONI. Enrico G. F.; FEDELI, Ricardo Daniel; PERES, Fernando Eduardo.
Introdução à Ciência da Computação. São Paulo: Thomson, 2003.
VELLOSO, Fernando de Castro. Informática: conceitos básicos. 7. ed. Rio de
Janeiro: Campus, 2004.
Anotações
www.cliqueapostilas.com.br
www.cliqueapostilas.com.br
Cr
éd
it
os
EQUIPE UNITINS
Organização de Conteúdos Acadêmicos
Silvio CostaSampaio
Coordenação Editorial
Maria Lourdes F. G. Aires
Assessoria Editorial
Darlene Teixeira Castro
Assessoria Produção Gráfica
Katia Gomes da Silva
Revisão Didático-Pedagógica
Sibele Letícia Rodrigues de Oliveira Biazotto
Revisão Lingüístico-Textual
Sibele Letícia Rodrigues de Oliveira Biazotto
Revisão Digital
Sibele Letícia Rodrigues de Oliveira Biazotto
Projeto Gráfico
Douglas Donizeti Soares
Irenides Teixeira
Katia Gomes da Silva
Ilustração
Geuvar S. de Oliveira
Capa
Igor Flávio Souza
EQUIPE FAEL
Coordenação Editorial
Leociléa Aparecida Vieira
Assessoria Editorial
William Marlos da Costa
Revisão
Juliana Camargo Horning
Lisiane Marcele dos Santos
Programação Visual e Diagramação
Denise Pires Pierin
Kátia Cristina Oliveira dos Santos
Rodrigo Santos
Sandro Niemicz
William Marlos da Costa
www.cliqueapostilas.com.br
A
pr
es
en
ta
çã
o
Este caderno de Algoritmos e Programação tem o objetivo de auxiliá-lo
no estudo da codificação de programas a partir de uma Linguagem de
Programação. Existem várias Linguagens de Programação, cada uma com
suas características próprias. Como Linguagem de Programação escolhida,
estudaremos a Linguagem C.
C é uma linguagem poderosa, robusta, flexível e madura. É, sem dúvida,
uma das linguagens mais utilizadas nos ambientes acadêmico e científico,
além de ser comercialmente relevante.
Conhecer suas principais estruturas e detalhes requer um estudo criterioso e
profundo. Para dominar uma Linguagem de Programação, seja qual for, é sempre
necessário estudar a sua sintaxe, ou seja, as formas como os comandos e expres-
sões devem ser escritos. Felizmente, a C é uma linguagem de sintaxe simples e
elegante que permite rápido entendimento pelo programador, mesmo iniciante.
Nesse contexto, procuramos abordar os tópicos essenciais que nos permita
escrever um programa completo e útil na Linguagem C.
Entre as principais características da Linguagem C, estão grande flexibili-
dade, escrita compacta, padronização bem feita e alta velocidade de proces-
samento. Por essas características, essa linguagem é tão popular.
Bons estudos!
Prof. Silvio Costa Sampaio
www.cliqueapostilas.com.br
Pl
an
o
de
E
ns
in
o
EMENTA
Programação em Linguagem C. Estruturas de dados homogêneas e hetero-
gêneas. Modularização de Algoritmos.
OBJETIVOS
Apresentar a Linguagem C, os operadores e estruturas de controle.•
Compreender estruturas de dados homogêneas e heterogêneas.•
CONTEÚDO PROGRAMÁTICO
Introdução à Programação em Linguagem C•
Operadores•
Estruturas de controle•
Modularização em C: uso de Funções•
Estruturas de dados homogêneas (vetores e matrizes) e heterogêneas •
(estruturas)
Ponteiros e alocação dinâmica•
Arquivos•
www.cliqueapostilas.com.br
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 97
BIBLIOGRAFIA
ASCENCIO, Ana Fernanda Gomes; CAMPOS, Edilene Aparecida Veneruchi
de. Fundamentos da programação de computadores: Algoritmos, Pascal e C/
C++. São Paulo: Pearson Prentice Hall, 2003.
DEITEL, H. M.; DEITEL, P. J. Como programar em C. Rio de Janeiro: LTC, 1999.
MIZRAHI, V. V. Treinamento em Linguagem C: Módulos 1 e 2. São Paulo:
Makron Books do Brasil, 1993.
ORTH, Afonso Inácio. Algoritmos e programação com resumo das Linguagens
Pascal e C. Porto Alegre: AIO, 2001.
ZIVIANI, Nivio. Projeto de Algoritmos: com implementações em Pascal e C.
2. ed. São Paulo: Thomson, 2004.
www.cliqueapostilas.com.br
www.cliqueapostilas.com.br
AULA 1 • ALgORITMOS E PROgRAMAçãO
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 99
Objetivos
Esperamos que, ao final desta aula, você seja capaz de:
conhecer os conceitos fundamentais da Linguagem C;•
construir um programa básico em C.•
Pré-requisitos
Para atingir os objetivos desta aula, você deve possuir conhecimento prévio
de técnicas de criação de algoritmos, particularmente de pseudocódigo. Isso é
necessário, na verdade, para todas as aulas que compõem este caderno, pois
ao longo do texto são feitas referências aos conceitos estudados nas aulas de
Lógica para Programação. Procure sempre relacionar os conteúdos estudados
nesta disciplina com as outras.
Introdução
O histórico da Linguagem C tem início em 1970, quando o programador
Denis Ritchie desenha uma linguagem, nos laboratórios da Bell Telephones,
Inc., chamada simplesmente de B. No ano de 1978, Brian Kerningham
junta-se a Ritchie para aprimorar a Linguagem B e acabam gerando uma
nova versão. À nova versão foi dado o nome de C. Por suas características
de portabilidade e estruturação mais compacta, a Linguagem C se torna
popular entre os programadores.
Em meados de 1980, a linguagem C é padronizada pelo American
National Standard Institute: surge o ANSI C. Em 1990, a empresa de software
Borland International Co., fabricante de compiladores profissionais, escolhe o
C e o Pascal como linguagens de trabalho para o seu Integrated Development
Enviroment (Ambiente Integrado de Desenvolvimento): surge o Turbo C.
Aula 1
Introdução à programação em
Linguagem C
www.cliqueapostilas.com.br
AULA 1 • ALgORITMOS E PROgRAMAçãO
100 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
O Turbo C implementa funções específicas para o ambiente Windows,
fugindo à especificação ANSI C. Isso dá origem, no meio técnico, a uma divisão
da Linguagem C em dois padrões de codificação distintos: o ANSI C e Borland C.
Neste caderno, estudaremos as definições segundo o padrão ANSI C.
A Linguagem C apresenta uma gama relativamente grande de tipos de
variáveis. Permite ainda a criação de estruturas de dados não homogêneas,
como os registros. Outra característica marcante dessa linguagem é o seu
extenso acesso ao hardware, permitindo a programação em baixo nível.
Na verdade, a Linguagem C é bastante pequena quando comparada a
outras da sua época. Isso é possível, pois no C os aspectos não indispensáveis
da linguagem são implementados como uma biblioteca de funções, que pode
ser estendida pelo programador.
As idéias por trás de C são tão simplificadoras e naturais que ela serve de
base para outras linguagens. Muitos compiladores e ambientes de desenvolvi-
mento (IDE) de outras linguagens são implementados em Linguagem C.
Nesta aula, serão abordados os conceitos fundamentais da programação
em Linguagem C. Estudaremos os detalhes básicos de um programa codificado
nessa linguagem. Esta aula é de fundamental importância para se iniciar na
programação usando essa linguagem.
1.1 Estrutura de um programa em C
Um programa em C é constituído, normalmente, de:
cabeçalho• : contém as diretivas de compilador em que se definem o
valor de constantes simbólicas, declaração de variáveis, inclusão de
bibliotecas, declaração de rotinas, etc.;
bloco• de instruções principal e outros blocos de rotinas;
documentação do programa• : comentários.
A seguir, cada parte fundamental de um programa em C é discutida.
1.1.1 Conjunto de caracteres válido
Um programa fonte em C é, na prática, um texto não formatado escrito
em um editor de textos usando um conjunto padrão de caracteres ASCII. Como
característica de cada linguagem é definido o conjunto de caracteres que
poderão ser usados nesse arquivo fonte.
www.cliqueapostilas.com.br
AULA 1 • ALgORITMOS E PROgRAMAçãO
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 101
A seguir, estão os caracteres permitidos na linguagem C.
Caracteres válidos:
a b c d e f g h i j k l m n o p q r s t u v w x y z
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
1 2 3 4 5 6 7 8 9 0
+ - * / \ = | & ! ? # % ( ) { } [ ] _ ‘ “ . , : < >
O uso de algum caractere inválido (fora desse conjunto) dará
origem a um erro na geração do programa. Por isso, é muito importanteconhecer esse conjunto de caracteres antes de iniciar a codificação em
qualquer linguagem.
1.1.2 Palavras-chave
São identificadores que não podem ser usados pelo usuário – para
identificar uma variável ou função, por exemplo, e também são ou consti-
tuem partes de comandos ou declarações da linguagem.
As palavras-chave são bem poucas, se compararmos com o número de
comandos de outras linguagens como PASCAL. A seguir, são listadas todas
as palavras-chave da Linguagem C (SILVEIRA FILHO, 1997).
auto double int struct
break else long switch
case enum register typedef
char extern return union
const float short unsigned
continue for signed void
default goto sizeof volatile
do if static while
Esse conjunto de palavras-chave pode variar de compilador para
compilador, podendo ter algumas palavras extras, específicas de cada
compilador. Porém o uso de palavras-chave fora do padrão poderá criar
problemas, caso você queira que um determinado programa construído por
você possa ser levado de um compilador para outro ou mesmo para outra
www.cliqueapostilas.com.br
AULA 1 • ALgORITMOS E PROgRAMAçãO
102 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
máquina. A essa característica de podermos migrar um programa com um
mínimo de modificações chamamos de portabilidade. Se você pretende
fazer com que seu programa seja o mais portável possível, evite o uso de
palavras-chave diferentes das anteriores.
Cabe ressaltar que todas as palavras-chave na Linguagem C devem ser
escritas em letra minúscula. O C distingue as letras minúsculas de maiús-
culas. A essa característica chamamos de case-sensitive. Com isso, os iden-
tificadores int e Int são considerados identificadores diferentes pelo compi-
lador. Essa característica, pouco comum em outras linguagens, poderá lhe
causar confusão no início de seus estudos em C.
1.1.3 Comentários
Durante a codificação de um programa, muitas vezes precisamos
explicar determinados trechos de código a fim de tornar mais fácil o seu
entendimento, principalmente quando a codificação é realizada em equipe
– muito comum em empresas de software. O uso de comentário deve ser
uma prática constante, pois você deve sempre assumir a possibilidade de
outro programador ter de manter ou continuar o seu código e, nesse caso,
qualquer informação adicional que permita entender melhor o seu código
será útil. Algumas empresas avaliam a qualidade da codificação de um
programador por sua habilidade em inserir comentários úteis e claros em
seu código.
Em C, comentários podem ser escritos em qualquer lugar do texto para
facilitar a interpretação do algoritmo. Para que o comentário seja identifi-
cado como tal, você pode delimitar o trecho de duas formas:
caso o trecho a ser comentado ocupe apenas uma linha, basta •
inserir duas barras seguidas no início da linha. Com isso, o compi-
lador entende que todo o trecho que estiver à direita da linha deve
ser considerado como comentário;
caso o trecho a ser comentado ocupe mais de uma linha, •
é necessário delimitar o início e o final do comentário. Para
indicar o início de um comentário, você deve usar o caractere
barra seguido do caractere asterisco. Para indicar o final de um
comentário, você deve usar o caractere asterisco seguido de um
caractere barra.
www.cliqueapostilas.com.br
AULA 1 • ALgORITMOS E PROgRAMAçãO
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 103
O exemplo a seguir mostra trechos de comentário nas duas formas
citadas.
// Comentário de uma linha
/*
Esse programa foi desenvolvido pelo
Fulano de Tal
Blá, blá, blá
*/
1.1.4 Diretivas de compilação
Na Linguagem C, existem comandos que não denotam instruções e são
processados apenas durante a compilação do programa. Esses comandos
são chamados de diretivas de compilação.
Esses comandos informam ao compilador do C as opções que deverão
ser utilizadas na geração do programa.
A diretiva #include, por exemplo, informa ao compilador para incluir
na compilação do programa outros arquivos que incluem códigos ou defi-
nições usadas no programa. Geralmente, esses arquivos informados pela
diretiva #include contêm bibliotecas de funções ou rotinas do usuário. Outra
diretiva muito utilizada é a #define que informa ao compilador quais são as
constantes simbólicas usadas no programa.
A linha #include <stdio.h>, por exemplo, diz ao compilador que ele
deve incluir o arquivo-cabeçalho stdio.h. Nesse arquivo, existem definições
de funções úteis para entrada e saída de dados. Assim, toda vez que você
quiser usar uma dessas funções, deverá incluir esse comando.
É de fundamental importância para o aprendizado da Linguagem C
que você procure conhecer o conjunto de bibliotecas de funções do C.
Por exemplo, para você poder utilizar as funções de manipulação de
variáveis do tipo literal (string), é necessário incluir a diretiva “#include
<string.h>”; caso contrário, o compilador não irá reconhecer as funções
usadas no programa.
Infelizmente, nesse caderno não é possível apresentar todo o conjunto
de bibliotecas do C. Mas você deve conhecê-lo!
www.cliqueapostilas.com.br
AULA 1 • ALgORITMOS E PROgRAMAçãO
104 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
1.1.5 Declaração de variáveis e constantes
As variáveis no C devem ser declaradas antes de serem usadas. É na
declaração de uma variável que devemos explicitar qual o seu tipo e indicar
ao computador a necessidade de reservar um espaço em memória para
conter o valor para essa variável.
Em C, uma variável deve ser sempre declarada usando a seguinte
sintaxe: <tipo_de_dados> <identificador> [, <identificador>...];. Os tipos de
dados da linguagem C são discutidos a seguir. Exemplos de declaração de
variáveis em C:
int numero; // declara a variável número do tipo inteiro
float a,b; // declara as variáveis a e b do tipo real
Um ponto importante na declaração de variáveis e constantes em C é
a formação dos identificadores. Os identificadores em C podem iniciar por
qualquer letra maiúscula ou minúscula ou o sinal de sublinhado (underscore)
– representado pelo sinal “_”. No meio de um nome, poderá haver letras,
números ou o sinal de sublinhado e nada mais.
Cabe ainda sugerir que você utilize identificadores com sentido explí-
cito. Por exemplo, se você tiver de criar uma variável para armazenar a
soma total de produtos, deve utilizar um identificador como soma_total_
produtos, ao invés de usar soma ou apenas n.
É importante lembrar também que você não poderá usar como iden-
tificador de variável nem o mesmo identificador de uma palavra-chave
nem o de uma função já definida em uma biblioteca ou no próprio
programa.
1.1.5.1 Tipos de dados e modificadores
As diferenças entre os tipos de variáveis do pseudocódigo para o C
são: o tipo inteiro é mapeado para int; o tipo real é mapeado para float ou
double; e o tipo caractere é mapeado para char.
A Linguagem C ainda permite alterar a precisão dos valores com
a utilização de modificadores e com isso acaba definindo novos tipos
de dados. A seguir, são listados os modificadores de tipo usados na
Linguagem C.
www.cliqueapostilas.com.br
AULA 1 • ALgORITMOS E PROgRAMAçãO
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 105
TIPO DE DADO
TAMANHO
(EM bitS)
CAPACIDADE DE REPRESENTAçãO
Char 8 -127 a 127
unsigned char 8 0 a 255
signed char 8 -127 a 127
Int 16 -32767 a 32767
unsigned int 16 0 a 65.535
signed int 16 -32767 a 32767
short int 16 -32767 a 32767
unsigned short int 16 0 a 65.535
signed short int 16 -32767 a 32767
long int 32 -2.147.483.647 a 2.147.483.647
signed long int 32 -2.147.483.647 a 2.147.483.647
unsigned long int 32 0 a 4.294.967.295
Float 32 seis dígitos de precisão
Double 64 dez dígitos de precisão
long double 80 dez dígitos de precisão
Fonte:Feitosa (2004).
1.1.5.2 Escopo de uma variável
O escopo de uma variável define a visibilidade de uma variável, ou seja,
onde ela pode ser referenciada em seu programa. Na Linguagem C, uma
variável pode assumir um de três escopos:
variáveis locais• : é declarada dentro de um bloco de código, sendo
apenas visível dentro dele;
variáveis não locais• : variáveis declaradas em um bloco que contenha
outro bloco dentro de si são chamadas de não locais quando estiverem
no bloco mais interno, no entanto continuam sendo visíveis;
variáveis globais• : uma variável declarada fora de todas as funções é
também chamada de variável global.
Normalmente, você irá utilizar variáveis globais quando um valor precisar
ser conhecido e manipulado em várias partes do programa. Já as variáveis
locais serão utilizadas quando a variável tem uma função específica dentro de
um bloco de comandos (por exemplo, contador de repetição).
1.1.5.3 Constantes
Constantes são valores que são mantidos fixos pelo compilador. Para o C,
uma constante pode ter quatro classificações. Vejamos.
www.cliqueapostilas.com.br
AULA 1 • ALgORITMOS E PROgRAMAçãO
106 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Constante de um tipo básico• : esse é o tipo de constante mais comum
em um programa em C. Essas constantes derivam de um tipo de dado
básico da linguagem. A listagem a seguir apresenta essas constantes.
Tipo de Dado Exemplos
Char ‘a’ ‘\0’ ‘\t’
Int 5 2345 -17
long int 234000 -509876
short int 120 -12
unsigned int 50000 35678
Float 0.0 23.7 -12.3e-10
Double 12546354334.0 - 0.0000034236556
Constante hexadecimal • ou octal: em alguns casos, precisamos utilizar
valores constantes hexadecimais (base dezesseis) ou octais (base oito)
no programa. A linguagem C permite o uso de constantes desse tipo,
no qual uma constante hexadecimal inicia com 0x e uma octal com
0. Por exemplo, os valores 0xF2 e 0362 representam o valor 242 (em
decimal) em hexadecimal e octal;
Constante string• : para a linguagem C, uma string é uma variável
do tipo literal, ou seja, um conjunto de caracteres. Uma constante
string é delimitada por um par de aspas. Por exemplo, uma string
“Florianópolis” é, na verdade, uma constante string;
Constante de formatação• : essas constantes, também conhecidas como
constantes de barra invertida, são usadas para formatar a saída de
dados. Essas constantes são usadas como um caractere comum, por
exemplo ‘\t’ para a tabulação horizontal. A listagem a seguir apre-
senta a lista dessas constantes.
Código Significado
\b Retrocesso (back)
\f Alimentação de formulário (form feed)
\n Nova linha (new line)
\r Retorno de carro (carriage return)
\t Tabulação horizontal (tab)
\” Aspas
\’ Apóstrofo
\0 Nulo (0 em decimal)
\\ Barra invertida
\v Tabulação vertical
www.cliqueapostilas.com.br
AULA 1 • ALgORITMOS E PROgRAMAçãO
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 107
\a Sinal sonoro (beep)
\N Constante octal (N é o valor da constante)
\xN Constante hexadecimal (N é o valor da constante)
1.1.6 A função principal main()
Todo programa em C tem de ter uma função main (principal, em inglês). É
essa função que será chamada quando o programa for executado. Assim, é a
partir dessa função que invocamos as demais funções do nosso programa.
A declaração da função main() pode conter parâmetros formais. Mas a defi-
nição desses parâmetros é determinada pela linguagem, não podendo ser alte-
rada – apenas omitida. A declaração mais completa que se pode ter para a
função main() é: int main (int argc,char *argv[]);.
Os parâmetros argc e argv dão ao programador acesso à linha de comando
com a qual o programa foi chamado. Assim, é possível receber valores direta-
mente na chamada do programa.
O parâmetro argc (contador de argumentos – do inglês argument count) é
um inteiro e possui o número de argumentos com os quais a função main() foi
chamada na linha de comando. Ele possui o valor mínimo de um, pois o nome do
programa é contado como sendo o primeiro argumento.
O parâmetro argv (valores dos argumentos – do inglês argument values)
é um ponteiro para um vetor de strings. Cada string desse vetor armazena um
dos parâmetros passados na linha de comando. Assim, a instrução argv[0]
sempre aponta para o nome do programa (que, como já foi dito, é considerado
o primeiro argumento).
1.1.7 Blocos de comandos
Em C, assim como em pseudocódigo, um bloco de comando representa uma
estrutura seqüencial de instruções que deverão ser executadas uma após a outra.
Um bloco é definido no pseudocódigo pelas palavras INICIO/FIM, na Linguagem C
serão representados por um par de chaves “{ }”. A seguir, é mostrado um exemplo
que permite comparar o uso de blocos em pseudocódigo e em Linguagem C.
Em pseudocódigo:
VAR x, y: real;
valor: inteiro;
INICIO
valor ← x + y;
FIM
Em linguagem C:
float x,y;
int valor;
int main()
{valor = x + y;
}
www.cliqueapostilas.com.br
AULA 1 • ALgORITMOS E PROgRAMAçãO
108 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
1.1.8 Entrada e saída de dados
A Linguagem C oferece um grande conjunto de funções que permite ler
valores dos dispositivos de entrada e escrever nos dispositivos de saída. Iremos
estudar as mais utilizadas.
1.1.8.1 Lendo um caractere do teclado
Para ler um caractere do teclado, utilize a função getchar(). Ela faz parte
do arquivo de cabeçalho stdio.h. Sua utilização é:
variavel = getchar();
Essa função retorna o valor inteiro referente ao código ASCII do caractere
lido, porém você pode atribuir esse valor a uma variável do tipo caractere.
Caso ocorra um erro, ela retorna EOF.
1.1.8.2 Exibindo um caractere
Para exibir um caractere, você pode usar a função putchar(), que está no
arquivo de cabeçalho stdio.h. Sua sintaxe é:
putchar(variavel)
em que variável é um número inteiro, porém você pode passar variável como um
caractere. putchar retorna o caractere exibido ou EOF, caso ocorra algum erro.
1.1.8.3 Lendo uma string do teclado
Você pode ler uma string do teclado usando as funções gets() e fgets(). Elas
fazem parte do arquivo de cabeçalho stdio.h.
Alguns compiladores C, como o gcc, desencorajam o uso da função gets.,
por causa de um problema conhecido como bufferoverflow (estouro de buffer,
em inglês). A própria man page, do gcc em Linux, para a função gets, explica
o problema em sua seção PROBLEMAS. Vejamos.
Nunca use gets(). Porque é impossível saber, sem conhecer antecipada mente os
dados, quantos caracteres gets() vai ler, e porque gets() vai continuar a guardar
caracteres ultrapassado o fim do ‘buffer’, ela é extremamente perigosa de usar. Esse
comportamento tem sido utilizado para quebrar a segurança de computadores. Use
fgets() no seu lugar (DIAS NETO, [200-]).
Abordaremos apenas o uso e a sintaxe da função fgets(), que substitui a
função gets() na leitura de string. É a seguinte:
www.cliqueapostilas.com.br
AULA 1 • ALgORITMOS E PROgRAMAçãO
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 109
fgets (STRING,TAMANHO,STREAM),
em que:
STRING• é a variável onde a string será armazenada;
TAMANHO é o tamanho máximo da • string;
STREAM• é de onde os caracteres serão lidos, para ler do teclado o
valor padrão para isso é stdin.
1.1.8.4 Exibindo uma string
Você pode exibir uma string usando a função printf ou a função puts(). Elas
fazem parte do arquivo de cabeçalho stdio.h.
A sintaxe de printf para a exibir uma string é:
printf(“%s”,STRING);
A sintaxe de puts é:
puts(string)
1.1.8.5 Saída formatada (printf)
A saída formatada é feita utilizando a função printf vista anteriormente. A
sintaxe geral do comando printf é:
printf (“<string de formatação>”,<lista de variáveis>),
em que:
o <string de formatação>deve estar sempre entre parênteses e deve •
conter um conjunto de especificadores de formato que dirão ao
computador como o dado deverá ser formatado. Os especificadores
de formato em C são os listados a seguir.
ESPECIFICADOR FORMATO
%d inteiro
%o inteiro em formato octal
%x
%X
inteiro em formato hexadecimal
%u unsigned int
%ld long int
%f float
%c char
%e
%E
float em formato exponencial
www.cliqueapostilas.com.br
AULA 1 • ALgORITMOS E PROgRAMAçãO
110 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
ESPECIFICADOR FORMATO
%g
%G
float. C escolhe melhor maneira de exibição
entre normal e exponencial
%s string
%p endereço de um ponteiro
%n quantos caracteres a função printf exibiu
Fonte: Dias Neto ([200-]).
a <lista de variáveis> é uma seqüência de variáveis ou expressões •
separadas por vírgula. Você deve informar uma variável para cada
especificador de formato que compõem o string de formatação.
1.1.8.6 Entrada formatada (scanf)
A entrada formatada é feita utilizando a função scanf. Ela faz parte do
arquivo de cabeçalho stdio.h. Sua sintaxe é:
scanf(“<string de formatação>”,&variável)
O <string de formatação> segue a mesma sintaxe da função printf.
Observe que o valor entrado é passado para o endereço da variável.
No caso de leitura de uma string, não há necessidade do operador &, já que
o nome de uma string sem o índice é entendido pela Linguagem C como um
ponteiro para o início da string.
1.2 Exemplo de um programa básico em C
Com base nos conceitos apresentados até aqui, podemos definir a estru-
tura de um programa básico em C, como mostrado no código a seguir:
#include <stdio.h>
/* Programa exemplo */
int main()
{
int n = 0;
int x;
printf (“Digite um valor inteiro: “);
scanf (“%d”, x);
}
Nesse exemplo, você pode reconhecer os principais elementos de um
programa em C:
um cabeçalho contendo as diretivas de compilador: nesse caso, a diretiva •
#include <stdio.h> diz ao compilador para incluir a biblioteca stdio;
www.cliqueapostilas.com.br
AULA 1 • ALgORITMOS E PROgRAMAçãO
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 111
um bloco de instruções principal: nesse caso, todo o bloco delimi-•
tado pelo par de chaves;
documentação do programa: em nosso exemplo, temos o comen-•
tário “/* Programa exemplo */”.
Síntese da aula
Nesta aula, apresentamos os conceitos fundamentais da programação
em Linguagem C. Abordamos os componentes principais de um programa
nessa linguagem, como a declaração de variáveis, os tipos de dados, entre
outros. A partir do conteúdo estudado nesta aula, já é possível codificar
programas simples usando a Linguagem C.
Atividades
1. Com base em seus conhecimentos sobre a Linguagem C, indique a
alternativa incorreta.
a) Todo programa em C deve possuir uma função main().
b) A diretiva #include <stdio.h> indica ao compilador C que as
declarações de funções da biblioteca “stdio” devem ser usadas
nesse programa.
c) 0x123 representa uma constante em hexadecimal.
d) Considerando a declaração anterior “int valor;”, a instrução printf
(“%s”, valor) deve ser usada para imprimir a variável valor.
e) A função main() pode receber parâmetros da linha de comando.
2. Construa um programa básico em C que leia uma variável inteira, outra
real do teclado e imprima o valor digitado.
Comentário das atividades
Na atividade 1, com base no que foi estudado nesta aula, você deveria
ter concluído que a única opção incorreta é a opção (d), pois nessa opção a
variável valor é declarada como um inteiro e, portanto, a impressão do seu
valor deveria usar o string de formatação “%d”, e não “%s” como argumento
para a função printf; a opção (a) está correta, pois todo programa em C
deve possuir uma função main ( ), uma vez que essa é a função principal do
programa; a opção (b) também está correta, pois a diretiva #include é usada
www.cliqueapostilas.com.br
AULA 1 • ALgORITMOS E PROgRAMAçãO
112 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
justamente para inserir definições de bibliotecas do compilador ou criadas pelo
próprio programador; a opção (c) está correta, pois em C uma constante hexade-
cimal deve sempre iniciar pelos caracteres 0x; e, por fim, a opção (e) está correta,
pois, como estudamos, a função main() permite o uso dos parâmetros argv e
argc, que permitem receber parâmetros diretamente da linha de comando.
A atividade 2 é muito simples e pressupõe apenas que você tenha enten-
dido os principais elementos de um programa em Linguagem C. Uma solução
possível para essa atividade seria:
#include <stdio.h>
int main()
{
int var1;
float var2;
printf (“\nInforme o valor inteiro: “);
scanf (“%d”, &var1);
printf (“\nInforme o valor real: “);
scanf (“%f”, &var2);
printf (“\nValor inteiro: %d”, var1);
printf (“\Valor real: %f”, var2);
}
Referências
ASCENCIO, Ana Fernanda Gomes; CAMPOS, Edilene Aparecida Veneruchi
de. Fundamentos da programação de computadores: algoritmos, Pascal e C/
C++. São Paulo: Pearson Prentice Hall, 2003.
DEITEL, H. M.; DEITEL, P. J. Como programar em C. Rio de Janeiro: LTC, 1999.
DIAS NETO, Samuel. Linguagem C: intermediário. [S.l.: s.n.]: [200-]. Disponível em:
<http://br.geocities.com/sdiasneto/c_int/printf.htm>. Acesso em: 20 dez. 2007.
FEITOSA, Eduardo Luzeiro. Introdução aos Algoritmos. Manaus: Instituto de Ciências
Exatas. Departamento de Ciência da Computação, 2004. Disponível em: <http://
www.dcc.fua.br/~efeitosa/Ensino/AED_2004_2/Apostila_C.doc>. Acesso em:
20 dez. 2007.
MIZRAHI, V. V. Treinamento em Linguagem C: Módulos 1 e 2. São Paulo: Makron
Books do Brasil, 1993.
ORTH, Afonso Inácio. Algoritmos e programação com resumo das Linguagens
Pascal e C. Porto Alegre: AIO, 2001.
www.cliqueapostilas.com.br
AULA 1 • ALgORITMOS E PROgRAMAçãO
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 113
SILVEIRA FILHO, Otton Teixeira da. Linguagem C. [Niterói]: Universidade Federal
Fluminense. Departamento de Ciência da Computação, 1997. Disponível em:
<http://www.ic.uff.br/~otton/produtos/apostila_c.pdf>. Acesso em: 20 dez.
2007.
ZIVIANI, Nivio. Projeto de algoritmos: com implementações em Pascal e C.
2. ed. São Paulo: Thomson, 2004.
Na próxima aula
Estudaremos os operadores disponíveis na Linguagem C. O conhecimento
dos operadores de uma linguagem permite a construção de expressões nessa
linguagem. E as expressões representam a maior parte das instruções em um
programa de computador.
Anotações
www.cliqueapostilas.com.br
AULA 1 • ALgORITMOS E PROgRAMAçãO
114 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
www.cliqueapostilas.com.br
AULA 2 • ALgORITMOS E PROgRAMAçãO
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 115
Objetivos
Esperamos que, ao final desta aula, você seja capaz de:
reconhecer e utilizar os principais operadores usados na Linguagem C;•
construir corretamente expressões aritméticas e lógicas nessa linguagem.•
Pré-requisitos
Como principal pré-requisito para esta aula, é fundamental que você tenha
entendido os conceitos apresentados na aula anterior, principalmente o que
diz respeito à declaração e uso de variáveis e constantes. Se houver dúvidas,
retomes seus estudos e consulte a web-tutoria.
Introdução
Operadores são elementos funcionais que atuam sobre termos e produzem
um determinado resultado.
Os operadores são, na prática, instruções especiais pelas quais incre-
mentamos, decrementamos, comparamos e avaliamos dados dentro de um
programa de computador.
A Linguagem Coferece um conjunto de operadores que permitem construir
expressões aritméticas, relacionais, lógicas e de atribuição. Nesta aula, estu-
daremos cada um desses operadores.
2.1 Aritméticos
Os operadores aritméticos são usados para desenvolver operações mate-
máticas. Observe, na listagem a seguir, os operadores aritméticos permitidos
na Linguagem C.
Aula 2
Operadores
www.cliqueapostilas.com.br
AULA 2 • ALgORITMOS E PROgRAMAçãO
116 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Operador Ação
+ Soma (inteira e ponto flutuante)
– Subtração ou troca de sinal (inteira e ponto flutuante)
* Multiplicação (inteira e ponto flutuante)
/ Divisão (inteira e ponto flutuante)
% Resto de divisão (de inteiros)
++ Incremento (inteiro e ponto flutuante)
-- Decremento (inteiro e ponto flutuante)
Fonte: UFMG. Centro de Pesquisa e Desenvolvimento em Engenharia Elétrica (CPDEE)
(1996-1999).
Em C, os operadores são classificados em unário ou binário. Um operador
unário age sobre uma variável apenas, modificando ou não o seu valor, e
retornam o valor final da variável. Os binários usam duas variáveis e retornam
um terceiro valor, sem alterar o valor das variáveis originais. O operador de
multiplicação é um exemplo de operador binário, enquanto o incremento é um
exemplo de operador unário.
Cabe ressaltar que o operador de divisão, quando aplicado a variáveis
inteiras, retornará um valor também inteiro; quando aplicado a variáveis em
ponto flutuante, será retornado um valor em ponto flutuante, mesmo que uma
das variáveis seja do tipo inteiro.
2.2 Lógicos
Na Linguagem C, não há definição do tipo de dado lógico, assim a inter-
pretação do verdadeiro lógico é dada por qualquer valor maior do que zero.
Obviamente, o falso lógico é qualquer valor menor ou igual a zero. Portanto, os
operadores lógicos irão operar sobre quaisquer variáveis, dando uma resposta
correspondente à condição examinada.
Os operadores lógicos em C são os listados a seguir.
Operador Ação
&& E lógico (do inglês AND)
|| OU lógico (do inglês OR)
! NÃO lógico (do inglês NOT)
2.3 Relacionais
Os operadores relacionais são utilizados para comparar os valores de
duas expressões em um programa, retornando um valor “lógico”.
www.cliqueapostilas.com.br
AULA 2 • ALgORITMOS E PROgRAMAçãO
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 117
São operadores relacionais na linguagem C os listados a seguir.
Operador Ação
> Maior que
< Menor que
>= Maior ou igual a
<= Menor ou igual a
== Igual a
!= Diferente de ou “não igual a”
É importante lembrar que você não deve confundir o operador de igualdade
“==” com o operador de atribuição “=”, que será estudado a seguir.
2.4 Incrementos e decrementos (pré/pós)
Os operadores aritméticos de incremento (++) e decremento (--) disponibili-
zados pela Linguagem C são operações unárias que servem para adicionar (no
caso do incremento) ou subtrair (no caso do decremento) uma unidade ao valor
de uma variável e retorná-lo. Assim, a expressão x++ é equivalente à x=x+1; e
a expressão x-- é equivalente à expressão x=x-1.
Esses dois operadores possuem ainda a propriedade de poderem ser
pré-fixados ou pós-fixados. Isso quer dizer que podemos definir se o valor da
variável será incrementado/decrementado antes (pré) ou após (pós) o retorno
do valor da variável.
Para que você entenda melhor esse procedimento, vamos considerar o trecho
de código a seguir.
int x;
x = 5;
printf (“%d”, x++); // Imprime o valor atual de x (“5”) e incrementa x (“6”)
printf (“%d”, ++x); // Incrementa o valor atual de x (“7”) e imprime o x (“7”)
printf (“%d”, x--); // Imprime o valor atual de x (“7”) e decrementa x (“6”)
printf (“%d”, --x); // Decrementa o valor atual de x (“5”) e imprime x (“5”)
Em termos e nomenclatura, dizemos que uma operação do tipo x++ é um
pós-incremento; ++x é um pré-incremento; x-- é um pós-decremento; e --x é um
pré-decremento.
2.5 Atribuição
O operador de atribuição serve para, como o próprio nome já sugere, atribuir
um valor para a variável. No C, é utilizado o caractere igual (=) para representar
www.cliqueapostilas.com.br
AULA 2 • ALgORITMOS E PROgRAMAçãO
118 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
a atribuição. Quando esse operador é usado, o valor da expressão que esteja
do lado direito do operador é transferido para a posição de memória apon-
tada pela variável declarada do lado esquerdo do operador. Por exemplo, a
expressão de atribuição numero = a*3; irá resolver a expressão do lado direito,
ou seja, buscar na memória o valor da variável a e multiplicá-lo por 3 e, em
seguida, atribuir esse valor resultante para a variável numero.
Quando você for utilizar esse operador, deve garantir que o resultado da
expressão retorne um tipo de dado do mesmo tipo, ou equivalente, ao tipo da
variável que irá receber esse valor.
2.5.1 Atribuição composta
No C, é possível a combinação do operador de atribuição com outro
operador aritmético a fim de reduzir os comandos.
Por exemplo, é possível construir as seguintes expressões de atribuição
composta:
soma += 5; // o mesmo que soma = soma + 5;
valor *= 10; // o mesmo que valor = valor * 10.
2.5.2 Atribuição múltipla
Uma vez declaradas, o C permite a incialização de mais de uma variável
em uma única linha, como mostrada no comando:
soma = media = desvio = 0;
Nesse comando, é atribuído o valor zero às três variáveis listadas.
O operador de atribuição pode ser usado já na declaração de uma
variável, com isso inicializando a variável já em sua criação. Um exemplo
desse uso seria a seguinte declaração de variáveis:
int n = 0;
float valor = 0;
float nota1 = nota2 = 0.00;
2.6 Expressões
Expressões são combinações de variáveis, constantes e operadores.
Quando montamos expressões, temos de levar em consideração a ordem com
que os operadores são executados. O C define a seguinte hierarquia entre os
seus operadores:
www.cliqueapostilas.com.br
AULA 2 • ALgORITMOS E PROgRAMAçãO
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 119
Maior precedência ( ) [ ] ->
! ~ ++ -- . –unário) (cast)
*(unário) &(unário) sizeof
* / %
+ –
<< >>
<<= >>=
== !=
&
^
|
&&
||
?
Menor precedência = += -= *= /=
2.7 Operadores bit-a-bit
O C, por ter sido desenvolvido para operar também como linguagem
de baixo nível (próxima ao hardware), permite que sejam realizadas
operações lógicas bit-a-bit em números. Ou seja, nesse caso, o número
é representado por sua forma binária e as operações são realizadas em
cada bit individual.
Os operadores lógicos em C são os listados a seguir.
Operador Ação
& E lógico (do inglês AND)
| OU lógico (do inglês OR)
~ NÃO lógico (do inglês NOT)
^ OU-exclusivo lógico (no inglês XOR)
>> Deslocamento de bits à direita
<< Deslocamento de bits à esquerda
A sintaxe comum para uso dos operadores de deslocamento é: valor
>> quantidade de bits ou valor << quantidade de bits. Por exemplo, se uma
variável numero possuir o valor 16 (em binário de oito bits ficaria 00010000)
e for executada a instrução numero << 2, seriam deslocados 2 bits à
esquerda (ficaria 01000000), resultando no valor 64; caso a instrução
www.cliqueapostilas.com.br
AULA 2 • ALgORITMOS E PROgRAMAçãO
120 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
executada fosse numero >> 2, seriam deslocados 2 bits à direita (ficaria
00000100), resultando no valor 4.
Esses operadores bit-a-bit só podem ser usados nos tipos char, int e
long int.
2.8 Modificador de tipo (cast)
Um modificador de tipo é aplicado a uma expressão para forçá-la a
retornar um tipo de dado especificado. Sua forma geral é dada por (<tipo_
de_dados>) <expressão>. Um exemplo que deixa óbvio a utilidadedesse
operador é o problema da divisão inteira. Vamos analisar o trecho de
código a seguir:
#include <stdio.h>
int main ( )
{
int valor;
float resultado;
valor=10;
resultado=(float)num/3;
printf (“%f”,resultado);
}
Nesse exemplo, vemos uma divisão entre uma variável do tipo inteira
(valor) por uma constante também inteira (o valor 3). Como visto ante-
riormente, uma divisão entre dois valores inteiros no C sempre retorna
outro valor inteiro. Isso faria com que o programa dê o resultado incor-
reto igual a 3.00, ainda que a saída esteja formatada para imprimir
um tipo float (“%f”). Para resolver esse caso, foi utilizado o modificador
(float) para dizer ao compilador que o resultado da expressão deverá
ser retornado como um float. Com isso, o programa irá imprimir o valor
correto igual a 3.3333....
2.9 Operadores de endereços
Esses operadores serão apenas apresentados, pois serão abordados
em diferentes aulas e temas, como Vetores, Ponteiros e Estruturas. A maneira
de utilizar cada um será vista em detalhe.
Os operadores de endereços em C são os a seguir.
www.cliqueapostilas.com.br
AULA 2 • ALgORITMOS E PROgRAMAçãO
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 121
Operador Ação
& “o endereço de”
Ex.: na instrução x = &y, a variável x irá receber o
endereço da variável y. Esse operador será discutido na
aula sobre Ponteiros.
* “o conteúdo de”
Ex.: na instrução x = *y, a variável x irá receber o
conteúdo do endereço de memória apontado pela
variável y. Esse operador será discutido na aula sobre
Ponteiros.
[ ] “no endereço de ... mais um índice”
Ex.: na instrução valor = vetor[6], a variável valor recebe
o valor da posição de memória apontada pela variável
vetor, deslocando 6 unidades. Esse operador será discu-
tido na aula sobre Vetores.
. (operador ponto)
“elemento da estrutura” ou “campo”.
Esse operador será discutido na aula sobre Estruturas.
-> (operador seta)
“elemento da estrutura apontada por”.
Esse operador será discutido na aula sobre Estruturas.
Síntese da aula
Nesta aula, foram apresentados os principais operadores disponíveis
na Linguagem C. É muito importante que você conheça e saiba utilizar esses
operadores na construção de expressões nessa linguagem.
Atividades
1. Supondo o seguinte trecho de código:
int x, y;
x = 35;
y = x/2;
É incorreto afirmar que, após a execução desse trecho:
a) a expressão (x+y) retorna um valor inteiro;
www.cliqueapostilas.com.br
AULA 2 • ALgORITMOS E PROgRAMAçãO
122 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
b) a expressão (y*2 == x) retorna um valor que é considerado pelo C
como verdadeiro;
c) a expressão x*=2; atribui à variável x o valor 70;
d) a expressão ((x < 50) && (y == 17)) retorna um valor que é consi-
derado pelo C como verdadeiro;
e) a expressão printf (“%d”, --x) irá imprimir o valor 34.
2. Comente o uso do modificador de tipo (cast) disponível na Linguagem C.
Comentário das atividades
Na atividade 1, levando em consideração o que foi estudado sobre os
operadores disponíveis na Linguagem C, você deveria ter concluído que
a opção incorreta é a opção (b), pois vimos que o operador de divisão,
quando aplicado a duas variáveis inteiras, sempre retorna um valor inteiro e,
nesse caso, a variável y acaba recebendo o valor 17; logo, y*2 irá resultar
em 34, que é diferente do valor da variável x; a opção (a) está correta, pois
o operador de adição, quando aplicado a dois valores inteiros, sempre
retorna um inteiro; a opção (c) também está correta, pois a instrução x*=2
é uma redução da expressão x=x*2 e, com isso, a variável x recebe o
dobro do seu valor atual, nesse caso 70; a opção (d) também está correta,
pois, se fatorarmos a solução dessa expressão, teremos ((x < 50) && (y ==
17)) ↔ ((35 < 50) && (17 == 17)) ↔ (“verdadeiro” && “verdadeiro”) ↔
“verdadeiro”; e, por fim, a opção (e) está correta, pois a expressão printf
(“%d”, --x) irá primeiro decrementar o valor de x (pré-incremento) e imprimir
o valor resultante, nesse caso, 34.
Na atividade 2, você deveria descrever que o modificador de tipo serve
para forçar o compilador a converter o valor de uma expressão para um
tipo específico. É muito útil em casos como o da divisão inteira, discutida
nesta aula. Além disso, serve para evitar erros de incompatibilidade de
tipos na atribuição, por exemplo.
Referências
ASCENCIO, Ana Fernanda Gomes; CAMPOS, Edilene Aparecida Veneruchi
de. Fundamentos da programação de computadores: Algoritmos, Pascal e
C/C++. São Paulo: Pearson Prentice Hall, 2003.
ORTH, Afonso Inácio. Algoritmos e programação com resumo das Linguagens
Pascal e C. Porto Alegre: AIO, 2001.
www.cliqueapostilas.com.br
AULA 2 • ALgORITMOS E PROgRAMAçãO
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 123
UFMG. Centro de Pesquisa e Desenvolvimento em Engenharia Elétrica (CPDEE).
Curso de Linguagem C: operadores aritméricos e de atribuição. [Belo Horizonte],
1996-1999. Disponível em: <http:// www.mtm.ufsc.br/~azeredo/cursoC/
aulas/c350.html>. Acesso em: 20 dez. 2007.
ZIVIANI, Nivio. Projeto de Algoritmos: com implementações em Pascal e C.
2. ed. São Paulo: Thomson, 2004.
Na próxima aula
Dando continuidade ao estudo da estrutura de um programa em Linguagem
C, na próxima aula vamos estudar as principais estruturas de controle dessa
linguagem. Essa aula será de fundamental importância para você entender
como o fluxo de instruções pode ser controlado em um programa em C.
Anotações
www.cliqueapostilas.com.br
AULA 2 • ALgORITMOS E PROgRAMAçãO
124 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
www.cliqueapostilas.com.br
AULA 3 • ALgORITMOS E PROgRAMAçãO
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 125
Objetivos
Esperamos que, ao final desta aula, você seja capaz de:
compreender a importância de cada estrutura de controle disponível •
na Linguagem C;
construir programas em C usando as diferentes estruturas abordadas.•
Pré-requisitos
Pelo fato de o estudo da programação ser um processo acumulativo, como
pré-requisito para esta aula é necessário que você tenha realmente entendido
os conceitos discutidos nas aulas anteriores. Lembre-se de que a web-tutoria
está sempre à sua disposição!
Introdução
As estruturas de controle são a essência de qualquer linguagem de progra-
mação, uma vez que determinam a seqüência pela qual as instruções de um
programa são executadas.
Nesta aula, estudaremos a sintaxe de cada uma dessas estruturas na
Linguagem C.
3.1 Estrutura seqüencial ou bloco
Na Linguagem C, o ponto-e-vírgula é o terminador de instruções, ou seja,
marca o encerramento de uma instrução.
Um par de chaves { } é usado para agrupar instruções em instruções
compostas ou blocos, de modo a serem sintaticamente equivalentes a uma
instrução única. Assim, um bloco pode ser composto de:
Aula 3
Estruturas de controle
www.cliqueapostilas.com.br
AULA 3 • ALgORITMOS E PROgRAMAçãO
126 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
uma única instrução;•
um conjunto de instruções;•
nenhuma instrução (instrução vazia).•
Uma instrução composta ou bloco tem a estrutura:
{
declarações (opcional)
instruções
}
3.2 Estrutura de decisão simples (if)
Assim como estudado em Lógica para Programação, na Seleção Simples,
uma instrução ou um conjunto de instruções é executado somente se o teste
condicional especificado retornar o valor verdadeiro. Caso o resultado do
teste seja falso, nenhuma das instruções delimitadas pelaestrutura de seleção
será executada e a execução das instruções será desviada para a instrução
imediatamente seguinte à estrutura de seleção.
O exemplo a seguir demonstra a utilização dessa estrutura:
ALGORITMO Selecao_Simples;
VAR N: Inteiro;
INICIO
LEIA N;
SE N>0 ENTAO
IMPRIMA N;
FIM SE
FIM
#include <stdio.h>
int main( ) {
int N;
scanf (“%d”, &N);
if (N > 0)
{
printf (“%d”, N);
}
}
3.3 Estrutura de decisão composta (if..else)
Uma das estruturas de decisão é a instrução if, que admite diversas
variantes. A forma genérica dessa instrução é: if condição bloco1; else bloco2.
A condição é uma expressão que é avaliada no momento de sua execução.
Se for verdadeira (tiver um valor não nulo), é executado o primeiro bloco de
instruções (bloco1); se for falsa, então é executado o segundo bloco de instru-
ções (bloco2).
www.cliqueapostilas.com.br
AULA 3 • ALgORITMOS E PROgRAMAçãO
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 127
O exemplo a seguir demonstra a utilização dessa estrutura.
ALGORITMO Selecao_
Composta;
VAR N: Inteiro;
INICIO
LEIA N;
SE N>0 ENTAO
IMPRIMA N;
SENAO
IMPRIMA “O valor de N
deve ser positivo”;
FIM SE
FIM
#include <stdio.h>
int main( ) {
int N;
scanf (“%d”, &N);
if (N > 0)
{
printf (“%d”, N);
}
else
{
printf (“O valor de N deve ser
positivo”);
}
}
3.4 Estrutura de decisão encadeada (if..else..if)
Em muitas situações, precisamos agrupar os testes a fim de realizar refi-
namentos nos parâmetros de seleção. Para esses casos, normalmente são utili-
zadas estruturas de seleção aninhadas.
O exemplo a seguir demonstra a utilização dessa estrutura em C.
ALGORITMO Selecao_Encadeada;
VAR N: Inteiro;
INICIO
LEIA N;
SE N>0 ENTAO
SE N MOD 2 = 0 ENTAO
IMPRIMA “ esse valor é par”;
SENAO
IMPRIMA “ esse valor é ímpar”
FIM SE
SENAO
IMPRIMA “O valor de N deve ser
positivo”;
FIM SE
FIM
#include <stdio.h>
int main() {
int N;
scanf (“%d”, &N);
if (N > 0)
{
if (N % 2 == 0) {
printf (“%d”, N);
}
}
else
{
printf (“O valor de N deve ser
positivo”);
}
}
www.cliqueapostilas.com.br
AULA 3 • ALgORITMOS E PROgRAMAçãO
128 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Essa seqüência de else..if´s é uma maneira de implementar uma decisão
múltipla. O computador avalia as condições de cima para baixo e, logo
que encontre uma verdadeira, executa a instrução que lhe está associada,
ignorando o resto da cadeia.
3.5 Estrutura de decisão múltipla (switch..case)
Apesar de a instrução else..if permitir construir uma estrutura de
escolha múltipla, o C fornece uma outra instrução, a instrução switch,
que é específica para isso. Nela, é testada sucessivamente uma vari-
ável para verificar se coincide com uma lista de valores inteiros (ou
caracteres).
A sintaxe dessa instrução é:
switch (variável)
{
case exp_1 : instr_1; break;
case exp_2 : instr_2; break;
...
default : instr_n; break;
}
Cada um dos casos é rotulado por uma ou mais constantes inteiras ou
expressões com constantes, por exemplo, exp_1 pode ser um inteiro, um
caractere ou uma expressão de constantes. Se a variável coincidir com um
dos casos, a execução começa a partir desse ponto. Todos os rótulos têm de
ser diferentes. O caso com rótulo default é executado se não houver mais
nenhuma coincidência. O uso de default é opcional, se não for usado e
nenhuma coincidência for encontrada, não será executada nenhuma ação.
Como já foi visto, quando se verifica uma coincidência entre o valor da vari-
ável e um caso, a execução do programa prossegue a partir desse ponto,
executando tudo o que vem a seguir, inclusive as instruções correspondentes
aos casos posteriores. Para evitar que isso aconteça, você deve usar a
instrução break, que força a saída imediata do switch. A razão pela qual a
execução de um switch não se limita às instruções de um caso, mas continua
a partir desse ponto, é que essa característica tem bastante utilidade em
diversas situações. Por exemplo, podemos ter:
www.cliqueapostilas.com.br
AULA 3 • ALgORITMOS E PROgRAMAçãO
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 129
switch (variável)
{
case exp_1 :
case exp_2 : instr_2; break;
...
default : ... break;
}
Nesse exemplo, é executada a instr_2, se a variável tiver o valor exp_1
ou exp_2. É uma boa prática usar break após o último caso, embora tal não
seja necessário.
A diferença fundamental entre o switch e o if é que o switch apenas testa
igualdade, enquanto a expressão condicional do if pode ser de qualquer tipo.
A instrução switch é bastante usada para processar comandos a partir do
teclado, tais como a seleção de opções em um menu. Por exemplo, podemos
ter uma função que devolva um valor que corresponde à opção selecionada
(SIMÕES, 2004).
void menu()
{
char ch;
printf(“ Ler ficheiro - 1\n ”);
printf(“ Gravar ficheiro - 2\n ”);
printf(“ Eliminar ficha - 3\n ”);
printf(“ Adicionar ficha - 4\n ”);
printf(“Escolha opção: ”);
scanf(“%d”,&ch);
switch (ch)
{
case ‘1’ : ler_fich(); break;
case ‘2’ : grava_fich(); break;
case ‘3’ : apaga_ficha(); break;
case ‘4’ : adiciona_ficha(); break;
default :
printf(“Opção inválida!”);break;
}
}
www.cliqueapostilas.com.br
AULA 3 • ALgORITMOS E PROgRAMAçãO
130 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
3.6 Estrutura de repetição (while)
Essa estrutura de repetição é equivalente à estrutura ENQUANTO..FACA
estudada em Lógica para Programação. A estrutura while tem a sintaxe:
while (expressão)
<bloco de instruções>;
O tipo da expressão deve ser lógica, ou seja, retornar verdadeiro ou falso.
A expressão é avaliada, se não for nula (verdadeira), a instrução é executada
e a expressão reavaliada. Esse ciclo continua até que a expressão tenha um
valor nulo (falso), passando então o controle do programa para a instrução na
linha seguinte ao ciclo.
A instrução que constitui o corpo do ciclo pode, na realidade, ser a
instrução nula, uma única instrução ou um grupo de instruções.
Como exemplo desse tipo de ciclo, temos a seguinte função, que simples-
mente espera até que se introduza o carácter ‘A’:
void espera()
{
char c;
c = ‘\0’;
while (c!=’A’)
scanf(“%c”,&c);
}
3.7 Estrutura de repetição (for)
Essa estrutura de repetição é equivalente à estrutura PARA..FACA estudada
em Lógica para Programação. A estrutura for tem a sintaxe:
for (expr_1 ; expr_2 ; expr_3)
<bloco de instruções>;
Normalmente, expr_1 é uma inicialização (com uma instrução de atri-
buição), expr_2 é uma condição (expressão relacional), que testa a variável de
controle do ciclo para verificar quando deve sair do ciclo, e expr_3 é um incre-
mento que define como a variável de controle do ciclo deve ser alterada cada
vez que o ciclo é executado. O ciclo for será executado enquanto a condição
for verdadeira. Quando a condição se tornar falsa, o programa prossegue na
instrução a seguir ao ciclo.
www.cliqueapostilas.com.br
AULA 3 • ALgORITMOS E PROgRAMAçãO
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 131
As expressões expr_1 e expr_3 são atribuições ou chamadas de funções,
e expr_2 é uma expressão relacional. Qualquer uma das três partes pode ser
omitida, apesar de terem de ser mantidos os ponto-e-vírgula. Quando expr_2
é omitida, o C substitui por uma constante não nula para que o teste retorne
sempre verdadeiro. Por exemplo, o trecho:
for (;;) <bloco de instruções>;
é um ciclo infinito equivalente ao ciclo
while (1) <bloco de instruções>;
Um ciclo infinito pode ser interrompido se no seu corpo existir uma instrução
break ou return.
O programa seguinte permite escrevertodos os inteiros entre 1 e 100.
#include <stdio.h>
void main()
{
int x;
for(x=1; x<=100; x++)
printf(“%d\n”,x);
}
Também são permitidas outras operações com a variável de controle do
ciclo, além do incremento e decremento. Para mostrar os números entre 5 e 95
de 5 em 5, podemos codificar o seguinte programa:
#include <stdio.h>
void main()
{
int x;
for(x=5; x<100; x=x+5)
printf(“%d\n”,x);
}
3.8 Estrutura de repetição (do..while)
Como você já estudou, os ciclos while e for testam a condição de repe-
tição no início do ciclo. Pelo contrário, o ciclo do..while testa a condição no
fim do ciclo, de modo que as instruções que fazem parte do corpo do ciclo são
executadas pelo menos uma vez. A sua sintaxe genérica é:
www.cliqueapostilas.com.br
AULA 3 • ALgORITMOS E PROgRAMAçãO
132 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
do
{
<bloco de instruções>;
}
while (expressão);
A instrução é executada e depois é avaliada a expressão. Se for verdadeira, a instrução é
executada novamente, e assim sucessivamente, até que a expressão seja falsa (valor nulo).
O ciclo do..while é análogo ao ciclo REPITA..ATE estudado em Lógica para
Programação.
O programa seguinte lê inteiros do teclado até que seja introduzido um número não
superior a 100.
#include <stdio.h>
void main( )
{
int n;
do {
scanf(“%d”,&n);
} while (n>100);
}
Síntese da aula
Nesta aula, foram discutidas as principais estruturas de controle da Linguagem C,
tanto as estruturas que permitem desvio condicional quanto aquelas que permitem
laços repetitivos.
Atividades
1. Indique a opção que apresenta um trecho de código equivalente ao mostrado a
seguir.
if (tecla == ‘1’) {
Funcao1 ( );
} else if (tecla == ‘2’) {
Funcao2 ( );
} else if (tecla == ‘3’) {
Funcao3 ( );
} else {
printf (“\nOpção invalida!”);
}
www.cliqueapostilas.com.br
AULA 3 • ALgORITMOS E PROgRAMAçãO
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 133
a)
if (tecla == ‘1’) {
Funcao1 ( );
}
if (tecla == ‘2’) {
Funcao2 ( );
}
if (tecla == ‘3’) {
Funcao3 ( );
}
printf (“\nOpção invalida!”);
c)
switch (tecla) {
case ‘1’: Funcao1 ( );
break;
case ‘2’: Funcao2 ( );
break;
case ‘3’: Funcao3 ( );
break;
default: printf (“\nOpção invalida!”);
}
b)
if (tecla == ‘1’) {
Funcao1 ( );
if (tecla == ‘2’) {
Funcao2 ( );
if (tecla == ‘3’) {
Funcao3 ( );
}
}
}
printf (“\nOpção invalida!”);
d)
switch (tecla) {
case ‘1’: Funcao1 ( );
case ‘2’: Funcao2 ( );
case ‘3’: Funcao3 ( );
default: printf (“\nOpção invalida!”);
}
e) Nenhuma das alternativas anteriores apresenta um código equivalente.
2. Escreva um programa, em Linguagem C, que implemente as principais opera-
ções aritméticas de um calculadora simples. O programa deverá ler dois
valores reais e a operação a partir do teclado e, em seguida, imprimir o
resultado correspondente à operação. Esse procedimento deverá ser repetido
até que seja informado o valor 0 como primeiro valor da operação.
Comentário das atividades
Na atividade 1, de acordo com o que você estudou nesta aula sobre as estru-
turas de seleção, deveria ter percebido que o trecho de código a ser substituído
apresenta um aninhamento de comandos if’s. Você deveria lembrar que essa cons-
trução é comumente usada para seleções de múltipla escolha. Deveria ter se recor-
dado também que o C possui uma instrução específica para o caso de seleção de
múltipla escolha – o comando switch..case. Assim, você rapidamente excluiria as
www.cliqueapostilas.com.br
AULA 3 • ALgORITMOS E PROgRAMAçãO
134 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
opções (a) e (b), que apresentam soluções com if’s. Com isso, você deveria ter
avaliado as opções restantes e ter percebido que a opção correta é a opção (c),
pois esta apresenta a construção correta de múltipla escolha usando o comando
switch..case; a opção (d), apesar de usar esse comando, possui uma construção
sem o uso do comando break e, como você estudou nesta aula, isso faz com
que, independentemente do caso para o qual a condição de teste seja idêntica,
serão executados TODOS os comandos a seguir dessa opção; e, como você
encontrou uma alternativa correta, a opção (e) é, naturalmente, incorreta.
Na atividade 2, usando as estruturas que foram estudadas nesta aula,
você deveria estar apto a responder a essa atividade de diferentes formas.
Deveria ter notado que a solução envolve estruturas de seleção e repetição.
Uma solução possível é mostrada a seguir com uso da estrutura de repetição
do..while. Cabe ressaltar que essa solução pode ser reescrita com o uso da
estrutura while. Assim como no teste da operação escolhida, você poderia usar
tanto o aninhamento de if’s quanto a estrutura switch..case.
#include <stdio.h>
int main( )
{
float valor1, valor2;
char operacao;
do {
printf (“\nDigite o primeiro valor: “);
scanf (“%f”, &valor1);
if (valor1 != 0)
{
printf (“\nDigite o segundo valor: “);
scanf (“%f”, &valor2);
printf (“\nEscolha a operacao [+, -, * ou / ]: “);
scanf (“%c”, &operacao);
if (operacao == ‘+’) {
printf (“\Resultado: %f”, (valor1+valor2));
} else if (operacao == ‘-‘) {
printf (“\Resultado: %f”, (valor1+valor2));
} else if (operacao == ‘*‘) {
printf (“\Resultado: %f”, (valor1+valor2));
} else if (operacao == ‘/‘) {
printf (“\Resultado: %f”, (valor1+valor2));
}
}
} while (valor1 > 0);
}
www.cliqueapostilas.com.br
AULA 3 • ALgORITMOS E PROgRAMAçãO
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 135
Referências
ASCENCIO, Ana Fernanda Gomes; CAMPOS, Edilene Aparecida Veneruchi
de. Fundamentos da programação de computadores: Algoritmos, Pascal e C/
C++. São Paulo: Pearson Prentice Hall, 2003.
ORTH, Afonso Inácio. Algoritmos e programação com resumo das Linguagens
Pascal e C. Porto Alegre: AIO, 2001.
SIMÕES, Carlos. Programação em Linguagem C. [S.l.]: Escola Superior de
Tecnologia de Viseu. Instituto Politécnico de Viseu, 2004. Disponível em:
<http://www.estv.ipv.pt/PaginasPessoais/fmorgado/EDados/Sebenta_C.
pdf>. Acesso em: 20 dez. 2007.
ZIVIANI, Nivio. Projeto de algoritmos: com implementações em Pascal e C.
2. ed. São Paulo: Thomson, 2004.
Na próxima aula
Em C tudo é implementado na forma de função. Assim, podemos dizer que
a linguagem C nos força a modularizar o código. Na próxima aula, estuda-
remos esse elemento principal programação em C: as funções.
Anotações
www.cliqueapostilas.com.br
AULA 3 • ALgORITMOS E PROgRAMAçãO
136 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
www.cliqueapostilas.com.br
AULA 4 • ALgORITMOS E PROgRAMAçãO
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 137
Objetivos
Esperamos que, ao final desta aula, você seja capaz de:
entender os conceitos relacionados ao uso de funções na Linguagem C;•
implementar funções nessa linguagem.•
Pré-requisitos
Para atingir os objetivos declarados para esta aula, é fundamental que
você já saiba codificar um programa em C usando variáveis e as principais
estruturas de controle. Isso é muito importante para que você possa entender
os exemplos discutidos nesta aula.
Introdução
Em C, qualquer instrução a ser executada deve ser parte de uma
função. Entre os programadores é comum ouvir a frase em C tudo é
função. Assim, para que você possa programar com propriedade em C é
imperativo que você conheça essa estrutura e seus detalhes. Nesta aula,
abordaremos esse tema.
4.1 Funções
Uma função em Cé declarada usando a seguinte sintaxe geral:
TIPO NOME (PARÂMETROS)
{
CORPO
}
Onde:
Aula 4
Modularização em C: uso de
Funções
www.cliqueapostilas.com.br
AULA 4 • ALgORITMOS E PROgRAMAçãO
138 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
TIPO é o tipo de valor retornado pela função. Se nada for espe-•
cificado, o compilador considera que será retornado um valor
inteiro;
NOME é o nome da função;•
PARÂMETROS é a lista das variáveis que recebem os argumentos •
quando a função é chamada. Deve incluir o tipo e nome de cada
variável. Sua sintaxe é: (tipo1 variável1, tipo2 variável2, ...,
tipo3 variávelN);
CORPO é onde estão as instruções da função.•
A seguir, é mostrado um exemplo de uma função. A função soma()
possui dois parâmetros do tipo inteiro e retorna uma valor também inteiro,
representando a soma dos dois parâmetros.
int soma(int x,int y)
{
int resultado;
resultado = x + y;
return(resultado);
}
4.2 Variáveis em funções
As variáveis criadas em uma função são locais, assim serão destruídas
após o término da função.
Caso em uma variável local a função tenha o mesmo nome de uma vari-
ável global, a variável local será usada, e não a global. Recomendamos
que as variáveis globais sejam evitadas na programação em C. Ao invés
disso, você deve trabalhar sempre com a passagem de parâmetros entre
as funções.
4.3 Argumentos e parâmetros
Argumentos são os valores usados para chamar a função, e parâmetros
são as variáveis, declaradas na definição da função, que recebem esses
argumentos. Para ficar mais claro, observe o exemplo a seguir.
www.cliqueapostilas.com.br
AULA 4 • ALgORITMOS E PROgRAMAçãO
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 139
/* Argumentos e parâmetros */
#include <stdio.h>
int soma(int a, int b) /* “a” e “b” são os parâmetros da função “soma” */
{
int resultado;
resultado = a + b;
return(resultado);
}
int main()
{
printf(“A soma entre 5 e 2 é %d\n”,soma(5,2));
/* No comando printf a função “soma” é chamada com os argumentos 5 e 2 */
return(0);
}
Os tipos dos argumentos devem ser compatíveis com os tipos dos parâmetros.
Você encontrará também referência aos parâmetros formais e parâmetros
reais. Os parâmetros formais são os parâmetros propriamente ditos, enquanto
que os parâmetros reais são os argumentos.
4.4 Declaração de parâmetros
Existem duas formas de declaração de parâmetros em funções: a forma clás-
sica e a forma moderna.
A forma clássica tem a seguinte sintaxe:
TIPO NOME(PARÂMETRO1, PARÂMETRO2, ... , PARÂMETROn)
TIPO DO PARÂMETRO1;
TIPO DO PARÂMETRO2;
...
...
TIPO DO PARÂMETROn;
{
CORPO DA FUNÇÃO
}
www.cliqueapostilas.com.br
AULA 4 • ALgORITMOS E PROgRAMAçãO
140 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Já a forma moderna tem a seguinte sintaxe:
TIPO NOME (TIPO PARÂMETRO1, TIPO PARÂMETRO2, ... , TIPO
PARÂMETROn)
{
CORPO DA FUNÇÃO
}
A seguir, segue um exemplo de função com os dois tipos de declaração
de parâmetros.
/* Com declaração clássica */
int soma(a, b)
int a;
int b;
{
int resultado;
resultado = a + b;
return(resultado);
}
/* Com declaração moderna */
int soma(int a, int b)
{
int resultado;
resultado = a + b;
return(resultado);
}
Atualmente, utiliza-se a forma moderna, porém, em programas mais
antigos, você encontrará a forma clássica.
4.5 Chamada por valor e chamada por referência
A chamada por valor é a passagem normal do valor dos argumentos para a
função. Utilizando essa chamada, os valores dos argumentos passados não são
modificados. Na realidade, é passada uma cópia dos valores para a função.
Na chamada por referência, são passados os endereços de memória
onde estão os argumentos. Nesse tipo de chamada, os valores podem ser
modificados.
www.cliqueapostilas.com.br
AULA 4 • ALgORITMOS E PROgRAMAçãO
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 141
É importante lembrar que as strings e matrizes sempre são chamadas por
referência. Quando C passa uma matriz ou string para uma função, é passado
o endereço inicial da matriz ou função.
4.6 O comando return
O comando return é usado para encerrar a função e retornar um valor
para a função chamadora.
O valor retornado pela instrução return deve ser compatível com o tipo
da função, o qual é definido quando da sua declaração. Se uma função não
retornar nenhum valor, ela deve ser declarada como do tipo void.
De acordo com o padrão ANSI, a função main devolve um inteiro para
o processo chamador, que geralmente é o sistema operacional. Isso é equiva-
lente a chamar exit com o mesmo valor. Alguns compiladores ainda aceitam
que main seja declarada como void, caso não retorne nenhum valor.
4.7 Protótipo de função
A chamada a uma função deve vir, a princípio, após sua definição para
o compilador conhecer os tipos de parâmetros e o tipo de retorno da função.
Porém você pode chamar a função antes da definição desta. Para isso, declare
apenas um protótipo da função, o qual tem apenas o valor de retorno e os
parâmetros da função. Na verdade, é uma forma de você informar ao compi-
lador as características fundamentais da função (nome, tipo de retorno, parâ-
metros, etc). Além disso, essa estratégia é particularmente útil em casos em que
uma função chama outra e podemos ter problemas de precedência, pois uma
função chamada já deve ter sido declarada.
Observe o exemplo a seguir:
#include <stdio.h>
int soma(int a, int b); /* protótipo da função */
int main( )
{
int nr1, nr2;
printf(“Entre com o primeiro número :”);
scanf(“%d”,&nr1);
printf(“Entre com o segundo número :”);
scanf(“%d”,&nr2);
printf(“\n%d + %d = %d\n\n”,nr1,nr2,soma(nr1,nr2));
return(0);
}
www.cliqueapostilas.com.br
AULA 4 • ALgORITMOS E PROgRAMAçãO
142 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
int soma(int a, int b) /* função propriamente dita */
{
int resultado;
resultado = a + b;
return(resultado);
}
Síntese da aula
Nesta aula, você estudou o principal conceito da Linguagem C – as
Funções. O domínio desse conceito garante uma programação otimizada.
Foram discutidos também os aspectos básicos da declaração e uso de funções,
como os parâmetros e os argumentos.
Atividades
1. Suponha que você precise criar uma função calculaAreaTrapezio para
calcular a área de um trapézio. A área A do trapézio é o produto da
média aritmética entre as medidas das bases pela medida da altura, isto
é, A=((base1+base2)*h)/2. Nessas condições, indique a alternativa que
apresenta a declaração correta para essa função.
a) int calculaAreaTrapezio (float base1, float base2, int altura)
b) float calculaAreaTrapezio (float base1, float base2, float altura)
c) int calculaAreaTrapezio (float base1, float base2, float altura)
d) int calculaAreaTrapezio (int base1, int base2, int altura)
e) float calculaAreaTrapezio (float base, int altura)
2. Implemente, em Linguagem C, a função float porcento (parcela: float,
porcentagem: float), que recebe como parâmetros dois valores: um repre-
senta o valor parcela e outro representando a porcentagem a ser aplicada
sobre o valor, por exemplo 4,5 (representando 4,5%). Essa função deverá
retornar o valor correspondente à porcentagem passada como argumento.
3. Em uma das atividades da aula anterior, foi apresentado o seguinte
problema: implemente um programa, em Linguagem C, que implemente as
principais operações aritméticas de um calculadora simples. O programa
deverá ler dois valores reais e a operação a partir do teclado e, em
www.cliqueapostilas.com.br
AULA 4 • ALgORITMOS E PROgRAMAçãO
UNITINS • ANÁLISE E DESENVOLVIMENTODE SISTEMAS • 1º PERÍODO 143
seguida, imprimir o resultado correspondente à operação. Esse procedi-
mento deverá ser repetido até que seja informado o valor 0 como primeiro
valor da operação.
E foi comentada a seguinte solução:
#include <stdio.h>
int main( )
{
float valor1, valor2;
char operacao;
do {
printf (“\nDigite o primeiro valor: “);
scanf (“%f”, &valor1);
if (valor1 != 0)
{
printf (“\nDigite o segundo valor: “);
scanf (“%f”, &valor2);
printf (“\nEscolha a operacao [+, -, * ou / ]: “);
scanf (“%c”, &operacao);
if (operacao == ‘+’) {
printf (“\Resultado: %f”, (valor1+valor2));
} else if (operacao == ‘-‘) {
printf (“\Resultado: %f”, (valor1+valor2));
} else if (operacao == ‘*‘) {
printf (“\Resultado: %f”, (valor1+valor2));
} else if (operacao == ‘/‘) {
printf (“\Resultado: %f”, (valor1+valor2));
}
}
} while (valor1 > 0);
}
Assim, para esta atividade, reescreva essa solução de modo que cada
operação aritmética seja realizada por uma função diferente.
Comentário das atividades
Na atividade 1, deveria ter ficado claro que a função calculaAreaTra-
pezio deveria retornar um tipo de dado float, uma vez que a sua fórmula
www.cliqueapostilas.com.br
AULA 4 • ALgORITMOS E PROgRAMAçãO
144 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
pode gerar valores com casas decimais em função do uso do operador de
divisão. Assim, você já deveria ter descartado as opções (a), (c) e (d). Além
desse problema, algumas dessas opções apresentam também problemas
de inadequação de tipos de dados. Ao analisar as opções restantes, você
deveria ter notado que a opção (e) apresenta uma insuficiência de parâ-
metros, uma vez que, para o cálculo da área de um trapézio, precisamos
saber os valores das duas bases. Então, deveria ter ficado claro que a opção
correta é a opção (b).
Na atividade 2, deveria ter sido facilmente solucionada com o conteúdo
que você estudou nesta aula. Apesar da multiplicidade de soluções, a seguir é
apresentada uma delas.
float porcento (float parcela, float porcentagem)
{
float resultado;
resultado = parcela*(porcentagem/100);
return (resultado);
}
Você poderia ainda usar seus conhecimentos sobre expressões a fim de
reduzir o número de instruções em sua função. Lembre-se de que, quanto menos
instruções, mais rápido o seu programa executará. A solução melhorada é
mostrada a seguir.
float porcento (float parcela, float porcentagem)
{
return (parcela*(porcentagem/100));
}
Na atividade 3, você deveria ter criado no código uma função para cada
operação aritmética (soma, subtração, multiplicação e divisão) que recebe dois
parâmetros do tipo float e retorne o resultado da operação – o que implica
em definir a função como sendo também do tipo float. E, na impressão do
resultado, você deveria invocar cada função correspondente à sua operação,
passando como argumentos os valores das variáveis valor1 e valor2. O código
resultante é mostrado a seguir.
www.cliqueapostilas.com.br
AULA 4 • ALgORITMOS E PROgRAMAçãO
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 145
#include <stdio.h>
float soma (float a, float b) {
return (a+b);
}
float subtrai (float a, float b) {
return (a-b);
}
float multiplica (float a, float b) {
return (a*b);
}
float divide (float a, float b) {
return (a/b);
}
int main()
{
float valor1, valor2;
char operacao;
do {
printf (“\nDigite o primeiro valor: “);
scanf (“%f”, &valor1);
if (valor1 != 0)
{
printf (“\nDigite o segundo valor: “);
scanf (“%f”, &valor2);
printf (“\nEscolha a operacao [+, -, * ou / ]: “);
scanf (“%c”, &operacao);
if (operacao == ‘+’) {
printf (“\Resultado: %f”, soma (valor1,valor2));
} else if (operacao == ‘-‘) {
printf (“\Resultado: %f”, subtrai (valor1,valor2));
} else if (operacao == ‘*‘) {
printf (“\Resultado: %f”, multiplica (valor1,valor2));
} else if (operacao == ‘/‘) {
printf (“\Resultado: %f”, divide (valor1,valor2));
}
}
} while (valor1 > 0);
}
www.cliqueapostilas.com.br
AULA 4 • ALgORITMOS E PROgRAMAçãO
146 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Referências
ASCENCIO, Ana Fernanda Gomes; CAMPOS, Edilene Aparecida Veneruchi
de. Fundamentos da programação de computadores: Algoritmos, Pascal e C/
C++. São Paulo: Pearson Prentice Hall, 2003.
ORTH, Afonso Inácio. Algoritmos e programação com resumo das Linguagens
Pascal e C. Porto Alegre: AIO, 2001.
Na próxima aula
Estudaremos as estruturas de dados, que permitem manipular grandes
conjuntos de dados de maneira mais fácil, vetores, matrizes e estruturas (structs).
Anotações
www.cliqueapostilas.com.br
AULA 5 • ALgORITMOS E PROgRAMAçãO
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 147
Objetivos
Esperamos que, ao final desta aula, você seja capaz de:
utilizar vetores e matrizes na construção de programas em C;•
utilizar estruturas (• structs) na construção de programas nessa linguagem.
Pré-requisitos
Para esta aula, é fundamental que você conheça os conceitos que envolvem
o uso de variáveis e tipos de dados na Linguagem C. Se você ainda tem dúvidas
sobre esse assunto, recorra ao seu caderno e reveja o conteúdo estudado. Não
fique com dúvidas!
Introdução
Em C, existem tipos especiais de variáveis que permitem manipular mais
de um tipo de dados ao mesmo tempo. O uso dessas estruturas permite a mani-
pulação de grandes conjuntos de dados, além de diminuir a complexidade do
programa e as possibilidades de erros.
Nesta aula, estudaremos as principais estruturas disponíveis na Linguagem
C: vetores, matrizes e estruturas.
5.1 Estruturas de dados homogêneas (vetores e matrizes)
As estruturas homogêneas são aquelas que armazenam dados de um mesmo
tipo. Na Linguagem C, possuímos duas estruturas desse tipo: os vetores e matrizes.
5.1.1 Vetores ou array
Existem situações em que precisamos manipular muitas variáveis, cada qual
mais ou menos com a mesma função. Isso acontece quando trabalhamos com
Aula 5
Estruturas de dados homogêneas
(vetores e matrizes) e
heterogêneas (estruturas)
www.cliqueapostilas.com.br
AULA 5 • ALgORITMOS E PROgRAMAçãO
148 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
listas ou seqüências de números. Por exemplo, a média de uma lista de n
números, X1, X2, ..., Xn, é definida como: média = (X1 + X2 + ... + Xn) / n
e o desvio de cada número em relação à média é dado pela fórmula: desvio
= Xi - média , para i = 1,2,...,n. considere que queremos fazer um programa
para calcular a média de uma lista de 10 números e o desvio de cada número
em relação à média. Com o uso de variáveis simples, teríamos de fazer algo
semelhante à:
float x1, x2, x3, x4, x5, x6, x7, x8, x9, x10;
float d1, d2, d3, d4, d5, d6, d7, d8, d9, d10;
float media;
...
media = (x1+x2+x3+x4+x5+x6+x7+x8+x9+x10) / 10;
d1 = x1 - media;
d2 = x2 - media;
...
d10 = x10 - media;
Se em vez de 10 números fossem 100, teríamos de declarar 100 variá-
veis, e isso seria um grande trabalho. É aqui que se torna extremamente útil o
conceito de vetor ou array. A definição float x[10]; define um array de nome
x com 10 posições, cada uma correspondendo a uma variável do tipo float.
Um array é como se fosse uma lista ou seqüência de variáveis. Na linguagem
C, os arrays começam sempre na posição 0. Por isso a declaração float x[10]
define as variáveis x[0], x[1], x[2], ..., x[9].
Depois de definido o array, os seus elementos podem ser acessados e
modificados individualmente, tal como nas variáveis que estudamos até agora.
Por exemplo:
x[7] = 54;
a = x[7].
A sintaxe geral para a definição de um array em C é:
tipo nome[dimensão].Se quisermos definir um array de nome notas com 5 posições, cada qual
podendo conter um número inteiro, temos de escrever:
www.cliqueapostilas.com.br
AULA 5 • ALgORITMOS E PROgRAMAçãO
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 149
int notas[5]
Ao trabalhar com array, você deve ter cuidado e não acessar uma posição
fora dos limites do array. Por exemplo, se for definido o array:
float x[10];
e tentarmos acessar o elemento x[12], o compilador não dá erro, mas o
programa vai se comportar de um modo imprevisível.
5.1.2 Matrizes
Uma matriz em C é um array com mais de uma dimensão. Por exemplo:
int a[3][4];
define um array de 2 dimensões, como se fosse uma tabela com 3 linhas e
4 colunas. Cada elemento da tabela é do tipo inteiro. Não se esqueça de que,
na Linguagem C, os arrays começam na posição zero.
5.2 Estruturas de dados heterogêneas (estruturas ou structs)
As estruturas em C são equivalentes ao tipo de dado registro que você
estudou em Lógica para Programação, e são utilizadas para agrupar infor-
mações relacionadas de tipos de dados diferentes. Digamos que você
precisa controlar os dados relacionados ao estoque de um pequeno estabe-
lecimento comercial. Dessa forma, para cada produto seriam armazenados
dados como:
código•
nome do produto•
quantidade estocada•
valor de compra•
valor de venda•
margem de lucro•
observações sobre o produto•
Esse seria um caso para o uso de estruturas, pois todos os dados estão
relacionados a cada produto. Cada dado possui um tipo diferente, como:
int• : código e quantidade
char• : nome e observações
float• : valor de compra, valor de venda e margem de lucro
www.cliqueapostilas.com.br
AULA 5 • ALgORITMOS E PROgRAMAçãO
150 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
5.2.1 Declarando uma estrutura
A sintaxe para a declaração (ou criação) de uma estrutura é:
struct NOME_DA_ESTRUTURA
{
TIPO CAMPO1;
TIPO CAMPO2;
...........
...........
TIPO CAMPOn;
};
Para o caso exemplificado no item anterior, poderíamos ter algo como:
struct produto
{
int codigo;
char nome[50];
int quantidade;
float valor_compra;
float valor_venda;
float margem_lucro;
char observacao[200];
};
É importante observar que a declaração da estrutura não cria, ainda,
uma variável. A declaração da estrutura apenas cria um novo tipo de dado.
Somente após criar a estrutura você pode declarar variáveis do tipo de estru-
tura criado.
5.2.2 Declarando variáveis do tipo de uma estrutura criada
Após a declaração da estrutura, você pode declarar variáveis do tipo da
estrutura com a sintaxe:
struct NOME_DA_ESTRUTURA NOME_DA_VARIÁVEL;
Exemplo:
struct produto item;
www.cliqueapostilas.com.br
AULA 5 • ALgORITMOS E PROgRAMAçãO
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 151
Observe que essa sintaxe obedece à sintaxe normal para a declaração de
variáveis:
TIPO NOME_DA_VARIÁVEL;
sendo o TIPO da variável, a nova estrutura criada (struct
NOME_DA_ESTRUTURA).
Você também pode declarar a variável logo após a declaração da estru-
tura com uma sintaxe do tipo:
struct produto
{
int codigo;
char nome[50];
int quantidade;
float valor_compra;
float valor_venda;
float lucro;
char obs[200];
} item;
O exemplo acima declara a variável item como sendo do tipo “struct
produto” logo após a definição dessa estrutura.
5.2.3 Acessando os campos de uma estrutura
Na sintaxe para acessar e manipular campos de estruturas é usado o
operador “ponto” seguindo a seguinte sintaxe:
NOME_DA_ESTRUTURA.CAMPO
Observe o código a seguir para entender melhor como manipular os
campos de uma variável do tipo estrutura.
#include <stdio.h>
/* criando um novo tipo de dado “produto” */
struct produto
{
int codigo;
char nome[50];
int quantidade;
float valor_compra;
float valor_venda;
};
www.cliqueapostilas.com.br
AULA 5 • ALgORITMOS E PROgRAMAçãO
152 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
int main()
{
struct produto item; /* declarando uma variável “item” do tipo “struct
produto” */
printf(“Preenchendo a variável \”item\”\n”);
printf(“Item............:”);
fgets(item.nome,50,stdin);
printf(“Código..........:”);
scanf(“%d”,&item.codigo);
printf(“Quantidade......:”);
scanf(“%d”,&item.quantidade);
printf(“Valor de compra.:”);
scanf(“%f”,&item.valor_compra);
printf(“Valor de revenda:”);
scanf(“%f”,&item.valor_venda);
printf(“\n”);
printf(“Exibindo os dados\n”);
printf(“Código..........:%d\n”,item.codigo);
printf(“Item............:%s”,item.nome);
printf(“Quantidade......:%d\n”,item.quantidade);
printf(“Valor de compra.:%.2f\n”,item.valor_compra);
printf(“Valor de revenda:%.2f\n”,item.valor_venda);
return(0);
}
5.2.4 Acessando uma estrutura com ponteiros
Estudaremos ponteiros na aula seguinte. Entretanto apresentaremos desde
já como manipular uma variável do tipo ponteiro para uma estrutura.
Para acessar uma estrutura usando ponteiros, você pode usar duas
sintaxes:
(*NOME_DA_ESTRUTURA).CAMPO
ou
NOME_DA_ESTRUTURA->CAMPO
Observe o uso de estruturas com ponteiros no exemplo a seguir:
www.cliqueapostilas.com.br
AULA 5 • ALgORITMOS E PROgRAMAçãO
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 153
#include <stdio.h>
struct registro
{
char nome[30];
int idade;
};
altera_estrutura1(struct registro *ficha)
{
(*ficha).idade -= 10;
}
altera_estrutura2(struct registro *ficha)
{
ficha->idade += 20;
}
int main()
{
struct registro ficha;
printf(“Entre com seu nome:”);
fgets(ficha.nome,30,stdin);
printf(“Qual sua idade?”);
scanf(“%d”,&ficha.idade);
printf(“\nExibindo os dados iniciais\n”);
printf(“Nome: %s”,ficha.nome);
printf(“Idade: %d.\n”,ficha.idade);
altera_estrutura1(&ficha);
printf(“\nExibindo os dados após a primeira alteração\n”);
printf(“Nome: %s”,ficha.nome);
printf(“Idade: %d.\n”,ficha.idade);
altera_estrutura2(&ficha);
printf(“\nExibindo os dados após a segunda alteração\n”);
printf(“Nome: %s”,ficha.nome);
printf(“Idade: %d.\n”,ficha.idade);
return(0);
}
www.cliqueapostilas.com.br
AULA 5 • ALgORITMOS E PROgRAMAçãO
154 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Síntese da aula
Nesta aula, você estudou os elementos da Linguagem C que permitem
manipular grandes conjuntos de dados, nomeadamente: vetores, matrizes e
estruturas (structs). A diferença básica entre eles está na possibilidade ou não
de agrupar dados de diferentes tipos. Vetores e matrizes, por exemplo, só
permitem manipular dados de um mesmo tipo. Já as estruturas permitem mani-
pular, ao mesmo tempo, dados de diferentes tipos.
Atividades
1. Sobre o trecho de código a seguir:
#include <stdio.h>
int main()
{
int numeros[10];
int i;
numeros[0] = 1;
for (i=1; i<10; i++) {
numeros[i] = numeros[i-1]*2;
}
for (i=0; i<10; i++) {
printf (“%d, ”, numeros[i]);
}
}
É correto afirmar que a saída que esse programa produz é:
a) 1, 2, 4, 6, 8, 10, 12, 14, 16, 18
b) 1, 2, 4, 8, 16, 32, 64, 128, 256, 512
c) 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
d) 1, 3, 5, 7, 9, 11, 13, 15, 17, 19
e) 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
2. Implemente um programa que leia os dados de um conjunto de cinco alunos
e armazene esses dados em um vetor de estrutura. Deverá ser armazenado
o nome, a nota do primeiro bimestre e a nota do segundo bimestre. Após
a leitura dos dados de todos os alunos, o programa deverá imprimir, para
cada, aluno a sua média semestral (média aritmética das notas bimestrais).
www.cliqueapostilas.com.br
AULA 5 • ALgORITMOS E PROgRAMAçãO
UNITINS • ANÁLISE E DESENVOLVIMENTODE SISTEMAS • 1º PERÍODO 155
Comentário das atividades
Na atividade 1, ao analisar o código, você deveria ter notado que a
instrução mais importante do algoritmo está na primeira estrutura de repetição
do tipo for. Nela, os valores do vetor são inicializados sempre a partir do
anterior. Na verdade, o próximo sempre recebe o valor dobrado do anterior.
Para garantir o funcionamento do algoritmo, a instrução números[0] = 1; faz
com que a seqüência de saída tenha início em 1. Assim, se cada elemento é
o dobro do anterior, teremos a seqüência “1, 2, 4, 8, 16, 32, 64, 128, 256,
512”, indicando que a opção correta é a opção (b).
Na atividade 2, usando os conceitos estudados nesta aula, você deveria ter
definido uma estrutura para representar cada aluno e, em seguida, declarado
um vetor desse tipo representando a lista de alunos. Então, poderia percorrer
todo o vetor usando uma estrutura de repetição, na qual, para cada posição
do vetor, deveriam ser lidos os dados sobre o aluno. Após o preenchimento
do vetor, você deveria percorrê-lo novamente imprimindo o nome do aluno
e média aritmética das notas bimestrais. Uma solução para esse problema é
mostrada a seguir.
#include <stdio.h>
struct TAluno {
char nome[80];
float nota1;
float nota2;
};
int main()
{
struct TAlunos alunos[5];
int i;
for (i=0; i<5; i++)
{
printf (“\Nome do aluno: “);
scanf (“%s”, &alunos[i].nome);
printf (“\Nota do primeiro bimestre: “);
scanf (“%s”, &alunos[i].nota1);
printf (“\Nota do segundo bimestre: “);
scanf (“%s”, &alunos[i].nota2);
}
www.cliqueapostilas.com.br
AULA 5 • ALgORITMOS E PROgRAMAçãO
156 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
/* Imprimindo as medias dos alunos */
for (i=0; i<5; i++)
{
printf (“\nAluno: %s \t\t\t Media: %f”, alunos[i].nome, (alunos[i].
valor1+ alunos[i].valor2)/2);
}
}
Referências
MIZRAHI, V. V. Treinamento em Linguagem C: Módulos 1 e 2. São Paulo:
Makron Books do Brasil, 1993.
ORTH, Afonso Inácio. Algoritmos e programação com resumo das Linguagens
Pascal e C. Porto Alegre: AIO, 2001.
ZIVIANI, Nivio. Projeto de Algoritmos: com implementações em Pascal e C.
2. ed. São Paulo: Thomson, 2004.
Na próxima aula
Estudaremos uma das características mais poderosas da Linguagem C – o uso
de ponteiros. Os ponteiros permitem que o programador manipule as posições de
memória de modo mais controlado do que com o simples uso de variáveis.
Anotações
www.cliqueapostilas.com.br
AULA 6 • ALgORITMOS E PROgRAMAçãO
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 157
Objetivos
Esperamos que, ao final desta aula, você seja capaz de:
entender o conceito e uso de ponteiros na programação em C;•
utilizar ponteiros na construção de programas em C.•
Pré-requisitos
Além do conhecimento sobre variáveis e tipos de dados em linguagem C,
para esta aula é desejável que você conheça, ainda que um pouco, sobre a
organização de memória de um computador. Caso tenha dúvidas quanto a
esse assunto, procure a web-tutoria!
Introdução
Um ponteiro é uma variável que permite guardar o endereço de outra
variável. Assim, quando uma variável contém o endereço de memória de outra
variável, diz-se que a primeira aponta para a segunda. A figura 1 demonstra
como uma variável desse tipo é manipulada.
endereço de memória valor na memória
1000 1003
1001
1002
1003
1004
1005
1006
... ...
Figura 1. Os ponteiros em memória.
Um ponteiro, em essência, é uma posição de memória.
Aula 6
Ponteiros e alocação dinâmica
www.cliqueapostilas.com.br
AULA 6 • ALgORITMOS E PROgRAMAçãO
158 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
6.1 Declaração de ponteiros
Para declarar uma variável como ponteiro, usa-se a sintaxe:
tipo *nome_variável;
O caractere asterisco usado após o tipo de dado indica ao compilador
que se trata de uma variável do tipo ponteiro (apontador) para uma posição
de memória que armazena um valor daquele tipo.
6.2 Operando sobre ponteiros
Um ponteiro deve ser sempre inicializado antes de seu uso. Caso
contrário, você correrá o risco de realizar um acesso indevido a alguma
posição de memória protegida. Isso levaria a um erro no programa.
Para iniciar uma variável do tipo ponteiro, é usado o operador &. Esse
operador é um operador unário que retorna o endereço da variável sobre a
qual opera. Assim, o comando ptr = &x fará com que ptr receba como valor
o endereço da variável x.
Outro operador importante na manipulação de ponteiros é o operador
*, que permite acessar o conteúdo da posição de memória apontada pela
variável do tipo apontador. Por exemplo, se ptr aponta para x, então *ptr
retorna o valor de x. Usando os operadores do C, poderíamos construir a
seguinte expressão válida (*&x == x).
Para que você possa entender melhor essas operações sobre variáveis
do tipo ponteiro, vamos considerar o seguinte exemplo:
px = &x;
y = *px +1;
*px += 1;
A segunda instrução toma o valor apontado por px, adiciona a ele uma
unidade e atribui o resultado à variável y, enquanto a instrução *px += 1;
incrementa o valor no endereço px, tal como ++*px e (*px)++. No último
caso, são necessários os parênteses, pois sem eles a instrução incrementa o
ponteiro e não o valor por ele apontado, dado que os operadores unários
* e ++ são associativos da direita para a esquerda.
www.cliqueapostilas.com.br
AULA 6 • ALgORITMOS E PROgRAMAçãO
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 159
Em C existe uma relação muito próxima entre os ponteiros e vetores.
Consideremos que as variáveis st e p são declaradas da seguinte forma:
char st[80], *p;
Para pôr na variável p (que é um ponteiro para char) o endereço do
primeiro elemento de st (vetor de caracteres ou string), podemos fazer a
atribuição:
p = &st[0];
Mas, na Linguagem C, o nome de um vetor sem índice é o endereço do
elemento inicial, pelo que, em essência, o nome de um vetor é um ponteiro
para o vetor. Poderíamos, então, fazer a atribuição p = &st[0]; usando a
forma equivalente:
p = st;
Depois disso, para acessar ao quinto elemento do vetor, poderíamos
usar st[4] ou *(p+4). Ainda podemos acessar ao quinto elemento do
vetor usando *(st+4) ou p[4], ou seja, podemos indexar ponteiros e
usar os operadores de ponteiros com variáveis do tipo vetor. Assim, a
linguagem C permite duas formas de acessar vetores: usando índices ou
a aritmética de ponteiros. Essa última é bem mais rápida, e dado que
a velocidade de execução é importante em programação, o seu uso é
bastante comum em C.
Podemos também atribuir o endereço de qualquer outro elemento de um
vetor a um ponteiro.
Apesar da grande utilidade dos ponteiros, devemos saber exatamente
como usá-los. Com efeito, se um ponteiro tem um valor errado, provavel-
mente produzirá um erro difícil de ser rastreado e associá-lo à causa.
Uma função também pode retornar um tipo de dado ponteiro.
Síntese da aula
Nesta aula, foram discutidos os principais conceitos relacionados ao
uso de ponteiros na Linguagem C. Foi estudado também como os ponteiros
podem ser utilizados para melhorar o desempenho de programas que
precisam realizar muitos acessos à memória principal.
www.cliqueapostilas.com.br
AULA 6 • ALgORITMOS E PROgRAMAçãO
160 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Atividades
1. Com base no programa a seguir,
#include <stdio.h>
int main( ) {
int numero;
int *ptr_numero;
scanf (“%d”, &numero);
prt_numero = №
numero++;
numero = ++(*prt_numero);
printf (“%d”, numero);
}
é possível afirmar que:
a) se for digitado o valor 8, o programa irá imprimir o valor 7;
b) se for digitado o valor 13, o programa irá imprimir o valor10;
c) se for digitado o valor 6, o programa irá imprimir o valor 6;
d) se for digitado o valor 4, o programa irá imprimir o valor 9;
e) se for digitado o valor 5, o programa irá imprimir o valor 7.
2. Por que uma variável do tipo ponteiro deve sempre ser inicializada antes
do seu uso?
Comentário das atividades
Na atividade 1, com base no que foi estudado sobre ponteiros, você
deveria ter concluído que a opção correta é a opção (e), pois, se fatorarmos
as instruções, veremos claramente a alteração de seus valores até o seu valor
final, para cada valor entrado. Vejamos.
Instrução Número *ptr_numero
prt_numero = №
= 8
13
6
4
5
8
13
6
4
5
numero++;
9
14
7
5
6
9
14
7
5
6
www.cliqueapostilas.com.br
AULA 6 • ALgORITMOS E PROgRAMAçãO
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 161
Instrução Número *ptr_numero
numero = ++(*prt_numero);
= 10
15
7
6
7
10
15
8
6
7
Na atividade 2, você deveria responder que o motivo para isso é que
uma vez que uma variável do tipo ponteiro faz referência a uma posição
na memória, não há como garantir o lugar nem o valor dessa posição de
memória. Como a memória está cheia de dados de outros programas, pode
acontecer de acessarmos alguma posição indevida. Isso pode causar desde
um resultado inesperado a um erro do programa, que será fechado pelo
sistema operacional.
Referências
ASCENCIO, Ana Fernanda Gomes; CAMPOS, Edilene Aparecida Veneruchi
de. Fundamentos da programação de computadores: algoritmos, Pascal e C/
C++. São Paulo: Pearson Prentice Hall, 2003.
ORTH, Afonso Inácio. Algoritmos e programação com resumo das Linguagens
Pascal e C. Porto Alegre: AIO, 2001.
Na próxima aula
Na última aula, estudaremos as principais funções disponibilizadas pela
Linguagem C para a manipulação de arquivos.
Anotações
www.cliqueapostilas.com.br
AULA 6 • ALgORITMOS E PROgRAMAçãO
162 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
www.cliqueapostilas.com.br
AULA 7 • ALgORITMOS E PROgRAMAçãO
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 163
Objetivos
Esperamos que, ao final desta aula, você seja capaz de:
compreender o modo como a Linguagem C manipula arquivos;•
usar as funções de manipulação de arquivos em seus programas.•
Pré-requisitos
Para esta aula, é importante que você já seja capaz de codificar algoritmos
mais complexos na Linguagem C, usando as estruturas e conceitos discutidos
nas aulas anteriores. Isso você conseguirá se tiver resolvido todas as atividades
propostas nas aulas anteriores.
Introdução
O sistema de E/S de C utiliza o conceito de streams e arquivos. Uma stream
é um dispositivo lógico que representa um arquivo ou dispositivo. A stream é
independente do arquivo ou dispositivo. Devido a isso, a função que manipula
uma stream pode escrever tanto em um arquivo no disco quanto em algum
outro dispositivo, como o monitor.
Existem dois tipos de streams: de texto e binária.
Em uma stream de texto, podem ocorrer certas traduções de acordo com
o sistema hospedeiro, ou seja, de acordo com a arquitetura do computador
que irá rodar o programa. Por exemplo, um caractere de nova linha pode ser
convertido para os caracteres retorno de carro e alimentação de linha ou um
elemento do tipo float, gravado no sistema origem com valor de 1.37, pode ser
lido com o valor de 1.36999997 no sistema hospedeiro. Devido a isso, pode
não haver uma correspondência entre os caracteres da stream e do dispositivo
externo; a quantidade de caracteres pode não ser a mesma.
Aula 7
Arquivos
www.cliqueapostilas.com.br
AULA 7 • ALgORITMOS E PROgRAMAçãO
164 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
A stream binária é uma seqüência de bytes com uma correspondência de
um para um com os bytes encontrados no dispositivo externo, isto é, não ocorre
nenhuma tradução de caracteres. O número de bytes é o mesmo do dispositivo.
Um arquivo é interpretado pela Linguagem C como qualquer dispositivo,
desde um arquivo em disco até um terminal ou uma impressora. Para utilizar um
arquivo você deve associá-lo a uma stream e, então, manipular a stream. Você
associa um arquivo a uma stream por meio de uma operação de abertura.
Nem todos os arquivos têm os mesmos recursos. Por exemplo, um arquivo
em disco pode suportar acesso aleatório, enquanto um teclado não. Isso
porque a estrutura do arquivo está intimamente relacionada ao dispositivo a
ele associado. Como no exemplo citado, do teclado, não há por que ler as
informações digitadas de outra forma senão a seqüencial.
Do que foi discutido até aqui, concluímos que todas as streams são iguais,
mas não todos os arquivos.
Se o arquivo suporta acesso aleatório, o ato de abri-lo inicializa o indi-
cador de posição apontando para o começo do arquivo. Quando cada carac-
tere é lido ou escrito no arquivo, o indicador de posição é incrementado.
Um arquivo é desassociado de uma stream por meio de uma operação
de fechamento. Se um arquivo aberto para saída por fechado, o conteúdo
de sua stream será escrito no dispositivo externo. Esse processo é geralmente
chamado de descarga (flushing) da stream e garante que nenhuma informação
seja acidentalmente deixada no buffer de disco.
A stream associa o arquivo a uma estrutura do tipo FILE. Essa estrutura é
definida no arquivo de cabeçalho stdio.h.
7.1 Funções utilizadas para manipulação de arquivos
O C fornece um grande conjunto de funções para a manipulação de
arquivos. As principais funções são descritas no quadro a seguir.
FUNçãO FUNCIONALIDADE
fopen( ) Abrir um arquivo
fclose( ) Fechar um arquivo
putc( ) Escrever um caracter em um arquivo
fputc( ) Idem putc( )
getc( ) Ler um caracter de um arquivo
fgetc( ) Idem getc( )
fseek( ) Posicionar o ponteiro de arquivo num byte específico
www.cliqueapostilas.com.br
AULA 7 • ALgORITMOS E PROgRAMAçãO
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 165
FUNçãO FUNCIONALIDADE
fprintf( ) É para o arquivo o que printf é para o console
fscanf( ) É para o arquivo o que scanf é para o console
feof( ) Devolve verdadeiro se o fim do arquivo foi atingido
ferror( ) Devolve verdadeiro se ocorreu um erro
rewind( ) Posicionar o ponteiro de arquivo no início desse
remove( ) Apagar um arquivo
fflush( ) Descarregar um arquivo
fread( ) Lê um conjunto de bytes de um arquivo
fwrite( ) Escreve um conjunto de bytes em arquivo
Todos os protótipos dessas funções estão declaradas no arquivo de cabe-
çalho stdio.h, por isso não é necessário redeclará-las em seu programa.
Esse arquivo de cabeçalho define ainda três tipos de dados: size_t, fpos_t
e FILE. Os dois primeiros são o mesmo que unsigned int (inteiro sem sinal), e o
terceiro será discutido mais a seguir.
Esse arquivo de cabeçalho também define várias macros. As mais impor-
tantes para a manipulação de arquivos são: NULL, EOF, FOPEN_MAX,
SEEK_SET, SEEK_CUR e SEEK_END.
NULL define um ponteiro nulo.
EOF geralmente é definida como -1 e devolve esse valor quando uma
função de entrada tenta ler além do final do arquivo.
FOPEN_MAX define um valor inteiro que determina o número de arquivos
que podem ser abertos ao mesmo tempo.
SEEK_SET, SEEK_CUR e SEEK_END são usadas com a função fssek() para
o acesso aleatório a um arquivo.
7.2 O ponteiro de arquivo
Basicamente um ponteiro de arquivo identifica um arquivo específico e
é usado pela stream para direcionar as operações das funções de E/S. Um
ponteiro de arquivo é uma variável ponteiro do tipo FILE. Essa variável é um
tipo pré-definido pela linguagem C. Normalmente, ela é definida no arquivo de
cabeçalho stdio.h, masisso depende do seu compilador. Para ler ou escrever
em arquivos, seu programa precisa usar os ponteiros de arquivo. Para declarar
uma variável como ponteiro de arquivo, use a seguinte sintaxe:
FILE *arquivo.
www.cliqueapostilas.com.br
AULA 7 • ALgORITMOS E PROgRAMAçãO
166 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
7.3 Abrindo um arquivo
Apesar de o sistema de E/S de C considerar arquivo como qualquer dispo-
sitivo, daqui para frente consideraremos arquivo como um arquivo em disco.
Para abrir uma stream e associá-la a um arquivo, você usa a função
fopen( ), cuja sintaxe é:
fopen(ARQUIVO,MODO)
em que ARQUIVO é um ponteiro para uma string que representa o nome do
arquivo. Na prática, é o nome do arquivo propriamente dito e pode ser um
PATH, ou seja, algo como “C:\docs\arquivo.txt”, no windows; ou algo como
“/home/teste/arquivo.txt”, no Linux. MODO é uma string que representa como
o arquivo será aberto de acordo com a lista a seguir.
MODO DESCRIçãO
r Abre um arquivo texto para leitura.
w
Abre um arquivo texto para escrita. Se um arquivo com o mesmo
nome existir, será sobrescrito.
a
Abre um arquivo texto para anexação. Se o arquivo não existir,
será criado.
rb Abre um arquivo binário para leitura.
wb
Abre um arquivo binário para escrita. Se um arquivo com o
mesmo nome existir, será sobrescrito.
ab
Abre um arquivo binário para anexação. Se o arquivo não
existir, será criado.
r+
w+
a+
Abre um arquivo texto para leitura/escrita. Se o arquivo não
existir, será criado.
r+b
w+b
a+b
rb+
wb+
ab+
Abre um arquivo binário para leitura/escrita. Se o arquivo não
existir, será criado.
É importante lembrar que, em muitas implementações, no modo texto, a
seqüência de caracteres retorno de carro/alimentação de linha são traduzidas
para nova linha na entrada. Na saída, ocorre o inverso: caracteres de nova
linha são convertidos em retorno de carro/alimentação de linha. Em arquivos
binários, não ocorre nenhuma tradução.
Caso tudo corra bem, a função fopen devolve um ponteiro de arquivo,
caso ocorra algum problema, ela devolve NULL.
www.cliqueapostilas.com.br
AULA 7 • ALgORITMOS E PROgRAMAçãO
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 167
Para abrir um arquivo texto chamado “teste” para escrita, você poderia
escrever assim:
FILE *arquivo;
arquivo = fopen(“teste”,”w”);
Porém é recomendável sempre testar se o arquivo foi aberto sem problemas.
Assim, sempre que for abrir um arquivo, você deve usar um código parecido
com esse:
FILE *arquivo;
if((arquivo = fopen(“teste”,”w”)) == NULL)
{
printf(“Erro ao abrir arquivo!!!\n”);
exit(1);
}
Esse tipo de teste detectará algum problema, tipo disco cheio ou protegido
contra gravação, antes que seu programa tente gravar nele.
O número máximo de arquivos que pode ser aberto ao mesmo tempo é
definido pela macro FOPEN_MAX, normalmente definida em stdio.h. Confira
se é o caso do seu compilador.
7.4 Fechando um arquivo
Para fechar uma stream, você deve usar a função fclose( ). Ela escreve
qualquer dado que ainda permanece no buffer de disco no arquivo e o fecha
em nível de sistema operacional. Uma falha ao fechar uma stream pode
provocar problemas tipo perda de dados, arquivos destruídos e erros intermi-
tentes em seu programa. A função fclose também libera o bloco de controle de
arquivo associado à stream, deixando-o disponível para reutilização. Como,
normalmente, há um limite do sistema operacional para o número de arquivos
abertos ao mesmo tempo, você deve fechar um arquivo antes de abrir outro.
A sintaxe de fclose é:
fclose(ARQUIVO);
em que ARQUIVO é o ponteiro de arquivo devolvido por fopen quando essa
abriu o arquivo. Caso o fechamento do arquivo ocorra sem problemas, fclose
retorna zero. Qualquer outro valor indica erro.
www.cliqueapostilas.com.br
AULA 7 • ALgORITMOS E PROgRAMAçãO
168 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
7.5 Escrevendo e lendo caracteres
Para escrever um caractere em um arquivo aberto, você pode usar duas
funções: putc( ) ou fputc( ). Elas são idênticas. Essas duas funções existem apenas
para preservar a compatibilidade com versões mais antigas do C. É lógico
que, para escrever em um arquivo, esse deve ter sido aberto em um modo que
permita a escrita.
A sintaxe da função putc( ) é:
putc(CARACTER,ARQUIVO);
em que CARACTER é o caractere a ser escrito no arquivo e ARQUIVO é um
ponteiro de arquivo. Se ocorrer tudo bem, a função retorna o caractere escrito;
caso contrário, ela retorna EOF.
Para ler um caractere, temos também duas funções: getc( ) e fgetc( ).
Existem duas também pelo motivo da compatibilidade com versões mais
antigas da linguagem C. Aqui o arquivo deve ter sido aberto em um modo
que permita a leitura.
A sintaxe para a função getc( ) é:
getc(ARQUIVO);
em que ARQUIVO é um ponteiro de arquivo. Quando o final do arquivo é
alcançado, a função devolve EOF.
7.6 Verificando o final de um arquivo binário
Quando temos de manipular arquivos em formato binário, um valor inteiro
igual a EOF pode ser lido por engano. Isso poderia fazer com que fosse indi-
cado o fim de arquivo incorretamente. Para resolver esse problema, o C inclui
a função feof( ), que determina quando o final de um arquivo foi atingido. Ela
tem a seguinte sintaxe:
feof(ARQUIVO);
em que ARQUIVO é um ponteiro de arquivo. Essa função faz parte de stdio.h
e devolve verdadeiro caso o final de arquivo seja atingido; caso contrário, ela
devolve 0.
7.7 Escrevendo e lendo strings
Para escrever e ler strings em um arquivo, use as funções fputs( ) e fgets( ),
cujos protótipos encontram-se em stdio.h.
www.cliqueapostilas.com.br
AULA 7 • ALgORITMOS E PROgRAMAçãO
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 169
A função fputs( ) escreve uma string na stream especificada, sua sintaxe é:
fputs(STRING,ARQUIVO);
em que ARQUIVO é um ponteiro de arquivo. Caso ocorra algum erro, será
retornado o valor EOF.
fgets( ) lê uma string da stream especificada. Sua sintaxe é:
fgets(STRING,TAMANHO,ARQUIVO);
Essa função lê STRING até que um caractere de nova linha seja lido ou que
TAMANHO - 1 caracteres tenham sido lidos. Se uma nova linha é lida, ela será
parte da string. A string resultante terminará em nulo. Caso ocorra tudo bem,
essa função retornará um ponteiro para STRING; caso contrário, retornará um
ponteiro nulo.
7.8 Apontando para o início do arquivo
Para apontar para o início do arquivo, use a função rewind( ), cujo protó-
tipo está no arquivo de cabeçalho stdio.h. Sua sintaxe é:
rewind(ARQUIVO);
em que ARQUIVO um ponteiro de arquivo, ou seja, uma variável do tipo FILE*.
7.9 Verificando se a operação com o arquivo produziu um erro
Para determinar se uma operação com o arquivo produziu um erro, use a
função ferror( ). Seu protótipo está em stdio.h e sua sintaxe é:
ferror(ARQUIVO);
em que ARQUIVO um ponteiro de arquivo. Essa função retorna verdadeiro,
se ocorreu um erro durante a última operação com o arquivo; caso contrário,
retorna falso. Como cada operação modifica a condição de erro, ela deve ser
chamada logo após cada operação realizada com o arquivo.
7.10 Apagando um arquivo
Para apagar uma arquivo, use a função remove( ). Ela faz parte de stdio.h
e sua sintaxe é:
remove(ARQUIVO);
sendo ARQUIVO um ponteiro de arquivo.
www.cliqueapostilas.com.br
AULA 7 • ALgORITMOS E PROgRAMAçãO
170 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
7.11 Esvaziando uma stream
Para esvaziar o conteúdo de uma stream aberta para saída, use a função
fflush( ). Sua sintaxe é:
fflush(ARQUIVO);•
sendo ARQUIVO um ponteiro de arquivo. Ela escreve o conteúdo do buffer
para o arquivo passado como argumento. Se for passado um valor nulo,todos
os arquivos abertos para saída serão descarregados. Se tudo ocorrer bem,
fflush retornará zero, indicando sucesso. Caso contrário, devolverá EOF.
7.12 Escrevendo e lendo tipos de dados definidos pelo usuário
Como já estudamos, o C permite que o usuário crie seus próprios tipos de
dados. Esses tipos de dados são estruturas compostas de tipos de dados.
Para escrever e ler essas estruturas a partir de arquivos, podemos usar as
funções fread( ) e fwrite( ). Elas são definidas em stdio.h.
A sintaxe de fread() é:
fread(VARIÁVEL,TAMANHO,QUANTIDADE,ARQUIVO);•
em que VARIÁVEL é o endereço da variável que receberá os dados lidos do
arquivo.
TAMANHO é o número de bytes a ser lido. Para calcular esse valor você
deve usar o operador sizeof(TIPO ou VARIÁVEL), que retorna o tamanho de um
tipo ou expressão passado como parâmetro.
QUANTIDADE indica quantos itens serão lidos (cada item do tamanho de
TAMANHO).
ARQUIVO é um ponteiro para o arquivo aberto anteriormente.
A sintaxe para fwrite( ) é idêntica, com a exceção que VARIÁVEL é o ende-
reço da variável com os dados a serem escritos no arquivo.
O ponteiro de arquivo “ARQUIVO” deve ser aberto em modo binário,
para podermos ler e escrever qualquer tipo de informação. Também deve ser
aberto de acordo com a operação a ser feita (leitura ou escrita).
A função fread devolve o número de itens lidos. Esse valor poderá ser menor
que QUANTIDADE se o final do arquivo for atingido ou ocorrer um erro.
A função fwrite devolve o número de itens escritos. Esse valor será igual à
QUANTIDADE, a menos que ocorra um erro.
www.cliqueapostilas.com.br
AULA 7 • ALgORITMOS E PROgRAMAçãO
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 171
7.13 Streams padrão
Quando um programa em Linguagem C é iniciado, são abertas três
streams: stdin, stdout e stderr.
Stdin define a entrada padrão do sistema, normalmente o teclado.
Stdout define a saída padrão do sistema, normalmente o monitor.
Stderr define a saída padrão dos erros, normalmente também é o monitor.
Essas streams são ponteiros de arquivos e podem ser redirecionadas.
Obs.: esta aula foi baseada nos escritos do autor Samuel Dias Neto que se encontra
disponível no site: <http://br.geocities.com/sdiasneto/c_int/arquivos.htm>.
Síntese da aula
Nesta aula, foram discutidos os principais conceitos relacionados com o uso
de arquivos na linguagem C.
Atividades
1. Com base nos conceitos estudados nesta aula, é incorreto afirmar que:
a) a instrução FILE *fp define a variável fp como sendo do tipo apontador
para arquivo;
b) a instrução fopen(“c:\teste.dat”,”rw+”) abre um arquivo texto para
leitura/escrita. Se o arquivo não existir, será criado;
c) a instrução fopen(“c:\teste.dat”,”rb”) abre um arquivo binário para leitura.
Se o arquivo não existir, a função fopen() retornará a constante NULL;
d) as funções fread( ) e fwrite( ) operam sobre arquivos do tipo texto e binário;
e) a função feof() é usada na manipulação de arquivos binários para testar
quando foi alcançado o final do arquivo.
2. Escreva um programa que abra um arquivo texto, conte o número de
caracteres presentes nele e imprima o número de caracteres na tela.
Comentário das atividades
Na atividade 1, usando os conceitos estudados nesta aula, você deveria ter
sido capaz de identificar que a opção (d) é a única opção incorreta, pois as
funções fread( ) e fwrite( ) só podem ser utilizadas em arquivos binários. A opção
www.cliqueapostilas.com.br
AULA 7 • ALgORITMOS E PROgRAMAçãO
172 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
(a) está correta, pois a instrução FILE *fp realmente é usada para declarar uma
variável do tipo ponteiro para arquivo; a opção (b) também está correta, pois
o modo “rw+” indica ao computador que o arquivo deve ser aberto em modo
texto e para leitura/escrita. O sinal de + indica que, se o arquivo não existir,
ele deverá ser criado; a opção (c) também está correta, pois o modo “rb” indica
ao computador que o arquivo deve ser aberto em modo binário e somente para
leitura; e a opção (e), por sua vez, também está correta, pois a função feof( )
é usada em arquivos binários para evitar que durante a leitura de algum valor,
esse seja confundido com a constante EOF, que indica o final do arquivo.
Na atividade 2, você deveria ter usado a seguinte abordagem: ler o nome do
arquivo, abrir o arquivo indicado com a função fopen( ), ler o arquivo caractere a
caractere até que seja alcançado o final do arquivo. Como será necessário indicar
o total de caracteres lidos do arquivo, você deveria ter criado uma variável para
fazer o papel de acumulador. A solução aqui comentada é mostrada a seguir.
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *arq;
char nome_arquivo[80];
char caracter;
int total=0;
printf (“\nDigite o nome do arquivo: ”);
scanf (“%s”,nome_arquivo);
if((arq = fopen(nome_arquivo,”rb”)) == NULL)
{
printf(“\nErro ao abrir o arquivo original.\n\n”);
exit(1);
}
while(!feof(arq))
{
caracter = getc(arq);
if(!feof(arq))
total++;
}
fclose(arq);
printf(“\nForam contados %d no arquivo %s”, total,nome_arquivo);
return(0);
}
www.cliqueapostilas.com.br
AULA 7 • ALgORITMOS E PROgRAMAçãO
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 173
Referências
ASCENCIO, Ana Fernanda Gomes; CAMPOS, Edilene Aparecida Veneruchi
de. Fundamentos da programação de computadores: Algoritmos, Pascal e C/
C++. São Paulo: Pearson Prentice Hall, 2003.
DIAS NETO, Samuel. Linguagem C: intermediário. [S.l.: s.n.]: [200-]. Disponível
em: <http://br.geocities.com/sdiasneto/c_int/arquivos.htm>. Acesso em: 20
dez. 2007.
ORTH, Afonso Inácio. Algoritmos e programação com resumo das Linguagens
Pascal e C. Porto Alegre: AIO, 2001.
Anotações
www.cliqueapostilas.com.br
AULA 7 • ALgORITMOS E PROgRAMAçãO
174 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
www.cliqueapostilas.com.br
www.cliqueapostilas.com.br
Cr
éd
it
os
EQUIPE UNITINS
Organização de Conteúdos Acadêmicos
Silvio Costa Sampaio
Coordenação Editorial
Maria Lourdes F. G. Aires
Assessoria Editorial
Darlene Teixeira Castro
Assessoria Produção Gráfica
Katia Gomes da Silva
Revisão Didático-Pedagógica
Marilda Piccolo
Revisão Lingüístico-Textual
Sibele Letícia Rodrigues de Oliveira Biazotto
Revisão Digital
Sibele Letícia Rodrigues de Oliveira Biazotto
Projeto Gráfico
Douglas Donizeti Soares
Irenides Teixeira
Katia Gomes da Silva
Ilustração
Geuvar S. de Oliveira
Capa
Igor Flávio Souza
EQUIPE FAEL
Coordenação Editorial
Leociléa Aparecida Vieira
Assessoria Editorial
William Marlos da Costa
Revisão
Juliana Camargo Horning
Lisiane Marcele dos Santos
Programação Visual e Diagramação
Denise Pires Pierin
Kátia Cristina Oliveira dos Santos
Rodrigo Santos
Sandro Niemicz
William Marlos da Costa
www.cliqueapostilas.com.br
A
pr
es
en
ta
çã
o
Este caderno de Lógica para Programação tem o objetivo de auxiliá-lo no
estudo dos principais conceitos relacionados com a Lógica para Programação
e, principalmente, com a sua representação na forma algorítmica.
O tema tratado aqui é de fundamental importância para qualquer
iniciante da Programação de Computadores. Nessa área existe uma máxima
que diz que “se você possui um bom domínio da Lógica de Programação,
você saberá programar em qualquer Linguagem de Programação”. E isso é
verdade, uma vez que o aprendizado de uma Linguagem de Programação
visa apenas a aperfeiçoar o domínio da sintaxe particular de cada Linguagem
ede suas funções e facilidades específicas. Mas a Lógica para Programação
sempre será o item mais importante, pois nos permite dominar as principais
estruturas que definem a ordem na qual as instruções deverão ser execu-
tadas de maneira a solucionar o problema definido.
Neste material são abordados os conceitos fundamentais da Lógica, em
termos gerais, e sua aplicação na Programação. Também é apresentado e
discutido o conceito de Algoritmo.
São estudadas as principais formas de representação de um algoritmo:
a Descrição Narrativa, Fluxograma e Pseudocódigo. São apresentados
exemplos da utilização de cada uma.
Para permitir a construção de algoritmos mais completos são estudados
ainda os conceitos de variáveis e constantes – fundamental para o entendi-
mento de como o computador manipula os dados em um Programa.
Apresentamos ainda a estrutura de arquivo e a sua correta utilização.
Também é explicada, em detalhes, cada estrutura de controle de fluxo usada
em um algoritmo.
Saber construir e representar corretamente um algoritmo garante, na
maioria dos casos, uma solução otimizada para o problema. Além disso,
os conceitos discutidos aqui serão utilizados ao longo de todo o Curso e
de toda a sua vida profissional. Por este motivo, você deve ler com atenção
especial este caderno.
Prof. Silvio Costa Sampaio
www.cliqueapostilas.com.br
Pl
an
o
de
E
ns
in
o
EMENTA
Representação do pensamento lógico. Fundamentos de Algoritmos. Variáveis
e constantes. Programação estruturada. Estruturas de seleção e repetição.
OBJETIVOS
Compreender os fundamentos da Lógica para Programação e os •
conceitos de variáveis e constantes.
Construir e representar Algoritmos.•
CONTEÚDO PROGRAMÁTICO
Fundamentos da Lógica para Programação•
Representação de Algoritmo•
Dados: variáveis e constantes•
Operadores e expressões•
Arquivos•
Estrutura de controle•
Modularização•
www.cliqueapostilas.com.br
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 179
BIBLIOGRAFIA BÁSICA
CARBONI, Irenice de Fátima. Lógica de Programação. São Paulo: Thomson,
2003.
FORBELLONE, André Luiz Villar; EBERSPACHER, Henri Frederico. Lógica de
programação: a construção de algoritmos e estruturas de dados. 3. ed. São
Paulo: Makron Books, 2005.
LOPES, Anita; GARCIA, Guto. Introdução à Programação: 500 algoritmos
resolvidos. Rio de Janeiro: Campus, 2002.
MANZANO, José Augusto N. G.; OLIVEIRA, Jayr Figueiredo de. Algoritmos:
lógica para desenvolvimento de Programação de Computadores. 16. ed. São
Paulo: Érica, 2005.
ORTH, Afonso Inácio. Algoritmos e programação com resumo das Linguagens
Pascal e C. Porto Alegre: AIO, 2001.
SOUZA, Marco Antonio Furlan de; GOMES, Marcelo Marques; SOARES,
Marcio Vieira. Algoritmos e Lógica de Programação. São Paulo: Thomson,
2005.
BIBLIOGRAFIA COMPLEMENTAR
ASCENCIO, Ana Fernanda Gomes. Lógica de Programação com Pascal. São
Paulo: Makron Books, 1999.
www.cliqueapostilas.com.br
www.cliqueapostilas.com.br
AULA 1 • LógICA PARA PROgRAMAçãO
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 181
Objetivos
Esperamos que, ao final desta aula, você seja capaz de:
entender como a lógica formal e matemática é aplicada na Programação •
de Computadores;
compreender a importância da construção de algoritmos computacionais.•
Pré-requisitos
Por tratar de questões relacionadas ao raciocínio natural do ser humano,
esta aula não apresenta pré-requisitos formais, entretanto cabe ressaltar que
será pré-requisito para as demais aulas deste caderno. Para você alcançar o
objetivo proposto, será necessário apenas disciplinar o seu modo de pensar,
evitando extrapolar os limites de abstração, ou seja, focar apenas o problema
a ser resolvido, uma vez que esse material dará a você embasamento teórico
para compreender como o pensamento lógico pode ser representado e repro-
duzido em um algoritmo computacional.
Introdução
Sem dúvida, o computador é uma das maiores invenções do homem e tem
se mostrado uma ferramenta versátil, rápida e segura para a manipulação de
informações.
Para muitos essa invenção é responsável pela intensificação da meca-
nização e descobertas científicas na vida moderna. Esta afirmação dá um
caráter autônomo ao computador, como se o mesmo fizesse tudo sozinho.
Entretanto cabe esclarecer que o computador é uma grande ferramenta de
trabalho, servindo de auxílio para as mais diversas atividades. Porém esta
máquina não é criativa e nem inteligente, na verdade, apenas reproduz o que
lhe é ordenado por meio de seus programas de computador.
Aula 1
Fundamentos da
Lógica para Programação
www.cliqueapostilas.com.br
AULA 1 • LógICA PARA PROgRAMAçãO
182 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Os programas de computador são construídos para resolver algum problema
específico e a solução adotada é sempre uma solução lógica. E essa solução
é formalizada em um algoritmo, que podemos entender como uma receita de
bolo a ser adotada para a solução do problema. A Lógica para Programação é
então o passo inicial para a construção de um programa de computador.
Por isso, nesta aula, temos três questões a serem respondidas: o que é a
Lógica? Como a Lógica é aplicada à Programação de Computadores? O que
é um Algoritmo? Vamos começar explicando os princípios básicos do pensa-
mento lógico.
1.1 O que é Lógica?
Não há consenso quanto à definição da Lógica. Alguns autores a definem
como o estudo dos processos válidos e gerais pelos quais atingimos a verdade,
outros como a ciência das leis do pensamento, ou somente como o estudo dos
princípios da inferência válida. Esta pluralidade de definições nos dá conta da
diversidade de estudos que são abrangidos pela Lógica.
Não seria cabível discutir sobre lógica sem lançar mão da Filosofia. Mesmo
não querendo aprofundar no mérito filosófico, é necessário revisar as bases
filosóficas da lógica a fim de compreender a sua origem e função.
A Lógica foi criada por Aristóteles, no século IV a.C., como uma ciência
autônoma que se dedica ao estudo dos atos do pensamento – conceito, juízo,
raciocínio, demonstração – do ponto de vista da sua estrutura ou forma Lógica,
sem ter em conta qualquer conteúdo material. É por esta razão que essa Lógica
Aristotélica é também conhecida por Lógica Formal.
Em contraposição a esse conceito de Lógica Formal, surgiu um outro – o
de Lógica Material – para designar o estudo do raciocínio no que ele depende
quanto ao seu conteúdo ou matéria.
Essa distinção entre Lógica Formal e Lógica Material nos permite perceber
porque: tendo em conta a sua forma, o raciocínio é correto ou incorreto (válido
ou inválido). Mas se atendermos à sua matéria, a conclusão pode ser verda-
deira ou falsa.
Para exemplificar, tomemos como exemplo as seguintes sentenças de racio-
cínio lógico:
I. nenhum homem sabe dançar;
II. este dançarino é homem;
III. logo, este dançarino não sabe dançar.
www.cliqueapostilas.com.br
AULA 1 • LógICA PARA PROgRAMAçãO
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 183
Este raciocínio é formalmente correto, uma vez que a conclusão está corre-
tamente deduzida. Mas a conclusão é falsa, uma vez que é falsa a primeira
proposição (“Nenhum homem sabe dançar”). Estamos perante um raciocínio
que tem validade formal, mas não tem validade material. Logo temos que
concluir que é falso.
Desde a sua criação o estudo da Lógica tem registrado enormes aperfei-
çoamentos, sobretudo a partir de meados do século XIX. É costume dividir-se
a sua história em três períodos: Período Clássico, Período Moderno e Período
Contemporâneo.
A Lógica Matemática (desenvolvida no Período Moderno) exerceu
uma influência decisiva em muitos domínios, principalmente na Eletrônica,Cibernética, Informática e Inteligência Artificial.
Mesmo com essa multiplicidade de conceitos, a Lógica pode ser vista
como uma ciência que procura encontrar as leis em relação às quais o nosso
pensamento deve obedecer para que possa ser considerado válido.
No contexto da informática, a Lógica de Programação é a técnica de
encadear pensamentos para atingir determinado objetivo previamente defi-
nido. Ou seja, é a técnica que nos permite expressar o que deve ser feito e em
que ordem para que a solução seja alcançada.
1.2 A Lógica no dia-a-dia
Sempre que pensamos estamos exercitando a nossa lógica ou ilógica (não-
lógica). Toda vez que falamos também estamos fazendo uso da lógica uma vez
que a fala é apenas uma representação do que pensamos.
Quantas e quantas vezes, em um quotidiano e rotineiro diálogo, produ-
zimos afirmações do gênero: “Isso é lógico!”, “...não tem lógica alguma.” ou
“Não vejo lógica nisso!”.
Saber o que é lógico, ou saber identificar uma estrutura lógica, em um contexto
lingüístico, é algo que nos é transmitido por meio da nossa educação.
Além dessa lógica lingüística, aplicamos outros tipos de raciocínio lógico
em nosso dia-a-dia. Um bom exemplo seria pensar o porquê não colocamos
nossa mão em uma superfície quente. Parece lógico, não?! Nosso cérebro
rapidamente processa sentenças lógicas como:
I. a pele humana não suporta altas temperaturas (ou algo mais simples
como “queimei minha pele no último contato com uma superfície quente”);
www.cliqueapostilas.com.br
AULA 1 • LógICA PARA PROgRAMAçãO
184 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
II. a minha mão é coberta de pele;
III. logo, a minha mão não suporta altas temperaturas.
Esse tipo de pensamento lógico se repete várias e várias vezes ao dia. E
graças à Lógica nos mantemos longe de problemas.
Isso deixa claro que nós pensamos de forma lógica o tempo todo.
No entanto, temos uma grande dificuldade em formalizar este raciocínio
lógico. Um exemplo disso são aquelas situações nas quais temos de
explicar a alguém algo a ser feito. Muitas vezes, já fizemos essa mesma
tarefa inúmeras vezes e, para nós, ela é extremamente lógica. Porém
encontramos dificuldades em organizar e relatar o conjunto de passos que
deverão ser realizados. Isso acontece porque não somos acostumados a
formalizar nosso pensamento.
Para o computador, a descrição de cada passo e seu correto encadea-
mento é fundamental para que o programa funcione corretamente e que a
solução seja alcançada. Por isso costuma-se dizer que o computador nunca
erra, são as pessoas que erram. Nesse caso, são as pessoas que formalizaram
a sua Lógica de Programação de maneira incorreta.
Nesse momento de nossos estudos, você já deve ter percebido que a Lógica
para Programação não é algo difícil ou impossível, uma vez que é apenas uma
técnica para dizer ao computador o que deve ser feito para atingir a solução
de um determinado problema.
1.3 Algoritmos
A construção de algoritmos é o primeiro passo para a Programação de
Computadores. É uma das tarefas mais complexas da programação de compu-
tadores, mas também uma das mais desafiadoras e empolgantes.
Um algoritmo pode ser definido como uma seqüência de passos que visa
a atingir um objetivo definido. Assim podemos dizer que um algoritmo é a
organização do pensamento para a solução de um problema, portanto é uma
representação da lógica.
Um algoritmo, na Linguagem da Programação de computadores, repre-
senta uma seqüência de instruções que o computador deve seguir a fim de
atingir um objetivo definido. Cada instrução é, na verdade, uma informação
que indica ao computador o que deve ser feito. Já o programa consiste na codi-
ficação precisa do algoritmo em uma linguagem de programação específica.
www.cliqueapostilas.com.br
AULA 1 • LógICA PARA PROgRAMAçãO
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 185
É importante lembrar que a ordem na qual as instruções serão executadas
é de fundamental importância para a efetividade da solução algorítmica. Para
entendermos melhor, imaginemos como problema a ser resolvido o preparo
de uma carne assada. É óbvio que a sua solução envolve, entre outras tarefas
menores, limpar a carne, temperá-la e levá-la ao forno. Mas também é obvio
que se a ordem dessas instruções for alterada certamente não iremos atingir a
solução para o problema. Imagine se levássemos a carne ao forno e a tempe-
rássemos somente depois!
O algoritmo não é a solução do problema, mas uma forma de solucioná-lo.
Assim, para um mesmo problema, podemos criar diferentes algoritmos usando
diferentes abordagens. Em outras palavras, podemos usar diferentes seqüên-
cias de instruções para resolver o mesmo problema. Em alguns casos, até
mesmo diferentes instruções. Quase sempre existe mais do que uma maneira
de resolver um problema, e essa escolha é nossa. Qual será então a melhor
das escolhas?
Dados dois ou mais algoritmos para resolver o mesmo problema, é sensato
escolher aquele que obtém uma solução no menor tempo possível e que utiliza
o menor espaço para a representação dos dados do problema.
Apesar de sua nomenclatura pouco usual, usamos algoritmos em várias
situações cotidianas. Um exemplo comum são as receitas culinárias. Em
uma receita culinária descrevemos todos os ingredientes que farão parte
do prato, suas quantidades, a ordem em que serão usadas, suas transfor-
mações (modo de preparo) até o preparo completo do prato. Dessa forma
é possível garantir que a aplicação correta do algoritmo resulte no prato
desejado.
É importante esclarecer desde já que um algoritmo independe da linguagem
de programação que será utilizada. Na verdade, uma vez que o algoritmo
seja desenvolvido de forma correta, poderá ser implementado em diferentes
linguagens de programação sem maiores alterações.
A construção de um algoritmo deve observar todos os passos neces-
sários à execução da atividade e evitar que passos desnecessários sejam
executados ou que passos interdependentes sejam executados fora de
ordem.
Durante sua construção, um algoritmo é constantemente revisto a fim de
identificar novas situações ou exceções a serem tratadas.
www.cliqueapostilas.com.br
AULA 1 • LógICA PARA PROgRAMAçãO
186 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Quando temos um problema e precisamos construir um algoritmo para
resolvê-lo, devemos passar pelas seguintes etapas:
definir o problema;a)
realizar um estudo da situação atual e verificar qual(is) a(s) forma(s) de b)
resolver o problema;
terminada a fase de estudo, descrever o algoritmo que deverá, a prin-c)
cípio, resolver o problema;
analisar junto aos usuários se o problema será resolvido. Se a solução d)
não foi encontrada, ou surgirem exceções a serem tratadas, deverá ser
retornado para a fase de estudo para descobrir onde está a falha.
A fim de entender como um algoritmo é construído, vamos analisar a
construção de um algoritmo para o seguinte problema clássico, discutido por
vários autores, inclusive em Forbellone e Eberspächer (2005, p. 4), por ser
um problema cotidiano e que não exige conhecimentos específicos: “trocar
uma lâmpada queimada”. A partir desse exemplo, será possível evidenciar o
processo de encadeamento de idéias até a solução final do problema.
Inicialmente, poderíamos construir o seguinte algoritmo básico para solu-
cionar o problema proposto:
pegue uma escada;I.
posicione-a embaixo da lâmpada;II.
busque uma lâmpada nova;III.
suba na escada;IV.
retire a lâmpada velha;V.
coloque a lâmpada nova.VI.
Se examinarmos esse algoritmo, veremos que ele permite solucionar o problema
da troca de uma lâmpada queimada. Entretanto, se considerarmos as situações nas
quais o algoritmo poderá ser aplicado, perceberemos que o mesmo não irá tratar
a situaçãoem que a lâmpada não esteja queimada. Na verdade, mesmo que a
lâmpada esteja funcionando, esse algoritmo irá trocá-la por uma nova.
Para solucionar esse problema, é necessário alterar o algoritmo de modo
que a lâmpada seja testada antes de efetuar a troca. Para isso, basta ligar o
interruptor e verificar se a lâmpada está funcionando ou não. Intuitivamente,
faríamos a seguinte alteração no algoritmo:
www.cliqueapostilas.com.br
AULA 1 • LógICA PARA PROgRAMAçãO
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 187
pegue uma escada;I.
posicione-a embaixo da lâmpada;II.
busque uma lâmpada nova;III.
ligue o interruptor;IV.
se a lâmpada não acender, então:V.
suba na escada;a)
retire a lâmpada velha;b)
coloque a lâmpada nova.c)
À primeira vista, o algoritmo agora está correto. Ao introduzirmos um teste
seletivo, uma condição, no passo V, impomos que os passos a, b e c só deverão
ser executados se o resultado do teste for verdadeiro. Nesse caso, se a lâmpada
não acender. Os testes seletivos nos permitem tratar as exceções e garantir que
determinados passos não sejam executados em vão, otimizando o algoritmo.
Esse mesmo algoritmo, apesar de funcional, ainda pode ser otimizado. Se
o reexaminarmos, perceberemos que, no caso de a lâmpada não estar quei-
mada, teremos executado os passos I, II e III em vão.
Para tratar essa situação, bastaria reposicionar os passos I, II e III para
que ocorram somente após o teste seletivo, uma vez que só serão úteis caso a
lâmpada tenha de ser realmente trocada, ou seja, que ela esteja queimada.
Desse modo, o algoritmo seria novamente alterado, ficando:
ligue o interruptor;VI.
se a lâmpada não acender, então:VII.
a) pegue uma escada;
b) posicione-a embaixo da lâmpada;
c) busque uma lâmpada nova;
d) suba na escada;
e) retire a lâmpada velha;
f) coloque a lâmpada nova.
Apesar de parecer completo, ou seja, permitindo solucionar o problema
da troca da lâmpada queimada, este algoritmo não leva em consideração a
possibilidade de a nova lâmpada não funcionar. Pois, nesse caso, seria neces-
www.cliqueapostilas.com.br
AULA 1 • LógICA PARA PROgRAMAçãO
188 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
sário repetir os passos e e f. Daí surge a seguinte questão: pode ser que a outra
lâmpada também não funcione, sendo necessário repetir mais uma vez esta
seqüência de passos. Então, quando deveremos parar de repetir?
Para toda repetição em um algoritmo devemos estabelecer uma condição
de parada, ou seja, um limite para a quantidade de vezes em que os passos
deverão ser repetidos. Caso não seja estabelecido esta condição de parada
ocorre o que chamamos de laço infinito – mais conhecido por sua designação
em inglês loop infinito – no qual os passos se repetem indefinidamente.
No caso do nosso algoritmo, uma condição de parada adequada seria repetir
enquanto a lâmpada não acender. Assim o algoritmo ficaria da seguinte forma:
VIII. ligue o interruptor;
IX. se a lâmpada não acender, então:
a) pegue uma escada;
b) posicione-a embaixo da lâmpada;
c) busque uma lâmpada nova;
d) suba na escada;
e) retire a lâmpada velha;
f) coloque a lâmpada nova;
g) enquanto a lâmpada não acender:
1. retire a lâmpada;
2. coloque outra lâmpada.
O passo g apresenta o que chamamos de fluxo repetitivo no qual um
conjunto de passos pode se repetir n vezes.
Não se aprende algoritmos copiando ou estudando outros algoritmos já feitos. Para
aprender algoritmos, é necessário construí-los e testá-los.
Pensando sobre o assunto
1.4 Construindo algoritmos
Antes de construir um algoritmo, é necessário entender o modelo de proces-
samento geral de um programa de computador. Este modelo é representado
na figura 1.
www.cliqueapostilas.com.br
AULA 1 • LógICA PARA PROgRAMAçãO
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 189
ENTRADAS PROCESSAMENTO SAÍDA
Dados iniciais
para a resolução
do problema
Regras do
problema
Resultados do
processamento ou
solução para o
problema
Exemplo: Multiplicação de dois números inteiros
A = 25
B = 3
RESULTADO = A*B 75
Figura 1. Modelo geral de processamento de um programa de computador
Todo programa fundamentalmente opera sobre um conjunto de entrada
que representa os dados iniciais necessários à resolução do problema. Essas
entradas são então processadas a partir de um conjunto de regras já definidas
e, ao final, o programa gera um conjunto de saídas que representa o resultado
do processamento.
Assim, antes de iniciar a construção de um algoritmo, é recomendado
seguir os seguintes passos:
1. identificação do problema: determinar o que se quer resolver ou qual
objetivo a ser atingido. Esse passo é fundamental para a resolução do
problema, pois não há como dizer ao computador o que fazer para
resolver o problema se nem sequer sabemos defini-lo;
2. identificação dos dados de entrada: determinar as informações neces-
sárias para os cálculos que se seguirão;
3. identificação dos dados de saída: nesse passo são definidas as infor-
mações que deverão ser geradas como resultado do processamento.
É neste passo que devemos definir inclusive o formato da saída como,
por exemplo, se será em tela ou na forma de relatório impresso;
4. identificação das regras e limitações do problema ou das limitações
do agente executante: nesse passo devemos identificar claramente
quais serão as regras a serem aplicadas na solução. É também
nesse passo que devemos definir as limitações para o problema,
uma vez que o algoritmo pode ter de cobrir apenas parte de um
problema mais geral. Ainda é possível que seja necessário definir
as limitações do agente executante, como, por exemplo, definir as
limitações em função de pouca memória RAM do computador em
que o programa irá rodar;
www.cliqueapostilas.com.br
AULA 1 • LógICA PARA PROgRAMAçãO
190 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
5. definição dos processamentos a serem executados a fim de trans-
formar as “entradas” em “saídas”: nesse ponto deve ser determinada
a seqüência de ações ou instruções que leve à solução do problema,
respeitando-se as regras já definidas;
6. construção do algoritmo: utilizando uma das formas de representação
de algoritmos que iremos estudas na aula 2;
7. teste da solução: execução de todas as ações do algoritmo, seguindo
o fluxo estabelecido para verificar se ele está realmente gerando os
resultados esperados ou detectar possíveis erros em sua descrição.
Ao seguir esses passos, garantiremos que o algoritmo desenvolvido será
executado corretamente pelo computador.
Síntese da aula
Nesta aula, foram discutidos os princípios da programação para compu-
tadores. Foi apresentado o conceito de Lógica para Programação que é, em
essência, uma extensão da lógica matemática.
Um dos conceitos mais importantes discutidos é o conceito de algoritmo. É
por meio do algoritmo que informamos ao computador o que deverá ser feito.
Vale lembrar que o encadeamento das instruções que compõem o algoritmo é
de fundamental importância para seu correto funcionamento.
Atividades
1. Leve em consideração os estudos que realizamos nesta aula e marque com
V (Verdadeiro) ou F (Falso) as alternativas a seguir.
( ) A lógica para programação torna o computador capaz de realizar
tarefas de forma autônoma e criativa, sem a necessidade da inter-
ferência humana.
( ) Um algoritmo representa uma seqüência lógica de instruções.
( ) Cada instrução em um algoritmo faz com que o computador
execute uma ou um conjunto de tarefas específicas.
( ) Para todo problema somente é possível criar um único algoritmo
correto.
( ) Uma vez que um algoritmo é criado, não deve mais ser modificado.
( ) Antes de iniciar a construção de umalgoritmo, é preciso definir a
linguagem de programação a ser usada.
www.cliqueapostilas.com.br
AULA 1 • LógICA PARA PROgRAMAçãO
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 191
2. Comente a importância dos dados de entrada, do processamento e dos
dados de saída para a construção de algoritmos.
Comentário das atividades
Na atividade 1, caso você tenha lido com atenção o material desta aula,
percebeu que a primeira alternativa é obviamente falsa, uma vez que a lógica
para programação permite apenas determinar a seqüência de passos a ser
seguida para a solução de um problema. Além disso, como foi discutido, o
computador apenas segue essas instruções sem alterações, não demonstrando
comportamento criativo ou autônomo. A segunda opção é verdadeira, visto
que o algoritmo descreve uma seqüência ordenada ou lógica das tarefas que
o computador deve desempenhar. A terceira opção também é verdadeira,
pois uma instrução representa uma ou um conjunto de tarefas específicas que
o computador deverá desempenhar. A quarta opção é falsa, uma vez que
um problema pode apresentar diferentes soluções que darão origem a dife-
rentes algoritmos. A quinta opção é falsa, pois um algoritmo deve sempre ser
reexaminado a fim de identificar erros ou situações inesperadas e, uma vez
identificado algum desses casos, o algoritmo deverá ser modificado a fim de
tratar a situação levantada. A sexta e última opção é falsa, pois um algoritmo
independe da linguagem de programação que será mais tarde utilizada.
Para realizar a atividade 2, com base no que foi discutido nesta aula,
você deve saber que é de fundamental importância identificar corretamente os
dados de entrada, o processamento e os dados de saída de um algoritmo. Sem
conhecer os dados de entrada, corremos o risco de não possuir dados suficientes
para uma solução do problema. Além disso correremos o risco de desconsiderar
algum detalhe importante sobre o problema que pode ser revelado por algum
dado de entrada ignorado. Já os processamentos a serem realizados sobre
os dados de entrada são igualmente importantes. Eles nos dirão o que fazer
ao longo do algoritmo. Além disso, com os resultados dos processamentos, já
poderemos predizer alguns dos dados de saída do algoritmo. Os dados de
saída são importantes, pois representam o resultado final do algoritmo e estão
diretamente associados à medida de eficácia do algoritmo. Se conhecermos os
dados de saídas, saberemos “o que se quer” do algoritmo.
Ao realizar as atividades com sucesso, você teve oportunidade de alcançar
os objetivos propostos para esta aula de entender como a Lógica Formal e
Matemática é aplicada na Programação de Computadores e de compreender
a importância da construção de algoritmos computacionais.
www.cliqueapostilas.com.br
AULA 1 • LógICA PARA PROgRAMAçãO
192 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Na próxima aula
Dando continuidade ao estudo da Lógica para Programação, estudaremos
como a lógica de programação, em sua forma algorítmica, pode ser represen-
tada. Estudaremos os métodos mais utilizados na prática: Descrição Narrativa,
Fluxograma e Pseudocódigo.
Anotações
www.cliqueapostilas.com.br
AULA 2 • LógICA PARA PROgRAMAçãO
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 193
Objetivos
Esperamos que, ao final desta aula, você seja capaz de:
representar um algoritmo usando Descrição Narrativa;•
representar um algoritmo usando Fluxograma;•
representar um algoritmo usando Pseudocódigo.•
Pré-requisitos
Uma vez que esta aula trata da representação de um algoritmo é necessário
que você tenha entendido o conceito de algoritmo apresentado na aula anterior.
Caso haja dúvidas, recorra ao material e entre em contato com a web-tutoria.
Introdução
Com o passar do tempo e de estudos dos algoritmos, foram desenvolvidas
inúmeras formas de se representar um algoritmo de modo a facilitar o seu
entendimento e, mais tarde, a sua tradução para uma linguagem de progra-
mação específica. Entre as formas de representação de algoritmos mais conhe-
cidas, podemos citar a Descrição Narrativa, o Fluxograma Convencional e o
Pseudocódigo - também conhecido como Linguagem Estruturada ou “Portugol”.
Essas três formas serão objeto de estudo desta aula.
Uma representação clara e fácil de ser seguida facilita o desenvolvimento,
depuração (correção de erros) e subseqüente transformação do algoritmo em
um programa de computador.
O domínio dessas formas de representação de algoritmos é de funda-
mental importância tanto para Analistas de Sistemas que são responsáveis por
mapear as necessidades dos clientes para a forma algorítmica, quanto para
Programadores, que irão transformar os algoritmos em programas.
Aula 2
Formas de representação
de um algoritmo
www.cliqueapostilas.com.br
AULA 2 • LógICA PARA PROgRAMAçãO
194 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Na Linguagem Narrativa, os algoritmos são expressos diretamente em linguagem
natural – no português, por exemplo. Já o Fluxograma (ou Diagrama de Fluxo) é uma
representação gráfica que emprega formas geométricas padronizadas para indicar
as diversas ações e decisões que devem ser executadas para resolver o problema.
O Pseudocódigo emprega uma linguagem intermediária entre a linguagem natural
e uma linguagem de programação para descrever os algoritmos.
média
Cálculo da Média de dois números inteiros positivos
média = ( a + b)/2
Início de Programa
Leia os valores a e b
Se a e b forem maior do que
zero
Calcula o valor da média a
partir da
fórmula [média = (a + b)/2]
Imprime o valor da média
Senão
Imprime “Os valores devem
ser positivos”
Fim do programa
Linguagem
Narrativa
Início de Programa
Leia a,b
Se a > 0 e b > 0 então
Calcula o valor da média a
partir da
média = (a + b)/2
Imprime o valor da média
Senão
Imprime “Os valores devem
ser positivos”
Fim se
Fim do programa
Pseudocódigo
Inicio
Fim
Média = (a+b)/2
Leia a
Leia b
a>0 e b>0
SIM NÃO
Fluxograma
“Os valores
devem ser
positivos”
Figura 1. Exemplo de algoritmo representado nas três formas mais comuns
Não existe consenso entre os especialistas sobre qual é a melhor maneira
de representar um algoritmo. Atualmente a maneira mais comum de representar
algoritmos é por meio de pseudocódigo. Essa forma de representação tem a
vantagem de que o algoritmo pode ser escrito de uma forma que está próxima
de uma linguagem de programação de computadores, facilitando a criação do
programa.
Existem outras formas de representação conhecidas, porém pouco utilizadas,
como o Diagrama de Chapin ou Nassi-Shneiderman (N-S), que apresenta a solução
do problema por meio de um diagrama de quadros com uma visão hierárquica e
estruturada. Essa forma não é muito utilizada devido à sua dificuldade em repre-
sentar a recursividade.
2.1 Descrição Narrativa
Nessa forma de representação, os algoritmos são expressos diretamente em
linguagem natural.
www.cliqueapostilas.com.br
AULA 2 • LógICA PARA PROgRAMAçãO
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 195
Esta forma de representação é a mesma utilizada em algoritmos não-computa-
cionais, como receitas culinárias. Dessa forma as instruções são descritas livremente,
entretanto devemos tomar alguns cuidados para manter a clareza do algoritmo.
Para escrever um algoritmo, precisamos descrever a seqüência de instru-
ções, de maneira simples e objetiva. Para isso devemos obedecer algumas
regras básicas:
usar somente um verbo por frase;•
imaginar que você está desenvolvendo um algoritmo para pessoas •
que não trabalham com informática;
usar frases curtas e simples;•ser objetivo;•
procurar usar palavras que não tenham sentido dúbio.•
Um exemplo de representação de um algoritmo usando Descrição Narrativa
para o problema de cálculo da média de um aluno ficaria:
obter as notas da primeira, segunda e terceira provas;1.
calcular a média aritmética entre as três notas;2.
se a média for maior ou igual que 7,00, o aluno foi aprovado, senão, 3.
foi reprovado.
No entanto, na prática, essa representação é pouco usada porque o uso
da linguagem natural dá muitas vezes oportunidade a más interpretações,
ambigüidades e imprecisões. Por esse motivo, não daremos maior atenção a
este tipo de representação.
2.2 Fluxograma
Essa é a forma gráfica de representar um algoritmo mais conhecida e
utilizada. O fluxograma nos permite mostrar graficamente a lógica de um algo-
ritmo, enfatizando passos individuais e o fluxo de execução.
É intermediária à descrição narrativa e ao pseudocódigo, pois é menos
imprecisa que a primeira e, no entanto, não se preocupa com detalhes de
implementação do programa como a segunda, como, por exemplo, o tipo de
variáveis utilizadas.
Para muitos autores, o fluxograma é a forma universal de representação,
pois se utiliza de figuras geométricas padronizadas para ilustrar os passos a
www.cliqueapostilas.com.br
AULA 2 • LógICA PARA PROgRAMAçãO
196 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
serem seguidos para a resolução de problemas. E o ideal é que um algoritmo
seja entendido da mesma forma por diferentes pessoas que o utilizarem.
Para que um fluxograma seja interpretado corretamente, é necessário
entender sua sintaxe e sua semântica. Sobre sintaxe de um fluxograma,
devemos entender como a correta utilização dos seus símbolos gráficos –
mostrados na figura 2 – e das expressões que podem ser escritas no seu inte-
rior. Já a semântica diz respeito ao significado de cada símbolo, ou seja, como
interpretá-lo corretamente. Com isso é possível entender e simular o algoritmo
representado.
Terminador Documento Referência de página
Entrada Manual Dados armazenados Referência fora da página
Dados Exibição
Seta de
orientação do fluxo
Decisão Preparação Processamento
Figura 2. Simbologia básica de um fluxograma
A interpretação de um fluxograma, via de regra, se dá de cima para baixo
e da esquerda para a direita. É importante seguir essa regra, pois garante que
o fluxo de instruções seja entendido corretamente.
Por se tratar de uma representação gráfica, o fluxograma não se
mostra adequado para a representação de algoritmos maiores e/ou mais
complexos. Nesses casos, é comum o uso do pseudocódigo como forma de
representação.
2.2.1 Simbologia básica de um fluxograma
Estes são alguns dos símbolos mais conhecidos e utilizados ao longo dos
anos pelos profissionais da área de informática para a descrição de algoritmos
usando fluxograma e são descritos na norma internacional ISO 5807/1985.
www.cliqueapostilas.com.br
AULA 2 • LógICA PARA PROgRAMAçãO
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 197
Inicio
Terminador
Símbolo utilizado como ponto para indicar o início e/ou
fim do fluxo de um programa. É importante salientar que
um programa deve possuir apenas um terminador de
INÍCIO e outro de FIM.
Variável
Entrada Manual
Utilizado para ler os dados necessários ao programa.
Usado para representar dados, independente do tipo de
mídia, que sejam fornecidos manualmente, em tempo de
processamento. Permite representar a entrada de dados
via teclado, mouse, leitor de código de barras ou qual-
quer outro dispositivo de entrada.
Dados
Dados
Utilizado para representar dados tanto de entrada quanto
de saída já definidos no próprio programa, como valores
de constantes.
Condição
SIM NÃO
Decisão
Indica a decisão que deve ser tomada, indicando a
possibilidade de desvios para diversos outros pontos do
fluxo, dependendo do resultado de comparação de uma
condição estabelecida. Essa estrutura permite controlar o
fluxo de instruções em um fluxograma.
Doc
Documento
Utilizado para representar a utilização de algum docu-
mento específico contendo dados necessários ao
algoritmo.
Dados
Dados Armazenados
Usado para indicar dados que estão ou deverão ser
armazenados pelo algoritmo.
Variável ou
mensagem
Exibição
É utilizado quando se deseja que os dados sejam
impressos. Representa um dispositivo de saída como o
monitor ou a impressora.
Operações
Preparação
Refere-se a um determinado grupo de operações não
incluídas da diagramação.
Referência de Página
Utilizado quando é preciso particionar o diagrama.
Quando ocorrer mais de uma partição, é colocada uma
letra ou número dentro do símbolo de conexão para iden-
tificar os pares de ligação.
Referência fora da Página
Específico para indicar conexão do fluxo em outra
página.
Seta de orientação de fluxo
Permite indicar o sentido do fluxo de dados. Serve exclusi-
vamente para conectar os símbolos ou blocos existentes.
Processo
Processamento
Símbolo ou bloco que se utiliza para indicar cálculos (algo-
ritmos) a efetuar, atribuições de valores ou qualquer mani-
pulação de dados que tenha um bloco específico para sua
descrição.
www.cliqueapostilas.com.br
AULA 2 • LógICA PARA PROgRAMAçãO
198 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
2.2.2 Construindo um fluxograma
Para entendermos como um fluxograma é criado para representar um
algoritmo, vamos discutir passo-a-passo a criação de um fluxograma para
representar um algoritmo que permita calcular a média final de um aluno
considerando que todo aluno realiza três provas no semestre. O aluno é consi-
derado “aprovado” se a sua média for igual ou superior a 7,00, senão é
considerado “reprovado”.
Antes de iniciarmos a construção do fluxograma, devemos formalizar o
algoritmo para solucionar o problema, de acordo com o que estudamos na
primeira aula.
É evidente que este é um problema de pouca complexidade e que envolve
poucas regras. Para resolver esse problema, fica claro que precisaremos
conhecer as três notas do aluno, que deverão ser informadas pelo usuário e,
em seguida, calcular a média por meio do cálculo de média aritmética simples
para a qual devemos aplicar a fórmula média = (nota1+nota2+nota3)/3.
Após o cálculo da média, é necessário testar se o seu valor é igual ou superior
ao valor 7,00 e, nesse caso, deverá ser listada a mensagem “Aprovado”.
Em caso contrário, deverá ser listada a mensagem “Reprovado”. Agora que
conhecemos o algoritmo, é possível representá-lo como um fluxograma.
Inicialmente a forma mínima de um fluxograma é dada pela junção de
seus terminadores de início e fim, como mostrado na figura 3. Na verdade,
essa construção mínima executa absolutamente nada. Os símbolos de INICIO
e FIM, na verdade, não representam instruções de fato, mas são marcadores
essenciais que permitem a correta interpretação do fluxograma.
INICIO
FIM
Figura 3. Fluxograma mínimo
Entretanto, para nosso algoritmo, será necessário ler os dados de entrada,
nesse caso, as três notas do aluno. Com isso, é necessário expandir o nosso
fluxograma, como mostra a figura 4. Por motivos didáticos, para cada variável
foi utilizado um símbolo de entrada manual. Na prática, entretanto, é comum a
utilização de apenas um símbolo contendo todas as variáveis a serem lidas.
www.cliqueapostilas.com.br
AULA 2 • LógICA PARA PROgRAMAçãO
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 199
INICIO
FIM
nota1
nota2
nota3
Figura 4. Fluxograma com leitura das notas
De posse do valor de cada uma das três notas, é possível processar a
média do aluno. Vamos representar esse processamento utilizando o símbolo
de processo, como mostra a figura 5. Em um fluxograma, devemossempre
representar a atribuição de valor a uma variável por meio do símbolo “←”,
na forma variável ← valor. Em um fluxograma, a expressão variável = valor
representa o teste se o valor da variável é igual ao valor informado do lado
direito da expressão e não uma atribuição.
INICIO
FIM
nota1
nota2
nota3
média (nota1+nota2+nota3)/3
Figura 5. Fluxograma com o cálculo da média
www.cliqueapostilas.com.br
AULA 2 • LógICA PARA PROgRAMAçãO
200 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Agora que o valor da média já foi calculado, é hora de testar o seu valor a
fim de definir se o aluno foi aprovado ou reprovado. Nesse momento, sentimos
a necessidade de controlar o fluxo de instruções, pois caso o valor da média
seja superior a 7,00, devemos executar a instrução de impressão da mensagem
“Aprovado”; senão devemos apresentar a mensagem “Reprovado”. Para fazer
isso é necessário utilizar o símbolo de decisão, como mostrado na figura 6.
Como podemos notar, dependendo do resultado da condição media >=
7,00, o fluxo de instruções é devidamente desviado.
INICIO
FIM
nota1
nota2
nota3
média (nota1+nota2+nota3)/3
média >= 7,00
“Aprovado” “Reprovado”
SIM
NÃO
Figura 6. Fluxograma final
Agora o fluxograma mostrado na figura 6 reflete o algoritmo criado, repre-
sentando cada passo de forma gráfica.
Como já discutido na aula sobre algoritmos, na maioria das vezes preci-
samos executar um conjunto de passos repetidas vezes, sem alterações no
www.cliqueapostilas.com.br
AULA 2 • LógICA PARA PROgRAMAçãO
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 201
conjunto de instruções. Para representar esses casos em um fluxograma devemos
construir um desvio no fluxo de instruções que permita testar uma condição de
parada e, dependendo do seu resultado, retornar a um passo anterior a fim de
repetir o conjunto de instruções desejado.
A fim de compreender como tratar esse tipo de situação, vamos tomar
como exemplo a representação de um algoritmo que imprime todos os números
pares positivos e menores do que um valor N informado. O fluxograma resul-
tante é mostrado na figura 7.
INICIO
FIM
N
N > 0
N % 2 > 0
SIM
SIM
NÃO
NÃO
N
N N - 1
Figura 7. Fluxograma para a impressão de números pares
positivos e menores do que um valor N
www.cliqueapostilas.com.br
AULA 2 • LógICA PARA PROgRAMAçãO
202 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Nesse fluxograma é possível notar que, após a leitura o valor N, este é
então testado para saber se ainda é positivo. Em caso negativo, o programa
já é encerrado, pois não haverá valores pares positivos menores do que N.
Caso a condição de teste seja satisfeita, ou seja, retorne o valor verdadeiro,
esse valor é testado para saber se é um valor par. Para isso, é testado o resto
da divisão do valor N por dois. Caso essa expressão retorne o valor zero, o
número é par, senão é impar. Caso a condição seja satisfeita – N é par – o
valor de N é então exibido e, em seguida, decrementado de uma unidade.
Após essa instrução, o fluxo é então desviado para o momento anterior ao
conjunto de passos que deverá ser novamente repetido. Com isso conseguimos
garantir que esses passos serão executados até que a condição N > 0 retorne
o valor falso.
2.3 Pseudocódigo
Esse nome é uma alusão à posterior implementação em uma Linguagem
de Programação, ou seja, quando formos programar em uma linguagem de
programação específica.
O pseudocódigo é um código de escrita em que se utilizam termos conven-
cionais para indicar as instruções do programa. Esses termos são geralmente
uma mistura de palavras da nossa linguagem natural com palavras e notações
típicas das linguagens de programação.
A utilização de pseudocódigo permite ao programador expressar
as suas idéias sem ter de se preocupar com a sintaxe da linguagem de
programação. Para isso, são utilizadas primitivas (comandos genéricos)
que podem ser facilmente traduzidos para uma linguagem de programação
específica.
2.3.1 Primitivas
Em um pseudocódigo, as primitivas possuem a mesma função dos símbolos
em um fluxograma, ou seja, descrever as ações a serem executadas e garantir
a correta interpretação do algoritmo.
Neste caderno, apresentaremos as primitivas traduzidas para a língua
portuguesa.
Entre as principais primitivas usadas, estão:
• ALGORITMO <nome> – primitiva usada para nomear o algoritmo
representado;
www.cliqueapostilas.com.br
AULA 2 • LógICA PARA PROgRAMAçãO
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 203
• INICIO (do inglês START) – esta primitiva é usada para identificar o
ponto inicial do algoritmo;
• FIM (do inglês END) – identifica o ponto final do algoritmo;
• LEIA <mensagem>, <variável> (do inglês INPUT) – primitiva usada
para a leitura de dados do utilizador. Equivalente à entrada de dados
manual do fluxograma;
• IMPRIMA <mensagem>, <expressão> (do inglês OUTPUT) – primitiva
usada para a apresentação de dados ao utilizador. Equivalente ao
símbolo de exibição do fluxograma;
• <variável> ← <expressão> – atribuição do resultado da expressão à
variável indicada;
• SE <condição> ENTAO (do inglês IF ... THEN)
<instruções a executar se condição verdadeira>
SENAO (do inglês ELSE)
<instruções a executar se condição falsa>
FIM SE (do inglês END IF) – primitiva de controlo de fluxo equivalente
à decisão dos fluxogramas;
• ESCOLHA (<variável>) (do inglês SWITCH)
CASO <valor1>: <instruções a executar>
CASO <valor2>: <instruções a executar>
...
CASO <valorN>: <instruções a executar>
CASOCONTRARIO: <instruções a executar>
FIM ESCOLHA – primitiva de controlo de fluxo, usado para representar
uma estrutura de controle de seleção múltipla;
• ENQUANTO <condição> FAÇA (do inglês WHILE)
<instruções a executar enquanto a condição for verdadeira>
FIM ENQUANTO (do inglês END WHILE) – primitiva de controlo de
fluxo, sem equivalência direta em fluxogramas, que implementa um
ciclo executado enquanto a condição referida seja verdadeira;
• REPITA (do inglês REPEAT)
<instruções a executar enquanto a condição for verdadeira>
www.cliqueapostilas.com.br
AULA 2 • LógICA PARA PROgRAMAçãO
204 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
ATE <condição> (do inglês UNTIL) – primitiva de controlo de fluxo, sem
equivalência direta em fluxogramas, que implementa um ciclo execu-
tado até que a condição referida seja verdadeira;
• PARA <condição inicial> ATÉ <condição final> FAÇA [PASSO
<incremento>] (do inglês FOR ... TO ... [STEP ...] DO)
<instruções a executar enquanto a condição final for falsa>
FIM PARA (do inglês END FOR) – primitiva de controlo de fluxo, que
executa as instruções nela contidas enquanto a condição final for falsa.
O incremento pode ser omitido desde que seja unitário positivo;
• VAR <nome da variável> [,]: <tipo da variável> (neste caso é usado
uma redução do termo VARIÁVEL – do inglês VARIABLE) – primitiva
utilizada na definição de variáveis. Os tipos de variáveis são discu-
tidos em uma aula à frente;
• CONST <nome da constante> = <valor da constante> [,] (neste caso é
usado uma redução do termo CONSTANTE – do inglês CONSTANT)
– primitiva utilizada na definição de constantes. As constantes são
discutidas à frente;
• ESTRUTURA <nome da variável>: <tipo da variável> [,] (do inglês
STRUCT)
[<nome da variável>: <tipo da variável>]
FIM ESTRUTURA (do inglês END STRUCT) – primitiva utilizada na defi-
nição de estruturas de variáveis. Os tipos de variáveis são definidos à
frente;
• FUNCAO <nome da função> (<parâmetros da função>) (do inglês
FUNCTION)
<instruções da função>
[RETORNA <variavel>] (do inglês RETURN)
FIM FUNCAO(do inglês END FUNCTION) – primitiva utilizada na
definição de funções. Por parâmetros entende-se uma lista dentro da
função. Em certas situações, como veremos mais à frente, os parâme-
tros podem ser utilizados para a função exportar valores;
• CHAMA <nome da função> (<parâmetros da função>) (do inglês
CALL) – primitiva utilizada para executar funções definidas com a
primitiva anterior.
www.cliqueapostilas.com.br
AULA 2 • LógICA PARA PROgRAMAçãO
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 205
Um exemplo de pseudocódigo é mostrado a seguir.
ALGORITMO Media
VAR N1, N2, N3, Media : real
INICIO
LEIA N1, N2, N3
Media <− (N1 + N2 + N3) / 2
SE Media >= 7,00 ENTAO
IMPRIMA “Aprovado”
SENAO
IMPRIMA “Reprovado”
FIM SE
FIM.
Uma grande vantagem da utilização de pseudocódigo é o fato de permitir
ao programador expressar as suas idéias sem ter de se preocupar com a
sintaxe da Linguagem de Programação. Por outro lado, esse tipo de represen-
tação é o que mais se aproxima da codificação final em uma Linguagem de
Programação e, por isso, é a mais utilizada na prática.
Síntese da aula
Nesta aula, foram discutidos conceitos sobre as formas mais comuns de
representação de um algoritmo computacional.
Esperamos que, a partir do que foi estudado nesta aula, você seja
capaz de concluir que há diversas formas de representação de algoritmos
que diferem entre si pela quantidade de detalhes de implementação que
fornecem ou, inversamente, pelo grau de abstração que possibilitam em
relação à implementação do algoritmo em termos de uma linguagem de
programação específica.
Das principais formas de representação de algoritmos, destacam-se: a
descrição narrativa, o fluxograma convencional e o pseudocódigo. Dessas três,
a mais utilizada na prática é o pseudocódigo, principalmente por sua proxi-
midade com o produto final – o programa codificado em uma Linguagem de
Programação – o que diminui o tempo de desenvolvimento e reduz custos. Além
disso, o pseudocódigo permite adicionar detalhes específicos da linguagem a
ser utilizada.
www.cliqueapostilas.com.br
AULA 2 • LógICA PARA PROgRAMAçãO
206 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Atividades
Para as atividades 1, 2 e 3, considere a seguinte questão: elabore um algo-
ritmo para um programa que permita ler vários números inteiros a partir do
teclado e, após a leitura de cada número individual, deverá ser apresentada
uma mensagem indicando se o número informado é positivo, negativo ou nulo.
O programa deverá encerrar quando o valor nulo for informado.
1. Represente o algoritmo na forma de Descrição Narrativa.
2. Represente o algoritmo na forma de um Fluxograma.
3. Represente o algoritmo na forma de Pseudocódigo.
4. Sobre a Descrição Narrativa, é incorreto afirmar que:
a) utiliza a linguagem natural para descrever o algoritmo;
b) pouco utilizada na prática;
c) em função de usar a linguagem natural, pode dar margem a ambigüi-
dades, tornando o algoritmo pouco claro;
d) possui regras fixas que garantem que um mesmo algoritmo sempre será
representado da mesma forma, mesmo que por pessoas diferentes;
e) devemos utilizar frases curtas e simples na descrição dos passos de um
algoritmo.
5. Sobre a forma de representação de algoritmos usando Fluxograma, é
incorreto afirmar que:
a) é uma representação gráfica dos passos a serem seguidos;
b) os símbolos utilizados em um fluxograma são internacionalmente defi-
nidos para garantir que um mesmo fluxograma seja corretamente inter-
pretado, não importa onde tenha sido criado;
c) a interpretação de um fluxograma, via de regra, se dá de baixo para
cima e da direita para a esquerda;
d) um programa deve possuir apenas um terminador de INÍCIO e outro
de FIM;
e) por se tratar de uma representação gráfica, o fluxograma não se
mostra adequado para a representação de algoritmos maiores e/ou
mais complexos.
www.cliqueapostilas.com.br
AULA 2 • LógICA PARA PROgRAMAçãO
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 207
6. Sobre o algoritmo em pseudocódigo apresentado a seguir, é correto
afirmar que:
ALGORITIMO A6;
VAR X: Inteiro;
INICIO
REPITA
LEIA (X);
SE (X < 0) ENTAO
IMPRIMA (“O valor informado deve ser positivo”)
SENAO
IMPRIMA (X*X);
FIM SE
ATE (X <= 0)
FIM
a) o pseudocódigo é a forma de representação menos utilizada na prática;
b) para esse algoritmo, caso o usuário informe um valor negativo, será
emitida a mensagem “O valor informado deve ser positivo” e um novo
valor será lido;
c) esse algoritmo não utiliza uma estrutura de decisão;
d) esse algoritmo não utiliza uma estrutura de repetição;
e) esse algoritmo imprime o quadrado de vários números informados
pelo usuário até que seja informado um valor negativo ou nulo.
Comentário das atividades
Para resolver a atividade 1, com base no que foi estudado, existem várias
formas, visto que a Descrição Narrativa não obedece a nenhuma regra,
apenas sendo uma adaptação da linguagem natural. Uma possível resposta
para essa questão é:
Repetir até que seja lido um número nulo
Ler número
Se o número for maior do que zero
imprimir “Positivo”
Senão se o número for menor do que zero
imprimir “Negativo”
Senão se o número for igual a zero
imprimir “Nulo”
Encerrar o programa
www.cliqueapostilas.com.br
AULA 2 • LógICA PARA PROgRAMAçãO
208 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Podemos ainda melhorar essa primeira solução, suprimindo o teste “se o
número for igual a zero”, afinal, se o valor já não for maior e nem menor do que
zero só poderá ser o próprio zero. Com isso diminuiremos a quantidade de tarefas
que o computador terá de executar. Dessa forma, teríamos o seguinte algoritmo:
Repetir até que seja lido um número nulo
Ler número
Se o número for maior do que zero
imprimir “Positivo”
Senão se o número for menor do que zero
imprimir “Negativo”
Senão
imprimir “Nulo”
Encerrar o programa
Para resolver a atividade 2, tivemos de representar uma estrutura de
repetição que permita ler N valores até que um valor nulo seja informado. E
para cada valor devemos realizar testes condicionais para determinar qual
mensagem deve ser escrita e para onde deve ser desviado o fluxo de instru-
ções. Uma resposta possível para essa questão é o seguinte fluxograma:
INICIO
FIM
N
N > 0
N < 0
N = 0
SIM
SIM
SIM
NÃO NÃO
NÃO
“Positivo”
“Positivo” “Nulo”
www.cliqueapostilas.com.br
AULA 2 • LógICA PARA PROgRAMAçãO
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 209
Já na atividade 3, em pseudocódigo, uma solução possível para esse
problema é:
ALGORITIMO A3;
VAR N: Inteiro;
INICIO
REPITA
LEIA (N);
SE (N > 0) ENTAO
IMPRIMA (“Positivo”)
SENAO
SE (N < 0) ENTAO
IMPRIMA (“Negativo”)
SENAO
IMPRIMA (“Nulo”)
FIM SE
FIM SE
ATE (N = 0)
FIM
Na atividade 4, de acordo com o que foi estudado sobre Descrição
Narrativa, você deve ter reconhecido como opção incorreta a opção (d), pois
nesse tipo de representação não existem regras fixas e, por usar a linguagem
natural, duas pessoas distintas poderão usar termos diferentes para descrever
um mesmo passo do algoritmo. A opção (a) é correta, pois a Descrição
Narrativa utiliza a linguagem natural para descrever o conjunto de passos
do algoritmo. A opção (b), por sua vez, é também correta, pois esse tipo de
representação é pouco usado na prática. A opção (c) é correta e levanta um
dos principais problemas com esse tipo de representação, que é a possibili-
dade de ambigüidade, pois caso um passo seja ambíguo, pode dar margem
a entendimentos distintos do algoritmo. Por último, a opção (e) também está
correta, pois devemos utilizar frases curtase simples a fim de manter a clareza
e facilitar a interpretação do algoritmo.
Considerando o que foi estudado nesta aula sobre fluxograma, você deve
ter reconhecido como opção incorreta para a atividade 5 a opção (c), pois a
interpretação de um fluxograma deve ser sempre realizada de cima para baixo
e da esquerda para a direita. Você deveria ter reconhecido ainda a opção (a)
como correta, pois o fluxograma é exatamente uma representação gráfica dos
www.cliqueapostilas.com.br
AULA 2 • LógICA PARA PROgRAMAçãO
210 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
passos de um algoritmo. A opção (b) também está correta, pois a norma inter-
nacional ISO 5807/1985 define a simbologia a ser adotada na construção
de um fluxograma e, com isso, um mesmo fluxograma será corretamente inter-
pretado, não importa onde tenha sido criado. A opção (d) é correta, uma vez
que o algoritmo representado só pode ter um início e um fim no fluxograma.
E, por fim, a opção (e) também deveria ser considerada correta, pois o maior
problema com o uso de fluxograma ou de qualquer ferramenta de represen-
tação gráfica é que não são adequadas para situações mais complexas que
gerem algoritmos com uma elevada quantidade de passos.
De acordo com o que você estudou sobre Pseudocódigo, deve ter ficado
claro que a opção correta para a atividade 6 é a opção (e), pois, seguindo o
fluxo do pseudocódigo, percebemos que a leitura e teste da variável X encon-
tram-se no bloco de instruções do comando REPITA. Assim esses passos deverão
ser executados até que a condição (X <= 0) seja verdadeira. Deveria ter ficado
claro também que a opção (a) está incorreta, pois esse tipo de representação é
o mais usado na prática, pois é a forma que mais se aproxima da codificação
final em uma linguagem de programação. A opção (b) está incorreta e sua
avaliação depende da atenção ao teste condicional para a instrução REPITA...
ATÉ. Nela, caso o valor seja negativo ou nulo, o fluxo é desviado para o final
do algoritmo. As opções (c) e (d) são obviamente incorretas, uma vez que o
algoritmo apresenta as instruções SE..ENTAO e REPITA..ATÉ que são estruturas
de decisão e repetição, respectivamente.
As atividades lhe deram a oportunidade de representar um algoritmo
usando Descrição Narrativa, Fluxograma e Pseudocódigo, que foram os obje-
tivos fixados para esta aula.
Na próxima aula
Estudaremos como os dados são armazenados e representados pelo
computador. Esse conhecimento é de fundamental importância para a ativi-
dade de Programação de Computadores.
Anotações
www.cliqueapostilas.com.br
AULA 3 • LógICA PARA PROgRAMAçãO
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 211
Objetivos
Esperamos que, ao final desta aula, você seja capaz de:
entender os conceitos de variável e de constante e suas utilizações;•
utilizar adequadamente cada tipo de dado disponível.•
Pré-requisitos
Para atingir os objetivos desta aula, é desejável que você possua conheci-
mento, ainda que básico, sobre arquitetura de computadores – principalmente
no que diz respeito à memória RAM. Pesquise sobre o assunto!
Introdução
Para a execução de qualquer tipo de programa, o computador neces-
sita armazenar dados de natureza diversa. Esses dados são armazenados na
memória do computador.
Todas as informações existentes no computador estão ou na memória primária
(memória RAM), ou na memória secundária (discos, fitas, CD-ROM, etc). Nós
iremos trabalhar, neste caderno, somente com a memória primária, especifica-
mente com as informações armazenadas na RAM (memória de acesso aleatório).
Na verdade, toda operação realizada por um computador é baseada
na manipulação das informações contidas em sua memória. De uma maneira
geral, essas informações podem ser classificadas em dois tipos:
as instruções• , usadas para determinar o funcionamento da máquina e
a maneira como os dados devem ser tratados. As instruções são espe-
cíficas para cada arquitetura de computador, pois estão diretamente
relacionadas às características do hardware particular – como, por
exemplo, o conjunto de instruções de cada processador;
Aula 3
Tipos de dados:
variáveis e constantes
www.cliqueapostilas.com.br
AULA 3 • LógICA PARA PROgRAMAçãO
212 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
os dados• propriamente ditos, que correspondem às informações que
deverão ser processadas pelo computador.
A memória do computador pode ser entendida como uma seqüência finita
de gavetas que, em dado momento, guarda algum tipo de informação, como
um número, uma letra, uma palavra, uma frase, etc.
O computador, para poder trabalhar com alguma dessas informações,
seja para ler seu conteúdo ou alterá-lo, precisa saber exatamente onde, na
memória, o dado está localizado. Fisicamente, cada gaveta, ou cada posição
de memória – esse é o termo técnico correto – possui um endereço, ou seja, um
número, que indica o seu endereço na memória, em outras palavras, onde cada
informação está localizada. Esse número é normalmente representado usando
notação hexadecimal, tendo o tamanho de quatro, ou mais bytes – depen-
dendo da arquitetura do computador. São exemplos de endereços físicos:
END. FíSICO CONTEÚDO
7000:A210 ‘Paulo Sérgio’
3000:12BC 345
4100:0006 99.834
O endereçamento das posições de memória por meio de números hexade-
cimais é perfeitamente compreendido pela máquina, mas para nós humanos
torna-se uma tarefa complicada.
Para resolver esse problema, as linguagens de computador facilitam o
manuseio, por parte dos programadores, das posições de memória da máquina,
permitindo que, ao invés de trabalhar diretamente com os números hexadeci-
mais, seja possível atribuir nomes diferentes a cada posição de memória. Além
disso, tais nomes são de livre escolha do programador. Com esse recurso, os
usuários ficaram livres dos endereços em hexadecimal e passam a trabalhar
com endereços lógicos. Como o conteúdo de cada gaveta (endereço lógico)
pode variar, ou seja, mudar de valor ao longo da execução do programa,
convencionou-se chamar de variável a referência a cada gaveta.
Assim, para o exemplo de endereços físicos mostrados anteriormente,
poderíamos rotular a posição de memória 7000:A210 como nome e, com
isso, sempre que precisássemos do valor dessa posição de memória, bastaria
referenciar a variável nome. Assim ficaria o exemplo anterior:
END. FíSICO END. LóGICO (VARIÁVEL) CONTEÚDO
7000:A210 nome ‘Paulo Sérgio’
3000:12BC valor 345
4100:0006 total 99.834
www.cliqueapostilas.com.br
AULA 3 • LógICA PARA PROgRAMAçãO
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 213
Basicamente, uma variável possui três atributos: um nome (ou rótulo), um
tipo de dado associado à mesma e um valor que representa a informação por
ela apontada. Uma vez definidos, o nome e o tipo de uma variável não podem
ser alterados no decorrer de um programa.
Cada Linguagem de Programação define as suas regras para a criação
de identificadores de variáveis. Todavia a maioria delas concorda que um
identificador de variável deve ser formado por uma letra ou então por uma
letra seguida de uma ou mais letras ou dígitos. Como regra, as Linguagens
de Programação não permitem o uso de espaços em branco ou de qualquer
outro caractere que não seja letra ou dígito, na formação de um identificador
de variável.
Devemos sempre definir um nome significativo para as variáveis em um
programa. Com isso é muitas vezes possível ter uma idéia do conteúdo e
propósito de uma variável mesmo sem inspecioná-la. Um erro comum de
programadores iniciantes é a utilização de nomes de variáveis como simples
letras, como a, b, c, x, y. Isso torna o programa difícil de ler e compreender.
Em alguns casos, nem mesmo o seu autor entende!
Algumas linguagens permitemo uso do caractere “_” (underline) para
separar as palavras em um identificador. Assim é possível criar uma variável
com o rótulo Nome_do_Cliente.
Existem alguns dados que não sofrem alteração em seu valor do início
ao fim do programa. A esse tipo de informação convencionou-se chamar
de constante.
Conforme o seu tipo, a constante é classificada como sendo numérica,
lógica e literal.
As constantes são muito utilizadas na programação principalmente em
situações nas quais temos de referenciar um mesmo valor várias vezes ao
longo do programa. Para esses casos, podemos definir um nome de constante
e atribuir-lhe um valor. A partir daí basta referenciar o nome da constante e
implicitamente estaremos nos referenciando ao seu valor. A principal vantagem
dessa abordagem é a possibilidade de alterar o valor da constante apenas
em sua definição e essa alteração ser automaticamente refletida em qualquer
outro local do programa em que a sua referência é usada. Em casos como
esse, sem o uso de constantes, será necessário alterar o valor em cada linha
do programa onde ele foi usado.
www.cliqueapostilas.com.br
AULA 3 • LógICA PARA PROgRAMAçãO
214 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Um conceito importante sobre variáveis diz respeito à sua localidade
ou escopo. Uma variável declarada no programa principal passa a ser
visível em todo o programa e, por isso, são chamadas de variáveis globais.
Já uma variável declarada dentro de uma função ou procedimento, é dita
como local, indicando que só será visível e conhecida dentro desse proce-
dimento ou função. Procedimentos e funções serão estudados na aula sobre
Modularização.
Outro atributo característico de uma variável é o tipo de dado que ela
pode armazenar. Esse atributo define a natureza das informações contidas
na variável.
3.1 Tipos de dados
Os dados são classificados de acordo com o tipo de informação neles
contida. Essa classificação não se aplica a nenhuma linguagem de progra-
mação específica; pelo contrário, ela sintetiza os padrões utilizados na maioria
das linguagens. Na verdade, essa classificação é necessária para determinar
a porção de memória que será necessária para armazenar o dado. Além disso
essa classificação garante que a interpretação do conteúdo da posição de
memória seja feita de forma adequada.
3.1.1 Dados Numéricos
Nessa classificação, estão todos os dados que façam referência a valores.
Para o computador, existem diferentes formas de representar um valor, depen-
dendo das suas características. Por exemplo, para armazenar um valor real –
que possui casas decimais após a vírgula – é necessário um espaço bem maior
de memória. Já um valor inteiro ocupa bem menos espaço.
Os dados numéricos possuem uma subclassificação que os define
de acordo com a sua grandeza de representação. Entre as principais
subclasses temos:
inteiro• – os números inteiros são aqueles que não possuem casas deci-
mais nem são números fracionários, e podem ser positivos, negativos
ou zero. Exemplos de números inteiros são 55 (inteiro positivo), 0
(zero inteiro) e -98 (inteiro negativo);
real• – os dados do tipo real são aqueles que possuem parte decimal
ou são números fracionários, e podem ser positivos, negativos ou zero.
www.cliqueapostilas.com.br
AULA 3 • LógICA PARA PROgRAMAçãO
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 215
Exemplos de dados do tipo real são 3.2 (real positivo), 0.00 (zero
real) e -19.76 (real negativo).
Na implementação particular de cada linguagem, esses tipos de
dados numéricos são expandidos, dando origem a novos tipos de dados.
Normalmente, esses novos tipos permitem representar valores maiores ou
menores a fim de permitir um melhor uso do espaço de memória disponível
para execução do programa. A Linguagem de Programação C, que será
estudada nesse curso, por exemplo, apresenta para os números inteiros os
tipos integer (inteiro tradicional) – usado para representar números entre
32768 até +32767 e ocupa dois bytes na memória; char (caractere – que,
na verdade, é um inteiro pequeno) – usado para representar números entre
0 e 255; word – usado para representar números inteiros positivos entre
0 e 65535 e ocupa dois bytes na memória; ShortInt – usado para repre-
sentar valores inteiros entre -128 e +128 e ocupa um byte na memória; e
LongInt – usado para representar números inteiros entre 2.147.483.648 até
2.147.483.648 e ocupa quatro bytes na memória. Existem diferentes tipos
para os valores reais também.
3.1.2 Dados literais (string)
Uma informação do tipo literal representa um conjunto de caracteres que
pode ser formado por letras, dígitos ou símbolos especiais.
O computador representa cada letra, dígito e símbolo especial como
um valor inteiro que varia de 0 a 255. Assim cada caractere é tratado
internamente por esse valor. A correspondência de valores para os carac-
teres é fornecida por uma padronização internacional conhecida como
Tabela ASCII.
A Tabela ASCII ISO 8859-1, também chamada Latim I, é uma das
Tabelas ASCII estendidas, orientada especificamente para alguns idiomas
europeus ocidentais.
A correta visualização dos caracteres dessa tabela depende de vários
fatores técnicos, inclusive da fonte utilizada. Em computadores atualizados,
provavelmente, será possível uma visualização adequada sem problemas.
Observe que nem todos os números da tabela correspondem a grafemas.
Cabe ressaltar que os valores de 0 a 31, 127 e 255 são reservados para funções
especiais de processamento e não representam caracteres imprimíveis.
www.cliqueapostilas.com.br
AULA 3 • LógICA PARA PROgRAMAçãO
216 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Figura 1– Tabela ASCII.
Fonte: <http://www.abusar.org>.
Essa convenção foi padronizada para possibilitar a migração de programas
entre máquinas diferentes.
Cabe salientar que o comprimento de um dado do tipo literal é dado pelo
número de caracteres nele contido. Logo, para armazenarmos um tipo de dado
literal precisamos reservar um espaço contíguo de memória igual ao compri-
mento do mesmo, destinando um byte para cada caractere de informação. O
literal “Programação”, por exemplo, possui comprimento igual a 11, ou seja,
possui 11 caracteres.
3.1.3 Dados lógicos
Um dado do tipo lógico só possui dois valores possíveis: verdadeiro ou
falso. Dessa forma poderíamos pensar em armazenar uma informação desse
tipo em apenas um único bit. Todavia a menor porção de memória que se pode
acessar é o byte (oito bits). Assim uma informação do tipo lógico é armaze-
nada em um byte de memória.
0 32 ? 64 @ 96 ` 128 Ç 160 á 192 └ 224 Ó
1 ☺ 33 ! 65 A 97 a 129 ü 161 í 193 ┴ 225 ß
2 ☻ 34 " 66 B 98 b 130 é 162 ó 194 ┬ 226 Ô
3 ♥ 35 # 67 C 99 c 131 â 163 ú 195 ├ 227 Ò
4 ♦ 36 $ 68 D 100 d 132 ä 164 ñ 196 ─ 228 õ
5 ♣ 37 % 69 E 101 e 133 à 165 Ñ 197 ┼ 229 Õ
6 ♠ 38 & 70 F 102 f 134 å 166 ª 198 ã 230 µ
7 • 39 ' 71 G 103 g 135 ç 167 º 199 Ã 231 þ
8 ◘ 40 ( 72 H 104 h 136 ê 168 ¿ 200 ╚ 232 Þ
9 ○ 41 ) 73 I 105 i 137 ë 169 ® 201 ╔ 233 Ú
10 ◙ 42 * 74 J 106 j 138 è 170 ¬ 202 ╩ 234 Û
11 ♂ 43 + 75 K 107 k 139 ï 171 ½ 203 ╦ 235 Ù
12 ♀ 44 , 76 L 108 l 140 î 172 ¼ 204 ╠ 236 ý
13 ♪ 45 - 77 M 109 m 141 ì 173 ¡ 205 ═ 237 Ý
14 ♫ 46 . 78 N 110 n 142 Ä 174 « 206 ╬ 238 ¯
15 ☼ 47 / 79 O 111 o 143 Å 175 » 207 ¤ 239 ´
16 ► 48 0 80 P 112 p 144 É 176 ░ 208 ð 240
17 ◄ 49 1 81 Q 113 q 145 æ 177 ▒ 209 Ð 241 ±
18 ↕ 50 2 82 R 114 r 146 Æ 178 ▓ 210 Ê 242 ‗
19 ‼ 51 3 83 S 115 s 147 ô 179 │ 211 Ë 243 ¾
20 ¶ 52 4 84 T 116 t 148 ö 180 ┤ 212 È 244 ¶
21 § 53 5 85 U 117 u 149 ò 181 Á 213 ı 245 §
22 ▬ 54 6 86 V 118 v 150 û 182 Â 214 Í 246 ÷
23 ↨ 55 7 87 W 119 w 151 ù 183 À 215 Î 247 ¸
24 ↑ 56 8 88 X 120 x 152 ÿ 184 © 216 Ï 248 °
25 ↓ 57 9 89 Y 121 y 153 Ö 185 ╣ 217 ┘ 249 ¨
26 → 58 : 90 Z 122z 154 Ü 186 ║ 218 ┌ 250 ·
27 ← 59 ; 91 [ 123 { 155 ø 187 ╗ 219 █ 251 ¹
28 ∟ 60 < 92 \ 124 | 156 £ 188 ╝ 220 ▄ 252 ³
29 ↔ 61 = 93 ] 125 } 157 Ø 189 ¢ 221 ¦ 253 ²
30 ▲ 62 > 94 ^ 126 ~ 158 × 190 ¥ 222 Ì 254 ■
31 ▼ 63 ? 95 _ 127 ⌂ 159 ƒ 191 ┐ 223 ▀ 255
www.cliqueapostilas.com.br
AULA 3 • LógICA PARA PROgRAMAçãO
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 217
De certa forma, se por um lado isso pode parecer como um “desper-
dício” de memória, por outro simplifica bastante a arquitetura de memória dos
computadores. Além disso isso não é tão relevante, uma vez que, na prática,
o número de ocorrências de dados do tipo lógico é bastante inferior ao de
ocorrências de dados do tipo literal ou numérico.
3.2 Variáveis estruturadas
Existem tipos especiais de variável que permitem manipular mais de um
tipo de dados ao mesmo tempo.
Essa funcionalidade facilita a manipulação de grandes conjuntos de dados,
além de diminuir a complexidade do programa e as possibilidades de erros.
Entre os tipos mais comuns, implementados na maioria das linguagens de
programação, estão os vetores e registros.
3.2.1 Variáveis unidimensionais (vetores) e multidimensionais matrizes
Esse tipo de variável contém vários valores do mesmo tipo básico. Assim é
possível utilizar um vetor ou matriz de inteiros, por exemplo.
Na verdade, um vetor é uma coleção de elementos do tipo específico e
com tamanho pré-definido (o número de elementos do vetor deve ser definido
pelo programador na declaração dessa estrutura).
O vetor é uma coleção unidimensional e o acesso a cada elemento é dado
por um índice que representa a posição do elemento no vetor. Na maioria das
representações de vetores, o acesso é representado pelo nome da variável do
tipo vetor seguido de um valor inteiro entre colchetes, representando o índice.
A sintaxe para declaração desse tipo de variável depende da linguagem de
programação que a implementa. No caso da linguagem Pascal, a declaração
notas: array[1..10] of integer é usada para definir a variável notas como sendo
do tipo vetor de inteiros, contendo 10 elementos desse tipo. Já na linguagem
C, essa mesma variável é definida a partir da declaração int notas[10]. No
caso do Pascal, a declaração notas[1] permite acessar o valor do primeiro
elemento do vetor, enquanto notas[10], o último. Já na linguagem C, um vetor é
indexado a partir do índice zero. Com isso, para acessar o primeiro elemento
de um vetor em C, é usada a declaração notas[0] e notas[9] para o último.
Ao indexar um vetor, estamos tratando de um item individual, como se
fosse uma variável isolada.
www.cliqueapostilas.com.br
AULA 3 • LógICA PARA PROgRAMAçãO
218 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Já uma variável do tipo matriz pode ser vista como um vetor de vetores,
em que cada vetor representa uma dimensão. Por isso essa estrutura é dita
multidimensional.
O tipo de matriz mais utilizado é o bidimensional, em que são decla-
radas apenas duas dimensões. Porém a maioria das linguagens não impõem
qualquer tipo de restrição à quantidade de dimensões. Assim é possível criar
matrizes tridimensionais ou até n-dimensionais.
Um exemplo de declaração de matriz em C seria int notas[2][5]. Nesse caso,
é declarada uma matriz bidimensional, em que a primeira dimensão possui dois
elementos, e a segunda possui cinco elementos. No total, serão reservados em
memória espaço suficiente para representar 2x5=10 valores inteiros.
De forma similar aos vetores, o acesso a cada elemento da matriz deve ser
realizado a partir do nome da variável seguida de um valor inteiro para servir
de índice para cada dimensão.
3.2.2 Registros
São estruturas heterogêneas – compostas de elementos de tipos diferentes.
Cada elemento que faz parte do registro é chamado de campo. Inclusive,
cada campo pode ser do tipo registro também.
Esse tipo de estrutura permite organizar melhor os dados a serem mani-
pulados, principalmente por permitir agregar dados de uma mesma natureza.
Para entendermos melhor isso, imaginemos um programa que manipule os
seguintes dados sobre os alunos de um curso: o nome do aluno, a idade e
o número do seu CPF. Sem o uso de registros, normalmente, cada um desses
dados sobre o aluno seria manipulado em variáveis diferentes. Mesmo utili-
zando o conceito de vetor, ainda assim seria necessário manipular três vetores
diferentes. Isso torna a atividade de programação bastante complexa.
Com o uso de registro é possível agregar esses dados em uma estrutura do
tipo registro e declarar um único vetor desse tipo. Para exemplificar, podemos
examinar o seguinte trecho de código na linguagem C:
struct TAluno {
char nome[80];
int idade;
char cpf[11];
} ;
struct TAluno alunos[10];
www.cliqueapostilas.com.br
AULA 3 • LógICA PARA PROgRAMAçãO
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 219
Aqui usaremos uma notação mais genérica, independente da linguagem
de programação a ser usada. Usando essa notação, teríamos a seguinte decla-
ração do mesmo registro:
TIPO TAluno = REGISTRO
nome: CARACTERE;
idade: INTEIRO;
cpf: CARACTERE;
FIM REGISTRO
Nesse trecho de código é definida a estrutura do tipo registro chamada
TAluno. Essa estrutura agrega os campos char nome[80] usados para repre-
sentar um literal com até 80 caracteres que armazena o nome do aluno, int
idade usado para armazenar a idade do aluno, e char cpf[11] usado para
representar um literal de até 11 caracteres que armazena o CPF do aluno. Em
seguida, é declarado um vetor com 10 elementos do tipo TAluno.
A vantagem dessa abordagem é que o acesso ao elemento alunos[0], por
exemplo, retorna um registro do tipo TAluno contendo todos os seus campos de
uma única vez. Assim cada campo pode ser facilmente acessado individualmente
por sua descrição como alunos[0].nome, alunos[0].idade ou alunos[0].cpf.
Um bom programador deve dominar o uso dessas estruturas a fim de dimi-
nuir a complexidade na manipulação dos dados em um programa.
Síntese da aula
Nesta aula, discutimos como o computador armazena e manipula as infor-
mações na memória do computador.
A memória dos computadores é composta por posições numeradas e orde-
nadamente organizadas em bytes. Cada tipo de dado requer uma quantidade
diferente de bytes para armazenar a sua informação na memória. Essa quanti-
dade pode também variar em função do tipo de computador ou Linguagem de
Programação considerada.
Uma variável é uma entidade dotada de um nome para diferenciá-la das
demais e permitir encontrar a sua posição da memória, e um tipo de dado, que
define o tipo de informação que ela é capaz de guardar.
Uma vez definidos, o nome e o tipo de uma variável não podem ser alte-
rados no decorrer de um programa. Por outro lado, a informação útil da vari-
ável é passível de modificação durante o decorrer do programa, de acordo
com o fluxo de execução do mesmo.
www.cliqueapostilas.com.br
AULA 3 • LógICA PARA PROgRAMAçãO
220 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Já um dado constante não sofre alteração no seu valor durante a execução
do programa.
Atividades
1. Sobre o uso de variáveis e constantes em um algoritmo é incorreto
afirmar que:
a) toda informação manipulada diretamente pelo computador é armaze-
nada na memória principal (RAM) e as variáveis representam referên-
cias a posições dessa memória;
b) o valor de uma variável não pode ser alterado ao longo do programa,
mantendo o mesmo valor até o encerramento do programa;
c) o tipo de dado implica na forma como os dados são representados
na memória;
d) os vetores e matrizes só podem manipular dados de um mesmo tipo
de dado;
e) um dado constante não sofre alteração no seu valor durante a execução
do programa.
2. Com base no que foi estudado nestaaula, escolha a alternativa que apre-
senta, respectivamente, os tipos de dados mais adequados para variáveis
que deverão armazenar os seguintes conteúdos: idade, temperatura, nome
da cidade, número da carteira de identidade, notas de um aluno.
a) Inteiro, real, caractere, caractere, vetor de real.
b) Inteiro, inteiro, caractere, caractere, vetor de inteiro.
c) Inteiro, real, inteiro, caractere, vetor de real.
d) Inteiro, real, real, caractere, vetor de inteiro.
e) Inteiro, real, caractere, real, vetor de real.
3. Comente o uso de variáveis e constantes em um algoritmo.
4. Comente as vantagens do uso do tipo de dados Registro.
Comentário das atividades
Na atividade 1, de acordo com o que você estudou sobre variáveis e
constantes, deve reconhecer a opção (b) como a opção incorreta. Essa opção
apresenta o conceito contrário de variável. Você deveria saber que o valor
de uma variável pode ser alterado a qualquer momento da execução de um
www.cliqueapostilas.com.br
AULA 3 • LógICA PARA PROgRAMAçãO
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 221
programa. E é exatamente essa “variação” de seu valor que dá nome a esse
tipo de dado. A opção (a) está correta, pois as variáveis servem de apontador
para as posições da memória RAM, onde estão os dados a serem manipulados
pelo programa. A opção (c) também apresenta um conceito correto sobre tipo
de dado, pois é baseado no tipo do dado que o computador saberá como
tratar a posição de memória apontada pela variável. A opção (d) está correta,
inclusive é por esse motivo que vetores e matrizes são considerados estruturas
de dados homogêneos – por tratar de dados do mesmo tipo. Por fim, a opção
(e) também está correta ao trazer a definição de um dado constante.
Na atividade 2, após analisar os conteúdos a serem armazenados você
deve ter concluído que a opção correta é a opção (a), pois ela apresenta
para o conteúdo idade o tipo inteiro (afinal costumamos utilizar valores
inteiros positivos para a contar a passagem dos anos – não usamos “3,4
anos de idade”); para o conteúdo temperatura devemos usar casas decimais,
logo o tipo mais indicado é o real; para o nome da cidade precisamos de um
literal ou caractere; para o número da carteira de identidade, na verdade,
poderíamos usar um tipo caractere (isso permitiria armazenar os caracteres
de formatação, como ponto e hífen) ou como inteiro (sem formatação); já
para as notas de um aluno, uma nota normalmente é expressa como um valor
real e como será mais de uma nota (notas), o tipo de dado mais adequado
a esse caso é um vetor de real, o que permitiria manipular todas as notas
de um aluno a partir de uma mesma variável. Tomando como base essas
justificativas, você deveria considerar as demais opções como incorretas,
pelos seguintes motivos: a opção (b) apresenta inadequação para o conteúdo
temperatura e para as notas do aluno; a opção (c) apresenta inadequação
para o nome da cidade; a opção (d) apresenta inadequações para o nome
da cidade e as notas do aluno; e a opção (e) apresenta inadequações para
o número da carteira de identidade.
Para solucionar a atividade 3, você já deve saber que o uso de variáveis
permite ao programador manipular de forma mais fácil os dados que estão
armazenados na memória. Sem o auxílio de variáveis, toda vez que fosse neces-
sário algum dado da memória seria necessário endereçar a posição de memória
usando seu endereço físico em notação hexadecimal. As variáveis levam esse
nome em função do seu comportamento, em que o valor de uma variável (na
verdade, o conteúdo da posição de memória por ela referenciada) pode ser
alterado várias vezes ao longo da execução de um programa. Já um dado do
tipo constante não tem o seu valor alterado do início ao fim do programa.
www.cliqueapostilas.com.br
AULA 3 • LógICA PARA PROgRAMAçãO
222 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Na atividade 4, você deve ter se lembrado de que variáveis do tipo
Registro facilitam a manipulação de dados relacionados, como, por exemplo,
o nome, a idade e o endereço de um aluno. Essa facilidade advém do fato de
que uma variável do tipo registro, ao ser referenciada, disponibiliza todos os
dados associados de uma só vez. De outra forma, teríamos de controlar cada
dado do aluno em variáveis distintas e, para acessar os dados de um aluno,
teríamos de realizar, na verdade, o acesso a três variáveis distintas. No caso
dos registros, cada informação sobre o aluno fica disponível como um campo
da estrutura Registro.
Ao realizar as atividades propostas com sucesso, você alcançou os obje-
tivos desta aula de entender os conceitos de variável e de constante e suas
utilizações e de utilizar adequadamente cada tipo de dado disponível.
Na próxima aula
Estudaremos os principais operadores e como podem ser usados na compo-
sição de expressões. Serão estudados os operadores mais gerais e que são
implementados na maioria das Linguagens de Programação, nomeadamente:
aritméticos, lógicos, de atribuição e de concatenação.
Anotações
www.cliqueapostilas.com.br
AULA 4 • LógICA PARA PROgRAMAçãO
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 223
Objetivos
Esperamos que, ao final desta aula, você seja capaz de:
reconhecer os principais operadores da Lógica para Programação, •
utilizando-os;
construir corretamente expressões aritméticas e lógicas, avaliando-as.•
Pré-requisitos
Não há pré-requisitos formais para esta aula, uma vez que trata de opera-
ções básicas, pois pressupomos que você possua conhecimentos sobre Teoria
de Conjuntos e Matemática Fundamental. Tire suas dúvidas no caderno de
Matemática para Computação!
Introdução
Operadores são elementos funcionais que atuam sobre termos e produzem
um determinado resultado.
Os operadores são, na prática, instruções especiais pelas quais incre-
mentamos, decrementamos, comparamos e avaliamos dados dentro de
um programa de computador. Podemos classificar os operadores em três
classes:
operadores aritméticos;•
operadores relacionais;•
operadores lógicos. •
Com o uso de operadores é possível construir expressões, assim como na
matemática. A complexidade de uma expressão é determinada pela quanti-
dade de operadores e termos (variáveis ou valores constantes).
Aula 4
Operadores e expressões
www.cliqueapostilas.com.br
AULA 4 • LógICA PARA PROgRAMAçãO
224 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
De acordo com o número de termos sobre os quais os operadores atuam,
podemos classificá-los em:
binários• : quando atuam sobre dois termos. Os operadores aritméticos
básicos (adição, subtração, divisão e multiplicação), por exemplo;
unários• : quando atuam sobre um único termo. O sinal de negativo (-) na
frente de um número, cuja função é inverter seu sinal, por exemplo.
4.1 Operadores aritméticos
Os operadores aritméticos são os utilizados para obter resultados numé-
ricos. Além da adição, subtração, multiplicação e divisão, grande parte
das linguagens de programação também disponibilizam o operador para a
operação de exponenciação. Os símbolos para os operadores aritméticos são
os listados a seguir.
OPERAçãO SíMBOLO
Adição +
Subtração -
Multiplicação *
Divisão /
Exponenciação ^ (depende da linguagem utilizada)
Resto da divisão inteira MOD
Quociente da divisão inteira DIV
Esses operadores são comumente utilizados para a formação de expres-
sões aritméticas. A avaliação da expressão – o que resulta no cálculo do seu
resultado – depende da ordem na qual os operadores são processados. Para
garantir que sempre seja obedecida uma mesma ordem, é definida uma hierar-
quia para a avaliação dos operadores. Essa hierarquia é herdada da própria
matemática. Segundo esta hierarquia:em primeiro lugar, devem ser processadas as expressões entre 1.
parênteses;
em seguida, a operação de exponenciação;2.
então devem ser processadas as operações de Multiplicação e Divisão 3.
(o que aparecer primeiro);
por último, devem ser processadas as operações de Adição e Subtração 4.
(o que aparecer primeiro).
Essa hierarquia garante a correta interpretação de uma expressão
aritmética.
www.cliqueapostilas.com.br
AULA 4 • LógICA PARA PROgRAMAçãO
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 225
É importante salientar que, na maioria das Linguagens de Programação,
o tipo de dado resultante depende dos tipos de dados dos termos. A seguir
é apresentada uma listagem com os tipos de dados resultantes de cada
operador.
OPERADOR TIPO DE DADO DE A TIPO DE DADO DE B TIPO RESULTANTE
A + B
Inteiro Inteiro Inteiro
Real Real Real
Inteiro Real Real
Real Inteiro Real
A – B
Inteiro Inteiro Inteiro
Real Real Real
Inteiro Real Real
Real Inteiro Real
A * B
Inteiro Inteiro Inteiro
Real Real Real
Inteiro Real Real
Real Inteiro Real
A/B
Inteiro Inteiro Real
Real Real Real
Inteiro Real Real
Real Inteiro Real
A DIV B
Inteiro Inteiro Inteiro
Inteiro Inteiro Inteiro
A MOD B
Inteiro Inteiro Inteiro
Inteiro Inteiro Inteiro
4.2 Operadores relacionais
Os operadores relacionais são utilizados para comparar dados em um
programa. Os valores a serem comparados podem estar armazenados em
constantes, variáveis, valores numéricos ou literais.
Os operadores relacionais são:
OPERAçãO SíMBOLO
Igual a =
Diferente de <> ou != (depende da linguagem)
Maior que >
Menor que <
Maior ou igual a >=
Menor ou igual a <=
Esses operadores sempre retornam valores lógicos (verdadeiro ou
falso). Se os termos forem numéricos, a comparação é feita com base
www.cliqueapostilas.com.br
AULA 4 • LógICA PARA PROgRAMAçãO
226 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
no seu valor. Se os termos forem texto (literais), a comparação é feita
lexicograficamente, ou seja, seguindo a ordem alfabética. Se os termos
forem lógicos, apenas estão disponíveis os operadores de igualdade e a
diferença.
Para estabelecer prioridades no que diz respeito a qual operação executar
primeiro, devemos utilizar os parênteses.
Vale ressaltar que não é eficaz comparar valores do tipo real com os
operadores de igualdade em virtude de a representação em ponto flutuante ser
inexata em alguns casos.
Apesar de algebricamente correta, a expressão (1.0 / 3.0) + (1.0 / 3.0) +
(1.0 / 3.0) = 1 é avaliada como falsa devido ao fato de 1.0 / 3.0 ter como resul-
tado um valor que contém número infinito de casas decimais (3.3333333...).
O computador é apenas capaz de utilizar um número finito de casas decimais
e, portanto, é feito um arredondamento do valor de 1/3 em cada ocorrência.
Para evitar os erros causados pela representação inexata de valores reais,
deve-se evitar utilizar as comparações de igualdade com números reais.
4.3 Operadores lógicos
Os operadores lógicos servem para combinar resultados de expressões,
retornando se o resultado final é verdadeiro ou falso.
Esse tipo de operador é amplamente usado na composição de expres-
sões lógicas que são muito utilizadas nas estruturas de decisão e repetição
em um programa.
Os operadores lógicos são:
E (do inglês • AND) – uma expressão desse tipo é verdadeira se todas
as condições forem verdadeiras;
OU (do inglês • OR) – uma expressão desse tipo é verdadeira se uma ou
todas as condições forem verdadeiras;
NÃO (do inglês • NOT) – uma expressão desse tipo inverte o valor da
expressão ou condição, se verdadeira inverte para falsa e vice-versa.
Os operadores lógicos e relacionais são elementos de fundamental impor-
tância na elaboração de um programa. Em todos os programas são utilizadas
expressões relacionais e lógicas para a tomada de decisões e conseqüente
desvio do fluxo do programa.
www.cliqueapostilas.com.br
AULA 4 • LógICA PARA PROgRAMAçãO
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 227
O resultado de uma operação lógica vai depender dos valores dos termos
submetidos. A seguir é apresentada uma listagem com os tipos de dados resul-
tantes de cada operador.
OPERADOR TIPO DE DADO DE A TIPO DE DADO DE B TIPO RESULTANTE
A e B verdadeiro verdadeiro verdadeiro
A e B verdadeiro falso falso
A e B falso verdadeiro falso
A e B falso falso falso
A ou B verdadeiro verdadeiro verdadeiro
A ou B verdadeiro falso verdadeiro
A ou B falso verdadeiro verdadeiro
A ou B falso falso verdadeiro
não A verdadeiro ----- falso
não A falso ----- verdadeiro
4.4 Operador de concatenação
Esse operador é usado para concatenar, em outras palavras, juntar dois
valores ou variáveis do tipo texto (literal). Normalmente utilizamos esse tipo de
operador para compor mensagens ao longo do programa.
Na maioria das Linguagens de Programação, o símbolo usado para a
concatenação é o mesmo da adição. Assim a expressão “Programar”+”é
fácil” teria como resultado o literal “Programar é fácil”. É comum utilizar a
concatenação em expressões envolvendo variáveis. Caso a variável seja
do tipo literal, esse operador pode ser usado diretamente; caso contrário,
será necessário algum tipo de conversão a fim de torná-lo um literal. Na
verdade, a maioria das linguagens de programação traz funções para
esse propósito.
4.5 Operador de atribuição
O operador de atribuição é usado para definir o valor de uma variável.
Na prática, para executar essa operação, o computador preenche a posição
de memória apontada pela variável com o valor posicionado do lado direito
do operador de atribuição.
A expressão custo ← 23 implica em atribuir o valor 23 à variável chamada
custo. É comum o uso de expressões aritméticas ou relacionais no lado direito
desse operador. Nesses casos, o valor resultante da expressão é transferido
para a variável.
www.cliqueapostilas.com.br
AULA 4 • LógICA PARA PROgRAMAçãO
228 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
É importante ressaltar que o termo do lado esquerdo do operador de
atribuição deve sempre ser um identificador de variável, de outra forma não
haverá onde armazenar o valor posicionado no lado direito.
4.6 Expressões
O conceito de expressão, em termos computacionais, está intimamente
ligado ao conceito de expressão (ou fórmula) usado na matemática, na qual
um conjunto de variáveis e constantes numéricas relaciona-se por meio de
operadores aritméticos compondo uma fórmula que, uma vez avaliada, resulta
em um valor final.
O conceito de expressão aplicado à computação assume um sentido mais
amplo: uma expressão é uma combinação de variáveis, constantes e operadores
(aritméticos, relacionais ou lógicos) e que, uma vez avaliada, resulta em um valor.
Expressões aritméticas são aquelas cujo resultado da avaliação é do tipo
numérico, seja ele inteiro ou real. Somente o uso de operadores aritméticos e
variáveis numéricas são permitidos em expressões desse tipo.
Expressões lógicas são aquelas cujo resultado da avaliação é um valor
lógico (verdadeiro ou falso). Na formação de expressões lógicas, é permitido
tanto o uso de operadores lógicos quanto relacionais.
Síntese da aula
Nesta aula, foram apresentados e discutidos os principais Operadores
Aritméticos, Relacionais e Lógicos usados na Programação para Computadores.
Foi discutida ainda a construção e a avaliação de expressões que utilizam
esses operadores.
Atividades
1. Das alternativas apresentadas a seguir, indique aquela que representa um
operador unário.
a) Maior do que [ >]
b) Resto da divisão inteira [ MOD ]
c) Negação [NOT ]
d) Multiplicação [ * ]
e) OU lógico [ OU ]
www.cliqueapostilas.com.br
AULA 4 • LógICA PARA PROgRAMAçãO
UNITINS • ANÁLISE E DESENVOLVIMENTODE SISTEMAS • 1º PERÍODO 229
2. Das alternativas apresentadas abaixo, indique aquela que não devolve um
valor lógico. Considere os seguintes valores para as variáveis Media←7,
Pais←”Brasil”, Nota←7.25, Valor←verdadeiro e Opcao=”a”.
a) ((Nota >= Media) E (Opcao=”b”))
b) (((Nota + 1) > Media) OU (NAO Valor))
c) (((Media*2)-1) MOD 2)
d) (((Media DIV 7) = 1) OU (Nota >= Media))
e) (((Nota - Media) > 3) = Valor)
3. O algoritmo a seguir apresenta um problema discutido nesta aula. Identifique
o problema e sugira as alterações necessárias para a sua correção.
ALGORITMO A3;
VAR RESULTADO: inteiro;
A, B: real;
INICIO
A ← 25;
B ← 3;
RESULTADO ← (A / B) * 5;
IMPRIMA (RESULTADO);
FIM
4. Considere a seguinte expressão ((((A MOD 5) > 5) OU (B/C >= 1)) E ((NAO
((A<50) E (B <> C))) OU (C=5))) e determine o valor para essa expressão
lógica, tendo os valores 23, 5 e 5 como valores das variáveis A, B e C,
respectivamente.
Comentário das atividades
Na atividade 1, com base no que você estudou, deve ter ficado claro que
a opção correta é a opção (c), pois a operação lógica de negação inverte o
valor lógico do único termo sobre o qual opera. A opção (a) é incorreta, pois
o operador “maior que” é um operador binário, pois compara dois valores,
retornando verdadeiro se o valor do lado esquerdo for maior do que o lado
direito. A opção (b) também é incorreta, pois o operador de resto da divisão
inteira também é um operador binário. A opção (d) é incorreta, pois apresenta
www.cliqueapostilas.com.br
AULA 4 • LógICA PARA PROgRAMAçãO
230 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
a operação aritmética de multiplicação que também é binária. E, por fim, a
opção (e) também apresenta um operador binário, pois o operador lógico OU
opera sobre dois termos lógicos.
Para você responder a atividade 2, deve ter considerado a hierarquia das
operações e os valores das variáveis. Daí bastou usar de substituição para
avaliar o resultado de cada expressão. Seguindo essa abordagem, você deve
ter chegado à conclusão de que a única alternativa que não devolve um valor
lógico é a opção (c), pois, se substituirmos os valores das variáveis e execu-
tarmos as operações, teremos: (((Media*2)-1) MOD 2) ↔ (((7*2)-1) MOD 2)
↔ ((14 – 1) MOD 2) ↔ (13 MOD 2) ↔ 1. Ou seja, o resultado é um valor
inteiro. Se analisarmos as outras expressões da mesma maneira, veremos que
todas resultam em um valor lógico: a opção (a) retorna ((Nota >= Media) E
(Opcao=”b”)) ↔ ((7.25 >= 7) E (“a”=”b”)) ↔ (verdadeiro E falso) ↔ falso; a
opção (b) retorna (((Nota + 1) > Media) OU (NAO Valor)) ↔ (((7.25 + 1) >
7) OU (NAO verdadeiro)) ↔ ((8.25 > 7) OU falso) ↔ verdadeiro OU falso ↔
verdadeiro; a opção (d) retorna (((Media DIV 7) = 1) OU (Nota >= Media)) ↔
(((7 DIV 7) = 1) OU (7.25 >= 7)) ↔ ((1 = 1) OU (verdadeiro)) ↔ (verdadeiro
OU verdadeiro ↔ verdadeiro; e a opção (e) retorna (((Nota - Media) > 3) =
Valor) ↔ (((7.25 - 7) > 3) = verdadeiro) ↔ ((0.25 > 3) = verdadeiro) ↔ falso
= verdadeiro ↔ falso.
A partir da análise do algoritmo apresentado na atividade 3, você deve
ter notado que a instrução RESULTADO ← (A / B) * 5; apresenta um problema
quanto ao tipo de dado resultante da expressão e o tipo de dado da variável
que recebe o valor da expressão. A variável RESULTADO é declarado como
sendo do tipo inteiro. Por outro lado, você já deve saber que o operador de
divisão quando aplicado a dois valores reais, retorna como resultado um valor
também real; e o mesmo acontece com a multiplicação que segue. Assim o
resultado da expressão é do tipo real. E, nesse caso, a variável RESULTADO que
é do tipo inteiro não pode receber esse valor. A solução para esse problema é
simples nesse algoritmo. Basta alterar o tipo de dado do resultado para real,
ou seja, declará-lo como VAR RESULTADO: real.
Na atividade 4, se você utilizou a técnica de substituição dos valores das
variáveis e a resolução de cada operação respeitando a hierarquia entre elas,
você concluiu que ((((A MOD 5) > 5) OU (B/C >= 1)) E ((NAO ((A<50) E (B <>
C))) OU (C=5))) ↔ ((((23 MOD 5) > 5) OU (5/5 >= 1)) E ((NAO ((23<50) E
(5 <> 5))) OU (5=5))) ↔ (((3 > 5) OU (1 >= 1)) E ((NAO (verdadeiro E falso))
OU verdadeiro)) ↔ ((falso OU verdadeiro) E ((NAO falso) OU verdadeiro)) ↔
www.cliqueapostilas.com.br
AULA 4 • LógICA PARA PROgRAMAçãO
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 231
(verdadeiro E (verdadeiro OU verdadeiro)) ↔ (verdadeiro E verdadeiro) ↔
verdadeiro. Logo o valor para essa expressão lógica é verdadeiro.
Ao realizar as atividades propostas, checando-as com os comentários e
obtendo sucesso, você está apto a reconhecer os principais Operadores da
Lógica para Programação, utilizando-os, e construir corretamente expressões
aritméticas e lógicas, avaliando-as. Parabéns!
Na próxima aula
Estudaremos, na próxima aula, a Estrutura de Arquivo. Na prática, esse
tipo de estrutura é muito utilizado para o armazenamento e manipulação de
grandes conjuntos de dados.
Anotações
www.cliqueapostilas.com.br
AULA 4 • LógICA PARA PROgRAMAçãO
232 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
www.cliqueapostilas.com.br
AULA 5 • LógICA PARA PROgRAMAçãO
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 233
Objetivos
Esperamos que, ao final desta aula, você seja capaz de:
definir uma estrutura de arquivos;•
utilizar arquivos na construção de algoritmos.•
Pré-requisitos
Por tratar de uma estrutura que é armazenada em dispositivos de memória secun-
dária (discos rígidos, fitas, pen drivers, etc.), é desejável um conhecimento básico
sobre esses dispositivos e sobre sistemas operacionais. Caso ainda não conheça
esses dispositivos, procure conhecê-los por meio de seus colegas e web-tutoria.
Introdução
Até aqui discutimos a manipulação de dados em um programa exclusiva-
mente em memória principal – memória RAM – e vimos como as variáveis são
utilizadas para esse fim. Entretanto nos limitamos a problemas que exigiam
poucos dados a serem processados e, com isso, estruturas mais simples
puderam ser usadas normalmente. Mas na prática existem inúmeros casos
que exigem uma grande quantidade de dados de entrada ou saída. E nestes
casos as variáveis ou até mesmo os vetores já não são suficientes ou tornam o
algoritmo muito complexo. Em casos assim, devemos utilizar uma estrutura de
arquivo para a manipulação desses dados.
Além disso, por armazenarem os dados em memória secundária, os
arquivos garantem que os dados neles armazenados não se percam ao final
da execução do programa.
Nesta aula, estudaremos como os arquivos devem ser utilizados em um
algoritmo computacional.
Aula 5
Arquivos
www.cliqueapostilas.com.br
AULA 5 • LógICA PARA PROgRAMAçãO
234 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
5.1 Declaração
Um arquivo é, em sua essência, um conjunto de registros e, portanto não
possui um tamanho fixo. Na prática, os arquivos são utilizados para manter
uma grande quantidade de dados como, por exemplo, os dados de todos os
alunos de uma escola.
Já que um arquivo é um conjunto de registros, antes de declarar um
arquivo propriamente dito, precisamos declarar o registro que representa cada
dado individual armazenado. Seguindo o exemplo de alunos de uma escola,
podemos definir o registro contendo informações sobre cada aluno individual
da seguinte forma:
TIPO TAluno = REGISTRO
nome: CARACTERE;
idade: INTEIRO;
cpf: CARACTERE;
FIM REGISTRO
Após termos definido a estrutura do registro TAluno, podemos declarar
o arquivo usandoa sintaxe genérica TIPO <identificador> = ARQUIVO DE
<tipo_registro>. Para o nosso caso, iremos definir TArqAluno como identifi-
cador do arquivo de alunos e, então, declararemos o arquivo como sendo:
TIPO TArqAluno = ARQUIVO DE TAluno.
Com essa declaração, estamos dizendo ao computador que o tipo
TArqAluno representa uma estrutura de arquivo contendo registros seguindo
a estrutura TAluno, ou seja, cada elemento individual do arquivo possui os
campos nome, idade e cpf.
5.2 Manipulação
Para manipular um arquivo em um algoritmo é preciso que possamos refe-
renciá-lo. Para isso precisamos definir uma variável tendo como tipo de dado
o tipo do arquivo.
Em nosso exemplo, criaremos a variável alunos para manipular o arquivo.
Para criar a variável podemos usar a seguinte declaração: VAR alunos:
TArqAluno;. Na maioria das Linguagens de Programação, esse tipo de variável
é implementada como uma estrutura interna contendo vários outros campos
que permitem descrever e controlar o arquivo associado com a variável.
www.cliqueapostilas.com.br
AULA 5 • LógICA PARA PROgRAMAçãO
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 235
Para a manipulação de arquivos, a maioria das Linguagens de Programação
implementam funções específicas para as principais operações sobre arquivos:
ABRE, FECHA, COPIA, GRAVA, REMOVE, FIMDEARQUIVO, PROXIMO e
POSICIONE.
A operação ABRE (<variável do tipo arquivo >) é usada para abrir o
arquivo e posicionar o ponteiro de leitura no primeiro registro armazenado.
Na prática, a implementação dessa operação envolve uma série de verifica-
ções para garantir que o arquivo existe, se o usuário do computador possui
direitos de acesso a ele, etc.
Ao trabalharmos com arquivos, devemos ter como prática que sempre que
um arquivo não estiver sendo mais usado ele deve ser fechado para garantir
a integridade dos dados nele armazenados. Para fechar um arquivo devemos
usar a operação FECHA (<variável do tipo arquivo >).
Ao manipular um arquivo, temos a necessidade de operar sobre os
campos dos registros contidos nele. Nesses casos, copiamos o conteúdo do
registro atual de um arquivo para outra variável do tipo registro. A partir daí
operamos sobre os campos do registro que recebeu os dados copiados. Nessa
situação é usada a operação COPIA (<variável do arquivo origem>, <variável
do tipo registro>). É importante lembrar que a variável do tipo registro que
irá receber uma cópia dos dados deve ser do mesmo tipo dos registros do
arquivo, ou seja, armazenar registros contendo exatamente a mesma estrutura
– os mesmos campos. Essa operação COPIA pode ser vista como uma leitura
do registro atual do arquivo.
O exemplo de algoritmo a seguir, representado em pseudocódigo,
demonstra o uso das operações ABRE, FECHA e COPIA.
ALGORITMO arquivos;
TIPO TAluno = REGISTRO
nome: CARACTERE;
idade: INTEIRO;
cpf: CARACTERE;
FIM REGISTRO
TIPO TArqAluno = ARQUIVO DE TAluno;
VAR alunos: TArqAluno;
aux: TAluno;
www.cliqueapostilas.com.br
AULA 5 • LógICA PARA PROgRAMAçãO
236 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
INICIO
ABRE(alunos);
COPIA(alunos, aux);
IMPRIMA(“Nome: ” + aux.nome);
IMPRIMA(“Idade: ” + aux.idade);
IMPRIMA(“CPF: ” + aux.cpf);
FECHA(alunos);
FIM
Como a função principal de um arquivo é guardar informações para que
não se percam com o desligamento do computador, a operação GRAVA (<vari-
ável do tipo arquivo>, <variável do tipo registro>) deve ser usada. Essa operação
diz ao computador que o registro (na verdade os dados armazenados) passado
por parâmetro deverá ser armazenado no arquivo. Na prática, é criado um
novo registro no final do arquivo e os dados são copiados para ele.
Certos algoritmos exigem em algum momento que um registro do arquivo
seja apagado. Isso é possível por meio da operação REMOVE (<variável do
tipo arquivo >) que irá remover o registro atualmente referenciado pelo apon-
tador do arquivo, mais conhecido como posição corrente.
Os arquivos de registros normalmente possuem uma característica seqüencial,
na qual cada novo registro é inserido no final do arquivo, sem nenhuma orde-
nação. Essa característica implica termos de buscar sequencialmente, ou seja, um
registro após o outro. Para mover a posição corrente de um arquivo para o próximo
registro, devemos utilizar a operação PROXIMO (<variável do tipo arquivo>).
A movimentação em um arquivo pode levar até o último registro do arquivo
e, nesse caso, não haverá um próximo registro a ser posicionado, e dizemos
que foi alcançado o final do arquivo. Em um algoritmo envolvendo arquivos
precisamos saber quando chegamos ao final do arquivo. Nesse caso, usamos
a operação FIMDEARQUIVO (<variável do tipo arquivo>) que retorna um valor
lógico – verdadeiro, indicando que o fim do arquivo foi alcançado; e falso,
indicando o contrário.
O exemplo a seguir expande o anterior e demonstra como podemos
ler e gravar informações em um arquivo. A primeira estrutura de repetição
ENQUANTO do algoritmo serve para inserir repetidamente novos registros
ao arquivo. Na prática, enquanto o usuário responder ‘S’ para a questão
“INSERIR NOVO REGISTRO? (S/N)” o conjunto de comandos que lêem os
dados de um novo registro e grava-o no arquivo serão executados.
www.cliqueapostilas.com.br
AULA 5 • LógICA PARA PROgRAMAçãO
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO 237
ALGORITMO arquivos;
TIPO TAluno = REGISTRO
nome: CARACTERE;
idade: INTEIRO;
cpf: CARACTERE;
FIM REGISTRO
TIPO TArqAluno = ARQUIVO DE TAluno;
VAR alunos: TArqAluno;
aux: TAluno;
resposta: CARACTERE;
INICIO
ABRE (alunos);
IMPRIMA “INSERIR NOVO REGISTRO? (S/N)”
LEIA (resposta);
ENQUANTO (resposta = ‘S’) FACA
LEIA (aux.nome);
LEIA (aux.idade);
LEIA (aux.cpf);
GRAVA (alunos, aux);
IMPRIMA “INSERIR NOVO REGISTRO? (S/N)”
LEIA (resposta);
FIM ENQUANTO
FECHA (alunos);
IMPRIME (“Conteúdo do arquivo: ”);
ABRE (alunos);
ENQUANTO (NÃO FIMDEARQUIVO (alunos)) FACA
COPIA (alunos,aux);
IMPRIMA(“Nome: ” + aux.nome);
IMPRIMA(“Idade: ” + aux.idade);
IMPRIMA(“CPF: ” + aux.cpf);
PROXIMO (alunos);
FIM ENQUANTO
FECHA (alunos);
FIM
A maioria das Linguagens de Programação já implementam estruturas
de arquivos que permitem, além do acesso seqüencial, que possamos
acessar um registro específico do arquivo sem ter de percorrer os regis-
www.cliqueapostilas.com.br
AULA 5 • LógICA PARA PROgRAMAçãO
238 1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
tros que o antecedem. Esse tipo de arquivo é conhecido como arquivo de
acesso randômico ou de acesso direto. Para ele, podemos usar a operação
POSICIONE (<variável do tipo arquivo>, <chave>), que permite posicionar
como registro corrente o registro que possua como valor de campo o valor
passado como chave. Essa instrução é muito útil quando temos uma grande
quantidade de dados no arquivo e queremos realizar alguma busca por um
registro específico.
5.3 Arquivos texto
Algumas vezes queremos armazenas dados sem nenhuma estrutura espe-
cífica, como no caso dos registros. Na verdade, queremos apenas armazenar
um conjunto de caracteres.
Síntese da aula
Nesta aula, você estudou os principais conceitos relacionados à defi-
nição e à manipulação da Estrutura de Arquivo. Essa estrutura é fundamental
na programação, pois permite manipular uma grande quantidade de infor-
mações ao mesmo tempo. Além disso permite armazenar, de forma defini-
tiva, dados que podem ser usados em outros programas ou em uma próxima
execução do mesmo.
Atividades
1. Após analisar as afirmações a seguir, indique a alternativa que apresenta
a opção correta.
I. Um arquivo permite armazenar dados em memória secundária.
II. Quando o programa é encerrado, os dados de um arquivo são