Básico Redes de Comp

320

description

Redes de Computadores

Transcript of Básico Redes de Comp

Page 1: Básico Redes de Comp
Page 2: Básico Redes de Comp

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

Ficha Catalográfica elaborada pela UNITINS. Bibliotecária – Rozangela Martins da Silva CRB2/1019

Direitos desta edição reservados à UNITINS.É proibida a reprodução total ou parcial desta obra sem autorização expressa da UNITINS.

FUNDAÇÃO UNIVERSIDADE DO TOCANTINS

ReitorHumberto Luiz Falcão Coelho

Vice-ReitorLívio William Reis de Carvalho

Pró-Reitor de GraduaçãoGalileu Marcos Guarenghi

Pró-Reitor de Pós-Graduação e ExtensãoClaudemir Andreaci

Pró-Reitora de PesquisaAntônia Custódia Pedreira

Pró-Reitora de Administração e FinançasMaria Valdênia Rodrigues Noleto

Diretor de EaD e Tecnologias EducacionaisMarcelo Liberato

Coordenador PedagógicoGeraldo da Silva GomesCoordenador do Curso

Igor Yepes

Page 3: Básico Redes de Comp

Computação Básica ........................................................................................5

Aula 1 – História da computação ............................................................................ 11

Aula 2 – Componentes básicos do computador ......................................................... 27

Aula 3 – Sistemas posicionais de numeração ............................................................ 37

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

Aula 5 – Classificação de software .......................................................................... 63

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

Aula 7 – Profissões na área de Informática ............................................................... 79

Algorítmos e Programação...........................................................................93

Aula 1 – Introdução à programação em Linguagem C ............................................... 99

Aula 2 – Operadores ........................................................................................... 115

Aula 3 – Estruturas de controle .............................................................................. 125

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

Aula 5 – Estruturas de dados homogêneas (vetores e matrizes) e heterogêneas (estruturas) ......................................................................... 147

Aula 6 – Ponteiros e alocação dinâmica ................................................................. 157

Aula 7 – Arquivos ................................................................................................ 163

Lógica de Programação ..............................................................................175

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

Aula 2 – Formas de representação de um algoritmo ................................................ 193

Aula 3 – Tipos de dados: variáveis e constantes ...................................................... 211

Aula 4 – Operadores e expressões ........................................................................ 223

Sumário

Page 4: Básico Redes de Comp

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

Page 5: Básico Redes de Comp
Page 6: Básico Redes de Comp

Créd

itos

EQUIPE UNITINS

Organização de Conteúdos AcadêmicosAlexandre T. Rossini Alex Coelho Evanderson S. de Almeida Marcelo Ribeiro de Oliveira Vinícius de Miranda Rios

Coordenação EditorialMaria Lourdes F. G. Aires

Assessoria EditorialDarlene Teixeira Castro

Assessoria Produção Gráfica Katia Gomes da Silva

Revisão Didático-PedagógicaSibele Letícia Rodrigues de Oliveira Biazotto

Revisão Lingüístico-TextualSibele Letícia Rodrigues de Oliveira Biazotto

Revisão DigitalSibele Letícia Rodrigues de Oliveira Biazotto

Projeto GráficoDouglas Donizeti SoaresIrenides TeixeiraKatia Gomes da Silva

IlustraçãoGeuvar S. de Oliveira

CapaIgor Flávio Souza

EQUIPE FAEL

Coordenação EditorialLeociléa Aparecida Vieira

Assessoria EditorialWilliam Marlos da Costa

RevisãoJuliana Camargo HorningLisiane Marcele dos Santos

Programação Visual e DiagramaçãoDenise Pires PierinKátia Cristina Oliveira dos SantosRodrigo SantosSandro NiemiczWilliam Marlos da Costa

Page 7: Básico Redes de Comp

Apr

esen

taçã

o

Você está recebendo o material da disciplina de Computação Básica. O conteúdo está apresentado em sete aulas. Na primeira, veremos a história da computação; na segunda, os componentes básicos do computador; e, na terceira, você conhecerá os sistemas posicionais de numeração.

A continuidade dos estudos se dará por meio do estudo das operações aritméticas no sistema binário de numeração, o que será visto na quarta aula; na quinta, classificaremos software. A sexta aula será dedicada a um conteúdo muito importante: noções básicas de redes de computadores e banco de dados.

Para terminarmos os estudos referentes a esta disciplina, analisaremos as profissões na área de Informática.

Com o intuito de combinar reflexões teóricas com propostas práticas, este material não só trará contribuições relevantes para o aprendizado da Computação Básica, como também motivará você para um trabalho mais prazeroso com esse conteúdo.

Desejamos bons estudos!

Prof. Alexandre T. Rossini

Prof. Alex Coelho

Prof. Evanderson S. de Almeida

Prof. Marcelo Ribeiro de Oliveira

Prof. Vinícius de Miranda Rios

Page 8: Básico Redes de Comp

Plan

o de

Ens

ino

EMENTA

História da computação. Componentes básicos do computador. Sistemas posicionais de numeração. Operações aritméticas no sistema binário de nume-ração. Classificação de software. Noções básicas de redes de computadores e banco de dados. Profissões na área de informática.

OBJETIVOS

Conhecer a história da computação, os componentes básicos do •computador e os sistemas posicionais de numeração.

Reconhecer as operações• aritméticas no sistema binário de numeração.

Adquirir noções básicas de redes de computadores e banco de dados.•

Estudar a classificação de • Software.

CONTEÚDO PROGRAMÁTICO

História da Computação•

Componentes básicos do computador•

Sistemas posicionais de numeração•

Operações• aritméticas no sistema binário 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•

Page 9: Básico Redes de Comp

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

BIBLIOGRAFIA

ALMEIDA, Marcus Garcia de. Fundamentos de informática. 2. ed. Rio de Janeiro: Brasport, 2002.

BROOKSHEAR, J. Glenn. Ciência da computação: uma visão abrangente. 7. ed. Porto Alegre: Bookman, 2004.

MARÇULA, Marcelo; BENINI FILHO, Pio Armando. Informática: conceitos e aplicações. São Paulo: Érica, 2005.

POLLONI. Enrico G. F.; FEDELI, Ricardo Daniel; PERES, Fernando Eduardo. Introdução à Ciência da Computação. São Paulo: Thomson, 2003.

VELLOSO, Fernando de Castro. Informática: conceitos básicos. 7. ed. Rio de Janeiro: Campus, 2004.

Page 10: Básico Redes de Comp
Page 11: Básico Redes de Comp

AULA 1 • COMPUTAçãO BÁSICA

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

Objetivos

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

visualizar o panorama da evolução dos computadores, composto por •descobertas da ciência e invenções de cientistas em diversos momentos da história;

compreender a atual realidade em que a tecnologia de produção de •computadores se encontra.

Pré-requisitos

Como esta aula é a primeira de uma série e esta disciplina é a encarre-gada de introduzir o estudo do conhecimento dos computadores e afins, não há necessidade de que você tenha algum conhecimento específico da área computacional. Recomenda-se, porém, que estude atentamente, procurando traçar um paralelo de cada assunto abordado com a realidade atual da tecno-logia computacional, a fim de visualizar as semelhanças existentes daquelas com os padrões da atualidade. As informações históricas aqui contidas servirão de base primordial para a compreensão de aspectos tecnológicos computacio-nais conhecidos e, até mesmo, as emergentes facetas que a comunidade cien-tífica da computação venha a apresentar.

Introdução

Você visualizará, nesta primeira aula, a linha do tempo da evolução dos computadores, seus cientistas e povos que contribuíram para sua formação. Vale a pena lembrar que tal linha não será vista exaustivamente, uma vez que é inviável discorrer sobre milhares de inventos e povos que contribuíram de alguma forma para tal evolução, mas, sim, sobre aqueles que serviram de

Aula 1História da computação

Page 12: Básico Redes de Comp

AULA 1 • COMPUTAçãO BÁSICA

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

marco nesta caminhada tecnológica. Antes disso, porém, você compreenderá algo sobre o que venha a ser um dado e uma informação, além de diferenciar dados analógicos de dados digitais.

1.1 Dados

O ser humano sempre processou dados. Desde o momento em que um cidadão antigo coletava pedras para representar a quantidade de ovelhas de seu rebanho, ou escrevia nas paredes das cavernas, em cartões perfurados para controlar o posicionamento e o movimento de agulhas do tear, ou até o tempo em que grandes transações bancárias são efetuadas entre duas mega empresas situadas em continentes distintos, deparamo-nos com a definição de dados.

1.2 O que é dado e o que é informação?

Dados são pequenas unidades de informação que, ao serem aplicadas em determinada direção, resultam em unidade de informação maior, de alguma utilidade mais apreciada, ou melhor, a informação em si. Por exemplo, se unirmos o dados “R”, “$” aos dados “1,50”, teremos a informação R$ 1,50. Repare que os dados não parecem ter muito sentido para nós, porém o valor R$ 1,50 já significa algo muito interessante.

Da mesma forma, o R$ 1,50 pode ser considerado um dado, se compa-rado a uma lista de receitas e despesas em uma planilha de orçamento domés-tico, que seria, aqui, a informação. Os dados e seu processamento são um elemento tão abstrato e, ao mesmo tempo, de utilidade tão concreta que, por muitas vezes, temos dificuldade em distinguir quando estão em uma situação que os envolva significativamente.

1.3 Escrita é armazenamento de dados

A necessidade de escrever, armazenar e comunicar informações por meio de símbolos (repare, nesta situação, os dados!) é notada desde os primeiros registros humanos que a arqueologia pode nos fornecer. A escrita é prove-niente dos sumérios. As pinturas rupestres (observadas nas cavernas, nos perí-odos em que se acredita que sejam dos primórdios da humanidade), o uso do ábaco (uma máquina antiga de calcular, contemporânea ao alfabeto, ambos criados na região do mediterrâneo) e de outros aparelhos ao longo da história, até alcançar a tecnologia dos dias atuais, envolvendo micro, mini e super computadores, mostram que o armazenamento de dados e seu processamento

Page 13: Básico Redes de Comp

AULA 1 • COMPUTAçãO BÁSICA

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

sempre foram uma forma especial, usada pela humanidade, para exercer controle do meio à sua volta.

1.4 Dados analógicos e digitais

Antes de prosseguirmos no tour pela linha do tempo da evolução dos compu-tadores, entenderemos sobre a definição de dados analógicos e digitais.

1.4.1 Dados analógicos

O Dicionário Michaelis define o termo analógico como “[...] dado repre-sentado por outras grandezas que podem variar segundo o sistema mecânico, elétrico ou eletrônico empregado”. De fato, informações analógicas podem possuir estados variáveis e indefinidos pelo homem.

Pensemos em um rádio de comunicação de uma torre de controle de tráfego aéreo comunicando-se com o rádio de uma aeronave em pleno vôo. Eles, supondo possuírem rádios analógicos, estão sintonizados em uma deter-minada freqüência, por exemplo, 900,023Mhz. Repare que a freqüência de comunicação possui três casas após a vírgula. Mas, mesmo que o receptor do rádio do avião estivesse sintonizado a 900,0237Mhz (quatro casas após a vírgula), a comunicação ainda assim seria possível entre torre e aeronave (talvez com algum chiado). Isso se dá devido ao fato de que um valor analó-gico poderá assumir infinitos estados, tal qual o comprimento de uma onda, propagando-se no espaço. O valor possui largura tal que, embora possa ser detectado algum padrão ou média de tamanho ou largura, tais medidas nunca serão exatas, podendo ser subdividas em infinitas partes.

Outro exemplo é o próprio relógio analógico. O ponteiro dos segundos percorre uma volta completa em 60 segundos. Logo, se dividirmos 360° por 60, obteríamos seis. Isso significa que o ponteiro percorre seis unidades da circunferência a cada segundo. Porém, analogicamente falando, poderemos dividir o segundo em 100 centésimos; logo, se dividirmos 6 unidades da circun-ferência por 100, teremos 0,06 unidades da circunferência sendo percorridos pelo ponteiro a cada centésimo de segundo. Creio que você já tenha deduzido que poderíamos ficar aqui calculando infinitamente quantas frações de circun-ferência estaríamos percorrendo em determinada fração de tempo. Inclusive, se assim o fizéssemos, chegaríamos a um valor tão pequeno que não teríamos uma nomenclatura oficial para definirmos tão pequenos intervalos. Porém o fato é que eles existem e são divididos em infinitas partes.

Page 14: Básico Redes de Comp

AULA 1 • COMPUTAçãO BÁSICA

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

1.4.2 Dados digitais

Quando olhamos o ponteiro dos segundos se movendo, por causa de nossa capacidade humana limitada de capturar movimentos com clareza até, no máximo, na casa dos centésimos de segundos, temos a impressão de que o ponteiro se tele-transporta de seis em seis unidades de circunferência a cada segundo. Porém, se filmarmos tal ponteiro em movimento e depois assistirmos ao vídeo em câmera lenta, o que visualizaremos será justamente algo parecido com o que vemos no 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.

Page 15: Básico Redes de Comp

AULA 1 • COMPUTAçãO BÁSICA

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

Após essas constatações, veremos a evolução da tecnologia computa-cional ao longo do tempo.

1.5 Linha histórica da evolução tecnológica computacional

Ao longo dessa viagem pela linha de evolução dos computadores, veri-fica-se que os inventores, a partir de uma necessidade pessoal e, não raro, coletiva, motivaram-se a criar máquinas que facilitassem, agilizassem e até mesmo permitissem determinadas atividades ou cálculos.

Nessa linha histórica, iremos considerar suas subdivisões de acordo com a estrutura de Marçula e Beninni (2005) e Tanenbaum (2007). Agruparemos os diferentes momentos em que se sucedem as facetas da evolução científica e os distintos componentes que foram usados como marco da posição digital da época.

1.6 “Iniciando do começo”

Os chineses inventaram o ábaco. Você já deve conhecê-lo, pois o mesmo é muito divulgado como elemento didático nas escolas e citado em várias palestras e conferências.

Embora a humanidade antiga soubesse armazenar números e símbolos, os cálculos matemáticos, embora realizados, no ábaco, por exemplo, não eram, na maioria das vezes, armazenados ou escritos. Assim, não se poderia guardar uma equação do segundo grau, por exemplo, e se discretizar alguma teoria. Mas, com a ajuda dos hindus, que criaram o zero escrito, isso já se tornou possível.

2000 a.C. – O ábaco chinês é a primeira ferramenta de cálculo de que se tem notícia. É uma calculadora primitiva, composta por varetas e anéis de madeira, representando unidades, dezenas e centenas. Os chineses não sabiam que estavam fornecendo uma grande ajuda teórica na organização dos computadores. O ábaco é muito popular e até hoje ainda é usado, princi-palmente em países orientais.

1614 – Logaritmos são definidos por John Napier, nascido na Escócia.

1623 – Wilhelm Schickard cria a primeira máquina de calcular, de acordo com os historiadores, pois, infelizmente, ela desapareceu durante a guerra dos trinta anos. Ela realizava operações de divisão e multiplicação e tinha uma estrutura mecânica baseada em rodas dentadas.

Page 16: Básico Redes de Comp

AULA 1 • COMPUTAçãO BÁSICA

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

1644 – Blaise Pascal (1623-1662) (inclusive, Pascal é o nome de uma linguagem de programação muito conhecida, batizada assim em homenagem a esse cientista) constrói o que a história entende como a primeira calculadora, batizada por ele de Pascalene, ou Pascalina. Ele a criou para auxiliar seu pai (preparação de impostos). Tal máquina também usava uma roda dentada contendo justamente dez dentes, um para cada algarismo decimal (ou dígito decimal! Uma máquina digital!). A pascalina realizada subtrações e somas.

1673 – Gottfried Wilhelm Leibnitz (1646-1716), matemático e filósofo, melhorou o projeto da Pascalina, construindo, assim, uma máquina capaz de dividir, multiplicar, subtrair, somar e calcular a raiz quadrada. Os historia-dores confirmam seu pensamento: “ele sonhava que um dia todo o raciocínio pudesse ser substituído pelo girar de uma alavanca”.

1801 – Joseph Marie Jacquard (1752-1834) foi um mecânico nascido na frança que criou uma máquina mecânica de tear (a primeira máquina programável, controlada por cartões perfurados, tamanho grande) capaz de criar bonitos desenhos enredados no próprio tecido. Sua invenção fez muito sucesso na França e, em sete anos, milhares de máquinas de tear já estavam em operação no país.

Até aqui, podemos dizer que chegamos ao fim da era mecânica. Veja como ela trouxe a base sem a qual não teríamos chegado onde estamos hoje, e as malhas de nossas roupas não poderiam ter lindos e detalhados enfeites intrínsecos e costurados. Vamos prosseguir para verificar como as máquinas e descobertas daquela era influenciaram na continuidade desse processo evolutivo.

1.7 A era dos dígitos

No decorrer do processo, logo vemos a necessidade de utilizar computadores para realizar atividades repetitivas e rotineiras, principalmente cálculos de precisão diferencial. No século XIX, vemos por, exemplo, que as invenções de Charles Babbage expandem a visão do tamanho do potencial computacional para a humanidade. Prossigamos em nossa caminhada...

1820 – Charles Babbage (1792-1871), matemático nascido na Inglaterra, projeta a máquina analítica, uma máquina diferencial calculadora de polinô-mios. Essa máquina calcularia automaticamente, além de somas e subtrações e outros cálculos básicos, a conversão de números de uma base para outra (da base binária para a decimal, por exemplo). Babbage ficou conhecido com o

Page 17: Básico Redes de Comp

AULA 1 • COMPUTAçãO BÁSICA

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

Pai do computador, uma vez que seu invento muito se aproximava do conceito de computador que temos na atualidade.

Tal máquina, que fora financiada por algum tempo pelo governo britânico, era puramente mecânica, sendo composta por um engenho central (olha só, uma CPU!), uma memória, engrenagens e alavancas. Utilizava cartões perfu-rados e possuía dispositivos de entrada e saída de dados.

Por fim, infortunadamente, Charles Babbage parecia estar à frente da tecnologia de sua época, pois a mesma não estava suficientemente avançada para fornecer a base de que ele precisava para avançar em suas pesquisas e construir peças mecânicas de que precisaria. O governo britânico acabou por suspender o financiamento de Babbage e, com isso, o cientista não teve condições de finalizar o próprio projeto e a calculadora analítica nunca foi construída. Vale a pena ressaltar que as máquinas, até o século XIX, funcio-navam na base decimal (e hoje funcionam na base binária!).

No século XX, a má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.

Page 18: Básico Redes de Comp

AULA 1 • COMPUTAçãO BÁSICA

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

1.8 Máquinas de computar

1889 – As idéias de Charles Babbage são mescladas às práticas com cartões perfurados por um estatístico americano preocupado com a demora na contagem da população. Até então, a contagem completa da população norte-americana demorava sete anos. Após a aplicação computacional de Babbage com a máquina de Hollerith (inclusive esse era, e ainda é, o nome dado aos contracheques de pagamento de funcionários), o tempo para contagem popu-lacional reduziu pela metade, três anos e meio.

1896 – Aqui, a Companhia de máquinas de tabular é criada (Tabulating Machine Company).

1924 – Bem, se foi difícil saber que empresa era essa que fora citada ante-riormente, saiba que neste ano ela muda seu nome para International Business Machine, ou a famosa IBM.

1904 – A Válvula é criada por John A. Fleming. Tal componente é composto por um envoltório de vidro que contém dois eletrodos. A válvula interrompe ou permite a passagem de corrente elétrica, dependendo de como a energia passa por dentro da mesma. Veja a utilidade disso: com corrente elétrica, temos o Bit um; sem corrente elétrica, o bit zero.

1937 – Allan M. Turing, utilizando-se da álgebra de boole, da tecno-logia de entrada e saída via cartões perfurados e da válvula expõe minucio-samente uma máquina computacional de propósito múltiplo. Essa iniciativa foi a pioneira no sentido de alguém, o próprio usuário (ou seja, não vem definido de fábrica), poder decidir que cálculos ou operações a máquina irá realizar. A consciência com o conceito de programação que temos hoje não é mera coincidência.

1.9 Primeira geração de computadores – Válvula (1945-1955)

De acordo com o progresso da história, é possível agrupar quatro diferentes gerações, notadas sempre por um marco, um evento revolucionário que permitia à tecnologia saltar consideravelmente em direção a um estado mais evoluído.

1946 – John Presper Eckert (1919-1995) e John Mauchly (1907-1980), ambos engenheiros, projetaram o Eletronic Numeric Integrator And Calculator (ENIAC). Ele possuía 18.000 válvulas, 1.500 relés, pesava 30 toneladas e consumia 140Kw de energia (ocupava o tamanho de um prédio pequeno, com 90m2, e conseguia realizar 500 operações de multiplicação por segundo, ou 5.000

Page 19: Básico Redes de Comp

AULA 1 • COMPUTAçãO BÁSICA

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

somas, no mesmo período de tempo). O ENIAC foi projetado para fins bélicos (iniciou no apogeu da Segunda Guerra Mundial) porém somente após vários meses o término da guerra, em 1946, esse teve sua construção concluída.

O ENIAC dispunha, para sua programação, de 6.000 interruptores de ajuste e uma imensa quantidade de soquetes. Tanenbaum (2007) compara: “Uma verdadeira floresta de cabos e jumpers”. Programar em painéis elétricos realmente era difícil, lento, tedioso e mecânico.

A partir dessas dificuldades, John Von Neumann propôs um modelo conhe-cido como Máquina de Von Neumann. Esse modelo é composto por cinco partes básicas: uma unidade de controle, uma memória de trabalho (arma-zena os dados), unidades de entrada e saída (impressora) e CPU, composta por uma unidade lógica aritmética e por um acumulador.

1.10 Segunda geração de computadores – transistores (1955-1965)

Isso mesmo, os transistores (Inventado nos Laboratórios da Bell, em 1948 por Willian Shockley, Walter Brattain e Jhon Bardeen) substituíram as válvulas. A válvula era e é uma grande consumidora de energia elétrica. O transistor é muito mais rápido e barato que a válvula, além de consumir bem menos energia elétrica e ser mais durável. Os Estados Unidos conseguiram, por exemplo, com o uso de transistor, sair à frente da antiga URSS na corrida espacial.

1963 – O monitor de vídeo, talvez, hoje, o mais conhecido periférico de saída, começa a ser usado como tal. Antes dele, os resultados de processa-mentos eram vistos impressos em papel.

1964 – Agora é a vez de o mouse aparecer. Ele foi apresentado por Douglas Engelbart como um periférico de entrada de dados. Antes dele, a entrada somente poderia ser feita via os famosos cartões perfurados.

John Kemeny cria a linguagem BASIC que, no momento, servia como um software que intermediava a relação entre a linguagem de programação e o hardware. Note que isso muito se assemelha ao sistema operacional (popular-mente representado pelo Microsoft Windows ou GNU/Linux).

1.11 Terceira geração de computadores – circuitos integrados (1965–1980)

O circuito integrado foi inventado em 1958 por Robert Noyce. Dessa vez, o tal circuito integrado não é um substituto do transistor, mas sim um conglo-

Page 20: Básico Redes de Comp

AULA 1 • COMPUTAçãO BÁSICA

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

merado de transistores. Mais especificamente, nessa geração, dezenas, e até centenas deles, em um pequeno espaço (o chip) de silício.

Nessa fase, verifica-se o famoso fenômeno da miniaturização dos compu-tadores: com o circuito integrado (CI), tornou-se possível a construção de computadores menores, mais rápidos e mais baratos do que os da geração anterior já transistorizados. A mudança foi drástica: computadores que tinham tamanhos de salas reduziram ao tamanho de geladeiras, ainda grande, se comparados com os de hoje, certo? Mas concorde que o impacto, aqui, já foi gigantesco para a época que, aliás, não é tão distante de hoje.

1967 – A primeira calculadora digital, precursora das calculadoras de bolso, hoje é apresentada pela empresa Texas Instruments. Tal máquina realizava as quatro operações fundamentais: soma, subtração, multipli-cação e divisão.

1968 – A empresa Intel (hoje, a maior fabricante de microprocessadores do mundo) é criada por Robert Noyce, Andy Groove e Gordon Moore.

1969 – Nasce a rede Arpanet, por meio da interligação de quatro univer-sidades, pelo departamento de defesa dos Estados Unidos. A Arpanet é a precursora da WWW – Rede mundial de computadores ou, simplesmente, a Internet.

1970 – O Sistema operacional (SO) UNIX (curiosidade: o conhecido GNU/Linux de hoje é um UNIX) é desenvolvido por Ken Thompson e Dennis Ritchie. O UNIX foi o primeiro SO portável (sistema que pode funcionar em diferentes tipos de computadores) a ser desenvolvido.

A partir dessa parte da história, você irá notar (se já não tiver notado) que convive com boa parte da tecnologia. Estamos nos aproximando da geração atual com a qual convivemos.

1.12 Quarta geração de computadores – integração em escala muito grande (1973, 1980-?)

Na terceira geração, notamos centenas de transistores em um único chip. Agora, na quarta geração, os cientistas obtiveram dezenas de milhares, centenas de milhares e milhões de transistores em um único chip (Very Large Scale Integration (VLSI) – integração em escala muito alta) ou seja, ainda, de um CI, porém, em um nível de miniaturização muitíssimo elevado. A essa altura da evolução, é sensato que o chip tenha mudado de nome: Microchip.

Page 21: Básico Redes de Comp

AULA 1 • COMPUTAçãO BÁSICA

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

Se o Microchip é o marco dessa geração, logo os computadores constru-ídos com tais são os microcomputadores. Dessa vez, as máquinas alcançaram tamanhos muito menores, evoluindo de geladeiras a cadernos (isso mesmo, traduzindo, notebooks), e indo a um tamanho ainda menor.

1973 – O termo PC (personal computer) e CP (computador pessoal) é utilizado pioneiramente quando a Xerox lança um computador batizado como Alto, com fins de uso pessoal. Repare nas características desse CP: compa-tível com uso de mouse, possuindo um nível alto de conectividade em rede e dispondo de interface gráfica. Realmente, características que podem ser usadas para descrever nossos computadores.

1975 – O BASIC é adaptado para rodar nos microcomputadores daquele tempo (por meio do conhecido Bill Gates e Paul Allen).

1976 – Nasce a Apple (significa maçã, que é, inclusive, a logomarca da companhia) criada por Steve Jobs e Stephen Wozniak, com o intuito de se projetar CPs.

1977 – O Apple 2, o Atari 500 e o Commodore 64 são lançados respec-tivamente pelas empresas Apple, Atari e Commodore. O Apple 2 foi consa-grado como o primeiro sucesso de mercado na área de computação pessoal.

1980 – O primeiro computador portátil, um avô para o notebook Osborne-1 com seus 11 quilos, surge no mercado. Um ano depois do Osborne-1, a Compaq se estabelece como empresa líder no mercado de portáteis, lançado sua cópia clonada, portátil, do IBM-PC.

A arquitetura, Reduced Instruction Set (RISC) – conjunto reduzido de instruções, começa a ser aceita no lugar de dificultosas arquiteturas (CISC). Abordagens maiores sobre RISC e CISC serão vistas na próxima aula.

1981 – O IBM-PC é lançado pela IBM, com o processador Intel 8088 e o SO MS-DOS, feito pela Microsoft. Esse CP surge com desempenho (velocidade e memória) muito superior ao dos concorrentes. Você provavelmente possui um PC em sua casa ou local de trabalho ou estudo. Ele é um sucesso que permanece até os dias de hoje. A arquitetura IBM PC foi aberta ao público pela própria empresa. O resultado disso foi a perda de Mercado pela IBM (ruim para a IBM) e a popularização do padrão IBM para o mercado (bom para o mundo, para nós, usuários). É notável a popularidade do padrão IBM (aberto) quando comparamos, por exemplo, à popularidade do Apple (padrão fechado, proprietário). Quem lucrou mesmo com essa história foi a Microsoft,

Page 22: Básico Redes de Comp

AULA 1 • COMPUTAçãO BÁSICA

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

uma vez que, para cada computador vendido, mesmo de arquitetura aberta, era quase que provável que uma licença de uso do MS-DOS seria vendida para uso juntamente com a máquina.

1992 – O computador Alpha, revolucionário, de 64 bits, é lançado pela DEC. Um computador RISC, cuja velocidade ultrapassava e posicionava-se muito mais à frente da velocidade de qualquer outro computador pessoal da época.

A história registra o intervalo de tempo de dez anos para que os compu-tadores RISC de 64 bits fizessem sucesso no mercado, atuando principalmente como servidores de alta performance.

1.13 “Quinta geração de computadores” – computadores invisíveis

O que, ou como seria a quinta geração de computadores?

O Japão já teve interesse em ditar como seria a computação de quinta geração: computadores quânticos. Isso causou um grande temor por partes das indústrias americanas e européias. Porém o fato é que o Japão não teve êxito em suas pesquisas e logo o assunto foi abafado.

Constatações históricas nos mostram que a quinta geração não é marcado por uma mudança ou salto grandioso de tecnologia, como constatado nas gerações anteriormente citadas, mas sim uma mudança de paradigma: os computadores atingiriam tamanhos menores (constatando que a miniaturi-zação continua a ocorrer) ao ponto de não serem notados pelo ser humano: a geração do computador invisível.

1993 – A Apple lança o computador Newton. Esse marcou o momento por mostrar que os computadores poderiam ser feitos em invólucros menores do que uma fita cassete portátil. Recebia entrada de dados dos usuários a partir de uma caneta, assemelhando-se aos conhecidos e populares Personal Digital Assistants (PDAs) – agendas eletrônicas, por exemplo, o Palm Tungsten ou Pocket PCs.

Embora os PDAs sejam realmente menores, até mesmo que os Notebooks, não são eles quem descrevem a característica dessa nova geração, mas sim os computadores realmente invisíveis como aqueles embutidos dentro de automó-veis, aviões, fornos microondas, máquinas de lavar, vídeo games, etc.

Como se pode notar, os computadores invisíveis estão em toda a parte e, se você, leitor, estiver na cidade e olhar à sua volta, provavelmente constatará (mesmo não podendo ver) a presença de algum computador, microchip ou

Page 23: Básico Redes de Comp

AULA 1 • COMPUTAçãO BÁSICA

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

controlador eletrônico em um raio de 15 a 100 metros. Como Tanenbaum afirma: “Eles serão parte da estrutura da vida diária, abrindo portas, acen-dendo luzes, distribuindo dinheiro e milhares de outras coisas”.

Chegamos ao fim desta primeira aula. E quanta informação você recebeu! Muito do que foi visto já fez ou ainda faz parte do seu dia-a-dia ou de seus pais ou de professores mais experientes, afinal convive com a quarta geração e entende a presença de uma quinta geração eminente. E, a partir de agora, desafio você a relacionar na história todos os tipos de computadores com os quais você venha a ter contato. É hora de situar-se na história para compre-ender cada vez mais o porquê de nossa situação tecnológica atual e poder projetar tendências de futuro para a mesma.

Síntese da aula

Nesta primeira aula, você aprendeu detalhes esclarecedores sobre dados analógicos e digitais. Principalmente, viajou no tempo da história da compu-tação, aprendendo as características dos computadores de cada geração que a tecnologia nos trouxe, incluindo a geração atual, sendo capaz de se posicionar quanto às previsões sobre os rumos a serem tomados pela tecno-logia vigente.

Atividades

1. Como diferenciar dado de informação?

2. Cite cinco formas variadas de se armazenar dados.

3. Você vê alguma vantagem do relógio digital sobre o analógico (considere apenas a funcionalidade de relógio)?

4. Qual o nome da máquina criada por Blaise Pascal?

5. Qual o nome da máquina criada por Charles Babbage?

6. Por que Babbage ficou conhecido com o Pai do Computador?

7. Cite as quatro palavras-chave das quatro gerações de computadores. Por que devemos nos lembrar delas?

8. Qual a relação da válvula com a álgebra booleana?

9. Descreva a razão de ser do fenômeno de miniaturização.

10. O que são computadores invisíveis?

Page 24: Básico Redes de Comp

AULA 1 • COMPUTAçãO BÁSICA

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

Comentário das atividades

Os objetivos desta aula foram introdutórios aos estudos sobre Tecnologia da Informação, bem como históricos, a fim de situar o aluno 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.

Page 25: Básico Redes de Comp

AULA 1 • COMPUTAçãO BÁSICA

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

Na atividade 9, a miniaturização foi uma conseqüência natural obtida conforme as gerações vão se estabelecendo. Cada geração é definida por componentes elétricos cada vez menores. Diminuindo-se os componentes, logo diminuem-se o tamanho dos computadores compostos pelos mesmos.

Na atividade 10, computadores invisíveis são uma nomenclatura sugerida para todo objeto de uso humano que contenha, dentro de si (embutidos), micro-processadores ou microcontroladores. Essa realidade nos coloca dentro de um mundo em que estamos cercados de utensílios computadorizados, muitos deles usados por nós tão automaticamente que, por muitas vezes, não atentamos que estamos interagindo com um computador, daí o fenômeno da invisibilidade do computador.

ReferênciasMARÇ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

Page 26: Básico Redes de Comp

AULA 1 • COMPUTAçãO BÁSICA

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

Page 27: Básico Redes de Comp

AULA 2 • COMPUTAçãO BÁSICA

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

Objetivos

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

conhecer os principais componentes formadores do computador •moderno;

compreender, conceitualmente, o modo de execução de instruções de •um computador.

Pré-requisitos

Chegamos à segunda aula, que abordará um tema conceitual, porém não menos importante para o curso, que recomenda fortemente o estudo da aula ante-rior. O estudo da aula anterior se faz importante devido ao fato de ser a base teórica para uma melhor compreensão dos componentes atuais formadores do computador moderno, que serão estudados nesta aula. Ter conhecimentos sobre, por exemplo, a máquina Von Neumann, o armazenamento de dados e outros impor-tantes conceitos é condição necessária para que você possa ter o melhor proveito desta e de outras aulas de nossa disciplina e, conseqüentemente, do curso.

Introdução

Você conhecerá, nesta segunda aula, os componentes internos e externos que formam o computador contemporâneo de nossa época. Veremos como esses componentes se relacionam entre si para que o conceito de computador se torne uma realidade prática e, portanto, útil para a resolução de problemas.

2.1 Componentes do computador

O computador, relembrando a máquina Von Neumann, é composto por: CPU (nesse caso, representada pela unidade lógica aritmética e pela unidade de controle), memória e unidades de entrada e saída.

Aula 2Componentes básicos

do computador

Page 28: Básico Redes de Comp

AULA 2 • COMPUTAçãO BÁSICA

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

Andrew Tanenbaum (2007) define que “um computador digital consiste em um sistema interconectado de processadores, memórias e dispositivos de entrada/saída”.

Atualmente, os computadores seguem esse mesmo princípio de compo-sição. Eles se diferem do modelo de Von Neumann no aspecto do processador, ou CPU, que, em nossa realidade, estão em um único microchip, se é que isso, um reposicionamento, pode ser considerado uma diferença significante.

Visto isso, os componentes principais do computador são: CPU, memória e a placa mãe. Em resumo, a CPU é responsável por processar os dados, a memória tem a funcionalidade de armazenar os dados pré e pós-proces-sados, e a placa mãe é o barramento (canal de comunicação) onde a CPU e a memória se localizam conectadas por meio de slots (conectores), permitindo, assim, que o processador acesse aos dados na memória, processe-os e os retorne para a mesma.

2.2 A Memória Principal – RAM (Random Access Memmory)

O termo RAM, Random Access Memmory traduz-se por Memória de Acesso Aleatório. Trata-se da memória de trabalho com a qual o processador comuni-ca-se. O termo aleatório quer dizer que a memória poderá ser acessada, para operações de escrita e leitura, em qualquer posição. Existem milhares de posi-ções de memória, a depender da capacidade do pente de memória instalado em sua placa mãe.

Considere, para efeito didático, uma posição de memória em um pente como sendo um dos apartamentos de um prédio. Cada apartamento pode conter apenas um morador (em termos técnicos, um caractere, por exemplo, a letra “A”). O processador poderá, então, dependendo do programa que está executando, inserir um caractere em uma posição de memória, retirar um caractere de uma posição, substituir um caractere que estava previamente armazenado em uma posição por outro caractere, copiar um caractere de uma posição de memória para outra da posição de memória. Repare que a memória tem de ser de rápido acesso, uma vez que os computadores perfazem milhões de acessos à memória durante o tempo em que estão funcionando, dependendo dos programas que esti-verem sendo executados.

Um exemplo didático de uso da memória seria, por exemplo, os seis passos descritos a seguir.

Page 29: Básico Redes de Comp

AULA 2 • COMPUTAçãO BÁSICA

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

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,

Page 30: Básico Redes de Comp

AULA 2 • COMPUTAçãO BÁSICA

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

se um computador é aquilo que realiza cálculos, logo, presumimos que ele precisará ter uma espécie de cérebro eletrônico, ou uma cabeça eletrônica que possa pensar ao menos o suficiente para resolver os cálculos para os quais o mesmo foi designado para realizar.

A CPU age, então, como o cérebro do computador, tendo a função de obter dados ou instruções de algum lugar que, no caso de um computador, é a memória de trabalho (será vista em seguida, ainda nesta aula), verificar estas instruções e depois executá-las, uma após a outra.

Vamos desmistificar o processador aqui: ele não é um elemento mágico que busca as informações e as processa de forma desconhecida. No parágrafo ante-rior, utilizamos verbos de ação como obter, verificar e executar. Para cada um destes verbos, existem barramentos e circuitos elétricos e eletrônicos que desem-penham e possibilitam a comunicação entre os componentes internos ao próprio processador. Porém não é aconselhável, por fins didáticos, que você se aprofunde ao nível dos projetos eletrônicos de construção e um processador, pois esse não é o objetivo deste curso. Projetar processadores, bem como circuitos eletrônicos e componentes para computadores, como interfaces de vídeo tridimensionais ou modems para acesso a Internet, etc., são objetivos de cursos específicos como, por exemplo, engenharia eletrônica e engenharia da computação.

Diferentes partes compõem a UCP: UC (Unidade de Controle), ULA (Unidade Lógica Aritmética) e Registradores (Pequenas memórias de alta velocidade).

2.3.1 Unidade de Controle – UC

A Unidade de Controle tem a função de obter dados e instruções na memória principal, determinando sua tipologia. É ela a porta de entrada e saída que o processador usa para comunicar-se, via sinais elétricos, com a memória prin-cipal. Por exemplo, se a ULA precisar armazenar o número binário 0012 na posição de memória 0002, ele solicitará à UC que realize tal procedimento.

2.3.2 Unidade Lógica Aritmética – ULA

A Unidade Lógica Aritmética efetua diversas operações matemáticas, como adição e subtração, multiplicação e divisão, e de lógica booleana (lembra G. Boole? Se não, aconselhamos que você dê uma pequena pausa neste ponto de leitura, retorne à aula anterior e reveja as explanações sobre George Boole e a lógica binária), como o OR (ou) booleano (você estudará isso com deta-lhes na disciplina Lógica de Programação) com a finalidade de se executar as instruções (o programa).

Page 31: Básico Redes de Comp

AULA 2 • COMPUTAçãO BÁSICA

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

2.3.3 Registradores

Os Registradores são pequenas memórias que servem para auxiliar o processador, armazenando resultados temporários, durante o processo de cálculo. Pense que o processador teria de se esforçar muito mais para realizar operações sem esses registradores internos, pois, se assim fosse, teria de utilizar a memória principal, que está mais longe, externa ao processador.

Existem registradores com funções genéricas e específicas que são muito mais rápidos do que aqueles, porém são preparados para responder a apenas um tipo fixo de operação, enquanto os genéricos, diversas, tal qual a memória principal. Os registradores são memórias internas para uso geral, usados pela ULA para armazenar dados (caracteres, números binários) que estão sendo processados.

Exemplo de registradores gerais: AX, BX, usados para armazenar números binários. Exemplo de registrador específico: IP, Instruction Pointer, armazena a referência do endereço da memória principal (RAM) que contém a próxima instrução a ser executada.

2.4 Executando-se uma instrução

A Memória principal armazena dados que serão buscados pela UC (unidade de controle) da CPU e adicionados nesses registradores. Em seguida, a ULA realiza operações sobre os dados que estão nos registradores, também armazenando o resultado das operações neles. Por fim, UC copia o valor dos registradores para dentro de um endereço (posição) de memória principal.

A enumeração a seguir representa uma seqüência de pequenas fases que são reproduzidas para cada instrução que a CPU executa. A mesma tem uma denominação comum de ciclo buscar-decodificar-executar.

1. Transportar a instrução seguinte da memória principal para o registrador.

2. Modificar o ponteiro de instrução (IP) indicando a próxima instrução.

3. Estabelecer qual o tipo da instrução transportada.

4. Caso a instrução utilize uma seqüência de dados na memória prin-cipal, estabelecer onde está seqüência de dados se encontra.

5. Transportar a seqüência de dados, se necessário, para algum regis-trador da UCP.

6. Executar a instrução.

7. Retorno à fase 1 (isso fará com que se execute a próxima instrução, contida no registrador IP, alterado pela etapa 2).

Page 32: Básico Redes de Comp

AULA 2 • COMPUTAçãO BÁSICA

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

2.5 RISC versus CISC

Ao longo a história, a Apple projetou seu processador e acabou compe-tindo com a Intel, também com um processador próprio. Ambas competiam pelo espaço no mercado de processadores. A Intel lidera essa concorrência de forma geral, principalmente no que se diz respeito aos computadores pessoais. Você deve estar habituado a ouvir, mesmo na televisão, sobre os processa-dores Intel, por exemplo, Pentium, Celeron, etc.

Existe uma diferença básica entre os dois processadores dessas duas companhias aqui: a quantidade de instruções que eles podem realizar. A Apple utiliza um conjunto reduzido de instruções (RISC), enquanto a Intel 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-

Page 33: Básico Redes de Comp

AULA 2 • COMPUTAçãO BÁSICA

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

madores de sistemas e aplicativos terão menos trabalho: codificarão uma só vez e verão o seu programa funcionar em várias versões futuras da Intel.

Chegamos ao fim de nossa segunda aula. Agora você está ciente de importantes informações que nortearão de maneira significativa as decisões que você tomará em relação à programação e demais relacionamentos asso-ciados ao computador.

Repare, também, o quanto a primeira aula apresentou aspectos fundamen-tais sobre a evolução dos componentes de nossos computadores, o que fez com que você recebesse a informação dessa aula de forma racional e funda-mentada. Leve para sempre, em sua mente, esses conceitos aqui expostos, pois você irá usá-los como, no mínimo, pano de fundo para o desenvolvimento de aplicações, preparação de conteúdos, ministração de palestras e seminários e os estudos da maioria das disciplinas que serão vistas neste curso e que sejam relacionadas ao computador moderno.

Síntese da aulaNesta 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.

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

Page 34: Básico Redes de Comp

AULA 2 • COMPUTAçãO BÁSICA

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

Comentário das atividadesOs 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

Page 35: Básico Redes de Comp

AULA 2 • COMPUTAçãO BÁSICA

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

projeto do menor número de micro instruções possível para alcançar, com isso, maior performance (velocidade) de execução.

Na atividade 10, embora o padrão RISC seja mais rápido do que o padrão CISC, os processadores CISC da Intel facilitam a vida dos desenvolvedores de software devido ao grande leque de instruções disponíveis, bem como ao prin-cípio a retro compatibilidade empregado pela empresa, que preza pelo fato de um programa, construído uma única vez, poder executar em futuras versões de seu processador CISC.

ReferênciaTANENBAUM, 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

Page 36: Básico Redes de Comp

AULA 2 • COMPUTAçãO BÁSICA

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

Page 37: Básico Redes de Comp

AULA 3 • COMPUTAçãO BÁSICA

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

Objetivo

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

compreender os sistemas de representação numérica de base 2, 8, 10 •e 16 e suas conversões.

Pré-requisitos

Para iniciar os estudos desta aula, é importante conhecer a história da computação, estudado na primeira aula deste caderno, para que fique mais clara a necessidade e a importância dos sistemas posicionais de numeração. Também se faz necessário ter noções dos componentes básicos do compu-tador, conteúdos vistos na aula dois, uma vez que são eles que fazem uso de uma das representações que será estudada nesta aula: o sistema binário.

IntroduçãoAo longo da evolução humana, desde os primórdios, quantificar coisas,

objetos, rebanhos, entre outros, emergiu como uma necessidade. Assim, os números se tornaram presentes, desde cedo, na civilização.

Entretanto a representação numérica da forma como a conhecemos hoje não é uma invenção que apareceu de um dia para o outro e nem conseqüência de uma única mente inventiva. A utilização dos dedos da mão para representar quantidade, ou seja, alguma grandeza numérica, talvez seja a primeira forma que apareceu. Hoje em dia parece natural essa forma de representação, afinal é comum vermos crianças indicarem suas idades com os dedos da mão.

Pedras, nós em cordas, marcas em um osso e símbolos unitários pintados nas paredes de cavernas também são outras formas de representação numérica. Imagine-se nas cavernas representando o número quinze nas paredes desta forma: | | | | | | | | | | | | | | |. É fácil perceber que é uma tarefa exaustiva.

Aula 3Sistemas posicionais

de numeração

Page 38: Básico Redes de Comp

AULA 3 • COMPUTAçãO BÁSICA

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

Um pouco mais adiante na história, apareceram os números romanos (até hoje utilizados para referenciar séculos) utilizado em todo o império romano. Nessa forma de representação, ou nesse sistema numérico, letras são os símbolos utilizados para representar quantidades. Nesse sentido, cada letra representa uma quantidade pré-definida. Veja exemplos na tabela 1.

Tabela 1 – Exemplos de números representados no sistema numérico romano

ROMANA REPRESENTAçãOI 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).

Page 39: Básico Redes de Comp

AULA 3 • COMPUTAçãO BÁSICA

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

Mas você já parou para pensar e tentar descobrir o porquê da popula-rização da sistema de base 10 em relação aos dos demais tipos de base? A resposta é simples. Lembra-se de que no início da aula foi exposto que os dedos talvez tenha sido a primeira forma de representação numérica pelo ser humano e é uma representação natural? Pois bem, a reposta está aí. O sistema decimal se destaca exatamente porque o ser humano tem 10 dedos. Ao contrário do que muita gente pensa, de que o sistema decimal é mais fácil de se trabalhar, os demais sistemas funcionam exatamente iguais aos de base 10. Entretanto podemos achar mais simples o decimal exatamente por estarmos acostumados desde criança com essa forma de representação.

Como veremos a seguir, todas as representações posicionais são regidas por uma única lei: lei de formação.

Vejamos como se compoe um número pela lei de formação:

Número = an ∙ bn + an-1 ∙ b

n-1 + an-2 ∙ bn-2 + ... + a0 ∙ b

0

em que:

b = base do número (exemplo: base 2, 8, 10 e 16)

n = quantidade de algarismos - 1

an = algarismos de acordo com sua posição (daí o nome sistema posicional)

Exemplo

O número 1982 no sistema decimal é composto por 1 milhar, 9 centenas, 8 dezenas e 2 unidades.

1000 + 900 + 80 + 2 = 1982

Esse número pode ser decomposto também da seguinte maneira:

1982 = 1000 + 900 + 80 + 2

= 1x1000 + 9x100 + 8x10 + 2x1

= 1x103 + 9x102 + 8x101 + 2x100

Note que a última linha é a representação do número 1982 no sistema decimal pela lei de formação. Nesse sentido, a idéia é adotar pesos dife-rentes para posições diferentes de algarismos (idéia de representação posi-cional). Assim, quanto mais à esquerda, maior seu peso, sempre 10 (base) vezes maior.

Page 40: Básico Redes de Comp

AULA 3 • COMPUTAçãO BÁSICA

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

3.1 Sistema binário (Base 2)

Vimos que o sistema decimal (base 10) utiliza dez símbolos diferentes para representar qualquer número natural. No sistema binário, como o próprio nome diz, existem apenas 2 símbolos para se representar: 0 (zero) e 1 (um).

Como já foi exposto anteriormente, o sistema binário obedece à lei de formação. Vejamos.

O número 1001, no sistema binário, de acordo com a lei de formação, é composto da seguinte forma:

1 = 1x23 + 0x22 + 0x21 + 1x20

O número 11011, no sistema binário, de acordo com a lei de formação, é composto da seguinte forma:

11011 = 1x24 + 1x23 + 0x22 + 1x21 + 1x20

Idoeta e Capuano (1998, p. 2) expõem que, no sistema binário

para representarmos a quantidade zero, utilizamos o algarismo 0, para representarmos a quantidade um, utilizamos o alga-rismo 1. E para representarmos a quantidade dois, se nós não possuímos o algarismo 2 nesse sistema? É simples. No sistema decimal, nós não possuímos o algarismo dez e representamos a quantidade de uma dezena utilizando o algarismo 1 seguido do algarismo 0. Neste caso, o algarismo 1 significa que temos um grupo de uma dezena e o algarismo 0 nenhuma unidade, o que significa dez.

Essa mesma idéia está presente também no sistema binário, proveniente da lei de formação. Para se representar o número dois, é utilizado o algarismo 1 seguido do algarismo 0. Assim, o algarismo 1 representa dois elementos (base 2 ao invés de 10 do sistema decimal) e 0 representa nenhuma unidade.

Ao contrário do decimal, em que cada posição de algarismo recebe um nome (unidade, dezena, centena, milhar, etc), no binário cada algarismo é chamado de bit (binary digit – dígito binário, em português). As denominações no sistema binário aparecem pela quantidade de bits. Veja tabela 2.

Tabela 2 – Nibble, Byte, Word

BITS DENOMINAçãO4 Nibble8 Byte16 Word

Page 41: Básico Redes de Comp

AULA 3 • COMPUTAçãO BÁSICA

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

Gates (1995) apresenta uma forma diferente, no intuito de facilitar o entendimento, sobre o 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 de 128 watts

Lâmpada de 64 watts

Lâmpada de 32 watts

Lâmpada de 16 watts

Lâmpada de 8 watts

Lâmpada de 4 watts

Lâmpada de 2 watts

Lâmpada de 1 watts

interruptor interruptor interruptor interruptor interruptor interruptor interruptor interruptor

Figura 1 – Lâmpadas de intensidade diferentes com seus interruptoresFonte: Gates (1995).

No ambiente, há um interruptor para cada lâmpada e elas são arranjadas em ordem crescente de potência da direita para a esquerda, ou seja, a de maior potência está mais à esquerda e a de menor mais à direita (note que é a mesma idéia dos pesos da lei de formação). Dessa forma, ao ligar e desligar os interruptores, é possível ajustar a iluminação do ambiente.

Se quiser somente 1 watt de luz, liga só o interruptor mais à direita. Se quiser 191 watts, liga todos os interruptores, com exceção do da lâmpada de 64 watts. Assim como se você quiser ajustar o nível de iluminação em 137 watts, ligam-se as lâmpadas de 128, 8 e 1 watts, como representado na figura 2.

Lâmpada de 128 watts

Lâmpada de 64 watts

Lâmpada de 32 watts

Lâmpada de 16 watts

Lâmpada de 8 watts

Lâmpada de 4 watts

Lâmpada de 2 watts

Lâmpada de 1 watts

interruptor interruptor interruptor interruptor interruptor interruptor interruptor interruptor

Figura 2 – Interruptores ajustados para produzir 137 wattsFonte: Gates (1995).

Page 42: Básico Redes de Comp

AULA 3 • COMPUTAçãO BÁSICA

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

Gates (1995, p. 41) complementa que

para encurtar ainda mais a notação, você pode registrar cada “desligado” com 0 e cada “ligado”com 1. O que significa que, em vez de escrever “ligado, desligado, desligado, desli-gado, ligado, desligado, desligado, ligado”, vale dizer, ligue a primeira, a quarta e a oitava das oito lâmpadas e deixe as outras desligadas, você escreve a mesma informação como 1, 0, 0, 0, 1, 0, 0,1, 1 ou 10001001, um número binário. No caso, é 137.

A idéia de ligar e desligar interruptores é a que está por trás do sistema binário, como vimos. A princípio pode até parecer complicado, mas no sistema decimal essa mesma idéia é utilizada, regida pela lei de formação.

3.2 Sistema octal (Base 8)

O sistema octal, intuitivamente, nos induz que nesse sistema de numeração existem oito símbolos diferentes para se representar qualquer número natural, são eles: 0, 1, 2, 3, 4, 5, 6 e 7.

O sistema octal também obedece à lei de formação. Vejamos.

O número 735 no sistema octal, de acordo com a lei de formação, é composto da seguinte forma:

735 = 7x82 + 3x81 + 5x80

3.3 Sistema hexadecimal (Base 16)

O sistema hexadecimal possui 16 símbolos de representações. Como já vimos, os algarismos arábicos são apenas dez e, sendo assim, faltam ainda seis algarismos. Desse modo, o sistema hexadecimal fica constituído pelos seguintes símbolos ordenados crescentemente:

0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F

Note que A=10, B=11, C=12, D=13, E=14 e F=15. Lourenço e outros (1996, p. 7) dizem que “outros símbolos poderiam ser utilizados para repre-sentar as quantidades maiores que 9, porém, as letras foram escolhidas pela facilidade de manuseio”.

A lei de formação também rege o sistema hexadecimal, uma vez que ele também é um sistema de representação posicional.

Page 43: Básico Redes de Comp

AULA 3 • COMPUTAçãO BÁSICA

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

Exemplo

O número A29F no sistema hexadecimal, de acordo com a lei de formação, é composto da seguinte forma:

A29F = Ax163 + 2x162 + 9x161 + Fx160

10x163 + 2x162 + 9x161 + 15x160

3.4 Padrões de representação

De acordo com Lourenço e outros (1996), existem vários padrões para se representar os números em diferentes bases. Os mais comuns são:

utilizar uma letra após o número para indicar a base;•

colocar o número entre parênteses e a base como um índice do número.•

Exemplos

Sistema decimal: 1673D ou (1673)10

Sistema binário: 1001B ou (135)2

Sistema octal: 753O ou (753)8

Sistema hexadecimal: F3AH ou (F3A)16

3.5 Tabela de conversão entre bases

Já vimos a idéia de alguns dos principais sistemas de representação posi-cional de números: decimal, binário, octal e hexadecimal. Conhecer suas equi-valências é de extrema importância para as conversões que serão estudadas mais adiante e são apresentadas na tabela 3.

Tabela 3 – Tabela de equivalência entre as bases 2, 8, 10 e 16

BASE 10 BASE 2 BASE 8 BASE 160 0 0 01 1 1 12 10 2 23 11 3 34 100 4 45 101 5 56 110 6 67 111 7 78 1000 10 89 1001 11 910 1010 12 A11 1011 13 B12 1100 14 C13 1101 15 D14 1110 16 E15 1111 17 F

Page 44: Básico Redes de Comp

AULA 3 • COMPUTAçãO BÁSICA

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

Faz-se necessário acrescentar que, assim como no sistema decimal, adicio-nando-se zeros à esquerda de um número em qualquer outra base, seu valor não é alterado.

Exemplos

a) 43610 = 043610 = 0043610 = 00043510

b) 111012 = 0111012 = 00111012 = 000111012

c) 6178 = 06178 = 006178 = 0006178

d) F4316 = 0F4316 = 00F4316 = 000F4316

3.6 Conversões de qualquer base para a base 10

Para se converter um número de qualquer representação posicional para a base 10, basta aplicar a lei de formação, substituindo b pela base do número a ser converto e an por seus algarismos.

Exemplos

(11011)2:b = 2 (base do número)n = 5 – 1 = 5 (quantidade de algarismos – 1)1x24 + 1x23 + 0x22 + 1x21 + 1x20

16 + 8 + 0 + 2 + 1 = (27)10

(3D9)16:b = 16 (base do número)n = 3 – 1 = 2 (quantidade de algarismos – 1)3x162 + Dx161 + 9x160

3x162 + 13x161 + 9x160

768 + 208 + 9 = (985)10

3.7 Conversão da base 2 para qualquer base

Acabamos de ver que, para se converter um número de qualquer base para o sistema decimal, é utilizada a lei de formação que são, basicamente, suces-sivas multiplicações dos algarismos por seus pesos. Agora queremos o inverso, do sistema decimal para as demais bases. Sendo assim, precisamos realizar a operação matemática inversa que utilizamos anteriormente, ou seja, a divisão.

Page 45: Básico Redes de Comp

AULA 3 • COMPUTAçãO BÁSICA

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

Lourenço e outros (1996, p. 9) dizem quedado um número inteiro escrito na base 10, para se obter seu equivalente em uma base b qualquer, divide-se o número por b tantas vezes quantas necessárias para que o quociente da divisão seja menor que b. O último quociente da divisão e os restos das divisões sucessivas, tomados na ordem inversa, correspondem ao número na base b.

Exemplo

(125)10 : ( ? )2

125 ÷ 2 = 62 e resto = 1

62 ÷ 2 = 31 e resto = 0

31 ÷ 2 = 15 e resto = 1

15 ÷ 2 = 7 e resto = 1

7 ÷ 2 = 3 e resto = 1

3 ÷ 2 = 1 e resto = 1

1 < 2 (base desejada)

Quando o quociente é menor que a base desejada, pára de se efetuar as divisões. O resultado da conversão é o último quociente concatenado com os restos das divisões do fim para o começo. Dessa forma, obtém (1111101)2.O mesmo exemplo anterior por ser visto na figura 3.

125 2

1 62 2

0 31 2

1 15 2

1 7 2

1 3 2

1 1

sentido da leitura

(125)10 = (1111101)2Figura 3 – Exemplo de múltiplas divisões na conversão do número (125)10 para a base 2Fonte: Lourenço e outros (1996).

Page 46: Básico Redes de Comp

AULA 3 • COMPUTAçãO BÁSICA

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

3.8 Conversão entre base 2 e 16

A conversã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)20010 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.

Page 47: Básico Redes de Comp

AULA 3 • COMPUTAçãO BÁSICA

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

Exemplo

(1010011011)2001 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)85 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)85 4 3

101 100 011Encontrado o binário, realiza-se a conversão da base 2 para a base 16.0001 0110 0011

1 6 3

Page 48: Básico Redes de Comp

AULA 3 • COMPUTAçãO BÁSICA

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

Na conversão de hexadecimal para octal, também é necessário um passo intermediário em que se utiliza o sistema binário. Assim, converte-se o número da base 16 para a base 2 e, em seguida, este para a base 8.

Exemplo

(1F4B)16

1 F 4 B

0001 1111 0100 1011Encontrado 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–1b

n–1 + an–2bn–2 + ... + a0b

0 + a–1b–1 + a–2b

–2 + ... + a–mb–m

Parte inteira Parte fracionária

em que:

b = base do número (exemplo: base 2, 8, 10 e 16).

n = quantidade de algarismos da parte inteira – 1.

an = algarismos de acordo com sua posição.

m = quantidade de algarismos da parte fracionária.

Vejamos alguns exemplos de conversão de números fracionários de outras bases para a base 10.

a) Base 2 para base 10

1101,0112 = 1 x 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

Page 49: Básico Redes de Comp

AULA 3 • COMPUTAçãO BÁSICA

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

b) Base 8 para base 10

51,348 = 5 x 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 x 2

0,50 1,0

0 1

7,42710 = 111,012

b) Base 10 para a base 2 (dízima periódica)

6,410 = parte inteira: 1102

parte fracionária:

0,4 x 2 = 0,8 0

0,8 x 2 = 1,6 1

Repetição 0,6 x 2 = 1,2 1

0,2 x 2 = 0,4 0

0,4 x 2 = 1,8 1

6,410 = 110,01100110011001100110...2

Page 50: Básico Redes de Comp

AULA 3 • COMPUTAçãO BÁSICA

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

c) Base 10 para a base 8

26,210 = parte inteira: 328

parte fracionária: 146314361...8 (dízima periódica)

0,2 x 8 = 1,6 1 0, 6 x 8 = 4,8 4 0,8 x 8 = 6,4 6 0,4 x 8 = 3,2 3 0,2 x 8 = 1,6 1

d) Base 10 para a base 16

69,124610 = parte inteira: 4516

parte fracionária: 1FE516... (não periódica)

Estamos chegando ao fim desta aula, em que expusemos que existem vários sistemas de numeração. Dentre os sistemas de numeração, os de repre-sentação posicional (atribuição de pesos para cada posição de algarismo) se destacam pela facilidade de realização de operações aritméticas, que serão estudadas na próxima aula.

Síntese da aula

O ser humano desde sempre teve a necessidade de quantificar coisas, por isso a importância de sistemas numéricos. Além disso, com as representações numéricas torna-se possível realizar tarefas antes complexas de forma trivial. Dentre as várias formas de representações, destacam-se a decimal (com dez símbolos de representações), a binária (com dois símbolos) – amplamente utilizada nos computadores, a octal (com oito símbolos) e a hexadecimal (com dezesseis símbolos).

Diante disso, foi explicado durante a aula como se realizar conversões entre essas quatro formas de representação, que obedecem a uma única lei: a lei de formação. Basicamente, a lei de formação atribui pesos para as posições de cada algarismo de um número (idéia de sistema posicional). Por fim, foi apresentado como se representar números fracionários nas bases 2, 8 e 16.

Page 51: Básico Redes de Comp

AULA 3 • COMPUTAçãO BÁSICA

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

Atividades

1. Realize a conversão dos números a seguir de acordo com as bases indicadas.

a) (F46A)16 = ( ? )10 c) (1001101)2 = ( ? )16

b) (295)10 = ( ? )2 d) (1A42)16 = ( ? )8

e) (765)8 = ( ? )10 g) (101,001)2 = ( ? )10

f) (1024)10 = ( ? )16 h) (B1,5)16 = ( ? )10

2. Leia as afirmativas a seguir sobre conversão de bases.

I. O número (765)10, (765)8 e (765)16 são iguais.

II. O número (11001110)2 é maior que (D1)16.

III. Os números (11101010)2 e (504C)16 são números pares.

Assinale a alternativa correta:

a) Somente I é verdadeira.

b) Somente II é falsa.

c) Somente III é verdadeira.

d) Todas as alternativas são verdadeiras.

Comentário das atividades

Na atividade 1, basta utilizar as conversões vistas durante a esta aula. Assim, as respostas corretas são (F46A)16 = (62570)10, (295)10 = (100100111)2, (1001101)2 = (4D)16, (1A42)16 = (15102)8, (765)8 = (501)10, (1024)10 = (400)16, (101,001)2 = (5,125)10, (B1,5)16 = (177,8)10.

Já na atividade 2, a resposta correta é a letra (c). O item (I) é falso porque (765)10 = (1375) 8 = (2FD)16. Já no item (II), o número (11001110)2 = 206 é menor que (D1)16 = (209)10, por isso é falsa. O item (III) é o único verdadeiro, pois (11101010)2 = (234)10 e (504C)16 = (20556)10. É necessário acrescentar que todo número binário terminado em 0 é par, assim como todo número octal terminado em 0, 2, 4 e 6, decimal terminado em 0, 2, 4, 6 e 8, e hexadecimal terminado em 0, 2, 4, 6, 8, A, C, E são pares. Os demais são ímpares. Se você conseguiu resolver estas atividades significa que compreendeu os sistemas de representação numérica de base 2, 8, 10 e 16 e suas conversões, que é o objetivo desta aula.

Page 52: Básico Redes de Comp

AULA 3 • COMPUTAçãO BÁSICA

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

ReferênciasGATES, 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

Page 53: Básico Redes de Comp

AULA 4 • COMPUTAçãO BÁSICA

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

ObjetivoEsperamos 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é-requisitosPara 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çãoO sistema binário é um sistema de numeração posicional representado, em

que todos os número são representados pelo conjunto de caracteres formados apenas por dois símbolos, 0 (zero) e 1 (um).

Os computadores digitais trabalham internamente com esse tipo de sistema, que também são denominamos como bits e podem representar qualquer tipo de número armazenado na memória. Esses números podem representar inteiros, ponto flutuante, negativos ou positivos.

A manipulação desses números por meio de aritmética simples e por meio de aritmética de ponto-flutuante é realizada utilizando algoritmos diversos, os quais serão apresentados durante esta aula.

4.1 Aritmética em sistemas binários

Os números podem ser representados utilizando qualquer base, seja ela binária, octal, decimal, hexadecimal ou outra qualquer. Para a computação

Aula 4Operações aritméticas no

sistema binário de numeração

Page 54: Básico Redes de Comp

AULA 4 • COMPUTAçãO BÁSICA

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

o sistema binário é o mais adequado devido à facilidade de implemen-tação via hardware dos símbolos que representam esse sistema por meio de circuitos lógicos.

No sistema binário, as operações aritméticas podem ser estendidas dire-tamente do mecanismo de cálculo utilizado no sistema decimal, que é mais comum para os seres humanos.

4.2 Notação de números binários positivos e negativos

Em aplicações práticas, os números binários devem ser representados com sinal. Uma maneira de fazer isso é adicionar um bit de sinal ao número. Esse bit é adicionado à esquerda do número. Se for 0, o número em questão é posi-tivo; caso seja 1, o número é negativo.

Outra forma de representação de números negativos bastante utilizada é o complemento de 2. Para obtermos o complemento de 2 de um número binário, precisamos inicialmente converter o número em seu complemento de 1. O complemento de 1 de um número binário obtém-se trocando cada bit pelo seu complemento. A seguir, soma-se 1 ao complemento de 1, obtendo-se assim o complemento de 2.

Um exemplo de notação em complemento de 2 é descrita na tabela 1.

Tabela 1 – Complementos de 1 e de 2

BINÁRIO COMPLEMENTO DE 1 COMPLEMENTO DE 211100110 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

Page 55: Básico Redes de Comp

AULA 4 • COMPUTAçãO BÁSICA

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

Se um carry ocorre no bit mais significativo, é gerada uma nova posição à esquerda do último bit, semelhante à aritmética decimal. A figura 1 ilustra uma simples adição, e a figura 2, uma adição em que ocorre carry no bit mais significativo.

(vai um) 1 1

6 = 0 1 1 0

+ 7 = 0 1 1 1

13 = 1 1 0 1

Figura 1: Operação de adição com carries ocorrendo antes do bit mais significativo

(vai um) 1 1 1

10 = 0 1 0 1 0

+ 7 = 0 0 1 1 1

17 = 1 0 0 0 1

Figura 2: Operação de adição com carry ocorrendo no bit mais significativo

No caso da operação de adição gerar um carry no bit mais significativo, acontece o que chamamos de overflow.

Overflow ocorre quando somamos dois operandos positivos e obtemos um resultado negativo, ou vice-versa (CASTRO, 2005).

Na operação de adição em números com notação em complemento de 2, somam-se os dois números e descarta-se o carry. Vejamos o exemplo demons-trado na figura 3.

(vai um) 1 1 1 1 1 1

15 = 0 0 0 0 1 1 1 1

- 6 = 1 1 1 1 1 0 1 0

9 = 1* 0 0 0 0 1 0 0 1

Figura 3: Soma de números binários em complemento de 2 (*Carry descartado)

4.4 Subtração em sistemas binários

A subtração utiliza também os mesmos princípios da operação reali-zada em sistemas decimais. Na tabela 3, exemplificamos a tabela básica de subtração em números binários.

Page 56: Básico Redes de Comp

AULA 4 • COMPUTAçãO BÁSICA

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

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

PRIMEIRO OPERANDO SEGUNDO OPERANDO RESULTADO DA SUBTRAçãO0 0 0

0 11, vai 1 para ser subtraído no dígito seguinte

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

Page 57: Básico Redes de Comp

AULA 4 • COMPUTAçãO BÁSICA

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

Na figura 6 é mostrado um exemplo de como se comporta a multiplicação de dois números.

1 0 1 1 Multiplicando

X 1 0 1 0 Multiplicador

0 0 0 0

+ 1 0 1 1

+ 0 0 0 0

+ 1 0 1 1

1 1 0 1 1 1 0Figura 6: Exemplo de multiplicação com binários

A tabela básica para multiplicação de números binários é mostrada na tabela 4.

Tabela 4 – Tabela básica da operação binária de multiplicação

PRIMEIRO OPERANDO

SEGUNDO OPERANDO

RESULTADO DA MULTIPLICAçãO

0 0 0

0 1 0

1 0 0

1 1 1

Uma observação importante a respeito da multiplicação de números biná-rios é que os números de bits do produto final é maior do que o número de bits do multiplicando ou do multiplicador, como fica evidente na figura 4. Além disso, a multiplicação também precisa tratar a ocorrência do overflow.

Castro (2005), levando em consideração os dígitos binários 0 e 1, diz que temos apenas duas possibilidades de escolha, a cada passo da multiplicação:

coloque uma cópia do multiplicando no lugar apropriado, se o dígito •do multiplicador for igual a 1;

coloque 0 no lugar apropriado, se o dígito do multiplicador for igual a 0.•

Considerando isso, Castro (2005) diz que é necessário desenvolver um algoritmo em hardware que seja eficiente para realizar a multiplicação.

Um método elegante de multiplicar números com sinal recebeu o nome de Algoritmo de Booth. O Algoritmo de Booth funciona com base em que a partir do momento que você pode adicionar ou subtrair números binários, você pode chegar a um produto qualquer.

Page 58: Básico Redes de Comp

AULA 4 • COMPUTAçãO BÁSICA

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

O algoritmo utiliza a notação em complemento de 2 e foi inventado em 1951 por Andrew D. Booth, enquanto fazia cristalografia no Colégio Birkbeck, em Bloomsbury, Londres.

4.6 Divisão em sistemas binários

A divisão em sistemas binários é feita utilizando-se das mesmas técnicas dos outros sistemas, bastando para isso obedecer a algumas regras na hora da subtração.

Na divisão do número 6 pelo número 2, temos a operação mostrada na figura 7, na qual o quociente é 3.

1 1 0 1 0

– 1 0 1 1

0 1 0

– 1 0

0 0

Figura 7: Exemplo de divisão com binários

4.7 Aritmética de ponto-flutuante

Números de ponto-flutuante normalmente são difíceis de serem repre-sentados computacionalmente, pois os mesmos podem ser muito extensos ou podem ser infinitos.

As operações aritméticas utilizando números de ponto-flutuante são muito onerosos e, por isso, foi necessário implementá-los em hardware para que pudessem ter um desempenho aceitável.

Mano (1998) descreve os algoritmos que podem ser utilizados nas opera-ções aritméticas de ponto flutuante, pois como muitos computadores não possuem a aritmética de ponto-flutuante implementada em hardware, é preciso tratá-la via software. Os algoritmos são os a seguir.

4.7.1 Soma e subtração

Verifica-se se uma das mantissas a operar é zero; caso afirmativo:

se for uma soma e uma das parcelas for zero – o resultado é igual a •outra parcela;

se for uma subtração e o subtraendo for zero – o resultado é igual ao •minuendo;

Page 59: Básico Redes de Comp

AULA 4 • COMPUTAçãO BÁSICA

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

se for uma subtração e o minuendo for zero – o resultado é igual ao •subtraendo, com o sinal invertido.

Se não houver zeros:

reduzir ao mesmo expoente (o maior);•

somar / subtrair as mantissas;•

normalizar o resultado.•

4.7.2 Multiplicação

Verifica-se se uma das mantissas a operar é zero; caso afirmativo, o resul-tado é zero.

Se não houver zeros:

somar os expoentes;•

multiplicar as mantissas;•

normalizar o resultado.•

4.7.3 Divisão

Verifica-se se uma das mantissas a operar é zero; caso afirmativo:

se o divisor é zero, é impossível e dispara uma exceção de divisão •por zero;

se o dividendo é zero, o resultado é igual a zero.•

Se não houver zeros:

subtrair os expoentes;•

dividir as mantissas;•

normalizar o resultado.•

Para se padronizar a implementação de aritmética de ponto-flutuante em CPUs, foi criado em 1985 o padrão IEEE 754, o qual está implementado atualmente na grande maioria das CPUs. O padrão IEEE 754 dita algumas características citadas em Viana (2005), que são:

a base de representação é a binária;•

as operações devem ser executadas em precisão estendida com uso •de dígitos de guarda e expoente deslocado;

o uso do expoente deslocado, também chamado característica, tem •por objetivo eliminar o sinal do expoente.

Page 60: Básico Redes de Comp

AULA 4 • COMPUTAçãO BÁSICA

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

Nas operações aritméticas em ponto-flutuante, após cada operação é realizado o arredondamento, por isso as operações de adição, subtração, multiplicação e divisão não associativas nem distributivas.

Além dos erros que podem ser ocasionados por arredondamento, alguns efeitos afetam a qualidade dos cálculos, como cancelamento, propagação de erros, instabilidade numérica e mau condicionamento. Esses quatro tipos de erros são relatados da seguinte forma:

o cancelamento ocorre na subtração de dois números quase iguais, •pois o expoente permanece o mesmo e os dígitos iniciais são todos zeros, perdendo-se dígitos significativos do resultado;

a propagação de erros ocorre quando uma ou mais somas parciais •têm o expoente maior do que a soma final;

a instabilidade numérica ocorre se um resultado intermediário é conta-•minado por um erro de arredondamento. Esse erro pode influenciar todos os resultados subseqüentes que dependem desse valor, propa-gando, assim, os erros de arredondamento;

problemas cujos resultados dependem continuamente dos dados de •entrada são ditos bem postos, em oposição aos problemas mal postos, mal condicionados ou críticos.

Síntese da aula

Nesta aula, vimos que as operações aritméticas sobre números binários obedecem sempre aos mesmos princípios das operações em outras bases. Pudemos conhecer também alguns algoritmos que possibilitam que as opera-ções fiquem mais velozes quando implementadas em hardware. Também vimos, na aula 4, que a aritmética de ponto flutuante é bem mais complicada e ajuda a entender melhor as dificuldades de desenvolvimento de circuitos que suportam aritmética de ponto-flutuante. As operações aritméticas sobre números binários são de extrema importância para os computadores digitais atuais, pois somente com uma aritmética simples e eficiente podemos chegar a unidades lógicas e aritméticas aceitáveis.

Atividade

1. Desenvolva as operações aritméticas envolvendo os seguintes números binários:

Page 61: Básico Redes de Comp

AULA 4 • COMPUTAçãO BÁSICA

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

a) 01110011 + 01110101

b) 11010001 – 00101111

c) 11011010 * 11010

d) 11011000 / 10

Comentário da atividade

Na atividade 1, trabalharemos a capacidade de o aluno desenvolver as opera-ções aritméticas básicas utilizando números binários. Os resultados das operações são os seguintes, utilizando o método de resolução proposto na lição 4:

a) (vai um) 1 1 1 1 1 1

0 1 1 1 0 0 1 1

+ 0 1 1 1 0 1 0 1

1 1 1 0 1 0 0 0

b) (empresta) * * * * *

1 1 0 1 0 0 0 1

– 0 0 1 0 1 1 1 1

1 0 1 0 0 0 1 0

c) 1 1 0 1 1 0 1 0

x 1 1 0 1 0

0 0 0 0 0 0 0 0

+ 1 1 0 1 1 0 1 0

+ 0 0 0 0 0 0 0 0

1 1 0 1 1 0 1 0

+ 1 1 0 1 1 0 1 0

1 0 1 1 0 0 0 1 0 0 1 0 0

d) 1 1 0 1 1 0 0 0 1 0

1 0 1 1 0 1 1 0 0

0 1 0

1 0

0 0 1 1

1 0

0 1 0

1 0

0 0 0 0

Page 62: Básico Redes de Comp

AULA 4 • COMPUTAçãO BÁSICA

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

ReferênciasCASTRO, 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

Page 63: Básico Redes de Comp

AULA 5 • COMPUTAçãO BÁSICA

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

Objetivo

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

identificar e compreender as características quanto à classificação dos •softwares livres e proprietários, bem como suas sub-divisões.

Pré-requisitos

Para iniciarmos os estudos sobre as classificações de software, é interes-sante que tenha sido absorvido todo o conteúdo das aulas anteriores. Isso dará embasamento teórico para que possam ser interpretados todos os conceitos e características que serão considerados nesta aula e são de extrema impor-tância para o mercado.

Introdução

A criação de software, ou como conhecido popularmente programa para computador, consiste em uma área da ciência da computação muito importante, em que é considerada a criação de produtos de software por meio da utilização de ferramentas de desenvolvimento, pagas ou não, além de considerar todo um patrimônio intelectual e ideológico de seus criadores (MOLINARI, 2007).

Esse tema, por sua vez, apresenta diversas vertentes e discussões que devem ser consideradas quanto à distribuição e comercialização de um produto de software. Entre tais vertentes, temos a criação de software proprietário ou livre, que consiste no ponto central de muitas discussões. Assim, nesta aula, serão apresentados os principais conceitos e caracte-rísticas que o auxiliarão a compreender tais classificações de software. Bons estudos!

Aula 5Classificação de software

Page 64: Básico Redes de Comp

AULA 5 • COMPUTAçãO BÁSICA

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

5.1 Software livre

Desde os primórdios da história da computação, quando do início da criação de software para os computadores gigantescos, para não se dizer jurássicos, um tema é bastante discutido nas rodas de desenvolvedores, a classificação do software. Isso se deve a aspectos existentes no processo de criação de um software, que envolve tanto direitos autorais quanto intelectuais que devem ser respeitados. Nos últimos anos, a vertente de software livre tem ganhado considerável força devido ao fato da crescente visão de que, segundo a Free Software Foundation (FSF) (2007), “Software Livre é uma questão de liberdade, não de preço. Para entender o conceito, você deve pensar em liber-dade de expressão, não em cerveja grátis”.

Isso define com clareza a intenção por trás de um software livre, em que a caracterização como livre ou não, não consiste necessariamente em sua gratui-dade. Mas você deve estar se perguntando: “mas não é gratuito? Onde está a liberdade nisso então?” Fique calmo, iremos trabalhar com mais detalhes as subdivisões dessa interessante classificação de software.

Toda essa controvérsia deve-se ao fato de existir muita confusão quanto à utilização do termo livre, uma vez que vem do inglês free, que pode ser tradu-zido tanto como gratuito ou mesmo livre. O ponto central do software livre se baseia na idéia de se dar liberdade para que usuários executem, copiem, distribuam, estudem, aperfeiçoem e modifiquem um software levando em consi-deração suas características, expectativas e necessidades, contribuindo para uma visão construtivista e evolucionária em que diversas pessoas podem traba-lhar para torná-lo melhor (OSI, 2007).

Agora você deve estar se questionando: “mas como trabalhar para torná-lo melhor se foi outra pessoa que o criou, o que posso fazer?” Aí entra uma caracte rística importantíssima de um software livre, que consiste na disponibili-zação de seu código fonte para que outras pessoas possam utilizar, alterar ou mesmo re-distribuir o software com suas alterações. Isso contribui sensivelmente para que diversas pessoas tenham acesso à informação, difundindo conheci-mento e incentivando a pesquisa científica (FSF, 2007).

A (FSF, 2007) menciona que, para que um software seja considerado livre, ele deve necessariamente possuir os quatro princípios da liberdade. São elas:

liberdade n.• o 0: o usuário deve ter a liberdade de executar o programa, para qualquer propósito;

Page 65: Básico Redes de Comp

AULA 5 • COMPUTAçãO BÁSICA

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

liberdade n.• o 1: o usuário deve ter a liberdade de estudar e adaptar o programa para as suas necessidades. O acesso ao código-fonte é um pré-requisito para essa liberdade;

liberdade n.• o 2: o usuário deve ter a liberdade de redistribuir cópias de modo que possa ajudar ao próximo;

liberdade n.• o 3: o usuário deve ter a liberdade de aperfeiçoar o programa e disponibilizar seus aperfeiçoamentos, de modo a benefi-ciar toda a comunidade. O acesso ao código-fonte é um pré-requisito para esta liberdade.

Quando se trabalha com um tema como a classificação de software, é importante se conhecer em sua essência todos os conceitos que a diferenciam, e assim formar opinião consiste sobre o assunto. Então, sugerimos que sejam realizadas leituras a materiais complementares, como os existentes no site da Free Software Foundation (<http://www.gnu.org>) ou no site da Open Source Iniciative (<http://www.opensource.org>).

Saiba mais

Como pode ser visto, o acesso ao código fonte é um dos pilares para a caracterização de um software livre. Isso não significa que o mesmo não seja comercial, muito pelo contrário. A idéia de se ganhar dinheiro com software livre não está na venda de produtos fechados, mas sim na venda de serviços de qualidade que estão, a todo momento, expostos, sendo colocados à prova e ao julgamento da comunidade (MOLINARI, 2007).

Um software, quando se diz livre, geralmente está regido pela GPL (General Public License), que consiste na designação da licença para software livre criada por Richard Stallman no final da década de 1980, regido pela Free Software Foundation, sendo utilizado por grandes projetos, como o do sistema operacional Linux (FSF, 2007). Assim, esta vertente da classificação de software pode ser divida em duas sub-divisões, que são: Open Source e Livre Comercial, tratados a seguir.

5.1.1 Open Souce

Esse tipo de software segue todos os preceitos citados até aqui nesta aula, no qual o código fonte é distribuído e é permitido que esse seja modificado e redistribuído, levando em consideração os princípios de liberdade do software original. Isso auxilia na prevenção de sua utilização sem fins comerciais, estando

Page 66: Básico Redes de Comp

AULA 5 • COMPUTAçãO BÁSICA

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

sujeitos aos termos da licença GPL. Alguns exemplos de softwares open source são o kernel do sistema operacional Linux e o projeto Web Apache TomCat, que podem ser alterados e redistribuídos (FSF, 2007).

5.1.2 Livre comercial

Como já mencionado nesta aula, o software livre não exclui a possibili-dade de sua utilização comercialmente, sendo distribuído mediante o paga-mento. Porém isso, comercialmente, é comprometido, uma vez que está sob as regras 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

Page 67: Básico Redes de Comp

AULA 5 • COMPUTAçãO BÁSICA

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

da vertente mais comercial dos softwares, no qual são considerados direitos autorais e ideológicos envolvendo custo ou, como também são conhecidos, os softwares proprietários.

O software livre é muito utilizado no contexto acadêmico, porém nada impede ou mesmo inviabiliza que um software desenvolvido sobre um ambiente puramente acadê-mico tenha fins comerciais de mercado, um exemplo claro disso consiste no Google, que foi desenvolvido em um ambiente universitário.

Pensando sobre o assunto

5.2 Software proprietário

Depois de conhecida toda a ideologia existente por trás dos softwares livres, chegou a vez de discuti-lo como um bem material que envolve custos e até mesmo segredos de mercado. Opiniões quanto ao software livre como uma grande utopia, ou como uma idéia muito à frente de seu tempo, podem ser encontradas facilmente na Internet e no mercado.

O que é pregado em defesa do software proprietário é melhor analisado quando utilizada uma analogia. Por exemplo: um grande chefe de cozinha, por cozinhar muito bem, tem todo o direito de abrir um restaurante e vender suas deliciosas iguarias. Ninguém pode obrigá-lo a ensinar ou mesmo a distri-buir suas receitas gratuitamente para que os outros a utilizem. Alguns chefes fazem questão de compartilhar seus conhecimentos, já outros não, ficando a critério do cliente o pagamento ou não pela degustação da iguaria.

Assim, voltando ao software, o que é fornecido tem um preço que é defi-nido de acordo com a utilidade que este software tem para uma determinada pessoa que pague o valor sugerido, mesmo que outros discordem completa-mente desse ponto de vista (MOLINARI, 2007).

Um software comercial ou proprietário é distribuído sem a disponibi-lização de seu código fonte, sendo normalmente comercializado sob os termos de licença de uso, e não de propriedade. O que acontece nesse caso é que, ao adquirir um software, uma pessoa está se comprometendo somente a utilizá-lo, sem direito algum sob aspectos de comercialização ou mesmo de sua redistribuição, sob penas e multas severas. Exemplos desse tipo de software é o sistema operacional Microsoft Windows e o assistente gráfico Corel Draw.

Page 68: Básico Redes de Comp

AULA 5 • COMPUTAçãO BÁSICA

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

Alguns softwares se utilizam de licenças um tanto quanto diferentes, como a Postcardware e a StampwareCardware, no qual o desenvolvedor exige o feedback por parte dos usuários da ferramenta por meio de postais ou cartas para só então liberar o registro do software.

Saiba mais

Uma grande quantidade de softwares proprietários disponibiliza versões gratuitas para testes e pode ser classificada como:

shareware• : software que, após certo tempo de utilização, ou mesmo número de utilizações, indisponibiliza suas funcionalidades, sendo necessário o registro, no caso o pagamento de uma taxa ao proprie-tário do software, ou sua exclusão do computador. Muitas empresas proprietárias que desenvolvem software optam pela agregação de serviços aos usuários registrados, a fim de fidelizar o cliente;

demo• : serve como um demonstrativo para análise da viabilidade da aquisição do produto. É muito comum a utilização dessa modalidade de distribuição em jogos, que disponibilizam fases, possibilitam a cons-trução de opinião (se vale ou não a pena adquirir o produto), e são uma versão que não expira e nem pode ser registrada, sendo neces-sária a substituição de todo o software, caso opte por adquiri-lo;

trial• : é semelhante à distribuição demo, porém se aplica geralmente a softwares funcionais, como editores de texto e planilhas eletrônicas, limitando-os de maneira a não permitir, por exemplo, a edição de trabalhos ou mesmo não possibilitando que sejam realizadas a persis-tência deles na máquina, ou seja, salvar os documentos. Geralmente são liberados todos os recursos do software, limitando somente alguns pontos chaves. Assim, pode ser utilizado todo o potencial da ferra-menta para aprendizado por tempo indeterminado, porém sempre se lembrando das limitações já citadas.

Em sua maioria, os softwares proprietários são conhecidos como Software Box, ou melhor, softwares de caixinha. Compra-se um produto finalizado e o usuário tem pouco ou senão nenhum poder de alteração, de manipulação sobre o que está sendo adquirido ou mesmo poder para sua customização.

Pensando sobre o assunto

Page 69: Básico Redes de Comp

AULA 5 • COMPUTAçãO BÁSICA

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

Finalizando esta aula, é interessante considerarmos que as divisões de softwares apresentadas não são as únicas disponíveis, mas as principais e mais utilizadas para a classificação de software. Essas classificações refletem a idéia e a vontade de como os programas de computadores devem ser utilizados, segundo a visão do desenvolvedor e proprietário dos direitos.

Existem ainda diversos métodos que podem ser utilizados na classificação de software como, por exemplo, a permissão de utilização de software gratui-tamente, em que é possível que haja um processo de reciprocidade por meio de uma doação voluntária por parte dos usuários.

Outro exemplo de classificação das distribuições de software consiste na iniciativa da Microsoft em lançar seus produtos sob licença Shared Source, isso devido a apelos principalmente da comunidade européia quanto à dispo-nibilização do código fonte. Sob esse tipo de licença, a Microsoft permite que parceiros, empresas e governo tenham acesso ao código fonte de seus produtos, minimizando incidentes que, segundo muitos, caracterizam um mono-pólio do mercado de software, porém sem que seja permitida a alteração e redistribuição dos produtos da empresa (OSI, 2007).

Isso provoca discussões que mostram como é difícil definir qual a melhor forma de distribuição de software. As classificações apresentadas nesta aula apontam para diversos pontos que devem ser considerados e que influen-ciam diretamente na contextualização e, por conseqüência, classificação dos softwares, como valores culturais e contribuições sociais. São vertentes comple-tamente diferentes que apresentam prós e contras, mas que, com certeza, contribuem para um melhor modelo de produção de conhecimento e dissemi-nação da informação, cada uma à sua maneira.

Síntese da aula

Nesta aula, apresentamos as características e conceitos relacionados a classificação de software. Esses podem ser divididos em duas vertentes: a livre e a considerada proprietário. Além disso, conhecemos nomenclaturas comuns a classificação dos softwares como: freeware, adware, shareware, demo e trial. Cada uma destas distribuições caracteriza o software quanto às suas limitações e tempo de utilização. Finalizando, são apresentadas algumas classificações menos conhecidas, como a Shared Source.

Page 70: Básico Redes de Comp

AULA 5 • COMPUTAçãO BÁSICA

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

Atividades1. 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 atividadesNa 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ênciasFSF, Free Software Foundation. FreeSoftware. 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. OpenSource. Disponível em: <http://www.open-source.org>. Acesso em: 20 dez. 2007.

Na próxima aulaVeremos os conceitos relacionados a noções básicas tanto de redes de

computadores quanto de banco de dados.

Page 71: Básico Redes de Comp

AULA 6 • COMPUTAçãO BÁSICA

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

Objetivos

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

compreender quais são os tipos de redes existentes e como elas são •interligadas entre si;

entender o funcionamento de um banco de dados e como ele é útil •para manipular informações.

Pré-requisitos

Para o aprendizado desta aula, não há necessidade de conhecimentos anteriores, apenas que você tenha força de vontade para conhecer novas tecnologias e procure saber mais sobre o que será falado aqui em sites e livros relacionados com essas duas áreas.

Introdução

A interligação de computadores ou uma rede de computadores se faz necessário pelo fato de que há uma grande facilidade em trocar informações sem a necessidade de mídias como disquete, CD ou DVD, como também compartilhar informações e aplicativos. Os bancos de dados têm como finali-dade gerar uma determinada informação por meio de um agrupamento logi-camente coerente de dados.

Organizações com centenas de escritórios dispersos por uma extensa área geográfica podem, com um simples apertar de um botão, examinar o status atual de suas filiais mais remotas. À medida que cresce nossa capa-cidade de colher, processar e distribuir informações torna-se ainda maior a demanda por formas de processamento de informações ainda mais sofisti-cadas (TANENBAUM, 2004).

Aula 6Noções básicas de redes de

computadores e banco de dados

Page 72: Básico Redes de Comp

AULA 6 • COMPUTAçãO BÁSICA

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

6.1 Tipos de redes de computadores

De acordo com a distância em que os computadores se encontram, podemos classificá-los em alguns tipos, conhecidos como:

redes locais• (LAN – Local Área Network): são interligações entre compu-tadores em uma área geralmente menor que 10km, de alta velocidade e de baixas taxas de erro;

redes metropolitanas• (MAN – Metropolitan Área Network): são interli-gações entre computadores em uma área geralmente maior que 10km, podendo alcançar até 100km;

redes geograficamente distribuídas• (WAN – Wide Área Network): são interligações entre computadores em uma área geralmente maior que 100km, em que o alcance pode se tornar até inter-continental.

Mais recentemente, surgiu um novo tipo de classificação chamado de Rede de Área Pessoal ou PAN (Personal Area Network), que consiste na interligação de dispositivos, como fone de ouvido, ou até mesmo celulares e computadores em que há um compartilhamento de dados por meio de redes bluetooth.

6.2 Topologias de redes de computadores

Os computadores podem ser interligados de várias formas entre si. Dependendo de como essa interligação foi feita, podemos classificá-las em:

barramento• – é um tipo de ligação multiponto em que há apenas uma única via de conexão e o acesso é compartilhado entre todos os compu-tadores nela conectados. Por não haver um tipo de hierarquia no envio de dados, nesse tipo de topologia de rede podem ocorrer “colisões de dados”, ou seja, mistura de dados no transcorrer da transmissão;

• anel – é um tipo de ligação fechada em que os computadores são interli-gados em seqüência na forma de um anel. As informações trocadas entre os computadores são preferencialmente unidirecionais, mas podem ser em qualquer direção. Um grande problema desse tipo de topologia de rede é que, se um falhar, toda comunicação pode ser comprometida;

estrela• – é um tipo de ligação ponto-a-ponto em que há um gerenciador central em que toda a comunicação é passada obrigatoriamente, com isso será garantido que a informação enviada seja entregue correta-mente ao seu destino. Esse tipo de topologia de rede é o mais usado na atualidade.

Page 73: Básico Redes de Comp

AULA 6 • COMPUTAçãO BÁSICA

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

Tanto na ligação ponto-a-ponto como na multiponto podemos ter três tipos de comuni-cações usadas no enlace dos dados, que são: simplex, usa apenas um dos sentidos do enlace; a half-duplex, que utiliza os dois sentidos do enlace, mas um por vez; e a full-duplex, que utiliza os dois sentidos do enlace simultaneamente.

Saiba mais

Podemos observar que o meio de transmissão entre cada uma dessas inter-ligações de computadores é diferenciado, como veremos na seção a seguir.

6.3 Meios de transmissão de redes de computadores

Os computadores, as impressoras, entre outros tipos de hardware comu-nicam-se 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.

Outro meio físico de comunicação é o ar, as chamadas redes wi-fi ou wireless como, por exemplo, ondas de rádio digital, satélites e espectro de difusão, que também podem transmitir dados a grandes distâncias e em grandes velocidades.

Saiba mais

Para que haja uma comunicação de dados entre computadores, impres-soras, scanners e etc, há necessidade de alguns tipos de dispositivos para interligá-los. Na seção a seguir, veremos alguns desses tipos.

Page 74: Básico Redes de Comp

AULA 6 • COMPUTAçãO BÁSICA

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

6.4 Dispositivos de transmissão de dados

Os dispositivos de redes a seguir são classificados em dois tipos: ativos e passivos. Os ativos são equipamentos de rede que têm regras pré-definidas, podendo escolher o melhor caminho de transmissão; já os passivos são equi-pamentos de rede que não têm regras pré-definidas atuando somente como um elo entre outros dispositivos. Esses dispositivos são:

pontes• (bridges) – são dispositivos que têm como objetivo expandir ou segmentar uma rede de computadores que utilizam o mesmo proto-colo, utilizando-se de protocolos distintos;

roteadores• (routers) – são dispositivos que têm como objetivo interligar redes de computadores fisicamente distintas, determinando por qual caminho a informação deve seguir para chegar ao seu destinatário;

repetidores• (repeaters) – são dispositivos que têm como objetivo rege-nerar o sinal atenuado pela distância, ou seja, aumenta a potência do sinal para que consiga atingir grandes distâncias;

concentrador• (hub) – são dispositivos com a finalidade de interligar vários computadores entre si. Por não comportar grandes volumes de dados, são recomendados para redes pequenas. Isso ocorre pelo fato de receber um sinal de um computador e o envia a todos os outros computadores da rede;

comutador• (switch) – são dispositivos semelhantes ao Hub, com a dife-rença de que possuem inteligência, ou seja, o sinal recebido por ele de um computador é enviado para o computador específico sem que os outros recebam essa informação.

Na comunicação entre esses dispositivos, temos quatro tipos de envio de dados, que são: anycast, em que a transmissão da informação é enviada e distribuída ao receptor mais próximo definido pelo roteador; broadcast, em que a transmissão da informação é enviada a muitos receptores ao mesmo tempo; multicast, em que a informação é enviada a vários receptores simultaneamente, utilizando a melhor estratégia de rotea-mento; e unicast, em que a transmissão da informação é feita a um único receptor.

Saiba mais

Após se falar tanto em comunicação de dados, veremos a seguir como são classificados os bancos de dados, seus usuários e como os dados podem ser gerenciados por um aplicativo.

Page 75: Básico Redes de Comp

AULA 6 • COMPUTAçãO BÁSICA

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

6.5 Tipos de banco de dados

Os bancos de dados podem ser classificados em quatro tipos distintos, dois praticamente em desuso e outros dois ainda em uso, que são atualmente usados por grandes SGBDs (Sistemas Gerenciadores de Banco de Dados) como MySQL, PostgreSQL entre outros. Esses bancos de dados são classificados como:

hierárquico• – é organizado como árvores e consiste em uma coleção de registros conectados entre si por ligações. Cada raiz é um pseu-donó em que cada nó é um registro;

rede• – é semelhante ao modelo hierárquico, com o diferencial de que cada registro filho pode ser ligado em mais de um registro pai;

relacional• – os dados são armazenados em tabelas e apresentados por meio de relações. É baseado na teoria dos conjuntos e na lógica de predicados;

orientado ao objeto• – os dados são armazenados na forma de objetos que obedecem a propriedades que são integradas a uma estrutura de dados.

Para a manipulação de um banco de dados, existem alguns tipos de usuá-rios, cada um com a sua função e com um envolvimento diferente dentro desse contexto. A seguir, veremos como são classificados esses usuários.

6.6 Usuários de banco de dados

Para distinguir a função em que cada usuário exerce em um banco de dados, podemos classificá-los como:

administradores de banco de dados• (DBA) – é o usuário chefe, com a função de supervisionar e gerenciar os recursos fornecidos e que serão utilizados pelo banco de dados, além de permitir ou não o acesso à base;

• analistas de banco de dados – são os projetistas, identificam a estru-tura apropriada para o armazenamento dos dados, tem uma proxi-midade maior com os usuário finais para poder moldar o banco de dados, de acordo com o que necessitam;

usuário finais• – são as pessoas que utilizam o banco de dados apenas para consultar, modificar e gerar algum tipo de relatório.

A seguir, veremos como é composto um SGBD (Sistema de Gerenciamento de Banco de Dados) e suas principais funções.

Page 76: Básico Redes de Comp

AULA 6 • COMPUTAçãO BÁSICA

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

6.7 Sistema de Gerenciamento de Banco de Dados (SGBD)

É uma coleção de programas que facilita a manipulação de uma base de dados. As principais funções de um SGBD são:

controle de redundância• – não permite que a mesma informação seja gravada em locais diferentes, o que ocasiona um problema na atuali-zação dos dados;

compartilhamento de dados• – utiliza-se de um ambiente multiusuário em que os dados são compartilhados em acessos simultâneos;

controle de acesso• – cada usuário tem um tipo de permissão para acesso ao banco de dados, somente o que for permitido pelo dba será acessado;

controle de transações• – toda transação deve ser realizada sem falhas ou interrupções, como, por exemplo, a atualização de uma conta bancária;

múltiplas interfaces• – há possibilidade de se programar, realizar consultas e interagir por meio de menus em linguagem natural;

relacionamento entre dados• – os dados são variados e estão inter-relacionados de várias maneiras, representando um complexo relacio-namento entre si;

backup• – deve-se ter uma facilidade para recuperar falhas e possibi-litar a cópia da base para não haver a perda de dados.

Pode-se observar que um SGDB tem várias funcionalidades para que a informação, que é o principal objeto de armazenamento, possa estar segura e com um conjunto de acessórios para seu uso.

Hoje, no mercado, temos muitos SGBDs de grande poder de armazenamento e segu-rança, como, por exemplo, MySQL, PostgreSQL, Oracle, SQL Server entre outros.

Saiba mais

Na próxima seção, veremos como é feita a manipulação e definição dos dados por meio de comandos que utilizamos para ajudar na construção de uma tabela de geração de informação.

Page 77: Básico Redes de Comp

AULA 6 • COMPUTAçãO BÁSICA

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

6.8 Structured Query Language (SQL)

Desenvolvida pela IBM em meados dos anos 60, tem como objetivo ser uma interface entre o usuário e o SGBD para manipular e definir os dados. O SQL é 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 aulaNesta 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.

Page 78: Básico Redes de Comp

AULA 6 • COMPUTAçãO BÁSICA

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

Atividades1. Em que consiste uma rede de computadores?

2. Qual a finalidade de um SGBD (Sistema de Gerenciamento de Banco de Dados)?

Comentário das atividadesNa 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ênciasRAMALHO, 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 aulaVeremos os tipos de profissões, as definições e como é o profissional de

cada uma delas.

Anotações

Page 79: Básico Redes de Comp

AULA 7 • COMPUTAçãO BÁSICA

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

Objetivos

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

conhecer as áreas de formação profissional mais comuns na área de •informática e ainda a situação da regulamentação das profissões;

entender as diferenças entre os diversos tipos de profissionais na área •de informática.

Pré-requisitos

O entendimento das aulas anteriores o tornará capaz de identificar os diversos segmentos atuais da área de Informática, tais como: comunicação de dados, cons-trução de softwares, arquitetura física de componentes de informática, entre outros.

Introdução

Atualmente, com o avanço diário dos recursos computacionais, a informá-tica está inserida nos mais diversos segmentos produtivos da sociedade. Junto a essa realidade, soma-se o fato de os computadores terem se tornado, hoje, um acessório tão comum quanto uma TV ou geladeira nos lares, estabeleci-mentos comerciais e industriais.

Diante desses fatores, torna-se indispensável a contratação de profissio-nais cada vez mais especializados para atender esses diversos segmentos, formando, assim, várias áreas de atuação profissional dentro da informática. Anteriormente, esse campo era formado por apenas quatro tipos de profissio-nais: analista, programador, operador e digitador.

Conheceremos, nesta aula, um pouco mais sobre as principais profissões na área de informática e ainda como anda a situação da regulamentação do registro profissional para todos que já atuam ou pretendem atuar nesta área.

Aula 7Profissões na área

de Informática

Page 80: Básico Redes de Comp

AULA 7 • COMPUTAçãO BÁSICA

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

7.1 Formação acadêmica

Como a Informática está presente em todos os segmentos do setor produtivo e ainda pelo motivo de os computadores terem tornado-se objetos tão comuns, amplia-se a necessidade de formação acadêmica voltada para esta área.

Na corrida para as especializações, surgem cursos com os mais diferentes nomes, mas possuindo currículos similares, formando profissionais para atuar em atividades semelhantes, o que ocasiona certa confusão entre os estudantes e até mesmo entre os próprios profissionais.

Devido ao fato de que as profissões da área de informática não são regu-lamentadas, ou seja, não existe um órgão fiscalizador, as universidades têm total liberdade para adotar o nome do curso. Como exemplo disso, temos os cursos de Informática, Análise de Sistemas, Ciência da Computação, Engenharia de Computação, Engenharia de Informação, Sistemas de Informação entre outros.

Vamos agora conhecer um pouco mais as profissões relacionadas à área da informática.

7.1.1 Cursos de Formação Superior

Conheceremos agora alguns cursos de formação de nível superior mais comuns na maioria das universidades públicas e particulares.

a) Engenharia da Computação

O Engenheiro da Computação trata de assuntos relativos à hardware (máquinas) que trabalham isoladamente (PCs) ou que compõem uma rede (ou sistema) de comunicações. É o responsável pela arquitetura da rede e da organização física de computadores e periféricos. Também projeta e constrói alguns tipos de hardware – computadores, teclados, monitores, impressoras, chips, placas de som e de vídeo, e ainda equi-pamentos de automação industrial e até mesmo de robótica.

O planejamento e administração da rede de computadores de uma empresa também estão entre suas atribuições. Devido ao seu vasto conhecimento da área, ainda é capaz de criar sistemas operacio-nais, desenvolver linguagens específicas e realizar atividades de pesquisas tecnológicas.

Esse curso tem duração média de cinco anos.

Page 81: Básico Redes de Comp

AULA 7 • COMPUTAçãO BÁSICA

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

b) Bacharel em Ciência da Computação

O bacharel em Ciência da Computação tem seu foco principalmente no desenvolvimento dos programas (softwares). Ele pode, ainda, organizar e desenvolver aplicativos (programas aplicados a determinado processo de trabalho) de acesso a bancos de dados ou ainda elaborar sistemas mais complexos, usados por bancos, lojas comerciais entre outros.

Pode ainda trabalhar com marketing e vendas, dando consultoria na escolha de equipamentos e na assistência técnica, planejando e anali-sando novos produtos, segundo a necessidade do mercado.

Esse curso tem duração média de quatro anos.

c) Analista de Sistemas

O Analista de Sistemas é o profissional que atua na concepção, na aplicação e na manutenção dos programas. Cabe a ele a adminis-tração do fluxo de informações geradas por uma rede de computa-dores e também a manutenção dos computadores.

Este curso tem duração média de 4 anos.

Nos Estados Unidos, não existe diferença entre Engenharia da Computação e Ciência da Computação, diferentemente do Brasil, onde a diferença básica é que Ciência da Computação é um curso mais prático, enquanto Engenharia de Computação é um pouco mais amplo, com conteúdos de Engenharia Elétrica, Engenharia de Sistemas e mesmo de Ciência da Computação.

Saiba mais

7.1.2 Escolhendo uma área de atuação

A partir das formações de nível superior anteriormente mencionadas, que podem ser encontradas nas mais diversas universidades do Brasil, podemos escolher algumas áreas específicas de atuação.

A seguir, veremos alguns exemplos de áreas específicas.

a) Administrador de Banco de Dados

Responsável pela manutenção e refinamento de bancos de dados corpo-rativos. A formação recomendada para esta área é a graduação em Engenharia da Computação, Processamento de Dados, Informática.

Page 82: Básico Redes de Comp

AULA 7 • COMPUTAçãO BÁSICA

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

Dentre suas atividades, destacamos manutenção e refinamento de bancos de dados, alterações na estrutura do banco para expansão e adapta-ções de sistemas, monitoramento e identificação de falhas para aper-feiçoamento de bancos de dados, coordenação de programadores.

b) Administrador de Redes

Responsável pela instalação, configuração e manutenção dos sistemas operacionais e de todos os serviços implementados; pesquisa de solu-ções de tecnologia; apoio à área de desenvolvimento de aplicações; suporte de último nível para as equipes de apoio aos usuários; confi-guração e manutenção do nível de segurança da rede.

c) Analista de Segurança

Responsável pela segurança da rede (equipamento, sistemas operacio-nais de servidores e clientes e programas utilizados). Também monitora tentativas de invasão e uso indevido de recursos da rede, além de definir e manter as regras de uso dos recursos computacionais da empresa.

d) Analista de Sistemas

Responsável pelo levantamento das necessidades do cliente e pela elaboração de um modelo conceitual do sistema a ser desenvolvido. Suas principais atividades são: levantamento de requisitos do sistema, definição de cronogramas, prototipação e modelagem de dados, desenvolvimento, testes, coordenação de implementação.

e) Analista de Software Básico

Profissional responsável por desenvolver e implementar sistemas de auto-mação e tempo real, assim como sistemas embutidos, fazendo uso de aplicações de baixo nível e de conhecimentos sobre sistemas de redes. Suas principais atividades dependem da empresa onde o profissional atue, ele pode estar envolvido com diversas áreas, tais como análise de requisitos e projetos, implementação de sistemas, entre outras.

f) Analista de Suporte

Profissional responsável pela instalação e configuração de software e hardware. A Análise de Suporte é uma atividade muito abrangente, que inclui desde as tarefas mais simples, como suporte ao usuário de Windows e Office, por exemplo, até as mais especializadas, como suporte a servidores.

Page 83: Básico Redes de Comp

AULA 7 • COMPUTAçãO BÁSICA

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

Suas principais atividades envolvem instalação e configuração de ambiente para o usuário (incluindo sistemas operacionais e principais aplicativos); instalação e configuração de servidores; desenho da rede interna da empresa.

g) Auditor de Sistemas

Profissional encarregado em auditar sistemas e redes corporativas, identificando fraudes e outros tipos de irregularidade, além de analisar políticas e investimentos necessários para a estrutura de informática do cliente.

Suas principais atividades envolvem a definição de estruturas de controles internos, identificar e quantificar fraudes, analisar investi-mentos e riscos, manter contato com o departamento técnico e de negócios da empresa.

h) Engenheiro de Hardware

Profissional responsável por conceber projetos hardware para compu-tadores, telecomunicações e outros tipos de equipamento eletrônico, com destaque para sistemas especialistas dedicados (controladores programáveis como sistemas de distribuição de eletricidade, infra-es-trutura de telefonia celular etc.).

Suas principais atividades envolvem concepção e análise de projetos, elaboração de relatórios técnicos detalhados, coordenação de suporte e de manutenção de hardware e, eventualmente, elaboração de protótipos.

i) Engenheiro de Software

Profissional responsável por criar, manter e auditar metodologias de desenvolvimento de sistemas em uma empresa.

Suas principais atividades envolvem criação, manutenção e auditoria de metodologias de desenvolvimento de sistemas; acompanhamento das métricas de desempenho e qualidade dos produtos gerados, comparando-as com as métricas-padrão do mercado; adequação do padrão de qualidade e desempenho dos projetos e produtos gerados com um planejamento financeiro, dentro da capacidade financeira da empresa; e seleção e triagem de produtos e serviços da área de software e sistemas que a empresa venha buscar externamente.

Page 84: Básico Redes de Comp

AULA 7 • COMPUTAçãO BÁSICA

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

j) Engenheiro de Telecomunicações

Profissional que monta, opera e faz manutenção de redes. Na área comercial, cria e adapta serviços de telecomunicação para clientes corporativos. Em planejamento, o profissional cria as redes que poderão dar suporte aos serviços obtidos pela área comercial.

Suas principais atividades são a de manter em funcionamento o equipa-mento, impedindo interrupções no sistema; especificar o hardware que vai construir a rede; fazer contato com fornecedores para adquirir novas tecnologias; e relacionar as necessidades dos clientes com as tecnolo-gias existentes, propondo novos serviços e novas composições de rede.

k) Programador Web

Profissional responsável pelo desenvolvimento de aplicações para Web.

Suas principais atividades são o desenvolvimento em HTML, aplica-ções para Internet e intranets, sites de comércio eletrônico.

l) Técnico em Hardware

Profissional que faz a manutenção da estrutura de hardware de uma empresa, identificando a causa de problemas nas máquinas (se são de hardware ou de software), e que soluciona os físicos.

Suas principais atividades envolvem a manutenção de computadores, com diagnóstico e reparo das falhas - encaminhando as de software para os profissionais encarregados.

m) Webdesigner

Responsável pela criação e adaptação de identidade visual, manu-tenção de páginas, digitalização e tratamento de imagens, diagra-mação, animações e confecção de banners.

n) Webdeveloper

Profissional especializado em desenvolvimento para Web. Utiliza o Webdevelopment como uma especialização da programação normal, ajustando-a às características próprias da Web e, assim, tornando-a dife-rente do desenvolvimento de sistemas para desktop ou cliente-servidor.

Suas principais atividades envolvem a análise de requisitos dos clientes, análise de sistema, modelagem de banco de dados, estimativas de tempo de desenvolvimento, codificação e testes.

Page 85: Básico Redes de Comp

AULA 7 • COMPUTAçãO BÁSICA

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

o) Webmaster

Responsável pela estrutura, desenvolvimento, design e gerência de sites, gerencia uma equipe envolvida com o ambiente Web, desde a infra-estrutura até o desenvolvimento de sites completos.

7.2 A regulamentação das profissões no Brasil

As profissões de Informática são, hoje, umas das poucas que ainda não possuem um órgão regulamentador. Ao contrário do que ocorre com as profis-sões da área de Direito, Medicina, Odontologia, Contabilidade, Jornalismo, Administração, entre outras, qualquer pessoa que acredite possuir conhe-cimento e competência suficientes para atuar na área e disponibilizar seus serviços ao mercado pode atuar como profissional da área de Informática.

A Informática brasileira enfrenta hoje um sério e real problema: Conselhos de outras profissões já estabelecidas estão avançando sobre a área na tenta-tiva de se apropriar de atribuições profissionais que até o presente foram exer-cidas livremente no país.

Várias tentativas foram feitas para solidificar esta profissão como algo inde-pendente e bem definido, com seu espaço próprio no mercado de trabalho. Sindicatos e associações profissionais e empresariais foram fundados. Entretanto, esta consolidação não se dá.

Um dos motivos que levam a pensar profundamente sobre a regulamen-tação da Informática é acabar com a concorrência injusta de pessoas que fazem cursos de curta duração e já saem exercendo atividades nesta área e muitas vezes realizam trabalhos de baixa qualidade o que acaba por causar uma má impressão sobre os profissionais desta área.

A regulamentação de uma profissão tem como objetivo a proteção da sociedade contra falsos profissionais, garantindo assim que, ao se contratar algum serviço, tenha-se certeza de que aquele profissional está qualificado a prestá-lo, e que ele será responsável por quaisquer danos – sejam eles mate-riais, físicos, ou de qualquer natureza – que porventura venham a ser causados em decorrência de seu trabalho. Hoje, um médico é responsável pela perda de um paciente, mesmo que seja causada por uma falha em um sistema compu-tacional que ele estava utilizando, quando, na verdade, o profissional que projetou e implementou aquele sistema (que deve ser da área de Informática) é quem deveria assumir tal responsabilidade.

Page 86: Básico Redes de Comp

AULA 7 • COMPUTAçãO BÁSICA

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

7.2.1 O Projeto de Lei

Há quase 10 anos, desde a proposição inicial do projeto, tramita na Câmara dos Deputados o Projeto de Lei 7.109/06, de autoria do deputado Bonifácio Andrada (PSDB-MG), que dispõe sobre a regulamentação do exer-cício das profissões de Informática, cria o Conselho Federal, os Conselhos Regionais e outras providências.

A seguir, estão listados alguns Projetos de Lei (PL) com tentativas de regu-lamentar a profissão:

PL815/1995;•

PL 2194/1996 em 01/agosto/1996;•

PL 981/1999 em 20/maio/1999;•

PL 6639/2002 em 24/abril/2002;•

PL 1561/2003 em 29/julho/2003;•

PL 1746/2003 em 08/agosto/2003;•

PL 1947/2003 em 09/setembro/2003;•

PL 7109/2006.•

Síntese da aula

Nesta aula, você aprendeu que a formação acadêmica na área de Informática possui diversos nomes, com currículos similares e também com formações diferen-ciadas, devido ao fato de não possuir um órgão que regulamente as atividades dos profissionais na área de informática. Como exemplo disso, temos os cursos de Informática, Análise de Sistemas, Ciência da Computação, Engenharia de Computação, Engenharia de Informação, Sistemas de Informação entre outros.

Você conheceu alguns cursos de formação de nível superior mais comuns na maioria das universidades públicas e particulares que são os de:

Engenharia da Computação: trata de assuntos relativos à • hardware (máquinas) que trabalham isoladamente (PCs) ou que compõem uma rede (ou sistema) de comunicações;

Bacharel em Ciência da Computação: tem seu foco principalmente no •desenvolvimento dos programas (softwares);

Analista de Sistemas: atua na concepção, na aplicação e na manu-•tenção dos programas.

Page 87: Básico Redes de Comp

AULA 7 • COMPUTAçãO BÁSICA

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

A partir das formações de nível superior anteriormente mencionadas, que podem ser encontradas nas mais diversas universidades do Brasil, podemos escolher algumas áreas específicas de atuação, tais como:

Administrador de Banco de Dados: responsável pela manutenção e •refinamento de bancos de dados corporativos;

Administrador de Redes: responsável pela instalação, configuração e manu-•tenção dos sistemas operacionais e de todos os serviços implementados;

Analista de Segurança: responsável pela segurança da rede, monito-•rando tentativas de invasão e uso indevido dos recursos da rede;

Analista de Sistemas: responsável pelo levantamento das necessidades •do cliente e pela elaboração de um modelo conceitual do sistema a ser desenvolvido;

Analista de • Software Básico: responsável por desenvolver e imple-mentar sistemas de automação e tempo real;

Analista de Suporte: responsável pela instalação e configuração de •software e hardware;

Auditor de Sistemas: encarregado de auditar sistemas e redes corpora-•tivas, identificando fraudes e outros tipos de irregularidades;

Engenheiro de • Hardware: responsável por conceber projetos hardware para computadores, telecomunicações e outros tipos de equipamento eletrônico;

Engenheiro de • Software: responsável por criar, manter e auditar meto-dologias de desenvolvimento de sistemas em uma empresa;

Engenheiro de Telecomunicações: monta, opera e faz manutenção de •redes. Na área comercial, cria e adapta serviços de telecomunicação para clientes corporativos;

Programador • Web: responsável pelo desenvolvimento de aplicações para Web;

Técnico em • Hardware: faz a manutenção da estrutura de hardware de uma empresa, identifica a causa de problemas nas máquinas e soluciona os físicos;

Webdesigner: responsável pela criação e adaptação de identidade •visual, manutenção de páginas, digitalização e tratamento de imagens, diagramação, animações e confecção de banners;

Page 88: Básico Redes de Comp

AULA 7 • COMPUTAçãO BÁSICA

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

Webdeveloper• : desenvolvimento para Web. Utiliza o Webdevelopment como uma especialização da programação normal, ajustando-a às características próprias da Web;

Webmaster• : responsável pela estrutura, desenvolvimento, design e gerência de sites, gerencia uma equipe envolvida com o ambiente Web, desde a infra-estrutura até o desenvolvimento de sites completos.

Você pôde entender que as profissões de informática são, hoje, umas das poucas que ainda não possuem um órgão regulamentador.

Entendeu que a informática brasileira enfrenta hoje um sério e real problema: conselhos de outras profissões já estabelecidas estão avançando sobre a área na tentativa de se apropriar de atribuições profissionais que até o presente foram exercidas livremente no país.

Pôde compreender também que um dos motivos que levam a pensar sobre a regulamentação da informática é acabar com a concorrência injusta de pessoas que fazem cursos de curta duração e já saem exercendo atividades nesta área e também a proteção da sociedade contra falsos profissionais, garantindo assim que, ao se contratar algum serviço, tenha-se certeza de que aquele profissional está qualificado a prestá-lo, e que ele será responsável por quaisquer danos.

Você tomou conhecimento que existem alguns Projetos de Lei há quase dez anos. Desde a proposição inicial do projeto, tramita na Câmara dos Deputados o Projeto de Lei 7.109/06, de autoria do deputado Bonifácio Andrada (PSDB-MG), que dispõe sobre a regulamentação do exercício das profissões de Informática, cria o Conselho Federal, os Conselhos Regionais e outras providências.

Atividades

1. Analise as assertivas e destaque, 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.

Page 89: Básico Redes de Comp

AULA 7 • COMPUTAçãO BÁSICA

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

Assinale a alternativa incorreta:

a) Somente I e IV estão corretas.

b) I, II e III estão corretas.

c) Somente a III está incorreta.

d) Todas as alternativas estão corretas.

2. A respeito da regulamentação profissões da área de informática, podemos afirmar que:

I. as profissões de Informática são, hoje, umas das poucas que ainda não possuem um órgão regulamentador, ao contrário do que ocorre com as profissões da área de Direito, Medicina, Odontologia, Contabilidade, Jornalismo, Administração, entre outras;

II. a regulamentação de uma profissão tem como objetivo a proteção da sociedade contra falsos profissionais, garantindo assim que, ao se contratar algum serviço, tenha-se certeza de que aquele profissional está qualificado a prestá-lo, e que ele será responsável por quaisquer danos;

III. são alguns Projetos de Lei com tentativas de regulamentar a profissão: PL815/1995, PL 2194/1996 em 01/agosto/1996, PL 981/1999 em 20/maio/1999, PL 1947/2003 em 09/setembro/2003, PL 7109/2006;

IV. a informática brasileira enfrenta hoje um sério e real problema, no qual os conselhos de outras profissões já estabelecidas estão tentando se apropriar de atribuições profissionais da área de informática.

Assinale a alternativa incorreta:

a) Somente I e IV estão corretas.

b) Somente I, III e IV estão corretas.

c) Somente a I está incorreta.

d) Todas as alternativas estão corretas.

3. Leia atentamente as afirmações, assinalando com um (V) as afirmativas verdadeiras e com (F) as falsas.

( ) Um Administrador de Banco de Dados é o responsável pela manu-tenção e refinamento de bancos de dados corporativos.

( ) O Analista de Segurança é o responsável pela segurança da rede (equipamento, sistemas operacionais de servidores e clientes e programas utilizados). Também monitora tentativas de invasão e

Page 90: Básico Redes de Comp

AULA 7 • COMPUTAçãO BÁSICA

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

uso indevido dos recursos da rede, além de definir e manter as regras de uso dos recursos computacionais da empresa.

( ) Analista de Sistemas é o responsável pelo levantamento das neces-sidades do cliente e pela elaboração de um modelo conceitual do sistema a ser desenvolvido. Entre suas principais atividades, estão a manutenção e refinamento de bancos de dados, as alterações na estrutura do banco para expansão e adaptações de sistemas, monitoramento e identificação de falhas para aperfeiçoamento de bancos de dados.

( ) Um Administrador de Redes é o responsável pela instalação, confi-guração e manutenção dos sistemas operacionais e de todos os serviços implementados, além da configuração e manutenção do nível de segurança da rede.

Agora, assinale a alternativa que corresponde à sua resposta.

a) V, V, F, V

b) F, V, F, V

c) F, F, V, V

d) V, V, V, F

4. Ainda sobre as áreas de atuação dos profissionais de informática, indique a alternativa incorreta quanto às atribuições de cada profissional.

a) Webmaster é o responsável pela estrutura, desenvolvimento, design e gerência de sites, gerencia uma equipe envolvida com o ambiente Web, desde a infra-estrutura até o desenvolvimento de sites completos.

b) Engenheiro de Software Profissional é responsável pela instalação e configuração de software e hardware; instalação e configuração de ambiente para o usuário (incluindo sistemas operacionais e principais aplicativos); instalação e configuração de servidores; e desenho da rede interna da empresa.

c) O Engenheiro de Telecomunicações é o profissional que monta, opera e faz manutenção de redes. Na área comercial, cria e adapta serviços de telecomunicação para clientes corporativos. Em planejamento, o profissional cria as redes que poderão dar suporte aos serviços obtidos pela área comercial.

Page 91: Básico Redes de Comp

AULA 7 • COMPUTAçãO BÁSICA

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

d) Engenheiro de Hardware é o profissional responsável por conceber projetos hardware para computadores, telecomunicações e outros tipos de equipamento eletrônico.

Comentário das atividades

Para a atividade 1, se você escolheu a opção (c), você acertou! Isso mesmo, a concepção, na aplicação e na manutenção dos programas e apli-cativos é uma atribuição própria do Analista de Sistemas, o Engenheiro de Computação atua principalmente nas áreas relativas a hardware de equi-pamentos computacionais. Parabéns, se você respondeu corretamente, pois alcançou uns dos nossos objetivos, que é o de conhecer a diferença entre as áreas formação profissional mais comuns na área de informática. Caso sua resposta tenha sido diferente, você deverá rever a aula!

Para a atividade 2, a resposta correta é a alternativa (d). Parabéns, se você acertou, pois significa que atingiu um dos nossos objetivos de entender sobre a situação de regulamentação profissional das áreas de informática. Caso sua resposta tenha sido outra, você deverá voltar ao conteúdo que trata das regulamentação das profissões da área de infor-mática e buscar listar os pontos críticos pela não regulamentação dos profissionais desta área.

Na atividade 3, se você optou pela alternativa (a), parabéns! A alternativa falsa das afirmativas é a terceira, uma vez que o Analista de Sistemas é o responsável somente pelo levantamento das necessidades do cliente e pela elaboração de um modelo conceitual do sistema a ser desenvolvido. As atividades de manutenção e refinamento de bancos de dados, as alterações na estrutura do banco para expansão e adaptações de sistemas, monitoramento e identificação de falhas para aperfeiçoa-mento de bancos de dados são atividades próprias do Administrador de Banco de Dados.

Para a atividade 4, se você escolheu a alternativa (b), você acertou! O Engenheiro de Software Profissional é responsável por criar, manter e auditar metodologias de desenvolvimento de sistemas em uma empresa. Suas princi-pais atividades envolvem criação, manutenção e auditoria de metodologias de desenvolvimento de sistemas; acompanhamento das métricas de desem-penho e qualidade dos produtos gerados, comparando-as com as métricas-padrão do mercado.

Page 92: Básico Redes de Comp

AULA 7 • COMPUTAçãO BÁSICA

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

ReferênciasALMEIDA, 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

Page 93: Básico Redes de Comp
Page 94: Básico Redes de Comp

Créd

itos

EQUIPE UNITINS

Organização de Conteúdos AcadêmicosSilvio Costa Sampaio

Coordenação EditorialMaria Lourdes F. G. Aires

Assessoria EditorialDarlene Teixeira Castro

Assessoria Produção Gráfica Katia Gomes da Silva

Revisão Didático-PedagógicaSibele Letícia Rodrigues de Oliveira Biazotto

Revisão Lingüístico-TextualSibele Letícia Rodrigues de Oliveira Biazotto

Revisão DigitalSibele Letícia Rodrigues de Oliveira Biazotto

Projeto GráficoDouglas Donizeti SoaresIrenides TeixeiraKatia Gomes da Silva

IlustraçãoGeuvar S. de Oliveira

CapaIgor Flávio Souza

EQUIPE FAEL

Coordenação EditorialLeociléa Aparecida Vieira

Assessoria EditorialWilliam Marlos da Costa

RevisãoJuliana Camargo HorningLisiane Marcele dos Santos

Programação Visual e DiagramaçãoDenise Pires PierinKátia Cristina Oliveira dos SantosRodrigo SantosSandro NiemiczWilliam Marlos da Costa

Page 95: Básico Redes de Comp

Apr

esen

taçã

o

Este caderno de Algoritmos e Programação tem o objetivo de auxiliá-lo no estudo da codificação de programas a partir de uma Linguagem de Programação. Existem várias Linguagens de Programação, cada uma com suas características próprias. Como Linguagem de Programação escolhida, estudaremos a Linguagem C.

C é uma linguagem poderosa, robusta, flexível e madura. É, sem dúvida, uma das linguagens mais utilizadas nos ambientes acadêmico e científico, além de ser comercialmente relevante.

Conhecer suas principais estruturas e detalhes requer um estudo criterioso e profundo. Para dominar uma Linguagem de Programação, seja qual for, é sempre necessário estudar a sua sintaxe, ou seja, as formas como os comandos e expres-sões devem ser escritos. Felizmente, a C é uma linguagem de sintaxe simples e elegante que permite rápido entendimento pelo programador, mesmo iniciante.

Nesse contexto, procuramos abordar os tópicos essenciais que nos permita escrever um programa completo e útil na Linguagem C.

Entre as principais características da Linguagem C, estão grande flexibili-dade, escrita compacta, padronização bem feita e alta velocidade de proces-samento. Por essas características, essa linguagem é tão popular.

Bons estudos!

Prof. Silvio Costa Sampaio

Page 96: Básico Redes de Comp

Plan

o de

Ens

ino

EMENTA

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

OBJETIVOS

Apresentar a Linguagem C, os operadores e estruturas de controle.•

Compreender estruturas de dados homogêneas e heterogêneas.•

CONTEÚDO PROGRAMÁTICO

Introdução à Programação em Linguagem C•

Operadores•

Estruturas de controle•

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

Estruturas de dados homogêneas (vetores e matrizes) e heterogêneas •(estruturas)

Ponteiros e alocação dinâmica•

Arquivos•

Page 97: Básico Redes de Comp

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

BIBLIOGRAFIA

ASCENCIO, Ana Fernanda Gomes; CAMPOS, Edilene Aparecida Veneruchi de. Fundamentos da programação de computadores: Algoritmos, Pascal e C/C++. São Paulo: Pearson Prentice Hall, 2003.

DEITEL, H. M.; DEITEL, P. J. Como programar em C. Rio de Janeiro: LTC, 1999.

MIZRAHI, V. V. Treinamento em Linguagem C: Módulos 1 e 2. São Paulo: Makron Books do Brasil, 1993.

ORTH, Afonso Inácio. Algoritmos e programação com resumo das Linguagens Pascal e C. Porto Alegre: AIO, 2001.

ZIVIANI, Nivio. Projeto de Algoritmos: com implementações em Pascal e C. 2. ed. São Paulo: Thomson, 2004.

Page 98: Básico Redes de Comp
Page 99: Básico Redes de Comp

AULA 1 • ALgORITMOS E PROgRAMAçãO

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

Objetivos

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

conhecer os conceitos fundamentais da Linguagem C;•

construir um programa básico em C.•

Pré-requisitos

Para atingir os objetivos desta aula, você deve possuir conhecimento prévio de técnicas de criação de algoritmos, particularmente de pseudocódigo. Isso é necessário, na verdade, para todas as aulas que compõem este caderno, pois ao longo do texto são feitas referências aos conceitos estudados nas aulas de Lógica para Programação. Procure sempre relacionar os conteúdos estudados nesta disciplina com as outras.

Introdução

O histórico da Linguagem C tem início em 1970, quando o programador Denis Ritchie desenha uma linguagem, nos laboratórios da Bell Telephones, Inc., chamada simplesmente de B. No ano de 1978, Brian Kerningham junta-se a Ritchie para aprimorar a Linguagem B e acabam gerando uma nova versão. À nova versão foi dado o nome de C. Por suas características de portabilidade e estruturação mais compacta, a Linguagem C se torna popular entre os programadores.

Em meados de 1980, a linguagem C é padronizada pelo American National Standard Institute: surge o ANSI C. Em 1990, a empresa de software Borland International Co., fabricante de compiladores profissionais, escolhe o C e o Pascal como linguagens de trabalho para o seu Integrated Development Enviroment (Ambiente Integrado de Desenvolvimento): surge o Turbo C.

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

Linguagem C

Page 100: Básico Redes de Comp

AULA 1 • ALgORITMOS E PROgRAMAçãO

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

O Turbo C implementa funções específicas para o ambiente Windows, fugindo à especificação ANSI C. Isso dá origem, no meio técnico, a uma divisão da Linguagem C em dois padrões de codificação distintos: o ANSI C e Borland C. Neste caderno, estudaremos as definições segundo o padrão ANSI C.

A Linguagem C apresenta uma gama relativamente grande de tipos de variáveis. Permite ainda a criação de estruturas de dados não homogêneas, como os registros. Outra característica marcante dessa linguagem é o seu extenso acesso ao hardware, permitindo a programação em baixo nível.

Na verdade, a Linguagem C é bastante pequena quando comparada a outras da sua época. Isso é possível, pois no C os aspectos não indispensáveis da linguagem são implementados como uma biblioteca de funções, que pode ser estendida pelo programador.

As idéias por trás de C são tão simplificadoras e naturais que ela serve de base para outras linguagens. Muitos compiladores e ambientes de desenvolvi-mento (IDE) de outras linguagens são implementados em Linguagem C.

Nesta aula, serão abordados os conceitos fundamentais da programação em Linguagem C. Estudaremos os detalhes básicos de um programa codificado nessa linguagem. Esta aula é de fundamental importância para se iniciar na programação usando essa linguagem.

1.1 Estrutura de um programa em C

Um programa em C é constituído, normalmente, de:

cabeçalho• : contém as diretivas de compilador em que se definem o valor de constantes simbólicas, declaração de variáveis, inclusão de bibliotecas, declaração de rotinas, etc.;

bloco• de instruções principal e outros blocos de rotinas;

documentação do programa• : comentários.

A seguir, cada parte fundamental de um programa em C é discutida.

1.1.1 Conjunto de caracteres válido

Um programa fonte em C é, na prática, um texto não formatado escrito em um editor de textos usando um conjunto padrão de caracteres ASCII. Como característica de cada linguagem é definido o conjunto de caracteres que poderão ser usados nesse arquivo fonte.

Page 101: Básico Redes de Comp

AULA 1 • ALgORITMOS E PROgRAMAçãO

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

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

Caracteres válidos:a b c d e f g h i j k l m n o p q r s t u v w x y zA B C D E F G H I J K L M N O P Q R S T U V W X Y Z1 2 3 4 5 6 7 8 9 0+ - * / \ = | & ! ? # % ( ) { } [ ] _ ‘ “ . , : < >

O uso de algum caractere inválido (fora desse conjunto) dará origem a um erro na geração do programa. Por isso, é muito 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 structbreak else long switchcase enum register typedefchar extern return unionconst float short unsignedcontinue for signed voiddefault goto sizeof volatiledo 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

Page 102: Básico Redes de Comp

AULA 1 • ALgORITMOS E PROgRAMAçãO

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

máquina. A essa característica de podermos migrar um programa com um mínimo de modificações chamamos de portabilidade. Se você pretende fazer com que seu programa seja o mais portável possível, evite o uso de palavras-chave diferentes das anteriores.

Cabe ressaltar que todas as palavras-chave na Linguagem C devem ser escritas em letra minúscula. O C distingue as letras minúsculas de maiús-culas. A essa característica chamamos de case-sensitive. Com isso, os iden-tificadores int e Int são considerados identificadores diferentes pelo compi-lador. Essa característica, pouco comum em outras linguagens, poderá lhe causar confusão no início de seus estudos em C.

1.1.3 Comentários

Durante a codificação de um programa, muitas vezes precisamos explicar determinados trechos de código a fim de tornar mais fácil o seu entendimento, principalmente quando a codificação é realizada em equipe – muito comum em empresas de software. O uso de comentário deve ser uma prática constante, pois você deve sempre assumir a possibilidade de outro programador ter de manter ou continuar o seu código e, nesse caso, qualquer informação adicional que permita entender melhor o seu código será útil. Algumas empresas avaliam a qualidade da codificação de um programador por sua habilidade em inserir comentários úteis e claros em seu código.

Em C, comentários podem ser escritos em qualquer lugar do texto para facilitar a interpretação do algoritmo. Para que o comentário seja identifi-cado como tal, você pode delimitar o trecho de duas formas:

caso o trecho a ser comentado ocupe apenas uma linha, basta •inserir duas barras seguidas no início da linha. Com isso, o compi-lador entende que todo o trecho que estiver à direita da linha deve ser considerado como comentário;

caso o trecho a ser comentado ocupe mais de uma linha, •é necessário delimitar o início e o final do comentário. Para indicar o início de um comentário, você deve usar o caractere barra seguido do caractere asterisco. Para indicar o final de um comentário, você deve usar o caractere asterisco seguido de um caractere barra.

Page 103: Básico Redes de Comp

AULA 1 • ALgORITMOS E PROgRAMAçãO

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

O exemplo a seguir mostra trechos de comentário nas duas formas citadas.

// Comentário de uma linha

/*

Esse programa foi desenvolvido pelo

Fulano de Tal

Blá, blá, blá

*/

1.1.4 Diretivas de compilação

Na Linguagem C, existem comandos que não denotam instruções e são processados apenas durante a compilação do programa. Esses comandos são chamados de diretivas de compilação.

Esses comandos informam ao compilador do C as opções que deverão ser utilizadas na geração do programa.

A diretiva #include, por exemplo, informa ao compilador para incluir na compilação do programa outros arquivos que incluem códigos ou defi-nições usadas no programa. Geralmente, esses arquivos informados pela diretiva #include contêm bibliotecas de funções ou rotinas do usuário. Outra diretiva muito utilizada é a #define que informa ao compilador quais são as constantes simbólicas usadas no programa.

A linha #include <stdio.h>, por exemplo, diz ao compilador que ele deve incluir o arquivo-cabeçalho stdio.h. Nesse arquivo, existem definições de funções úteis para entrada e saída de dados. Assim, toda vez que você quiser usar uma dessas funções, deverá incluir esse comando.

É de fundamental importância para o aprendizado da Linguagem C que você procure conhecer o conjunto de bibliotecas de funções do C. Por exemplo, para você poder utilizar as funções de manipulação de variáveis do tipo literal (string), é necessário incluir a diretiva “#include <string.h>”; caso contrário, o compilador não irá reconhecer as funções usadas no programa.

Infelizmente, nesse caderno não é possível apresentar todo o conjunto de bibliotecas do C. Mas você deve conhecê-lo!

Page 104: Básico Redes de Comp

AULA 1 • ALgORITMOS E PROgRAMAçãO

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

1.1.5 Declaração de variáveis e constantes

As variáveis no C devem ser declaradas antes de serem usadas. É na declaração de uma variável que devemos explicitar qual o seu tipo e indicar ao computador a necessidade de reservar um espaço em memória para conter o valor para essa variável.

Em C, uma variável deve ser sempre declarada usando a seguinte sintaxe: <tipo_de_dados> <identificador> [, <identificador>...];. Os tipos de dados da linguagem C são discutidos a seguir. Exemplos de declaração de variáveis em C:

int numero; // declara a variável número do tipo inteiro

float a,b; // declara as variáveis a e b do tipo real

Um ponto importante na declaração de variáveis e constantes em C é a formação dos identificadores. Os identificadores em C podem iniciar por qualquer letra maiúscula ou minúscula ou o sinal de sublinhado (underscore) – representado pelo sinal “_”. No meio de um nome, poderá haver letras, números ou o sinal de sublinhado e nada mais.

Cabe ainda sugerir que você utilize identificadores com sentido explí-cito. Por exemplo, se você tiver de criar uma variável para armazenar a soma total de produtos, deve utilizar um identificador como soma_total_

produtos, ao invés de usar soma ou apenas n.

É importante lembrar também que você não poderá usar como iden-tificador de variável nem o mesmo identificador de uma palavra-chave nem o de uma função já definida em uma biblioteca ou no próprio programa.

1.1.5.1 Tipos de dados e modificadores

As diferenças entre os tipos de variáveis do pseudocódigo para o C são: o tipo inteiro é mapeado para int; o tipo real é mapeado para float ou double; e o tipo caractere é mapeado para char.

A Linguagem C ainda permite alterar a precisão dos valores com a utilização de modificadores e com isso acaba definindo novos tipos de dados. A seguir, são listados os modificadores de tipo usados na Linguagem C.

Page 105: Básico Redes de Comp

AULA 1 • ALgORITMOS E PROgRAMAçãO

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

TIPO DE DADOTAMANHO (EM bitS)

CAPACIDADE DE REPRESENTAçãO

Char 8 -127 a 127unsigned char 8 0 a 255signed char 8 -127 a 127Int 16 -32767 a 32767unsigned int 16 0 a 65.535signed int 16 -32767 a 32767short int 16 -32767 a 32767unsigned short int 16 0 a 65.535signed short int 16 -32767 a 32767long int 32 -2.147.483.647 a 2.147.483.647signed long int 32 -2.147.483.647 a 2.147.483.647unsigned long int 32 0 a 4.294.967.295Float 32 seis dígitos de precisãoDouble 64 dez dígitos de precisãolong double 80 dez dígitos de precisãoFonte: 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.

Page 106: Básico Redes de Comp

AULA 1 • ALgORITMOS E PROgRAMAçãO

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

Constante de um tipo básico• : esse é o tipo de constante mais comum em um programa em C. Essas constantes derivam de um tipo de dado básico da linguagem. A listagem a seguir apresenta essas constantes.

Tipo de Dado ExemplosChar ‘a’ ‘\0’ ‘\t’Int 5 2345 -17long int 234000 -509876short int 120 -12unsigned int 50000 35678Float 0.0 23.7 -12.3e-10Double 12546354334.0 - 0.0000034236556

Constantehexadecimal• ouoctal: 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;

Constantedeformataçã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

Page 107: Básico Redes de Comp

AULA 1 • ALgORITMOS E PROgRAMAçãO

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

\a Sinal sonoro (beep)

\N Constante octal (N é o valor da constante)

\xN Constante hexadecimal (N é o valor da constante)

1.1.6 A função principal main()

Todo programa em C tem de ter uma função main (principal, em inglês). É essa função que será chamada quando o programa for executado. Assim, é a partir dessa função que invocamos as demais funções do nosso programa.

A declaração da função main() pode conter parâmetros formais. Mas a defi-nição desses parâmetros é determinada pela linguagem, não podendo ser alte-rada – apenas omitida. A declaração mais completa que se pode ter para a função main() é: int main (int argc,char *argv[]);.

Os parâmetros argc e argv dão ao programador acesso à linha de comando com a qual o programa foi chamado. Assim, é possível receber valores direta-mente na chamada do programa.

O parâmetro argc (contador de argumentos – do inglês argument count) é um inteiro e possui o número de argumentos com os quais a função main() foi chamada na linha de comando. Ele possui o valor mínimo de um, pois o nome do programa é contado como sendo o primeiro argumento.

O parâmetro argv (valores dos argumentos – do inglês argument values) é um ponteiro para um vetor de strings. Cada string desse vetor armazena um dos parâmetros passados na linha de comando. Assim, a instrução argv[0] sempre aponta para o nome do programa (que, como já foi dito, é considerado o primeiro argumento).

1.1.7 Blocos de comandos

Em C, assim como em pseudocódigo, um bloco de comando representa uma estrutura seqüencial de instruções que deverão ser executadas uma após a outra. Um bloco é definido no pseudocódigo pelas palavras INICIO/FIM, na Linguagem C serão representados por um par de chaves “{ }”. A seguir, é mostrado um exemplo que permite comparar o uso de blocos em pseudocódigo e em Linguagem C.

Em pseudocódigo:VAR x, y: real; valor: inteiro;INICIO valor ← x + y;FIM

Em linguagem C:float x,y;int valor;int main(){valor = x + y;}

Page 108: Básico Redes de Comp

AULA 1 • ALgORITMOS E PROgRAMAçãO

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

1.1.8 Entrada e saída de dados

A Linguagem C oferece um grande conjunto de funções que permite ler valores dos dispositivos de entrada e escrever nos dispositivos de saída. Iremos estudar as mais utilizadas.

1.1.8.1 Lendo um caractere do teclado

Para ler um caractere do teclado, utilize a função getchar(). Ela faz parte do arquivo de cabeçalho stdio.h. Sua utilização é:

variavel = getchar();

Essa função retorna o valor inteiro referente ao código ASCII do caractere lido, porém você pode atribuir esse valor a uma variável do tipo caractere. Caso ocorra um erro, ela retorna EOF.

1.1.8.2 Exibindo um caractere

Para exibir um caractere, você pode usar a função putchar(), que está no arquivo de cabeçalho stdio.h. Sua sintaxe é:

putchar(variavel)

em que variável é um número inteiro, porém você pode passar variável como um caractere. putchar retorna o caractere exibido ou EOF, caso ocorra algum erro.

1.1.8.3 Lendo uma string do teclado

Você pode ler uma string do teclado usando as funções gets() e fgets(). Elas fazem parte do arquivo de cabeçalho stdio.h.

Alguns compiladores C, como o gcc, desencorajam o uso da função gets., por causa de um problema conhecido como bufferoverflow (estouro de buffer, em inglês). A própria man page, do gcc em Linux, para a função gets, explica o problema em sua seção PROBLEMAS. Vejamos.

Nunca use gets(). Porque é impossível saber, sem conhecer antecipada mente os dados, quantos caracteres gets() vai ler, e porque gets() vai continuar a guardar caracteres ultrapassado o fim do ‘buffer’, ela é extremamente perigosa de usar. Esse comportamento tem sido utilizado para quebrar a segurança de computadores. Use fgets() no seu lugar (DIAS NETO, [200-]).

Abordaremos apenas o uso e a sintaxe da função fgets(), que substitui a função gets() na leitura de string. É a seguinte:

Page 109: Básico Redes de Comp

AULA 1 • ALgORITMOS E PROgRAMAçãO

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

fgets (STRING,TAMANHO,STREAM),

em que:

STRING• é a variável onde a string será armazenada;

TAMANHO é o tamanho máximo da • string;

STREAM• é de onde os caracteres serão lidos, para ler do teclado o valor padrão para isso é stdin.

1.1.8.4 Exibindo uma string

Você pode exibir uma string usando a função printf ou a função puts(). Elas fazem parte do arquivo de cabeçalho stdio.h.

A sintaxe de printf para a exibir uma string é:

printf(“%s”,STRING);

A sintaxe de puts é:

puts(string)

1.1.8.5 Saída formatada (printf)

A saída formatada é feita utilizando a função printf vista anteriormente. A sintaxe geral do comando printf é:

printf (“<string de formatação>”,<lista de variáveis>),

em que:

o <string de formatação> deve estar sempre entre parênteses e deve •conter um conjunto de especificadores de formato que dirão ao computador como o dado deverá ser formatado. Os especificadores de formato em C são os listados a seguir.

ESPECIFICADOR FORMATO%d inteiro%o inteiro em formato octal%x%X

inteiro em formato hexadecimal

%u unsigned int%ld long int%f float%c char%e%E

float em formato exponencial

Page 110: Básico Redes de Comp

AULA 1 • ALgORITMOS E PROgRAMAçãO

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

ESPECIFICADOR FORMATO%g%G

float. C escolhe melhor maneira de exibição entre normal e exponencial

%s string%p endereço de um ponteiro%n quantos caracteres a função printf exibiu

Fonte: Dias Neto ([200-]).

a <lista de variáveis> é uma seqüência de variáveis ou expressões •separadas por vírgula. Você deve informar uma variável para cada especificador de formato que compõem o string de formatação.

1.1.8.6 Entrada formatada (scanf)

A entrada formatada é feita utilizando a função scanf. Ela faz parte do arquivo de cabeçalho stdio.h. Sua sintaxe é:

scanf(“<string de formatação>”,&variável)

O <string de formatação> segue a mesma sintaxe da função printf.

Observe que o valor entrado é passado para o endereço da variável. No caso de leitura de uma string, não há necessidade do operador &, já que o nome de uma string sem o índice é entendido pela Linguagem C como um ponteiro para o início da string.

1.2 Exemplo de um programa básico em C

Com base nos conceitos apresentados até aqui, podemos definir a estru-tura de um programa básico em C, como mostrado no código a seguir:

#include <stdio.h>/* Programa exemplo */int main(){ int n = 0; int x; printf (“Digite um valor inteiro: “); scanf (“%d”, x);}

Nesse exemplo, você pode reconhecer os principais elementos de um programa em C:

um cabeçalho contendo as diretivas de compilador: nesse caso, a diretiva •#include <stdio.h> diz ao compilador para incluir a biblioteca stdio;

Page 111: Básico Redes de Comp

AULA 1 • ALgORITMOS E PROgRAMAçãO

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

um bloco de instruções principal: nesse caso, todo o bloco delimi-•tado pelo par de chaves;

documentação do programa: em nosso exemplo, temos o comen-•tário “/* Programa exemplo */”.

Síntese da aula

Nesta aula, apresentamos os conceitos fundamentais da programação em Linguagem C. Abordamos os componentes principais de um programa nessa linguagem, como a declaração de variáveis, os tipos de dados, entre outros. A partir do conteúdo estudado nesta aula, já é possível codificar programas simples usando a Linguagem C.

Atividades

1. Com base em seus conhecimentos sobre a Linguagem C, indique a alternativa incorreta.

a) Todo programa em C deve possuir uma função main().

b) A diretiva #include <stdio.h> indica ao compilador C que as declarações de funções da biblioteca “stdio” devem ser usadas nesse programa.

c) 0x123 representa uma constante em hexadecimal.

d) Considerando a declaração anterior “int valor;”, a instrução printf (“%s”, valor) deve ser usada para imprimir a variável valor.

e) A função main() pode receber parâmetros da linha de comando.

2. Construa um programa básico em C que leia uma variável inteira, outra real do teclado e imprima o valor digitado.

Comentário das atividades

Na atividade 1, com base no que foi estudado nesta aula, você deveria ter concluído que a única opção incorreta é a opção (d), pois nessa opção a variável valor é declarada como um inteiro e, portanto, a impressão do seu valor deveria usar o string de formatação “%d”, e não “%s” como argumento para a função printf; a opção (a) está correta, pois todo programa em C deve possuir uma função main ( ), uma vez que essa é a função principal do programa; a opção (b) também está correta, pois a diretiva #include é usada

Page 112: Básico Redes de Comp

AULA 1 • ALgORITMOS E PROgRAMAçãO

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

justamente para inserir definições de bibliotecas do compilador ou criadas pelo próprio programador; a opção (c) está correta, pois em C uma constante hexade-cimal deve sempre iniciar pelos caracteres 0x; e, por fim, a opção (e) está correta, pois, como estudamos, a função main() permite o uso dos parâmetros argv e argc, que permitem receber parâmetros diretamente da linha de comando.

A atividade 2 é muito simples e pressupõe apenas que você tenha enten-dido os principais elementos de um programa em Linguagem C. Uma solução possível para essa atividade seria:

#include <stdio.h>

int main()

{

int var1;

float var2;

printf (“\nInforme o valor inteiro: “);

scanf (“%d”, &var1);

printf (“\nInforme o valor real: “);

scanf (“%f”, &var2);

printf (“\nValor inteiro: %d”, var1);

printf (“\Valor real: %f”, var2);

}

ReferênciasASCENCIO, 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.

Page 113: Básico Redes de Comp

AULA 1 • ALgORITMOS E PROgRAMAçãO

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

SILVEIRA FILHO, Otton Teixeira da. Linguagem C. [Niterói]: Universidade Federal Fluminense. Departamento de Ciência da Computação, 1997. Disponível em: <http://www.ic.uff.br/~otton/produtos/apostila_c.pdf>. Acesso em: 20 dez. 2007.

ZIVIANI, Nivio. Projeto de algoritmos: com implementações em Pascal e C. 2. ed. São Paulo: Thomson, 2004.

Na próxima aula

Estudaremos os operadores disponíveis na Linguagem C. O conhecimento dos operadores de uma linguagem permite a construção de expressões nessa linguagem. E as expressões representam a maior parte das instruções em um programa de computador.

Anotações

Page 114: Básico Redes de Comp

AULA 1 • ALgORITMOS E PROgRAMAçãO

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

Page 115: Básico Redes de Comp

AULA 2 • ALgORITMOS E PROgRAMAçãO

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

Objetivos

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

reconhecer e utilizar os principais operadores usados na Linguagem C;•

construir corretamente expressões aritméticas e lógicas nessa linguagem.•

Pré-requisitos

Como principal pré-requisito para esta aula, é fundamental que você tenha entendido os conceitos apresentados na aula anterior, principalmente o que diz respeito à declaração e uso de variáveis e constantes. Se houver dúvidas, retomes seus estudos e consulte a web-tutoria.

Introdução

Operadores são elementos funcionais que atuam sobre termos e produzem um determinado resultado.

Os operadores são, na prática, instruções especiais pelas quais incre-mentamos, decrementamos, comparamos e avaliamos dados dentro de um programa de computador.

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

Aula 2Operadores

Page 116: Básico Redes de Comp

AULA 2 • ALgORITMOS E PROgRAMAçãO

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

Operador Ação+ Soma (inteira e ponto flutuante)– Subtração ou troca de sinal (inteira e ponto flutuante)* Multiplicação (inteira e ponto flutuante)/ Divisão (inteira e ponto flutuante)% Resto de divisão (de inteiros)++ Incremento (inteiro e ponto flutuante)-- Decremento (inteiro e ponto flutuante)

Fonte: UFMG. Centro de Pesquisa e Desenvolvimento em Engenharia Elétrica (CPDEE) (1996-1999).

Em C, os operadores são classificados em unário ou binário. Um operador

unário age sobre uma variável apenas, modificando ou não o seu valor, e retornam o valor final da variável. Os binários usam duas variáveis e retornam um terceiro valor, sem alterar o valor das variáveis originais. O operador de multiplicação é um exemplo de operador binário, enquanto o incremento é um exemplo de operador unário.

Cabe ressaltar que o operador de divisão, quando aplicado a variáveis inteiras, retornará um valor também inteiro; quando aplicado a variáveis em ponto flutuante, será retornado um valor em ponto flutuante, mesmo que uma das variáveis seja do tipo inteiro.

2.2 Lógicos

Na Linguagem C, não há definição do tipo de dado lógico, assim a inter-pretação do verdadeiro lógico é dada por qualquer valor maior do que zero. Obviamente, o falso lógico é qualquer valor menor ou igual a zero. Portanto, os operadores lógicos irão operar sobre quaisquer variáveis, dando uma resposta correspondente à condição examinada.

Os operadores lógicos em C são os listados a seguir.

Operador Ação&& E lógico (do inglês AND) || OU lógico (do inglês OR)! NÃO lógico (do inglês NOT)

2.3 Relacionais

Os operadores relacionais são utilizados para comparar os valores de duas expressões em um programa, retornando um valor “lógico”.

Page 117: Básico Redes de Comp

AULA 2 • ALgORITMOS E PROgRAMAçãO

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

São operadores relacionais na linguagem C os listados a seguir.

Operador Ação> Maior que< Menor que>= Maior ou igual a<= Menor ou igual a== Igual a!= Diferente de ou “não igual a”

É importante lembrar que você não deve confundir o operador de igualdade “==” com o operador de atribuição “=”, que será estudado a seguir.

2.4 Incrementos e decrementos (pré/pós)

Os operadores aritméticos de incremento (++) e decremento (--) disponibili-zados pela Linguagem C são operações unárias que servem para adicionar (no caso do incremento) ou subtrair (no caso do decremento) uma unidade ao valor de uma variável e retorná-lo. Assim, a expressão x++ é equivalente à x=x+1; e a expressão x-- é equivalente à expressão x=x-1.

Esses dois operadores possuem ainda a propriedade de poderem ser pré-fixados ou pós-fixados. Isso quer dizer que podemos definir se o valor da variável será incrementado/decrementado antes (pré) ou após (pós) o retorno do valor da variável.

Para que você entenda melhor esse procedimento, vamos considerar o trecho de código a seguir.

int x;

x = 5;

printf (“%d”, x++); // Imprime o valor atual de x (“5”) e incrementa x (“6”)

printf (“%d”, ++x); // Incrementa o valor atual de x (“7”) e imprime o x (“7”)

printf (“%d”, x--); // Imprime o valor atual de x (“7”) e decrementa x (“6”)

printf (“%d”, --x); // Decrementa o valor atual de x (“5”) e imprime x (“5”)

Em termos e nomenclatura, dizemos que uma operação do tipo x++ é um pós-incremento; ++x é um pré-incremento; x-- é um pós-decremento; e --x é um pré-decremento.

2.5 Atribuição

O operador de atribuição serve para, como o próprio nome já sugere, atribuir um valor para a variável. No C, é utilizado o caractere igual (=) para representar

Page 118: Básico Redes de Comp

AULA 2 • ALgORITMOS E PROgRAMAçãO

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

a atribuição. Quando esse operador é usado, o valor da expressão que esteja do lado direito do operador é transferido para a posição de memória apon-tada pela variável declarada do lado esquerdo do operador. Por exemplo, a expressão de atribuição numero = a*3; irá resolver a expressão do lado direito, ou seja, buscar na memória o valor da variável a e multiplicá-lo por 3 e, em seguida, atribuir esse valor resultante para a variável numero.

Quando você for utilizar esse operador, deve garantir que o resultado da expressão retorne um tipo de dado do mesmo tipo, ou equivalente, ao tipo da variável que irá receber esse valor.

2.5.1 Atribuição composta

No C, é possível a combinação do operador de atribuição com outro operador aritmético a fim de reduzir os comandos.

Por exemplo, é possível construir as seguintes expressões de atribuição composta:

soma += 5; // o mesmo que soma = soma + 5;

valor *= 10; // o mesmo que valor = valor * 10.

2.5.2 Atribuição múltipla

Uma vez declaradas, o C permite a incialização de mais de uma variável em uma única linha, como mostrada no comando:

soma = media = desvio = 0;

Nesse comando, é atribuído o valor zero às três variáveis listadas.

O operador de atribuição pode ser usado já na declaração de uma variável, com isso inicializando a variável já em sua criação. Um exemplo desse uso seria a seguinte declaração de variáveis:

int n = 0;

float valor = 0;

float nota1 = nota2 = 0.00;

2.6 Expressões

Expressões são combinações de variáveis, constantes e operadores. Quando montamos expressões, temos de levar em consideração a ordem com que os operadores são executados. O C define a seguinte hierarquia entre os seus operadores:

Page 119: Básico Redes de Comp

AULA 2 • ALgORITMOS E PROgRAMAçãO

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

Maior precedência ( ) [ ] ->

! ~ ++ -- . –unário) (cast)

*(unário) &(unário) sizeof

* / %

+ –

<< >>

<<= >>=

== !=

&

^

|

&&

||

?

Menor precedência = += -= *= /=

2.7 Operadores bit-a-bit

O C, por ter sido desenvolvido para operar também como linguagem de baixo nível (próxima ao hardware), permite que sejam realizadas operações lógicas bit-a-bit em números. Ou seja, nesse caso, o número é representado por sua forma binária e as operações são realizadas em cada bit individual.

Os operadores lógicos em C são os listados a seguir.

Operador Ação& E lógico (do inglês AND) | OU lógico (do inglês OR)~ NÃO lógico (do inglês NOT)^ OU-exclusivo lógico (no inglês XOR)>> Deslocamento de bits à direita<< Deslocamento de bits à esquerda

A sintaxe comum para uso dos operadores de deslocamento é: valor

>> quantidade de bits ou valor << quantidade de bits. Por exemplo, se uma variável numero possuir o valor 16 (em binário de oito bits ficaria 00010000) e for executada a instrução numero << 2, seriam deslocados 2 bits à esquerda (ficaria 01000000), resultando no valor 64; caso a instrução

Page 120: Básico Redes de Comp

AULA 2 • ALgORITMOS E PROgRAMAçãO

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

executada fosse numero >> 2, seriam deslocados 2 bits à direita (ficaria 00000100), resultando no valor 4.

Esses operadores bit-a-bit só podem ser usados nos tipos char, int e long int.

2.8 Modificador de tipo (cast)

Um modificador de tipo é aplicado a uma expressão para forçá-la a retornar um tipo de dado especificado. Sua forma geral é dada por (<tipo_de_dados>) <expressão>. Um exemplo que deixa óbvio a 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.

Page 121: Básico Redes de Comp

AULA 2 • ALgORITMOS E PROgRAMAçãO

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

Operador Ação& “o endereço de”

Ex.: na instrução x = &y, a variável x irá receber o endereço da variável y. Esse operador será discutido na aula sobre Ponteiros.

* “o conteúdo de”

Ex.: na instrução x = *y, a variável x irá receber o conteúdo do endereço de memória apontado pela variável y. Esse operador será discutido na aula sobre Ponteiros.

[ ] “no endereço de ... mais um índice”

Ex.: na instrução valor = vetor[6], a variável valor recebe o valor da posição de memória apontada pela variável vetor, deslocando 6 unidades. Esse operador será discu-tido na aula sobre Vetores.

. (operador ponto)

“elemento da estrutura” ou “campo”.

Esse operador será discutido na aula sobre Estruturas.

-> (operador seta)

“elemento da estrutura apontada por”.

Esse operador será discutido na aula sobre Estruturas.

Síntese da aulaNesta 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.

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

Page 122: Básico Redes de Comp

AULA 2 • ALgORITMOS E PROgRAMAçãO

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

b) a expressão (y*2 == x) retorna um valor que é considerado pelo C como verdadeiro;

c) a expressão x*=2; atribui à variável x o valor 70;

d) a expressão ((x < 50) && (y == 17)) retorna um valor que é consi-derado pelo C como verdadeiro;

e) a expressão printf (“%d”, --x) irá imprimir o valor 34.

2. Comente o uso do modificador de tipo (cast) disponível na Linguagem C.

Comentário das atividades

Na atividade 1, levando em consideração o que foi estudado sobre os operadores disponíveis na Linguagem C, você deveria ter concluído que a opção incorreta é a opção (b), pois vimos que o operador de divisão, quando aplicado a duas variáveis inteiras, sempre retorna um valor inteiro e, nesse caso, a variável y acaba recebendo o valor 17; logo, y*2 irá resultar em 34, que é diferente do valor da variável x; a opção (a) está correta, pois o operador de adição, quando aplicado a dois valores inteiros, sempre retorna um inteiro; a opção (c) também está correta, pois a instrução x*=2 é uma redução da expressão x=x*2 e, com isso, a variável x recebe o dobro do seu valor atual, nesse caso 70; a opção (d) também está correta, pois, se fatorarmos a solução dessa expressão, teremos ((x < 50) && (y == 17)) ↔ ((35 < 50) && (17 == 17)) ↔ (“verdadeiro” && “verdadeiro”) ↔ “verdadeiro”; e, por fim, a opção (e) está correta, pois a expressão printf (“%d”, --x) irá primeiro decrementar o valor de x (pré-incremento) e imprimir o valor resultante, nesse caso, 34.

Na atividade 2, você deveria descrever que o modificador de tipo serve para forçar o compilador a converter o valor de uma expressão para um tipo específico. É muito útil em casos como o da divisão inteira, discutida nesta aula. Além disso, serve para evitar erros de incompatibilidade de tipos na atribuição, por exemplo.

ReferênciasASCENCIO, 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.

Page 123: Básico Redes de Comp

AULA 2 • ALgORITMOS E PROgRAMAçãO

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

UFMG. Centro de Pesquisa e Desenvolvimento em Engenharia Elétrica (CPDEE). Curso de Linguagem C: operadores aritméricos e de atribuição. [Belo Horizonte], 1996-1999. Disponível em: <http:// www.mtm.ufsc.br/~azeredo/cursoC/aulas/c350.html>. Acesso em: 20 dez. 2007.

ZIVIANI, Nivio. Projeto de Algoritmos: com implementações em Pascal e C. 2. ed. São Paulo: Thomson, 2004.

Na próxima aula

Dando continuidade ao estudo da estrutura de um programa em Linguagem C, na próxima aula vamos estudar as principais estruturas de controle dessa linguagem. Essa aula será de fundamental importância para você entender como o fluxo de instruções pode ser controlado em um programa em C.

Anotações

Page 124: Básico Redes de Comp

AULA 2 • ALgORITMOS E PROgRAMAçãO

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

Page 125: Básico Redes de Comp

AULA 3 • ALgORITMOS E PROgRAMAçãO

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

Objetivos

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

compreender a importância de cada estrutura de controle disponível •na Linguagem C;

construir programas em C usando as diferentes estruturas abordadas.•

Pré-requisitos

Pelo fato de o estudo da programação ser um processo acumulativo, como pré-requisito para esta aula é necessário que você tenha realmente entendido os conceitos discutidos nas aulas anteriores. Lembre-se de que a web-tutoria está sempre à sua disposição!

Introdução

As estruturas de controle são a essência de qualquer linguagem de progra-mação, uma vez que determinam a seqüência pela qual as instruções de um programa são executadas.

Nesta aula, estudaremos a sintaxe de cada uma dessas estruturas na Linguagem C.

3.1 Estrutura seqüencial ou bloco

Na Linguagem C, o ponto-e-vírgula é o terminador de instruções, ou seja, marca o encerramento de uma instrução.

Um par de chaves { } é usado para agrupar instruções em instruções compostas ou blocos, de modo a serem sintaticamente equivalentes a uma instrução única. Assim, um bloco pode ser composto de:

Aula 3Estruturas de controle

Page 126: Básico Redes de Comp

AULA 3 • ALgORITMOS E PROgRAMAçãO

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

uma única instrução;•

um conjunto de instruções;•

nenhuma instrução (instrução vazia).•

Uma instrução composta ou bloco tem a estrutura:

{

declarações (opcional)

instruções

}

3.2 Estrutura de decisão simples (if)

Assim como estudado em Lógica para Programação, na Seleção Simples, uma instrução ou um conjunto de instruções é executado somente se o teste condicional especificado retornar o valor verdadeiro. Caso o resultado do teste seja falso, nenhuma das instruções delimitadas 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;

VAR N: Inteiro;

INICIO

LEIA N;

SE N>0 ENTAO

IMPRIMA N;

FIM SE

FIM

#include <stdio.h>

int main( ) {

int N;

scanf (“%d”, &N);

if (N > 0)

{

printf (“%d”, N);

}

}

3.3 Estrutura de decisão composta (if..else)

Uma das estruturas de decisão é a instrução if, que admite diversas variantes. A forma genérica dessa instrução é: if condição bloco1; else bloco2. A condição é uma expressão que é avaliada no momento de sua execução. Se for verdadeira (tiver um valor não nulo), é executado o primeiro bloco de instruções (bloco1); se for falsa, então é executado o segundo bloco de instru-ções (bloco2).

Page 127: Básico Redes de Comp

AULA 3 • ALgORITMOS E PROgRAMAçãO

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

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

ALGORITMO Selecao_Composta;VAR N: Inteiro;INICIOLEIA N;SE N>0 ENTAOIMPRIMA N;SENAOIMPRIMA “O valor de N deve ser positivo”;FIM SEFIM

#include <stdio.h>int main( ) { int N; scanf (“%d”, &N); if (N > 0) { printf (“%d”, N); } else { printf (“O valor de N deve ser positivo”); }}

3.4 Estrutura de decisão encadeada (if..else..if)

Em muitas situações, precisamos agrupar os testes a fim de realizar refi-namentos nos parâmetros de seleção. Para esses casos, normalmente são utili-zadas estruturas de seleção aninhadas.

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

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

#include <stdio.h>int main() { int N; scanf (“%d”, &N); if (N > 0) { if (N % 2 == 0) { printf (“%d”, N); } } else { printf (“O valor de N deve ser positivo”); }}

Page 128: Básico Redes de Comp

AULA 3 • ALgORITMOS E PROgRAMAçãO

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

Essa seqüência de else..if´s é uma maneira de implementar uma decisão

múltipla. O computador avalia as condições de cima para baixo e, logo

que encontre uma verdadeira, executa a instrução que lhe está associada,

ignorando o resto da cadeia.

3.5 Estrutura de decisão múltipla (switch..case)

Apesar de a instrução else..if permitir construir uma estrutura de

escolha múltipla, o C fornece uma outra instrução, a instrução switch,

que é específica para isso. Nela, é testada sucessivamente uma vari-

ável para verificar se coincide com uma lista de valores inteiros (ou

caracteres).

A sintaxe dessa instrução é:

switch (variável)

{

case exp_1 : instr_1; break;

case exp_2 : instr_2; break;

...

default : instr_n; break;

}

Cada um dos casos é rotulado por uma ou mais constantes inteiras ou

expressões com constantes, por exemplo, exp_1 pode ser um inteiro, um

caractere ou uma expressão de constantes. Se a variável coincidir com um

dos casos, a execução começa a partir desse ponto. Todos os rótulos têm de

ser diferentes. O caso com rótulo default é executado se não houver mais

nenhuma coincidência. O uso de default é opcional, se não for usado e

nenhuma coincidência for encontrada, não será executada nenhuma ação.

Como já foi visto, quando se verifica uma coincidência entre o valor da vari-

ável e um caso, a execução do programa prossegue a partir desse ponto,

executando tudo o que vem a seguir, inclusive as instruções correspondentes

aos casos posteriores. Para evitar que isso aconteça, você deve usar a

instrução break, que força a saída imediata do switch. A razão pela qual a

execução de um switch não se limita às instruções de um caso, mas continua

a partir desse ponto, é que essa característica tem bastante utilidade em

diversas situações. Por exemplo, podemos ter:

Page 129: Básico Redes de Comp

AULA 3 • ALgORITMOS E PROgRAMAçãO

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

switch (variável)

{

case exp_1 :

case exp_2 : instr_2; break;

...

default : ... break;

}

Nesse exemplo, é executada a instr_2, se a variável tiver o valor exp_1 ou exp_2. É uma boa prática usar break após o último caso, embora tal não seja necessário.

A diferença fundamental entre o switch e o if é que o switch apenas testa igualdade, enquanto a expressão condicional do if pode ser de qualquer tipo.

A instrução switch é bastante usada para processar comandos a partir do teclado, tais como a seleção de opções em um menu. Por exemplo, podemos ter uma função que devolva um valor que corresponde à opção selecionada (SIMÕES, 2004).

void menu()

{

char ch;

printf(“ Ler ficheiro - 1\n ”);

printf(“ Gravar ficheiro - 2\n ”);

printf(“ Eliminar ficha - 3\n ”);

printf(“ Adicionar ficha - 4\n ”);

printf(“Escolha opção: ”);

scanf(“%d”,&ch);

switch (ch)

{

case ‘1’ : ler_fich(); break;

case ‘2’ : grava_fich(); break;

case ‘3’ : apaga_ficha(); break;

case ‘4’ : adiciona_ficha(); break;

default :

printf(“Opção inválida!”);break;

}

}

Page 130: Básico Redes de Comp

AULA 3 • ALgORITMOS E PROgRAMAçãO

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

3.6 Estrutura de repetição (while)

Essa estrutura de repetição é equivalente à estrutura ENQUANTO..FACA estudada em Lógica para Programação. A estrutura while tem a sintaxe:

while (expressão)

<bloco de instruções>;

O tipo da expressão deve ser lógica, ou seja, retornar verdadeiro ou falso. A expressão é avaliada, se não for nula (verdadeira), a instrução é executada e a expressão reavaliada. Esse ciclo continua até que a expressão tenha um valor nulo (falso), passando então o controle do programa para a instrução na linha seguinte ao ciclo.

A instrução que constitui o corpo do ciclo pode, na realidade, ser a instrução nula, uma única instrução ou um grupo de instruções.

Como exemplo desse tipo de ciclo, temos a seguinte função, que simples-mente espera até que se introduza o carácter ‘A’:

void espera()

{

char c;

c = ‘\0’;

while (c!=’A’)

scanf(“%c”,&c);

}

3.7 Estrutura de repetição (for)

Essa estrutura de repetição é equivalente à estrutura PARA..FACA estudada em Lógica para Programação. A estrutura for tem a sintaxe:

for (expr_1 ; expr_2 ; expr_3)

<bloco de instruções>;

Normalmente, expr_1 é uma inicialização (com uma instrução de atri-buição), expr_2 é uma condição (expressão relacional), que testa a variável de controle do ciclo para verificar quando deve sair do ciclo, e expr_3 é um incre-mento que define como a variável de controle do ciclo deve ser alterada cada vez que o ciclo é executado. O ciclo for será executado enquanto a condição for verdadeira. Quando a condição se tornar falsa, o programa prossegue na instrução a seguir ao ciclo.

Page 131: Básico Redes de Comp

AULA 3 • ALgORITMOS E PROgRAMAçãO

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

As expressões expr_1 e expr_3 são atribuições ou chamadas de funções, e expr_2 é uma expressão relacional. Qualquer uma das três partes pode ser omitida, apesar de terem de ser mantidos os ponto-e-vírgula. Quando expr_2 é omitida, o C substitui por uma constante não nula para que o teste retorne sempre verdadeiro. Por exemplo, o trecho:

for (;;) <bloco de instruções>;

é um ciclo infinito equivalente ao ciclo

while (1) <bloco de instruções>;

Um ciclo infinito pode ser interrompido se no seu corpo existir uma instrução break ou return.

O programa seguinte permite 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 é:

Page 132: Básico Redes de Comp

AULA 3 • ALgORITMOS E PROgRAMAçãO

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

do

{

<bloco de instruções>;

}

while (expressão);

A instrução é executada e depois é avaliada a expressão. Se for verdadeira, a instrução é executada novamente, e assim sucessivamente, até que a expressão seja falsa (valor nulo).

O ciclo do..while é análogo ao ciclo REPITA..ATE estudado em Lógica para Programação.

O programa seguinte lê inteiros do teclado até que seja introduzido um número não superior a 100.

#include <stdio.h>

void main( )

{

int n;

do {

scanf(“%d”,&n);

} while (n>100);

}

Síntese da aulaNesta 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.

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

Page 133: Básico Redes de Comp

AULA 3 • ALgORITMOS E PROgRAMAçãO

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

a)

if (tecla == ‘1’) {

Funcao1 ( );

}

if (tecla == ‘2’) {

Funcao2 ( );

}

if (tecla == ‘3’) {

Funcao3 ( );

}

printf (“\nOpção invalida!”);

c)

switch (tecla) {

case ‘1’: Funcao1 ( );

break;

case ‘2’: Funcao2 ( );

break;

case ‘3’: Funcao3 ( );break;

default: printf (“\nOpção invalida!”);}

b)

if (tecla == ‘1’) {

Funcao1 ( );

if (tecla == ‘2’) {

Funcao2 ( );

if (tecla == ‘3’) {

Funcao3 ( );

}

}

}

printf (“\nOpção invalida!”);

d)

switch (tecla) {case ‘1’: Funcao1 ( );case ‘2’: Funcao2 ( );case ‘3’: Funcao3 ( );default: printf (“\nOpção invalida!”);

}

e) Nenhuma das alternativas anteriores apresenta um código equivalente.

2. Escreva um programa, em Linguagem C, que implemente as principais opera-ções aritméticas de um calculadora simples. O programa deverá ler dois valores reais e a operação a partir do teclado e, em seguida, imprimir o resultado correspondente à operação. Esse procedimento deverá ser repetido até que seja informado o valor 0 como primeiro valor da operação.

Comentário das atividades

Na atividade 1, de acordo com o que você estudou nesta aula sobre as estru-turas de seleção, deveria ter percebido que o trecho de código a ser substituído apresenta um aninhamento de comandos if’s. Você deveria lembrar que essa cons-trução é comumente usada para seleções de múltipla escolha. Deveria ter se recor-dado também que o C possui uma instrução específica para o caso de seleção de múltipla escolha – o comando switch..case. Assim, você rapidamente excluiria as

Page 134: Básico Redes de Comp

AULA 3 • ALgORITMOS E PROgRAMAçãO

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

opções (a) e (b), que apresentam soluções com if’s. Com isso, você deveria ter avaliado as opções restantes e ter percebido que a opção correta é a opção (c), pois esta apresenta a construção correta de múltipla escolha usando o comando switch..case; a opção (d), apesar de usar esse comando, possui uma construção sem o uso do comando break e, como você estudou nesta aula, isso faz com que, independentemente do caso para o qual a condição de teste seja idêntica, serão executados TODOS os comandos a seguir dessa opção; e, como você encontrou uma alternativa correta, a opção (e) é, naturalmente, incorreta.

Na atividade 2, usando as estruturas que foram estudadas nesta aula, você deveria estar apto a responder a essa atividade de diferentes formas. Deveria ter notado que a solução envolve estruturas de seleção e repetição. Uma solução possível é mostrada a seguir com uso da estrutura de repetição do..while. Cabe ressaltar que essa solução pode ser reescrita com o uso da estrutura while. Assim como no teste da operação escolhida, você poderia usar tanto o aninhamento de if’s quanto a estrutura switch..case.

#include <stdio.h>int main( ){ float valor1, valor2; char operacao; do { printf (“\nDigite o primeiro valor: “); scanf (“%f”, &valor1); if (valor1 != 0) { printf (“\nDigite o segundo valor: “); scanf (“%f”, &valor2); printf (“\nEscolha a operacao [+, -, * ou / ]: “); scanf (“%c”, &operacao); if (operacao == ‘+’) { printf (“\Resultado: %f”, (valor1+valor2)); } else if (operacao == ‘-‘) { printf (“\Resultado: %f”, (valor1+valor2)); } else if (operacao == ‘*‘) { printf (“\Resultado: %f”, (valor1+valor2)); } else if (operacao == ‘/‘) { printf (“\Resultado: %f”, (valor1+valor2)); } } } while (valor1 > 0);}

Page 135: Básico Redes de Comp

AULA 3 • ALgORITMOS E PROgRAMAçãO

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

ReferênciasASCENCIO, 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

Page 136: Básico Redes de Comp

AULA 3 • ALgORITMOS E PROgRAMAçãO

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

Page 137: Básico Redes de Comp

AULA 4 • ALgORITMOS E PROgRAMAçãO

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

Objetivos

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

entender os conceitos relacionados ao uso de funções na Linguagem C;•

implementar funções nessa linguagem.•

Pré-requisitos

Para atingir os objetivos declarados para esta aula, é fundamental que você já saiba codificar um programa em C usando variáveis e as principais estruturas de controle. Isso é muito importante para que você possa entender os exemplos discutidos nesta aula.

Introdução

Em C, qualquer instrução a ser executada deve ser parte de uma função. Entre os programadores é comum ouvir a frase em C tudo é função. Assim, para que você possa programar com propriedade em C é imperativo que você conheça essa estrutura e seus detalhes. Nesta aula, abordaremos esse tema.

4.1 Funções

Uma função em C é declarada usando a seguinte sintaxe geral:

TIPO NOME (PARÂMETROS)

{

CORPO

}

Onde:

Aula 4Modularização em C: uso de

Funções

Page 138: Básico Redes de Comp

AULA 4 • ALgORITMOS E PROgRAMAçãO

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

TIPO é o tipo de valor retornado pela função. Se nada for espe-•

cificado, o compilador considera que será retornado um valor

inteiro;

NOME é o nome da função;•

PARÂMETROS é a lista das variáveis que recebem os argumentos •

quando a função é chamada. Deve incluir o tipo e nome de cada

variável. Sua sintaxe é: (tipo1 variável1, tipo2 variável2, ...,

tipo3 variávelN);

CORPO é onde estão as instruções da função.•

A seguir, é mostrado um exemplo de uma função. A função soma()

possui dois parâmetros do tipo inteiro e retorna uma valor também inteiro,

representando a soma dos dois parâmetros.

int soma(int x,int y)

{

int resultado;

resultado = x + y;

return(resultado);

}

4.2 Variáveis em funções

As variáveis criadas em uma função são locais, assim serão destruídas

após o término da função.

Caso em uma variável local a função tenha o mesmo nome de uma vari-

ável global, a variável local será usada, e não a global. Recomendamos

que as variáveis globais sejam evitadas na programação em C. Ao invés

disso, você deve trabalhar sempre com a passagem de parâmetros entre

as funções.

4.3 Argumentos e parâmetros

Argumentos são os valores usados para chamar a função, e parâmetros

são as variáveis, declaradas na definição da função, que recebem esses

argumentos. Para ficar mais claro, observe o exemplo a seguir.

Page 139: Básico Redes de Comp

AULA 4 • ALgORITMOS E PROgRAMAçãO

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

/* Argumentos e parâmetros */

#include <stdio.h>

int soma(int a, int b) /* “a” e “b” são os parâmetros da função “soma” */

{

int resultado;

resultado = a + b;

return(resultado);

}

int main()

{

printf(“A soma entre 5 e 2 é %d\n”,soma(5,2));

/* No comando printf a função “soma” é chamada com os argumentos 5 e 2 */

return(0);

}

Os tipos dos argumentos devem ser compatíveis com os tipos dos parâmetros.

Você encontrará também referência aos parâmetros formais e parâmetros

reais. Os parâmetros formais são os parâmetros propriamente ditos, enquanto

que os parâmetros reais são os argumentos.

4.4 Declaração de parâmetros

Existem duas formas de declaração de parâmetros em funções: a forma clás-

sica e a forma moderna.

A forma clássica tem a seguinte sintaxe:

TIPO NOME(PARÂMETRO1, PARÂMETRO2, ... , PARÂMETROn)

TIPO DO PARÂMETRO1;

TIPO DO PARÂMETRO2;

...

...

TIPO DO PARÂMETROn;

{

CORPO DA FUNÇÃO

}

Page 140: Básico Redes de Comp

AULA 4 • ALgORITMOS E PROgRAMAçãO

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

Já a forma moderna tem a seguinte sintaxe:

TIPO NOME (TIPO PARÂMETRO1, TIPO PARÂMETRO2, ... , TIPO PARÂMETROn)

{

CORPO DA FUNÇÃO

}

A seguir, segue um exemplo de função com os dois tipos de declaração de parâmetros.

/* Com declaração clássica */

int soma(a, b)

int a;

int b;

{

int resultado;

resultado = a + b;

return(resultado);

}

/* Com declaração moderna */

int soma(int a, int b)

{

int resultado;

resultado = a + b;

return(resultado);

}

Atualmente, utiliza-se a forma moderna, porém, em programas mais antigos, você encontrará a forma clássica.

4.5 Chamada por valor e chamada por referência

A chamada por valor é a passagem normal do valor dos argumentos para a função. Utilizando essa chamada, os valores dos argumentos passados não são modificados. Na realidade, é passada uma cópia dos valores para a função.

Na chamada por referência, são passados os endereços de memória onde estão os argumentos. Nesse tipo de chamada, os valores podem ser modificados.

Page 141: Básico Redes de Comp

AULA 4 • ALgORITMOS E PROgRAMAçãO

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

É importante lembrar que as strings e matrizes sempre são chamadas por referência. Quando C passa uma matriz ou string para uma função, é passado o endereço inicial da matriz ou função.

4.6 O comando return

O comando return é usado para encerrar a função e retornar um valor para a função chamadora.

O valor retornado pela instrução return deve ser compatível com o tipo da função, o qual é definido quando da sua declaração. Se uma função não retornar nenhum valor, ela deve ser declarada como do tipo void.

De acordo com o padrão ANSI, a função main devolve um inteiro para o processo chamador, que geralmente é o sistema operacional. Isso é equiva-lente a chamar exit com o mesmo valor. Alguns compiladores ainda aceitam que main seja declarada como void, caso não retorne nenhum valor.

4.7 Protótipo de função

A chamada a uma função deve vir, a princípio, após sua definição para o compilador conhecer os tipos de parâmetros e o tipo de retorno da função. Porém você pode chamar a função antes da definição desta. Para isso, declare apenas um protótipo da função, o qual tem apenas o valor de retorno e os parâmetros da função. Na verdade, é uma forma de você informar ao compi-lador as características fundamentais da função (nome, tipo de retorno, parâ-metros, etc). Além disso, essa estratégia é particularmente útil em casos em que uma função chama outra e podemos ter problemas de precedência, pois uma função chamada já deve ter sido declarada.

Observe o exemplo a seguir:

#include <stdio.h>int soma(int a, int b); /* protótipo da função */int main( ){ int nr1, nr2; printf(“Entre com o primeiro número :”); scanf(“%d”,&nr1); printf(“Entre com o segundo número :”); scanf(“%d”,&nr2); printf(“\n%d + %d = %d\n\n”,nr1,nr2,soma(nr1,nr2)); return(0);}

Page 142: Básico Redes de Comp

AULA 4 • ALgORITMOS E PROgRAMAçãO

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

int soma(int a, int b) /* função propriamente dita */

{

int resultado;

resultado = a + b;

return(resultado);

}

Síntese da aula

Nesta aula, você estudou o principal conceito da Linguagem C – as Funções. O domínio desse conceito garante uma programação otimizada. Foram discutidos também os aspectos básicos da declaração e uso de funções, como os parâmetros e os argumentos.

Atividades

1. Suponha que você precise criar uma função calculaAreaTrapezio para calcular a área de um trapézio. A área A do trapézio é o produto da média aritmética entre as medidas das bases pela medida da altura, isto é, A=((base1+base2)*h)/2. Nessas condições, indique a alternativa que apresenta a declaração correta para essa função.

a) int calculaAreaTrapezio (float base1, float base2, int altura)

b) float calculaAreaTrapezio (float base1, float base2, float altura)

c) int calculaAreaTrapezio (float base1, float base2, float altura)

d) int calculaAreaTrapezio (int base1, int base2, int altura)

e) float calculaAreaTrapezio (float base, int altura)

2. Implemente, em Linguagem C, a função float porcento (parcela: float, porcentagem: float), que recebe como parâmetros dois valores: um repre-senta o valor parcela e outro representando a porcentagem a ser aplicada sobre o valor, por exemplo 4,5 (representando 4,5%). Essa função deverá retornar o valor correspondente à porcentagem passada como argumento.

3. Em uma das atividades da aula anterior, foi apresentado o seguinte problema: implemente um programa, em Linguagem C, que implemente as principais operações aritméticas de um calculadora simples. O programa deverá ler dois valores reais e a operação a partir do teclado e, em

Page 143: Básico Redes de Comp

AULA 4 • ALgORITMOS E PROgRAMAçãO

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

seguida, imprimir o resultado correspondente à operação. Esse procedi-mento deverá ser repetido até que seja informado o valor 0 como primeiro valor da operação.

E foi comentada a seguinte solução:

#include <stdio.h>int main( ){ float valor1, valor2; char operacao;

do { printf (“\nDigite o primeiro valor: “); scanf (“%f”, &valor1); if (valor1 != 0) {

printf (“\nDigite o segundo valor: “); scanf (“%f”, &valor2); printf (“\nEscolha a operacao [+, -, * ou / ]: “); scanf (“%c”, &operacao);

if (operacao == ‘+’) { printf (“\Resultado: %f”, (valor1+valor2)); } else if (operacao == ‘-‘) { printf (“\Resultado: %f”, (valor1+valor2)); } else if (operacao == ‘*‘) { printf (“\Resultado: %f”, (valor1+valor2)); } else if (operacao == ‘/‘) { printf (“\Resultado: %f”, (valor1+valor2)); } } } while (valor1 > 0);

}

Assim, para esta atividade, reescreva essa solução de modo que cada operação aritmética seja realizada por uma função diferente.

Comentário das atividades

Na atividade 1, deveria ter ficado claro que a função calculaAreaTra-pezio deveria retornar um tipo de dado float, uma vez que a sua fórmula

Page 144: Básico Redes de Comp

AULA 4 • ALgORITMOS E PROgRAMAçãO

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

pode gerar valores com casas decimais em função do uso do operador de

divisão. Assim, você já deveria ter descartado as opções (a), (c) e (d). Além

desse problema, algumas dessas opções apresentam também problemas

de inadequação de tipos de dados. Ao analisar as opções restantes, você

deveria ter notado que a opção (e) apresenta uma insuficiência de parâ-

metros, uma vez que, para o cálculo da área de um trapézio, precisamos

saber os valores das duas bases. Então, deveria ter ficado claro que a opção

correta é a opção (b).

Na atividade 2, deveria ter sido facilmente solucionada com o conteúdo

que você estudou nesta aula. Apesar da multiplicidade de soluções, a seguir é

apresentada uma delas.

float porcento (float parcela, float porcentagem)

{

float resultado;

resultado = parcela*(porcentagem/100);

return (resultado);

}

Você poderia ainda usar seus conhecimentos sobre expressões a fim de

reduzir o número de instruções em sua função. Lembre-se de que, quanto menos

instruções, mais rápido o seu programa executará. A solução melhorada é

mostrada a seguir.

float porcento (float parcela, float porcentagem)

{

return (parcela*(porcentagem/100));

}

Na atividade 3, você deveria ter criado no código uma função para cada

operação aritmética (soma, subtração, multiplicação e divisão) que recebe dois

parâmetros do tipo float e retorne o resultado da operação – o que implica

em definir a função como sendo também do tipo float. E, na impressão do

resultado, você deveria invocar cada função correspondente à sua operação,

passando como argumentos os valores das variáveis valor1 e valor2. O código

resultante é mostrado a seguir.

Page 145: Básico Redes de Comp

AULA 4 • ALgORITMOS E PROgRAMAçãO

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

#include <stdio.h>float soma (float a, float b) { return (a+b);}float subtrai (float a, float b) { return (a-b);}float multiplica (float a, float b) { return (a*b);}float divide (float a, float b) { return (a/b);}int main(){ float valor1, valor2; char operacao; do { printf (“\nDigite o primeiro valor: “); scanf (“%f”, &valor1); if (valor1 != 0) { printf (“\nDigite o segundo valor: “); scanf (“%f”, &valor2); printf (“\nEscolha a operacao [+, -, * ou / ]: “); scanf (“%c”, &operacao); if (operacao == ‘+’) { printf (“\Resultado: %f”, soma (valor1,valor2)); } else if (operacao == ‘-‘) { printf (“\Resultado: %f”, subtrai (valor1,valor2)); } else if (operacao == ‘*‘) { printf (“\Resultado: %f”, multiplica (valor1,valor2)); } else if (operacao == ‘/‘) { printf (“\Resultado: %f”, divide (valor1,valor2)); } } } while (valor1 > 0);}

Page 146: Básico Redes de Comp

AULA 4 • ALgORITMOS E PROgRAMAçãO

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

ReferênciasASCENCIO, 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

Page 147: Básico Redes de Comp

AULA 5 • ALgORITMOS E PROgRAMAçãO

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

Objetivos

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

utilizar vetores e matrizes na construção de programas em C;•

utilizar estruturas (• structs) na construção de programas nessa linguagem.

Pré-requisitos

Para esta aula, é fundamental que você conheça os conceitos que envolvem o uso de variáveis e tipos de dados na Linguagem C. Se você ainda tem dúvidas sobre esse assunto, recorra ao seu caderno e reveja o conteúdo estudado. Não fique com dúvidas!

Introdução

Em C, existem tipos especiais de variáveis que permitem manipular mais de um tipo de dados ao mesmo tempo. O uso dessas estruturas permite a mani-pulação de grandes conjuntos de dados, além de diminuir a complexidade do programa e as possibilidades de erros.

Nesta aula, estudaremos as principais estruturas disponíveis na Linguagem C: vetores, matrizes e estruturas.

5.1 Estruturas de dados homogêneas (vetores e matrizes)

As estruturas homogêneas são aquelas que armazenam dados de um mesmo tipo. Na Linguagem C, possuímos duas estruturas desse tipo: os vetores e matrizes.

5.1.1 Vetores ou array

Existem situações em que precisamos manipular muitas variáveis, cada qual mais ou menos com a mesma função. Isso acontece quando trabalhamos com

Aula 5Estruturas de dados homogêneas

(vetores e matrizes) e heterogêneas (estruturas)

Page 148: Básico Redes de Comp

AULA 5 • ALgORITMOS E PROgRAMAçãO

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

listas ou seqüências de números. Por exemplo, a média de uma lista de n números, X1, X2, ..., Xn, é definida como: média = (X1 + X2 + ... + Xn) / n e o desvio de cada número em relação à média é dado pela fórmula: desvio = Xi - média , para i = 1,2,...,n. considere que queremos fazer um programa para calcular a média de uma lista de 10 números e o desvio de cada número em relação à média. Com o uso de variáveis simples, teríamos de fazer algo semelhante à:

float x1, x2, x3, x4, x5, x6, x7, x8, x9, x10;

float d1, d2, d3, d4, d5, d6, d7, d8, d9, d10;

float media;

...

media = (x1+x2+x3+x4+x5+x6+x7+x8+x9+x10) / 10;

d1 = x1 - media;

d2 = x2 - media;

...

d10 = x10 - media;

Se em vez de 10 números fossem 100, teríamos de declarar 100 variá-veis, e isso seria um grande trabalho. É aqui que se torna extremamente útil o conceito de vetor ou array. A definição float x[10]; define um array de nome x com 10 posições, cada uma correspondendo a uma variável do tipo float. Um array é como se fosse uma lista ou seqüência de variáveis. Na linguagem C, os arrays começam sempre na posição 0. Por isso a declaração float x[10] define as variáveis x[0], x[1], x[2], ..., x[9].

Depois de definido o array, os seus elementos podem ser acessados e modificados individualmente, tal como nas variáveis que estudamos até agora. Por exemplo:

x[7] = 54;

a = x[7].

A sintaxe geral para a definição de um array em C é:

tipo nome[dimensão].

Se quisermos definir um array de nome notas com 5 posições, cada qual podendo conter um número inteiro, temos de escrever:

Page 149: Básico Redes de Comp

AULA 5 • ALgORITMOS E PROgRAMAçãO

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

int notas[5]

Ao trabalhar com array, você deve ter cuidado e não acessar uma posição fora dos limites do array. Por exemplo, se for definido o array:

float x[10];

e tentarmos acessar o elemento x[12], o compilador não dá erro, mas o programa vai se comportar de um modo imprevisível.

5.1.2 Matrizes

Uma matriz em C é um array com mais de uma dimensão. Por exemplo:

int a[3][4];

define um array de 2 dimensões, como se fosse uma tabela com 3 linhas e 4 colunas. Cada elemento da tabela é do tipo inteiro. Não se esqueça de que, na Linguagem C, os arrays começam na posição zero.

5.2 Estruturas de dados heterogêneas (estruturas ou structs)

As estruturas em C são equivalentes ao tipo de dado registro que você estudou em Lógica para Programação, e são utilizadas para agrupar infor-mações relacionadas de tipos de dados diferentes. Digamos que você precisa controlar os dados relacionados ao estoque de um pequeno estabe-lecimento comercial. Dessa forma, para cada produto seriam armazenados dados como:

código•

nome do produto•

quantidade estocada•

valor de compra•

valor de venda•

margem de lucro•

observações sobre o produto•

Esse seria um caso para o uso de estruturas, pois todos os dados estão relacionados a cada produto. Cada dado possui um tipo diferente, como:

int• : código e quantidade

char• : nome e observações

float• : valor de compra, valor de venda e margem de lucro

Page 150: Básico Redes de Comp

AULA 5 • ALgORITMOS E PROgRAMAçãO

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

5.2.1 Declarando uma estrutura

A sintaxe para a declaração (ou criação) de uma estrutura é:

struct NOME_DA_ESTRUTURA

{

TIPO CAMPO1;

TIPO CAMPO2;

...........

...........

TIPO CAMPOn;

};

Para o caso exemplificado no item anterior, poderíamos ter algo como:

struct produto

{

int codigo;

char nome[50];

int quantidade;

float valor_compra;

float valor_venda;

float margem_lucro;

char observacao[200];

};

É importante observar que a declaração da estrutura não cria, ainda, uma variável. A declaração da estrutura apenas cria um novo tipo de dado. Somente após criar a estrutura você pode declarar variáveis do tipo de estru-tura criado.

5.2.2 Declarando variáveis do tipo de uma estrutura criada

Após a declaração da estrutura, você pode declarar variáveis do tipo da estrutura com a sintaxe:

struct NOME_DA_ESTRUTURA NOME_DA_VARIÁVEL;

Exemplo:

struct produto item;

Page 151: Básico Redes de Comp

AULA 5 • ALgORITMOS E PROgRAMAçãO

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

Observe que essa sintaxe obedece à sintaxe normal para a declaração de variáveis:

TIPO NOME_DA_VARIÁVEL;

sendo o TIPO da variável, a nova estrutura criada (struct NOME_DA_ESTRUTURA).

Você também pode declarar a variável logo após a declaração da estru-tura com uma sintaxe do tipo:

struct produto

{

int codigo;

char nome[50];

int quantidade;

float valor_compra;

float valor_venda;

float lucro;

char obs[200];

} item;

O exemplo acima declara a variável item como sendo do tipo “struct produto” logo após a definição dessa estrutura.

5.2.3 Acessando os campos de uma estrutura

Na sintaxe para acessar e manipular campos de estruturas é usado o operador “ponto” seguindo a seguinte sintaxe:

NOME_DA_ESTRUTURA.CAMPO

Observe o código a seguir para entender melhor como manipular os campos de uma variável do tipo estrutura.

#include <stdio.h>/* criando um novo tipo de dado “produto” */struct produto{ int codigo; char nome[50]; int quantidade; float valor_compra; float valor_venda;};

Page 152: Básico Redes de Comp

AULA 5 • ALgORITMOS E PROgRAMAçãO

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

int main()

{

struct produto item; /* declarando uma variável “item” do tipo “struct produto” */

printf(“Preenchendo a variável \”item\”\n”);

printf(“Item............:”);

fgets(item.nome,50,stdin);

printf(“Código..........:”);

scanf(“%d”,&item.codigo);

printf(“Quantidade......:”);

scanf(“%d”,&item.quantidade);

printf(“Valor de compra.:”);

scanf(“%f”,&item.valor_compra);

printf(“Valor de revenda:”);

scanf(“%f”,&item.valor_venda);

printf(“\n”);

printf(“Exibindo os dados\n”);

printf(“Código..........:%d\n”,item.codigo);

printf(“Item............:%s”,item.nome);

printf(“Quantidade......:%d\n”,item.quantidade);

printf(“Valor de compra.:%.2f\n”,item.valor_compra);

printf(“Valor de revenda:%.2f\n”,item.valor_venda);

return(0);

}

5.2.4 Acessando uma estrutura com ponteiros

Estudaremos ponteiros na aula seguinte. Entretanto apresentaremos desde já como manipular uma variável do tipo ponteiro para uma estrutura.

Para acessar uma estrutura usando ponteiros, você pode usar duas sintaxes:

(*NOME_DA_ESTRUTURA).CAMPO

ou

NOME_DA_ESTRUTURA->CAMPO

Observe o uso de estruturas com ponteiros no exemplo a seguir:

Page 153: Básico Redes de Comp

AULA 5 • ALgORITMOS E PROgRAMAçãO

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

#include <stdio.h>

struct registro

{

char nome[30];

int idade;

};

altera_estrutura1(struct registro *ficha)

{

(*ficha).idade -= 10;

}

altera_estrutura2(struct registro *ficha)

{

ficha->idade += 20;

}

int main()

{

struct registro ficha;

printf(“Entre com seu nome:”);

fgets(ficha.nome,30,stdin);

printf(“Qual sua idade?”);

scanf(“%d”,&ficha.idade);

printf(“\nExibindo os dados iniciais\n”);

printf(“Nome: %s”,ficha.nome);

printf(“Idade: %d.\n”,ficha.idade);

altera_estrutura1(&ficha);

printf(“\nExibindo os dados após a primeira alteração\n”);

printf(“Nome: %s”,ficha.nome);

printf(“Idade: %d.\n”,ficha.idade);

altera_estrutura2(&ficha);

printf(“\nExibindo os dados após a segunda alteração\n”);

printf(“Nome: %s”,ficha.nome);

printf(“Idade: %d.\n”,ficha.idade);

return(0);

}

Page 154: Básico Redes de Comp

AULA 5 • ALgORITMOS E PROgRAMAçãO

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

Síntese da aula

Nesta aula, você estudou os elementos da Linguagem C que permitem manipular grandes conjuntos de dados, nomeadamente: vetores, matrizes e estruturas (structs). A diferença básica entre eles está na possibilidade ou não de agrupar dados de diferentes tipos. Vetores e matrizes, por exemplo, só permitem manipular dados de um mesmo tipo. Já as estruturas permitem mani-pular, ao mesmo tempo, dados de diferentes tipos.

Atividades

1. Sobre o trecho de código a seguir:

#include <stdio.h>

int main()

{

int numeros[10];

int i;

numeros[0] = 1;

for (i=1; i<10; i++) {

numeros[i] = numeros[i-1]*2;

}

for (i=0; i<10; i++) {

printf (“%d, ”, numeros[i]);

}

}

É correto afirmar que a saída que esse programa produz é:

a) 1, 2, 4, 6, 8, 10, 12, 14, 16, 18

b) 1, 2, 4, 8, 16, 32, 64, 128, 256, 512

c) 1, 2, 3, 4, 5, 6, 7, 8, 9, 10

d) 1, 3, 5, 7, 9, 11, 13, 15, 17, 19

e) 2, 2, 2, 2, 2, 2, 2, 2, 2, 2

2. Implemente um programa que leia os dados de um conjunto de cinco alunos e armazene esses dados em um vetor de estrutura. Deverá ser armazenado o nome, a nota do primeiro bimestre e a nota do segundo bimestre. Após a leitura dos dados de todos os alunos, o programa deverá imprimir, para cada, aluno a sua média semestral (média aritmética das notas bimestrais).

Page 155: Básico Redes de Comp

AULA 5 • ALgORITMOS E PROgRAMAçãO

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

Comentário das atividades

Na atividade 1, ao analisar o código, você deveria ter notado que a instrução mais importante do algoritmo está na primeira estrutura de repetição do tipo for. Nela, os valores do vetor são inicializados sempre a partir do anterior. Na verdade, o próximo sempre recebe o valor dobrado do anterior. Para garantir o funcionamento do algoritmo, a instrução números[0] = 1; faz com que a seqüência de saída tenha início em 1. Assim, se cada elemento é o dobro do anterior, teremos a seqüência “1, 2, 4, 8, 16, 32, 64, 128, 256, 512”, indicando que a opção correta é a opção (b).

Na atividade 2, usando os conceitos estudados nesta aula, você deveria ter definido uma estrutura para representar cada aluno e, em seguida, declarado um vetor desse tipo representando a lista de alunos. Então, poderia percorrer todo o vetor usando uma estrutura de repetição, na qual, para cada posição do vetor, deveriam ser lidos os dados sobre o aluno. Após o preenchimento do vetor, você deveria percorrê-lo novamente imprimindo o nome do aluno e média aritmética das notas bimestrais. Uma solução para esse problema é mostrada a seguir.

#include <stdio.h>

struct TAluno { char nome[80]; float nota1; float nota2;};

int main(){ struct TAlunos alunos[5]; int i; for (i=0; i<5; i++) { printf (“\Nome do aluno: “); scanf (“%s”, &alunos[i].nome); printf (“\Nota do primeiro bimestre: “); scanf (“%s”, &alunos[i].nota1); printf (“\Nota do segundo bimestre: “); scanf (“%s”, &alunos[i].nota2); }

Page 156: Básico Redes de Comp

AULA 5 • ALgORITMOS E PROgRAMAçãO

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

/* Imprimindo as medias dos alunos */for (i=0; i<5; i++){

printf (“\nAluno: %s \t\t\t Media: %f”, alunos[i].nome, (alunos[i].valor1+ alunos[i].valor2)/2);

}}

ReferênciasMIZRAHI, 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

Page 157: Básico Redes de Comp

AULA 6 • ALgORITMOS E PROgRAMAçãO

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

Objetivos

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

entender o conceito e uso de ponteiros na programação em C;•

utilizar ponteiros na construção de programas em C.•

Pré-requisitos

Além do conhecimento sobre variáveis e tipos de dados em linguagem C, para esta aula é desejável que você conheça, ainda que um pouco, sobre a organização de memória de um computador. Caso tenha dúvidas quanto a esse assunto, procure a web-tutoria!

Introdução

Um ponteiro é uma variável que permite guardar o endereço de outra variável. Assim, quando uma variável contém o endereço de memória de outra variável, diz-se que a primeira aponta para a segunda. A figura 1 demonstra como uma variável desse tipo é manipulada.

endereço de memória valor na memória1000 1003100110021003100410051006

... ...Figura 1. Os ponteiros em memória.

Um ponteiro, em essência, é uma posição de memória.

Aula 6Ponteiros e alocação dinâmica

Page 158: Básico Redes de Comp

AULA 6 • ALgORITMOS E PROgRAMAçãO

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

6.1 Declaração de ponteiros

Para declarar uma variável como ponteiro, usa-se a sintaxe:

tipo *nome_variável;

O caractere asterisco usado após o tipo de dado indica ao compilador

que se trata de uma variável do tipo ponteiro (apontador) para uma posição

de memória que armazena um valor daquele tipo.

6.2 Operando sobre ponteiros

Um ponteiro deve ser sempre inicializado antes de seu uso. Caso

contrário, você correrá o risco de realizar um acesso indevido a alguma

posição de memória protegida. Isso levaria a um erro no programa.

Para iniciar uma variável do tipo ponteiro, é usado o operador &. Esse

operador é um operador unário que retorna o endereço da variável sobre a

qual opera. Assim, o comando ptr = &x fará com que ptr receba como valor

o endereço da variável x.

Outro operador importante na manipulação de ponteiros é o operador

*, que permite acessar o conteúdo da posição de memória apontada pela

variável do tipo apontador. Por exemplo, se ptr aponta para x, então *ptr

retorna o valor de x. Usando os operadores do C, poderíamos construir a

seguinte expressão válida (*&x == x).

Para que você possa entender melhor essas operações sobre variáveis

do tipo ponteiro, vamos considerar o seguinte exemplo:

px = &x;

y = *px +1;

*px += 1;

A segunda instrução toma o valor apontado por px, adiciona a ele uma

unidade e atribui o resultado à variável y, enquanto a instrução *px += 1;

incrementa o valor no endereço px, tal como ++*px e (*px)++. No último

caso, são necessários os parênteses, pois sem eles a instrução incrementa o

ponteiro e não o valor por ele apontado, dado que os operadores unários

* e ++ são associativos da direita para a esquerda.

Page 159: Básico Redes de Comp

AULA 6 • ALgORITMOS E PROgRAMAçãO

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

Em C existe uma relação muito próxima entre os ponteiros e vetores. Consideremos que as variáveis st e p são declaradas da seguinte forma:

char st[80], *p;

Para pôr na variável p (que é um ponteiro para char) o endereço do primeiro elemento de st (vetor de caracteres ou string), podemos fazer a atribuição:

p = &st[0];

Mas, na Linguagem C, o nome de um vetor sem índice é o endereço do elemento inicial, pelo que, em essência, o nome de um vetor é um ponteiro para o vetor. Poderíamos, então, fazer a atribuição p = &st[0]; usando a forma equivalente:

p = st;

Depois disso, para acessar ao quinto elemento do vetor, poderíamos usar st[4] ou *(p+4). Ainda podemos acessar ao quinto elemento do vetor usando *(st+4) ou p[4], ou seja, podemos indexar ponteiros e usar os operadores de ponteiros com variáveis do tipo vetor. Assim, a linguagem C permite duas formas de acessar vetores: usando índices ou a aritmética de ponteiros. Essa última é bem mais rápida, e dado que a velocidade de execução é importante em programação, o seu uso é bastante comum em C.

Podemos também atribuir o endereço de qualquer outro elemento de um vetor a um ponteiro.

Apesar da grande utilidade dos ponteiros, devemos saber exatamente como usá-los. Com efeito, se um ponteiro tem um valor errado, provavel-mente produzirá um erro difícil de ser rastreado e associá-lo à causa.

Uma função também pode retornar um tipo de dado ponteiro.

Síntese da aula

Nesta aula, foram discutidos os principais conceitos relacionados ao uso de ponteiros na Linguagem C. Foi estudado também como os ponteiros podem ser utilizados para melhorar o desempenho de programas que precisam realizar muitos acessos à memória principal.

Page 160: Básico Redes de Comp

AULA 6 • ALgORITMOS E PROgRAMAçãO

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

Atividades1. 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 atividadesNa atividade 1, com base no que foi estudado sobre ponteiros, você

deveria ter concluído que a opção correta é a opção (e), pois, se fatorarmos as instruções, veremos claramente a alteração de seus valores até o seu valor final, para cada valor entrado. Vejamos.

Instrução Número *ptr_numero

prt_numero = &numero;

= 813645

813645

numero++;

914756

914756

Page 161: Básico Redes de Comp

AULA 6 • ALgORITMOS E PROgRAMAçãO

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

Instrução Número *ptr_numero

numero = ++(*prt_numero);

= 1015767

1015867

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ênciasASCENCIO, 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

Page 162: Básico Redes de Comp

AULA 6 • ALgORITMOS E PROgRAMAçãO

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

Page 163: Básico Redes de Comp

AULA 7 • ALgORITMOS E PROgRAMAçãO

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

Objetivos

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

compreender o modo como a Linguagem C manipula arquivos;•

usar as funções de manipulação de arquivos em seus programas.•

Pré-requisitos

Para esta aula, é importante que você já seja capaz de codificar algoritmos mais complexos na Linguagem C, usando as estruturas e conceitos discutidos nas aulas anteriores. Isso você conseguirá se tiver resolvido todas as atividades propostas nas aulas anteriores.

Introdução

O sistema de E/S de C utiliza o conceito de streams e arquivos. Uma stream é um dispositivo lógico que representa um arquivo ou dispositivo. A stream é independente do arquivo ou dispositivo. Devido a isso, a função que manipula uma stream pode escrever tanto em um arquivo no disco quanto em algum outro dispositivo, como o monitor.

Existem dois tipos de streams: de texto e binária.

Em uma stream de texto, podem ocorrer certas traduções de acordo com o sistema hospedeiro, ou seja, de acordo com a arquitetura do computador que irá rodar o programa. Por exemplo, um caractere de nova linha pode ser convertido para os caracteres retorno de carro e alimentação de linha ou um elemento do tipo float, gravado no sistema origem com valor de 1.37, pode ser lido com o valor de 1.36999997 no sistema hospedeiro. Devido a isso, pode não haver uma correspondência entre os caracteres da stream e do dispositivo externo; a quantidade de caracteres pode não ser a mesma.

Aula 7Arquivos

Page 164: Básico Redes de Comp

AULA 7 • ALgORITMOS E PROgRAMAçãO

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

A stream binária é uma seqüência de bytes com uma correspondência de um para um com os bytes encontrados no dispositivo externo, isto é, não ocorre nenhuma tradução de caracteres. O número de bytes é o mesmo do dispositivo.

Um arquivo é interpretado pela Linguagem C como qualquer dispositivo, desde um arquivo em disco até um terminal ou uma impressora. Para utilizar um arquivo você deve associá-lo a uma stream e, então, manipular a stream. Você associa um arquivo a uma stream por meio de uma operação de abertura.

Nem todos os arquivos têm os mesmos recursos. Por exemplo, um arquivo em disco pode suportar acesso aleatório, enquanto um teclado não. Isso porque a estrutura do arquivo está intimamente relacionada ao dispositivo a ele associado. Como no exemplo citado, do teclado, não há por que ler as informações digitadas de outra forma senão a seqüencial.

Do que foi discutido até aqui, concluímos que todas as streams são iguais, mas não todos os arquivos.

Se o arquivo suporta acesso aleatório, o ato de abri-lo inicializa o indi-cador de posição apontando para o começo do arquivo. Quando cada carac-tere é lido ou escrito no arquivo, o indicador de posição é incrementado.

Um arquivo é desassociado de uma stream por meio de uma operação de fechamento. Se um arquivo aberto para saída por fechado, o conteúdo de sua stream será escrito no dispositivo externo. Esse processo é geralmente chamado de descarga (flushing) da stream e garante que nenhuma informação seja acidentalmente deixada no buffer de disco.

A stream associa o arquivo a uma estrutura do tipo FILE. Essa estrutura é definida no arquivo de cabeçalho stdio.h.

7.1 Funções utilizadas para manipulação de arquivos

O C fornece um grande conjunto de funções para a manipulação de arquivos. As principais funções são descritas no quadro a seguir.

FUNçãO FUNCIONALIDADEfopen( ) Abrir um arquivofclose( ) Fechar um arquivoputc( ) Escrever um caracter em um arquivofputc( ) Idem putc( )getc( ) Ler um caracter de um arquivofgetc( ) Idem getc( )fseek( ) Posicionar o ponteiro de arquivo num byte específico

Page 165: Básico Redes de Comp

AULA 7 • ALgORITMOS E PROgRAMAçãO

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

FUNçãO FUNCIONALIDADEfprintf( ) É para o arquivo o que printf é para o consolefscanf( ) É para o arquivo o que scanf é para o consolefeof( ) Devolve verdadeiro se o fim do arquivo foi atingidoferror( ) Devolve verdadeiro se ocorreu um errorewind( ) Posicionar o ponteiro de arquivo no início desseremove( ) Apagar um arquivofflush( ) Descarregar um arquivofread( ) Lê um conjunto de bytes de um arquivofwrite( ) 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.

Page 166: Básico Redes de Comp

AULA 7 • ALgORITMOS E PROgRAMAçãO

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

7.3 Abrindo um arquivo

Apesar de o sistema de E/S de C considerar arquivo como qualquer dispo-

sitivo, daqui para frente consideraremos arquivo como um arquivo em disco.

Para abrir uma stream e associá-la a um arquivo, você usa a função fopen( ), cuja sintaxe é:

fopen(ARQUIVO,MODO)

em que ARQUIVO é um ponteiro para uma string que representa o nome do arquivo. Na prática, é o nome do arquivo propriamente dito e pode ser um PATH, ou seja, algo como “C:\docs\arquivo.txt”, no windows; ou algo como “/home/teste/arquivo.txt”, no Linux. MODO é uma string que representa como o arquivo será aberto de acordo com a lista a seguir.

MODO DESCRIçãOr Abre um arquivo texto para leitura.

wAbre um arquivo texto para escrita. Se um arquivo com o mesmo nome existir, será sobrescrito.

aAbre um arquivo texto para anexação. Se o arquivo não existir, será criado.

rb Abre um arquivo binário para leitura.

wbAbre um arquivo binário para escrita. Se um arquivo com o mesmo nome existir, será sobrescrito.

abAbre um arquivo binário para anexação. Se o arquivo não existir, será criado.

r+w+a+

Abre um arquivo texto para leitura/escrita. Se o arquivo não existir, será criado.

r+bw+ba+brb+wb+ab+

Abre um arquivo binário para leitura/escrita. Se o arquivo não existir, será criado.

É importante lembrar que, em muitas implementações, no modo texto, a seqüência de caracteres retorno de carro/alimentação de linha são traduzidas para nova linha na entrada. Na saída, ocorre o inverso: caracteres de nova linha são convertidos em retorno de carro/alimentação de linha. Em arquivos binários, não ocorre nenhuma tradução.

Caso tudo corra bem, a função fopen devolve um ponteiro de arquivo, caso ocorra algum problema, ela devolve NULL.

Page 167: Básico Redes de Comp

AULA 7 • ALgORITMOS E PROgRAMAçãO

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

Para abrir um arquivo texto chamado “teste” para escrita, você poderia escrever assim:

FILE *arquivo;

arquivo = fopen(“teste”,”w”);

Porém é recomendável sempre testar se o arquivo foi aberto sem problemas. Assim, sempre que for abrir um arquivo, você deve usar um código parecido com esse:

FILE *arquivo;

if((arquivo = fopen(“teste”,”w”)) == NULL)

{

printf(“Erro ao abrir arquivo!!!\n”);

exit(1);

}

Esse tipo de teste detectará algum problema, tipo disco cheio ou protegido contra gravação, antes que seu programa tente gravar nele.

O número máximo de arquivos que pode ser aberto ao mesmo tempo é definido pela macro FOPEN_MAX, normalmente definida em stdio.h. Confira se é o caso do seu compilador.

7.4 Fechando um arquivo

Para fechar uma stream, você deve usar a função fclose( ). Ela escreve qualquer dado que ainda permanece no buffer de disco no arquivo e o fecha em nível de sistema operacional. Uma falha ao fechar uma stream pode provocar problemas tipo perda de dados, arquivos destruídos e erros intermi-tentes em seu programa. A função fclose também libera o bloco de controle de arquivo associado à stream, deixando-o disponível para reutilização. Como, normalmente, há um limite do sistema operacional para o número de arquivos abertos ao mesmo tempo, você deve fechar um arquivo antes de abrir outro.

A sintaxe de fclose é:

fclose(ARQUIVO);

em que ARQUIVO é o ponteiro de arquivo devolvido por fopen quando essa abriu o arquivo. Caso o fechamento do arquivo ocorra sem problemas, fclose retorna zero. Qualquer outro valor indica erro.

Page 168: Básico Redes de Comp

AULA 7 • ALgORITMOS E PROgRAMAçãO

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

7.5 Escrevendo e lendo caracteres

Para escrever um caractere em um arquivo aberto, você pode usar duas funções: putc( ) ou fputc( ). Elas são idênticas. Essas duas funções existem apenas para preservar a compatibilidade com versões mais antigas do C. É lógico que, para escrever em um arquivo, esse deve ter sido aberto em um modo que permita a escrita.

A sintaxe da função putc( ) é:

putc(CARACTER,ARQUIVO);

em que CARACTER é o caractere a ser escrito no arquivo e ARQUIVO é um ponteiro de arquivo. Se ocorrer tudo bem, a função retorna o caractere escrito; caso contrário, ela retorna EOF.

Para ler um caractere, temos também duas funções: getc( ) e fgetc( ). Existem duas também pelo motivo da compatibilidade com versões mais antigas da linguagem C. Aqui o arquivo deve ter sido aberto em um modo que permita a leitura.

A sintaxe para a função getc( ) é:

getc(ARQUIVO);

em que ARQUIVO é um ponteiro de arquivo. Quando o final do arquivo é alcançado, a função devolve EOF.

7.6 Verificando o final de um arquivo binário

Quando temos de manipular arquivos em formato binário, um valor inteiro igual a EOF pode ser lido por engano. Isso poderia fazer com que fosse indi-cado o fim de arquivo incorretamente. Para resolver esse problema, o C inclui a função feof( ), que determina quando o final de um arquivo foi atingido. Ela tem a seguinte sintaxe:

feof(ARQUIVO);

em que ARQUIVO é um ponteiro de arquivo. Essa função faz parte de stdio.h e devolve verdadeiro caso o final de arquivo seja atingido; caso contrário, ela devolve 0.

7.7 Escrevendo e lendo strings

Para escrever e ler strings em um arquivo, use as funções fputs( ) e fgets( ), cujos protótipos encontram-se em stdio.h.

Page 169: Básico Redes de Comp

AULA 7 • ALgORITMOS E PROgRAMAçãO

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

A função fputs( ) escreve uma string na stream especificada, sua sintaxe é:

fputs(STRING,ARQUIVO);

em que ARQUIVO é um ponteiro de arquivo. Caso ocorra algum erro, será retornado o valor EOF.

fgets( ) lê uma string da stream especificada. Sua sintaxe é:

fgets(STRING,TAMANHO,ARQUIVO);

Essa função lê STRING até que um caractere de nova linha seja lido ou que TAMANHO - 1 caracteres tenham sido lidos. Se uma nova linha é lida, ela será parte da string. A string resultante terminará em nulo. Caso ocorra tudo bem, essa função retornará um ponteiro para STRING; caso contrário, retornará um ponteiro nulo.

7.8 Apontando para o início do arquivo

Para apontar para o início do arquivo, use a função rewind( ), cujo protó-tipo está no arquivo de cabeçalho stdio.h. Sua sintaxe é:

rewind(ARQUIVO);

em que ARQUIVO um ponteiro de arquivo, ou seja, uma variável do tipo FILE*.

7.9 Verificando se a operação com o arquivo produziu um erro

Para determinar se uma operação com o arquivo produziu um erro, use a função ferror( ). Seu protótipo está em stdio.h e sua sintaxe é:

ferror(ARQUIVO);

em que ARQUIVO um ponteiro de arquivo. Essa função retorna verdadeiro, se ocorreu um erro durante a última operação com o arquivo; caso contrário, retorna falso. Como cada operação modifica a condição de erro, ela deve ser chamada logo após cada operação realizada com o arquivo.

7.10 Apagando um arquivo

Para apagar uma arquivo, use a função remove( ). Ela faz parte de stdio.h e sua sintaxe é:

remove(ARQUIVO);

sendo ARQUIVO um ponteiro de arquivo.

Page 170: Básico Redes de Comp

AULA 7 • ALgORITMOS E PROgRAMAçãO

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

7.11 Esvaziando uma stream

Para esvaziar o conteúdo de uma stream aberta para saída, use a função fflush( ). Sua sintaxe é:

fflush(ARQUIVO);•

sendo ARQUIVO um ponteiro de arquivo. Ela escreve o conteúdo do buffer para o arquivo passado como argumento. Se for passado um valor nulo, todos os arquivos abertos para saída serão descarregados. Se tudo ocorrer bem, fflush retornará zero, indicando sucesso. Caso contrário, devolverá EOF.

7.12 Escrevendo e lendo tipos de dados definidos pelo usuário

Como já estudamos, o C permite que o usuário crie seus próprios tipos de dados. Esses tipos de dados são estruturas compostas de tipos de dados.

Para escrever e ler essas estruturas a partir de arquivos, podemos usar as funções fread( ) e fwrite( ). Elas são definidas em stdio.h.

A sintaxe de fread() é:

fread(VARIÁVEL,TAMANHO,QUANTIDADE,ARQUIVO);•

em que VARIÁVEL é o endereço da variável que receberá os dados lidos do arquivo.

TAMANHO é o número de bytes a ser lido. Para calcular esse valor você deve usar o operador sizeof(TIPO ou VARIÁVEL), que retorna o tamanho de um tipo ou expressão passado como parâmetro.

QUANTIDADE indica quantos itens serão lidos (cada item do tamanho de TAMANHO).

ARQUIVO é um ponteiro para o arquivo aberto anteriormente.

A sintaxe para fwrite( ) é idêntica, com a exceção que VARIÁVEL é o ende-reço da variável com os dados a serem escritos no arquivo.

O ponteiro de arquivo “ARQUIVO” deve ser aberto em modo binário, para podermos ler e escrever qualquer tipo de informação. Também deve ser aberto de acordo com a operação a ser feita (leitura ou escrita).

A função fread devolve o número de itens lidos. Esse valor poderá ser menor que QUANTIDADE se o final do arquivo for atingido ou ocorrer um erro.

A função fwrite devolve o número de itens escritos. Esse valor será igual à QUANTIDADE, a menos que ocorra um erro.

Page 171: Básico Redes de Comp

AULA 7 • ALgORITMOS E PROgRAMAçãO

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

7.13 Streams padrão

Quando um programa em Linguagem C é iniciado, são abertas três streams: stdin, stdout e stderr.

Stdin define a entrada padrão do sistema, normalmente o teclado.

Stdout define a saída padrão do sistema, normalmente o monitor.

Stderr define a saída padrão dos erros, normalmente também é o monitor.

Essas streams são ponteiros de arquivos e podem ser redirecionadas.

Obs.: esta aula foi baseada nos escritos do autor Samuel Dias Neto que se encontra disponível no site: <http://br.geocities.com/sdiasneto/c_int/arquivos.htm>.

Síntese da aula

Nesta aula, foram discutidos os principais conceitos relacionados com o uso de arquivos na linguagem C.

Atividades

1. Com base nos conceitos estudados nesta aula, é incorreto afirmar que:

a) a instrução FILE *fp define a variável fp como sendo do tipo apontador para arquivo;

b) a instrução fopen(“c:\teste.dat”,”rw+”) abre um arquivo texto para leitura/escrita. Se o arquivo não existir, será criado;

c) a instrução fopen(“c:\teste.dat”,”rb”) abre um arquivo binário para leitura. Se o arquivo não existir, a função fopen() retornará a constante NULL;

d) as funções fread( ) e fwrite( ) operam sobre arquivos do tipo texto e binário;

e) a função feof() é usada na manipulação de arquivos binários para testar quando foi alcançado o final do arquivo.

2. Escreva um programa que abra um arquivo texto, conte o número de caracteres presentes nele e imprima o número de caracteres na tela.

Comentário das atividadesNa 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

Page 172: Básico Redes de Comp

AULA 7 • ALgORITMOS E PROgRAMAçãO

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

(a) está correta, pois a instrução FILE *fp realmente é usada para declarar uma variável do tipo ponteiro para arquivo; a opção (b) também está correta, pois o modo “rw+” indica ao computador que o arquivo deve ser aberto em modo texto e para leitura/escrita. O sinal de + indica que, se o arquivo não existir, ele deverá ser criado; a opção (c) também está correta, pois o modo “rb” indica ao computador que o arquivo deve ser aberto em modo binário e somente para leitura; e a opção (e), por sua vez, também está correta, pois a função feof( ) é usada em arquivos binários para evitar que durante a leitura de algum valor, esse seja confundido com a constante EOF, que indica o final do arquivo.

Na atividade 2, você deveria ter usado a seguinte abordagem: ler o nome do arquivo, abrir o arquivo indicado com a função fopen( ), ler o arquivo caractere a caractere até que seja alcançado o final do arquivo. Como será necessário indicar o total de caracteres lidos do arquivo, você deveria ter criado uma variável para fazer o papel de acumulador. A solução aqui comentada é mostrada a seguir.

#include <stdio.h>#include <stdlib.h>int main() { FILE *arq; char nome_arquivo[80]; char caracter; int total=0; printf (“\nDigite o nome do arquivo: ”); scanf (“%s”,nome_arquivo); if((arq = fopen(nome_arquivo,”rb”)) == NULL) { printf(“\nErro ao abrir o arquivo original.\n\n”); exit(1); } while(!feof(arq)) { caracter = getc(arq); if(!feof(arq)) total++; } fclose(arq); printf(“\nForam contados %d no arquivo %s”, total,nome_arquivo); return(0); }

Page 173: Básico Redes de Comp

AULA 7 • ALgORITMOS E PROgRAMAçãO

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

ReferênciasASCENCIO, 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

Page 174: Básico Redes de Comp

AULA 7 • ALgORITMOS E PROgRAMAçãO

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

Page 175: Básico Redes de Comp
Page 176: Básico Redes de Comp

Créd

itos

EQUIPE UNITINS

Organização de Conteúdos AcadêmicosSilvio Costa Sampaio

Coordenação EditorialMaria Lourdes F. G. Aires

Assessoria EditorialDarlene Teixeira Castro

Assessoria Produção Gráfica Katia Gomes da Silva

Revisão Didático-PedagógicaMarilda Piccolo

Revisão Lingüístico-TextualSibele Letícia Rodrigues de Oliveira Biazotto

Revisão DigitalSibele Letícia Rodrigues de Oliveira Biazotto

Projeto GráficoDouglas Donizeti SoaresIrenides TeixeiraKatia Gomes da Silva

IlustraçãoGeuvar S. de Oliveira

CapaIgor Flávio Souza

EQUIPE FAEL

Coordenação EditorialLeociléa Aparecida Vieira

Assessoria EditorialWilliam Marlos da Costa

RevisãoJuliana Camargo HorningLisiane Marcele dos Santos

Programação Visual e DiagramaçãoDenise Pires PierinKátia Cristina Oliveira dos SantosRodrigo SantosSandro NiemiczWilliam Marlos da Costa

Page 177: Básico Redes de Comp

Apr

esen

taçã

o

Este caderno de Lógica para Programação tem o objetivo de auxiliá-lo no estudo dos principais conceitos relacionados com a Lógica para Programação e, principalmente, com a sua representação na forma algorítmica.

O tema tratado aqui é de fundamental importância para qualquer iniciante da Programação de Computadores. Nessa área existe uma máxima que diz que “se você possui um bom domínio da Lógica de Programação, você saberá programar em qualquer Linguagem de Programação”. E isso é verdade, uma vez que o aprendizado de uma Linguagem de Programação visa apenas a aperfeiçoar o domínio da sintaxe particular de cada Linguagem 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-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

Page 178: Básico Redes de Comp

Plan

o de

Ens

ino

EMENTA

Representação do pensamento lógico. Fundamentos de Algoritmos. Variáveis e constantes. Programação estruturada. Estruturas de seleção e repetição.

OBJETIVOS

Compreender os fundamentos da Lógica para Programação e os •conceitos de variáveis e constantes.

Construir e representar Algoritmos.•

CONTEÚDO PROGRAMÁTICO

Fundamentos da Lógica para Programação•

Representação de Algoritmo•

Dados: variáveis e constantes•

Operadores e expressões•

Arquivos•

Estrutura de controle•

Modularização•

Page 179: Básico Redes de Comp

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

BIBLIOGRAFIA BÁSICA

CARBONI, Irenice de Fátima. Lógica de Programação. São Paulo: Thomson, 2003.

FORBELLONE, André Luiz Villar; EBERSPACHER, Henri Frederico. Lógica de programação: a construção de algoritmos e estruturas de dados. 3. ed. São Paulo: Makron Books, 2005.

LOPES, Anita; GARCIA, Guto. Introdução à Programação: 500 algoritmos resolvidos. Rio de Janeiro: Campus, 2002.

MANZANO, José Augusto N. G.; OLIVEIRA, Jayr Figueiredo de. Algoritmos: lógica para desenvolvimento de Programação de Computadores. 16. ed. São Paulo: Érica, 2005.

ORTH, Afonso Inácio. Algoritmos e programação com resumo das Linguagens Pascal e C. Porto Alegre: AIO, 2001.

SOUZA, Marco Antonio Furlan de; GOMES, Marcelo Marques; SOARES, Marcio Vieira. Algoritmos e Lógica de Programação. São Paulo: Thomson, 2005.

BIBLIOGRAFIA COMPLEMENTAR

ASCENCIO, Ana Fernanda Gomes. Lógica de Programação com Pascal. São Paulo: Makron Books, 1999.

Page 180: Básico Redes de Comp
Page 181: Básico Redes de Comp

AULA 1 • LógICA PARA PROgRAMAçãO

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

Objetivos

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

entender como a lógica formal e matemática é aplicada na Programação •de Computadores;

compreender a importância da construção de algoritmos computacionais.•

Pré-requisitos

Por tratar de questões relacionadas ao raciocínio natural do ser humano, esta aula não apresenta pré-requisitos formais, entretanto cabe ressaltar que será pré-requisito para as demais aulas deste caderno. Para você alcançar o objetivo proposto, será necessário apenas disciplinar o seu modo de pensar, evitando extrapolar os limites de abstração, ou seja, focar apenas o problema a ser resolvido, uma vez que esse material dará a você embasamento teórico para compreender como o pensamento lógico pode ser representado e repro-duzido em um algoritmo computacional.

IntroduçãoSem dúvida, o computador é uma das maiores invenções do homem e tem

se mostrado uma ferramenta versátil, rápida e segura para a manipulação de informações.

Para muitos essa invenção é responsável pela intensificação da meca-nização e descobertas científicas na vida moderna. Esta afirmação dá um caráter autônomo ao computador, como se o mesmo fizesse tudo sozinho. Entretanto cabe esclarecer que o computador é uma grande ferramenta de trabalho, servindo de auxílio para as mais diversas atividades. Porém esta máquina não é criativa e nem inteligente, na verdade, apenas reproduz o que lhe é ordenado por meio de seus programas de computador.

Aula 1Fundamentos da

Lógica para Programação

Page 182: Básico Redes de Comp

AULA 1 • LógICA PARA PROgRAMAçãO

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

Os programas de computador são construídos para resolver algum problema específico e a solução adotada é sempre uma solução lógica. E essa solução é formalizada em um algoritmo, que podemos entender como uma receita de bolo a ser adotada para a solução do problema. A Lógica para Programação é então o passo inicial para a construção de um programa de computador.

Por isso, nesta aula, temos três questões a serem respondidas: o que é a Lógica? Como a Lógica é aplicada à Programação de Computadores? O que é um Algoritmo? Vamos começar explicando os princípios básicos do pensa-mento lógico.

1.1 O que é Lógica?

Não há consenso quanto à definição da Lógica. Alguns autores a definem como o estudo dos processos válidos e gerais pelos quais atingimos a verdade, outros como a ciência das leis do pensamento, ou somente como o estudo dos princípios da inferência válida. Esta pluralidade de definições nos dá conta da diversidade de estudos que são abrangidos pela Lógica.

Não seria cabível discutir sobre lógica sem lançar mão da Filosofia. Mesmo não querendo aprofundar no mérito filosófico, é necessário revisar as bases filosóficas da lógica a fim de compreender a sua origem e função.

A Lógica foi criada por Aristóteles, no século IV a.C., como uma ciência autônoma que se dedica ao estudo dos atos do pensamento – conceito, juízo, raciocínio, demonstração – do ponto de vista da sua estrutura ou forma Lógica, sem ter em conta qualquer conteúdo material. É por esta razão que essa Lógica Aristotélica é também conhecida por Lógica Formal.

Em contraposição a esse conceito de Lógica Formal, surgiu um outro – o de Lógica Material – para designar o estudo do raciocínio no que ele depende quanto ao seu conteúdo ou matéria.

Essa distinção entre Lógica Formal e Lógica Material nos permite perceber porque: tendo em conta a sua forma, o raciocínio é correto ou incorreto (válido ou inválido). Mas se atendermos à sua matéria, a conclusão pode ser verda-deira ou falsa.

Para exemplificar, tomemos como exemplo as seguintes sentenças de racio-cínio lógico:

I. nenhum homem sabe dançar;

II. este dançarino é homem;

III. logo, este dançarino não sabe dançar.

Page 183: Básico Redes de Comp

AULA 1 • LógICA PARA PROgRAMAçãO

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

Este raciocínio é formalmente correto, uma vez que a conclusão está corre-tamente deduzida. Mas a conclusão é falsa, uma vez que é falsa a primeira proposição (“Nenhum homem sabe dançar”). Estamos perante um raciocínio que tem validade formal, mas não tem validade material. Logo temos que concluir que é falso.

Desde a sua criação o estudo da Lógica tem registrado enormes aperfei-çoamentos, sobretudo a partir de meados do século XIX. É costume dividir-se a sua história em três períodos: Período Clássico, Período Moderno e Período Contemporâneo.

A Lógica Matemática (desenvolvida no Período Moderno) exerceu uma influência decisiva em muitos domínios, principalmente na Eletrônica, Cibernética, Informática e Inteligência Artificial.

Mesmo com essa multiplicidade de conceitos, a Lógica pode ser vista como uma ciência que procura encontrar as leis em relação às quais o nosso pensamento deve obedecer para que possa ser considerado válido.

No contexto da informática, a Lógica de Programação é a técnica de encadear pensamentos para atingir determinado objetivo previamente defi-nido. Ou seja, é a técnica que nos permite expressar o que deve ser feito e em que ordem para que a solução seja alcançada.

1.2 A Lógica no dia-a-dia

Sempre que pensamos estamos exercitando a nossa lógica ou ilógica (não-lógica). Toda vez que falamos também estamos fazendo uso da lógica uma vez que a fala é apenas uma representação do que pensamos.

Quantas e quantas vezes, em um quotidiano e rotineiro diálogo, produ-zimos afirmações do gênero: “Isso é lógico!”, “...não tem lógica alguma.” ou “Não vejo lógica nisso!”.

Saber o que é lógico, ou saber identificar uma estrutura lógica, em um contexto lingüístico, é algo que nos é transmitido por meio da nossa educação.

Além dessa lógica lingüística, aplicamos outros tipos de raciocínio lógico em nosso dia-a-dia. Um bom exemplo seria pensar o porquê não colocamos nossa mão em uma superfície quente. Parece lógico, não?! Nosso cérebro rapidamente processa sentenças lógicas como:

I. a pele humana não suporta altas temperaturas (ou algo mais simples como “queimei minha pele no último contato com uma superfície quente”);

Page 184: Básico Redes de Comp

AULA 1 • LógICA PARA PROgRAMAçãO

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

II. a minha mão é coberta de pele;

III. logo, a minha mão não suporta altas temperaturas.

Esse tipo de pensamento lógico se repete várias e várias vezes ao dia. E graças à Lógica nos mantemos longe de problemas.

Isso deixa claro que nós pensamos de forma lógica o tempo todo. No entanto, temos uma grande dificuldade em formalizar este raciocínio lógico. Um exemplo disso são aquelas situações nas quais temos de explicar a alguém algo a ser feito. Muitas vezes, já fizemos essa mesma tarefa inúmeras vezes e, para nós, ela é extremamente lógica. Porém encontramos dificuldades em organizar e relatar o conjunto de passos que deverão ser realizados. Isso acontece porque não somos acostumados a formalizar nosso pensamento.

Para o computador, a descrição de cada passo e seu correto encadea-mento é fundamental para que o programa funcione corretamente e que a solução seja alcançada. Por isso costuma-se dizer que o computador nunca erra, são as pessoas que erram. Nesse caso, são as pessoas que formalizaram a sua Lógica de Programação de maneira incorreta.

Nesse momento de nossos estudos, você já deve ter percebido que a Lógica para Programação não é algo difícil ou impossível, uma vez que é apenas uma técnica para dizer ao computador o que deve ser feito para atingir a solução de um determinado problema.

1.3 Algoritmos

A construção de algoritmos é o primeiro passo para a Programação de Computadores. É uma das tarefas mais complexas da programação de compu-tadores, mas também uma das mais desafiadoras e empolgantes.

Um algoritmo pode ser definido como uma seqüência de passos que visa a atingir um objetivo definido. Assim podemos dizer que um algoritmo é a organização do pensamento para a solução de um problema, portanto é uma representação da lógica.

Um algoritmo, na Linguagem da Programação de computadores, repre-senta uma seqüência de instruções que o computador deve seguir a fim de atingir um objetivo definido. Cada instrução é, na verdade, uma informação que indica ao computador o que deve ser feito. Já o programa consiste na codi-ficação precisa do algoritmo em uma linguagem de programação específica.

Page 185: Básico Redes de Comp

AULA 1 • LógICA PARA PROgRAMAçãO

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

É importante lembrar que a ordem na qual as instruções serão executadas é de fundamental importância para a efetividade da solução algorítmica. Para entendermos melhor, imaginemos como problema a ser resolvido o preparo de uma carne assada. É óbvio que a sua solução envolve, entre outras tarefas menores, limpar a carne, temperá-la e levá-la ao forno. Mas também é obvio que se a ordem dessas instruções for alterada certamente não iremos atingir a solução para o problema. Imagine se levássemos a carne ao forno e a tempe-rássemos somente depois!

O algoritmo não é a solução do problema, mas uma forma de solucioná-lo. Assim, para um mesmo problema, podemos criar diferentes algoritmos usando diferentes abordagens. Em outras palavras, podemos usar diferentes seqüên-cias de instruções para resolver o mesmo problema. Em alguns casos, até mesmo diferentes instruções. Quase sempre existe mais do que uma maneira de resolver um problema, e essa escolha é nossa. Qual será então a melhor das escolhas?

Dados dois ou mais algoritmos para resolver o mesmo problema, é sensato escolher aquele que obtém uma solução no menor tempo possível e que utiliza o menor espaço para a representação dos dados do problema.

Apesar de sua nomenclatura pouco usual, usamos algoritmos em várias situações cotidianas. Um exemplo comum são as receitas culinárias. Em uma receita culinária descrevemos todos os ingredientes que farão parte do prato, suas quantidades, a ordem em que serão usadas, suas transfor-mações (modo de preparo) até o preparo completo do prato. Dessa forma é possível garantir que a aplicação correta do algoritmo resulte no prato desejado.

É importante esclarecer desde já que um algoritmo independe da linguagem de programação que será utilizada. Na verdade, uma vez que o algoritmo seja desenvolvido de forma correta, poderá ser implementado em diferentes linguagens de programação sem maiores alterações.

A construção de um algoritmo deve observar todos os passos neces-sários à execução da atividade e evitar que passos desnecessários sejam executados ou que passos interdependentes sejam executados fora de ordem.

Durante sua construção, um algoritmo é constantemente revisto a fim de identificar novas situações ou exceções a serem tratadas.

Page 186: Básico Redes de Comp

AULA 1 • LógICA PARA PROgRAMAçãO

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

Quando temos um problema e precisamos construir um algoritmo para resolvê-lo, devemos passar pelas seguintes etapas:

definir o problema;a)

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

terminada a fase de estudo, descrever o algoritmo que deverá, a prin-c) cípio, resolver o problema;

analisar junto aos usuários se o problema será resolvido. Se a solução d) não foi encontrada, ou surgirem exceções a serem tratadas, deverá ser retornado para a fase de estudo para descobrir onde está a falha.

A fim de entender como um algoritmo é construído, vamos analisar a construção de um algoritmo para o seguinte problema clássico, discutido por vários autores, inclusive em Forbellone e Eberspächer (2005, p. 4), por ser um problema cotidiano e que não exige conhecimentos específicos: “trocar uma lâmpada queimada”. A partir desse exemplo, será possível evidenciar o processo de encadeamento de idéias até a solução final do problema.

Inicialmente, poderíamos construir o seguinte algoritmo básico para solu-cionar o problema proposto:

pegue uma escada;I.

posicione-a embaixo da lâmpada;II.

busque uma lâmpada nova;III.

suba na escada;IV.

retire a lâmpada velha;V.

coloque a lâmpada nova.VI.

Se examinarmos esse algoritmo, veremos que ele permite solucionar o problema da troca de uma lâmpada queimada. Entretanto, se considerarmos as situações nas quais o algoritmo poderá ser aplicado, perceberemos que o mesmo não irá tratar a situaçã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:

Page 187: Básico Redes de Comp

AULA 1 • LógICA PARA PROgRAMAçãO

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

pegue uma escada;I.

posicione-a embaixo da lâmpada;II.

busque uma lâmpada nova;III.

ligue o interruptor;IV.

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

suba na escada;a)

retire a lâmpada velha;b)

coloque a lâmpada nova.c)

À primeira vista, o algoritmo agora está correto. Ao introduzirmos um teste seletivo, uma condição, no passo V, impomos que os passos a, b e c só deverão ser executados se o resultado do teste for verdadeiro. Nesse caso, se a lâmpada não acender. Os testes seletivos nos permitem tratar as exceções e garantir que determinados passos não sejam executados em vão, otimizando o algoritmo.

Esse mesmo algoritmo, apesar de funcional, ainda pode ser otimizado. Se o reexaminarmos, perceberemos que, no caso de a lâmpada não estar quei-mada, teremos executado os passos I, II e III em vão.

Para tratar essa situação, bastaria reposicionar os passos I, II e III para que ocorram somente após o teste seletivo, uma vez que só serão úteis caso a lâmpada tenha de ser realmente trocada, ou seja, que ela esteja queimada. Desse modo, o algoritmo seria novamente alterado, ficando:

ligue o interruptor;VI.

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

a) pegue uma escada;

b) posicione-a embaixo da lâmpada;

c) busque uma lâmpada nova;

d) suba na escada;

e) retire a lâmpada velha;

f) coloque a lâmpada nova.

Apesar de parecer completo, ou seja, permitindo solucionar o problema da troca da lâmpada queimada, este algoritmo não leva em consideração a possibilidade de a nova lâmpada não funcionar. Pois, nesse caso, seria neces-

Page 188: Básico Redes de Comp

AULA 1 • LógICA PARA PROgRAMAçãO

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

sário repetir os passos e e f. Daí surge a seguinte questão: pode ser que a outra lâmpada também não funcione, sendo necessário repetir mais uma vez esta seqüência de passos. Então, quando deveremos parar de repetir?

Para toda repetição em um algoritmo devemos estabelecer uma condição de parada, ou seja, um limite para a quantidade de vezes em que os passos deverão ser repetidos. Caso não seja estabelecido esta condição de parada ocorre o que chamamos de laço infinito – mais conhecido por sua designação em inglês loop infinito – no qual os passos se repetem indefinidamente.

No caso do nosso algoritmo, uma condição de parada adequada seria repetir enquanto a lâmpada não acender. Assim o algoritmo ficaria da seguinte forma:

VIII. ligue o interruptor;

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

a) pegue uma escada;

b) posicione-a embaixo da lâmpada;

c) busque uma lâmpada nova;

d) suba na escada;

e) retire a lâmpada velha;

f) coloque a lâmpada nova;

g) enquanto a lâmpada não acender:

1. retire a lâmpada;

2. coloque outra lâmpada.

O passo g apresenta o que chamamos de fluxo repetitivo no qual um conjunto de passos pode se repetir n vezes.

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

Pensando sobre o assunto

1.4 Construindo algoritmos

Antes de construir um algoritmo, é necessário entender o modelo de proces-samento geral de um programa de computador. Este modelo é representado na figura 1.

Page 189: Básico Redes de Comp

AULA 1 • LógICA PARA PROgRAMAçãO

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

ENTRADAS PROCESSAMENTO SAÍDA

Dados iniciais para a resolução

do problema

Regras do problema

Resultados do processamento ou

solução para o problema

Exemplo: Multiplicação de dois números inteirosA = 25 B = 3

RESULTADO = A*B 75

Figura 1. Modelo geral de processamento de um programa de computador

Todo programa fundamentalmente opera sobre um conjunto de entrada que representa os dados iniciais necessários à resolução do problema. Essas entradas são então processadas a partir de um conjunto de regras já definidas e, ao final, o programa gera um conjunto de saídas que representa o resultado do processamento.

Assim, antes de iniciar a construção de um algoritmo, é recomendado seguir os seguintes passos:

1. identificação do problema: determinar o que se quer resolver ou qual objetivo a ser atingido. Esse passo é fundamental para a resolução do problema, pois não há como dizer ao computador o que fazer para resolver o problema se nem sequer sabemos defini-lo;

2. identificação dos dados de entrada: determinar as informações neces-sárias para os cálculos que se seguirão;

3. identificação dos dados de saída: nesse passo são definidas as infor-mações que deverão ser geradas como resultado do processamento. É neste passo que devemos definir inclusive o formato da saída como, por exemplo, se será em tela ou na forma de relatório impresso;

4. identificação das regras e limitações do problema ou das limitações do agente executante: nesse passo devemos identificar claramente quais serão as regras a serem aplicadas na solução. É também nesse passo que devemos definir as limitações para o problema, uma vez que o algoritmo pode ter de cobrir apenas parte de um problema mais geral. Ainda é possível que seja necessário definir as limitações do agente executante, como, por exemplo, definir as limitações em função de pouca memória RAM do computador em que o programa irá rodar;

Page 190: Básico Redes de Comp

AULA 1 • LógICA PARA PROgRAMAçãO

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

5. definição dos processamentos a serem executados a fim de trans-formar as “entradas” em “saídas”: nesse ponto deve ser determinada a seqüência de ações ou instruções que leve à solução do problema, respeitando-se as regras já definidas;

6. construção do algoritmo: utilizando uma das formas de representação de algoritmos que iremos estudas na aula 2;

7. teste da solução: execução de todas as ações do algoritmo, seguindo o fluxo estabelecido para verificar se ele está realmente gerando os resultados esperados ou detectar possíveis erros em sua descrição.

Ao seguir esses passos, garantiremos que o algoritmo desenvolvido será executado corretamente pelo computador.

Síntese da aula

Nesta aula, foram discutidos os princípios da programação para compu-tadores. Foi apresentado o conceito de Lógica para Programação que é, em essência, uma extensão da lógica matemática.

Um dos conceitos mais importantes discutidos é o conceito de algoritmo. É por meio do algoritmo que informamos ao computador o que deverá ser feito. Vale lembrar que o encadeamento das instruções que compõem o algoritmo é de fundamental importância para seu correto funcionamento.

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

Page 191: Básico Redes de Comp

AULA 1 • LógICA PARA PROgRAMAçãO

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

2. Comente a importância dos dados de entrada, do processamento e dos dados de saída para a construção de algoritmos.

Comentário das atividadesNa 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.

Page 192: Básico Redes de Comp

AULA 1 • LógICA PARA PROgRAMAçãO

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

Na próxima aula

Dando continuidade ao estudo da Lógica para Programação, estudaremos como a lógica de programação, em sua forma algorítmica, pode ser represen-tada. Estudaremos os métodos mais utilizados na prática: Descrição Narrativa, Fluxograma e Pseudocódigo.

Anotações

Page 193: Básico Redes de Comp

AULA 2 • LógICA PARA PROgRAMAçãO

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

Objetivos

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

representar um algoritmo usando Descrição Narrativa;•

representar um algoritmo usando Fluxograma;•

representar um algoritmo usando Pseudocódigo.•

Pré-requisitos

Uma vez que esta aula trata da representação de um algoritmo é necessário que você tenha entendido o conceito de algoritmo apresentado na aula anterior. Caso haja dúvidas, recorra ao material e entre em contato com a web-tutoria.

Introdução

Com o passar do tempo e de estudos dos algoritmos, foram desenvolvidas inúmeras formas de se representar um algoritmo de modo a facilitar o seu entendimento e, mais tarde, a sua tradução para uma linguagem de progra-mação específica. Entre as formas de representação de algoritmos mais conhe-cidas, podemos citar a Descrição Narrativa, o Fluxograma Convencional e o Pseudocódigo - também conhecido como Linguagem Estruturada ou “Portugol”. Essas três formas serão objeto de estudo desta aula.

Uma representação clara e fácil de ser seguida facilita o desenvolvimento, depuração (correção de erros) e subseqüente transformação do algoritmo em um programa de computador.

O domínio dessas formas de representação de algoritmos é de funda-mental importância tanto para Analistas de Sistemas que são responsáveis por mapear as necessidades dos clientes para a forma algorítmica, quanto para Programadores, que irão transformar os algoritmos em programas.

Aula 2Formas de representação

de um algoritmo

Page 194: Básico Redes de Comp

AULA 2 • LógICA PARA PROgRAMAçãO

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

Na Linguagem Narrativa, os algoritmos são expressos diretamente em linguagem natural – no português, por exemplo. Já o Fluxograma (ou Diagrama de Fluxo) é uma representação gráfica que emprega formas geométricas padronizadas para indicar as diversas ações e decisões que devem ser executadas para resolver o problema. O Pseudocódigo emprega uma linguagem intermediária entre a linguagem natural e uma linguagem de programação para descrever os algoritmos.

média

Cálculo da Média de dois números inteiros positivos

média = ( a + b)/2Início de ProgramaLeia os valores a e bSe a e b forem maior do que zero

Calcula o valor da média a partir dafórmula [média = (a + b)/2]Imprime o valor da média

SenãoImprime “Os valores devem ser positivos”

Fim do programa

LinguagemNarrativa

Início de ProgramaLeia a,bSe a > 0 e b > 0 então

Calcula o valor da média a partir damédia = (a + b)/2Imprime o valor da média

SenãoImprime “Os valores devem ser positivos”

Fim seFim do programa

Pseudocódigo

Inicio

Fim

Média = (a+b)/2

Leia a

Leia b

a>0 e b>0

SIM NÃO

Fluxograma

“Os valores devem ser positivos”

Figura 1. Exemplo de algoritmo representado nas três formas mais comuns

Não existe consenso entre os especialistas sobre qual é a melhor maneira de representar um algoritmo. Atualmente a maneira mais comum de representar algoritmos é por meio de pseudocódigo. Essa forma de representação tem a vantagem de que o algoritmo pode ser escrito de uma forma que está próxima de uma linguagem de programação de computadores, facilitando a criação do programa.

Existem outras formas de representação conhecidas, porém pouco utilizadas, como o Diagrama de Chapin ou Nassi-Shneiderman (N-S), que apresenta a solução do problema por meio de um diagrama de quadros com uma visão hierárquica e estruturada. Essa forma não é muito utilizada devido à sua dificuldade em repre-sentar a recursividade.

2.1 Descrição Narrativa

Nessa forma de representação, os algoritmos são expressos diretamente em linguagem natural.

Page 195: Básico Redes de Comp

AULA 2 • LógICA PARA PROgRAMAçãO

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

Esta forma de representação é a mesma utilizada em algoritmos não-computa-cionais, como receitas culinárias. Dessa forma as instruções são descritas livremente, entretanto devemos tomar alguns cuidados para manter a clareza do algoritmo.

Para escrever um algoritmo, precisamos descrever a seqüência de instru-ções, de maneira simples e objetiva. Para isso devemos obedecer algumas regras básicas:

usar somente um verbo por frase;•

imaginar que você está desenvolvendo um algoritmo para pessoas •que não trabalham com informática;

usar frases curtas e simples;•

ser objetivo;•

procurar usar palavras que não tenham sentido dúbio.•

Um exemplo de representação de um algoritmo usando Descrição Narrativa para o problema de cálculo da média de um aluno ficaria:

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

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

se a média for maior ou igual que 7,00, o aluno foi aprovado, senão, 3. foi reprovado.

No entanto, na prática, essa representação é pouco usada porque o uso da linguagem natural dá muitas vezes oportunidade a más interpretações, ambigüidades e imprecisões. Por esse motivo, não daremos maior atenção a este tipo de representação.

2.2 Fluxograma

Essa é a forma gráfica de representar um algoritmo mais conhecida e utilizada. O fluxograma nos permite mostrar graficamente a lógica de um algo-ritmo, enfatizando passos individuais e o fluxo de execução.

É intermediária à descrição narrativa e ao pseudocódigo, pois é menos imprecisa que a primeira e, no entanto, não se preocupa com detalhes de implementação do programa como a segunda, como, por exemplo, o tipo de variáveis utilizadas.

Para muitos autores, o fluxograma é a forma universal de representação, pois se utiliza de figuras geométricas padronizadas para ilustrar os passos a

Page 196: Básico Redes de Comp

AULA 2 • LógICA PARA PROgRAMAçãO

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

serem seguidos para a resolução de problemas. E o ideal é que um algoritmo seja entendido da mesma forma por diferentes pessoas que o utilizarem.

Para que um fluxograma seja interpretado corretamente, é necessário entender sua sintaxe e sua semântica. Sobre sintaxe de um fluxograma, devemos entender como a correta utilização dos seus símbolos gráficos – mostrados na figura 2 – e das expressões que podem ser escritas no seu inte-rior. Já a semântica diz respeito ao significado de cada símbolo, ou seja, como interpretá-lo corretamente. Com isso é possível entender e simular o algoritmo representado.

Terminador Documento Referência de página

Entrada Manual Dados armazenados Referência fora da página

Dados ExibiçãoSeta de

orientação do fluxo

Decisão Preparação Processamento

Figura 2. Simbologia básica de um fluxograma

A interpretação de um fluxograma, via de regra, se dá de cima para baixo e da esquerda para a direita. É importante seguir essa regra, pois garante que o fluxo de instruções seja entendido corretamente.

Por se tratar de uma representação gráfica, o fluxograma não se mostra adequado para a representação de algoritmos maiores e/ou mais complexos. Nesses casos, é comum o uso do pseudocódigo como forma de representação.

2.2.1 Simbologia básica de um fluxograma

Estes são alguns dos símbolos mais conhecidos e utilizados ao longo dos anos pelos profissionais da área de informática para a descrição de algoritmos usando fluxograma e são descritos na norma internacional ISO 5807/1985.

Page 197: Básico Redes de Comp

AULA 2 • LógICA PARA PROgRAMAçãO

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

Inicio

Terminador

Símbolo utilizado como ponto para indicar o início e/ou fim do fluxo de um programa. É importante salientar que um programa deve possuir apenas um terminador de INÍCIO e outro de FIM.

Variável

Entrada Manual

Utilizado para ler os dados necessários ao programa. Usado para representar dados, independente do tipo de mídia, que sejam fornecidos manualmente, em tempo de processamento. Permite representar a entrada de dados via teclado, mouse, leitor de código de barras ou qual-quer outro dispositivo de entrada.

Dados

Dados

Utilizado para representar dados tanto de entrada quanto de saída já definidos no próprio programa, como valores de constantes.

Condição

SIM NÃO

Decisão

Indica a decisão que deve ser tomada, indicando a possibilidade de desvios para diversos outros pontos do fluxo, dependendo do resultado de comparação de uma condição estabelecida. Essa estrutura permite controlar o fluxo de instruções em um fluxograma.

Doc

Documento

Utilizado para representar a utilização de algum docu-mento específico contendo dados necessários ao algoritmo.

Dados

Dados Armazenados

Usado para indicar dados que estão ou deverão ser armazenados pelo algoritmo.

Variável ou mensagem

Exibição

É utilizado quando se deseja que os dados sejam impressos. Representa um dispositivo de saída como o monitor ou a impressora.

Operações

Preparação

Refere-se a um determinado grupo de operações não incluídas da diagramação.

Referência de Página

Utilizado quando é preciso particionar o diagrama. Quando ocorrer mais de uma partição, é colocada uma letra ou número dentro do símbolo de conexão para iden-tificar os pares de ligação.

Referência fora da Página

Específico para indicar conexão do fluxo em outra página.

Seta de orientação de fluxo

Permite indicar o sentido do fluxo de dados. Serve exclusi-vamente para conectar os símbolos ou blocos existentes.

Processo

Processamento

Símbolo ou bloco que se utiliza para indicar cálculos (algo-ritmos) a efetuar, atribuições de valores ou qualquer mani-pulação de dados que tenha um bloco específico para sua descrição.

Page 198: Básico Redes de Comp

AULA 2 • LógICA PARA PROgRAMAçãO

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

2.2.2 Construindo um fluxograma

Para entendermos como um fluxograma é criado para representar um algoritmo, vamos discutir passo-a-passo a criação de um fluxograma para representar um algoritmo que permita calcular a média final de um aluno considerando que todo aluno realiza três provas no semestre. O aluno é consi-derado “aprovado” se a sua média for igual ou superior a 7,00, senão é considerado “reprovado”.

Antes de iniciarmos a construção do fluxograma, devemos formalizar o algoritmo para solucionar o problema, de acordo com o que estudamos na primeira aula.

É evidente que este é um problema de pouca complexidade e que envolve poucas regras. Para resolver esse problema, fica claro que precisaremos conhecer as três notas do aluno, que deverão ser informadas pelo usuário e, em seguida, calcular a média por meio do cálculo de média aritmética simples para a qual devemos aplicar a fórmula média = (nota1+nota2+nota3)/3. Após o cálculo da média, é necessário testar se o seu valor é igual ou superior ao valor 7,00 e, nesse caso, deverá ser listada a mensagem “Aprovado”. Em caso contrário, deverá ser listada a mensagem “Reprovado”. Agora que conhecemos o algoritmo, é possível representá-lo como um fluxograma.

Inicialmente a forma mínima de um fluxograma é dada pela junção de seus terminadores de início e fim, como mostrado na figura 3. Na verdade, essa construção mínima executa absolutamente nada. Os símbolos de INICIO e FIM, na verdade, não representam instruções de fato, mas são marcadores essenciais que permitem a correta interpretação do fluxograma.

INICIO

FIM

Figura 3. Fluxograma mínimo

Entretanto, para nosso algoritmo, será necessário ler os dados de entrada, nesse caso, as três notas do aluno. Com isso, é necessário expandir o nosso fluxograma, como mostra a figura 4. Por motivos didáticos, para cada variável foi utilizado um símbolo de entrada manual. Na prática, entretanto, é comum a utilização de apenas um símbolo contendo todas as variáveis a serem lidas.

Page 199: Básico Redes de Comp

AULA 2 • LógICA PARA PROgRAMAçãO

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

INICIO

FIM

nota1

nota2

nota3

Figura 4. Fluxograma com leitura das notas

De posse do valor de cada uma das três notas, é possível processar a média do aluno. Vamos representar esse processamento utilizando o símbolo de processo, como mostra a figura 5. Em um fluxograma, 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

FIM

nota1

nota2

nota3

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

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

Page 200: Básico Redes de Comp

AULA 2 • LógICA PARA PROgRAMAçãO

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

Agora que o valor da média já foi calculado, é hora de testar o seu valor a fim de definir se o aluno foi aprovado ou reprovado. Nesse momento, sentimos a necessidade de controlar o fluxo de instruções, pois caso o valor da média seja superior a 7,00, devemos executar a instrução de impressão da mensagem “Aprovado”; senão devemos apresentar a mensagem “Reprovado”. Para fazer isso é necessário utilizar o símbolo de decisão, como mostrado na figura 6.

Como podemos notar, dependendo do resultado da condição media >= 7,00, o fluxo de instruções é devidamente desviado.

INICIO

FIM

nota1

nota2

nota3

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

média >= 7,00

“Aprovado” “Reprovado”

SIM

NÃO

Figura 6. Fluxograma final

Agora o fluxograma mostrado na figura 6 reflete o algoritmo criado, repre-sentando cada passo de forma gráfica.

Como já discutido na aula sobre algoritmos, na maioria das vezes preci-samos executar um conjunto de passos repetidas vezes, sem alterações no

Page 201: Básico Redes de Comp

AULA 2 • LógICA PARA PROgRAMAçãO

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

conjunto de instruções. Para representar esses casos em um fluxograma devemos construir um desvio no fluxo de instruções que permita testar uma condição de parada e, dependendo do seu resultado, retornar a um passo anterior a fim de repetir o conjunto de instruções desejado.

A fim de compreender como tratar esse tipo de situação, vamos tomar como exemplo a representação de um algoritmo que imprime todos os números pares positivos e menores do que um valor N informado. O fluxograma resul-tante é mostrado na figura 7.

INICIO

FIM

N

N > 0

N % 2 > 0

SIM

SIM

NÃO

NÃO

N

N N - 1

Figura 7. Fluxograma para a impressão de números pares positivos e menores do que um valor N

Page 202: Básico Redes de Comp

AULA 2 • LógICA PARA PROgRAMAçãO

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

Nesse fluxograma é possível notar que, após a leitura o valor N, este é então testado para saber se ainda é positivo. Em caso negativo, o programa já é encerrado, pois não haverá valores pares positivos menores do que N. Caso a condição de teste seja satisfeita, ou seja, retorne o valor verdadeiro, esse valor é testado para saber se é um valor par. Para isso, é testado o resto da divisão do valor N por dois. Caso essa expressão retorne o valor zero, o número é par, senão é impar. Caso a condição seja satisfeita – N é par – o valor de N é então exibido e, em seguida, decrementado de uma unidade. Após essa instrução, o fluxo é então desviado para o momento anterior ao conjunto de passos que deverá ser novamente repetido. Com isso conseguimos garantir que esses passos serão executados até que a condição N > 0 retorne o valor falso.

2.3 Pseudocódigo

Esse nome é uma alusão à posterior implementação em uma Linguagem de Programação, ou seja, quando formos programar em uma linguagem de programação específica.

O pseudocódigo é um código de escrita em que se utilizam termos conven-cionais para indicar as instruções do programa. Esses termos são geralmente uma mistura de palavras da nossa linguagem natural com palavras e notações típicas das linguagens de programação.

A utilização de pseudocódigo permite ao programador expressar as suas idéias sem ter de se preocupar com a sintaxe da linguagem de programação. Para isso, são utilizadas primitivas (comandos genéricos) que podem ser facilmente traduzidos para uma linguagem de programação específica.

2.3.1 Primitivas

Em um pseudocódigo, as primitivas possuem a mesma função dos símbolos em um fluxograma, ou seja, descrever as ações a serem executadas e garantir a correta interpretação do algoritmo.

Neste caderno, apresentaremos as primitivas traduzidas para a língua portuguesa.

Entre as principais primitivas usadas, estão:

• ALGORITMO <nome> – primitiva usada para nomear o algoritmo representado;

Page 203: Básico Redes de Comp

AULA 2 • LógICA PARA PROgRAMAçãO

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

• INICIO (do inglês START) – esta primitiva é usada para identificar o ponto inicial do algoritmo;

• FIM(do inglês END) – identifica o ponto final do algoritmo;

• LEIA <mensagem>, <variável> (do inglês INPUT) – primitiva usada para a leitura de dados do utilizador. Equivalente à entrada de dados manual do fluxograma;

• IMPRIMA <mensagem>, <expressão> (do inglês OUTPUT) – primitiva usada para a apresentação de dados ao utilizador. Equivalente ao símbolo de exibição do fluxograma;

• <variável>← <expressão> – atribuição do resultado da expressão à variável indicada;

• SE<condição>ENTAO (do inglês IF ... THEN)

<instruções a executar se condição verdadeira>

SENAO (do inglês ELSE)

<instruções a executar se condição falsa>

FIM SE (do inglês END IF) – primitiva de controlo de fluxo equivalente à decisão dos fluxogramas;

• ESCOLHA(<variável>) (do inglês SWITCH)

CASO <valor1>: <instruções a executar>

CASO <valor2>: <instruções a executar>

...

CASO <valorN>: <instruções a executar>

CASOCONTRARIO: <instruções a executar>

FIM ESCOLHA – primitiva de controlo de fluxo, usado para representar uma estrutura de controle de seleção múltipla;

• ENQUANTO<condição> FAÇA (do inglês WHILE)

<instruções a executar enquanto a condição for verdadeira>

FIM ENQUANTO (do inglês END WHILE) – primitiva de controlo de fluxo, sem equivalência direta em fluxogramas, que implementa um ciclo executado enquanto a condição referida seja verdadeira;

• REPITA(do inglês REPEAT)

<instruções a executar enquanto a condição for verdadeira>

Page 204: Básico Redes de Comp

AULA 2 • LógICA PARA PROgRAMAçãO

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

ATE <condição> (do inglês UNTIL) – primitiva de controlo de fluxo, sem equivalência direta em fluxogramas, que implementa um ciclo execu-tado até que a condição referida seja verdadeira;

• PARA <condição inicial> ATÉ <condição final> FAÇA [PASSO <incremento>] (do inglês FOR ... TO ... [STEP ...] DO)

<instruções a executar enquanto a condição final for falsa>

FIM PARA (do inglês END FOR) – primitiva de controlo de fluxo, que executa as instruções nela contidas enquanto a condição final for falsa. O incremento pode ser omitido desde que seja unitário positivo;

• VAR<nomedavariável>[,]:<tipodavariá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<nomedaconstante>=<valordaconstante>[,](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.

Page 205: Básico Redes de Comp

AULA 2 • LógICA PARA PROgRAMAçãO

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

Um exemplo de pseudocódigo é mostrado a seguir.

ALGORITMO Media

VAR N1, N2, N3, Media : real

INICIO

LEIA N1, N2, N3

Media <− (N1 + N2 + N3) / 2

SE Media >= 7,00 ENTAO

IMPRIMA “Aprovado”

SENAO

IMPRIMA “Reprovado”

FIM SE

FIM.

Uma grande vantagem da utilização de pseudocódigo é o fato de permitir ao programador expressar as suas idéias sem ter de se preocupar com a sintaxe da Linguagem de Programação. Por outro lado, esse tipo de represen-tação é o que mais se aproxima da codificação final em uma Linguagem de Programação e, por isso, é a mais utilizada na prática.

Síntese da aula

Nesta aula, foram discutidos conceitos sobre as formas mais comuns de representação de um algoritmo computacional.

Esperamos que, a partir do que foi estudado nesta aula, você seja capaz de concluir que há diversas formas de representação de algoritmos que diferem entre si pela quantidade de detalhes de implementação que fornecem ou, inversamente, pelo grau de abstração que possibilitam em relação à implementação do algoritmo em termos de uma linguagem de programação específica.

Das principais formas de representação de algoritmos, destacam-se: a descrição narrativa, o fluxograma convencional e o pseudocódigo. Dessas três, a mais utilizada na prática é o pseudocódigo, principalmente por sua proxi-midade com o produto final – o programa codificado em uma Linguagem de Programação – o que diminui o tempo de desenvolvimento e reduz custos. Além disso, o pseudocódigo permite adicionar detalhes específicos da linguagem a ser utilizada.

Page 206: Básico Redes de Comp

AULA 2 • LógICA PARA PROgRAMAçãO

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

Atividades

Para as atividades 1, 2 e 3, considere a seguinte questão: elabore um algo-ritmo para um programa que permita ler vários números inteiros a partir do teclado e, após a leitura de cada número individual, deverá ser apresentada uma mensagem indicando se o número informado é positivo, negativo ou nulo. O programa deverá encerrar quando o valor nulo for informado.

1. Represente o algoritmo na forma de Descrição Narrativa.

2. Represente o algoritmo na forma de um Fluxograma.

3. Represente o algoritmo na forma de Pseudocódigo.

4. Sobre a Descrição Narrativa, é incorreto afirmar que:

a) utiliza a linguagem natural para descrever o algoritmo;

b) pouco utilizada na prática;

c) em função de usar a linguagem natural, pode dar margem a ambigüi-dades, tornando o algoritmo pouco claro;

d) possui regras fixas que garantem que um mesmo algoritmo sempre será representado da mesma forma, mesmo que por pessoas diferentes;

e) devemos utilizar frases curtas e simples na descrição dos passos de um algoritmo.

5. Sobre a forma de representação de algoritmos usando Fluxograma, é incorreto afirmar que:

a) é uma representação gráfica dos passos a serem seguidos;

b) os símbolos utilizados em um fluxograma são internacionalmente defi-nidos para garantir que um mesmo fluxograma seja corretamente inter-pretado, não importa onde tenha sido criado;

c) a interpretação de um fluxograma, via de regra, se dá de baixo para cima e da direita para a esquerda;

d) um programa deve possuir apenas um terminador de INÍCIO e outro de FIM;

e) por se tratar de uma representação gráfica, o fluxograma não se mostra adequado para a representação de algoritmos maiores e/ou mais complexos.

Page 207: Básico Redes de Comp

AULA 2 • LógICA PARA PROgRAMAçãO

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

6. Sobre o algoritmo em pseudocódigo apresentado a seguir, é correto afirmar que:

ALGORITIMO A6;

VAR X: Inteiro;

INICIO

REPITA

LEIA (X);

SE (X < 0) ENTAO

IMPRIMA (“O valor informado deve ser positivo”)

SENAO

IMPRIMA (X*X);

FIM SE

ATE (X <= 0)

FIM

a) o pseudocódigo é a forma de representação menos utilizada na prática;

b) para esse algoritmo, caso o usuário informe um valor negativo, será emitida a mensagem “O valor informado deve ser positivo” e um novo valor será lido;

c) esse algoritmo não utiliza uma estrutura de decisão;

d) esse algoritmo não utiliza uma estrutura de repetição;

e) esse algoritmo imprime o quadrado de vários números informados pelo usuário até que seja informado um valor negativo ou nulo.

Comentário das atividadesPara 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úmeroSe 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

Page 208: Básico Redes de Comp

AULA 2 • LógICA PARA PROgRAMAçãO

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

Podemos ainda melhorar essa primeira solução, suprimindo o teste “se o número for igual a zero”, afinal, se o valor já não for maior e nem menor do que zero só poderá ser o próprio zero. Com isso diminuiremos a quantidade de tarefas que o computador terá de executar. Dessa forma, teríamos o seguinte algoritmo:

Repetir até que seja lido um número nulo

Ler número

Se o número for maior do que zero

imprimir “Positivo”

Senão se o número for menor do que zero

imprimir “Negativo”

Senão

imprimir “Nulo”Encerrar o programa

Para resolver a atividade 2, tivemos de representar uma estrutura de repetição que permita ler N valores até que um valor nulo seja informado. E para cada valor devemos realizar testes condicionais para determinar qual mensagem deve ser escrita e para onde deve ser desviado o fluxo de instru-ções. Uma resposta possível para essa questão é o seguinte fluxograma:

INICIO

FIM

N

N > 0

N < 0

N = 0

SIM

SIM

SIM

NÃO NÃO

NÃO

“Positivo”

“Positivo” “Nulo”

Page 209: Básico Redes de Comp

AULA 2 • LógICA PARA PROgRAMAçãO

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

Já na atividade 3, em pseudocódigo, uma solução possível para esse problema é:

ALGORITIMO A3;

VAR N: Inteiro;

INICIO

REPITA

LEIA (N);

SE (N > 0) ENTAO

IMPRIMA (“Positivo”)

SENAO

SE (N < 0) ENTAO

IMPRIMA (“Negativo”)

SENAO

IMPRIMA (“Nulo”)

FIM SE

FIM SE

ATE (N = 0)

FIM

Na atividade 4, de acordo com o que foi estudado sobre Descrição Narrativa, você deve ter reconhecido como opção incorreta a opção (d), pois nesse tipo de representação não existem regras fixas e, por usar a linguagem natural, duas pessoas distintas poderão usar termos diferentes para descrever um mesmo passo do algoritmo. A opção (a) é correta, pois a Descrição Narrativa utiliza a linguagem natural para descrever o conjunto de passos do algoritmo. A opção (b), por sua vez, é também correta, pois esse tipo de representação é pouco usado na prática. A opção (c) é correta e levanta um dos principais problemas com esse tipo de representação, que é a possibili-dade de ambigüidade, pois caso um passo seja ambíguo, pode dar margem a entendimentos distintos do algoritmo. Por último, a opção (e) também está correta, pois devemos utilizar frases 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

Page 210: Básico Redes de Comp

AULA 2 • LógICA PARA PROgRAMAçãO

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

passos de um algoritmo. A opção (b) também está correta, pois a norma inter-nacional ISO 5807/1985 define a simbologia a ser adotada na construção de um fluxograma e, com isso, um mesmo fluxograma será corretamente inter-pretado, não importa onde tenha sido criado. A opção (d) é correta, uma vez que o algoritmo representado só pode ter um início e um fim no fluxograma. E, por fim, a opção (e) também deveria ser considerada correta, pois o maior problema com o uso de fluxograma ou de qualquer ferramenta de represen-tação gráfica é que não são adequadas para situações mais complexas que gerem algoritmos com uma elevada quantidade de passos.

De acordo com o que você estudou sobre Pseudocódigo, deve ter ficado claro que a opção correta para a atividade 6 é a opção (e), pois, seguindo o fluxo do pseudocódigo, percebemos que a leitura e teste da variável X encon-tram-se no bloco de instruções do comando REPITA. Assim esses passos deverão ser executados até que a condição (X <= 0) seja verdadeira. Deveria ter ficado claro também que a opção (a) está incorreta, pois esse tipo de representação é o mais usado na prática, pois é a forma que mais se aproxima da codificação final em uma linguagem de programação. A opção (b) está incorreta e sua avaliação depende da atenção ao teste condicional para a instrução REPITA... ATÉ. Nela, caso o valor seja negativo ou nulo, o fluxo é desviado para o final do algoritmo. As opções (c) e (d) são obviamente incorretas, uma vez que o algoritmo apresenta as instruções SE..ENTAO e REPITA..ATÉ que são estruturas de decisão e repetição, respectivamente.

As atividades lhe deram a oportunidade de representar um algoritmo usando Descrição Narrativa, Fluxograma e Pseudocódigo, que foram os obje-tivos fixados para esta aula.

Na próxima aula

Estudaremos como os dados são armazenados e representados pelo computador. Esse conhecimento é de fundamental importância para a ativi-dade de Programação de Computadores.

Anotações

Page 211: Básico Redes de Comp

AULA 3 • LógICA PARA PROgRAMAçãO

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

Objetivos

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

entender os conceitos de variável e de constante e suas utilizações;•

utilizar adequadamente cada tipo de dado disponível.•

Pré-requisitos

Para atingir os objetivos desta aula, é desejável que você possua conheci-mento, ainda que básico, sobre arquitetura de computadores – principalmente no que diz respeito à memória RAM. Pesquise sobre o assunto!

Introdução

Para a execução de qualquer tipo de programa, o computador neces-sita armazenar dados de natureza diversa. Esses dados são armazenados na memória do computador.

Todas as informações existentes no computador estão ou na memória primária (memória RAM), ou na memória secundária (discos, fitas, CD-ROM, etc). Nós iremos trabalhar, neste caderno, somente com a memória primária, especifica-mente com as informações armazenadas na RAM (memória de acesso aleatório).

Na verdade, toda operação realizada por um computador é baseada na manipulação das informações contidas em sua memória. De uma maneira geral, essas informações podem ser classificadas em dois tipos:

as instruções• , usadas para determinar o funcionamento da máquina e a maneira como os dados devem ser tratados. As instruções são espe-cíficas para cada arquitetura de computador, pois estão diretamente relacionadas às características do hardware particular – como, por exemplo, o conjunto de instruções de cada processador;

Aula 3Tipos de dados:

variáveis e constantes

Page 212: Básico Redes de Comp

AULA 3 • LógICA PARA PROgRAMAçãO

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

os dados• propriamente ditos, que correspondem às informações que deverão ser processadas pelo computador.

A memória do computador pode ser entendida como uma seqüência finita de gavetas que, em dado momento, guarda algum tipo de informação, como um número, uma letra, uma palavra, uma frase, etc.

O computador, para poder trabalhar com alguma dessas informações, seja para ler seu conteúdo ou alterá-lo, precisa saber exatamente onde, na memória, o dado está localizado. Fisicamente, cada gaveta, ou cada posição de memória – esse é o termo técnico correto – possui um endereço, ou seja, um número, que indica o seu endereço na memória, em outras palavras, onde cada informação está localizada. Esse número é normalmente representado usando notação hexadecimal, tendo o tamanho de quatro, ou mais bytes – depen-dendo da arquitetura do computador. São exemplos de endereços físicos:

END. FíSICO CONTEÚDO7000:A210 ‘Paulo Sérgio’3000:12BC 3454100: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ÚDO7000:A210 nome ‘Paulo Sérgio’3000:12BC valor 3454100:0006 total 99.834

Page 213: Básico Redes de Comp

AULA 3 • LógICA PARA PROgRAMAçãO

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

Basicamente, uma variável possui três atributos: um nome (ou rótulo), um tipo de dado associado à mesma e um valor que representa a informação por ela apontada. Uma vez definidos, o nome e o tipo de uma variável não podem ser alterados no decorrer de um programa.

Cada Linguagem de Programação define as suas regras para a criação de identificadores de variáveis. Todavia a maioria delas concorda que um identificador de variável deve ser formado por uma letra ou então por uma letra seguida de uma ou mais letras ou dígitos. Como regra, as Linguagens de Programação não permitem o uso de espaços em branco ou de qualquer outro caractere que não seja letra ou dígito, na formação de um identificador de variável.

Devemos sempre definir um nome significativo para as variáveis em um programa. Com isso é muitas vezes possível ter uma idéia do conteúdo e propósito de uma variável mesmo sem inspecioná-la. Um erro comum de programadores iniciantes é a utilização de nomes de variáveis como simples letras, como a, b, c, x, y. Isso torna o programa difícil de ler e compreender. Em alguns casos, nem mesmo o seu autor entende!

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

Page 214: Básico Redes de Comp

AULA 3 • LógICA PARA PROgRAMAçãO

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

Um conceito importante sobre variáveis diz respeito à sua localidade ou escopo. Uma variável declarada no programa principal passa a ser visível em todo o programa e, por isso, são chamadas de variáveis globais. Já uma variável declarada dentro de uma função ou procedimento, é dita como local, indicando que só será visível e conhecida dentro desse proce-dimento ou função. Procedimentos e funções serão estudados na aula sobre Modularização.

Outro atributo característico de uma variável é o tipo de dado que ela pode armazenar. Esse atributo define a natureza das informações contidas na variável.

3.1 Tipos de dados

Os dados são classificados de acordo com o tipo de informação neles contida. Essa classificação não se aplica a nenhuma linguagem de progra-mação específica; pelo contrário, ela sintetiza os padrões utilizados na maioria das linguagens. Na verdade, essa classificação é necessária para determinar a porção de memória que será necessária para armazenar o dado. Além disso essa classificação garante que a interpretação do conteúdo da posição de memória seja feita de forma adequada.

3.1.1 Dados Numéricos

Nessa classificação, estão todos os dados que façam referência a valores. Para o computador, existem diferentes formas de representar um valor, depen-dendo das suas características. Por exemplo, para armazenar um valor real – que possui casas decimais após a vírgula – é necessário um espaço bem maior de memória. Já um valor inteiro ocupa bem menos espaço.

Os dados numéricos possuem uma subclassificação que os define de acordo com a sua grandeza de representação. Entre as principais subclasses temos:

inteiro• – os números inteiros são aqueles que não possuem casas deci-mais nem são números fracionários, e podem ser positivos, negativos ou zero. Exemplos de números inteiros são 55 (inteiro positivo), 0 (zero inteiro) e -98 (inteiro negativo);

real• – os dados do tipo real são aqueles que possuem parte decimal ou são números fracionários, e podem ser positivos, negativos ou zero.

Page 215: Básico Redes de Comp

AULA 3 • LógICA PARA PROgRAMAçãO

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

Exemplos de dados do tipo real são 3.2 (real positivo), 0.00 (zero real) e -19.76 (real negativo).

Na implementação particular de cada linguagem, esses tipos de dados numéricos são expandidos, dando origem a novos tipos de dados. Normalmente, esses novos tipos permitem representar valores maiores ou menores a fim de permitir um melhor uso do espaço de memória disponível para execução do programa. A Linguagem de Programação C, que será estudada nesse curso, por exemplo, apresenta para os números inteiros os tipos integer (inteiro tradicional) – usado para representar números entre 32768 até +32767 e ocupa dois bytes na memória; char (caractere – que, na verdade, é um inteiro pequeno) – usado para representar números entre 0 e 255; word – usado para representar números inteiros positivos entre 0 e 65535 e ocupa dois bytes na memória; ShortInt – usado para repre-sentar valores inteiros entre -128 e +128 e ocupa um byte na memória; e LongInt – usado para representar números inteiros entre 2.147.483.648 até 2.147.483.648 e ocupa quatro bytes na memória. Existem diferentes tipos para os valores reais também.

3.1.2 Dados literais (string)

Uma informação do tipo literal representa um conjunto de caracteres que pode ser formado por letras, dígitos ou símbolos especiais.

O computador representa cada letra, dígito e símbolo especial como um valor inteiro que varia de 0 a 255. Assim cada caractere é tratado internamente por esse valor. A correspondência de valores para os carac-teres é fornecida por uma padronização internacional conhecida como Tabela ASCII.

A Tabela ASCII ISO 8859-1, também chamada Latim I, é uma das Tabelas ASCII estendidas, orientada especificamente para alguns idiomas europeus ocidentais.

A correta visualização dos caracteres dessa tabela depende de vários fatores técnicos, inclusive da fonte utilizada. Em computadores atualizados, provavelmente, será possível uma visualização adequada sem problemas.

Observe que nem todos os números da tabela correspondem a grafemas. Cabe ressaltar que os valores de 0 a 31, 127 e 255 são reservados para funções especiais de processamento e não representam caracteres imprimíveis.

Page 216: Básico Redes de Comp

AULA 3 • LógICA PARA PROgRAMAçãO

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

Figura 1– Tabela ASCII. Fonte: <http://www.abusar.org>.

Essa convenção foi padronizada para possibilitar a migração de programas entre máquinas diferentes.

Cabe salientar que o comprimento de um dado do tipo literal é dado pelo número de caracteres nele contido. Logo, para armazenarmos um tipo de dado literal precisamos reservar um espaço contíguo de memória igual ao compri-mento do mesmo, destinando um byte para cada caractere de informação. O literal “Programação”, por exemplo, possui comprimento igual a 11, ou seja, possui 11 caracteres.

3.1.3 Dados lógicos

Um dado do tipo lógico só possui dois valores possíveis: verdadeiro ou falso. Dessa forma poderíamos pensar em armazenar uma informação desse tipo em apenas um único bit. Todavia a menor porção de memória que se pode acessar é o byte (oito bits). Assim uma informação do tipo lógico é armaze-nada em um byte de memória.

0 32 ? 64 @ 96 ` 128 Ç 160 á 192 └ 224 Ó1 ☺ 33 ! 65 A 97 a 129 ü 161 í 193 ┴ 225 ß2 ☻ 34 " 66 B 98 b 130 é 162 ó 194 ┬ 226 Ô3 ♥ 35 # 67 C 99 c 131 â 163 ú 195 ├ 227 Ò4 ♦ 36 $ 68 D 100 d 132 ä 164 ñ 196 ─ 228 õ5 ♣ 37 % 69 E 101 e 133 à 165 Ñ 197 ┼ 229 Õ6 ♠ 38 & 70 F 102 f 134 å 166 ª 198 ã 230 µ7 • 39 ' 71 G 103 g 135 ç 167 º 199 Ã 231 þ8 ◘ 40 ( 72 H 104 h 136 ê 168 ¿ 200 ╚ 232 Þ9 ○ 41 ) 73 I 105 i 137 ë 169 ® 201 ╔ 233 Ú10 ◙ 42 * 74 J 106 j 138 è 170 ¬ 202 ╩ 234 Û11 ♂ 43 + 75 K 107 k 139 ï 171 ½ 203 ╦ 235 Ù12 ♀ 44 , 76 L 108 l 140 î 172 ¼ 204 ╠ 236 ý13 ♪ 45 - 77 M 109 m 141 ì 173 ¡ 205 ═ 237 Ý14 ♫ 46 . 78 N 110 n 142 Ä 174 « 206 ╬ 238 ¯15 ☼ 47 / 79 O 111 o 143 Å 175 » 207 ¤ 239 ´16 ► 48 0 80 P 112 p 144 É 176 ░ 208 ð 240 17 ◄ 49 1 81 Q 113 q 145 æ 177 ▒ 209 Ð 241 ±18 ↕ 50 2 82 R 114 r 146 Æ 178 ▓ 210 Ê 242 ‗19 ‼ 51 3 83 S 115 s 147 ô 179 │ 211 Ë 243 ¾20 ¶ 52 4 84 T 116 t 148 ö 180 ┤ 212 È 244 ¶21 § 53 5 85 U 117 u 149 ò 181 Á 213 ı 245 §22 ▬ 54 6 86 V 118 v 150 û 182 Â 214 Í 246 ÷23 ↨ 55 7 87 W 119 w 151 ù 183 À 215 Î 247 ¸24 ↑ 56 8 88 X 120 x 152 ÿ 184 © 216 Ï 248 °25 ↓ 57 9 89 Y 121 y 153 Ö 185 ╣ 217 ┘ 249 ¨26 → 58 : 90 Z 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

Page 217: Básico Redes de Comp

AULA 3 • LógICA PARA PROgRAMAçãO

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

De certa forma, se por um lado isso pode parecer como um “desper-dício” de memória, por outro simplifica bastante a arquitetura de memória dos computadores. Além disso isso não é tão relevante, uma vez que, na prática, o número de ocorrências de dados do tipo lógico é bastante inferior ao de ocorrências de dados do tipo literal ou numérico.

3.2 Variáveis estruturadas

Existem tipos especiais de variável que permitem manipular mais de um tipo de dados ao mesmo tempo.

Essa funcionalidade facilita a manipulação de grandes conjuntos de dados, além de diminuir a complexidade do programa e as possibilidades de erros.

Entre os tipos mais comuns, implementados na maioria das linguagens de programação, estão os vetores e registros.

3.2.1 Variáveis unidimensionais (vetores) e multidimensionais matrizes

Esse tipo de variável contém vários valores do mesmo tipo básico. Assim é possível utilizar um vetor ou matriz de inteiros, por exemplo.

Na verdade, um vetor é uma coleção de elementos do tipo específico e com tamanho pré-definido (o número de elementos do vetor deve ser definido pelo programador na declaração dessa estrutura).

O vetor é uma coleção unidimensional e o acesso a cada elemento é dado por um índice que representa a posição do elemento no vetor. Na maioria das representações de vetores, o acesso é representado pelo nome da variável do tipo vetor seguido de um valor inteiro entre colchetes, representando o índice.

A sintaxe para declaração desse tipo de variável depende da linguagem de programação que a implementa. No caso da linguagem Pascal, a declaração notas: array[1..10] of integer é usada para definir a variável notas como sendo do tipo vetor de inteiros, contendo 10 elementos desse tipo. Já na linguagem C, essa mesma variável é definida a partir da declaração int notas[10]. No caso do Pascal, a declaração notas[1] permite acessar o valor do primeiro elemento do vetor, enquanto notas[10], o último. Já na linguagem C, um vetor é indexado a partir do índice zero. Com isso, para acessar o primeiro elemento de um vetor em C, é usada a declaração notas[0] e notas[9] para o último.

Ao indexar um vetor, estamos tratando de um item individual, como se fosse uma variável isolada.

Page 218: Básico Redes de Comp

AULA 3 • LógICA PARA PROgRAMAçãO

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

Já uma variável do tipo matriz pode ser vista como um vetor de vetores, em que cada vetor representa uma dimensão. Por isso essa estrutura é dita multidimensional.

O tipo de matriz mais utilizado é o bidimensional, em que são decla-radas apenas duas dimensões. Porém a maioria das linguagens não impõem qualquer tipo de restrição à quantidade de dimensões. Assim é possível criar matrizes tridimensionais ou até n-dimensionais.

Um exemplo de declaração de matriz em C seria int notas[2][5]. Nesse caso, é declarada uma matriz bidimensional, em que a primeira dimensão possui dois elementos, e a segunda possui cinco elementos. No total, serão reservados em memória espaço suficiente para representar 2x5=10 valores inteiros.

De forma similar aos vetores, o acesso a cada elemento da matriz deve ser realizado a partir do nome da variável seguida de um valor inteiro para servir de índice para cada dimensão.

3.2.2 Registros

São estruturas heterogêneas – compostas de elementos de tipos diferentes.

Cada elemento que faz parte do registro é chamado de campo. Inclusive, cada campo pode ser do tipo registro também.

Esse tipo de estrutura permite organizar melhor os dados a serem mani-pulados, principalmente por permitir agregar dados de uma mesma natureza. Para entendermos melhor isso, imaginemos um programa que manipule os seguintes dados sobre os alunos de um curso: o nome do aluno, a idade e o número do seu CPF. Sem o uso de registros, normalmente, cada um desses dados sobre o aluno seria manipulado em variáveis diferentes. Mesmo utili-zando o conceito de vetor, ainda assim seria necessário manipular três vetores diferentes. Isso torna a atividade de programação bastante complexa.

Com o uso de registro é possível agregar esses dados em uma estrutura do tipo registro e declarar um único vetor desse tipo. Para exemplificar, podemos examinar o seguinte trecho de código na linguagem C:

struct TAluno {char nome[80];int idade;char cpf[11];

} ;struct TAluno alunos[10];

Page 219: Básico Redes de Comp

AULA 3 • LógICA PARA PROgRAMAçãO

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

Aqui usaremos uma notação mais genérica, independente da linguagem de programação a ser usada. Usando essa notação, teríamos a seguinte decla-ração do mesmo registro:

TIPO TAluno = REGISTROnome: 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 aulaNesta 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.

Page 220: Básico Redes de Comp

AULA 3 • LógICA PARA PROgRAMAçãO

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

Já um dado constante não sofre alteração no seu valor durante a execução do programa.

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

Page 221: Básico Redes de Comp

AULA 3 • LógICA PARA PROgRAMAçãO

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

programa. E é exatamente essa “variação” de seu valor que dá nome a esse tipo de dado. A opção (a) está correta, pois as variáveis servem de apontador para as posições da memória RAM, onde estão os dados a serem manipulados pelo programa. A opção (c) também apresenta um conceito correto sobre tipo de dado, pois é baseado no tipo do dado que o computador saberá como tratar a posição de memória apontada pela variável. A opção (d) está correta, inclusive é por esse motivo que vetores e matrizes são considerados estruturas de dados homogêneos – por tratar de dados do mesmo tipo. Por fim, a opção (e) também está correta ao trazer a definição de um dado constante.

Na atividade 2, após analisar os conteúdos a serem armazenados você deve ter concluído que a opção correta é a opção (a), pois ela apresenta para o conteúdo idade o tipo inteiro (afinal costumamos utilizar valores inteiros positivos para a contar a passagem dos anos – não usamos “3,4 anos de idade”); para o conteúdo temperatura devemos usar casas decimais, logo o tipo mais indicado é o real; para o nome da cidade precisamos de um literal ou caractere; para o número da carteira de identidade, na verdade, poderíamos usar um tipo caractere (isso permitiria armazenar os caracteres de formatação, como ponto e hífen) ou como inteiro (sem formatação); já para as notas de um aluno, uma nota normalmente é expressa como um valor real e como será mais de uma nota (notas), o tipo de dado mais adequado a esse caso é um vetor de real, o que permitiria manipular todas as notas de um aluno a partir de uma mesma variável. Tomando como base essas justificativas, você deveria considerar as demais opções como incorretas, pelos seguintes motivos: a opção (b) apresenta inadequação para o conteúdo temperatura e para as notas do aluno; a opção (c) apresenta inadequação para o nome da cidade; a opção (d) apresenta inadequações para o nome da cidade e as notas do aluno; e a opção (e) apresenta inadequações para o número da carteira de identidade.

Para solucionar a atividade 3, você já deve saber que o uso de variáveis permite ao programador manipular de forma mais fácil os dados que estão armazenados na memória. Sem o auxílio de variáveis, toda vez que fosse neces-sário algum dado da memória seria necessário endereçar a posição de memória usando seu endereço físico em notação hexadecimal. As variáveis levam esse nome em função do seu comportamento, em que o valor de uma variável (na verdade, o conteúdo da posição de memória por ela referenciada) pode ser alterado várias vezes ao longo da execução de um programa. Já um dado do tipo constante não tem o seu valor alterado do início ao fim do programa.

Page 222: Básico Redes de Comp

AULA 3 • LógICA PARA PROgRAMAçãO

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

Na atividade 4, você deve ter se lembrado de que variáveis do tipo Registro facilitam a manipulação de dados relacionados, como, por exemplo, o nome, a idade e o endereço de um aluno. Essa facilidade advém do fato de que uma variável do tipo registro, ao ser referenciada, disponibiliza todos os dados associados de uma só vez. De outra forma, teríamos de controlar cada dado do aluno em variáveis distintas e, para acessar os dados de um aluno, teríamos de realizar, na verdade, o acesso a três variáveis distintas. No caso dos registros, cada informação sobre o aluno fica disponível como um campo da estrutura Registro.

Ao realizar as atividades propostas com sucesso, você alcançou os obje-tivos desta aula de entender os conceitos de variável e de constante e suas utilizações e de utilizar adequadamente cada tipo de dado disponível.

Na próxima aula

Estudaremos os principais operadores e como podem ser usados na compo-sição de expressões. Serão estudados os operadores mais gerais e que são implementados na maioria das Linguagens de Programação, nomeadamente: aritméticos, lógicos, de atribuição e de concatenação.

Anotações

Page 223: Básico Redes de Comp

AULA 4 • LógICA PARA PROgRAMAçãO

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

Objetivos

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

reconhecer os principais operadores da Lógica para Programação, •utilizando-os;

construir corretamente expressões aritméticas e lógicas, avaliando-as.•

Pré-requisitos

Não há pré-requisitos formais para esta aula, uma vez que trata de opera-ções básicas, pois pressupomos que você possua conhecimentos sobre Teoria de Conjuntos e Matemática Fundamental. Tire suas dúvidas no caderno de Matemática para Computação!

Introdução

Operadores são elementos funcionais que atuam sobre termos e produzem um determinado resultado.

Os operadores são, na prática, instruções especiais pelas quais incre-mentamos, decrementamos, comparamos e avaliamos dados dentro de um programa de computador. Podemos classificar os operadores em três classes:

operadores aritméticos;•

operadores relacionais;•

operadores lógicos. •

Com o uso de operadores é possível construir expressões, assim como na matemática. A complexidade de uma expressão é determinada pela quanti-dade de operadores e termos (variáveis ou valores constantes).

Aula 4Operadores e expressões

Page 224: Básico Redes de Comp

AULA 4 • LógICA PARA PROgRAMAçãO

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

De acordo com o número de termos sobre os quais os operadores atuam, podemos classificá-los em:

binários• : quando atuam sobre dois termos. Os operadores aritméticos básicos (adição, subtração, divisão e multiplicação), por exemplo;

unários• : quando atuam sobre um único termo. O sinal de negativo (-) na frente de um número, cuja função é inverter seu sinal, por exemplo.

4.1 Operadores aritméticos

Os operadores aritméticos são os utilizados para obter resultados numé-ricos. Além da adição, subtração, multiplicação e divisão, grande parte das linguagens de programação também disponibilizam o operador para a operação de exponenciação. Os símbolos para os operadores aritméticos são os listados a seguir.

OPERAçãO SíMBOLOAdição +Subtração -Multiplicação *Divisão /Exponenciação ^ (depende da linguagem utilizada)Resto da divisão inteira MODQuociente da divisão inteira DIV

Esses operadores são comumente utilizados para a formação de expres-sões aritméticas. A avaliação da expressão – o que resulta no cálculo do seu resultado – depende da ordem na qual os operadores são processados. Para garantir que sempre seja obedecida uma mesma ordem, é definida uma hierar-quia para a avaliação dos operadores. Essa hierarquia é herdada da própria matemática. Segundo esta hierarquia:

em primeiro lugar, devem ser processadas as expressões entre 1. parênteses;

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

então devem ser processadas as operações de Multiplicação e Divisão 3. (o que aparecer primeiro);

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

Essa hierarquia garante a correta interpretação de uma expressão aritmética.

Page 225: Básico Redes de Comp

AULA 4 • LógICA PARA PROgRAMAçãO

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

É importante salientar que, na maioria das Linguagens de Programação, o tipo de dado resultante depende dos tipos de dados dos termos. A seguir é apresentada uma listagem com os tipos de dados resultantes de cada operador.

OPERADOR TIPO DE DADO DE A TIPO DE DADO DE B TIPO RESULTANTE

A + B

Inteiro Inteiro InteiroReal Real RealInteiro Real RealReal Inteiro Real

A – B

Inteiro Inteiro InteiroReal Real RealInteiro Real RealReal Inteiro Real

A * B

Inteiro Inteiro InteiroReal Real RealInteiro Real RealReal Inteiro Real

A/B

Inteiro Inteiro RealReal Real RealInteiro Real RealReal Inteiro Real

A DIV BInteiro Inteiro InteiroInteiro Inteiro Inteiro

A MOD BInteiro Inteiro InteiroInteiro 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íMBOLOIgual 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

Page 226: Básico Redes de Comp

AULA 4 • LógICA PARA PROgRAMAçãO

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

no seu valor. Se os termos forem texto (literais), a comparação é feita lexicograficamente, ou seja, seguindo a ordem alfabética. Se os termos forem lógicos, apenas estão disponíveis os operadores de igualdade e a diferença.

Para estabelecer prioridades no que diz respeito a qual operação executar primeiro, devemos utilizar os parênteses.

Vale ressaltar que não é eficaz comparar valores do tipo real com os operadores de igualdade em virtude de a representação em ponto flutuante ser inexata em alguns casos.

Apesar de algebricamente correta, a expressão (1.0 / 3.0) + (1.0 / 3.0) + (1.0 / 3.0) = 1 é avaliada como falsa devido ao fato de 1.0 / 3.0 ter como resul-tado um valor que contém número infinito de casas decimais (3.3333333...). O computador é apenas capaz de utilizar um número finito de casas decimais e, portanto, é feito um arredondamento do valor de 1/3 em cada ocorrência.

Para evitar os erros causados pela representação inexata de valores reais, deve-se evitar utilizar as comparações de igualdade com números reais.

4.3 Operadores lógicos

Os operadores lógicos servem para combinar resultados de expressões, retornando se o resultado final é verdadeiro ou falso.

Esse tipo de operador é amplamente usado na composição de expres-sões lógicas que são muito utilizadas nas estruturas de decisão e repetição em um programa.

Os operadores lógicos são:

E (do inglês • AND) – uma expressão desse tipo é verdadeira se todas as condições forem verdadeiras;

OU (do inglês • OR) – uma expressão desse tipo é verdadeira se uma ou todas as condições forem verdadeiras;

NÃO (do inglês • NOT) – uma expressão desse tipo inverte o valor da expressão ou condição, se verdadeira inverte para falsa e vice-versa.

Os operadores lógicos e relacionais são elementos de fundamental impor-tância na elaboração de um programa. Em todos os programas são utilizadas expressões relacionais e lógicas para a tomada de decisões e conseqüente desvio do fluxo do programa.

Page 227: Básico Redes de Comp

AULA 4 • LógICA PARA PROgRAMAçãO

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

O resultado de uma operação lógica vai depender dos valores dos termos submetidos. A seguir é apresentada uma listagem com os tipos de dados resul-tantes de cada operador.

OPERADOR TIPO DE DADO DE A TIPO DE DADO DE B TIPO RESULTANTEA e B verdadeiro verdadeiro verdadeiroA e B verdadeiro falso falsoA e B falso verdadeiro falsoA e B falso falso falsoA ou B verdadeiro verdadeiro verdadeiroA ou B verdadeiro falso verdadeiroA ou B falso verdadeiro verdadeiroA ou B falso falso verdadeironão A verdadeiro ----- falsonã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.

Page 228: Básico Redes de Comp

AULA 4 • LógICA PARA PROgRAMAçãO

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

É importante ressaltar que o termo do lado esquerdo do operador de atribuição deve sempre ser um identificador de variável, de outra forma não haverá onde armazenar o valor posicionado no lado direito.

4.6 Expressões

O conceito de expressão, em termos computacionais, está intimamente ligado ao conceito de expressão (ou fórmula) usado na matemática, na qual um conjunto de variáveis e constantes numéricas relaciona-se por meio de operadores aritméticos compondo uma fórmula que, uma vez avaliada, resulta em um valor final.

O conceito de expressão aplicado à computação assume um sentido mais amplo: uma expressão é uma combinação de variáveis, constantes e operadores (aritméticos, relacionais ou lógicos) e que, uma vez avaliada, resulta em um valor.

Expressões aritméticas são aquelas cujo resultado da avaliação é do tipo numérico, seja ele inteiro ou real. Somente o uso de operadores aritméticos e variáveis numéricas são permitidos em expressões desse tipo.

Expressões lógicas são aquelas cujo resultado da avaliação é um valor lógico (verdadeiro ou falso). Na formação de expressões lógicas, é permitido tanto o uso de operadores lógicos quanto relacionais.

Síntese da aula

Nesta aula, foram apresentados e discutidos os principais Operadores Aritméticos, Relacionais e Lógicos usados na Programação para Computadores. Foi discutida ainda a construção e a avaliação de expressões que utilizam esses operadores.

Atividades

1. Das alternativas apresentadas a seguir, indique aquela que representa um operador unário.

a) Maior do que [ >]

b) Resto da divisão inteira [ MOD ]

c) Negação [NOT ]

d) Multiplicação [ * ]

e) OU lógico [ OU ]

Page 229: Básico Redes de Comp

AULA 4 • LógICA PARA PROgRAMAçãO

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

2. Das alternativas apresentadas abaixo, indique aquela que não devolve um valor lógico. Considere os seguintes valores para as variáveis Media←7, Pais←”Brasil”, Nota←7.25, Valor←verdadeiro e Opcao=”a”.

a) ((Nota >= Media) E (Opcao=”b”))

b) (((Nota + 1) > Media) OU (NAO Valor))

c) (((Media*2)-1) MOD 2)

d) (((Media DIV 7) = 1) OU (Nota >= Media))

e) (((Nota - Media) > 3) = Valor)

3. O algoritmo a seguir apresenta um problema discutido nesta aula. Identifique o problema e sugira as alterações necessárias para a sua correção.

ALGORITMO A3;

VAR RESULTADO: inteiro;

A, B: real;

INICIO

A ← 25;

B ← 3;

RESULTADO ← (A / B) * 5;

IMPRIMA (RESULTADO);

FIM

4. Considere a seguinte expressão ((((A MOD 5) > 5) OU (B/C >= 1)) E ((NAO ((A<50) E (B <> C))) OU (C=5))) e determine o valor para essa expressão lógica, tendo os valores 23, 5 e 5 como valores das variáveis A, B e C, respectivamente.

Comentário das atividades

Na atividade 1, com base no que você estudou, deve ter ficado claro que a opção correta é a opção (c), pois a operação lógica de negação inverte o valor lógico do único termo sobre o qual opera. A opção (a) é incorreta, pois o operador “maior que” é um operador binário, pois compara dois valores, retornando verdadeiro se o valor do lado esquerdo for maior do que o lado direito. A opção (b) também é incorreta, pois o operador de resto da divisão inteira também é um operador binário. A opção (d) é incorreta, pois apresenta

Page 230: Básico Redes de Comp

AULA 4 • LógICA PARA PROgRAMAçãO

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

a operação aritmética de multiplicação que também é binária. E, por fim, a opção (e) também apresenta um operador binário, pois o operador lógico OU opera sobre dois termos lógicos.

Para você responder a atividade 2, deve ter considerado a hierarquia das operações e os valores das variáveis. Daí bastou usar de substituição para avaliar o resultado de cada expressão. Seguindo essa abordagem, você deve ter chegado à conclusão de que a única alternativa que não devolve um valor lógico é a opção (c), pois, se substituirmos os valores das variáveis e execu-tarmos as operações, teremos: (((Media*2)-1) MOD 2) ↔ (((7*2)-1) MOD 2) ↔ ((14 – 1) MOD 2) ↔ (13 MOD 2) ↔ 1. Ou seja, o resultado é um valor inteiro. Se analisarmos as outras expressões da mesma maneira, veremos que todas resultam em um valor lógico: a opção (a) retorna ((Nota >= Media) E (Opcao=”b”)) ↔ ((7.25 >= 7) E (“a”=”b”)) ↔ (verdadeiro E falso) ↔ falso; a opção (b) retorna (((Nota + 1) > Media) OU (NAO Valor)) ↔ (((7.25 + 1) > 7) OU (NAO verdadeiro)) ↔ ((8.25 > 7) OU falso) ↔ verdadeiro OU falso ↔ verdadeiro; a opção (d) retorna (((Media DIV 7) = 1) OU (Nota >= Media)) ↔ (((7 DIV 7) = 1) OU (7.25 >= 7)) ↔ ((1 = 1) OU (verdadeiro)) ↔ (verdadeiro OU verdadeiro ↔ verdadeiro; e a opção (e) retorna (((Nota - Media) > 3) = Valor) ↔ (((7.25 - 7) > 3) = verdadeiro) ↔ ((0.25 > 3) = verdadeiro) ↔ falso = verdadeiro ↔ falso.

A partir da análise do algoritmo apresentado na atividade 3, você deve ter notado que a instrução RESULTADO ← (A / B) * 5; apresenta um problema quanto ao tipo de dado resultante da expressão e o tipo de dado da variável que recebe o valor da expressão. A variável RESULTADO é declarado como sendo do tipo inteiro. Por outro lado, você já deve saber que o operador de divisão quando aplicado a dois valores reais, retorna como resultado um valor também real; e o mesmo acontece com a multiplicação que segue. Assim o resultado da expressão é do tipo real. E, nesse caso, a variável RESULTADO que é do tipo inteiro não pode receber esse valor. A solução para esse problema é simples nesse algoritmo. Basta alterar o tipo de dado do resultado para real, ou seja, declará-lo como VAR RESULTADO: real.

Na atividade 4, se você utilizou a técnica de substituição dos valores das variáveis e a resolução de cada operação respeitando a hierarquia entre elas, você concluiu que ((((A MOD 5) > 5) OU (B/C >= 1)) E ((NAO ((A<50) E (B <> C))) OU (C=5))) ↔ ((((23 MOD 5) > 5) OU (5/5 >= 1)) E ((NAO ((23<50) E (5 <> 5))) OU (5=5))) ↔ (((3 > 5) OU (1 >= 1)) E ((NAO (verdadeiro E falso)) OU verdadeiro)) ↔ ((falso OU verdadeiro) E ((NAO falso) OU verdadeiro)) ↔

Page 231: Básico Redes de Comp

AULA 4 • LógICA PARA PROgRAMAçãO

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

(verdadeiro E (verdadeiro OU verdadeiro)) ↔ (verdadeiro E verdadeiro) ↔ verdadeiro. Logo o valor para essa expressão lógica é verdadeiro.

Ao realizar as atividades propostas, checando-as com os comentários e obtendo sucesso, você está apto a reconhecer os principais Operadores da Lógica para Programação, utilizando-os, e construir corretamente expressões aritméticas e lógicas, avaliando-as. Parabéns!

Na próxima aula

Estudaremos, na próxima aula, a Estrutura de Arquivo. Na prática, esse tipo de estrutura é muito utilizado para o armazenamento e manipulação de grandes conjuntos de dados.

Anotações

Page 232: Básico Redes de Comp

AULA 4 • LógICA PARA PROgRAMAçãO

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

Page 233: Básico Redes de Comp

AULA 5 • LógICA PARA PROgRAMAçãO

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

Objetivos

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

definir uma estrutura de arquivos;•

utilizar arquivos na construção de algoritmos.•

Pré-requisitos

Por tratar de uma estrutura que é armazenada em dispositivos de memória secun-dária (discos rígidos, fitas, pen drivers, etc.), é desejável um conhecimento básico sobre esses dispositivos e sobre sistemas operacionais. Caso ainda não conheça esses dispositivos, procure conhecê-los por meio de seus colegas e web-tutoria.

Introdução

Até aqui discutimos a manipulação de dados em um programa exclusiva-mente em memória principal – memória RAM – e vimos como as variáveis são utilizadas para esse fim. Entretanto nos limitamos a problemas que exigiam poucos dados a serem processados e, com isso, estruturas mais simples puderam ser usadas normalmente. Mas na prática existem inúmeros casos que exigem uma grande quantidade de dados de entrada ou saída. E nestes casos as variáveis ou até mesmo os vetores já não são suficientes ou tornam o algoritmo muito complexo. Em casos assim, devemos utilizar uma estrutura de arquivo para a manipulação desses dados.

Além disso, por armazenarem os dados em memória secundária, os arquivos garantem que os dados neles armazenados não se percam ao final da execução do programa.

Nesta aula, estudaremos como os arquivos devem ser utilizados em um algoritmo computacional.

Aula 5Arquivos

Page 234: Básico Redes de Comp

AULA 5 • LógICA PARA PROgRAMAçãO

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

5.1 Declaração

Um arquivo é, em sua essência, um conjunto de registros e, portanto não possui um tamanho fixo. Na prática, os arquivos são utilizados para manter uma grande quantidade de dados como, por exemplo, os dados de todos os alunos de uma escola.

Já que um arquivo é um conjunto de registros, antes de declarar um arquivo propriamente dito, precisamos declarar o registro que representa cada dado individual armazenado. Seguindo o exemplo de alunos de uma escola, podemos definir o registro contendo informações sobre cada aluno individual da seguinte forma:

TIPO TAluno = REGISTRO

nome: CARACTERE;

idade: INTEIRO;

cpf: CARACTERE;

FIM REGISTRO

Após termos definido a estrutura do registro TAluno, podemos declarar o arquivo 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.

Page 235: Básico Redes de Comp

AULA 5 • LógICA PARA PROgRAMAçãO

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

Para a manipulação de arquivos, a maioria das Linguagens de Programação implementam funções específicas para as principais operações sobre arquivos: ABRE, FECHA, COPIA, GRAVA, REMOVE, FIMDEARQUIVO, PROXIMO e POSICIONE.

A operação ABRE (<variável do tipo arquivo >) é usada para abrir o arquivo e posicionar o ponteiro de leitura no primeiro registro armazenado. Na prática, a implementação dessa operação envolve uma série de verifica-ções para garantir que o arquivo existe, se o usuário do computador possui direitos de acesso a ele, etc.

Ao trabalharmos com arquivos, devemos ter como prática que sempre que um arquivo não estiver sendo mais usado ele deve ser fechado para garantir a integridade dos dados nele armazenados. Para fechar um arquivo devemos usar a operação FECHA (<variável do tipo arquivo >).

Ao manipular um arquivo, temos a necessidade de operar sobre os campos dos registros contidos nele. Nesses casos, copiamos o conteúdo do registro atual de um arquivo para outra variável do tipo registro. A partir daí operamos sobre os campos do registro que recebeu os dados copiados. Nessa situação é usada a operação COPIA (<variável do arquivo origem>, <variável

do tipo registro>). É importante lembrar que a variável do tipo registro que irá receber uma cópia dos dados deve ser do mesmo tipo dos registros do arquivo, ou seja, armazenar registros contendo exatamente a mesma estrutura – os mesmos campos. Essa operação COPIA pode ser vista como uma leitura do registro atual do arquivo.

O exemplo de algoritmo a seguir, representado em pseudocódigo, demonstra o uso das operações ABRE, FECHA e COPIA.

ALGORITMO arquivos;

TIPO TAluno = REGISTRO

nome: CARACTERE;

idade: INTEIRO;

cpf: CARACTERE;

FIM REGISTRO

TIPO TArqAluno = ARQUIVO DE TAluno;

VAR alunos: TArqAluno;

aux: TAluno;

Page 236: Básico Redes de Comp

AULA 5 • LógICA PARA PROgRAMAçãO

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

INICIO

ABRE(alunos);

COPIA(alunos, aux);

IMPRIMA(“Nome: ” + aux.nome);

IMPRIMA(“Idade: ” + aux.idade);

IMPRIMA(“CPF: ” + aux.cpf);

FECHA(alunos);

FIM

Como a função principal de um arquivo é guardar informações para que não se percam com o desligamento do computador, a operação GRAVA (<vari-ável do tipo arquivo>, <variável do tipo registro>) deve ser usada. Essa operação diz ao computador que o registro (na verdade os dados armazenados) passado por parâmetro deverá ser armazenado no arquivo. Na prática, é criado um novo registro no final do arquivo e os dados são copiados para ele.

Certos algoritmos exigem em algum momento que um registro do arquivo seja apagado. Isso é possível por meio da operação REMOVE (<variável do tipo arquivo >) que irá remover o registro atualmente referenciado pelo apon-tador do arquivo, mais conhecido como posição corrente.

Os arquivos de registros normalmente possuem uma característica seqüencial, na qual cada novo registro é inserido no final do arquivo, sem nenhuma orde-nação. Essa característica implica termos de buscar sequencialmente, ou seja, um registro após o outro. Para mover a posição corrente de um arquivo para o próximo registro, devemos utilizar a operação PROXIMO (<variável do tipo arquivo>).

A movimentação em um arquivo pode levar até o último registro do arquivo e, nesse caso, não haverá um próximo registro a ser posicionado, e dizemos que foi alcançado o final do arquivo. Em um algoritmo envolvendo arquivos precisamos saber quando chegamos ao final do arquivo. Nesse caso, usamos a operação FIMDEARQUIVO (<variável do tipo arquivo>) que retorna um valor lógico – verdadeiro, indicando que o fim do arquivo foi alcançado; e falso, indicando o contrário.

O exemplo a seguir expande o anterior e demonstra como podemos ler e gravar informações em um arquivo. A primeira estrutura de repetição ENQUANTO do algoritmo serve para inserir repetidamente novos registros ao arquivo. Na prática, enquanto o usuário responder ‘S’ para a questão “INSERIR NOVO REGISTRO? (S/N)” o conjunto de comandos que lêem os dados de um novo registro e grava-o no arquivo serão executados.

Page 237: Básico Redes de Comp

AULA 5 • LógICA PARA PROgRAMAçãO

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

ALGORITMO arquivos; TIPO TAluno = REGISTRO nome: CARACTERE; idade: INTEIRO; cpf: CARACTERE; FIM REGISTROTIPO 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-

Page 238: Básico Redes de Comp

AULA 5 • LógICA PARA PROgRAMAçãO

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

tros que o antecedem. Esse tipo de arquivo é conhecido como arquivo de acesso randômico ou de acesso direto. Para ele, podemos usar a operação POSICIONE (<variável do tipo arquivo>, <chave>), que permite posicionar como registro corrente o registro que possua como valor de campo o valor passado como chave. Essa instrução é muito útil quando temos uma grande quantidade de dados no arquivo e queremos realizar alguma busca por um registro específico.

5.3 Arquivos texto

Algumas vezes queremos armazenas dados sem nenhuma estrutura espe-cífica, como no caso dos registros. Na verdade, queremos apenas armazenar um conjunto de caracteres.

Síntese da aula

Nesta aula, você estudou os principais conceitos relacionados à defi-nição e à manipulação da Estrutura de Arquivo. Essa estrutura é fundamental na programação, pois permite manipular uma grande quantidade de infor-mações ao mesmo tempo. Além disso permite armazenar, de forma defini-tiva, dados que podem ser usados em outros programas ou em uma próxima execução do mesmo.

Atividades

1. Após analisar as afirmações a seguir, indique a alternativa que apresenta a opção correta.

I. Um arquivo permite armazenar dados em memória secundária.

II. Quando o programa é encerrado, os dados de um arquivo são 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.

Page 239: Básico Redes de Comp

AULA 5 • LógICA PARA PROgRAMAçãO

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

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

CóDIGO NOME IDADE CIDADE1102 Gionvani Del Gado 34 São Paulo2004 Maria das Dores 23 Curitiba5534 João Roberto 20 Curitiba6676 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

Page 240: Básico Redes de Comp

AULA 5 • LógICA PARA PROgRAMAçãO

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

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;

Page 241: Básico Redes de Comp

AULA 5 • LógICA PARA PROgRAMAçãO

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

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.

Page 242: Básico Redes de Comp

AULA 5 • LógICA PARA PROgRAMAçãO

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

Anotações

Page 243: Básico Redes de Comp

AULA 6 • LógICA PARA PROgRAMAçãO

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

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:

Aula 6Estruturas de controle

Page 244: Básico Redes de Comp

AULA 6 • LógICA PARA PROgRAMAçãO

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

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

Page 245: Básico Redes de Comp

AULA 6 • LógICA PARA PROgRAMAçãO

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

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.

INICIO

FIM

N

N > 0

SIM

NÃO

N

ALGORITMO Selecao_Simples;

VAR N: Inteiro;

INICIO

LEIA N;

SE N>0 ENTAO

IMPRIMA N;

FIM SE

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.

Page 246: Básico Redes de Comp

AULA 6 • LógICA PARA PROgRAMAçãO

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

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.

INICIO

FIM

N

N > 0

SIM NÃO

N“O valor

de N deve ser positivo”

ALGORITMO Selecao_Composta;

VAR N: Inteiro;

INICIO

LEIA N;

SE N>0 ENTAO

4IMPRIMA N;

SENAO

IMPRIMA “O valor de N deve

ser positivo”;

FIM SE

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

Page 247: Básico Redes de Comp

AULA 6 • LógICA PARA PROgRAMAçãO

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

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.

INICIO

FIM

N

N > 0SIM

NÃO

“O valor de N deve

ser positivo”

N MOD 2=0

SIMNÃO

“Este valor é par”

“Este valor é ímpar”

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

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.

Page 248: Básico Redes de Comp

AULA 6 • LógICA PARA PROgRAMAçãO

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

INICIO

FIM

OPÇÃO

OPÇÃO

NÃO

1 2 3

“Você escolheu a opção 1”

“Opção inválida”

“Você escolheu a opção 2”

“Você escolheu a opção 3”

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 ESCOLHAFIM

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.

Page 249: Básico Redes de Comp

AULA 6 • LógICA PARA PROgRAMAçãO

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

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.

INICIO

FIM

N ←1

N ←N+1

N <= 10

N MOD 2 = 0

SIM

SIM

NÃO

NÃO N

ALGORITMO testeENQUANTO;VAR N: inteiro;INICIO

N ← 1;ENQUANTO (N<=10) FAÇA

SE (N MOD 2 = 0) ENTAOIMPRIMA N;

FIM SEN ← N + 1;

FIM ENQUANTOFIM

Page 250: Básico Redes de Comp

AULA 6 • LógICA PARA PROgRAMAçãO

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

INICIO

FIM

N ←1

N ←N+1

N <= 10

N MOD 2 = 0

SIM

SIM

NÃONÃO

N

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-

Page 251: Básico Redes de Comp

AULA 6 • LógICA PARA PROgRAMAçãO

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

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.

INICIO

FIM

N ←1

N ←N+1

N <= 10

N MOD 2 = 0

SIM

SIM

NÃONÃO

N

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

ALGORITMO testePARA_FACA;VAR N: inteiro;INICIO

PARA N ← 1 ATÉ 10 FAÇASE (N MOD 2 = 0) ENTAO

IMPRIMA N;FIM SEN ← N + 1;

FIM PARAFIM

Page 252: Básico Redes de Comp

AULA 6 • LógICA PARA PROgRAMAçãO

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

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;VAR N: inteiro;INICIO

N ← 1;REPITA

SE (N MOD 2 = 0) ENTAOIMPRIMA N;

FIM SEN ← N + 1;

ATÉ (N > 10)FIM

INICIO

FIM

N ←1

N ←N+1

N <= 10

N MOD 2 = 0SIM

SIM

NÃO

NNÃO

Síntese da aulaNesta 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,

Page 253: Básico Redes de Comp

AULA 6 • LógICA PARA PROgRAMAçãO

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

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.

Atividades1. 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) ENTAOIMPRIMA N;

FIM SEN ← N - 1;

FIM ENQUANTOFIM

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

Page 254: Básico Redes de Comp

AULA 6 • LógICA PARA PROgRAMAçãO

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

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.

Page 255: Básico Redes de Comp

AULA 6 • LógICA PARA PROgRAMAçãO

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

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;

INICIOLEIA (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 PARAFIM

Page 256: Básico Redes de Comp

AULA 6 • LógICA PARA PROgRAMAçãO

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

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 ENQUANTOFIM

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

Page 257: Básico Redes de Comp

AULA 7 • LógICA PARA PROgRAMAçãO

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

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,

Aula 7Modularização

Page 258: Básico Redes de Comp

AULA 7 • LógICA PARA PROgRAMAçãO

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

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

Page 259: Básico Redes de Comp

AULA 7 • LógICA PARA PROgRAMAçãO

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

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

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

Page 260: Básico Redes de Comp

AULA 7 • LógICA PARA PROgRAMAçãO

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

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.

Page 261: Básico Redes de Comp

AULA 7 • LógICA PARA PROgRAMAçãO

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

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.

Page 262: Básico Redes de Comp

AULA 7 • LógICA PARA PROgRAMAçãO

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

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

INICIOLEIA (numero);SE E_PAR(numero) ENTAO

Page 263: Básico Redes de Comp

AULA 7 • LógICA PARA PROgRAMAçãO

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

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

Page 264: Básico Redes de Comp

AULA 7 • LógICA PARA PROgRAMAçãO

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

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 LERINTEIROVAR N: inteiro;LEIA (N);RETORNE (N);

FIM FUNCAOINICIO

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

Page 265: Básico Redes de Comp
Page 266: Básico Redes de Comp

Créd

itos

EQUIPE UNITINS

Organização de Conteúdos AcadêmicosLuiz Cezar Sakr

Coordenação EditorialMaria Lourdes F. G. Aires

Assessoria EditorialDarlene Teixeira Castro

Assessoria Produção Gráfica Katia Gomes da Silva

Revisão Didático-PedagógicaMarilda Piccolo

Revisão Lingüístico-TextualSibele Letícia Rodrigues de Oliveira Biazotto

Revisão DigitalSibele Letícia Rodrigues de Oliveira Biazotto

Projeto GráficoDouglas Donizeti SoaresIrenides TeixeiraKatia Gomes da Silva

IlustraçãoGeuvar S. de Oliveira

CapaIgor Flávio Souza

EQUIPE FAEL

Coordenação EditorialLeociléa Aparecida Vieira

Assessoria EditorialWilliam Marlos da Costa

RevisãoJuliana Camargo HorningLisiane Marcele dos Santos

Programação Visual e DiagramaçãoDenise Pires PierinKátia Cristina Oliveira dos SantosRodrigo SantosSandro NiemiczWilliam Marlos da Costa

Page 267: Básico Redes de Comp

Apr

esen

taçã

o

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

Page 268: Básico Redes de Comp

Plan

o de

Ens

ino

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

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•

Page 269: Básico Redes de Comp

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

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.

Page 270: Básico Redes de Comp
Page 271: Básico Redes de Comp

AULA 1 • MATEMÁTICA PARA COMPUTAçãO

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

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.

Aula 1Teoria dos Conjuntos

Page 272: Básico Redes de Comp

AULA 1 • MATEMÁTICA PARA COMPUTAçãO

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

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,

Page 273: Básico Redes de Comp

AULA 1 • MATEMÁTICA PARA COMPUTAçãO

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

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.

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.

Saiba mais

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}

Page 274: Básico Redes de Comp

AULA 1 • MATEMÁTICA PARA COMPUTAçãO

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

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 que ele admite é igual a 2n.

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.

Page 275: Básico Redes de Comp

AULA 1 • MATEMÁTICA PARA COMPUTAçãO

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

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}

1

5

4

2

1096 8

7

3

B C

A

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}

Page 276: Básico Redes de Comp

AULA 1 • MATEMÁTICA PARA COMPUTAçãO

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

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

B D

C

A

Page 277: Básico Redes de Comp

AULA 1 • MATEMÁTICA PARA COMPUTAçãO

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

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

2

9

3

1

10

8

76

4

5

B C

A

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

Page 278: Básico Redes de Comp

AULA 1 • MATEMÁTICA PARA COMPUTAçãO

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

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}

E

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

E

{ } { }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:

Page 279: Básico Redes de Comp

AULA 1 • MATEMÁTICA PARA COMPUTAçãO

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

{ } { } { }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∪ − =

E

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

E

{ } { } { } { }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∩ ∩ ∩ =

Page 280: Básico Redes de Comp

AULA 1 • MATEMÁTICA PARA COMPUTAçãO

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

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

9

3

1

10

8

6

5

B C

A

A ∪ C ∩ B =

9

3

6

B C

A

Page 281: Básico Redes de Comp

AULA 1 • MATEMÁTICA PARA COMPUTAçãO

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

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

9

B C

A

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

3

1

6

B C

A

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

9

76

4

B C

A

Page 282: Básico Redes de Comp

AULA 1 • MATEMÁTICA PARA COMPUTAçãO

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

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

10

8

B C

A

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

Page 283: Básico Redes de Comp

AULA 2 • MATEMÁTICA PARA COMPUTAçãO

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

ObjetivosEsperamos 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é-requisitosPara 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.

Aula 2Análise e Simbolização

de Proposições

Page 284: Básico Redes de Comp

AULA 2 • MATEMÁTICA PARA COMPUTAçãO

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

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

e) t: 1 13 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).

Page 285: Básico Redes de Comp

AULA 2 • MATEMÁTICA PARA COMPUTAçãO

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

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

Page 286: Básico Redes de Comp

AULA 2 • MATEMÁTICA PARA COMPUTAçãO

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

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 ∧ qV V VV F FF V FF F F

Exemplos:

a) p : 4 2= V

π

=q : sen 12

V

V (p, q) = p ∧ q V

b) r : 2 10 12+ = V

2s :10 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.

Page 287: Básico Redes de Comp

AULA 2 • MATEMÁTICA PARA COMPUTAçãO

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

p q p ou q ou p ∨ aV V VV F VF V VF F F

Exemplos:

a) p : 8 4= F

π

=q : sen 1,52

F

V (p, q) = p ∨ q F

b) r : 2 12 10− = − V 2s :10 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 → qV V VV F FF V VF F V

Exemplos:

a) 2p : (2 1) 9+ = V

4 4q :5 7

< F

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.

Page 288: Básico Redes de Comp

AULA 2 • MATEMÁTICA PARA COMPUTAçãO

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

p q p se, e somente se, q ou p ↔ qV V VV F FF V FF F V

Exemplos:

a) 2 2p : sen x cos x 1+ = V

=senx

q : tanxcos x

V

V (p, q) = p ↔ q V

b) 2r : log 8 3= V

9 3s :16 8

= F

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 ↔ qV V F F V V V VV F F V F V F FF V V F F V V FF F V V F F V V

Atividades

1. Entre as sentenças a seguir, identifique as proposições e escreva sua negação.

a) + = + +2 2 2p : (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.

Page 289: Básico Redes de Comp

AULA 2 • MATEMÁTICA PARA COMPUTAçãO

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

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.

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

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:

a) 2 2 2p' : (a b) a 2ab b+ ≠ + + ;

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

c) r': 90º ≠ π2

rad;

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;

Page 290: Básico Redes de Comp

AULA 2 • MATEMÁTICA PARA COMPUTAçãO

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

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

Page 291: Básico Redes de Comp

AULA 3 • MATEMÁTICA PARA COMPUTAçãO

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

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.

Aula 3Tabela-verdade

Page 292: Básico Redes de Comp

AULA 3 • MATEMÁTICA PARA COMPUTAçãO

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

Para conectivos dentro de vários parênteses, efetua-se primeiro as 1. expressões dentro dos parênteses mais internos.

Negação ( '2. ).

Conjunção ( 3. ∧ ) e disjunção ( ∨ ).

Condicional ( 4. → ).

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 FV F V V V F FF V F F V F VF F V V F V V

Page 293: Básico Redes de Comp

AULA 3 • MATEMÁTICA PARA COMPUTAçãO

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

Construir a Tabela-verdade da proposição P (p, q) = (p ∧ q')'

p q q' p ∧ q' (p ∧ q')'V V F F VV F V V FF V F F VF 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 VV F F F V F VF V V V F V VF 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 FV F F V V F FF V V V F F FF F V V V F F

Page 294: Básico Redes de Comp

AULA 3 • MATEMÁTICA PARA COMPUTAçãO

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

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.

Page 295: Básico Redes de Comp

AULA 3 • MATEMÁTICA PARA COMPUTAçãO

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

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

Page 296: Básico Redes de Comp

AULA 3 • MATEMÁTICA PARA COMPUTAçãO

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

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 VV F F V FF V V V FF 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 VV F F F VF V V V FF 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 FV F V F V VF V V F V VF 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 FV F F V V FF V V F V FF 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.

Page 297: Básico Redes de Comp

AULA 4 • MATEMÁTICA PARA COMPUTAçãO

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

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 VV FF VF F

Aula 4Relações de Implicação

e Equivalência

Page 298: Básico Redes de Comp

AULA 4 • MATEMÁTICA PARA COMPUTAçãO

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

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

Page 299: Básico Redes de Comp

AULA 4 • MATEMÁTICA PARA COMPUTAçãO

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

Tabela-verdade

p q p ∧ q p' q' p' ∨ q' (p' ∨ q')'

V V V F F F VV F F F V V FF V F V F V FF 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 VF V F

Leis idempotentes• : p ∨ p ⇔ p

p ∧ p ⇔ p

As Tabelas-verdade a seguir confirmam a equivalência.

p p ∨ p p ∧ pV V VF 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 ∧ pV V V V V VV F V V F FF V V V F FF F F F F F

Leis associativas• : p ∨ (q ∨ r) ⇔ (p ∨ q) ∨ r

p ∧ (q ∧ r) ⇔ (p ∧ q) ∧ r

Page 300: Básico Redes de Comp

AULA 4 • MATEMÁTICA PARA COMPUTAçãO

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

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 VV V F V V V VV F V V V V VV F F F V V VF V V V V V VF V F V V V VF F V V V F VF 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 VV V F F F V FV F V F F F FV F F F F F FF V V V F F FF V F F F F FF F V F F F FF 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.

Page 301: Básico Redes de Comp

AULA 4 • MATEMÁTICA PARA COMPUTAçãO

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

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.

Page 302: Básico Redes de Comp

AULA 4 • MATEMÁTICA PARA COMPUTAçãO

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

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

Page 303: Básico Redes de Comp

AULA 4 • MATEMÁTICA PARA COMPUTAçãO

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

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

Page 304: Básico Redes de Comp

AULA 4 • MATEMÁTICA PARA COMPUTAçãO

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

Page 305: Básico Redes de Comp

AULA 5 • MATEMÁTICA PARA COMPUTAçãO

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

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.

Aula 5Predicados e introdução

à Álgebra de Boole

Page 306: Básico Redes de Comp

AULA 5 • MATEMÁTICA PARA COMPUTAçãO

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

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

Page 307: Básico Redes de Comp

AULA 5 • MATEMÁTICA PARA COMPUTAçãO

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

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

Page 308: Básico Redes de Comp

AULA 5 • MATEMÁTICA PARA COMPUTAçãO

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

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.

Atividades1. 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 10 0 01 0 1

+ 0 10 0 11 1 1

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

Page 309: Básico Redes de Comp

AULA 5 • MATEMÁTICA PARA COMPUTAçãO

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

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 10 0 0 0 0a 0 a o ab 0 0 b b1 0 a b 1

+ 0 a b 10 0 a b 1a a a 1 1b b 1 b 11 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:

Comutativap q p ∨ q q ∨ p p ∧ q q ∧ pV V V V V VV F V V F FF V V V F FF F V V F F

Associativap q r q ∨ r p ∨ (q ∨ r) p ∨ q (p ∨ q) ∨ rV V V V V V VV V F V V V VV F V V V V VV F F F V V VF V V V V V VF V F V V V VF F V V V F VF F F F F F F

p q r q ∧ r p ∧ (q ∧ r) p ∧ q (p ∧ q) ∧ rV V V V V V VV V F F F V FV F V F F F FV F F F F F FF V V V F F FF V F F F F FF F V F F F FF F F F F F F

Page 310: Básico Redes de Comp

AULA 5 • MATEMÁTICA PARA COMPUTAçãO

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

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

Page 311: Básico Redes de Comp

AULA 5 • MATEMÁTICA PARA COMPUTAçãO

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

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.

Page 312: Básico Redes de Comp

AULA 5 • MATEMÁTICA PARA COMPUTAçãO

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

Anotações

Page 313: Básico Redes de Comp

AULA 6 • MATEMÁTICA PARA COMPUTAçãO

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

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-cação ƒ de Bn em B, satisfazendo as seguintes regras:

se para quaisquer valores de x• 1, ..., xn, ƒ(x1, ..., xn) = a, a ∈ B, então ƒ é uma função booleana. É a função constante;

se para quaisquer valores de x• 1, ..., xn , ƒ(x1, ..., xn) = xi para qualquer i(i = 1, ..., n), então ƒ é uma função booleana. É a função projeção;

Aula 6Funções Booleanas

Page 314: Básico Redes de Comp

AULA 6 • MATEMÁTICA PARA COMPUTAçãO

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

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

Page 315: Básico Redes de Comp

AULA 6 • MATEMÁTICA PARA COMPUTAçãO

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

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'aa'1 a

Page 316: Básico Redes de Comp

AULA 6 • MATEMÁTICA PARA COMPUTAçãO

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

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

Page 317: Básico Redes de Comp

AULA 7 • MATEMÁTICA PARA COMPUTAçãO

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

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çãoMinimizar 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:

Aula 7Simplificações de Funções

e Mapas de Karnaugh

Teorema 1: (a')' = aTeorema 2: ab + ab' = aTeorema 3: 0'=1 e 1'=0Teorema 4: (a ∙ b)' = a' + b' e (a + b)' = a' ∙ b' (Teorema de Morgan)Teorema 5: ab + a'c + bc = ab + a'cTeorema 6: (a + b)(a' + c)(b + c) = ac + a'bTeorema 7: (a + b)(a' + c) = ac + a'b

Page 318: Básico Redes de Comp

AULA 7 • MATEMÁTICA PARA COMPUTAçãO

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

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 1a 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 10 00 101 01 11

No caso de três ou mais variáveis, o procedimento é similar.

0 100 000 10001 001 10111 011 11110 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.

Page 319: Básico Redes de Comp

AULA 7 • MATEMÁTICA PARA COMPUTAçãO

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

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 100 101 111 110 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 1000 1 101 y = c 1 111 1 110

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 10001 1 111 1 110

Page 320: Básico Redes de Comp

AULA 7 • MATEMÁTICA PARA COMPUTAçãO

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

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