Você está na página 1de 320

Ficha Catalográfica elaborada pela UNITINS.

Bibliotecária – Rozangela Martins da Silva CRB2/1019

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.
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
Sumário
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


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


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
Créditos

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
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

Apresentação
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


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
Plano de Ensino

• 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 de numeração

• Classificação de software

• Noções básicas de redes de computadores e banco de dados

• Profissões na área de Informática


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.

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  9


Aula 1 • Computação Básica

Aula 1
História da computação

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

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  11


Aula 1 • Computação Básica

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

12  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 1 • Computação Básica

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.

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  13


Aula 1 • Computação Básica

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 ponteiro dos 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.

14  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 1 • Computação Básica

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.

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  15


Aula 1 • Computação Básica

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

16  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 1 • Computação Básica

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áquina de 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.

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  17


Aula 1 • Computação Básica

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

18  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 1 • Computação Básica

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-

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  19


Aula 1 • Computação Básica

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.

20  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 1 • Computação Básica

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,

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  21


Aula 1 • Computação Básica

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

22  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 1 • Computação Básica

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?

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  23


Aula 1 • Computação Básica

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 quanto ao 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.

24  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 1 • Computação Básica

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










UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  25


Aula 1 • Computação Básica

26  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 2 • Computação Básica

Aula 2
Componentes básicos
do computador

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.

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  27


Aula 2 • Computação Básica

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.

28  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 2 • Computação Básica

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,

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  29


Aula 2 • Computação Básica

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).

30  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 2 • Computação Básica

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).

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  31


Aula 2 • Computação Básica

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 utiliza um
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-

32  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 2 • Computação Básica

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?

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  33


Aula 2 • Computação Básica

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

34  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 2 • Computação Básica

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















UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  35


Aula 2 • Computação Básica

36  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 3 • Computação Básica

Aula 3
Sistemas posicionais
de numeração

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.

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  37


Aula 3 • Computação Básica

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).

38  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 3 • Computação Básica

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 ∙ bn + an-1 ∙ bn-1 + an-2 ∙ bn-2 + ... + a0 ∙ b0

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.

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  39


Aula 3 • Computação Básica

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

40  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 3 • Computação Básica

Gates (1995) apresenta uma forma diferente, no intuito de facilitar


o entendimento, sobre o sistema numé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 Lâmpada Lâmpada Lâmpada Lâmpada Lâmpada Lâmpada Lâmpada


de 128 de 64 de 32 de 16 de 8 de 4 de 2 de 1
watts watts watts watts watts watts watts 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 Lâmpada Lâmpada Lâmpada Lâmpada Lâmpada Lâmpada Lâmpada


de 128 de 64 de 32 de 16 de 8 de 4 de 2 de 1
watts watts watts watts watts watts watts watts

interruptor interruptor interruptor interruptor interruptor interruptor interruptor interruptor

Figura 2 – Interruptores ajustados para produzir 137 watts


Fonte: Gates (1995).

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  41


Aula 3 • Computação Básica

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.

42  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 3 • Computação Básica

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

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  43


Aula 3 • Computação Básica

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.

44  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 3 • Computação Básica

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
sentido da leitura
1 3 2

1 1
(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).

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  45


Aula 3 • Computação Básica

3.8 Conversão entre base 2 e 16


A conversão entre 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.

46  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 3 • Computação Básica

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

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  47


Aula 3 • Computação Básica

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 = anbn + an–1bn–1 + an–2bn–2 + ... + a0b0 + 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 23 + 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

48  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 3 • Computação Básica

b) Base 8 para base 10


51,348 = 5 x 81 + 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 161 + 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 x2
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

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  49


Aula 3 • Computação Básica

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.

50  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 3 • Computação Básica

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.

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  51


Aula 3 • Computação Básica

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























52  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 4 • Computação Básica

Aula 4
Operações aritméticas no
sistema binário de numeração

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

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  53


Aula 4 • Computação Básica

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

54  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 4 • Computação Básica

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.

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  55


Aula 4 • Computação Básica

Tabela 3 – Tabela básica da operação binária de subtração


Primeiro operando Segundo operando Resultado da subtração
0 0 0
1, vai 1 para ser subtraído no
0 1
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 sistema
decimal, 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.

56  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 4 • Computação Básica

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 Segundo Resultado da
operando operando 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.

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  57


Aula 4 • Computação Básica

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;

58  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 4 • Computação Básica

• 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.

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  59


Aula 4 • Computação Básica

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:

60  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 4 • Computação Básica

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 0
0 0 1 1
1 0
0 1 0
1 0
0 0 0 0

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  61


Aula 4 • Computação Básica

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

























62  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 5 • Computação Básica

Aula 5
Classificação de software

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!

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  63


Aula 5 • Computação Básica

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;

64  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 5 • Computação Básica

• 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.

Saiba mais

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>).

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

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  65


Aula 5 • Computação Básica

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 impostas pela 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

66  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 5 • Computação Básica

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.

Pensando sobre o assunto

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.

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.

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  67


Aula 5 • Computação Básica

Saiba mais

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.

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.

Pensando sobre o assunto

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.

68  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 5 • Computação Básica

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.

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  69


Aula 5 • Computação Básica

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.

70  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 6 • Computação Básica

Aula 6
Noções básicas de redes de
computadores e banco de dados

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).

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  71


Aula 6 • Computação Básica

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.

72  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 6 • Computação Básica

Saiba mais

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.

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 entre si 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.

Saiba mais

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.

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.

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  73


Aula 6 • Computação Básica

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.

Saiba mais

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.

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.

74  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 6 • Computação Básica

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.

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  75


Aula 6 • Computação Básica

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.

Saiba mais

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.

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.

76  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 6 • Computação Básica

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 é composto de 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.

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  77


Aula 6 • Computação Básica

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




78  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 7 • Computação Básica

Aula 7
Profissões na área
de Informática

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.

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  79


Aula 7 • Computação Básica

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.

80  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 7 • Computação Básica

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.

Saiba mais

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.

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.

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  81


Aula 7 • Computação Básica

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.

82  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 7 • Computação Básica

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.

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  83


Aula 7 • Computação Básica

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.

84  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 7 • Computação Básica

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.

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  85


Aula 7 • Computação Básica

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.

86  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 7 • Computação Básica

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;

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  87


Aula 7 • Computação Básica

• 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, entre as 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.

88  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 7 • Computação Básica

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

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  89


Aula 7 • Computação Básica

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.

90  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 7 • Computação Básica

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.

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  91


Aula 7 • Computação Básica

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


























92  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


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
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
Créditos

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
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

Apresentação
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


EMENTA
Programação em Linguagem C. Estruturas de dados homogêneas e hetero-
gêneas. Modularização de Algoritmos.

OBJETIVOS
Plano de Ensino

• 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
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.

UNITINS • Análise e desenvolvimento de sistemas • 1º PERÍODO  97


Aula 1 • Algoritmos e Programação

Aula 1
Introdução à programação em
Linguagem C

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.

UNITINS • Análise e desenvolvimento de sistemas • 1º PERÍODO  99


Aula 1 • Algoritmos e Programação

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.

100  1º PERÍODO • Análise e desenvolvimento de sistemas • UNITINS


Aula 1 • Algoritmos e Programação

A seguir, estão os caracteres permitidos na linguagem C.

Caracteres válidos:
abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ
1234567890
+-*/\=|&!?#%(){}[]_‘“.,:<>

O uso de algum caractere inválido (fora desse conjunto) dará


origem a um erro na geração do programa. Por isso, é muito importante
conhecer 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

UNITINS • Análise e desenvolvimento de sistemas • 1º PERÍODO  101


Aula 1 • Algoritmos e Programação

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.

102  1º PERÍODO • Análise e desenvolvimento de sistemas • UNITINS


Aula 1 • Algoritmos e Programação

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!

UNITINS • Análise e desenvolvimento de sistemas • 1º PERÍODO  103


Aula 1 • Algoritmos e Programação

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.

104  1º PERÍODO • Análise e desenvolvimento de sistemas • UNITINS


Aula 1 • Algoritmos e Programação

Tamanho
Tipo de dado Capacidade de representação
(em bits)
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.

UNITINS • Análise e desenvolvimento de sistemas • 1º PERÍODO  105


Aula 1 • Algoritmos e Programação

• 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

106  1º PERÍODO • Análise e desenvolvimento de sistemas • UNITINS


Aula 1 • Algoritmos e Programação

\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: Em linguagem C:
VAR x, y: real; float x,y;
valor: inteiro; int valor;
INICIO int main()
valor ← x + y; {valor = x + y;
FIM }

UNITINS • Análise e desenvolvimento de sistemas • 1º PERÍODO  107


Aula 1 • Algoritmos e Programação

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:

108  1º PERÍODO • Análise e desenvolvimento de sistemas • UNITINS


Aula 1 • Algoritmos e Programação

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
inteiro em formato hexadecimal
%X
%u unsigned int
%ld long int
%f float
%c char
%e
float em formato exponencial
%E

UNITINS • Análise e desenvolvimento de sistemas • 1º PERÍODO  109


Aula 1 • Algoritmos e Programação

Especificador Formato
%g float. C escolhe melhor maneira de exibição
%G 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;

110  1º PERÍODO • Análise e desenvolvimento de sistemas • UNITINS


Aula 1 • Algoritmos e Programação

• 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

UNITINS • Análise e desenvolvimento de sistemas • 1º PERÍODO  111


Aula 1 • Algoritmos e Programação

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.

112  1º PERÍODO • Análise e desenvolvimento de sistemas • UNITINS


Aula 1 • Algoritmos e Programação

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


























UNITINS • Análise e desenvolvimento de sistemas • 1º PERÍODO  113


Aula 1 • Algoritmos e Programação

114  1º PERÍODO • Análise e desenvolvimento de sistemas • UNITINS


Aula 2 • Algoritmos e Programação

Aula 2
Operadores

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 C oferece 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.

UNITINS • Análise e desenvolvimento de sistemas • 1º PERÍODO  115


Aula 2 • Algoritmos e Programação

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”.

116  1º PERÍODO • Análise e desenvolvimento de sistemas • UNITINS


Aula 2 • Algoritmos e Programação

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

UNITINS • Análise e desenvolvimento de sistemas • 1º PERÍODO  117


Aula 2 • Algoritmos e Programação

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:

118  1º PERÍODO • Análise e desenvolvimento de sistemas • UNITINS


Aula 2 • Algoritmos e Programação

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

UNITINS • Análise e desenvolvimento de sistemas • 1º PERÍODO  119


Aula 2 • Algoritmos e Programação

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 utilidade desse
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.

120  1º PERÍODO • Análise e desenvolvimento de sistemas • UNITINS


Aula 2 • Algoritmos e Programação

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;

UNITINS • Análise e desenvolvimento de sistemas • 1º PERÍODO  121


Aula 2 • Algoritmos e Programação

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.

122  1º PERÍODO • Análise e desenvolvimento de sistemas • UNITINS


Aula 2 • Algoritmos e Programação

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


























UNITINS • Análise e desenvolvimento de sistemas • 1º PERÍODO  123


Aula 2 • Algoritmos e Programação

124  1º PERÍODO • Análise e desenvolvimento de sistemas • UNITINS


Aula 3 • Algoritmos e Programação

Aula 3
Estruturas de controle

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:

UNITINS • Análise e desenvolvimento de sistemas • 1º PERÍODO  125


Aula 3 • Algoritmos e Programação

• 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 pela estrutura 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; #include <stdio.h>


VAR N: Inteiro; int main( ) {
INICIO int N;
LEIA N; scanf (“%d”, &N);
SE N>0 ENTAO if (N > 0)
IMPRIMA N; {
FIM SE printf (“%d”, N);
FIM }
}

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).

126  1º PERÍODO • Análise e desenvolvimento de sistemas • UNITINS


Aula 3 • Algoritmos e Programação

O exemplo a seguir demonstra a utilização dessa estrutura.


ALGORITMO Selecao_ #include <stdio.h>
Composta; int main( ) {
VAR N: Inteiro; int N;
INICIO scanf (“%d”, &N);
LEIA N; if (N > 0)
SE N>0 ENTAO {
IMPRIMA N; printf (“%d”, N);
SENAO }
IMPRIMA “O valor de N else
deve ser positivo”; {
FIM SE printf (“O valor de N deve ser
FIM 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; #include <stdio.h>
VAR N: Inteiro; int main() {
INICIO int N;
LEIA N; scanf (“%d”, &N);
SE N>0 ENTAO if (N > 0)
SE N MOD 2 = 0 ENTAO {
IMPRIMA “ esse valor é par”; if (N % 2 == 0) {
SENAO printf (“%d”, N);
IMPRIMA “ esse valor é ímpar” }
FIM SE }
SENAO else
IMPRIMA “O valor de N deve ser {
positivo”; printf (“O valor de N deve ser
FIM SE positivo”);
FIM }
}

UNITINS • Análise e desenvolvimento de sistemas • 1º PERÍODO  127


Aula 3 • Algoritmos e Programação

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:

128  1º PERÍODO • Análise e desenvolvimento de sistemas • UNITINS


Aula 3 • Algoritmos e Programação

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;
}
}

UNITINS • Análise e desenvolvimento de sistemas • 1º PERÍODO  129


Aula 3 • Algoritmos e Programação

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.

130  1º PERÍODO • Análise e desenvolvimento de sistemas • UNITINS


Aula 3 • Algoritmos e Programação

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 escrever todos 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 é:

UNITINS • Análise e desenvolvimento de sistemas • 1º PERÍODO  131


Aula 3 • Algoritmos e Programação

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!”);
}

132  1º PERÍODO • Análise e desenvolvimento de sistemas • UNITINS


Aula 3 • Algoritmos e Programação

a) c)
if (tecla == ‘1’) { switch (tecla) {
Funcao1 ( ); case ‘1’: Funcao1 ( );
} break;
if (tecla == ‘2’) { case ‘2’: Funcao2 ( );
Funcao2 ( ); break;
} case ‘3’: Funcao3 ( );
if (tecla == ‘3’) { break;
Funcao3 ( ); default: printf (“\nOpção invalida!”);
} }
printf (“\nOpção invalida!”);
b) d)
if (tecla == ‘1’) { switch (tecla) {
Funcao1 ( ); case ‘1’: Funcao1 ( );
if (tecla == ‘2’) { case ‘2’: Funcao2 ( );
Funcao2 ( ); case ‘3’: Funcao3 ( );
if (tecla == ‘3’) { default: printf (“\nOpção invalida!”);
Funcao3 ( ); }
}
}
}
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

UNITINS • Análise e desenvolvimento de sistemas • 1º PERÍODO  133


Aula 3 • Algoritmos e Programação

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);
}

134  1º PERÍODO • Análise e desenvolvimento de sistemas • UNITINS


Aula 3 • Algoritmos e Programação

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



















UNITINS • Análise e desenvolvimento de sistemas • 1º PERÍODO  135


Aula 3 • Algoritmos e Programação

136  1º PERÍODO • Análise e desenvolvimento de sistemas • UNITINS


Aula 4 • Algoritmos e Programação

Aula 4
Modularização em C: uso de
Funções

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:

UNITINS • Análise e desenvolvimento de sistemas • 1º PERÍODO  137


Aula 4 • Algoritmos e Programação

• 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.

138  1º PERÍODO • Análise e desenvolvimento de sistemas • UNITINS


Aula 4 • Algoritmos e Programação

/* 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
}

UNITINS • Análise e desenvolvimento de sistemas • 1º PERÍODO  139


Aula 4 • Algoritmos e Programação

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.

140  1º PERÍODO • Análise e desenvolvimento de sistemas • UNITINS


Aula 4 • Algoritmos e Programação

É 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);
}

UNITINS • Análise e desenvolvimento de sistemas • 1º PERÍODO  141


Aula 4 • Algoritmos e Programação

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

142  1º PERÍODO • Análise e desenvolvimento de sistemas • UNITINS


Aula 4 • Algoritmos e Programação

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

UNITINS • Análise e desenvolvimento de sistemas • 1º PERÍODO  143


Aula 4 • Algoritmos e Programação

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.

144  1º PERÍODO • Análise e desenvolvimento de sistemas • UNITINS


Aula 4 • Algoritmos e Programação

#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);
}

UNITINS • Análise e desenvolvimento de sistemas • 1º PERÍODO  145


Aula 4 • Algoritmos e Programação

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



























146  1º PERÍODO • Análise e desenvolvimento de sistemas • UNITINS


Aula 5 • Algoritmos e Programação

Aula 5
Estruturas de dados homogêneas
(vetores e matrizes) e
heterogêneas (estruturas)
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

UNITINS • Análise e desenvolvimento de sistemas • 1º PERÍODO  147


Aula 5 • Algoritmos e Programação

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:

148  1º PERÍODO • Análise e desenvolvimento de sistemas • UNITINS


Aula 5 • Algoritmos e Programação

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

UNITINS • Análise e desenvolvimento de sistemas • 1º PERÍODO  149


Aula 5 • Algoritmos e Programação

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;

150  1º PERÍODO • Análise e desenvolvimento de sistemas • UNITINS


Aula 5 • Algoritmos e Programação

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;
};

UNITINS • Análise e desenvolvimento de sistemas • 1º PERÍODO  151


Aula 5 • Algoritmos e Programação

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:

152  1º PERÍODO • Análise e desenvolvimento de sistemas • UNITINS


Aula 5 • Algoritmos e Programação

#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);
}

UNITINS • Análise e desenvolvimento de sistemas • 1º PERÍODO  153


Aula 5 • Algoritmos e Programação

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).

154  1º PERÍODO • Análise e desenvolvimento de sistemas • UNITINS


Aula 5 • Algoritmos e Programação

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);
}

UNITINS • Análise e desenvolvimento de sistemas • 1º PERÍODO  155


Aula 5 • Algoritmos e Programação

/* 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
















156  1º PERÍODO • Análise e desenvolvimento de sistemas • UNITINS


Aula 6 • Algoritmos e Programação

Aula 6
Ponteiros e alocação dinâmica

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.

UNITINS • Análise e desenvolvimento de sistemas • 1º PERÍODO  157


Aula 6 • Algoritmos e Programação

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.

158  1º PERÍODO • Análise e desenvolvimento de sistemas • UNITINS


Aula 6 • Algoritmos e Programação

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.

UNITINS • Análise e desenvolvimento de sistemas • 1º PERÍODO  159


Aula 6 • Algoritmos e Programação

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++;
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 valor 10;
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
=8 8
13 13
prt_numero = &numero; 6 6
4 4
5 5
9 9
14 14
numero++; 7 7
5 5
6 6

160  1º PERÍODO • Análise e desenvolvimento de sistemas • UNITINS


Aula 6 • Algoritmos e Programação

Instrução Número *ptr_numero


= 10 10
15 15
numero = ++(*prt_numero); 7 8
6 6
7 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












UNITINS • Análise e desenvolvimento de sistemas • 1º PERÍODO  161


Aula 6 • Algoritmos e Programação

162  1º PERÍODO • Análise e desenvolvimento de sistemas • UNITINS


Aula 7 • Algoritmos e Programação

Aula 7
Arquivos

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.

UNITINS • Análise e desenvolvimento de sistemas • 1º PERÍODO  163


Aula 7 • Algoritmos e Programação

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

164  1º PERÍODO • Análise e desenvolvimento de sistemas • UNITINS


Aula 7 • Algoritmos e Programação

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, mas isso 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.

UNITINS • Análise e desenvolvimento de sistemas • 1º PERÍODO  165


Aula 7 • Algoritmos e Programação

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.
Abre um arquivo texto para escrita. Se um arquivo com o mesmo
w
nome existir, será sobrescrito.
Abre um arquivo texto para anexação. Se o arquivo não existir,
a
será criado.
rb Abre um arquivo binário para leitura.
Abre um arquivo binário para escrita. Se um arquivo com o
wb
mesmo nome existir, será sobrescrito.
Abre um arquivo binário para anexação. Se o arquivo não
ab
existir, será criado.
r+
Abre um arquivo texto para leitura/escrita. Se o arquivo não
w+
existir, será criado.
a+
r+b
w+b
Abre um arquivo binário para leitura/escrita. Se o arquivo não
a+b
existir, será criado.
rb+
wb+
ab+

É 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.

166  1º PERÍODO • Análise e desenvolvimento de sistemas • UNITINS


Aula 7 • Algoritmos e Programação

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.

UNITINS • Análise e desenvolvimento de sistemas • 1º PERÍODO  167


Aula 7 • Algoritmos e Programação

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.

168  1º PERÍODO • Análise e desenvolvimento de sistemas • UNITINS


Aula 7 • Algoritmos e Programação

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.

UNITINS • Análise e desenvolvimento de sistemas • 1º PERÍODO  169


Aula 7 • Algoritmos e Programação

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.

170  1º PERÍODO • Análise e desenvolvimento de sistemas • UNITINS


Aula 7 • Algoritmos e Programação

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

UNITINS • Análise e desenvolvimento de sistemas • 1º PERÍODO  171


Aula 7 • Algoritmos e Programação

(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);
}

172  1º PERÍODO • Análise e desenvolvimento de sistemas • UNITINS


Aula 7 • Algoritmos e Programação

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





























UNITINS • Análise e desenvolvimento de sistemas • 1º PERÍODO  173


Aula 7 • Algoritmos e Programação

174  1º PERÍODO • Análise e desenvolvimento de sistemas • UNITINS


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
Créditos

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
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
e de 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-

Apresentação
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


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
Plano de Ensino

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
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.

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  179


Aula 1 • Lógica para Programação

Aula 1
Fundamentos da
Lógica para Programação

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.

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  181


Aula 1 • Lógica para Programação

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.

182  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 1 • Lógica para Programação

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”);

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  183


Aula 1 • Lógica para Programação

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.

184  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 1 • Lógica para Programação

É 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.

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  185


Aula 1 • Lógica para Programação

Quando temos um problema e precisamos construir um algoritmo para


resolvê-lo, devemos passar pelas seguintes etapas:

a) definir o problema;

b) realizar um estudo da situação atual e verificar qual(is) a(s) forma(s) de


resolver o problema;

c) terminada a fase de estudo, descrever o algoritmo que deverá, a prin-


cípio, resolver o problema;

d) analisar junto aos usuários se o problema será resolvido. Se a solução


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:

I. pegue uma escada;

II. posicione-a embaixo da lâmpada;

III. busque uma lâmpada nova;

IV. suba na escada;

V. retire a lâmpada velha;

VI. coloque a lâmpada nova.

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ção em 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:

186  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 1 • Lógica para Programação

I. pegue uma escada;

II. posicione-a embaixo da lâmpada;

III. busque uma lâmpada nova;

IV. ligue o interruptor;

V. se a lâmpada não acender, então:

a) suba na escada;

b) retire a lâmpada velha;

c) coloque a lâmpada nova.

À 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:

VI. ligue o interruptor;

VII. 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.

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-

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  187


Aula 1 • Lógica para Programação

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.

Pensando sobre o assunto


Não se aprende algoritmos copiando ou estudando outros algoritmos já feitos. Para
aprender algoritmos, é necessário construí-los e testá-los.

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.

188  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 1 • Lógica para Programação

ENTRADAS PROCESSAMENTO SAÍDA


Resultados do
Dados iniciais
Regras do processamento ou
para a resolução
problema solução para o
do problema
problema
Exemplo: Multiplicação de dois números inteiros
A = 25
RESULTADO = A*B 75
B=3
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;

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  189


Aula 1 • Lógica para Programação

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 um algoritmo, é preciso definir a
linguagem de programação a ser usada.

190  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 1 • Lógica para Programação

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.

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  191


Aula 1 • Lógica para Programação

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

































192  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 2 • Lógica para Programação

Aula 2
Formas de representação
de um algoritmo

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.

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  193


Aula 2 • Lógica para Programação

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.
Cálculo da Média de dois números inteiros positivos
média = ( a + b)/2
Início de Programa Início de Programa
Leia os valores a e b Inicio Leia a,b
Se a e b forem maior do que Se a > 0 e b > 0 então
zero Leia a Calcula o valor da média a
Calcula o valor da média a partir da
partir da Leia b média = (a + b)/2
fórmula [média = (a + b)/2] Imprime o valor da média
Imprime o valor da média a>0 e b>0 Senão
Senão Imprime “Os valores devem
Imprime “Os valores devem SIM NÃO ser positivos”
ser positivos” Fim se
Média = (a+b)/2
Fim do programa Fim do programa

Linguagem “Os valores Pseudocódigo


Narrativa média devem ser
positivos”

Fim

Fluxograma
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.

194  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 2 • Lógica para Programação

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:

1. obter as notas da primeira, segunda e terceira provas;

2. calcular a média aritmética entre as três notas;

3. se a média for maior ou igual que 7,00, o aluno foi aprovado, senão,
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

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  195


Aula 2 • Lógica para Programação

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

Seta de
Dados Exibição
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.

196  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 2 • Lógica para Programação

Símbolo utilizado como ponto para indicar o início e/ou


Inicio fim do fluxo de um programa. É importante salientar que
Terminador um programa deve possuir apenas um terminador de
INÍCIO e outro de FIM.
Utilizado para ler os dados necessários ao programa.
Usado para representar dados, independente do tipo de
Variável mídia, que sejam fornecidos manualmente, em tempo de
processamento. Permite representar a entrada de dados
Entrada Manual
via teclado, mouse, leitor de código de barras ou qual-
quer outro dispositivo de entrada.
Utilizado para representar dados tanto de entrada quanto
Dados
de saída já definidos no próprio programa, como valores
Dados de constantes.
Indica a decisão que deve ser tomada, indicando a
Condição
possibilidade de desvios para diversos outros pontos do
fluxo, dependendo do resultado de comparação de uma
SIM NÃO
condição estabelecida. Essa estrutura permite controlar o
Decisão fluxo de instruções em um fluxograma.
Utilizado para representar a utilização de algum docu-
Doc
mento específico contendo dados necessários ao
Documento algoritmo.

Dados Usado para indicar dados que estão ou deverão ser


armazenados pelo algoritmo.
Dados Armazenados

Variável ou É utilizado quando se deseja que os dados sejam


mensagem
impressos. Representa um dispositivo de saída como o
Exibição
monitor ou a impressora.

Operações Refere-se a um determinado grupo de operações não


incluídas da diagramação.
Preparação
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-
Referência de Página
tificar os pares de ligação.

Específico para indicar conexão do fluxo em outra


página.
Referência fora da Página

Permite indicar o sentido do fluxo de dados. Serve exclusi-


vamente para conectar os símbolos ou blocos existentes.
Seta de orientação de fluxo
Símbolo ou bloco que se utiliza para indicar cálculos (algo-
Processo ritmos) a efetuar, atribuições de valores ou qualquer mani-
pulação de dados que tenha um bloco específico para sua
Processamento descrição.

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  197


Aula 2 • Lógica para Programação

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.

198  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 2 • Lógica para Programação

Inicio

nota1

nota2

nota3

Fim

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, devemos sempre
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

nota1

nota2

nota3

média (nota1+nota2+nota3)/3

Fim

Figura 5. Fluxograma com o cálculo da média

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  199


Aula 2 • Lógica para Programação

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

nota1

nota2

nota3

média (nota1+nota2+nota3)/3

média >= 7,00 NÃO

SIM

“Aprovado” “Reprovado”

Fim

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

200  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 2 • Lógica para Programação

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

N>0

SIM

N%2>0
SIM

N
NÃO

NÃO

N N-1

Fim

Figura 7. Fluxograma para a impressão de números pares


positivos e menores do que um valor N

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  201


Aula 2 • Lógica para Programação

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;

202  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 2 • Lógica para Programação

• 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>

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  203


Aula 2 • Lógica para Programação

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.

204  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 2 • Lógica para Programação

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.

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  205


Aula 2 • Lógica para Programação

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.

206  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 2 • Lógica para Programação

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

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  207


Aula 2 • Lógica para Programação

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

N>0 NÃO

NÃO SIM N<0 NÃO

“Positivo” SIM

“Positivo” “Nulo”

N=0

SIM

Fim

208  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 2 • Lógica para Programação

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 curtas e 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

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  209


Aula 2 • Lógica para Programação

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




210  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 3 • Lógica para Programação

Aula 3
Tipos de dados:
variáveis e constantes

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;

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  211


Aula 3 • Lógica para Programação

• 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

212  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 3 • Lógica para Programação

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 permitem o 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.

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  213


Aula 3 • Lógica para Programação

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.

214  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 3 • Lógica para Programação

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.

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  215


Aula 3 • Lógica para Programação

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 122 z 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  

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.

216  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 3 • Lógica para Programação

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.

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  217


Aula 3 • Lógica para Programação

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];

218  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 3 • Lógica para Programação

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.

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  219


Aula 3 • Lógica para Programação

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 nesta aula, 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

220  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 3 • Lógica para Programação

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.

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  221


Aula 3 • Lógica para Programação

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


















222  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 4 • Lógica para Programação

Aula 4
Operadores e expressões

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).

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  223


Aula 4 • Lógica para Programação

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:

1. em primeiro lugar, devem ser processadas as expressões entre


parênteses;

2. em seguida, a operação de exponenciação;

3. então devem ser processadas as operações de Multiplicação e Divisão


(o que aparecer primeiro);

4. por último, devem ser processadas as operações de Adição e Subtração


(o que aparecer primeiro).

Essa hierarquia garante a correta interpretação de uma expressão


aritmética.

224  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 4 • Lógica para Programação

É 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
Inteiro Inteiro Inteiro
Real Real Real
A+B
Inteiro Real Real
Real Inteiro Real
Inteiro Inteiro Inteiro
Real Real Real
A–B
Inteiro Real Real
Real Inteiro Real
Inteiro Inteiro Inteiro
Real Real Real
A*B
Inteiro Real Real
Real Inteiro Real
Inteiro Inteiro Real
Real Real Real
A/B
Inteiro Real Real
Real Inteiro Real
Inteiro Inteiro Inteiro
A DIV B
Inteiro Inteiro Inteiro
Inteiro Inteiro Inteiro
A MOD B
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

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  225


Aula 4 • Lógica para Programação

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.

226  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 4 • Lógica para Programação

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
AeB verdadeiro verdadeiro verdadeiro
AeB verdadeiro falso falso
AeB falso verdadeiro falso
AeB 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.

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  227


Aula 4 • Lógica para Programação

É 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 ]

228  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 4 • Lógica para Programação

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

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  229


Aula 4 • Lógica para Programação

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)) ↔

230  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 4 • Lógica para Programação

(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


























UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  231


Aula 4 • Lógica para Programação

232  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 5 • Lógica para Programação

Aula 5
Arquivos

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.

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  233


Aula 5 • Lógica para Programação

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 usando a 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.

234  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 5 • Lógica para Programação

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;

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  235


Aula 5 • Lógica para Programação

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.

236  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 5 • Lógica para Programação

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-

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  237


Aula 5 • Lógica para Programação

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 perdidos.

III. Um arquivo representa uma coleção de registros e apresenta tamanho fixo.

IV. Antes de declarar uma variável do tipo Arquivo, é necessário declarar


a estrutura do registro que irá compor o arquivo.

a) Somente I e II estão corretas.


b) Somente I, II e IV estão corretas.
c) Somente IV está correta.
d) Somente I e IV estão corretas.
e) Todas estão corretas.

238  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 5 • Lógica para Programação

2. Para esta atividade, considere a seguinte estrutura de arquivo:


Código Nome Idade Cidade
1102 Gionvani Del Gado 34 São Paulo
2004 Maria das Dores 23 Curitiba
5534 João Roberto 20 Curitiba
6676 Selena da Conceição 18 Belo Horizonte

Considere ainda que a linha marcada indique o registro corrente e que


a variável alunos é usada para manipular o arquivo. Nessas condições,
indique, entre as opções apresentadas a seguir, aquela que apresenta a
alternativa incorreta.

a) Após ser executada a instrução COPIA (alunos, aux), o valor do campo


aux.Cidade é “Curitiba”.

b) A instrução REMOVE (alunos) irá remover o aluno com nome “Maria


das Dores”.

c) A instrução PROXIMO (alunos) irá deslocar o registro corrente para o


aluno “João Roberto”.

d) A instrução POSICIONE (alunos, “6676”) irá posicionar o registro


corrente no aluno “Giovani Del Gado”.

e) A seqüência de instruções PROXIMO (alunos); COPIA (alunos, aux);


aux.Idade = 27; GRAVA (alunos, aux); irá alterar a idade do aluno
“João Roberto” de 20 para 30.

3. Um arquivo de produtos tem os seguintes campos: Código do produto,


Descrição, Quantidade em Estoque, Preço de custo, Margem Custo/
Venda. Apresente a definição desse arquivo.

4. Utilizando a estrutura criada na atividade anterior, desenvolva um algo-


ritmo em pseudocódigo que permita calcular o valor total em estoque, consi-
derando o preço de custo de cada produto e sua quantidade em estoque.

Comentário das atividades


Na atividade 1, com base nos estudos que você realizou sobre a estru-
tura de Arquivo, você deve ter reconhecido a opção (d) como a opção
correta, uma vez que somente as sentenças I e IV estão corretas. Se você
analisou cada sentença, deve ter notado que a I está correta, pois um arquivo
é mantido em memória secundária (disco rígido, pen drive, etc); a II está
incorreta em conseqüência da avaliação da sentença anterior, pois uma

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  239


Aula 5 • Lógica para Programação

vez que o arquivo mantém os dados em memória secundária, mesmo com o


encerramento do programa, os dados são mentidos; a III está parcialmente
correta, pois um arquivo representa realmente uma coleção de registros,
todavia não possui tamanho fixo; e a IV está correta, pois se um arquivo é
um conjunto de registros, é preciso definir o formato desses registros antes
de declarar o arquivo.

Usando os conceitos sobre as operações usadas para a manipulação de


arquivos, discutidos nesta aula, você deveria ter concluído que a única alter-
nativa incorreta na atividade 2 é apresentada na opção (d), pois a operação
POSICIONE (alunos, “6676”) iria realizar o acesso direto ao registro contendo
o valor 6676, o que levaria a posicionar o registro corrente no aluno “Selena
da Conceição” e não no “Giovani Del Gado”; a opção (a) está correta, pois
o registro corrente possui como valor do campo Cidade o valor “Curitiba”; a
opção (b) também está correta, pois a instrução REMOVE (alunos) iria remover
o registro corrente, nesse caso o aluno “Maria das Dores”; a opção (c) está
correta, pois a instrução PROXIMO (alunos) irá forçar a movimentação do
registro corrente para o próximo registro do arquivo, em nosso caso o aluno
“João Roberto”; e a opção (e) também está correta, pois a instrução PROXIMO
(alunos) iria mover o registro corrente para o aluno “João Roberto”, a instrução
COPIA (alunos, aux) iria copiar o conteúdo do registro corrente para a variável
aux, a instrução aux.Idade = 27 altera o valor do campo Idade para a variável
aux e, por fim, a instrução GRAVA (alunos, aux) irá sobrepor as informações
do registro corrente pelo conteúdo da variável aux.

Seguindo as instruções da atividade 3 e o conteúdo discutido nesta aula,


você criou um tipo de dado Registro para representar cada registro individual
do arquivo de produtos. Em seguida, você definiu o arquivo propriamente dito,
como mostrado no trecho a seguir:
TIPO TProduto = REGISTRO
Codigo: inteiro;
Descricao: caractere;
Quantidade: inteiro;
PrecoCusto: real;
MargemVenda: real;
FIM REGISTRO;
TIPO TArqProduto = ARQUIVO DE TProduto;

240  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 5 • Lógica para Programação

A atividade 4 envolveu os seus conhecimentos em arquivos, mas também


na representação de algoritmos em pseudocódigo. Em resumo, a solução para
esse problema envolveu a leitura de todos os registros contidos no arquivo e
para cada um você deve ter totalizado o valor total de custo. A fórmula a ser
usada para o custo total de cada produto deve ter sido a multiplicação entre os
campos Quantidade e PrecoCusto. O algoritmo completo é mostrado a seguir.
ALGORITMO arquivos;
TIPO TProduto = REGISTRO
Codigo: inteiro;
Descricao: caractere;
Quantidade: inteiro;
PrecoCusto: real;
MargemVenda: real;
FIM REGISTRO;
TIPO TArqProduto = ARQUIVO DE TProduto;
VAR produtos: TArqProduto;
aux: TProduto;
total: real;
INICIO
ABRE (produtos);
total ← 0;
ENQUANTO (NÃO FIMDEARQUIVO (produtos)) FACA
COPIA (produtos,aux);
total ← total + aux.Quantidade * aux.PrecoCusto;
PROXIMO (produtos);
FIM ENQUANTO
FECHA (produtos);
IMPRIMA (“O valor total em estoque é de R$” + total);
FIM

A realização das atividades lhe proporcionou a oportunidade de verificar


o alcance dos objetivos propostos para a aula de definir uma estrutura de
arquivos e de utilizar arquivos na construção de algoritmos.

Na próxima aula
Estudaremos as principais estruturas que permitem controlar o fluxo de
instruções em um algoritmo. O domínio dessas estruturas é de grande impor-
tância para a atividade de programação.

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  241


Aula 5 • Lógica para Programação

Anotações








































242  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 6 • Lógica para Programação

Aula 6
Estruturas de controle

Objetivos
Esperamos que, ao final desta aula, você seja capaz de:

• compreender a importância de cada estrutura de controle;

• utilizar as diferentes estruturas de controle.

Pré-requisitos
Como nesta aula são utilizados exemplos de algoritmos na forma de fluxo-
grama e pseudocódigo, é necessário que você já esteja familiarizado com
essas formas de representação de algoritmos, discutidas na aula 2. Retome
seus estudos! Você deve ter percebido que, conforme dissemos na apresen-
tação desse caderno, os conceitos aqui discutidos serão utilizados tanto nessa
disciplina quanto ao longo de todo curso.

Introdução
Quando estivermos criando algoritmos, muitas vezes será necessário
controlar a ordem em que as instruções deverão ser executadas pelo compu-
tador de modo a solucionar o problema. Na maioria das vezes, dispomos
os comandos de forma seqüencial, na qual as instruções são executadas
em série, ou seja, uma após a outra. Porém são comuns casos nos quais é
necessário executar um conjunto de comandos somente mediante a acei-
tação de uma condição específica. Em outros casos, será necessário repetir
um conjunto de comandos até que outra condição seja satisfeita.

A fim de permitir que o fluxo de instruções seja controlado, devemos utilizar


as estruturas de controle. Basicamente, as estruturas de controle de dados são
de três tipos principais:

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  243


Aula 6 • Lógica para Programação

• seqüencial ou bloco – conjunto de comandos, normalmente separados


por ponto-e-vírgula, que são executados em uma seqüência linear de
cima para baixo e da esquerda para a direita;

• decisão ou seleção – a partir de um teste condicional, uma instrução ou


um conjunto de instruções podem ser executados ou não, dependendo
exatamente do resultado do teste efetuado;

• repetição – uma instrução ou o conjunto de instruções que será executado


repetidamente, de acordo com o resultado de um teste condicional.

O domínio dessas estruturas é um requisito fundamental para uma boa


programação de computadores, pois permite um melhor controle sobre a
­seqüência de execução das instruções e, na maioria das vezes, permite reduzir
sensivelmente a quantidade de instruções do algoritmo.

6.1 Estrutura seqüencial ou bloco

Na estrutura seqüencial os comandos de um algoritmo são executados em


uma seqüência pré-estabelecida. Cada comando é executado somente após o
término do comando anterior. Normalmente o caractere de ponto-e-vírgula serve
de separador entre cada instrução a fim de manter a clareza do algoritmo.

Em termos de fluxogramas, a estrutura seqüencial é caracterizada por um


único fluxo de execução (um único caminho orientado) no diagrama. Em pseu-
docódigos, a estrutura seqüencial caracteriza-se por um conjunto de comandos
dispostos ordenadamente.

6.2 Estrutura de decisão ou seleção

Durante a construção de algoritmos, são comuns situações em que uma


instrução, ou conjunto de instruções, devam ser executados somente para uma
determinada situação. Em outros casos mais complexos, dependendo de uma
condição previamente estabelecida, caso essa seja verdadeira, um conjunto de
comandos deverá ser executado e, caso seja falsa, um outro conjunto. Para esses
casos em que o fluxo de instruções deva ser controlado mediante a avaliação
de uma condição específica, é necessário o uso de uma estrutura de decisão.

Um teste condicional é baseado em lógica convencional e, portanto, deve


resultar em um valor verdadeiro ou falso. Esses testes podem ser formados
por operações relacionais simples ou expressões lógicas mais complexas que
resultem em um valor lógico (verdadeiro ou falso).

244  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 6 • Lógica para Programação

As estruturas de seleção podem ser classificadas de quatro formas diferentes,


sendo essa classificação baseada na organização lógica existente em cada
situação. Essa classificação diferencia uma estrutura de seleção como: seleção
simples, seleção composta, seleção encadeada e seleção de múltipla escolha.

Na seleção simples, uma instrução ou um conjunto de instruções é execu-


tado somente se o teste condicional especificado retornar o valor verdadeiro.
Caso o resultado do teste seja falso, nenhuma das instruções delimitadas pela
estrutura de seleção será executada, e a execução das instruções será desviada
para a instrução imediatamente seguinte à estrutura de seleção.

A seguir é mostrado um exemplo de algoritmo que utiliza a estrutura de


seleção simples. O algoritmo é apresentado na forma de um fluxograma e na
forma de pseudocódigo. Nesse exemplo, é lida uma variável N e, em seguida,
é utilizada a estrutura de seleção para verificar se o valor de N é maior do
que zero. Caso esse teste condicional retorne verdadeiro, o fluxo é desviado
para a instrução que imprime o valor da variável N. No caso de ser retornado
um valor falso, o fluxo é desviado para a próxima instrução. Nesse caso, a
instrução que finaliza o programa.
ALGORITMO Selecao_Simples;
Inicio
VAR N: Inteiro;
INICIO
N LEIA N;
SE N>0 ENTAO
IMPRIMA N;
N>0
FIM SE
FIM
SIM

NÃO
N

Fim

Diferente da estrutura de seleção simples, na seleção composta uma


instrução ou um conjunto de instruções é executado se o teste condicional
especificado retornar o valor verdadeiro e, caso o resultado do teste seja falso,
outra instrução ou um conjunto de instruções é executado. Assim a seleção
composta permite desviar o fluxo para dois caminhos distintos.

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  245


Aula 6 • Lógica para Programação

A seguir é mostrado um exemplo de algoritmo que utiliza a estrutura de


seleção composta. Nesse exemplo, é lida uma variável N e, em seguida, é
utilizada a estrutura de seleção para verificar se o valor de N é maior do que
zero. Caso esse teste condicional retorne verdadeiro, o fluxo é desviado para
a instrução que imprime o valor da variável N. No caso de ser retornado um
valor falso, a mensagem “O valor de N deve ser positivo” é mostrada.

ALGORITMO Selecao_Composta;
Inicio
VAR N: Inteiro;
INICIO
N LEIA N;
SE N>0 ENTAO
4IMPRIMA N;
N>0
SENAO
SIM NÃO IMPRIMA “O valor de N deve
ser positivo”;
“O valor FIM SE
N de N deve FIM
ser positivo”

Fim

Uma instrução de seleção pode ser inserida dentro da outra, formando


uma estrutura de seleção encadeada, seja no bloco de instruções para o caso
verdadeiro ou falso.

O encadeamento dessas instruções é também conhecido como aninha-


mento de instruções de seleção, não existindo limite de quantas estruturas de
seleção podem estar dentro de outra. Na verdade, esse limite é imposto pela
própria solução lógica representada no algoritmo.

O aninhamento de instruções permite tornar uma solução algorítmica ainda mais


eficiente, uma vez que diminui a quantidade de testes condicionais individuais.

A seguir é mostrado um exemplo de algoritmo que utiliza a estrutura de seleção


encadeada. Nesse exemplo, é lida uma variável N e, em seguida, é utilizada a
estrutura de seleção para verificar se o valor de N é maior do que zero. Caso esse
teste condicional retorne verdadeiro, o fluxo é desviado para uma outra estrutura
condicional que testa se o valor é par – para isso utiliza a abordagem comum de

246  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 6 • Lógica para Programação

testar se o resto da divisão por dois é igual a zero – e, caso seja verdadeiro, o
fluxo é desviado para a instrução que imprime a mensagem “Este valor é par” e,
no caso de ser retornado um valor falso, é apresentada a mensagem “Este valor
é impar”. No caso de ser retornado um valor falso no primeiro teste condicional
(mais externo), a mensagem “O valor de N deve ser positivo” é mostrada.

ALGORITMO Selecao_Encadeada;
Inicio
VAR N: Inteiro;
INICIO
LEIA N;
N
SE N>0 ENTAO
SE N MOD 2 = 0 ENTAO
IMPRIMA “Este valor é par”;
N>0
SIM SENAO
IMPRIMA “Este valor é ímpar”
FIM SE
N MOD 2=0 SENAO
IMPRIMA “O valor de N deve ser
NÃO SIM
positivo”;
NÃO
FIM SE
“Este valor “Este valor FIM
é ímpar” é par”

“O valor
de N deve
ser positivo”

Fim

Outra estrutura de seleção, muito utilizada nas avaliações de valores para


uma variável ou valor individual, é a seleção de múltipla escolha. Diferente das
estruturas discutidas anteriormente, nessa o teste condicional não retorna um
valor lógico, mas sim um valor inteiro, real ou caractere. Outra diferença está
no fato de que essa estrutura permite desviar o fluxo para n caminhos e não
somente para dois, como discutido até aqui.

Na prática, para a expressão definida no teste condicional, é verifi-


cada a sua igualdade com as opções definidas, em que sua veracidade
resultará na execução de um bloco, ou de uma única instrução específica,
para cada opção.

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  247


Aula 6 • Lógica para Programação

Inicio

OPÇÃO

OPÇÃO
NÃO

1 2 3

“Você “Você “Você


“Opção
escolheu a escolheu a escolheu a
inválida”
opção 1” opção 2” opção 3”

Fim

ALGORITMO Selecao_Multipla;
VAR OPCAO: Inteiro;
INICIO
LEIA OPCAO;
ESCOLHA (OPCAO)
CASO 1: IMPRIMA “Você escolheu a opção 1”;
CASO 2: IMPRIMA “Você escolheu a opção 2”;
CASO 3: IMPRIMA “Você escolheu a opção 3”;
CASOCONTRARIO: IMPRIMA “Opção inválida”;
FIM ESCOLHA
FIM

6.3 Estrutura de repetição


Existem situações em um algoritmo nas quais necessitaremos de que uma
seqüência de comandos seja executada nenhuma, uma ou várias vezes de
acordo com uma condição, ou de acordo com uma variável de controle.
Por exemplo, se tivermos de criar um algoritmo para trocar os quatro pneus
de um carro, é óbvio que os passos necessários para trocar um único pneu
deverá se repetir a cada pneu. Uma forma de resolver isso seria repetir o
mesmo conjunto de instruções para a troca de um pneu quatro vezes ao longo
do algoritmo. Isso tornaria o algoritmo grande, mas seria factível uma vez que
sabemos que são exatamente quatro pneus.

248  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 6 • Lógica para Programação

Agora imaginemos que esse algoritmo deva ser usado para qualquer
veículo com qualquer que seja a quantidade de pneus. Nessa nova situação,
fica impossível utilizar apenas a repetição do bloco de instruções, principal-
mente por não sabermos exatamente quantas vezes deveremos repetir. Em
casos como esses - e são bem comuns – temos de lançar mão de uma estrutura
de repetição que permita repetir um bloco de instruções de forma controlada.
As estruturas de repetição se diferenciam principalmente pelo modo como
a expressão condicional é avaliada. Basicamente, temos três tipos de estruturas
de repetição que são comumente conhecidas, como: ENQUANTO, PARA...
FAÇA e REPITA... ATÉ.

6.3.1 Estrutura de repetição do tipo ENQUANTO

Nesse tipo de repetição, o teste condicional é realizado já no início do


bloco de instruções. Com isso é possível que o conjunto de instruções referentes
à estrutura seja repetido nenhuma, uma ou vária vezes enquanto o teste condi-
cional retornar verdadeiro.

A seguir é mostrado um exemplo de algoritmo para listar todos os números


pares entre 1 e 10. Esse algoritmo é naturalmente repetitivo, visto que para
cada número do intervalo é executado o mesmo conjunto de instruções que
testa se o valor é par e, em caso verdadeiro, imprime-o e incrementa seu valor
em uma unidade.
ALGORITMO testeENQUANTO;
Inicio
VAR N: inteiro;
INICIO
N ←1 N ← 1;
ENQUANTO (N<=10) FAÇA
SE (N MOD 2 = 0) ENTAO
IMPRIMA N;
FIM SE
N <= 10 N ← N + 1;
SIM FIM ENQUANTO
FIM
N MOD 2 = 0
SIM

NÃO N
NÃO

N←N+1
Fim

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  249


Aula 6 • Lógica para Programação

Inicio

N ←1

N <= 10

SIM

N MOD 2 = 0
SIM

NÃO
NÃO

N←N+1

Fim

A partir da análise desse exemplo, fica claro que, enquanto o teste condi-
cional N<=10 retornar verdadeiro, o mesmo conjunto de instruções será execu-
tado. Somente quando o teste condicional retornar falso é que o fluxo será
desviado para a instrução imediatamente após o bloco de repetição.

6.3.2 Estrutura de repetição do tipo PARA...FAÇA

Em uma repetição desse tipo, o conjunto de instruções referentes à estru-


tura é executado “N” vezes. Para isso o valor de N deve ser previamente
conhecido. Usamos esse tipo de repetição sempre que conhecemos a quanti-

250  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 6 • Lógica para Programação

dade de vezes que devemos repetir o conjunto de instruções. As repetições são


controladas por uma variável de controle.

A seguir é mostrado o mesmo exemplo de algoritmo para listar todos os


números pares entre 1 e 10, agora usando uma estrutura de repetição do tipo
PARA...FAÇA.
ALGORITMO testePARA_FACA;
Inicio
VAR N: inteiro;
INICIO
PARA N ← 1 ATÉ 10 FAÇA
N ←1 SE (N MOD 2 = 0) ENTAO
IMPRIMA N;
FIM SE
N ← N + 1;
FIM PARA
FIM

N <= 10

SIM

N MOD 2 = 0
SIM

NÃO
NÃO

N←N+1

Fim

6.3.3 Estrutura de repetição do tipo REPITA... ATÉ

Nesse tipo de repetição, o conjunto de instruções referentes à estrutura


é executado e somente depois o teste condicional é realizado. Com isso o

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  251


Aula 6 • Lógica para Programação

conjunto de instruções referentes à estrutura é repetido pelo menos uma vez,


até que o teste condicional retorne verdadeiro. Fica claro então que este tipo
de estrutura só deve ser usado em casos nos quais podemos garantir que o
conjunto de comando deverá ser executado pelo menos uma vez.
A seguir é mostrado, mais uma vez, o mesmo exemplo de algoritmo para
listar todos os números pares entre 1 e 10, agora usando uma estrutura de
repetição do tipo REPITA...ATÉ.
ALGORITMO testeREPITA_ATE;
Inicio
VAR N: inteiro;
INICIO
N ← 1;
N ←1
REPITA
SE (N MOD 2 = 0) ENTAO
IMPRIMA N;
FIM SE
N ← N + 1;
ATÉ (N > 10)
N MOD 2 = 0 FIM
SIM

N
NÃO
NÃO

N←N+1

N <= 10

SIM

Fim

Síntese da aula
Nesta aula, foram discutidas as principais estruturas de controle usadas na
construção de algoritmos. Vimos que grande parte das instruções em um algo-
ritmo são dispostas em uma estrutura chamada seqüencial ou bloco. Entretanto
existem casos em que o fluxo de instruções não deve ser executado linearmente,

252  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 6 • Lógica para Programação

sendo necessário desviá-lo mediante determinadas circunstâncias do próprio


algoritmo. Para esses casos, estudamos as estruturas de seleção ou decisão, que
permitem desviar o fluxo de instruções em um algoritmo a partir do resultado de
um teste condicional. Estudamos ainda as estruturas de repetição, que permitem
que uma ou um conjunto de instruções seja executado repetidas vezes sem a
necessidade de escrevê-las várias vezes.

Atividades
1. Sobre as estruturas de controle estudadas nesta aula, é incorreto afirmar que:
a) uma estrutura seqüencial ou bloco apresenta instruções que são execu-
tadas uma após a outra, seqüencialmente;
b) uma estrutura de seleção permite desviar o fluxo de instruções de
acordo com a avaliação de um teste condicional;
c) antes de utilizar uma estrutura de repetição do tipo PARA..FACA precisamos
conhecer o número exato de repetições que deverão ser realizadas;
d) um teste condicional deve ser uma expressão aritmética;
e) na estrutura de seleção múltipla, o teste condicional não é uma
expressão lógica.
2. Considerando o algoritmo a seguir, indique a alternativa que apresenta
o resultado da execução desse algoritmo, no caso de ser lido o valor “9”
como valor para a variável N.
ALGORITMO A1;
VAR N: inteiro;
INICIO
LEIA (N);
ENQUANTO (N > 0) FAÇA
SE (N MOD 2 <> 0) ENTAO
IMPRIMA N;
FIM SE
N ← N - 1;
FIM ENQUANTO
FIM
a) 9, 8, 7, 6, 5, 4, 3, 2, 1
b) 8, 6, 4, 2
c) 9, 7, 5, 3, 1
d) 9, 7, 5, 3, 1, 0
e) 8, 6, 4, 2, 0

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  253


Aula 6 • Lógica para Programação

3. Escreva um algoritmo que imprima todos os números entre 50 e 500 que,


dividido por 11, dão resto igual a 5.

4. Utilizando as estruturas estudadas nesta aula, construa um algoritmo que a


série de Fibonacci até o n-ésimo termo. O valor de N deve ser lido. A série de
Fibonacci é um problema clássico que impõe a seguinte seqüência de valores:
1, 1, 2, 3, 5, 8, 13, 21, 34... etc. A seqüência sempre tem início em 1, 1.

Comentário das atividades


Na atividade 1, de acordo com o que você estudou nesta aula sobre
Estruturas de Controle, deve ter concluído que a única opção incorreta é a opção
(d), pois um teste condicional deve sempre ser lógico, retornando um dos valores
verdadeiro ou falso. A opção (a) está correta, pois uma estrutura seqüencial ou
bloco realmente dispõe as instruções em ordem seqüencial; a opção (b) também
está correta, pois a estrutura de seleção serve exatamente para desvio do fluxo
de instruções e a decisão de desviar ou não é baseada na avaliação de um teste
condicional; a opção (c) é correta, como você estudou nesta aula, que, diferente
das estruturas de repetição do tipo ENQUANTO e REPITA, na estrutura PARA..
FACA é necessário indicar o número de vezes que o bloco de instruções deverá
ser repetido; e a opção (e) está também correta, pois na estrutura de seleção é
testado um valor constante, do tipo inteiro, real ou caractere.

Com base nos conceitos discutidos nesta aula, você acompanhou o


fluxo de instruções do algoritmo a fim de simular a sua execução para o
valor de N=9, na atividade 2. Os pontos críticos desse algoritmo estão nos
testes condicionais que são usados nas estruturas de controle. A instrução
ENQUANTO (N > 0) FACA implica na repetição do seu bloco de instruções
até que o valor da variável N seja menor ou igual a zero. Em seguida, já no
bloco de repetição, a estrutura de seleção SE (N MOD 2 <> 0) ENTAO implica
em verificar se o resto da divisão do valor de N por dois é diferente de zero.
Essa construção representa um modo clássico de testar se um determinado
valor é ímpar. Já a partir dessas conclusões, você deveria concluir que esse
algoritmo imprime os valores ímpares maiores do que zero e menores do que
N, se houver. Com isso a única opção correta é a opção (c).

Para esse algoritmo, na atividade 3, você deve ter escolhido como estrutura
de repetição a estrutura do tipo PARA..FACA, afinal foi declarado o intervalo
de números a serem testados e, por conseqüência, o número de repetições. A
seguir é mostrada uma solução algorítmica para esse problema.

254  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 6 • Lógica para Programação

ALGORITMO A3;
VAR
N: inteiro;
INICIO
PARA N ← 50 ATE 500 FACA
SE ( N MOD 11 = 5) ENTAO
IMPRIMA (N):
FIM SE
FIM PARA
FIM

Para solucionar a atividade 4, como discutido na aula sobre algoritmos,


existem diferentes formas de se construir um mesmo algoritmo. Após analisar o
problema, você deve ter percebido que a lógica dessa solução deve partir da
série inicial 1, 1 e, a partir daí, o próximo elemento é dado sempre pela soma
dos dois valores anteriores. A seguir são apresentadas duas formas de solucionar
o problema da seqüência de Fibonacci. A primeira utiliza a estrutura de repetição
do tipo PARA...FACA, e a segunda utiliza a estrutura ENQUANTO... FACA.

Solução 01:

ALGORITMO FIBONACCI;
VAR N, I: inteiro;
anterior: inteiro;
atual: inteiro;
próximo: inteiro;
INICIO
LEIA (N);
anterior ← 1;
atual ← 1;
IMPRIMA (anterior);
IMPRIMA (atual);
PARA I ← 3 ATE N FACA
proximo ← anterior + atual;
IMPRIMA (proximo);
anterior ← atual;
atual ← proximo;
FIM PARA
FIM

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  255


Aula 6 • Lógica para Programação

Solução 02:
ALGORITMO FIBONACCI;
VAR anterior: inteiro;
atual: inteiro;
proximo: inteiro;
N: inteiro;
INICIO
LEIA (N);
atual ← 1;
anterior ← 1;
IMPRIMA (anterior);
ENQUANTO atual <= N FACA
IMPRIMA (atual);
proximo ← anterior + atual;
anterior ← atual;
atual ← próximo;
FIM ENQUANTO
FIM

As atividades lhe deram a oportunidade de compreender a importância de


cada estrutura de controle e de utilizar as diferentes estruturas de controle.

Na próxima aula
Estudaremos a Técnica de Modularização, que permite dividir um problema
complexo em problemas menores e, com isso, diminuir o tempo de criação do
algoritmo e otimizar a sua solução. Nessa aula, será apresentado o conceito de
função e procedimento e como essas instruções especiais devem ser utilizadas.

Anotações









256  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 7 • Lógica para Programação

Aula 7
Modularização

Objetivos
Esperamos que, ao final desta aula, você seja capaz de:

• entender os principais conceitos relacionados ao uso de funções e


procedimentos;

• criar de forma correta funções em seus algoritmos, utilizando-as;

• criar de forma correta procedimentos em seus algoritmos, utilizando-os.

Pré-requisitos
Nesta aula, é fundamental que você já domine a criação de algoritmos
e como representá-los na forma de pseudocódigo, pois nesta aula são apre-
sentados e comentados exemplos nessa forma. Além disso, é necessário que
você tenha apreendido o conceito de variáveis. Portanto retome o conteúdo já
estudado nas aulas anteriores se ainda houver dúvidas!

Introdução
Até aqui temos discutido a construção de algoritmos como uma solução
linear que aborda um problema na sua forma geral e define um conjunto
de instruções a serem executadas para alcançar uma solução. Todavia, até
o momento, não consideramos a complexidade do problema ou o tamanho
(quantidade de instruções) que um algoritmo pode ter.

Nos vários exemplos mostrados nesse caderno, abordamos, por motivos


didáticos, algoritmos e problemas simples. Porém, na vida prática, encon-
tramos problemas de complexidade muito mais elevada e que exigem soluções
algorítmicas mais robustas e, conseqüentemente, maiores.

No cotidiano de um programador, é comum a construção de algoritmos


que envolvam centenas ou milhares de instruções. Fica óbvio, para esses casos,

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  257


Aula 7 • Lógica para Programação

que a representação de um algoritmo nessa escala usando fluxograma fica


inviável e, mesmo usando pseudocódigo, teremos dificuldade em gerenciar um
conjunto tão grande de instruções.

Uma solução para problemas complexos é a sua divisão sucessiva em


problemas menores a fim de obter uma solução de custo mínimo. Essa idéia
conhecida como “Dividir para Conquistar” é o princípio básico da técnica de
análise estruturada, chamada de Modularização. Nessa técnica, o problema
maior é dividido em problemas menores, chamados de módulos.

O segredo de uma boa modularização está em identificarmos claramente


que módulos devem existir no sistema. Devemos atribuir uma única função bem
definida a cada módulo, minimizar as ligações entre os módulos e maximizar
a coesão interna de cada módulo.

Essa técnica apresenta inúmeras vantagens para a programação. Vejamos.

1. Facilita a verificação de erros: pois é, em princípio, simples identificar


o módulo responsável pelo erro, reduzindo-se assim o tempo gasto na
identificação de erros.

2. Permite testar os módulos individualmente, em vez de se testar apenas


o programa completo, o que reduz a complexidade do teste e permite
começar a testar antes de se ter completado o programa.

3. Permite fazer a manutenção do programa (correção de erros, melhora-


mentos etc.) módulo a módulo e não no programa todo, o que reduz a
probabilidade de essa manutenção ter conseqüências imprevistas em
outras partes do programa.

4. Permite o desenvolvimento independente dos módulos, o que simplifica


o trabalho em equipe, pois cada elemento ou cada sub-equipe tem a
seu encargo apenas alguns módulos do programa.

5. Permite a reutilização do código desenvolvido, ou seja, que módulos


individuais sejam utilizados para formar outro programa.

Um programador assume, ao longo do desenvolvimento de um programa,


dois papéis distintos: por um lado é fabricante, pois é sua responsabilidade desen-
volver módulos; por outro é utilizador, pois fará com certeza uso de outros módulos,
desenvolvidos por outros programadores ou por ele próprio no passado.

A modularização em um algoritmo é expressa por meio das unidades


atômicas: funções e procedimentos. Uma função representa um conjunto de

258  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 7 • Lógica para Programação

instruções, com interface bem definida, que efetua um dado cálculo e, na


maioria dos casos, devolve um valor. Já um procedimento também representa
um conjunto de instruções, com interface bem definida, que faz qualquer coisa,
porém sem devolver valor algum. Algumas linguagens de programação, como
a linguagem C ou Java, não fazem distinção entre procedimento e função e
trata todo o processo de modularização somente com o uso de funções.

7.1 Funções e procedimentos


As funções e os procedimentos permitem isolar trechos de código
com objetivos bem definidos e torná-los reutilizáveis onde quer que seja
necessário. Uma vez definida, uma função ou um procedimento podem ser
utilizados sem que seja necessário conhecer o seu funcionamento interno.
Funções e procedimentos podem ser vistos como caixas pretas: uma vez
definidas (e corretas), devem ser usadas sem preocupações quanto ao seu
funcionamento interno.

Na prática, o uso de funções e procedimentos permite estender as funcio-


nalidades de uma linguagem. Por exemplo, podemos definir uma função que
receba um valor inteiro e retorne um literal contendo esse valor com um número
específico de zeros à esquerda. A partir de sua definição, poderíamos fazer
uso dessa função sempre que necessário, sem ter de repetir o seu código.

A seguir é mostrado um algoritmo, representado em pseudocódigo, que


demonstra o uso de funções e procedimentos.

ALGORITMO Funcao_Procedimento;
CONST MAX = 99;
VAR Valor1, Valor2: Inteiro;

FUNCAO MAIOR (A, B: Inteiro)


SE (A>B) ENTAO
RETORNA (VERDADEIRO);
SENAO
RETORNA (FALSO);
FIM SE
FIM FUNCAO

PROCEDIMENTO VERIFICA (VALOR: inteiro)


SE (VALOR > MAX) ENTAO
IMPRIMA “O valor excede o valor limite.”
FIM SE
FIM PROCEDIMENTO

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  259


Aula 7 • Lógica para Programação

INICIO
LEIA Valor1;
LEIA Valor2;
SE MAIOR(Valor1, Valor2) ENTAO
IMPRIMA (Valor1 + “ é maior do que “ + Valor2);
VERIFICA (Valor1);
SENAO
IMPRIMA (Valor2 + “ é maior do que “ + Valor1);
VERIFICA (Valor2);
FIM SE
FIM

Nesse exemplo, temos a declaração da função MAIOR que verifica qual


o maior valor entre dois valores inteiros passados como parâmetro da função.
É declarado ainda o PROCEDIMENTO VERIFICA, que testa se um valor inteiro
passado como parâmetro é inferior a um valor máximo definido pela cons-
tante MAX.

Esse exemplo será usado para explicar os itens que seguem.

7.2 Parâmetros
Parâmetros são as variáveis listadas entre parênteses no cabeçalho da
definição de uma função ou procedimento. São variáveis locais, sendo visí-
veis apenas dentro da função ou rotina, embora com uma particularidade:
são automaticamente inicializadas com o valor dos argumentos respectivos em
cada chamada da função ou procedimento.

As variáveis locais (parâmetros de funções incluídos) existem em memória


apenas enquanto o bloco de instruções em que estão inseridas estiver sendo
executado, sendo assim “criadas” e “destruídas” muitas vezes ao longo de um
programa – a cada nova invocação da função ou procedimento, por exemplo.

No exemplo mostrado anteriormente, temos as variáveis A e B, do tipo


inteiro, como parâmetros da função MAIOR (A,B: inteiro). Essas variáveis são
locais a essa função e, por isso, só podem ser referenciadas dentro dela. Ao
término da função, essas variáveis são removidas da memória.

7.3 Argumentos
Argumentos são as expressões listadas entre parênteses em uma invocação
ou chamada de uma função ou procedimento. O seu valor é utilizado para
inicializar os parâmetros da função ou procedimento invocado.

260  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 7 • Lógica para Programação

Na invocação da função MAIOR, mostrada no exemplo discutido anterior-


mente, e descrita pela instrução MAIOR(Valor1, Valor2), as variáveis Valor1 e
Valor2 representam argumentos que são passados para a função. Na prática,
os valores dessas variáveis são usados para inicializar os parâmetros A e B da
função, respectivamente.

Cabe ressaltar que um argumento de uma função não necessita ser uma
variável, podendo ser passado um valor constante. Por exemplo, podemos
invocar a função maior usando instruções como: MAIOR (5, 7), MAIOR (Valor1,
89) ou MAIOR (5, Valor2).

7.4 Retorno e devolução de dados


A maioria das linguagens de programação utiliza a palavra em inglês
RETURN que, em sua língua de origem, apresenta dois significados distintos:
retornar (ou regressar) e devolver. Já no português, utilizamos duas palavras
distintas: dizemos que uma função (ou procedimento) retorna quando termina
a sua execução e o fluxo de execução regressa ao ponto de invocação, e que
uma função, ao retornar, devolve um valor que pode ser usado na expressão
em que a função foi invocada. Todavia, na representação algorítmica em
pseudocódigo, usamos a palavra em português RETORNA para representar a
instrução de retorno ou devolução de valor.

Uma função termina quando o fluxo de execução atinge uma instrução


de retorno. As instruções de retorno consistem na palavra chave RETORNA
seguida de uma expressão de retorno ou de uma expressão vazia que indicará
apenas o retorno, sem devolução. A expressão tem de ser de um tipo de dados
compatível com o tipo de devolução da função. O resultado da expressão é o
valor devolvido ou calculado pela função.

7.5 Variáveis globais e locais


Uma observação cuidadosa dos exemplos anteriores revela que afinal o
programa principal não passa de uma função. Mas é uma função especial que
é automaticamente invocada já no início da execução do programa.

Assim sendo, verifica-se também que até agora só se definiram variáveis


dentro de funções. Às variáveis que se definem no corpo de funções ou proce-
dimentos, chamamos variáveis locais. Às variáveis que se definem fora de qual-
quer função ou procedimento, chamamos variáveis globais. Os mesmos nomes
se aplicam no caso das constantes: há constantes locais e constantes globais.

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  261


Aula 7 • Lógica para Programação

Devemos lembrar que os parâmetros de uma função ou procedimento são


variáveis locais como quaisquer outras, exceto quanto à sua forma de iniciali-
zação: os parâmetros são inicializados implicitamente com o valor dos argu-
mentos respectivos em cada invocação da função ou procedimento.

Síntese da aula
Nesta aula, estudamos o conceito de Modularização. Esse conceito é de
fundamental importância no desenvolvimento de programas de grande escala.
Foram apresentados e discutidos ainda os principais conceitos relacionados
ao uso de funções e procedimentos.

Atividades
1. Sobre o uso da técnica de modularização, com o uso de funções e proce-
dimentos, em um algoritmo, é incorreto afirmar que:

a) facilita a verificação de erros;

b) dificulta os testes do programa, uma vez que cada módulo foi progra-
mado por uma equipe diferente;

c) permite fazer a manutenção do programa (correção de erros, melho-


ramentos, etc.) módulo a módulo e não no programa todo;

d) permite o desenvolvimento independente dos módulos;

e) permite a reutilização do código desenvolvido.

2. A partir da análise do algoritmo mostrado a seguir, é incorreto afirmar que:


ALGORITMO A2;
VAR numero: inteiro;

FUNCAO E_PAR (X: inteiro)


SE (X MOD 2 = 0) ENTAO
RETORNE verdadeiro;
SENAO
RETORNE falso;
FIM SE
FIM FUNCAO

INICIO
LEIA (numero);
SE E_PAR(numero) ENTAO

262  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


Aula 7 • Lógica para Programação

IMPRIMA (“O valor é par.”);


SENAO
IMPRIMA (“O valor é ímpar.”);
FIM SE
FIM

a) a função E_PAR não possui parâmetros;

b) a variável número é uma variável global;

c) a variável X é local à função E_PAR;

d) a função E_PAR possui um argumento inteiro;

e) a invocação de função E_PAR (numero) irá devolver um valor lógico e por


isso é diretamente usado como teste condicional para a instrução Se.

3. Com base no que foi estudado nesta aula, diferencie um argumento de um


parâmetro.

4. Escreva um programa que determine o quadrado de um número inteiro


n. O número n deve ser pedido ao utilizador por meio de uma função
chamada LERINTEIRO; e o seu quadrado deverá ser calculado por meio
de outra função, chamada QUADRADO.

Comentário das atividades


Lançamos um desafio para você: qual a resposta correta para a atividade 1?
Socialize com seus colegas e verifique na web-tutoria!
Na atividade 2, de acordo com os conceitos estudados nesta aula, você
deve ter concluído que a opção incorreta é a opção (a), pois a função E_PAR
possui um parâmetro inteiro declarado, sob a forma da variável X. A opção
(b) está correta, uma vez que a variável número é declarada no programa
principal – o que lhe dá um caráter global; a opção (c) também está correta,
pois a variável X é declarada dentro da função, como um parâmetro, e só
existe durante a execução da função; a opção (d) está correta, dado que a
função E_PAR possui a variável X declarada como parâmetro, o que define a
necessidade de ser passado um argumento inteiro na sua invocação – como é
feito na instrução E_PAR (número); e, por fim, a opção (e) também está correta,
pois a função E_PAR devolve sempre um valor verdadeiro ou falso.
Relembrando os conceitos estudados nesta aula, você deve saber que um
argumento é uma variável que é declarada entre os parênteses de uma decla-
ração de função ou procedimento, e indica a quantidade e o tipo de dado dos

UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO  263


Aula 7 • Lógica para Programação

argumentos a serem passados para essa função. Um argumento, por sua vez,
é qualquer expressão passada entre os parênteses da invocação (chamada)
de uma função ou procedimento. Esse conhecimento é imprescindível para a
realização da atividade 3.

Para a construção do algoritmo solicitado na atividade 4, você deve ter


considerado a criação da função QUADRADO como uma função que deve
receber um valor inteiro como parâmetro e retornar outro valor inteiro repre-
sentando o quadrado desse valor. Para o cálculo do quadrado de um número,
basta multiplicá-lo por ele mesmo. Já a função LERINTEIRO não deveria ter
parâmetros, uma vez que ela não precisa de dados de entrada para o seu
processamento. Aliás, o seu processamento é muito simples. Nessa função,
devemos ter apenas a leitura de um valor inteiro e o seu retorno imediato. A
seguir é apresentada uma solução algorítmica para o problema.

ALGORITMO A4;
VAR numero: inteiro;

FUNCAO QUADRADO (X: inteiro)


RETORNE (X*X);
FIM FUNCAO

FUNCAO LERINTEIRO
VAR N: inteiro;
LEIA (N);
RETORNE (N);
FIM FUNCAO
INICIO
numero ← LERINTEIRO;
IMPRIMA (“O quadrado do numero “ + numero + “ é “ +
QUADRADO(numero));
FIM

Se realizou as atividades com sucesso, você está apto a entender os princi-


pais conceitos relacionados ao uso de funções e procedimentos; criar de forma
correta funções em seus algoritmos, utilizando-as, e criar de forma correta
procedimentos em seus algoritmos, utilizando-os.

Anotações


264  1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS


EQUIPE UNITINS

Organização de Conteúdos Acadêmicos


Luiz Cezar Sakr

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
Créditos

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
Você está recebendo o material da disciplina de Matemática para
Com­putação. Esperamos que, no término do semestre, seja capaz de apresentar
os fundamentos da Matemática para a Computação como ferramenta para
o desenvolvimento de áreas específicas da computação, reconhecer a Lógica
Matemática como instrumento de validação de uma proposição e estudar as
Estruturas Matemáticas relacionadas à Álgebra de Boole e suas funções.

Para tanto, apresentaremos os conteúdos divididos em sete aulas. Na


primeira, veremos a Teoria dos Conjuntos; na segunda, a Análise e Simbolização
de Proposições; e, na terceira, você conhecerá a Tabela-verdade.

A continuidade dos estudos se dará por meio das Relações de Implicação


e Equivalência, o que será visto na quarta aula; na quinta, analisaremos

Apresentação
Predicados e teremos uma introdução à Álgebra de Boole. A sexta aula será
uma continuidade da quinta aula, pois trataremos das Funções Booleanas.

Para terminarmos os estudos referentes a esta disciplina, analisaremos as


Simplificações de Funções e Mapas de Karnaugh.

Esperamos que, por meio dos conteúdos aqui apresentados, você compre-
enda melhor esta disciplina e dê continuidade aos seus estudos.

Desejamos bons estudos!

Prof. Luiz Cezar Sakr


EMENTA
Teoria dos Conjuntos (Diagramas de Euler-Venn). Análise e Simbolização
de Sentenças de Linguagem Cotidiana. Tabela-verdade. Lógica de Predicados
de Primeira Ordem. Álgebra Booleana. Simplificação de Funções e Mapas
de Karnaugh.

OBJETIVOS
Plano de Ensino

• Apresentar os fundamentos da Matemática para a Computação


como ferramenta para o desenvolvimento de áreas específicas da
computação.

• Reconhecer a Lógica Matemática como instrumento de validação de


uma proposição.

• Estudar as Estruturas Matemáticas relacionadas à Álgebra de Boole


e suas funções.

CONTEÚDO PROGRAMÁTICO
• Representação e notação de conjunto

• Operação entre conjuntos

• Estudo dos Diagramas de Euler-Venn

• Estudos das proposições

• Princípios fundamentais da Lógica

• Tabela-verdade

• Relações de Dependência e Independência

• Relações de Equivalência
• Predicados

• Sistemas algébricos

• Álgebra de Boole

• Funções Booleanas

• Forma canônica

• Métodos de Simplificação de Funções

• Método Algébrico

• Método do Mapa de Karnaugh

BIBLIOGRAFIA BÁSICA
DAGHLIAN, Jacob. Lógica e Álgebra de Boole. 4. ed. São Paulo: Atlas, 1995.
Gersting, Judith L. Fundamentos Matemáticos para Ciência da Computação.
São Paulo: LTC, 1995.
RANGEL, Kléber Albanêz; BENZECRY, Vera Syme Jacob. Como desenvolver
o raciocínio lógico: soluções criativas na teoria dos conjuntos. 2. ed. Rio de
Janeiro: Universidade Estácio de Sá, 2005.

BIBLIOGRAFIA COMPLEMENTAR
ALENCAR FILHO, Edgar. Iniciação à Lógica Matemática. São Paulo: Nobel,
2003.
SOUZA, J. N. Lógica para Ciência da Computação: fundamentos de linguagem,
semântica e sistemas de duração. Rio de Janeiro: Campus, 2002.

UNITINS • Análise e Desenvolvimento de Sistemas • 1º PERÍODO  269


Aula 1 • Matemática para Computação

Aula 1
Teoria dos Conjuntos

Objetivos
Esperamos que, ao final desta aula, você seja capaz de:

• realizar operações que envolvam conjuntos;

• representar operações por meio de Diagramas de Euler-Venn.

Pré-requisitos
Os conteúdos sobre a Teoria dos Conjuntos, já estudados nos Ensinos
Fundamental e Médio, são suficientes para que você consiga acompanhar a
aula e alcançar seus objetivos. Caso não se recorde dos mesmos, sugerimos
sua recapitulação.

Introdução
A Teoria dos Conjuntos é fundamentada em entes ou conceitos primitivos
tais como conjunto, elemento, pertinência. Por entes ou conceitos primitivos
entendemos aqueles que aceitamos sem definição e que, por sua vez, servem
de base para a definição de outros entes. Por exemplo, ao tentarmos escla-
recer o que é um conjunto, poderemos dizer que se trata de uma coleção,
o que na verdade é um sinônimo de conjunto e não uma definição propria-
mente dita.

O mesmo ocorre com elemento e com a noção de pertinência. Elementos


são os componentes de um conjunto e é intuitivo que determinado elemento
possa pertencer ou não pertencer a um conjunto.

Nesta aula, veremos que os conjuntos podem ser subdivididos; que união,
interseção e diferença são operações entre conjuntos e que os Diagramas de
Euler-Venn são utilizados para a representação de operações entre conjuntos.

UNITINS • Análise e Desenvolvimento de Sistemas • 1º PERÍODO  271


Aula 1 • Matemática para Computação

1.1 Representação e notação de conjunto


Os conjuntos são geralmente denotados por letras maiúsculas do alfabeto
latino e podem ter seus elementos totalmente explicitados, parcialmente expli-
citados (desde que esta apresentação parcial não comprometa seu entendi-
mento), ou apresentados por meio de conceitos, características ou sentenças
matemáticas que esclarecem como os elementos poderão ser obtidos.
Exemplos:
A = {2, 4, 6, 8, 10, 12, 14, 16, 18, 20}
A = {2, 4, 6, ..., 20}
A = {números inteiros pares, de 2 inclusive a 20 inclusive}
A = {números inteiros pares, positivos e menores ou igual a 20}
A = {x|x ∈ Z, x é par e 2 ≤ x ≤ 20}
A = {x|x = 2n, n ∈ Z e 1 ≤ n ≤ 10}
(onde Z representa o conjunto dos números inteiros)
B = {a, e, i, o, u}
B = {vogais}
B = {x|x é vogal}

1.2 Pertinência
Nos exemplos anteriores, pode-se afirmar que:
• o elemento 2 pertence ao conjunto A, simbolicamente 2 ∈ A;
• o elemento 3 não pertence ao conjunto A, simbolicamente 3 ∉ A;

• a ∈ B;
• b ∉ B.

1.3 Conjunto vazio


Conjunto vazio é o conjunto que não possui elementos. Representa-se por:

φ={}

1.4 Subconjuntos
Quando todos os elementos de um conjunto A qualquer pertencem a outro
conjunto B, diz-se então que A é subconjunto de B, simbolicamente,

272  1º PERÍODO • Análise e Desenvolvimento de Sistemas • UNITINS


Aula 1 • Matemática para Computação

A ⊂ B, que se lê: A está contido em B;


ou ainda
B ⊃ A, que se lê: B contém A.
Decorre que:
A⊂A e φ⊂A
Observação: O símbolo ⊄ corresponde a não está contido.

Saiba mais

Conjunto universo é o conjunto que possui todos os elementos de determinado estudo ou


situação. Representa-se por U. Se A é um subconjunto de U e se A’ é o conjunto de todos
os elementos de U que não pertencem a A, diz-se que A’ é o complemento de A.

1.5 União de conjuntos


Dados dois conjuntos A e B, define-se como união de A e B ao conjunto
A ∪ B formado por todos os elementos que pertencem a A ou B.
A ∪ B = {x|x ∈ A ou x ∈ B}
Decorre que:
A∪A=A e A∪φ=A

1.6 Interseção de conjuntos


Dados dois conjuntos A e B, define-se como interseção de A com B ao
conjunto A ∩ B formado por todos os elementos que pertencem a A e a B,
simultaneamente.
A ∩ B = {x|x ∈ A e x ∈ B}
Decorre que:
A∩A=A e A∩φ=φ

1.7 Diferença de conjuntos


Dados os conjuntos A e B, define-se como diferença entre A e B ao conjunto
A – B formado por todos os elementos que pertencem a A, mas que não
pertencem a B.
A – B = {x|x ∈ A e x ∉ B}

UNITINS • Análise e Desenvolvimento de Sistemas • 1º PERÍODO  273


Aula 1 • Matemática para Computação

Exemplo

Considerando: A = {1, 2, 3, 4}

B = {1, 3, 5, 7, 9}

C = {1, 2}

tem-se, entre muitas expressões possíveis, que:

C⊂A

A⊄B

A ∪ B = {1, 2, 3, 4, 5, 7, 9}

A ∪ C = {1, 2, 3, 4}

A∪C=A

A ∩ B = {1, 3}

A ∩ C = {1, 2}

A∩C=C

A ∩ B ∩ C = {1}

A – B = {2, 4}

B – A = {5, 7, 9}

1.8 Conjunto das partes de um conjunto

O conjunto das partes de um conjunto qualquer é formado por todos os


seus subconjuntos. Se um conjunto possuir n elementos, o total de subconjuntos
n
que ele admite é igual a 2 .

Exemplo: seja o conjunto A = {2, 4, 8}, o qual possui três elementos (n = 3).
O número de subconjuntos de A é igual a 23 = 8 e eles correspondem a:

φ; {2}; {4}; {8}; {2, 4}; {2,8}; {4,8}; A

Observações:

• os subconjuntos φ e A são ditos subconjuntos impróprios de A, os


demais são ditos subconjuntos próprios;

• o conjunto vazio, φ, é subconjunto de qualquer conjunto.

274  1º PERÍODO • Análise e Desenvolvimento de Sistemas • UNITINS


Aula 1 • Matemática para Computação

1.9 Diagramas de Euler-Venn


No século XVIII, Leonard Euler (1707-1783) introduziu a representação
gráfica das relações e operações entre conjuntos, mais tarde ampliada por
John Venn (1834 – 1923), denominadas Círculos de Euler ou Diagramas de
Venn e de forma mais completa, Diagramas de Euler-Venn.

Exemplo

Considerando: A = {1, 2, 3, 4, 5}

B = {4, 5, 6, 7, 8, 9}

C = {2, 4, 6, 8, 10}
A

1 3

5 2

7
6 8
9 10

B C
tem-se, entre muitas igualdades possíveis, que:

A ∪ B ∪ C = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

A ∪ B = {1, 2, 3, 4, 5, 6, 7, 8, 9}

A ∪ C = {1, 2, 3, 4, 5, 6, 8, 10}

B ∪ C = {2, 4, 5, 6, 7, 8, 9, 10}

A ∩ B ∩ C = {4}

A ∩ B = {4, 5}

A ∩ C = {2, 4}

B ∩ C = {4, 6, 8}

A – B ∪ C = {1, 3}

B – A ∪ C = {7, 9}

C – A ∪ B = {10}

UNITINS • Análise e Desenvolvimento de Sistemas • 1º PERÍODO  275


Aula 1 • Matemática para Computação

Síntese da aula
Nesta aula, utilizando como base os conceitos primitivos de conjunto,
elemento e pertinência, estudamos a Teoria dos Conjuntos. Vimos que os
conjuntos podem ser subdivididos em partes, os subconjuntos, e que entre
eles há o conjunto vazio, subconjunto de qualquer conjunto. Os símbolos de
está contido, (⊂), e não está contido, (⊄), determinam as relações entre um
conjunto e seus possíveis subconjuntos. Vimos também as operações de união,
interseção e diferença entre conjuntos e que estas operações podem ser repre-
sentadas por meio dos Diagramas de Euler-Venn.

Atividades
1. Sendo A = {x|x é número inteiro positivo e par}, B = {1, 2, 3, 4, 5, 6, 7,
8, 9} e C = {x|x é número inteiro positivo e múltiplo de 3}, obter o conjunto
D, sendo D = B – A ∪ C.

2. Sendo A = {1, 2, 3, 4, 5, 6, 7}, B = {2, 3, 4, 5, 6, 7, 8}, C = {0, 2, 4, 6,


8, 10} e D = {1, 3, 5, 7, 9}, então é correto afirmar que:
a) A – B = C ∩ D ∪ {0, 1}
b) A ∪ D = C ∪ B
c) A ∪ B – C = D
d) A ∩ B = C ∪ D – {0, 1, 9, 10}
e) A ∩ B = C ∪ D – {0, 1, 8, 9, 10}

3. Preencher o Diagrama de Euler-Venn a seguir, considerando que:

A = {–2, 1, 2, 3}, B = {–3, 1, 2, 4}, C = {–1, 1, 2, 4} e D = {–4, –2, –1, 2}.


A

B D

276  1º PERÍODO • Análise e Desenvolvimento de Sistemas • UNITINS


Aula 1 • Matemática para Computação

4. Após analisar o Diagrama de Euler-Venn a seguir, indique a afirmativa


verdadeira.

5
2

9 1

3
8
4
6
7 10

B C

a) A ∩ B – C = {1, 6}

b) A ∪ B ∩ C = {3}

c) A ∪ C ∩ B = {3, 6, 9}

d) B – A ∩ B ∩ C = {4, 7}

e) C – A ∪ B = {1, 6, 8, 9}

Comentário das atividades


Na atividade 1, o solicitado foi:

D=B–A∪C

Como:

B = {1, 2, 3, 4, 5, 6, 7, 8, 9}

A = {x|x é número inteiro positivo e par} = {2, 4, 6, 8, 10,...}

C = {x|x é número inteiro positivo e múltiplo de 3} = {3, 6, 9, 12,...},


tem-se que:

A ∪ C = {2, 3, 4, 6, 8, 9, 10, 12, ...}

Portanto:

D = {1, 2, 3, 4, 5, 6, 7, 8, 9} – {2, 3, 4, 6, 8, 9, 10, 12,...}

UNITINS • Análise e Desenvolvimento de Sistemas • 1º PERÍODO  277


Aula 1 • Matemática para Computação

Sendo D a diferença entre dois conjuntos, seus elementos serão os elementos


do primeiro conjunto, que não estão no segundo.

Logo:

D = {1, 5, 7}

Na atividade 2, os conjuntos dados foram A = {1, 2, 3, 4, 5, 6, 7},


B = {2, 3, 4, 5, 6, 7, 8}, C = {0, 2, 4, 6, 8, 10} e D = {1, 3, 5, 7, 9}.

A alternativa correta é a última, (e) A ∩ B = C ∪ D – {0, 1, 8, 9, 10}.

Pois:

A ∩ B = {1, 2, 3, 4, 5, 6, 7} ∩ {2, 3, 4, 5, 6, 7, 8}

A ∩ B = {2, 3, 4, 5, 6, 7}

C ∪ D = {0, 2, 4, 6, 8, 10} ∪ {1, 3, 5, 7, 9}

C ∪ D = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
C ∪ D − {0, 1, 8, 9, 10} = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}− {0, 1, 8, 9, 10}

C ∪ D − {0, 1, 8, 9, 10} = {2, 3, 4, 5, 6, 7}

Logo:

A ∩ B = C ∪ D − {0, 1, 8, 9, 10}

A alternativa (a) A − B = C ∩ D ∪ {0, 1} não está correta, pois:

A − B = {1, 2, 3, 4, 5, 6, 7}− {2, 3, 4, 5, 6, 7, 8} = {}


1

C ∩ D ∪ {0, 1} = {0, 2, 4, 6, 8, 10}∩ {1, 3, 5, 7, 9}∪ {0, 1} = { }∪ {0, 1} = {0, 1}

A alternativa (b) A ∪ D = C ∪ B não está correta, pois:

A ∪ D = {1, 2, 3, 4, 5, 6, 7}∪ {1, 3, 5, 7, 9}

A ∪ D = {1, 2, 3, 4, 5, 6, 7, 9}

C ∪ B = {0, 2, 4, 6, 8, 10}∪ {2, 3, 4, 5, 6, 7, 8}

C ∪ B = {0, 2, 3, 4, 5, 6, 7, 8, 10}

A alternativa (c) A ∪ B − C = D não está correta, pois:

278  1º PERÍODO • Análise e Desenvolvimento de Sistemas • UNITINS


Aula 1 • Matemática para Computação

A ∪ B − C = {1, 2, 3, 4, 5, 6, 7}∪ {2, 3, 4, 5, 6, 7, 8}− {0, 2, 4, 6, 8, 10}


A ∪ B − C = {1, 2, 3, 4, 5, 6, 7, 8}− {0, 2, 4, 6, 8, 10}

A ∪ B − C = {1, 3, 5, 7}

D = {1, 3, 5, 7, 9}

A alternativa (d) A ∩ B = C ∪ D − {0, 1, 9, 10} não está correta, pois:

A ∩ B = {1, 2, 3, 4, 5, 6, 7}∩ {2, 3, 4, 5, 6, 7, 8}

A ∩ B = {2, 3, 4, 5, 6, 7}

C ∪ D − {0, 1, 9, 10} = {0, 2, 4, 6, 8, 10}∪ {1, 3, 5, 7, 9}− {0, 1, 9, 10}

C ∪ D − {0, 1, 9, 10} = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}− {0, 1, 9, 10}

C ∪ D − {0, 1, 9, 10} = {2, 3, 4, 5, 6, 7, 8}

Na atividade 3, o preenchimento correto corresponde a:

Pois, sendo:

A = {–2, 1, 2, 3}, B = {–3, 1, 2, 4}, C = {–1, 1, 2, 4}, D = {–4, –2, –1, 2}

tem-se que:

A ∩ B ∩ C ∩ D = {2}

UNITINS • Análise e Desenvolvimento de Sistemas • 1º PERÍODO  279


Aula 1 • Matemática para Computação

A ∩ B ∩ C = {1, 2}

A ∩ D = {–2, 2}
B ∩ C = {1, 2, 4}

C ∩ D = {−1, 2}

Para a atividade 4, a alternativa correta é a (c) A ∪ C ∩ B = {3, 6, 9},


pois:

A∪C=

2 5

9 1

3
8
6
10

B C

A∪C∩B=

B C

280  1º PERÍODO • Análise e Desenvolvimento de Sistemas • UNITINS


Aula 1 • Matemática para Computação

A alternativa (a) A ∩ B – C = {1, 6} não está correta, pois A ∩ B – C =


A

B C

A alternativa (b) A ∪ B ∩ C = {3} não está correta, pois A ∪ B ∩ C =


A

6
B C

A alternativa (d) B – A ∩ B ∩ C = {4, 7} não está correta, pois B – A ∩ B ∩ C =


A

4
6
B 7 C

UNITINS • Análise e Desenvolvimento de Sistemas • 1º PERÍODO  281


Aula 1 • Matemática para Computação

A alternativa (e) C – A ∪ B = {1, 6, 8, 9} não está correta, pois C – A ∪ B =

10

B C
Ao realizar as atividades propostas, você alcançou os objetivos desta aula
de realizar operações que envolvam conjuntos e representar operações por
meio de Diagramas de Euler-Venn.

Na próxima aula
Começaremos a substituir os conjuntos com os quais trabalhamos nesta aula
por proposições, que podem até mesmo envolver situações de nosso cotidiano,
e passaremos a interligá-las de forma similar ao que fizemos com os conjuntos.
Tanto as proposições quanto suas interligações, que também chamamos de
operações lógicas sobre proposições, poderão resultar em verdades ou falsi-
dades. Estas verdades e falsidades compõem o valor lógico das operações,
que será foco do nosso estudo.

Anotações










282  1º PERÍODO • Análise e Desenvolvimento de Sistemas • UNITINS


Aula 2 • Matemática para Computação

Aula 2
Análise e Simbolização
de Proposições

Objetivos
Esperamos que, ao final desta aula, você seja capaz de:
• identificar proposições simples e compostas;
• reconhecer o valor lógico de uma proposição.

Pré-requisitos
Para determinar valores lógicos e para efetuar operações lógicas sobre
proposições é importante que se tenha um conhecimento prévio, mesmo que
mínimo, sobre o que são proposições. Por serem entes ou conceitos primi-
tivos, proposições não se definem, mas facilmente as identificamos por serem
sentenças que exprimem um pensamento de sentido completo, podendo ser
expressas tanto na linguagem usual quanto na forma simbólica.
Exemplos:
a) Manaus é a capital do Amazonas;

b) 2 < 2.
Observe nas suas leituras, observe à sua volta o quanto as proposições
estão presentes no dia-a-dia.
Também é importante que os conteúdos vistos na aula anterior tenham
sido assimilados, principalmente as operações envolvendo conjuntos. Se ainda
permaneceram dúvidas, retome sua leitura e refaça as atividades.

Introdução
Nesta aula, veremos que as proposições podem ser simples ou compostas, que
todas atendem aos princípios fundamentais da Lógica Matemática e que é possível
realizar operações lógicas sobre duas ou mais proposições utilizando conectivos
lógicos, tais como: conjunção, disjunção, condicional, bicondicional e negação.

UNITINS • Análise e Desenvolvimento de Sistemas • 1º PERÍODO  283


Aula 2 • Matemática para Computação

2.1 Proposições
As proposições são conjuntos de palavras ou símbolos que exprimem um
pensamento de sentido completo. Podem ser simples ou compostas.

Proposições simples são as que não contêm nenhuma outra proposição


como parte integrante de si mesma. Indicaremos as proposições simples pelas
letras minúsculas do alfabeto latino.

Proposições compostas são aquelas formadas pela combinação de duas


ou mais proposições. Indicaremos as proposições compostas pelas letras maiús-
culas do alfabeto latino.

Diz-se que o valor lógico de uma proposição é a verdade, se a proposição


é verdadeira, e é a falsidade, se a proposição é falsa. Usualmente utiliza-se a
letra V (ou o número 1) para designar o valor lógico verdade, e a letra F (ou o
número 0) para designar o valor lógico falsidade. Por exemplo, considere as
proposições simples:

a) p: Cristóvão Colombo descobriu a Europa;

b) q: Florianópolis é a capital de Santa Catarina;

c) r: 2 + 3 = 5;

d) s: 12 > 11 ;
1 1
e) t: > .
3 2
Seus valores lógicos são:

a) V(p) = F ou V(p) = 0

b) V(q) = V ou V(q) = 1

c) V(r) = V ou V(r) = 1

d) V(s) = V ou V(s) = 1

e) V(t) = F ou V(t) = 0

Agora, considere as sentenças:

f) ele não é estudioso;

g) existe vida em outros planetas do universo.

A sentença (f) não é proposição, pois ele não está especificado.

A sentença (g) é uma proposição, já que é verdadeira ou falsa (não é


necessário que saibamos a resposta).

284  1º PERÍODO • Análise e Desenvolvimento de Sistemas • UNITINS


Aula 2 • Matemática para Computação

2.2 Princípios fundamentais da Lógica Matemática


A Lógica Matemática tem como princípios fundamentais o:

• princípio da não-contradição: uma proposição não pode ser simultâ­


neamente verdadeira e falsa;

• princípio do terceiro excluído: toda proposição ou é verdadeira ou é


falsa, não há uma terceira opção.

2.3 Conectivos Lógicos


As proposições compostas, conforme já mencionado, são formadas pela
combinação de duas ou mais proposições. Estas combinações ocorrem por
meio de Conectivos Lógicos.

Conectivos Lógicos são palavras utilizadas para compor proposições


dadas, formando assim novas proposições. Estas novas proposições, que
serão proposições compostas, terão seu valor lógico dependente dos valores
lógicos das proposições componentes e dos conectivos utilizados. Estudaremos
os seguintes conectivos:

• conjunção, correspondente à palavra “e” e ao símbolo ∧;


• disjunção, correspondente à palavra “ou” e ao símbolo ∨;
• condicional, correspondente às palavras “se... então” e ao símbolo →;
• bicondicional, correspondente às palavras “se e somente se” e ao
símbolo ↔;
• negação, correspondente à palavra “não” e ao símbolo '. (Apesar de
ser denominado de conectivo, a negação não conecta proposições,
mas nega).

Apresentaremos a seguir as operações lógicas sobre proposições que


envolvem os conectivos.

2.4 Negação
Se p é uma proposição, sua negação será representada por p' e lê-se “não
p”. Logo, se V(p) = V, V(p') = F e se V(p) = F, V(p') = V. A Tabela-verdade a
seguir resume os valores lógicos.
p p'
V F
F V

UNITINS • Análise e Desenvolvimento de Sistemas • 1º PERÍODO  285


Aula 2 • Matemática para Computação

Exemplos:

a) q: 5 – 1 = 3 F

q': 5 – 1 ≠ 3 V

b) p: O triângulo retângulo tem um ângulo reto. V

p': O triângulo retângulo não tem um ângulo reto. F

Pode-se exprimir a negação de outras maneiras:

• é falso que o triângulo retângulo tem um ângulo reto;

• não é verdade que o triângulo retângulo tem um ângulo reto.

2.5 Conjunção
A conjunção de duas proposições p e q é uma proposição verdadeira se
V(p) = V(q) = V. Nos demais casos, é falsa. Logo, para que a proposição
composta de uma conjunção seja verdadeira, as proposições componentes
precisam ser verdadeiras. A Tabela-verdade a seguir resume os valores
lógicos.
p q p e q ou p ∧ q
V V V
V F F
F V F
F F F

Exemplos:

a) p : 4 = 2 V
π
q : sen = 1 V
2
V (p, q) = p ∧ q V

b) r : 2 + 10 = 12 V

s :102 = 20 F
V (r, s) = r ∧ s F

2.6 Disjunção
A disjunção de duas proposições p e q é uma proposição falsa se
V(p) = V(q) = F. Nos demais casos, é verdadeira. Logo, para que a proposição
composta de uma disjunção seja verdadeira, pelo menos uma das componentes
deve ser verdadeira. A Tabela-verdade a seguir resume os valores lógicos.

286  1º PERÍODO • Análise e Desenvolvimento de Sistemas • UNITINS


Aula 2 • Matemática para Computação

p q p ou q ou p ∨ a
V V V
V F V
F V V
F F F

Exemplos:
a) p : 8 = 4 F
π
q : sen = 1,5 F
2
V (p, q) = p ∨ q F

b) r : 2 − 12 = −10 V
s :10 −2 = −100 F
V (r, s) = r ∨ s V

2.7 Condicional
O condicional de duas proposições p e q é uma proposição falsa se V(p) = V
e V(q) = F. Nos demais casos, é verdadeira. A primeira proposição é denomi-
nada antecedente e a segunda conseqüente do condicional. A Tabela-verdade
a seguir resume os valores lógicos.
p q Se p, então q ou p → q
V V V
V F F
F V V
F F V

Exemplos:
2
a) p : (2 + 1) = 9 V
4 4
q: < F
5 7
V (p, q) = p → q F

b) r : o Paraná pertence a região Sul V


s : Brasília é a Capital Federal V
V (r,s ) = r → s V

2.8 Bicondicional
O bicondicional de duas proposições p e q é uma proposição verdadeira,
se V(p) = V(q), e falsa quando V(p) ≠ V(q). O bicondicional é uma dupla apli-
cação do condicional. A Tabela-verdade a seguir resume os valores lógicos.

UNITINS • Análise e Desenvolvimento de Sistemas • 1º PERÍODO  287


Aula 2 • Matemática para Computação

p q p se, e somente se, q ou p ↔ q


V V V
V F F
F V F
F F V

Exemplos:
2 2
a) p : sen x + cos x = 1 V
sen x
q : tan x = V
cos x
V (p, q) = p ↔ q V

b) r : log2 8 = 3 V
9 3
s: = F
16 8
V (r, s) = r ↔ s F

Síntese da aula
Nesta aula, vimos que o valor lógico de uma proposição composta é
decorrente das proposições componentes e do conectivo lógico que as uniu. A
seguir, um resumo das opções.
p q p' q' p∧q p∨q p→q p↔q
V V F F V V V V
V F F V F V F F
F V V F F V V F
F F V V F F V V

Atividades
1. Entre as sentenças a seguir, identifique as proposições e escreva sua
negação.
2 2 2
a) p : (a + b) = a + 2ab + b .

b) q : o sol é azul.
π
c) r : 90° = rad.
2
d) s : ela é eleitora.

e) t : Fortaleza é mais populosa do que São Paulo.

2. Entre as proposições a seguir, identifique as compostas e o tipo de conecti­vo


lógico presente.

288  1º PERÍODO • Análise e Desenvolvimento de Sistemas • UNITINS


Aula 2 • Matemática para Computação

a) P : se o triângulo ABC é eqüilátero, então os três lados do triângulo


ABC são iguais.

b) Q : quatro é par e dois é menor do que cinco.

c) R : este lago é profundo ou este lago está poluído.


4 2
d) s: (8 – 6) = (7 – 3)

e) T : Marte é um planeta do sistema solar se, e somente se, o sol for um


satélite.

3. Qual o valor lógico da proposição P: se Foz do Iguaçu fica no Paraná,


então a Chapada Diamantina fica em Santa Catarina.

4. Qual o valor lógico da proposição R: 2 é raiz da equação x2 – 7x + 10 = 0


se, e somente se, 4 for raiz da equação 2x – 8 = 0.

Comentário das atividades


Na atividade 1, são proposições: (a), (b), (c) e (e). A sentença (d) não é
proposição porque “ela” não está especificada. Assim são as suas negações:
2 2 2
a) p' : (a + b) ≠ a + 2ab + b ;

b) q': o sol não é azul;


π
c) r': 90º ≠ rad ;
2
d) t': Fortaleza não é mais populosa do que São Paulo.

Na atividade 2, são proposições compostas: (a), (b), (c) e (e). A proposição


(d) é simples. São conectivos lógicos:

a) P : se o triângulo ABC é eqüilátero, então os três lados do triângulo


ABC são iguais. Condicional;

b) Q : quatro é par e dois é menor do que cinco. Conjunção;

c) R : este lago é profundo ou este lago está poluído. Disjunção;

e) T : Marte é um planeta do sistema solar se, e somente se, o sol for um


satélite. Bicondicional.

Na atividade 3, esperamos que você tenha respondido que o valor lógico


é a falsidade, assim:

P: se Foz do Iguaçu fica no Paraná, então a Chapada Diamantina fica em


Santa Catarina;

UNITINS • Análise e Desenvolvimento de Sistemas • 1º PERÍODO  289


Aula 2 • Matemática para Computação

p: Foz do Iguaçu fica no Paraná;

q: a Chapada Diamantina fica em Santa Catarina;

P (p,q) = p → q;

Como V(p) = V e V(q) = F, V(P) = F.

Já na atividade 4, o valor lógico é a verdade:

R: 2 é raiz da equação x2 – 7x + 10 = 0 se, e somente se, 4 for raiz da


equação 2x – 8 = 0;

r: 2 é raiz da equação x2 – 7x + 10 = 0;

s: 4 for raiz da equação 2x – 8 = 0;

R (r, s) = r ↔ s;

Com V(r) = V e V(s) = V, V(R) = V.

Ao realizar as atividades, você está apto a identificar proposições simples


e compostas, bem como a reconhecer o valor lógico de uma proposição.

Na próxima aula
Ampliaremos nossos estudos sobre o valor lógico das proposições. Veremos
como proceder quando, em uma mesma proposição, figuram mais do que um
conectivo lógico.

Anotações














290  1º PERÍODO • Análise e Desenvolvimento de Sistemas • UNITINS


Aula 3 • Matemática para Computação

Aula 3
Tabela-verdade

Objetivos
Esperamos que, ao final desta aula, você seja capaz de:

• montar a Tabela-verdade, obtendo o valor lógico de uma proposição


composta;

• identificar tautologias e contradições.

Pré-requisitos
O domínio dos conectivos lógicos: conjunção, disjunção, condicional,
bicondicional e negação, vistos na aula anterior, são fundamentais para o
entendimento e assimilação desta aula. Caso julgue necessário, relei e refaça
as atividades correspondentes. Permanecendo dúvidas, entre em contato com
a web-tutoria.

Introdução
Nesta aula, aprenderemos a identificar a ordem de precedência entre os
vários conectivos lógicos que podem estar presentes em uma mesma propo-
sição composta, bem como praticar a montagem de Tabelas-verdade, muito
úteis na determinação do valor lógico das proposições.

Também conheceremos as tautologias e as contradições. Fique atento!

3.1 Ordem e precedência


Para obter uma expressão válida ou uma fórmula bem-formulada, fbf,
como é comumente denominada, torna-se necessário respeitar precedências,
ou seja, uma ordem de aplicação dos conectivos lógicos.

Observe a ordem de precedência.

UNITINS • Análise e Desenvolvimento de Sistemas • 1º PERÍODO  291


Aula 3 • Matemática para Computação

1. Para conectivos dentro de vários parênteses, efetua-se primeiro as


expressões dentro dos parênteses mais internos.

2. Negação ( ' ).

3. Conjunção ( ∧ ) e disjunção ( ∨ ).

4. Condicional ( → ).

5. Bicondicional ( ↔ ).

Logo, a expressão P ∨ Q' significa P ∨ (Q') e não (P ∨ Q)'.


E a expressão P ∨ Q → R significa (P ∨ Q) → R e não P ∨ (Q → R).

Aconselha-se, no entanto, a utilização sempre que possível de parênteses


para reduzir erros de interpretação.

6. Em uma fbf com diversos conectivos, o último a ser aplicado é o conec-


tivo principal.

Em P ∧ (Q → R)', o conectivo principal é ∧.


Em ((P ∨ Q) ∧ R) → (Q ∨ R'), o conectivo principal é →.

Para benefício da clareza e facilidade da solução, pode-se subdividir a fbf


em partes convenientes. Por exemplo, a fbf anterior poderia ser expressa da
seguinte forma: A → B, onde A = ((P ∨ Q) ∧ R) e B = (Q ∨ R'), com soluções
independentes de A e B e posterior solução do conectivo A → B.

3.2 Tabela-verdade
A elaboração da Tabela-verdade de uma fbf disciplina e facilita a obtenção
do valor lógico da proposição, já que sua montagem é feita passo-a-passo. A
Tabela-verdade tem um número de colunas que depende dos conectivos, e um
número de linhas que depende das letras que figuram na proposição.

Exemplos:
Construir a Tabela-verdade da fbf: p ∨ q' → (p ∨ q)'
p q q' p ∨ q' p∨q (p ∨ q)' p ∨ q' → (p ∨ q)'
V V F V V F F
V F V V V F F
F V F F V F V
F F V V F V V

292  1º PERÍODO • Análise e Desenvolvimento de Sistemas • UNITINS


Aula 3 • Matemática para Computação

Construir a Tabela-verdade da proposição P (p, q) = (p ∧ q')'


p q q' p ∧ q' (p ∧ q')'
V V F F V
V F V V F
F V F F V
F F V F V

3.3 Tautologia e contradição


Uma fbf que gera somente valores lógicos verdadeiros, independente dos
valores lógicos atribuídos a suas letras, é denominada uma tautologia.

Uma tautologia é intrinsecamente verdadeira.

Uma tautologia é p ∨ p'. Suponha que p corresponda à proposição: hoje


vai ter sol. Conseqüentemente, p' corresponderá à: hoje não vai ter sol. E a
disjunção, p ∨ p', será sempre verdadeira, já que uma ou outra tem de acon-
tecer (rever item 2.6 – aula anterior). Ou teremos sol ou não teremos sol.

Exemplo:

Construir a Tabela-verdade da fbf: (p → q) ↔ (q' → p')


p q p→q p' q' q' → p' (p → q) ↔ (q' → p')
V V V F F V V
V F F F V F V
F V V V F V V
F F V V V V V

Em contrapartida, quando o valor lógico de uma proposição é sempre


falso, ela é denominada de contradição.

Uma contradição é intrinsecamente falsa.

Uma contradição é p ∧ p'. Suponha que p corresponda à proposição: hoje


é domingo. Conseqüentemente, p' corresponderá à: hoje não é domingo. E a
conjunção, p ∧ p', será sempre falsa, já que uma das duas sempre será falsa
independente de que dia for hoje (rever item 2.5 – aula anterior).

Exemplo:
Construir a Tabela-verdade da fbf: (p ∨ p') → (q ∧ q')
p q p' p ∨ p' q' q ∧ q' (p ∨ p') → (q → q')
V V F V F F F
V F F V V F F
F V V V F F F
F F V V V F F

UNITINS • Análise e Desenvolvimento de Sistemas • 1º PERÍODO  293


Aula 3 • Matemática para Computação

Síntese da aula
Nesta aula, tivemos contato com as precedências entre os conectivos
lógicos. Vimos que, respeitados os parênteses, iniciamos pela negação,
passamos pelas conjunções e disjunções para, posteriormente, executarmos o
condicional e o bicondicional. Deixamos por último o conectivo principal.

Vimos ainda que uma proposição ou fbf intrinsecamente verdadeira é uma


tautologia, e uma proposição ou fbf intrinsecamente falsa é uma contradição.

Atividades
1. Construir a Tabela-verdade da proposição P(p, q) = (p ∧ q)' ∨ (q ↔ p)'.

2. Construir a Tabela-verdade da proposição P(p, q, r) = p ∨ r' → q ∧ r'.

3. Entre as proposições a seguir, quais são tautologias?

a) P(p, q) = (p ∧ q') ∨ (p' ∧ q)

b) P(p, q) = ((p ∨ q) ∧ (p' ∨ q'))'

c) P(p, q, r) = (p → q) ∧ (q → r) → (p → r)

4. Entre as proposições a seguir, quais são contradições?

a) P(p, q) = (p' ↔ q)'

b) P(p, q) = p' ∨ q → p

c) P(p, q) = (p ∨ q) ∧ (p ∧ q)'

d) P(p, q) = (p → (p' → q)'

Comentário das atividades


Na atividade 1, esperamos que você tenha chegado à conclusão de que a
proposição P(p, q) = (p ∧ q)' ∨ (q ↔ p)' possui a Tabela-verdade a seguir.

p q p∧q (p ∧ q)' q↔p (q ↔ p)' (p ∧ q)' ∨ (q ↔ p)


V V V F V F F
V F F V F V V
F V F V F V V
F F F V V F V

A atividade 2 deve ter lhe mostrado que a proposição P(p, q, r) = p ∨ r' → q ∧ r'
possui a Tabela-verdade a seguir.

294  1º PERÍODO • Análise e Desenvolvimento de Sistemas • UNITINS


Aula 3 • Matemática para Computação

p q r r' p ∨ r' q ∧ r' p ∨ r' → q ∧ r'


V V V F V F F
V V F V V V V
V F V F V F F
V F F V V F F
F V V F F F V
F V F V V V V
F F V F F F V
F F F V V F F

Na atividade 3, você deve ter concluído que:

a) a proposição P(p, q) = (p ∧ q') ∨ (p' ∧ q) não é tautologia, conforme


mostra a Tabela-verdade a seguir:

p q q' p ∧ q' p' p' ∧ q (p ∧ q') ∨ (p' ∧ q)


V V F F F F F
V F V V F F V
F V F F V V V
F F V F V V V

b) a proposição P(p, q) = ((p ∨ q) ∧ (p' ∨ q'))' não é tautologia, conforme


mostra a Tabela-verdade a seguir:

p q p ∨ q p' q' p' ∨ q' (p ∨ q) ∧ (p' ∨ q') ((p ∧ q) ∧ (p' ∨ q'))'


V V V F F F F V
V F V F V V V F
F V V V F V V F
F F F V V V F V

c) a proposição P(p, q, r) = (p → q) ∧ (q → r) → (p → r) é uma tautologia,


conforme mostra a Tabela-verdade a seguir:

p q r p → q q → r (p → q) ∧ (q → r) p → r (p → q) ∧ (q → r) → (p → r)
V V V V V V V V
V V F V F F F V
V F V F V F V V
V F F F V F F V
F V V V V V V V
F V F V F F V V
F F V V V V V V
F F F V V V V V

UNITINS • Análise e Desenvolvimento de Sistemas • 1º PERÍODO  295


Aula 3 • Matemática para Computação

Já na atividade 4, você deve ter concluído que:


a) a proposição P(p, q) = (p' ↔ q)' não é uma contradição, conforme
mostra a Tabela-verdade a seguir:
p q p' p' ↔ q (p' ↔ q)'
V V F F V
V F F V F
F V V V F
F F V F V

b) a proposição P(p, q) = p' ∨ q → p não é uma contradição, conforme


mostra a Tabela-verdade a seguir:
p q p' p' ∨ q p' ∨ q → p
V V F V V
V F F F V
F V V V F
F F V V F

c) a proposição P(p, q) = (p ∨ q) ∧ (p ∧ q)' não é uma contradição,


conforme mostra a Tabela-verdade a seguir:
p q p∨q p∧q (p ∧ q)' (p ∨ q) ∧ (p ∧q)'
V V V V F F
V F V F V V
F V V F V V
F F F F V F

d) a proposição P(p, q) = (p → (p' → q))' é uma contradição, conforme


mostra a Tabela-verdade a seguir:
p q p' p' → q p → (p' → q) (p → (p' → q))'
V V F V V F
V F F V V F
F V V F V F
F F V F V F

As atividades foram pensadas para lhe proporcionar o alcance dos


seguintes objetivos: montar a Tabela-verdade, obtendo o valor lógico de uma
proposição composta, levando em consideração a ordem de precedência dos
conectivos presentes e identificar tautologias e contradições.

Na próxima aula
Veremos as relações de implicação e de equivalência entre proposições.

296  1º PERÍODO • Análise e Desenvolvimento de Sistemas • UNITINS


Aula 4 • Matemática para Computação

Aula 4
Relações de Implicação
e Equivalência

Objetivos
Esperamos que, ao final desta aula, você seja capaz de:

• identificar a existência de implicação ou equivalência entre proposições;

• verificar equivalências por meio de tabelas-verdade.

Pré-requisitos
São pré-requisitos para esta aula os estudos anteriores referentes aos conectivos
lógicos e às Tabelas-verdade. Releia as últimas duas aulas e, se julgar necessário,
refaça as atividades. Você deve perceber que os conteúdos vistos anteriormente
sempre serão a base dos estudos posteriores. Por isso não fique com dúvidas.

Introdução
Nesta aula, aprenderemos quando duas proposições são ditas indepen-
dentes e quando são ditas dependentes. Também veremos que a dependência
corresponde à existência de relação entre as proposições que podem ser de
implicação ou equivalência.

Veremos também algumas equivalências consideradas notáveis.

4.1 Independência e Dependência


Duas proposições são consideradas independentes quando, em suas tabelas-
verdade, ocorrem todas as quatro alternativas: VV, VF, FV, FF. Por exemplo:
p q
V V
V F
F V
F F

UNITINS • Análise e Desenvolvimento de Sistemas • 1º PERÍODO  297


Aula 4 • Matemática para Computação

Duas proposições são consideradas dependentes quando, em suas Tabelas-


verdade, uma ou mais alternativas não ocorrem. Por exemplo:

p q q→p
V V V
V F V
F V F
F F V

Entre p e q → p não ocorre a alternativa VF em uma mesma linha e, nesse


caso, diz-se que existe uma relação simples (uma das alternativas não ocorreu)
entre p e q → p.

Quando duas alternativas não ocorrem, a relação é dupla.

4.2 Relação de Implicação


Diz-se que uma proposição p implica uma proposição q quando, em suas
tabelas-verdade, não ocorre a alternativa VF (nessa ordem) em uma mesma
linha. Denotamos por p ⇒ q.

Os símbolos → e ⇒ são diferentes. O primeiro representa uma


operação entre proposições, o condicional, dando origem a uma nova
proposição. O segundo indica apenas uma relação entre duas proposições.

Voltando ao último exemplo, pode-se dizer então que p ⇒ q → p.

4.3 Relação de Equivalência


Diz-se que uma proposição p é equivalente a uma proposição q quando,
em suas tabelas-verdade, não ocorrem as alternativas VF e FV em uma mesma
linha. Denotamos por p ⇔ q.

Tal qual no item anterior, os símbolos ↔ e ⇔ são diferentes.

Exemplo:

Verificar se p ∧ q ⇔ (p' ∨ q')'

298  1º PERÍODO • Análise e Desenvolvimento de Sistemas • UNITINS


Aula 4 • Matemática para Computação

Tabela-verdade
p q p∧q p' q' p' ∨ q' (p' ∨ q')'
V V V F F F V
V F F F V V F
F V F V F V F
F F F V V V F

Comparando as Tabelas-verdade de p ∧ q e (p' ∨ q')', verifica-se que não


ocorrem VF nem FV em uma mesma linha, logo p ∧ q ⇔ (p' ∨ q')'.

É fácil concluir que duas proposições são equivalentes quando suas Tabelas-
verdade são iguais, pois teremos em uma mesma linha somente VV e FF.

4.4 Equivalências notáveis

• Dupla negação: (p')' ⇔ p

As Tabelas-verdade a seguir confirmam a equivalência.


p p' (p')'
V F V
F V F

• Leis idempotentes: p∨p⇔p


p∧p⇔p

As Tabelas-verdade a seguir confirmam a equivalência.


p p∨p p∧p
V V V
F F F

• Leis comutativas: p∨q⇔q∨p

p∧q⇔q∧p

As Tabelas-verdade a seguir confirmam a equivalência.


p q p∨q q∨p p∧q q∧p
V V V V V V
V F V V F F
F V V V F F
F F F F F F

• Leis associativas: p ∨ (q ∨ r) ⇔ (p ∨ q) ∨ r

p ∧ (q ∧ r) ⇔ (p ∧ q) ∧ r

UNITINS • Análise e Desenvolvimento de Sistemas • 1º PERÍODO  299


Aula 4 • Matemática para Computação

As Tabelas-verdade a seguir confirmam a equivalência.


p q r q∨r p ∨ (q ∨ r) p∨q (p ∨ q) ∨ r
V V V V V V V
V V F V V V V
V F V V V V V
V F F F V V V
F V V V V V V
F V F V V V V
F F V V V F V
F F F F F F F
p q r q∧r p ∧ (q ∧ r) p∧q (p ∧ q) ∧ r
V V V V V V V
V V F F F V F
V F V F F F F
V F F F F F F
F V V V F F F
F V F F F F F
F F V F F F F
F F F F F F F

• Leis de De Morgan: (p ∧ q)' ⇔ p' ∨ q'


(p ∨ q)' ⇔ p' ∧ q'

• Leis distributivas: p ∧ (q ∨ r) ⇔ (p ∧ q) ∨ (p ∧ r)
p ∨ (q ∧ r) ⇔ (p ∨ q) ∧ (p ∨ r)

• Bicondicional: p ↔ q ⇔ (p → q) ∧ (q → p)

• Condicionais: (p → q) ⇔ (q' → p')


(q → p) ⇔ (p' → q')

Síntese da aula
Nesta aula, vimos que proposições independentes são aquelas em que as
Tabelas-verdade contêm todas as quatro alternativas. A falta da alternativa VF
indica que uma proposição implica a outra. A falta das alternativas VF e FV
(tabelas-verdade iguais) indica que as proposições são equivalentes.

Equivalências notáveis: dupla negação, leis idempotente, leis comuta-


tivas, leis associativas, leis de De Morgan, leis distributivas, bicondicional,
condicionais.

300  1º PERÍODO • Análise e Desenvolvimento de Sistemas • UNITINS


Aula 4 • Matemática para Computação

Atividades
Confirmar, por meio das Tabelas-verdade, que as proposições a seguir não
correspondem a implicações e sim a equivalências notáveis.

1. Leis de De Morgan: (p ∧ q)' ⇔ p' ∨ q'

(p ∨ q)' ⇔ p' ∧ q'

2. Leis distributivas: p ∧ (q ∨ r) ⇔ (p ∧ q) ∨ (p ∧ r)

p ∨ (q ∧ r) ⇔ (p ∨ q) ∧ (p ∨ r)

3. Bicondicional: p ↔ q ⇔ (p → q) ∧ (q → p)

4. Condicionais: (p → q) ⇔ (q' → p')

(q → p) ⇔ (p' → q')

Comentário das atividades


Na atividade 1, são Leis de De Morgan: (p ∧ q)' ⇔ p' ∨ q'

(p ∨ q)' ⇔ p' ∧ q'



Assim, as Tabelas-verdade a seguir confirmam a equivalência. As alter-
nativas VF e FV não ocorrem em uma mesma linha, as Tabelas-verdade são
iguais.
p q p∧q (p ∧ q)' p' q' p' ∨ q'
V V V F F F F
V F F V F V V
F V F V V F V
F F F V V V V

p q p∨q (p ∨ q)' p' q' p' ∧ q'


V V V F F F F
V F V F F V F
F V V F V F F
F F F V V V V

Na atividade 2, são Leis distributivas: p ∧ (q ∨ r) ⇔ (p ∧ q) ∨ (p ∧ r)

p ∨ (q ∧ r) ⇔ (p ∨ q) ∧ (p ∨ r)

As Tabelas-verdade a seguir confirmam a equivalência. As alternativas VF


e FV não ocorrem em uma mesma linha, as Tabelas-verdade são iguais.

UNITINS • Análise e Desenvolvimento de Sistemas • 1º PERÍODO  301


Aula 4 • Matemática para Computação

p q r q∨r p ∧ (q ∨ r) p∧q p∧r (p ∧ q) ∨ (p ∧ r)


V V V V V V V V
V V F V V V F V
V F V V V F V V
V F F F F F F F
F V V V F F F F
F V F F F F F F
F F V V F F F F
F F F F F F F F

p q r q∧r p ∨ (q ∧ r) p∨q p∨r (p ∨ q) ∧ (p ∨ r)


V V V V V V V V
V V F F V V V V
V F V F V V V V
V F F F V V V V
F V V V V V V V
F V F F F V F F
F F V F F F V F
F F F F F F F F

Na atividade 3, é bicondicional: p ↔ q ⇔ (p → q) ∧ (q → p).

As Tabelas-verdade a seguir confirmam a equivalência. As alternativas VF


e FV não ocorrem em uma mesma linha, as tabelas-verdade são iguais.
p q p↔q p→q q→p p→q∧q→p
V V V V V V
V F F F V F
F V F V F F
F F V V V V

Já na atividade 4, são condicionais: (p → q) ⇔ (q' → p')

(q → p) ⇔ (p' → q')

As Tabelas-verdade a seguir confirmam a equivalência. As alternativas VF


e FV não ocorrem em uma mesma linha, as tabelas-verdade são iguais.
p q p→q p' q' q' → p'
V V V F F V
V F F F V F
F V V V F V
F F V V V V

302  1º PERÍODO • Análise e Desenvolvimento de Sistemas • UNITINS


Aula 4 • Matemática para Computação

p q q→p p' q' p' → q'


V V V F F V
V F V F V V
F V F V F F
F F V V V V

As atividades lhe deram a oportunidade de identificar a existência de impli-


cação ou equivalência entre proposições e verificar equivalências por meio de
tabelas-verdade, que eram os objetivos desta aula.

Na próxima aula
Tomaremos contato com os predicados, propriedades das variáveis e, na
seqüência, daremos início ao estudo da Álgebra Booleana, que é um modelo
matemático tanto da Lógica Proposicional como da Teoria dos Conjuntos. A
denominação Álgebra Booleana é devida ao matemático George Boole que,
em torno de 1850, preocupado com a solução de certos problemas eletrônicos,
estava interessado em regras algébricas para o raciocínio lógico, semelhante
às regras algébricas para o raciocínio numérico.

Anotações



















UNITINS • Análise e Desenvolvimento de Sistemas • 1º PERÍODO  303


Aula 4 • Matemática para Computação

304  1º PERÍODO • Análise e Desenvolvimento de Sistemas • UNITINS


Aula 5 • Matemática para Computação

Aula 5
Predicados e introdução
à Álgebra de Boole

Objetivos
Esperamos que, ao final desta aula, você seja capaz de:

• identificar se uma estrutura matemática específica é um sistema


algébrico;

• reconhecer se uma estrutura matemática específica é uma Álgebra de


Boole.

Pré-requisitos
São pré-requisitos para esta aula os conteúdos referentes à Teoria dos
Conjuntos que estudamos em nossa primeira aula, bem como os conhecimentos
sobre álgebra que trazemos conosco dos Ensinos Fundamental e Médio.
Releia a primeira aula e, se julgar necessário, refaça as atividades e relembre
conceitos em material de apoio referente ao Ensino Fundamental e Médio.

Introdução
Nesta aula, veremos que algumas proposições apresentam, além de quan-
tificadores, características das variáveis, que se denominam predicados.

Veremos também uma introdução à Álgebra de Boole, que é um modelo


matemático tanto da lógica proposicional como da teoria dos conjuntos. A
denominação Álgebra de Boole é devida ao matemático George Boole que,
em torno de 1850, preocupado com a solução de certos problemas eletrônicos,
estava interessado em regras algébricas para o raciocínio lógico, semelhante
às regras algébricas para o raciocínio numérico.

Neste momento, aprenderemos a identificar estruturas matemáticas como


álgebras e, na seqüência, quais dessas álgebras podem ser denominadas
Álgebras de Boole.

UNITINS • Análise e Desenvolvimento de Sistemas • 1º PERÍODO  305


Aula 5 • Matemática para Computação

5.1 Predicados
As sentenças ou as proposições matemáticas podem ser expressas, de
forma genérica, por meio de um quantificador e de um predicado.

Quantificadores são símbolos que representam quantidades. Veja os


exemplos.

• “∀” que se lê “para todo”, “para cada” ou “para qualquer”.

• “∃” que se lê “existe”, “há pelo menos um”, “existe algum” ou “para
algum”.

Predicados descrevem propriedades da variável em questão. Por exemplo,


“x > 0” descreve uma propriedade da variável x, a de ser positiva.

Uma expressão lógica com quantificador e predicado pode ser, por


exemplo, (∀x)(x > 0).

A expressão anterior, no entanto, dependerá do domínio dos objetos sobre


os quais nos referimos, isto é, a coleção de objetos entre os quais x pode ser
escolhido. Essa coleção de objetos é chamada de conjunto universo.

No caso da expressão (∀x)(x > 0), se o conjunto universo consistir no


conjunto dos números inteiros positivos, então a expressão tem valor lógico
verdadeiro. Mas, se o conjunto universo consistir no conjunto de todos os
números inteiros, por exemplo, a expressão terá valor lógico falso.

5.2 Operador binário ou operações binárias


Chama-se operador binário ou operação binária a lei pela qual todo par
ordenado de elementos (x, y) é levado a um terceiro elemento z. Os sinais arit-
méticos +, −, ∙, ÷ são exemplos de operadores binários, mas, de maneira gené-
rica, podemos representar um operador binário pelos símbolos ∗, ⊕, ⊗,  º, •,
entre outros.

5.3 Propriedades das operações


• 1ª propriedade: seja A um conjunto. Diz-se que A é fechado em relação à
operação ∗, se x ∗ y ∈ A, ∀x, y ∈ A.

Exemplo: consideremos o conjunto Z dos números inteiros. Se a, b ∈ Z,


então a + b ∈ Z e a ∙ b ∈ Z, ou seja, a+ b e a ∙ b também são
números inteiros. O conjunto Z é fechado para a operação “+” e
para a operação “.”.

306  1º PERÍODO • Análise e Desenvolvimento de Sistemas • UNITINS


Aula 5 • Matemática para Computação

• 2ª propriedade: o operador ∗ é comutativo, se x ∗ y = y ∗ x, ∀x, y ∈ A.


Exemplo: se a, b ∈ Z, então a + b = b + a e a ∙ b = b ∙ a.

• 3ª propriedade: o operador ∗ é associativo, se x ∗ (x ∗ z) = (x ∗ y) ∗ z,


∀x, y, z ∈ A.
Exemplo: se a, b, c ∈ Z, então a + (b + c) = (a + b) + c e a ∙ (b ∙ c) = (a ∙ b) ∙ c.

• 4ª propriedade: o operador * é distributivo em relação à •, se


x ∗ (y • z) = (x ∗ y) • (x ∗ z), ∀x, y, z ∈ A.
Exemplo: se a, b, c ∈ Z, então a ∙ (b + c) = (a ∙ b) + (a ∙ c).

• 5ª propriedade: um elemento e é um elemento neutro para a operação ∗


se, e somente se, x ∗ e = e ∗ x = x, ∀x ∈ A.
Exemplo: se a ∈ Z, então a + 0 = 0 + a = a e a ∙ 1 = 1 ∙ a = a. Logo “0”
é o elemento neutro para a operação “+” e “1” é o elemento
neutro para a operação “.” em Z.

5.4 Sistemas algébricos


Chama-se sistema algébrico, ou álgebra abstrata, ou simplesmente álgebra
a um conjunto não vazio munido de um ou mais operadores binários sobre ele
definidos. Denotando o conjunto por A e os operadores por ∗ e •, definidos
sobre A, tem-se que:
(A, ∗) ou (A, •) são álgebras com um operador (ou uma operação);
(A, ∗, •) é uma álgebra com dois operadores (ou duas operações).
Uma álgebra pode satisfazer algumas, todas, ou nenhuma das proprie-
dades dos operadores, assumindo denominações diferentes, caso a caso,
como: semigrupo, monóide, grupo, anel, corpo, espaço vetorial, conforme as
propriedades satisfeitas pelo operador ou pelos operadores definidos sobre o
conjunto. Para nós, nesta disciplina, interessa os sistemas algébricos chamados
Álgebras de Boole, que definiremos a seguir.

5.5 Álgebra de Boole


Diz-se que um sistema algébrico (B, +, ∙) é uma Álgebra de Boole se, e
somente se, ∀a, b, c ∈ B, valem os axiomas:

A1) a + b ∈ B
A2) a ∙ b ∈ B

UNITINS • Análise e Desenvolvimento de Sistemas • 1º PERÍODO  307


Aula 5 • Matemática para Computação

A3) a + b = b + a
A4) a ∙ b = b ∙ a
A5) a + (b ∙ c) = (a + b) ∙ (a + c)
A6) a ∙ (b + c) = (a ∙ b) + (a ∙ c)
A7) ∃0 ∈ B, tal que para cada a ∈ B, a + 0 = 0 + a = a
A8) ∃1 ∈ B, tal que para cada a ∈ B, a ∙ 1 = 1 ∙ a = a
A9) Para cada a ∈ B, ∃a' ∈ B, tal que a + a' = 0 e a ∙ a' = 1

No axioma (A9), o elemento a' é denominado complemento de a.

Síntese da aula
Vimos, nesta aula, que as proposições podem ser compostas por quantifi-
cadores e predicados.

Os sistemas algébricos são conjuntos não vazios munidos de operadores e


satisfazem em parte ou na totalidade propriedades, tais como: o conjunto ser
fechado para determinada operação, a operação ser comutativa, associativa,
distributiva em relação a uma segunda operação e admitir elemento neutro.

Você também conheceu a Álgebra de Boole, um sistema algébrico formado


por um conjunto não vazio, sobre o qual se definem duas operações e que
atende a determinados axiomas.

Atividades
1. Considere o conjunto P de todas as proposições. E que, se p ∈ P e se
q ∈ P, então p ∨ q ∈ P e p ∧ q ∈ P. Verifique que (P, ∨, ∧) atende às
propriedades comutativa, associativa e distributiva.
2. Dados os operadores aritméticos +, –, ∙, ÷, diga quais entre eles são opera-
dores binários no conjunto N dos números naturais.
3. Verifique se o conjunto B2 = {0, 1} e os operadores correspondem a uma
Álgebra de Boole.
∙ 0 1
0 0 0
1 0 1
+ 0 1
0 0 1
1 1 1

308  1º PERÍODO • Análise e Desenvolvimento de Sistemas • UNITINS


Aula 5 • Matemática para Computação

4. Verifique se o conjunto B4 = {0, a, b, 1} e os operadores a seguir corres-


pondem a uma Álgebra de Boole.
∙ 0 a b 1
0 0 0 0 0
a 0 a o a
b 0 0 b b
1 0 a b 1

+ 0 a b 1
0 0 a b 1
a a a 1 1
b b 1 b 1
1 1 1 1 1

Comentário das atividades


Na atividade 1, ao verificar as propriedades comutativa, associativa e
distributiva por meio da Tabela-verdade, você deve ter concluído que:
Comutativa
p q p∨q q∨p p∧q q∧p
V V V V V V
V F V V F F
F V V V F F
F F V V F F

Associativa
p q r q∨r p ∨ (q ∨ r) p∨q (p ∨ q) ∨ r
V V V V V V V
V V F V V V V
V F V V V V V
V F F F V V V
F V V V V V V
F V F V V V V
F F V V V F V
F F F F F F F

p q r q∧r p ∧ (q ∧ r) p∧q (p ∧ q) ∧ r
V V V V V V V
V V F F F V F
V F V F F F F
V F F F F F F
F V V V F F F
F V F F F F F
F F V F F F F
F F F F F F F

UNITINS • Análise e Desenvolvimento de Sistemas • 1º PERÍODO  309


Aula 5 • Matemática para Computação

Distributiva
p q r q∧r p ∨ (q ∧ r) p∨q p∨r (p ∨ q) ∧ (p ∨ r)
V V V V V V V V
V V F F V V V V
V F V F V V V V
V F F F V V V V
F V V V V V V V
F V F F F V F F
F F V F F F V F
F F F F F F F F

p q r q∨r p ∧ (q ∨ r) p∧q p∧r (p ∧ q) ∨ (p ∧ r)


V V V V V V V V
V V F V V V F V
V F V V V F V V
V F F F F F F F
F V V V F F F F
F V F V F F F F
F F V V F F F F
F F F F F F F F

Para realizar a atividade 2, você deve ter relembrado o que é operador


binário. Chama-se operador binário ou operação binária a lei pela qual
todo par ordenado de elementos (x, y) é levado a um terceiro elemento z.
Nesta atividade, foi considerado o conjunto N dos números naturais, logo: o
operador + é binário, pois a sua utilização leva a um terceiro número natural.
O operador – não é binário, pois sua utilização nem sempre leva a um terceiro
número natural. O operador ⋅ é binário, pois a sua utilização leva a um terceiro
número natural. O operador ÷ não é binário, pois sua utilização nem sempre
leva a um terceiro número natural.

Na atividade 3, você deve ter chegado à conclusão de que o conjunto e


os operadores correspondem a uma Álgebra de Boole, pois atendem aos nove
axiomas:

A1) a + b ∈ B

A2) a ∙ b ∈ B

A3) a + b = b + a

A4) a ∙ b = b ∙ a

310  1º PERÍODO • Análise e Desenvolvimento de Sistemas • UNITINS


Aula 5 • Matemática para Computação

A5) a + (b ∙ c) = (a + b) ∙ (a + c)

A6) a ∙ (b + c) = (a ∙ b) + (a ∙ c)

A7) ∃0 ∈ B, tal que para cada a ∈ B, a + 0 = 0 + a = a

A8) ∃1 ∈ B, tal que para cada a ∈ B, a ∙ 1 = 1 ∙ a = a

A9) Para cada a ∈ B, ∃ a' ∈ B, tal que a + a' = 0 e a ∙ a' = 1

Esta álgebra é conhecida como álgebra dos interruptores ou álgebra da


comutação, e é considerada a mais útil entre as Álgebras de Boole. É o funda-
mento matemático da análise e projeto dos circuitos de interruptores ou de
comutação que compõem os sistemas digitais B2. É o exemplo mais simples de
Álgebra de Boole não degenerada (uma Álgebra de Boole é dita não degene-
rada quando os elementos neutros para suas duas operações são distintos, 0 ≠
1, e degenerada quando são iguais, 0 = 1).

Na atividade 4, você também deve ter concluído que o conjunto e os


operadores correspondem a uma Álgebra de Boole, pois atendem aos nove
axiomas:

A1) a + b ∈ B

A2) a ∙ b ∈ B

A3) a + b = b + a

A4) a ∙ b = b ∙ a

A5) a + (b ∙ c) = (a + b) ∙ (a + c)

A6) a ∙ (b + c) = (a ∙ b) + (a ∙ c)

A7) ∃0 ∈ B, tal que para cada a ∈ B, a + 0 = 0 + a = a

A8) ∃1 ∈ B, tal que para cada a ∈ B, a ∙ 1 = 1 ∙ a = a

A9) Para cada a ∈ B, ∃a' ∈ B, tal que a + a' = 0 e a ∙ a' = 1

A realização das atividades lhe deu a oportunidade de alcançar os obje-


tivos propostos para esta aula, ou seja, de identificar se uma estrutura mate-
mática específica é um sistema algébrico e de reconhecer se uma estrutura
matemática específica é uma Álgebra de Boole.

Na próxima aula
Daremos seguimento aos estudos ora iniciados conhecendo as Funções
Booleanas, as quais são definidas nas Álgebras de Boole.

UNITINS • Análise e Desenvolvimento de Sistemas • 1º PERÍODO  311


Aula 5 • Matemática para Computação

Anotações








































312  1º PERÍODO • Análise e Desenvolvimento de Sistemas • UNITINS


Aula 6 • Matemática para Computação

Aula 6
Funções Booleanas

Objetivos
Esperamos que, ao final desta aula, você seja capaz de:

• determinar a expressão de uma Função Booleana;

• escrever a forma canônica de uma Função Booleana.

Pré-requisitos
A aula anterior constitui-se em um pré-requisito para esta aula, na qual
mantivemos o primeiro contato com as Álgebras de Boole. Será importante
revê-la e, se necessário, refazer as atividades.

Introdução
As Funções Booleanas ocorrem nas Álgebras de Boole, satisfazem a
regras específicas e são construídas a partir de funções constantes e proje-
ções mediante um número finito de operações. As Funções Booleanas podem
assumir várias formas e, por conta disso, veremos uma forma canônica ou
padrão na qual possam ser transformadas.

6.1 Função Booleana


Seja B uma Álgebra de Boole e sejam x1, ..., xn variáveis tais que seus
valores pertencem a B. Chama-se Função Booleana de n variáveis a uma apli-
n
cação ƒ de B em B, satisfazendo as seguintes regras:

• se para quaisquer valores de x1, ..., xn, ƒ(x1, ..., xn) = a, a ∈ B, então
ƒ é uma função booleana. É a função constante;

• se para quaisquer valores de x1, ..., xn , ƒ(x1, ..., xn) = xi para qualquer
i(i = 1, ..., n), então ƒ é uma função booleana. É a função projeção;

UNITINS • Análise e Desenvolvimento de Sistemas • 1º PERÍODO  313


Aula 6 • Matemática para Computação

• se ƒ é uma função booleana, então g definida por


g(x1, ..., xn) = (ƒ(x1, ..., xn))' para todos x1, ..., xn é uma função booleana;

• se ƒ e g são funções booleanas, então h e k, definidas por h(x1, ..., xn)=


ƒ(x1, ..., xn) + g(x1, ..., xn) e k(x1, ..., xn) = ƒ(x1, ..., xn) ∙ g(x1, ..., xn) para
todos os x1, ..., xn são funções booleanas;

• qualquer função constituída por um número finito de aplicações das


regras anteriores e somente tal função é booleana.

Logo, funções booleanas são aquelas que se podem obter a partir de


funções constantes e funções projeção, mediante um número finito de opera-
ções “ + ” e “ . ”.

Para uma função de uma variável, a função projeção é a função identi-


dade ƒ(x) = x.

Chama-se constante (booleana) em B a qualquer elemento de uma Álgebra de Boole B.


Chama-se variável (booleana) em B ao símbolo que pode representar qualquer dos
elementos de uma Álgebra de Boole B.

Exemplos:
ƒ(x) = x + x' a
ƒ(x, y) = x' y'
h(x, y) = x' y + xy' + y'
g(x, y) = (x + y)'
ƒ(x, y, z) = axy'z + yz' + a + xy

Nos exemplos, ƒ(x, y) = x'y' e g(x, y) = (x + y)', de acordo com as Leis de De


Morgan, são a mesma função, isto é, assumem o mesmo valor para valores idên-
ticos das variáveis. Assim sendo, para melhor determinar se duas expressões
representam a mesma função booleana, torna-se desejável a existência de uma
forma padrão ou canônica na qual as expressões possam ser transformadas.

6.2 Forma canônica


Demonstra-se que:

• para uma função booleana de uma variável, a forma canônica para


todos os valores de x é: ƒ(x) = ƒ(1)x + ƒ(0)x';

314  1º PERÍODO • Análise e Desenvolvimento de Sistemas • UNITINS


Aula 6 • Matemática para Computação

• para uma função booleana de duas variáveis, a forma canônica para


todos os valores de x e y é:

ƒ(x, y) = ƒ(1,1)xy + ƒ(1,0)xy' + ƒ(0,1)x' y + ƒ(0,0)x' y';

• para uma função booleana de n variáveis, a forma canônica para


todos os valores de x1, ..., xn é:
α α α
ƒ(x1, ..., xn) = ∑ ƒ(α1, ..., αn)x1 1x2 2 ...xn n.
α
Onde αi assume valores 0 e 1, e x1 i é interpretado como xi ou xi', conforme
αi tem valor 0 ou 1.

Síntese da aula
Vimos, nesta aula, que nas Álgebras de Boole podem se definidas funções,
denominadas funções booleanas, as quais ficam determinadas mediante o
cumprimento de algumas regras. Entre elas, a que determina a construção de
uma função booleana a partir de funções constantes e de projeção.

Vimos também que existe uma forma canônica para expressão das funções
booleanas, evitando-se assim que duas funções que resultam valores iguais
para os mesmos valores das variáveis sejam consideradas funções distintas.

Atividades
1. Suponha que ƒ é uma função booleana de uma variável sobre uma
Álgebra de Boole de quatro elementos, ƒ(0) = a' e ƒ(1) = a. Determine
uma expressão para ƒ.

2. Seja B uma Álgebra de Boole com quatro elementos 0, a, a', 1. Construa


a forma canônica da função ƒ(x) = x + x' a.

3. Seja B uma Álgebra de Boole com quatro elementos 0, a, a', 1. Construa


a forma canônica da função ƒ(x, y) = x' y + xy' + y'.

4. Determine a forma canônica da função ƒ(x) = xx'.

Comentário das atividades


Para a resolução da atividade 1, os dados correspondem à tabela a seguir.
x ƒ(x)
0 a'
a
a'
1 a

UNITINS • Análise e Desenvolvimento de Sistemas • 1º PERÍODO  315


Aula 6 • Matemática para Computação

Vimos que, se ƒ é uma função booleana de uma variável, então:

ƒ(x) = ƒ(1)x + ƒ(0)x'.

Utilizando os dados da tabela anterior, tem-se: ƒ(x) = ax + a'x'.

Na atividade 2, como ƒ(x) = x + x'a, tem-se que ƒ(1) = 1 e ƒ(0) = a, de


modo que a forma canônica de ƒ é ƒ(x) = ƒ(1)x + ƒ(0)x' = 1x + ax'.

Na atividade 3, como ƒ(x, y) = x'y + xy' + y', tem-se que ƒ(1,1) = 0 e


ƒ(1,0) = ƒ(0,1) = ƒ(0,0) = 1, de modo que a forma canônica de ƒ é
ƒ(x, y) = 0xy + 1xy' + 1x'y + 1x'y'.

Já na atividade 4, como ƒ(x) = xx', e a forma canônica corresponde à


ƒ(x) = ƒ(1)x + ƒ(0)x', tem-se: ƒ(x) = x'x + 0x' = xx' + 0x'.

A realização das atividades lhe deu a oportunidade de determinar a


expressão de uma função booleana e de escrever a forma canônica de uma
função booleana.

Na próxima aula
Concluiremos esta etapa das Funções Booleanas estudando métodos de
minimização ou simplificação destas funções com ênfase para os Mapas de
Karnaugh.

Anotações
















316  1º PERÍODO • Análise e Desenvolvimento de Sistemas • UNITINS


Aula 7 • Matemática para Computação

Aula 7
Simplificações de Funções
e Mapas de Karnaugh

Objetivos
Esperamos que, ao final desta aula, você seja capaz de:
• minimizar uma Função Booleana;
• representar funções booleanas pelo método do Mapa de Karnaugh.

Pré-requisitos
Álgebra de Boole e Funções Booleanas, estudas nas aulas anteriores,
constituem-se nos principais pré-requisitos para esta aula. Releia as duas aulas
anteriores e, se as dúvidas persistirem, entre em contato conosco!

Introdução
Minimizar ou simplificar uma função booleana é uma operação para
se reduzir ao mínimo o número de seus termos, resultando em economia do
circuito a que ela corresponde.
Veremos dois métodos: o Algébrico e o do Mapa de Karnaugh.

7.1 Método algébrico


O método algébrico apóia-se em alguns teoremas das Álgebras de Boole
para a simplificação de funções. Apresentaremos esses teoremas:

Teorema 1: (a')' = a
Teorema 2: ab + ab' = a
Teorema 3: 0'=1 e 1'=0
Teorema 4: (a ∙ b)' = a' + b' e (a + b)' = a' ∙ b' (Teorema de Morgan)
Teorema 5: ab + a'c + bc = ab + a'c
Teorema 6: (a + b)(a' + c)(b + c) = ac + a'b
Teorema 7: (a + b)(a' + c) = ac + a'b

UNITINS • Análise e Desenvolvimento de Sistemas • 1º PERÍODO  317


Aula 7 • Matemática para Computação

7.2 Método do Mapa de Karnaugh


O Mapa de Karnaugh é uma forma modificada de Tabela-verdade e
permite representar graficamente uma função booleana e, se for neces-
sário, simplificá-la.

No caso de funções com uma variável, o mapa será formado por


duas células que correspondem a cada um dos valores 0 e 1 atribuídos
à variável.
0 1
a 0 1
No caso de funções com duas variáveis, o mapa será formado por quatro
células que correspondem às combinações binárias que podem ocorrer com
estas variáveis.
0 1
0 00 10
1 01 11
No caso de três ou mais variáveis, o procedimento é similar.
0 1
00 000 100
01 001 101
11 011 111
10 010 110

Síntese da aula
Vimos, nesta aula, que minimizar ou simplificar funções booleanas é
útil e pode ser realizado de formas diferentes. Analisamos dois métodos, o
método algébrico e o método do Mapa de Karnaugh.

Atividades
1. Minimizar a função y = a((b' + c')(b' + c)) + ab + (a' + b')(b + c') pelo
método algébrico.

2. Representar a função y = abc' + ab'c' + abc + a'b'c por meio do Mapa


de Karnaugh.

3. Representar a função y = a'b'cd + ab'd + abc' + ac'd' por meio do


Mapa de Karnaugh.

4. Simplificar a função y = a'b'c + a'bc + ab'c + abc por meio do Mapa


de Karnaugh.

318  1º PERÍODO • Análise e Desenvolvimento de Sistemas • UNITINS


Aula 7 • Matemática para Computação

Comentário das atividades


Na atividade 1, você deve ter concluído que minimizar a função
y = a((b' + c')(b' + c)) + ab + (a' + b')(b + c') pelo método algébrico corres-
ponde à utilização dos teoremas vistos nesta aula, conforme a seguir:
y = a((b' + c')(b' + c)) + ab + (a' + b')(b + c')
y = a(bb' + bc + b'c' + cc') + ab + (a'b + a'c' + b'b + b'c')
y = abc + ab'c' + ab + a'b + a'c' + b'c'
y = ab + b'c' + a'b + a'c'
y = (a + a') b + b'c' + a'c'
y = b + b'c' + a'c'
y = b + c' + a'c'
y = b + c'(1 + a')
y = b + c'

Na atividade 2, você deve ter percebido que representar a função


y = abc' + ab'c' + abc + a'b'c por meio do Mapa de Karnaugh corresponde
à montagem das células, conforme a seguir:
0 1
00 1
01 1
11 1
10 1

Para a atividade 3, representar a função y = a'b'cd + ab'd + abc' + ac'd'


pelo Mapa de Karnaugh corresponde à montagem das células, conforme a
seguir:
00 01 11 10
00 1 1
01 y=c 1 1
11 1 1
10

Na atividade 4, simplificar a função y = a'b'c + a'bc + ab'c + abc utili-


zando o Mapa de Karnaugh corresponde à montagem das células, conforme
a seguir, e também sua interpretação:
0 1
00
01 1 1
11 1 1
10

UNITINS • Análise e Desenvolvimento de Sistemas • 1º PERÍODO  319


Aula 7 • Matemática para Computação

Levando em consideração as colunas determinadas pelas células ante-


riores, temos que y = a'c + ac, o que nos leva a y = c.

Ao concluir com sucesso as atividades propostas, você atingiu o obje-


tivo de minimizar (simplificar) uma função booleana e de representar funções
booleanas pelo método do Mapa de Karnaugh.

Anotações

































320  1º PERÍODO • Análise e Desenvolvimento de Sistemas • UNITINS

Você também pode gostar