Básico Redes de Comp
Short Description
Redes de Computadores...
Description
Ficha Catalográfica elaborada pela UNITINS. Bibliotecária – Rozangela Martins da Silva CRB2/1019
Fundação Universidade do Tocantins (UNITINS) F981p Análise e Desenvolvimento de Sistemas / Fundação Universidade do Tocantins; EADCON. Palmas: Editora Educon, 2008. 320 p.: il. Nota: Caderno de Conteúdo e Atividades 1º período de Análise e Desenvolvimento de Sistemas (apostila) 1. Analista de Sistemas – Formação. I. EADCON. II. Título. CDD 378 22. ed. Direitos desta edição reservados à UNITINS. É proibida a reprodução total ou parcial desta obra sem autorização expressa da UNITINS.
FUNDAÇÃO UNIVERSIDADE DO TOCANTINS Reitor Humberto Luiz Falcão Coelho Vice-Reitor Lívio William Reis de Carvalho Pró-Reitor de Graduação Galileu Marcos Guarenghi Pró-Reitor de Pós-Graduação e Extensão Claudemir Andreaci Pró-Reitora de Pesquisa Antônia Custódia Pedreira Pró-Reitora de Administração e Finanças Maria Valdênia Rodrigues Noleto Diretor de EaD e Tecnologias Educacionais Marcelo Liberato Coordenador Pedagógico Geraldo da Silva Gomes Coordenador do Curso Igor Yepes
Sumário Computação Básica.........................................................................................5 Aula 1 – História da computação............................................................................. 11 Aula 2 – Componentes básicos do computador.......................................................... 27 Aula 3 – Sistemas posicionais de numeração............................................................. 37 Aula 4 – Operações aritméticas no sistema binário de numeração............................... 53 Aula 5 – Classificação de software........................................................................... 63 Aula 6 – Noções básicas de redes de computadores e banco de dados....................... 71 Aula 7 – Profissões na área de Informática................................................................ 79 Algorítmos e Programação...........................................................................93 Aula 1 – Introdução à programação em Linguagem C................................................ 99 Aula 2 – Operadores............................................................................................ 115 Aula 3 – Estruturas de controle............................................................................... 125 Aula 4 – Modularização em C: uso de Funções....................................................... 137 Aula 5 – Estruturas de dados homogêneas (vetores e matrizes) e heterogêneas (estruturas).......................................................................... 147 Aula 6 – Ponteiros e alocação dinâmica.................................................................. 157 Aula 7 – Arquivos................................................................................................. 163 Lógica de Programação...............................................................................175 Aula 1 – Fundamentos da Lógica para Programação................................................ 181 Aula 2 – Formas de representação de um algoritmo................................................. 193 Aula 3 – Tipos de dados: variáveis e constantes....................................................... 211 Aula 4 – Operadores e expressões......................................................................... 223
Aula 5 – Arquivos................................................................................................. 233 Aula 6 – Estruturas de controle............................................................................... 243 Aula 7 – Modularização....................................................................................... 257 Matemática para Computação....................................................................265 Aula 1 – Teoria dos Conjuntos................................................................................ 271 Aula 2 – Análise e Simbolização de Proposições..................................................... 283 Aula 3 – Tabela-verdade........................................................................................ 291 Aula 4 – Relações de Implicação e Equivalência...................................................... 297 Aula 5 – Predicados e introdução à Álgebra de Boole.............................................. 305 Aula 6 – Funções Booleanas.................................................................................. 313 Aula 7 – Simplificações de Funções e Mapas de Karnaugh....................................... 317
EQUIPE UNITINS Organização de Conteúdos Acadêmicos Alexandre T. Rossini Alex Coelho Evanderson S. de Almeida Marcelo Ribeiro de Oliveira Vinícius de Miranda Rios Coordenação Editorial Maria Lourdes F. G. Aires Assessoria Editorial Darlene Teixeira Castro Assessoria Produção Gráfica Katia Gomes da Silva Revisão Didático-Pedagógica Sibele Letícia Rodrigues de Oliveira Biazotto Revisão Lingüístico-Textual Sibele Letícia Rodrigues de Oliveira Biazotto Revisão Digital Sibele Letícia Rodrigues de Oliveira Biazotto Projeto Gráfico Douglas Donizeti Soares Irenides Teixeira Katia Gomes da Silva Ilustração Geuvar S. de Oliveira
Créditos
Capa Igor Flávio Souza equipe Fael Coordenação Editorial Leociléa Aparecida Vieira Assessoria Editorial William Marlos da Costa Revisão Juliana Camargo Horning Lisiane Marcele dos Santos Programação Visual e Diagramação Denise Pires Pierin Kátia Cristina Oliveira dos Santos Rodrigo Santos Sandro Niemicz William Marlos da Costa
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 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
Apresentação
de dados.
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 numeração. Classificação de software. Noções básicas de redes de computadores
Plano de Ensino
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
BIBLIOGRAFIA ALMEIDA, Marcus Garcia de. Fundamentos de informática. 2. ed. Rio de Janeiro: Brasport, 2002. BROOKSHEAR, J. Glenn. Ciência da computação: uma visão abrangente. 7. ed. Porto Alegre: Bookman, 2004. MARÇULA, Marcelo; BENINI FILHO, Pio Armando. Informática: conceitos e aplicações. São Paulo: Érica, 2005. POLLONI. Enrico G. F.; FEDELI, Ricardo Daniel; PERES, Fernando Eduardo. Introdução à Ciência da Computação. São Paulo: Thomson, 2003. VELLOSO, Fernando de Castro. Informática: conceitos básicos. 7. ed. Rio de Janeiro: Campus, 2004.
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO
9
Aula 1 • Computação Básica
Aula 1 História da computação Objetivos Esperamos que, ao final desta aula, você seja capaz de: • visualizar o panorama da evolução dos computadores, composto por descobertas da ciência e invenções de cientistas em diversos momentos da história; • compreender a atual realidade em que a tecnologia de produção de computadores se encontra.
Pré-requisitos Como esta aula é a primeira de uma série e esta disciplina é a encarregada 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 tecnologia 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 computacionais conhecidos e, até mesmo, as emergentes facetas que a comunidade científica da computação venha a apresentar.
Introdução Você visualizará, nesta primeira aula, a linha do tempo da evolução dos computadores, seus cientistas e povos que contribuíram para sua formação. Vale a pena lembrar que tal linha não será vista exaustivamente, uma vez que é inviável discorrer sobre milhares de inventos e povos que contribuíram de alguma forma para tal evolução, mas, sim, sobre aqueles que serviram de
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO
11
Aula 1 • Computação Básica
marco nesta caminhada tecnológica. Antes disso, porém, você compreenderá algo sobre o que venha a ser um dado e uma informação, além de diferenciar dados analógicos de dados digitais.
1.1 Dados O ser humano sempre processou dados. Desde o momento em que um cidadão antigo coletava pedras para representar a quantidade de ovelhas de seu rebanho, ou escrevia nas paredes das cavernas, em cartões perfurados para controlar o posicionamento e o movimento de agulhas do tear, ou até o tempo em que grandes transações bancárias são efetuadas entre duas mega empresas situadas em continentes distintos, deparamo-nos com a definição de dados.
1.2 O que é dado e o que é informação? Dados são pequenas unidades de informação que, ao serem aplicadas em determinada direção, resultam em unidade de informação maior, de alguma utilidade mais apreciada, ou melhor, a informação em si. Por exemplo, se unirmos o dados “R”, “$” aos dados “1,50”, teremos a informação R$ 1,50. Repare que os dados não parecem ter muito sentido para nós, porém o valor R$ 1,50 já significa algo muito interessante. Da mesma forma, o R$ 1,50 pode ser considerado um dado, se comparado a uma lista de receitas e despesas em uma planilha de orçamento doméstico, 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 é proveniente dos sumérios. As pinturas rupestres (observadas nas cavernas, nos períodos em que se acredita que sejam dos primórdios da humanidade), o uso do ábaco (uma máquina antiga de calcular, contemporânea ao alfabeto, ambos criados na região do mediterrâneo) e de outros aparelhos ao longo da história, até alcançar a tecnologia dos dias atuais, envolvendo micro, mini e super computadores, mostram que o armazenamento de dados e seu processamento
12
1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Aula 1 • Computação Básica
sempre foram uma forma especial, usada pela humanidade, para exercer controle do meio à sua volta.
1.4 Dados analógicos e digitais Antes de prosseguirmos no tour pela linha do tempo da evolução dos computadores, 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 representado 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 determinada 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 circunferê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 circunferência estaríamos percorrendo em determinada fração de tempo. Inclusive, se assim o fizéssemos, chegaríamos a um valor tão pequeno que não teríamos uma nomenclatura oficial para definirmos tão pequenos intervalos. Porém o fato é que eles existem e são divididos em infinitas partes.
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO
13
Aula 1 • Computação Básica
1.4.2 Dados digitais Quando olhamos o ponteiro dos segundos se movendo, por causa de nossa capacidade humana limitada de capturar movimentos com clareza até, no máximo, na casa dos centésimos de segundos, temos a impressão de que o ponteiro se tele-transporta de seis em seis unidades de circunferência a cada segundo. Porém, se filmarmos tal ponteiro em movimento e depois assistirmos ao vídeo em câmera lenta, o que visualizaremos será justamente algo parecido com o que vemos no ponteiro dos minutos ou das horas sem câmera lenta. Os dados analógicos, por serem infinitos, chegam a atrapalhar os estudos dos cientistas que, para possibilitarem a execução prática de suas teorias, precisam discretizar, isto é, limitar a aplicação de um dado analógico infinito para um conjunto de estados finitos. Retornando ao assunto do ponteiro dos segundos, o cientista poderá, para tornar viável a aplicação de sua teoria, considerar que o ponteiro realmente se tele-transporta de seis em seis unidades de circunferência a cada segundo para, então, projetar o relógio digital, com o desenho de um ponteiro no visor do relógio, que realmente aparece em pontos distantes de seis em seis unidades a cada segundo. Verifica-se, então, que uma informação analógica poderá ser infinitamente mais rica que uma informação digital e, ao mesmo tempo, toda a infinidade de riqueza que possui poderá ser desprezada sem prejuízo para a solução concreta que foi alcançada, como é o caso do relógio digital. Basta, para ele, possuir 60 dígitos que a circunferência já estará modelada, ignorando-se os infinitos pontos entre cada um dos 60 pontos requeridos. Afinal, o que concluir sobre dados analógicos e digitais? Conclua que uma informação ou dado digital (referente a dígito), embora limitada, é capaz de possuir toda a precisão necessária para que um objetivo seja alcançado (e a prova disso são os computadores que usamos na atualidade, 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 limitação poderá ser grande o suficiente para representar, sem perdas significativas (até mesmo imperceptíveis ao ser humano), um modelo real, por exemplo, as fotos, vídeos e músicas armazenadas e reproduzidas por computador. Um exemplo de armazenamento digital sem perdas são os textos digitais.
14
1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Aula 1 • Computação Básica
Após essas constatações, veremos a evolução da tecnologia computacional 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, verifica-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, principalmente em países orientais. 1614 – Logaritmos são definidos por John Napier, nascido na Escócia. 1623 – Wilhelm Schickard cria a primeira máquina de calcular, de acordo com os historiadores, pois, infelizmente, ela desapareceu durante a guerra dos trinta anos. Ela realizava operações de divisão e multiplicação e tinha uma estrutura mecânica baseada em rodas dentadas.
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO
15
Aula 1 • Computação Básica
1644 – Blaise Pascal (1623-1662) (inclusive, Pascal é o nome de uma linguagem de programação muito conhecida, batizada assim em homenagem a esse cientista) constrói o que a história entende como a primeira calculadora, batizada por ele de Pascalene, ou Pascalina. Ele a criou para auxiliar seu pai (preparação de impostos). Tal máquina também usava uma roda dentada contendo justamente dez dentes, um para cada algarismo decimal (ou dígito decimal! Uma máquina digital!). A pascalina realizada subtrações e somas. 1673 – Gottfried Wilhelm Leibnitz (1646-1716), matemático e filósofo, melhorou o projeto da Pascalina, construindo, assim, uma máquina capaz de dividir, multiplicar, subtrair, somar e calcular a raiz quadrada. Os historiadores confirmam seu pensamento: “ele sonhava que um dia todo o raciocínio pudesse ser substituído pelo girar de uma alavanca”. 1801 – Joseph Marie Jacquard (1752-1834) foi um mecânico nascido na frança que criou uma máquina mecânica de tear (a primeira máquina programável, controlada por cartões perfurados, tamanho grande) capaz de criar bonitos desenhos enredados no próprio tecido. Sua invenção fez muito sucesso na França e, em sete anos, milhares de máquinas de tear já estavam em operação no país. Até aqui, podemos dizer que chegamos ao fim da era mecânica. Veja como ela trouxe a base sem a qual não teríamos chegado onde estamos hoje, e as malhas de nossas roupas não poderiam ter lindos e detalhados enfeites intrínsecos e costurados. Vamos prosseguir para verificar como as máquinas e descobertas daquela era influenciaram na continuidade desse processo evolutivo.
1.7 A era dos dígitos No decorrer do processo, logo vemos a necessidade de utilizar computadores para realizar atividades repetitivas e rotineiras, principalmente cálculos de precisão diferencial. No século XIX, vemos por, exemplo, que as invenções de Charles Babbage expandem a visão do tamanho do potencial computacional para a humanidade. Prossigamos em nossa caminhada... 1820 – Charles Babbage (1792-1871), matemático nascido na Inglaterra, projeta a máquina analítica, uma máquina diferencial calculadora de polinômios. Essa máquina calcularia automaticamente, além de somas e subtrações e outros cálculos básicos, a conversão de números de uma base para outra (da base binária para a decimal, por exemplo). Babbage ficou conhecido com o
16
1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Aula 1 • Computação Básica
Pai do computador, uma vez que seu invento muito se aproximava do conceito de computador que temos na atualidade. Tal máquina, que fora financiada por algum tempo pelo governo britânico, era puramente mecânica, sendo composta por um engenho central (olha só, uma CPU!), uma memória, engrenagens e alavancas. Utilizava cartões perfurados 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, funcionavam 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 informações para que a leitora de cartões retornasse para outro cartão anterior, concretizando-se assim o efeito de repetição de uma seqüência de instruções. Ada também imaginava as vantagens, caso pudesse trabalhar com os desvios condicionais (if). 1854 – George Boole (1815-1864) publicou as bases da lógica booleana (Booleana em homenagem ao próprio cientista). Tais bases determinam que equações matemáticas algébricas podem expressar os conceitos da lógica, em que variáveis (unidades de memória que armazenam valores) assumiriam os valores 0 e 1 (ex.: verdadeiro ou falso). Graças a essa contribuição de George Boole, os cientistas puderam pensar em um computador que fosse utilizável para qualquer fim.
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO
17
Aula 1 • Computação Básica
1.8 Máquinas de computar 1889 – As idéias de Charles Babbage são mescladas às práticas com cartões perfurados por um estatístico americano preocupado com a demora na contagem da população. Até então, a contagem completa da população norteamericana 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 populacional 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 anteriormente, 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 tecnologia de entrada e saída via cartões perfurados e da válvula expõe minuciosamente uma máquina computacional de propósito múltiplo. Essa iniciativa foi a pioneira no sentido de alguém, o próprio usuário (ou seja, não vem definido de fábrica), poder decidir que cálculos ou operações a máquina irá realizar. A consciência com o conceito de programação que temos hoje não é mera coincidência.
1.9 Primeira geração de computadores – Válvula (1945-1955) De acordo com o progresso da história, é possível agrupar quatro diferentes gerações, notadas sempre por um marco, um evento revolucionário que permitia à tecnologia saltar consideravelmente em direção a um estado mais evoluído. 1946 – John Presper Eckert (1919-1995) e John Mauchly (1907-1980), ambos engenheiros, projetaram o Eletronic Numeric Integrator And Calculator (ENIAC). Ele possuía 18.000 válvulas, 1.500 relés, pesava 30 toneladas e consumia 140Kw de energia (ocupava o tamanho de um prédio pequeno, com 90m2, e conseguia realizar 500 operações de multiplicação por segundo, ou 5.000
18
1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Aula 1 • Computação Básica
somas, no mesmo período de tempo). O ENIAC foi projetado para fins bélicos (iniciou no apogeu da Segunda Guerra Mundial) porém somente após vários meses o término da guerra, em 1946, esse teve sua construção concluída. O ENIAC dispunha, para sua programação, de 6.000 interruptores de ajuste e uma imensa quantidade de soquetes. Tanenbaum (2007) compara: “Uma verdadeira floresta de cabos e jumpers”. Programar em painéis elétricos realmente era difícil, lento, tedioso e mecânico. A partir dessas dificuldades, John Von Neumann propôs um modelo conhecido como Máquina de Von Neumann. Esse modelo é composto por cinco partes básicas: uma unidade de controle, uma memória de trabalho (armazena 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 processamentos 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 (popularmente representado pelo Microsoft Windows ou GNU/Linux).
1.11 Terceira geração de computadores – circuitos integrados (1965–1980) O circuito integrado foi inventado em 1958 por Robert Noyce. Dessa vez, o tal circuito integrado não é um substituto do transistor, mas sim um conglo-
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO
19
Aula 1 • Computação Básica
merado de transistores. Mais especificamente, nessa geração, dezenas, e até centenas deles, em um pequeno espaço (o chip) de silício. Nessa fase, verifica-se o famoso fenômeno da miniaturização dos computadores: 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, multiplicaçã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 universidades, pelo departamento de defesa dos Estados Unidos. A Arpanet é a precursora da WWW – Rede mundial de computadores ou, simplesmente, a Internet. 1970 – O Sistema operacional (SO) UNIX (curiosidade: o conhecido GNU/ Linux de hoje é um UNIX) é desenvolvido por Ken Thompson e Dennis Ritchie. O UNIX foi o primeiro SO portável (sistema que pode funcionar em diferentes tipos de computadores) a ser desenvolvido. A partir dessa parte da história, você irá notar (se já não tiver notado) que convive com boa parte da tecnologia. Estamos nos aproximando da geração atual com a qual convivemos.
1.12 Quarta geração de computadores – integração em escala muito grande (1973, 1980-?) Na terceira geração, notamos centenas de transistores em um único chip. Agora, na quarta geração, os cientistas obtiveram dezenas de milhares, centenas de milhares e milhões de transistores em um único chip (Very Large Scale Integration (VLSI) – integração em escala muito alta) ou seja, ainda, de um CI, porém, em um nível de miniaturização muitíssimo elevado. A essa altura da evolução, é sensato que o chip tenha mudado de nome: Microchip.
20
1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Aula 1 • Computação Básica
Se o Microchip é o marco dessa geração, logo os computadores construídos com tais são os microcomputadores. Dessa vez, as máquinas alcançaram tamanhos muito menores, evoluindo de geladeiras a cadernos (isso mesmo, traduzindo, notebooks), e indo a um tamanho ainda menor. 1973 – O termo PC (personal computer) e CP (computador pessoal) é utilizado pioneiramente quando a Xerox lança um computador batizado como Alto, com fins de uso pessoal. Repare nas características desse CP: compatí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 respectivamente pelas empresas Apple, Atari e Commodore. O Apple 2 foi consagrado como o primeiro sucesso de mercado na área de computação pessoal. 1980 – O primeiro computador portátil, um avô para o notebook Osborne-1 com seus 11 quilos, surge no mercado. Um ano depois do Osborne-1, a Compaq se estabelece como empresa líder no mercado de portáteis, lançado sua cópia clonada, portátil, do IBM-PC. A arquitetura, Reduced Instruction Set (RISC) – conjunto reduzido de instruções, começa a ser aceita no lugar de dificultosas arquiteturas (CISC). Abordagens maiores sobre RISC e CISC serão vistas na próxima aula. 1981 – O IBM-PC é lançado pela IBM, com o processador Intel 8088 e o SO MS-DOS, feito pela Microsoft. Esse CP surge com desempenho (velocidade e memória) muito superior ao dos concorrentes. Você provavelmente possui um PC em sua casa ou local de trabalho ou estudo. Ele é um sucesso que permanece até os dias de hoje. A arquitetura IBM PC foi aberta ao público pela própria empresa. O resultado disso foi a perda de Mercado pela IBM (ruim para a IBM) e a popularização do padrão IBM para o mercado (bom para o mundo, para nós, usuários). É notável a popularidade do padrão IBM (aberto) quando comparamos, por exemplo, à popularidade do Apple (padrão fechado, proprietário). Quem lucrou mesmo com essa história foi a Microsoft,
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO
21
Aula 1 • Computação Básica
uma vez que, para cada computador vendido, mesmo de arquitetura aberta, era quase que provável que uma licença de uso do MS-DOS seria vendida para uso juntamente com a máquina. 1992 – O computador Alpha, revolucionário, de 64 bits, é lançado pela DEC. Um computador RISC, cuja velocidade ultrapassava e posicionava-se muito mais à frente da velocidade de qualquer outro computador pessoal da época. A história registra o intervalo de tempo de dez anos para que os computadores 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 miniaturização continua a ocorrer) ao ponto de não serem notados pelo ser humano: a geração do computador invisível. 1993 – A Apple lança o computador Newton. Esse marcou o momento por mostrar que os computadores poderiam ser feitos em invólucros menores do que uma fita cassete portátil. Recebia entrada de dados dos usuários a partir de uma caneta, assemelhando-se aos conhecidos e populares Personal Digital Assistants (PDAs) – agendas eletrônicas, por exemplo, o Palm Tungsten ou Pocket PCs. Embora os PDAs sejam realmente menores, até mesmo que os Notebooks, não são eles quem descrevem a característica dessa nova geração, mas sim os computadores realmente invisíveis como aqueles embutidos dentro de automóveis, aviões, fornos microondas, máquinas de lavar, vídeo games, etc. Como se pode notar, os computadores invisíveis estão em toda a parte e, se você, leitor, estiver na cidade e olhar à sua volta, provavelmente constatará (mesmo não podendo ver) a presença de algum computador, microchip ou
22
1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Aula 1 • Computação Básica
controlador eletrônico em um raio de 15 a 100 metros. Como Tanenbaum afirma: “Eles serão parte da estrutura da vida diária, abrindo portas, acendendo 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 compreender 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 computaçã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 tecnologia vigente.
Atividades 1. Como diferenciar dado de informação? 2. Cite cinco formas variadas de se armazenar dados. 3. Você vê alguma vantagem do relógio digital sobre o analógico (considere apenas a funcionalidade de relógio)? 4. Qual o nome da máquina criada por Blaise Pascal? 5. Qual o nome da máquina criada por Charles Babbage? 6. Por que Babbage ficou conhecido com o Pai do Computador? 7. Cite as quatro palavras-chave das quatro gerações de computadores. Por que devemos nos lembrar delas? 8. Qual a relação da válvula com a álgebra booleana? 9. Descreva a razão de ser do fenômeno de miniaturização. 10. O que são computadores invisíveis?
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO
23
Aula 1 • Computação Básica
Comentário das atividades Os objetivos desta aula foram introdutórios aos estudos sobre Tecnologia da Informação, bem como históricos, a fim de situar o aluno quanto ao nível de evolução que alcançamos. As atividades 1, 2 e 3 mensuram a captação da parte introdutória deste assunto, abordando conceitos de dados, informação, e naturezas analógica e digital. As atividades 4, 5, 6 e 7 mensuram a absorção do conteúdo histórico exposto. As atividades 8, 9 e 10 verificam a capacidade de o aluno de raciocinar sobre os conceitos explanados, bem como “palpitar” sobre as tendências de futuro tecnológico. Na atividade 1, dado pode ser diferenciado de informação quando determinada 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 computadores 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 suficiente para realizar quaisquer cálculos baseados em álgebra booleana.
24
1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Aula 1 • Computação Básica
Na atividade 9, a miniaturização foi uma conseqüência natural obtida conforme as gerações vão se estabelecendo. Cada geração é definida por componentes elétricos cada vez menores. Diminuindo-se os componentes, logo diminuem-se o tamanho dos computadores compostos pelos mesmos. Na atividade 10, computadores invisíveis são uma nomenclatura sugerida para todo objeto de uso humano que contenha, dentro de si (embutidos), microprocessadores ou microcontroladores. Essa realidade nos coloca dentro de um mundo em que estamos cercados de utensílios computadorizados, muitos deles usados por nós tão automaticamente que, por muitas vezes, não atentamos que estamos interagindo com um computador, daí o fenômeno da invisibilidade do computador.
Referências MARÇULA, Marcelo; BENINI FILHO, Pio Armando. Informática: conceitos e aplicações. São Paulo: Érica, 2005. TANENBAUM, Andrew S. Organização estruturada de computadores. São Paulo: Prentice Hall, 2007.
Na próxima aula Agora que você já visualizou a linha do tempo da evolução dos computadores, na próxima aula, você irá estudar sobre a estrutura física (hardware) básica dos computadores da atualidade. Conhecer as facetas internas dos computadores modernos lhe dará maior embasamento e autoridade tanto para discutir sobre os mesmos quanto para desenvolver programas que sejam executados nessas plataformas.
Anotações
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO
25
Aula 1 • Computação Básica
26
1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Aula 2 • Computação Básica
Aula 2 Componentes básicos do computador Objetivos Esperamos que, ao final desta aula, você seja capaz de: • conhecer os principais componentes formadores do computador moderno; • compreender, conceitualmente, o modo de execução de instruções de um computador.
Pré-requisitos Chegamos à segunda aula, que abordará um tema conceitual, porém não menos importante para o curso, que recomenda fortemente o estudo da aula anterior. 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 importantes conceitos é condição necessária para que você possa ter o melhor proveito desta e de outras aulas de nossa disciplina e, conseqüentemente, do curso.
Introdução Você conhecerá, nesta segunda aula, os componentes internos e externos que formam o computador contemporâneo de nossa época. Veremos como esses componentes se relacionam entre si para que o conceito de computador se torne uma realidade prática e, portanto, útil para a resolução de problemas.
2.1 Componentes do computador O computador, relembrando a máquina Von Neumann, é composto por: CPU (nesse caso, representada pela unidade lógica aritmética e pela unidade de controle), memória e unidades de entrada e saída.
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO
27
Aula 2 • Computação Básica
Andrew Tanenbaum (2007) define que “um computador digital consiste em um sistema interconectado de processadores, memórias e dispositivos de entrada/saída”. Atualmente, os computadores seguem esse mesmo princípio de composiçã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-processados, 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 comunica-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 estiverem sendo executados. Um exemplo didático de uso da memória seria, por exemplo, os seis passos descritos a seguir.
28
1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Aula 2 • Computação Básica
1. Processador insere o número um na posição de memória 002. 2. Processador insere o número dois na posição de memória 003. 3. Processador lê o número contido na posição de memória 002. 4. Processador lê o número contido na posição de memória 003. 5. Processador soma os números lidos e armazena o resultado na posição de memória 101. 6. Processador insere o número três na posição de memória 003. Você é capaz de dizer qual o resultado da soma armazenado na posição de memória 101? Se você respondeu três, acertou. Uma possível resposta, porém, errada, seria cinco. Está errada uma vez que, embora o processador tenha alterado o conteúdo na posição 003 de dois para três, isso em nada influenciou o conteúdo da posição 101. A Memória Principal (RAM) não processa nada. Ela é um repositório de dados, acessada pelo processador. Ela também é volátil, ou seja, se você desligar o computador, todos os dados contidos nela irão se perder. A propósito, a memória que não se perde, em que os documentos que digitamos ficam armazenados, é de outra natureza. Documentos de textos e planilhas, sistema operacional e outros dados persistentes ficam armazenados em dispositivos de memória de massa, por exemplo, os discos rígidos, conhecidos também como memória secundária. Estudemos, agora, o processador, que tem como função a comunicação, por meio da via de comunicação fornecida pela placa mãe, com a memória principal.
2.3 A Unidade Central de Processamento – UCP A Unidade Central de Processamento é a principal parte do computador. Você pode referir-se a ela como CPU (Central Processing Unit), UCP (Unidade Central de Processamento) ou, simplesmente, processador. Um computador poderá até sobreviver, conceitualmente, sem memória ou mesmo sem uma placa mãe, mas, se não possuir um processador, não pode ser nem considerado como um computador propriamente dito: talvez seja outro equipamento como um pen-drive, mas nunca um computador. O termo computador nos lembra do verbo computar, que quer dizer calcular ou, mais especificamente, executar cálculos e operações próprias de um computador. Ora,
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO
29
Aula 2 • Computação Básica
se um computador é aquilo que realiza cálculos, logo, presumimos que ele precisará ter uma espécie de cérebro eletrônico, ou uma cabeça eletrônica que possa pensar ao menos o suficiente para resolver os cálculos para os quais o mesmo foi designado para realizar. A CPU age, então, como o cérebro do computador, tendo a função de obter dados ou instruções de algum lugar que, no caso de um computador, é a memória de trabalho (será vista em seguida, ainda nesta aula), verificar estas instruções e depois executá-las, uma após a outra. Vamos desmistificar o processador aqui: ele não é um elemento mágico que busca as informações e as processa de forma desconhecida. No parágrafo anterior, 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 desempenham 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 principal. 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 detalhes na disciplina Lógica de Programação) com a finalidade de se executar as instruções (o programa).
30
1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Aula 2 • Computação Básica
2.3.3 Registradores Os Registradores são pequenas memórias que servem para auxiliar o processador, armazenando resultados temporários, durante o processo de cálculo. Pense que o processador teria de se esforçar muito mais para realizar operações sem esses registradores internos, pois, se assim fosse, teria de utilizar a memória principal, que está mais longe, externa ao processador. Existem registradores com funções genéricas e específicas que são muito mais rápidos do que aqueles, porém são preparados para responder a apenas um tipo fixo de operação, enquanto os genéricos, diversas, tal qual a memória principal. Os registradores são memórias internas para uso geral, usados pela ULA para armazenar dados (caracteres, números binários) que estão sendo processados. Exemplo de registradores gerais: AX, BX, usados para armazenar números binários. Exemplo de registrador específico: IP, Instruction Pointer, armazena a referência do endereço da memória principal (RAM) que contém a próxima instrução a ser executada.
2.4 Executando-se uma instrução A Memória principal armazena dados que serão buscados pela UC (unidade de controle) da CPU e adicionados nesses registradores. Em seguida, a ULA realiza operações sobre os dados que estão nos registradores, também armazenando o resultado das operações neles. Por fim, UC copia o valor dos registradores para dentro de um endereço (posição) de memória principal. A enumeração a seguir representa uma seqüência de pequenas fases que são reproduzidas para cada instrução que a CPU executa. A mesma tem uma denominação comum de ciclo buscar-decodificar-executar. 1. Transportar a instrução seguinte da memória principal para o registrador. 2. Modificar o ponteiro de instrução (IP) indicando a próxima instrução. 3. Estabelecer qual o tipo da instrução transportada. 4. Caso a instrução utilize uma seqüência de dados na memória principal, estabelecer onde está seqüência de dados se encontra. 5. Transportar a seqüência de dados, se necessário, para algum registrador da UCP. 6. Executar a instrução. 7. Retorno à fase 1 (isso fará com que se execute a próxima instrução, contida no registrador IP, alterado pela etapa 2).
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO
31
Aula 2 • Computação Básica
2.5 RISC versus CISC Ao longo a história, a Apple projetou seu processador e acabou competindo 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 processadores 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 desenvolvedores. 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 compatibilidade coloca a Intel em posição comercial privilegiada, uma vez que os progra-
32
1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Aula 2 • Computação Básica
madores de sistemas e aplicativos terão menos trabalho: codificarão uma só vez e verão o seu programa funcionar em várias versões futuras da Intel. Chegamos ao fim de nossa segunda aula. Agora você está ciente de importantes informações que nortearão de maneira significativa as decisões que você tomará em relação à programação e demais relacionamentos associados ao computador. Repare, também, o quanto a primeira aula apresentou aspectos fundamentais 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 fundamentada. Leve para sempre, em sua mente, esses conceitos aqui expostos, pois você irá usá-los como, no mínimo, pano de fundo para o desenvolvimento de aplicações, preparação de conteúdos, ministração de palestras e seminários e os estudos da maioria das disciplinas que serão vistas neste curso e que sejam relacionadas ao computador moderno.
Síntese da aula Nesta segunda aula, você conheceu os componentes fundamentais do computador moderno e aprendeu detalhes conceituais sobre os mesmos, além de entender diferenças entre arquiteturas de processadores e o modo como um computador executa instruções.
Atividades 1. Cites os três componentes principais de um computador moderno. 2. Associe um verbo chave para cada um dos componentes que você citou na primeira questão. 3. Cites os componentes que compõem a CPU. 4. Descreva as funções da ULA. 5. Qual o papel da UC? 6. O que é RAM e qual a sua função? 7. Qual a diferença entre os registradores da CPU e a memória principal (RAM)? 8. Qual a função do IP (Instruction Pointer) no processo de se executar uma instrução? 9. Explique a frase: “Para o RISC, quanto menor, melhor”. 10. Se o RISC é mais rápido que o CISC, qual o motivo da Intel, típica fabricante de processadores CISC, ser líder de mercado?
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO
33
Aula 2 • Computação Básica
Comentário das atividades Os objetivos desta aula foram pertinentes aos estudos introdutórios sobre os modernos computadores da atualidade, mais especificamente, sobre aqueles mais utilizados pela maioria da população mundial, inclusive, de arquitetura já previamente anunciada ou descrita por grandes ícones da informática atuantes em momentos históricos passados. As atividades de 1 a 10 mensuram o aprendizado sobre os principais componentes formadores dos computadores modernos. Na atividade 1, os três componentes que formam o computador moderno são CPU, Memória Principal e Placa Mãe. Na atividade 2, o verbo associado à CPU é processar (dados), o verbo associado à memória principal é armazenar (dados) e o verbo associado à placa mãe é comunicar (dados). Na atividade 3, os componentes que compõem a CPU são ULA (Unidade Lógica Aritmética), UC (Unidade de Controle e Registradores). Na atividade 4, a ULA possui a função de realizar operações matemáticas, como multiplicação, divisão, soma, subtração, raiz quadrada, etc, bem como a realização e operações lógicas booleanas. Na atividade 5, o papel da UC é servir como porta de entrada e saída para com a memória principal, transportando dados dos registradores para a memória principal e vice-versa. Na atividade 6, RAM é a memória principal, também conhecida como memória de trabalho, e sua função é armazenar dados que poderão ser tanto informações de planilhas (carregadas da memória de massa) quanto instruções de programas. Na atividade 7, a diferença principal entre os registradores da CPU e memória RAM é a localização física (registradores ficam dentro da própria CPU, enquanto a RAM fica externa à CPU, conectada ao processador via barramento da placa mãe), o tamanho (registradores são quantidades muito pequenas de memória, se comparadas à RAM) e a velocidade de acesso (Registradores são muito mais rápidos que a RAM). Na atividade 8, dentro processo de se executar um instrução a função do IP (Instruction Pointer) é armazenar o endereço (da memória RAM) da próxima instrução a se executada pela ULA. Na atividade 9, a frase “Para o RISC, quanto menor, melhor” faz uma alusão à filosofia de fabricação de processadores RISC, que é direcionada ao
34
1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Aula 2 • Computação Básica
projeto do menor número de micro instruções possível para alcançar, com isso, maior performance (velocidade) de execução. Na atividade 10, embora o padrão RISC seja mais rápido do que o padrão CISC, os processadores CISC da Intel facilitam a vida dos desenvolvedores de software devido ao grande leque de instruções disponíveis, bem como ao princípio a retro compatibilidade empregado pela empresa, que preza pelo fato de um programa, construído uma única vez, poder executar em futuras versões de seu processador CISC.
Referência Tanenbaum, Andrew S. Organização estruturada de computadores. São Paulo: Prentice Hall, 2007.
Na próxima aula Agora que você já compreendeu detalhes importantes sobre a arquitetura de computadores modernos (sua estrutura física) e conheceu detalhes de seus componentes internos, você está pronto para se aprofundar na maneira como o computador armazena suas informações, ou seja, utilizando-se do sistema de numeração binário. Também verá a importância da conversão inter-sistemas numéricos, principalmente entre o sistema binário (usado pelo computador) e o sistema decimal (usado pelo homem).
Anotações
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO
35
Aula 2 • Computação Básica
36
1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Aula 3 • Computação Básica
Aula 3 Sistemas posicionais de numeração Objetivo Esperamos que, ao final desta aula, você seja capaz de: • compreender os sistemas de representação numérica de base 2, 8, 10 e 16 e suas conversões.
Pré-requisitos Para iniciar os estudos desta aula, é importante conhecer a história da computação, estudado na primeira aula deste caderno, para que fique mais clara a necessidade e a importância dos sistemas posicionais de numeração. Também se faz necessário ter noções dos componentes básicos do computador, conteúdos vistos na aula dois, uma vez que são eles que fazem uso de uma das representações que será estudada nesta aula: o sistema binário.
Introdução Ao longo da evolução humana, desde os primórdios, quantificar coisas, objetos, rebanhos, entre outros, emergiu como uma necessidade. Assim, os números se tornaram presentes, desde cedo, na civilização. Entretanto a representação numérica da forma como a conhecemos hoje não é uma invenção que apareceu de um dia para o outro e nem conseqüência de uma única mente inventiva. A utilização dos dedos da mão para representar quantidade, ou seja, alguma grandeza numérica, talvez seja a primeira forma que apareceu. Hoje em dia parece natural essa forma de representação, afinal é comum vermos crianças indicarem suas idades com os dedos da mão. Pedras, nós em cordas, marcas em um osso e símbolos unitários pintados nas paredes de cavernas também são outras formas de representação numérica. Imagine-se nas cavernas representando o número quinze nas paredes desta forma: | | | | | | | | | | | | | | |. É fácil perceber que é uma tarefa exaustiva.
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO
37
Aula 3 • Computação Básica
Um pouco mais adiante na história, apareceram os números romanos (até hoje utilizados para referenciar séculos) utilizado em todo o império romano. Nessa forma de representação, ou nesse sistema numérico, letras são os símbolos utilizados para representar quantidades. Nesse sentido, cada letra representa uma quantidade pré-definida. Veja exemplos na tabela 1. Tabela 1 – Exemplos de números representados no sistema numérico romano Romana
Representação
I
Um
II
Dois
III
Três
IV
Quatro
V
Cinco
IX
Nove
X
Dez
C
Cem
CXVI
Cento e dezesseis
D
Quinhentos
DCXX
Seiscentos e vinte
M
Mil
MMVIII
Dois mil e oito
Contudo o sistema romano, apesar de amplamente utilizado pelo império, é um sistema numérico que apresenta deficiências em operações aritméticas. Outras formas de representações surgiram ao longo da civilização. Entre essas outras formas, surgiram os algarismos arábicos. Segundo Weber (2004), com os seguintes símbolos (0, 1, 2, 3, 4, 5, 6, 7, 8, 9):
٠, ٩, ٨, ٧, ٦, ٥, ٤, ٣, ٢, ١ Note que nessa representação (ao contrário da romana) aparece o número zero, uma invenção indo-arábica das mais importantes da humanidade. Nessa forma de representação numérica, dez símbolos diferentes são utilizados para se representar qualquer número natural. Esse sistema numérico é o mais amplamente conhecido e utilizado atualmente e é conhecido como sistema decimal ou sistema numérico posicional de base 10. Além dos sistema decimal, outros sistemas numéricos se destacam e são importantes para a computação: o binário (sistema numérico posicional de base 2), o octal (sistema numérico posicional de base 8) e o hexadecimal (sistema numérico posicional de base 16).
38
1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Aula 3 • Computação Básica
Mas você já parou para pensar e tentar descobrir o porquê da popularização da sistema de base 10 em relação aos dos demais tipos de base? A resposta é simples. Lembra-se de que no início da aula foi exposto que os dedos talvez tenha sido a primeira forma de representação numérica pelo ser humano e é uma representação natural? Pois bem, a reposta está aí. O sistema decimal se destaca exatamente porque o ser humano tem 10 dedos. Ao contrário do que muita gente pensa, de que o sistema decimal é mais fácil de se trabalhar, os demais sistemas funcionam exatamente iguais aos de base 10. Entretanto podemos achar mais simples o decimal exatamente por estarmos acostumados desde criança com essa forma de representação. Como veremos a seguir, todas as representações posicionais são regidas por uma única lei: lei de formação. Vejamos como se compoe um número pela lei de formação: Número = an ∙ bn + an-1 ∙ bn-1 + an-2 ∙ bn-2 + ... + a0 ∙ b0 em que: b = base do número (exemplo: base 2, 8, 10 e 16) n = quantidade de algarismos - 1 an = algarismos de acordo com sua posição (daí o nome sistema posicional) Exemplo O número 1982 no sistema decimal é composto por 1 milhar, 9 centenas, 8 dezenas e 2 unidades. 1000 + 900 + 80 + 2 = 1982 Esse número pode ser decomposto também da seguinte maneira: 1982 = 1000 + 900 + 80 + 2
= 1x1000 + 9x100 + 8x10 + 2x1
= 1x103 + 9x102 + 8x101 + 2x100
Note que a última linha é a representação do número 1982 no sistema decimal pela lei de formação. Nesse sentido, a idéia é adotar pesos diferentes para posições diferentes de algarismos (idéia de representação posicional). Assim, quanto mais à esquerda, maior seu peso, sempre 10 (base) vezes maior.
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO
39
Aula 3 • Computação Básica
3.1 Sistema binário (Base 2) Vimos que o sistema decimal (base 10) utiliza dez símbolos diferentes para representar qualquer número natural. No sistema binário, como o próprio nome diz, existem apenas 2 símbolos para se representar: 0 (zero) e 1 (um). Como já foi exposto anteriormente, o sistema binário obedece à lei de formação. Vejamos.
O número 1001, no sistema binário, de acordo com a lei de formação, é composto da seguinte forma: 1 = 1x23 + 0x22 + 0x21 + 1x20 O número 11011, no sistema binário, de acordo com a lei de formação, é composto da seguinte forma: 11011 = 1x24 + 1x23 + 0x22 + 1x21 + 1x20
Idoeta e Capuano (1998, p. 2) expõem que, no sistema binário para representarmos a quantidade zero, utilizamos o algarismo 0, para representarmos a quantidade um, utilizamos o algarismo 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
40
1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Bits
Denominação
4 8 16
Nibble Byte Word
Aula 3 • Computação Básica
Gates (1995) apresenta uma forma diferente, no intuito de facilitar o entendimento, sobre o sistema numérico binário. Gates introduz uma idéia diferente de como iluminar um ambiente. Imagine um quarto com uma única lâmpada de 250 watts. Contudo suponha que, ao invés de uma, o quarto tenha 8 lâmpadas de menor intensidade (de 1 a 128 watts). Veja figura 1.
Lâmpada de 128 watts
Lâmpada de 64 watts
Lâmpada de 32 watts
Lâmpada de 16 watts
Lâmpada de 8 watts
Lâmpada de 4 watts
Lâmpada de 2 watts
Lâmpada de 1 watts
interruptor interruptor interruptor interruptor interruptor interruptor interruptor interruptor
Figura 1 – Lâmpadas de intensidade diferentes com seus interruptores Fonte: Gates (1995).
No ambiente, há um interruptor para cada lâmpada e elas são arranjadas em ordem crescente de potência da direita para a esquerda, ou seja, a de maior potência está mais à esquerda e a de menor mais à direita (note que é a mesma idéia dos pesos da lei de formação). Dessa forma, ao ligar e desligar os interruptores, é possível ajustar a iluminação do ambiente. Se quiser somente 1 watt de luz, liga só o interruptor mais à direita. Se quiser 191 watts, liga todos os interruptores, com exceção do da lâmpada de 64 watts. Assim como se você quiser ajustar o nível de iluminação em 137 watts, ligam-se as lâmpadas de 128, 8 e 1 watts, como representado na figura 2.
Lâmpada de 128 watts
Lâmpada de 64 watts
Lâmpada de 32 watts
Lâmpada de 16 watts
Lâmpada de 8 watts
Lâmpada de 4 watts
Lâmpada de 2 watts
Lâmpada de 1 watts
interruptor interruptor interruptor interruptor interruptor interruptor interruptor interruptor
Figura 2 – Interruptores ajustados para produzir 137 watts Fonte: Gates (1995).
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO
41
Aula 3 • Computação Básica
Gates (1995, p. 41) complementa que para encurtar ainda mais a notação, você pode registrar cada “desligado” com 0 e cada “ligado”com 1. O que significa que, em vez de escrever “ligado, desligado, desligado, desligado, 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 representar as quantidades maiores que 9, porém, as letras foram escolhidas pela facilidade de manuseio”. A lei de formação também rege o sistema hexadecimal, uma vez que ele também é um sistema de representação posicional.
42
1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Aula 3 • Computação Básica
Exemplo O número A29F no sistema hexadecimal, de acordo com a lei de formação, é composto da seguinte forma: A29F = Ax163 + 2x162 + 9x161 + Fx160
10x163 + 2x162 + 9x161 + 15x160
3.4 Padrões de representação De acordo com Lourenço e outros (1996), existem vários padrões para se representar os números em diferentes bases. Os mais comuns são: • utilizar uma letra após o número para indicar a base; • colocar o número entre parênteses e a base como um índice do número. Exemplos Sistema decimal: 1673D ou (1673)10 Sistema binário: 1001B ou (135)2 Sistema octal: 753O ou (753)8 Sistema hexadecimal: F3AH ou (F3A)16
3.5 Tabela de conversão entre bases Já vimos a idéia de alguns dos principais sistemas de representação posicional de números: decimal, binário, octal e hexadecimal. Conhecer suas equivalê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 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Base 2 0 1 10 11 100 101 110 111 1000 1001 1010 1011 1100 1101 1110 1111
Base 8 0 1 2 3 4 5 6 7 10 11 12 13 14 15 16 17
Base 16 0 1 2 3 4 5 6 7 8 9 A B C D E F
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO
43
Aula 3 • Computação Básica
Faz-se necessário acrescentar que, assim como no sistema decimal, adicionando-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, sucessivas multiplicações dos algarismos por seus pesos. Agora queremos o inverso, do sistema decimal para as demais bases. Sendo assim, precisamos realizar a operação matemática inversa que utilizamos anteriormente, ou seja, a divisão.
44
1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Aula 3 • Computação Básica
Lourenço e outros (1996, p. 9) dizem que dado um número inteiro escrito na base 10, para se obter seu equivalente em uma base b qualquer, divide-se o número por b tantas vezes quantas necessárias para que o quociente da divisão seja menor que b. O último quociente da divisão e os restos das divisões sucessivas, tomados na ordem inversa, correspondem ao número na base b.
Exemplo (125)10 : ( ? )2 125 ÷ 2 = 62 e resto = 1 62 ÷ 2 = 31 e resto = 0 31 ÷ 2 = 15 e resto = 1 15 ÷ 2 = 7 e resto = 1 7 ÷ 2 = 3 e resto = 1 3 ÷ 2 = 1 e resto = 1 1 < 2 (base desejada)
Quando o quociente é menor que a base desejada, pára de se efetuar as divisões. O resultado da conversão é o último quociente concatenado com os restos das divisões do fim para o começo. Dessa forma, obtém (1111101)2.O mesmo exemplo anterior por ser visto na figura 3. 125
2
1
62
2
0
31
2
1
15
2
1
7
2
1
3
2
1
1
sentido da leitura (125)10 = (1111101)2
Figura 3 – Exemplo de múltiplas divisões na conversão do número (125)10 para a base 2 Fonte: Lourenço e outros (1996).
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO
45
Aula 3 • Computação Básica
3.8 Conversão entre base 2 e 16 A conversão entre os sistemas binário e hexadecimal pode ser feita diretamente, sem a necessidade de operações aritméticas. Isso ocorre porque existe uma estreita relação entre esses dois sistemas posicionais de representação. Afinal, o número 16 (base do sistema hexadecimal) pode ser expresso como 24 (repare o dois do sistema binário na base). Ou seja, os números hexadecimais podem ser vistos como uma representação compacta dos números binários. A conversão da base 2 para a base 16 é realizada da seguinte forma: • segmenta-se o número em parte de 4 (repare que quatro é a potência de 24) algarismos da direita para a esquerda; • cada segmento é convertido diretamente para o seu equivalente em hexadecimal (de acordo com a tabela 3). Exemplo (1010011011)2 0010 1001 1011 2
9
B
A conversão da base 16 para a base 2 é realizada da seguinte forma: • cada algarismo hexadecimal é convertido diretamente para o seu equivalente em binário com quatro bits (de acordo com a tabela 3). Exemplo (54B)16 5
4
B
0101
0100
1011
3.9 Conversão entre as bases 2 e 8 A conversão entre as bases 2 e 8 também pode ocorrer diretamente, assim como entre as bases 2 e 16. Isso porque também há uma relação entre essas duas bases, afinal 8 também pode ser reescrito como 23. A conversão é direta, contudo, ao invés de se formar grupos de quatro algarismos, formam-se grupos de três algarismos.
46
1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Aula 3 • Computação Básica
Exemplo (1010011011)2 001
010
011
011
1
2
3
3
Por outro lado, a conversão de um número octal em binário procede-se de modo idêntico ao da conversão da base 16 para a base 2. Assim, cada algarismo octal é convertido diretamente para o seu equivalente em binário de três bits (de acordo com a tabela 3). Exemplo (543)8 5
4
3
101
100
011
3.10 Conversão entre as bases 8 e 16 Falta apenas vermos mais uma conversão entre as bases analisadas. Para converter um número octal em hexadecimal é preciso realizar um passo intermediário por meio do sistema binário. É simples de enxergar isso, uma vez que não conseguimos reescrever o número 16 na base 8 elevado a alguma potência. Contudo ambos podem ser reescritos respectivamente como 24 e 23, tendo ambos como base 2, ou seja, podem ser reduzidos diretamente para o sistema binário. Exemplo (543)8 5
4
3
101 100 011 Encontrado o binário, realiza-se a conversão da base 2 para a base 16. 0001 0110 0011 1
6
3
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO
47
Aula 3 • Computação Básica
Na conversão de hexadecimal para octal, também é necessário um passo intermediário em que se utiliza o sistema binário. Assim, converte-se o número da base 16 para a base 2 e, em seguida, este para a base 8. Exemplo (1F4B)16 1
F
4
B
0001
1111
0100
1011
Encontrado o binário, se realiza a conversão da base 2 para a base 8. 001 111 101 001 011 1
7
5
1
3
3.11 Conversão de números fracionários Os números fracionários também podem ser representados nas bases 2, 8 e 16. Afinal, esses números podem ser representados na base 10. Para isso, basta ampliar a aplicação da lei de formação: Número = anbn + an–1bn–1 + an–2bn–2 + ... + a0b0 + a–1b–1 + a–2b–2 + ... + a–mb–m
Parte inteira
Parte fracionária
em que: b = base do número (exemplo: base 2, 8, 10 e 16). n = quantidade de algarismos da parte inteira – 1. an = algarismos de acordo com sua posição. m = quantidade de algarismos da parte fracionária. Vejamos alguns exemplos de conversão de números fracionários de outras bases para a base 10. a) Base 2 para base 10 1101,0112 = 1 x 23 + 1 x 22 + 0 x 21 + 1 x 20 + 0 x 2-1 + 1 x 2-2 + 1 x 2-3
48
= 8 + 4 + 0 + 1 + (0/2) + (1/4) + (1/8) = 13,37510
1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Aula 3 • Computação Básica
b) Base 8 para base 10 51,348 = 5 x 81 + 1 x 80 + 3 x 8-1 + 4 x 8-2
= 40 + 1 + (3/8) + (4/64) = 41,437510
c) Base 16 para base 10 1F,5C016 = 1 x 161 + 15 x 160 + 5 x 16-1 + 12 x 16-2 + 0 x 16-3
= 1 + 15 + (5/16) + (12/256) + (0/4096) = 16,35937510
A conversão da base 10 para as bases 2, 8 e 16 é um pouco diferente da parte fracionária. A parte inteira é convertida separadamente pelas divisões sucessivas. Para a parte fracionária, utiliza-se o processo das multiplicações sucessivas pela base desejada. Exemplos
a) Base 10 para a base 2
7,42710 = parte inteira: 1112
parte fracionária: 0,25
0,50
x 2
x2
0,50
1,0
0
0,0 FINAL
1
7,42710 = 111,012
b) Base 10 para a base 2 (dízima periódica)
6,410 = parte inteira: 1102
parte fracionária:
0,4 x 2 = 0,8
0
0,8 x 2 = 1,6
1
Repetição
0,6 x 2 = 1,2
1
0,2 x 2 = 0,4
0
0,4 x 2 = 1,8
1
6,410 = 110,01100110011001100110...2
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO
49
Aula 3 • Computação Básica
c) Base 10 para a base 8
26,210 = parte inteira: 328
parte fracionária: 146314361...8 (dízima periódica)
0,2 x 8 = 1,6
1
0, 6 x 8 = 4,8
4
0,8 x 8 = 6,4
6
0,4 x 8 = 3,2
3
0,2 x 8 = 1,6
1
d) Base 10 para a base 16
69,124610 = parte inteira: 4516
parte fracionária: 1FE516... (não periódica)
Estamos chegando ao fim desta aula, em que expusemos que existem vários sistemas de numeração. Dentre os sistemas de numeração, os de representação posicional (atribuição de pesos para cada posição de algarismo) se destacam pela facilidade de realização de operações aritméticas, que serão estudadas na próxima aula.
Síntese da aula O ser humano desde sempre teve a necessidade de quantificar coisas, por isso a importância de sistemas numéricos. Além disso, com as representações numéricas torna-se possível realizar tarefas antes complexas de forma trivial. Dentre as várias formas de representações, destacam-se a decimal (com dez símbolos de representações), a binária (com dois símbolos) – amplamente utilizada nos computadores, a octal (com oito símbolos) e a hexadecimal (com dezesseis símbolos). Diante disso, foi explicado durante a aula como se realizar conversões entre essas quatro formas de representação, que obedecem a uma única lei: a lei de formação. Basicamente, a lei de formação atribui pesos para as posições de cada algarismo de um número (idéia de sistema posicional). Por fim, foi apresentado como se representar números fracionários nas bases 2, 8 e 16.
50
1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Aula 3 • Computação Básica
Atividades 1. Realize a conversão dos números a seguir de acordo com as bases indicadas. a) (F46A)16 = ( ? )10
c) (1001101)2 = ( ? )16
b) (295)10 = ( ? )2
d) (1A42)16 = ( ? )8
e) (765)8 = ( ? )10
g) (101,001)2 = ( ? )10
f) (1024)10 = ( ? )16
h) (B1,5)16 = ( ? )10
2. Leia as afirmativas a seguir sobre conversão de bases. I. O número (765)10, (765)8 e (765)16 são iguais. II. O número (11001110)2 é maior que (D1)16. III. Os números (11101010)2 e (504C)16 são números pares. Assinale a alternativa correta: a) Somente I é verdadeira. b) Somente II é falsa. c) Somente III é verdadeira. d) Todas as alternativas são verdadeiras.
Comentário das atividades Na atividade 1, basta utilizar as conversões vistas durante a esta aula. Assim, as respostas corretas são (F46A)16 = (62570)10, (295)10 = (100100111)2, (1001101)2 = (4D)16, (1A42)16 = (15102)8, (765)8 = (501)10, (1024)10 = (400)16, (101,001)2 = (5,125)10, (B1,5)16 = (177,8)10. Já na atividade 2, a resposta correta é a letra (c). O item (I) é falso porque (765)10 = (1375) 8 = (2FD)16. Já no item (II), o número (11001110)2 = 206 é menor que (D1)16 = (209)10, por isso é falsa. O item (III) é o único verdadeiro, pois (11101010)2 = (234)10 e (504C)16 = (20556)10. É necessário acrescentar que todo número binário terminado em 0 é par, assim como todo número octal terminado em 0, 2, 4 e 6, decimal terminado em 0, 2, 4, 6 e 8, e hexadecimal terminado em 0, 2, 4, 6, 8, A, C, E são pares. Os demais são ímpares. Se você conseguiu resolver estas atividades significa que compreendeu os sistemas de representação numérica de base 2, 8, 10 e 16 e suas conversões, que é o objetivo desta aula.
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO
51
Aula 3 • Computação Básica
Referências GATES, Bill. A estrada do futuro. São Paulo: Companhia das Letras, 1995. IDOETA, Ivan V.; CAPUANO, Francisco G. Elementos de eletrônica digital. 28. ed. São Paulo: Érica, 1998. LOURENÇO, Antonio C.; CRUZ, Eduardo C. A.; FERREIRA, Sabrina R.; CHOUERI JÚNIOR, Salomão. Circuitos digitais. São Paulo: Érica, 1996. WEBER, Raul F. Fundamentos de arquitetura de computadores. 3. ed. Porto Alegre: Sagra Luzzatto, 2004.
Na próxima aula Estudaremos as operações aritméticas no sistema binário e, assim, daremos continuidade ao que foi visto nesta aula, mas em uma abordagem de operações matemáticas.
Anotações
52
1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Aula 4 • Computação Básica
Aula 4 Operações aritméticas no sistema binário de numeração Objetivo Esperamos que, ao final desta aula, você seja capaz de: • realizar as operações aritméticas no sistema binário de numeração utilizando números inteiros e de ponto flutuante.
Pré-requisitos Para iniciarmos os estudos sobre operações aritméticas no sistema binário de numeração, é de suma importância o conhecimento dos sistemas posicionais de numeração, vistos na aula 3. O sistema binário é um dos sistemas posicionais de numeração, por isso a necessidade de estar familiarizado com esse tipo de sistema numérico.
Introdução O sistema binário é um sistema de numeração posicional representado, em que todos os número são representados pelo conjunto de caracteres formados apenas por dois símbolos, 0 (zero) e 1 (um). Os computadores digitais trabalham internamente com esse tipo de sistema, que também são denominamos como bits e podem representar qualquer tipo de número armazenado na memória. Esses números podem representar inteiros, ponto flutuante, negativos ou positivos. A manipulação desses números por meio de aritmética simples e por meio de aritmética de ponto-flutuante é realizada utilizando algoritmos diversos, os quais serão apresentados durante esta aula.
4.1 Aritmética em sistemas binários Os números podem ser representados utilizando qualquer base, seja ela binária, octal, decimal, hexadecimal ou outra qualquer. Para a computação
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO
53
Aula 4 • Computação Básica
o sistema binário é o mais adequado devido à facilidade de implementaçã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 diretamente 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 é positivo; caso seja 1, o número é negativo. Outra forma de representação de números negativos bastante utilizada é o complemento de 2. Para obtermos o complemento de 2 de um número binário, precisamos inicialmente converter o número em seu complemento de 1. O complemento de 1 de um número binário obtém-se trocando cada bit pelo seu complemento. A seguir, soma-se 1 ao complemento de 1, obtendo-se assim o complemento de 2. Um exemplo de notação em complemento de 2 é descrita na tabela 1. Tabela 1 – Complementos de 1 e de 2 Binário
Complemento de 1
Complemento de 2
11100110
00011001
00011010
10100010
01011101
01011110
00100100
11011011
11011100
4.3 Adição em sistemas binários Na adição, os números são somados um a um da direita pra esquerda com os carries (vai 1) sendo passados para o próximo bit à esquerda. A tabela básica para soma de binários está ilustrada na tabela 2. Tabela 2 – Tabela básica da operação binária de adição
54
Primeiro operando
Segundo operando
Resultado da adição
0
0
0
0
1
1
1
0
1
1
1
0, e vai 1
1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Aula 4 • Computação Básica
Se um carry ocorre no bit mais significativo, é gerada uma nova posição à esquerda do último bit, semelhante à aritmética decimal. A figura 1 ilustra uma simples adição, e a figura 2, uma adição em que ocorre carry no bit mais significativo. (vai um)
1
1
6=
0
1
1
0
+7=
0
1
1
1
13 =
1
1
0
1
Figura 1: Operação de adição com carries ocorrendo antes do bit mais significativo (vai um)
1
1
1
10 =
0
1
0
1
0
+7=
0
0
1
1
1
17 =
1
0
0
0
1
Figura 2: Operação de adição com carry ocorrendo no bit mais significativo
No caso da operação de adição gerar um carry no bit mais significativo, acontece o que chamamos de overflow.
Overflow ocorre quando somamos dois operandos positivos e obtemos um resultado negativo, ou vice-versa (CASTRO, 2005).
Na operação de adição em números com notação em complemento de 2, somam-se os dois números e descarta-se o carry. Vejamos o exemplo demonstrado 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
0
0
0
0
1
0
0
1
9=
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 realizada em sistemas decimais. Na tabela 3, exemplificamos a tabela básica de subtração em números binários.
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO
55
Aula 4 • Computação Básica
Tabela 3 – Tabela básica da operação binária de subtração Primeiro operando Segundo operando Resultado da subtração 0
0
0
1
1 1
0 1
0 1, vai 1 para ser subtraído no dígito seguinte 1 0
Para exemplificar melhor, mostraremos um exemplo descrito na figura 4. *
*
*
14 =
1
1
1
0
–7 =
0
1
1
1
7=
0
1
1
1
Figura 4: Operação de subtração entre dois números
Quando temos 0 menos 1, precisamos “pedir emprestado” do elemento vizinho. Esse empréstimo vem valendo 2 (dois), pelo fato de ser um número binário (10). Então, no caso da coluna 0 – 1 = 1, a operação realizada na verdade foi 2 – 1 = 1. Esse processo se repete e o elemento que cedeu o empréstimo e valia 1 passa a valer 0. Os asteriscos marcam os elementos que emprestaram para seus vizinhos. Quando acontecer de o número que emprestará não poder emprestar para ninguém, então o pedido passa para o próximo elemento e esse zero recebe o valor de 1. A maneira mais eficiente de se implementar a subtração é utilizando a notação binária com complemento de dois. Assim, ao invés de implementarmos a subtração, faz-se o complemento de dois no minuendo e soma-se os dois valores. Um exemplo dessa característica da subtração de números binários é a mostrada na figura 5.
7 = 00111
2 = 00010
7 – 2 => 00111 – 00010 => 00111 + (11101 + 00001) => 00111 + 11110 => 100101
Figura 5: Subtração utilizando notação de complemento de dois.
4.5 Multiplicação em sistemas binários A multiplicação é realizada por meio dos mesmos métodos do sistema decimal, a única diferença é no momento de somar os termos resultantes da operação, o qual obedece às regras da adição de números binários.
56
1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Aula 4 • Computação Básica
Na figura 6 é mostrado um exemplo de como se comporta a multiplicação de dois números. 1
0
1
1
Multiplicando
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
X + + +
1
1
0
Figura 6: Exemplo de multiplicação com binários
A tabela básica para multiplicação de números binários é mostrada na tabela 4. Tabela 4 – Tabela básica da operação binária de multiplicação Primeiro operando
Segundo operando
Resultado da multiplicação
0
0
0
0
1
0
1
0
0
1
1
1
Uma observação importante a respeito da multiplicação de números binários é que os números de bits do produto final é maior do que o número de bits do multiplicando ou do multiplicador, como fica evidente na figura 4. Além disso, a multiplicação também precisa tratar a ocorrência do overflow. Castro (2005), levando em consideração os dígitos binários 0 e 1, diz que temos apenas duas possibilidades de escolha, a cada passo da multiplicação: • coloque uma cópia do multiplicando no lugar apropriado, se o dígito do multiplicador for igual a 1; • coloque 0 no lugar apropriado, se o dígito do multiplicador for igual a 0. Considerando isso, Castro (2005) diz que é necessário desenvolver um algoritmo em hardware que seja eficiente para realizar a multiplicação. Um método elegante de multiplicar números com sinal recebeu o nome de Algoritmo de Booth. O Algoritmo de Booth funciona com base em que a partir do momento que você pode adicionar ou subtrair números binários, você pode chegar a um produto qualquer.
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO
57
Aula 4 • Computação Básica
O algoritmo utiliza a notação em complemento de 2 e foi inventado em 1951 por Andrew D. Booth, enquanto fazia cristalografia no Colégio Birkbeck, em Bloomsbury, Londres.
4.6 Divisão em sistemas binários A divisão em sistemas binários é feita utilizando-se das mesmas técnicas dos outros sistemas, bastando para isso obedecer a algumas regras na hora da subtração. Na divisão do número 6 pelo número 2, temos a operação mostrada na figura 7, na qual o quociente é 3.
– –
1
1
0
1
0
0
1
0
1
0
0
0
1
0
1
1
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 representados computacionalmente, pois os mesmos podem ser muito extensos ou podem ser infinitos. As operações aritméticas utilizando números de ponto-flutuante são muito onerosos e, por isso, foi necessário implementá-los em hardware para que pudessem ter um desempenho aceitável. Mano (1998) descreve os algoritmos que podem ser utilizados nas operações aritméticas de ponto flutuante, pois como muitos computadores não possuem a aritmética de ponto-flutuante implementada em hardware, é preciso tratá-la via software. Os algoritmos são os a seguir. 4.7.1 Soma e subtração Verifica-se se uma das mantissas a operar é zero; caso afirmativo: • se for uma soma e uma das parcelas for zero – o resultado é igual a outra parcela; • se for uma subtração e o subtraendo for zero – o resultado é igual ao minuendo;
58
1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Aula 4 • Computação Básica
• se for uma subtração e o minuendo for zero – o resultado é igual ao subtraendo, com o sinal invertido. Se não houver zeros: • reduzir ao mesmo expoente (o maior); • somar / subtrair as mantissas; • normalizar o resultado. 4.7.2 Multiplicação Verifica-se se uma das mantissas a operar é zero; caso afirmativo, o resultado é zero. Se não houver zeros: • somar os expoentes; • multiplicar as mantissas; • normalizar o resultado. 4.7.3 Divisão Verifica-se se uma das mantissas a operar é zero; caso afirmativo: • se o divisor é zero, é impossível e dispara uma exceção de divisão por zero; • se o dividendo é zero, o resultado é igual a zero. Se não houver zeros: • subtrair os expoentes; • dividir as mantissas; • normalizar o resultado. Para se padronizar a implementação de aritmética de ponto-flutuante em CPUs, foi criado em 1985 o padrão IEEE 754, o qual está implementado atualmente na grande maioria das CPUs. O padrão IEEE 754 dita algumas características citadas em Viana (2005), que são: • a base de representação é a binária; • as operações devem ser executadas em precisão estendida com uso de dígitos de guarda e expoente deslocado; • o uso do expoente deslocado, também chamado característica, tem por objetivo eliminar o sinal do expoente.
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO
59
Aula 4 • Computação Básica
Nas operações aritméticas em ponto-flutuante, após cada operação é realizado o arredondamento, por isso as operações de adição, subtração, multiplicação e divisão não associativas nem distributivas. Além dos erros que podem ser ocasionados por arredondamento, alguns efeitos afetam a qualidade dos cálculos, como cancelamento, propagação de erros, instabilidade numérica e mau condicionamento. Esses quatro tipos de erros são relatados da seguinte forma: • o cancelamento ocorre na subtração de dois números quase iguais, pois o expoente permanece o mesmo e os dígitos iniciais são todos zeros, perdendo-se dígitos significativos do resultado; • a propagação de erros ocorre quando uma ou mais somas parciais têm o expoente maior do que a soma final; • a instabilidade numérica ocorre se um resultado intermediário é contaminado por um erro de arredondamento. Esse erro pode influenciar todos os resultados subseqüentes que dependem desse valor, propagando, assim, os erros de arredondamento; • problemas cujos resultados dependem continuamente dos dados de entrada são ditos bem postos, em oposição aos problemas mal postos, mal condicionados ou críticos.
Síntese da aula Nesta aula, vimos que as operações aritméticas sobre números binários obedecem sempre aos mesmos princípios das operações em outras bases. Pudemos conhecer também alguns algoritmos que possibilitam que as operações fiquem mais velozes quando implementadas em hardware. Também vimos, na aula 4, que a aritmética de ponto flutuante é bem mais complicada e ajuda a entender melhor as dificuldades de desenvolvimento de circuitos que suportam aritmética de ponto-flutuante. As operações aritméticas sobre números binários são de extrema importância para os computadores digitais atuais, pois somente com uma aritmética simples e eficiente podemos chegar a unidades lógicas e aritméticas aceitáveis.
Atividade 1. Desenvolva as operações aritméticas envolvendo os seguintes números binários:
60
1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Aula 4 • Computação Básica
a) 01110011 + 01110101 b) 11010001 – 00101111 c) 11011010 * 11010 d) 11011000 / 10
Comentário da atividade Na atividade 1, trabalharemos a capacidade de o aluno desenvolver as operações aritméticas básicas utilizando números binários. Os resultados das operações são os seguintes, utilizando o método de resolução proposto na lição 4: a)
(vai um) +
b)
1
1
1
0
1
1
0
1
1
1
(empresta) –
1
1
1
1
0
0
1
1
1
1
0
1
0
1
1
0
1
0
0
0
*
*
*
*
*
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
x
1
0
1
0
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
1
1
0
1
1
0
0
0
1
0
1
0
1
1
0
1
0
1
0
0
0
+ + +
d)
1
1
1
1
0
0
1
0
1
0
0
0
0
0
1
0
0
0
1
1
0
0
0
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO
61
Aula 4 • Computação Básica
Referências CASTRO, F. C. C. Eletrônica digital. Porto Alegre: PUC-RS, 2002. CASTRO, M. C. S. Organização de computadores I. Rio de Janeiro: Universidade do Estado do Rio de Janeiro, 2005. Mano, R. Representação de dados. Disponível em: . Acesso em: 20 dez. 2007. VIANA, G. V. R. Padrão IEEE 754 para aritmética binária de ponto flutuante. Fortaleza: Universidade Estadual do Ceará, 2005.
Na próxima aula Veremos as classificações de software que podem servir para diversos fins.
Anotações
62
1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Aula 5 • Computação Básica
Aula 5 Classificação de software Objetivo Esperamos que, ao final desta aula, você seja capaz de: • identificar e compreender as características quanto à classificação dos softwares livres e proprietários, bem como suas sub-divisões.
Pré-requisitos Para iniciarmos os estudos sobre as classificações de software, é interessante 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 importâ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 características que o auxiliarão a compreender tais classificações de software. Bons estudos!
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO
63
Aula 5 • Computação Básica
5.1 Software livre Desde os primórdios da história da computação, quando do início da criação de software para os computadores gigantescos, para não se dizer jurássicos, um tema é bastante discutido nas rodas de desenvolvedores, a classificação do software. Isso se deve a aspectos existentes no processo de criação de um software, que envolve tanto direitos autorais quanto intelectuais que devem ser respeitados. Nos últimos anos, a vertente de software livre tem ganhado considerável força devido ao fato da crescente visão de que, segundo a Free Software Foundation (FSF) (2007), “Software Livre é uma questão de liberdade, não de preço. Para entender o conceito, você deve pensar em liberdade 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 gratuidade. 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 traduzido 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 consideração suas características, expectativas e necessidades, contribuindo para uma visão construtivista e evolucionária em que diversas pessoas podem trabalhar 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 característica importantíssima de um software livre, que consiste na disponibilizaçã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 conhecimento e incentivando a pesquisa científica (FSF, 2007). A (FSF, 2007) menciona que, para que um software seja considerado livre, ele deve necessariamente possuir os quatro princípios da liberdade. São elas: • liberdade n.o 0: o usuário deve ter a liberdade de executar o programa, para qualquer propósito;
64
1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Aula 5 • Computação Básica
• liberdade n.o 1: o usuário deve ter a liberdade de estudar e adaptar o programa para as suas necessidades. O acesso ao código-fonte é um pré-requisito para essa liberdade; • liberdade n.o 2: o usuário deve ter a liberdade de redistribuir cópias de modo que possa ajudar ao próximo; • liberdade n.o 3: o usuário deve ter a liberdade de aperfeiçoar o programa e disponibilizar seus aperfeiçoamentos, de modo a beneficiar toda a comunidade. O acesso ao código-fonte é um pré-requisito para esta liberdade.
Saiba mais Quando se trabalha com um tema como a classificação de software, é importante se conhecer em sua essência todos os conceitos que a diferenciam, e assim formar opinião consiste sobre o assunto. Então, sugerimos que sejam realizadas leituras a materiais complementares, como os existentes no site da Free Software Foundation () ou no site da Open Source Iniciative ().
Como pode ser visto, o acesso ao código fonte é um dos pilares para a caracterização de um software livre. Isso não significa que o mesmo não seja comercial, muito pelo contrário. A idéia de se ganhar dinheiro com software livre não está na venda de produtos fechados, mas sim na venda de serviços de qualidade que estão, a todo momento, expostos, sendo colocados à prova e ao julgamento da comunidade (MOLINARI, 2007). Um software, quando se diz livre, geralmente está regido pela GPL (General Public License), que consiste na designação da licença para software livre criada por Richard Stallman no final da década de 1980, regido pela Free Software Foundation, sendo utilizado por grandes projetos, como o do sistema operacional Linux (FSF, 2007). Assim, esta vertente da classificação de software pode ser divida em duas sub-divisões, que são: Open Source e Livre Comercial, tratados a seguir. 5.1.1 Open Souce Esse tipo de software segue todos os preceitos citados até aqui nesta aula, no qual o código fonte é distribuído e é permitido que esse seja modificado e redistribuído, levando em consideração os princípios de liberdade do software original. Isso auxilia na prevenção de sua utilização sem fins comerciais, estando
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO
65
Aula 5 • Computação Básica
sujeitos aos termos da licença GPL. Alguns exemplos de softwares open source são o kernel do sistema operacional Linux e o projeto Web Apache TomCat, que podem ser alterados e redistribuídos (FSF, 2007). 5.1.2 Livre comercial Como já mencionado nesta aula, o software livre não exclui a possibilidade de sua utilização comercialmente, sendo distribuído mediante o pagamento. Porém isso, comercialmente, é comprometido, uma vez que está sob as regras impostas pela GPL no qual, apesar do software ser comercializado, 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 disponibilizaçã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 utilizado 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 distribuí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 completamente de ser comercial. Conforme apresentado até aqui nesta aula, fica claro que existem diversas possibilidades quanto à exploração das características do software livre, seja em sua mais forma mais essencial ou mesmo comercialmente. Porém existem pessoas e empresas que pregam a utilização
66
1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Aula 5 • Computação Básica
da vertente mais comercial dos softwares, no qual são considerados direitos autorais e ideológicos envolvendo custo ou, como também são conhecidos, os softwares proprietários.
Pensando sobre o assunto O software livre é muito utilizado no contexto acadêmico, porém nada impede ou mesmo inviabiliza que um software desenvolvido sobre um ambiente puramente acadêmico tenha fins comerciais de mercado, um exemplo claro disso consiste no Google, que foi desenvolvido em um ambiente universitário.
5.2 Software proprietário Depois de conhecida toda a ideologia existente por trás dos softwares livres, chegou a vez de discuti-lo como um bem material que envolve custos e até mesmo segredos de mercado. Opiniões quanto ao software livre como uma grande utopia, ou como uma idéia muito à frente de seu tempo, podem ser encontradas facilmente na Internet e no mercado. O que é pregado em defesa do software proprietário é melhor analisado quando utilizada uma analogia. Por exemplo: um grande chefe de cozinha, por cozinhar muito bem, tem todo o direito de abrir um restaurante e vender suas deliciosas iguarias. Ninguém pode obrigá-lo a ensinar ou mesmo a distribuir 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 é definido de acordo com a utilidade que este software tem para uma determinada pessoa que pague o valor sugerido, mesmo que outros discordem completamente desse ponto de vista (MOLINARI, 2007). Um software comercial ou proprietário é distribuído sem a disponibilização de seu código fonte, sendo normalmente comercializado sob os termos de licença de uso, e não de propriedade. O que acontece nesse caso é que, ao adquirir um software, uma pessoa está se comprometendo somente a utilizá-lo, sem direito algum sob aspectos de comercialização ou mesmo de sua redistribuição, sob penas e multas severas. Exemplos desse tipo de software é o sistema operacional Microsoft Windows e o assistente gráfico Corel Draw.
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO
67
Aula 5 • Computação Básica
Saiba mais Alguns softwares se utilizam de licenças um tanto quanto diferentes, como a Postcardware e a StampwareCardware, no qual o desenvolvedor exige o feedback por parte dos usuários da ferramenta por meio de postais ou cartas para só então liberar o registro do software.
Uma grande quantidade de softwares proprietários disponibiliza versões gratuitas para testes e pode ser classificada como: • shareware: software que, após certo tempo de utilização, ou mesmo número de utilizações, indisponibiliza suas funcionalidades, sendo necessário o registro, no caso o pagamento de uma taxa ao proprietá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 construçã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 necessá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 persistê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 ferramenta para aprendizado por tempo indeterminado, porém sempre se lembrando das limitações já citadas.
Pensando sobre o assunto Em sua maioria, os softwares proprietários são conhecidos como Software Box, ou melhor, softwares de caixinha. Compra-se um produto finalizado e o usuário tem pouco ou senão nenhum poder de alteração, de manipulação sobre o que está sendo adquirido ou mesmo poder para sua customização.
68
1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Aula 5 • Computação Básica
Finalizando esta aula, é interessante considerarmos que as divisões de softwares apresentadas não são as únicas disponíveis, mas as principais e mais utilizadas para a classificação de software. Essas classificações refletem a idéia e a vontade de como os programas de computadores devem ser utilizados, segundo a visão do desenvolvedor e proprietário dos direitos. Existem ainda diversos métodos que podem ser utilizados na classificação de software como, por exemplo, a permissão de utilização de software gratuitamente, 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 à disponibilizaçã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 monopó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 influenciam diretamente na contextualização e, por conseqüência, classificação dos softwares, como valores culturais e contribuições sociais. São vertentes completamente diferentes que apresentam prós e contras, mas que, com certeza, contribuem para um melhor modelo de produção de conhecimento e disseminação da informação, cada uma à sua maneira.
Síntese da aula Nesta aula, apresentamos as características e conceitos relacionados a classificação de software. Esses podem ser divididos em duas vertentes: a livre e a considerada proprietário. Além disso, conhecemos nomenclaturas comuns a classificação dos softwares como: freeware, adware, shareware, demo e trial. Cada uma destas distribuições caracteriza o software quanto às suas limitações e tempo de utilização. Finalizando, são apresentadas algumas classificações menos conhecidas, como a Shared Source.
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO
69
Aula 5 • Computação Básica
Atividades 1. Diversos aspectos e características podem ser utilizados para que um software seja considerado livre. Porém, com certeza, os quatro princípios de liberdades exigidos pela GPL (General Public Lincense) são os mais conceituados. Quais são eles e em que consistem? Justifique sua resposta. 2. Quanto aos softwares proprietários, podem ser distribuídos como versões de teste. Dessa forma, qual a diferença entre as versões shareware e trial?
Comentário das atividades Na atividade 1, os quatro princípios da liberdade consistem em aspectos que interferem diretamente na classificação de um software livre, assim o primeiro princípio consiste na liberdade que os usuários devem possuir para a execução do software para qualquer que seja o seu propósito. O segundo princípio consiste na liberdade que o usuário deve possuir para estudar, analisar e adaptar o programa as necessidades. Para tanto, é necessário que o código fonte esteja disponível ao usuário. O terceiro princípio consiste na liberdade que o usuário deve possuir para a distribuição de cópias alteradas ou não por ele. Finalizando os princípios, o usuário deve possuir a liberdade de aperfeiçoar o software e, além disso, disponibilizar de modo a proporcionar o bem de outros. Já na questão 2, a diferença existente entre as distribuições de teste proprietárias shareware e trial consiste no fato de que a primeira limita a utilização de recursos por meio do tempo ou mesmo quantidade de vezes que o software é utilizado; já o segundo tipo, o Trial, limita a utilização do software por meio da indisponibilização e limitação dos recursos do programa, por exemplo, a funcionalidade para salvar documentos.
Referências FSF, Free Software Foundation. Free Software. Disponível em: . Acesso em: 20 dez. 2007. MOLINARI, Leonardo. Gerência de configuração: técnicas e práticas no desenvolvimento do software. Florianópolis: Visual Books, 2007. OSI, Open Source Iniciative. Open Source. Disponível em: . Acesso em: 20 dez. 2007.
Na próxima aula Veremos os conceitos relacionados a noções básicas tanto de redes de computadores quanto de banco de dados.
70
1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Aula 6 • Computação Básica
Aula 6 Noções básicas de redes de computadores e banco de dados Objetivos Esperamos que, ao final desta aula, você seja capaz de: • compreender quais são os tipos de redes existentes e como elas são interligadas entre si; • entender o funcionamento de um banco de dados e como ele é útil para manipular informações.
Pré-requisitos Para o aprendizado desta aula, não há necessidade de conhecimentos anteriores, apenas que você tenha força de vontade para conhecer novas tecnologias e procure saber mais sobre o que será falado aqui em sites e livros relacionados com essas duas áreas.
Introdução A interligação de computadores ou uma rede de computadores se faz necessário pelo fato de que há uma grande facilidade em trocar informações sem a necessidade de mídias como disquete, CD ou DVD, como também compartilhar informações e aplicativos. Os bancos de dados têm como finalidade gerar uma determinada informação por meio de um agrupamento logicamente 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 capacidade de colher, processar e distribuir informações torna-se ainda maior a demanda por formas de processamento de informações ainda mais sofisticadas (TANENBAUM, 2004).
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO
71
Aula 6 • Computação Básica
6.1 Tipos de redes de computadores De acordo com a distância em que os computadores se encontram, podemos classificá-los em alguns tipos, conhecidos como: • redes locais (LAN – Local Área Network): são interligações entre computadores em uma área geralmente menor que 10km, de alta velocidade e de baixas taxas de erro; • redes metropolitanas (MAN – Metropolitan Área Network): são interligaçõ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 computadores 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 interligados 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 corretamente ao seu destino. Esse tipo de topologia de rede é o mais usado na atualidade.
72
1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Aula 6 • Computação Básica
Saiba mais Tanto na ligação ponto-a-ponto como na multiponto podemos ter três tipos de comunicações usadas no enlace dos dados, que são: simplex, usa apenas um dos sentidos do enlace; a half-duplex, que utiliza os dois sentidos do enlace, mas um por vez; e a full-duplex, que utiliza os dois sentidos do enlace simultaneamente.
Podemos observar que o meio de transmissão entre cada uma dessas interligaçõ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 comunicam-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 revestido de uma malha ou trança metálica isolante; • cabo de pares trançado: são cabos entrelaçados em forma de espiral com a finalidade de isolar interferências de campos eletromagnéticos quando há uma transmissão de dados na condução de sinais elétricos. O máximo de comprimento de um cabo de pares trançado é de 100 m; • cabo de fibra óptica: são cabos que transmitem dados por meio de feixes de luz e que podem chegar a grandes distâncias. Seu revestimento é feito de uma mistura de vidro, plástico e outros componentes.
Saiba mais Outro meio físico de comunicação é o ar, as chamadas redes wi-fi ou wireless como, por exemplo, ondas de rádio digital, satélites e espectro de difusão, que também podem transmitir dados a grandes distâncias e em grandes velocidades.
Para que haja uma comunicação de dados entre computadores, impressoras, scanners e etc, há necessidade de alguns tipos de dispositivos para interligá-los. Na seção a seguir, veremos alguns desses tipos.
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO
73
Aula 6 • Computação Básica
6.4 Dispositivos de transmissão de dados Os dispositivos de redes a seguir são classificados em dois tipos: ativos e passivos. Os ativos são equipamentos de rede que têm regras pré-definidas, podendo escolher o melhor caminho de transmissão; já os passivos são equipamentos 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 protocolo, 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 regenerar 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 diferença de que possuem inteligência, ou seja, o sinal recebido por ele de um computador é enviado para o computador específico sem que os outros recebam essa informação.
Saiba mais Na comunicação entre esses dispositivos, temos quatro tipos de envio de dados, que são: anycast, em que a transmissão da informação é enviada e distribuída ao receptor mais próximo definido pelo roteador; broadcast, em que a transmissão da informação é enviada a muitos receptores ao mesmo tempo; multicast, em que a informação é enviada a vários receptores simultaneamente, utilizando a melhor estratégia de roteamento; e unicast, em que a transmissão da informação é feita a um único receptor.
Após se falar tanto em comunicação de dados, veremos a seguir como são classificados os bancos de dados, seus usuários e como os dados podem ser gerenciados por um aplicativo.
74
1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Aula 6 • Computação Básica
6.5 Tipos de banco de dados Os bancos de dados podem ser classificados em quatro tipos distintos, dois praticamente em desuso e outros dois ainda em uso, que são atualmente usados por grandes SGBDs (Sistemas Gerenciadores de Banco de Dados) como MySQL, PostgreSQL entre outros. Esses bancos de dados são classificados como: • hierárquico – é organizado como árvores e consiste em uma coleção de registros conectados entre si por ligações. Cada raiz é um pseudonó 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 estrutura apropriada para o armazenamento dos dados, tem uma proximidade maior com os usuário finais para poder moldar o banco de dados, de acordo com o que necessitam;
• usuário finais – são as pessoas que utilizam o banco de dados apenas para consultar, modificar e gerar algum tipo de relatório. A seguir, veremos como é composto um SGBD (Sistema de Gerenciamento de Banco de Dados) e suas principais funções.
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO
75
Aula 6 • Computação Básica
6.7 Sistema de Gerenciamento de Banco de Dados (SGBD) É uma coleção de programas que facilita a manipulação de uma base de dados. As principais funções de um SGBD são: • controle de redundância – não permite que a mesma informação seja gravada em locais diferentes, o que ocasiona um problema na atualizaçã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 interrelacionados de várias maneiras, representando um complexo relacionamento entre si; • backup – deve-se ter uma facilidade para recuperar falhas e possibilitar a cópia da base para não haver a perda de dados. Pode-se observar que um SGDB tem várias funcionalidades para que a informação, que é o principal objeto de armazenamento, possa estar segura e com um conjunto de acessórios para seu uso.
Saiba mais Hoje, no mercado, temos muitos SGBDs de grande poder de armazenamento e segurança, como, por exemplo, MySQL, PostgreSQL, Oracle, SQL Server entre outros.
Na próxima seção, veremos como é feita a manipulação e definição dos dados por meio de comandos que utilizamos para ajudar na construção de uma tabela de geração de informação.
76
1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Aula 6 • Computação Básica
6.8 Structured Query Language (SQL) Desenvolvida pela IBM em meados dos anos 60, tem como objetivo ser uma interface entre o usuário e o SGBD para manipular e definir os dados. O SQL é composto de comandos de manipulação chamado de DDL (Data Definition Language), como o create, drop, de definição de dados chamado de DML (Data Manipulation Language), como o insert, update, delete e select e de controle de dados, chamado de DCL (Data Control Language), como o grant e o revoke, com o objetivo de ajudar os usuários na construção de tabelas e geração de informação coerente. Por meio do SQL, podemos realizar tarefas de cancelamento ou atualizaçã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: administrador do banco de dados, especialista de banco de dados, programadores e usuário final; • utiliza-se de uma interface para o uso interativo com o banco de dados. Finalizando esta aula, podemos verificar que as redes de computadores e os bancos de dados estão em todos os seguimentos de empresas e em pleno uso, já que, por exemplo, a interligação das informações de uma matriz com suas filiais são de suma importância para o bom rendimento dos produtos produzidos pela mesma.
Síntese da aula Nesta aula, vimos conceitos e características de uma rede de computadores e banco de dados em que podemos enviar informações de um computador para o outro por meio de conexões de variados tipos e a longas distâncias. Além disso, podemos guardar essas informações e manipulá-las de acordo com as permissões de cada usuário por meio de um SGBD.
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO
77
Aula 6 • Computação Básica
Atividades 1. Em que consiste uma rede de computadores? 2. Qual a finalidade de um SGBD (Sistema de Gerenciamento de Banco de Dados)?
Comentário das atividades Na atividade 1, uma rede de computadores consiste em fazer uma interligaçã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 gerenciar e armazenar informações de forma que seus usuários possam construir, definir e manipular uma base de dados para as mais diversas finalidades.
Referências RAMALHO, J. A. SQL: a linguagem dos bancos de dados. 2. ed. São Paulo: Berkeley, 1999. SOUSA, L. B. Redes de computadores: dados, voz e imagem. São Paulo: Érica. 1999. TANENBAUM, A. S. Redes de computadores. 4. ed. Rio de Janeiro: LTC, 2004. WIKIPEDIA. Banco de Dados. Disponível em: . Acesso em: 20 dez. 2007. ______. Broadcast. Disponível em: . Acesso em: 20 dez. 2007. ______. Rede de computadores. Disponível em: . Acesso em: 20 dez. 2007.
Na próxima aula Veremos os tipos de profissões, as definições e como é o profissional de cada uma delas.
Anotações
78
1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Aula 7 • Computação Básica
Aula 7 Profissões na área de Informática Objetivos Esperamos que, ao final desta aula, você seja capaz de: • conhecer as áreas de formação profissional mais comuns na área de informática e ainda a situação da regulamentação das profissões; • entender as diferenças entre os diversos tipos de profissionais na área de informática.
Pré-requisitos O entendimento das aulas anteriores o tornará capaz de identificar os diversos segmentos atuais da área de Informática, tais como: comunicação de dados, construçã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, estabelecimentos comerciais e industriais. Diante desses fatores, torna-se indispensável a contratação de profissionais 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 profissionais: analista, programador, operador e digitador. Conheceremos, nesta aula, um pouco mais sobre as principais profissões na área de informática e ainda como anda a situação da regulamentação do registro profissional para todos que já atuam ou pretendem atuar nesta área.
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO
79
Aula 7 • Computação Básica
7.1 Formação acadêmica Como a Informática está presente em todos os segmentos do setor produtivo e ainda pelo motivo de os computadores terem tornado-se objetos tão comuns, amplia-se a necessidade de formação acadêmica voltada para esta área. Na corrida para as especializações, surgem cursos com os mais diferentes nomes, mas possuindo currículos similares, formando profissionais para atuar em atividades semelhantes, o que ocasiona certa confusão entre os estudantes e até mesmo entre os próprios profissionais. Devido ao fato de que as profissões da área de informática não são regulamentadas, 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 equipamentos 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 operacionais, desenvolver linguagens específicas e realizar atividades de pesquisas tecnológicas. Esse curso tem duração média de cinco anos.
80
1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Aula 7 • Computação Básica
b) Bacharel em Ciência da Computação O bacharel em Ciência da Computação tem seu foco principalmente no desenvolvimento dos programas (softwares). Ele pode, ainda, organizar e desenvolver aplicativos (programas aplicados a determinado processo de trabalho) de acesso a bancos de dados ou ainda elaborar sistemas mais complexos, usados por bancos, lojas comerciais entre outros. Pode ainda trabalhar com marketing e vendas, dando consultoria na escolha de equipamentos e na assistência técnica, planejando e analisando 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 administração do fluxo de informações geradas por uma rede de computadores e também a manutenção dos computadores. Este curso tem duração média de 4 anos.
Saiba mais Nos Estados Unidos, não existe diferença entre Engenharia da Computação e Ciência da Computação, diferentemente do Brasil, onde a diferença básica é que Ciência da Computação é um curso mais prático, enquanto Engenharia de Computação é um pouco mais amplo, com conteúdos de Engenharia Elétrica, Engenharia de Sistemas e mesmo de Ciência da Computação.
7.1.2 Escolhendo uma área de atuação A partir das formações de nível superior anteriormente mencionadas, que podem ser encontradas nas mais diversas universidades do Brasil, podemos escolher algumas áreas específicas de atuação. A seguir, veremos alguns exemplos de áreas específicas. a) Administrador de Banco de Dados
Responsável pela manutenção e refinamento de bancos de dados corporativos. A formação recomendada para esta área é a graduação em Engenharia da Computação, Processamento de Dados, Informática.
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO
81
Aula 7 • Computação Básica
Dentre suas atividades, destacamos manutenção e refinamento de bancos de dados, alterações na estrutura do banco para expansão e adaptações de sistemas, monitoramento e identificação de falhas para aperfeiç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; configuraçã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 operacionais 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 automação e tempo real, assim como sistemas embutidos, fazendo uso de aplicações de baixo nível e de conhecimentos sobre sistemas de redes. Suas principais atividades dependem da empresa onde o profissional atue, ele pode estar envolvido com diversas áreas, tais como análise de requisitos e projetos, implementação de sistemas, entre outras.
f) Analista de Suporte
Profissional responsável pela instalação e configuração de software e hardware. A Análise de Suporte é uma atividade muito abrangente, que inclui desde as tarefas mais simples, como suporte ao usuário de Windows e Office, por exemplo, até as mais especializadas, como suporte a servidores.
82
1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Aula 7 • Computação Básica
Suas principais atividades envolvem instalação e configuração de ambiente para o usuário (incluindo sistemas operacionais e principais aplicativos); instalação e configuração de servidores; desenho da rede interna da empresa.
g) Auditor de Sistemas
Profissional encarregado em auditar sistemas e redes corporativas, identificando fraudes e outros tipos de irregularidade, além de analisar políticas e investimentos necessários para a estrutura de informática do cliente.
Suas principais atividades envolvem a definição de estruturas de controles internos, identificar e quantificar fraudes, analisar investimentos 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 computadores, 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-estrutura de telefonia celular etc.).
Suas principais atividades envolvem concepção e análise de projetos, elaboração de relatórios técnicos detalhados, coordenação de suporte e de manutenção de hardware e, eventualmente, elaboração de protótipos.
i) Engenheiro de Software
Profissional responsável por criar, manter e auditar metodologias de desenvolvimento de sistemas em uma empresa.
Suas principais atividades envolvem criação, manutenção e auditoria de metodologias de desenvolvimento de sistemas; acompanhamento das métricas de desempenho e qualidade dos produtos gerados, comparando-as com as métricas-padrão do mercado; adequação do padrão de qualidade e desempenho dos projetos e produtos gerados com um planejamento financeiro, dentro da capacidade financeira da empresa; e seleção e triagem de produtos e serviços da área de software e sistemas que a empresa venha buscar externamente.
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO
83
Aula 7 • Computação Básica
j) Engenheiro de Telecomunicações Profissional que monta, opera e faz manutenção de redes. Na área comercial, cria e adapta serviços de telecomunicação para clientes corporativos. Em planejamento, o profissional cria as redes que poderão dar suporte aos serviços obtidos pela área comercial. Suas principais atividades são a de manter em funcionamento o equipamento, 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 tecnologias 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, manutenção de páginas, digitalização e tratamento de imagens, diagramaçã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 diferente do desenvolvimento de sistemas para desktop ou cliente-servidor. Suas principais atividades envolvem a análise de requisitos dos clientes, análise de sistema, modelagem de banco de dados, estimativas de tempo de desenvolvimento, codificação e testes.
84
1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Aula 7 • Computação Básica
o) Webmaster Responsável pela estrutura, desenvolvimento, design e gerência de sites, gerencia uma equipe envolvida com o ambiente Web, desde a infra-estrutura até o desenvolvimento de sites completos.
7.2 A regulamentação das profissões no Brasil As profissões de Informática são, hoje, umas das poucas que ainda não possuem um órgão regulamentador. Ao contrário do que ocorre com as profissões da área de Direito, Medicina, Odontologia, Contabilidade, Jornalismo, Administração, entre outras, qualquer pessoa que acredite possuir conhecimento 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 tentativa de se apropriar de atribuições profissionais que até o presente foram exercidas livremente no país. Várias tentativas foram feitas para solidificar esta profissão como algo independente 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 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 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 materiais, 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 computacional que ele estava utilizando, quando, na verdade, o profissional que projetou e implementou aquele sistema (que deve ser da área de Informática) é quem deveria assumir tal responsabilidade.
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO
85
Aula 7 • Computação Básica
7.2.1 O Projeto de Lei Há quase 10 anos, desde a proposição inicial do projeto, tramita na Câmara dos Deputados o Projeto de Lei 7.109/06, de autoria do deputado Bonifácio Andrada (PSDB-MG), que dispõe sobre a regulamentação do exercí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 regulamentar 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 diferenciadas, 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 manutenção dos programas.
86
1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Aula 7 • Computação Básica
A partir das formações de nível superior anteriormente mencionadas, que podem ser encontradas nas mais diversas universidades do Brasil, podemos escolher algumas áreas específicas de atuação, tais como: • Administrador de Banco de Dados: responsável pela manutenção e refinamento de bancos de dados corporativos; • Administrador de Redes: responsável pela instalação, configuração e manutenção dos sistemas operacionais e de todos os serviços implementados; • Analista de Segurança: responsável pela segurança da rede, monitorando 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 implementar 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 corporativas, 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 metodologias de desenvolvimento de sistemas em uma empresa; • Engenheiro de Telecomunicações: monta, opera e faz manutenção de redes. Na área comercial, cria e adapta serviços de telecomunicação para clientes corporativos; • Programador Web: responsável pelo desenvolvimento de aplicações para Web; • Técnico em Hardware: faz a manutenção da estrutura de hardware de uma empresa, identifica a causa de problemas nas máquinas e soluciona os físicos; • Webdesigner: responsável pela criação e adaptação de identidade visual, manutenção de páginas, digitalização e tratamento de imagens, diagramação, animações e confecção de banners;
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO
87
Aula 7 • Computação Básica
• Webdeveloper: desenvolvimento para Web. Utiliza o Webdevelopment como uma especialização da programação normal, ajustando-a às características próprias da Web; • Webmaster: responsável pela estrutura, desenvolvimento, design e gerência de sites, gerencia uma equipe envolvida com o ambiente Web, desde a infra-estrutura até o desenvolvimento de sites completos. Você pôde entender que as profissões de informática são, hoje, umas das poucas que ainda não possuem um órgão regulamentador. Entendeu que a informática brasileira enfrenta hoje um sério e real problema: conselhos de outras profissões já estabelecidas estão avançando sobre a área na tentativa de se apropriar de atribuições profissionais que até o presente foram exercidas livremente no país. Pôde compreender também que um dos motivos que levam a pensar sobre a regulamentação da informática é acabar com a concorrência injusta de pessoas que fazem cursos de curta duração e já saem exercendo atividades nesta área e também a proteção da sociedade contra falsos profissionais, garantindo assim que, ao se contratar algum serviço, tenha-se certeza de que aquele profissional está qualificado a prestá-lo, e que ele será responsável por quaisquer danos. Você tomou conhecimento que existem alguns Projetos de Lei há quase dez anos. Desde a proposição inicial do projeto, tramita na Câmara dos Deputados o Projeto de Lei 7.109/06, de autoria do deputado Bonifácio Andrada (PSDB-MG), que dispõe sobre a regulamentação do exercício das profissões de Informática, cria o Conselho Federal, os Conselhos Regionais e outras providências.
Atividades 1. Analise as assertivas e destaque, entre as atribuições de um profissional que obteve a formação em Engenharia da Computação, qual(is) podemos citar. I. Trata de assuntos relativos à hardware (máquinas) que trabalham isoladamente (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 computadores e periféricos. Projeta e constrói alguns tipos de hardware. III. Atua na concepção, na aplicação e na manutenção dos programas e aplicativos. IV. Planejamento e administração da rede de computadores de uma empresa também estão entre suas atribuições.
88
1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Aula 7 • Computação Básica
Assinale a alternativa incorreta: a) Somente I e IV estão corretas. b) I, II e III estão corretas. c) Somente a III está incorreta. d) Todas as alternativas estão corretas. 2. A respeito da regulamentação profissões da área de informática, podemos afirmar que: I. as profissões de Informática são, hoje, umas das poucas que ainda não possuem um órgão regulamentador, ao contrário do que ocorre com as profissões da área de Direito, Medicina, Odontologia, Contabilidade, Jornalismo, Administração, entre outras; II. a regulamentação de uma profissão tem como objetivo a proteção da sociedade contra falsos profissionais, garantindo assim que, ao se contratar algum serviço, tenha-se certeza de que aquele profissional está qualificado a prestá-lo, e que ele será responsável por quaisquer danos; III. são alguns Projetos de Lei com tentativas de regulamentar a profissão: PL815/1995, PL 2194/1996 em 01/agosto/1996, PL 981/1999 em 20/ maio/1999, PL 1947/2003 em 09/setembro/2003, PL 7109/2006; IV. a informática brasileira enfrenta hoje um sério e real problema, no qual os conselhos de outras profissões já estabelecidas estão tentando se apropriar de atribuições profissionais da área de informática. Assinale a alternativa incorreta: a) Somente I e IV estão corretas. b) Somente I, III e IV estão corretas. c) Somente a I está incorreta. d) Todas as alternativas estão corretas. 3. Leia atentamente as afirmações, assinalando com um (V) as afirmativas verdadeiras e com (F) as falsas. ( )
Um Administrador de Banco de Dados é o responsável pela manutenção e refinamento de bancos de dados corporativos.
( ) O Analista de Segurança é o responsável pela segurança da rede (equipamento, sistemas operacionais de servidores e clientes e programas utilizados). Também monitora tentativas de invasão e
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO
89
Aula 7 • Computação Básica
uso indevido dos recursos da rede, além de definir e manter as regras de uso dos recursos computacionais da empresa. ( ) Analista de Sistemas é o responsável pelo levantamento das necessidades 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, configuração e manutenção dos sistemas operacionais e de todos os serviços implementados, além da configuração e manutenção do nível de segurança da rede. Agora, assinale a alternativa que corresponde à sua resposta. a) V, V, F, V b) F, V, F, V c) F, F, V, V d) V, V, V, F 4. Ainda sobre as áreas de atuação dos profissionais de informática, indique a alternativa incorreta quanto às atribuições de cada profissional. a) Webmaster é o responsável pela estrutura, desenvolvimento, design e gerência de sites, gerencia uma equipe envolvida com o ambiente Web, desde a infra-estrutura até o desenvolvimento de sites completos. b) Engenheiro de Software Profissional é responsável pela instalação e configuração de software e hardware; instalação e configuração de ambiente para o usuário (incluindo sistemas operacionais e principais aplicativos); instalação e configuração de servidores; e desenho da rede interna da empresa. c) O Engenheiro de Telecomunicações é o profissional que monta, opera e faz manutenção de redes. Na área comercial, cria e adapta serviços de telecomunicação para clientes corporativos. Em planejamento, o profissional cria as redes que poderão dar suporte aos serviços obtidos pela área comercial.
90
1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Aula 7 • Computação Básica
d) Engenheiro de Hardware é o profissional responsável por conceber projetos hardware para computadores, telecomunicações e outros tipos de equipamento eletrônico.
Comentário das atividades Para a atividade 1, se você escolheu a opção (c), você acertou! Isso mesmo, a concepção, na aplicação e na manutenção dos programas e aplicativos é uma atribuição própria do Analista de Sistemas, o Engenheiro de Computação atua principalmente nas áreas relativas a hardware de equipamentos 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 informá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çoamento 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 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étricaspadrão do mercado.
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO
91
Aula 7 • Computação Básica
Referências ALMEIDA, Marcus Garcia de. Fundamentos de Informática. 2. ed. Rio de Janeiro: Brasport, 2002. BROOKSHEAR, J. Glenn. Ciência da Computação: uma visão abrangente. 7. ed. Porto Alegre: Bookman, 2004. MARÇULA, Marcelo; BENINI FILHO, Pio Armando. Informática: conceitos e aplicações. São Paulo: Érica, 2005. POLLONI. Enrico G. F.; FEDELI, Ricardo Daniel; PERES, Fernando Eduardo. Introdução à Ciência da Computação. São Paulo: Thomson, 2003. VELLOSO, Fernando de Castro. Informática: conceitos básicos. 7. ed. Rio de Janeiro: Campus, 2004.
Anotações
92
1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
EQUIPE UNITINS Organização de Conteúdos Acadêmicos Silvio Costa Sampaio Coordenação Editorial Maria Lourdes F. G. Aires Assessoria Editorial Darlene Teixeira Castro Assessoria Produção Gráfica Katia Gomes da Silva Revisão Didático-Pedagógica Sibele Letícia Rodrigues de Oliveira Biazotto Revisão Lingüístico-Textual Sibele Letícia Rodrigues de Oliveira Biazotto Revisão Digital Sibele Letícia Rodrigues de Oliveira Biazotto Projeto Gráfico Douglas Donizeti Soares Irenides Teixeira Katia Gomes da Silva Ilustração Geuvar S. de Oliveira Capa Igor Flávio Souza
Créditos
Equipe Fael Coordenação Editorial Leociléa Aparecida Vieira Assessoria Editorial William Marlos da Costa Revisão Juliana Camargo Horning Lisiane Marcele dos Santos Programação Visual e Diagramação Denise Pires Pierin Kátia Cristina Oliveira dos Santos Rodrigo Santos Sandro Niemicz William Marlos da Costa
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. 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 expressõ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 flexibilidade, escrita compacta, padronização bem feita e alta velocidade de processamento. Por essas características, essa linguagem é tão popular. Bons estudos! Prof. Silvio Costa Sampaio
Apresentação
Conhecer suas principais estruturas e detalhes requer um estudo criterioso e
EMENTA Programação em Linguagem C. Estruturas de dados homogêneas e heterogêneas. Modularização de Algoritmos.
Plano de Ensino
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
BIBLIOGRAFIA ASCENCIO, Ana Fernanda Gomes; CAMPOS, Edilene Aparecida Veneruchi de. Fundamentos da programação de computadores: Algoritmos, Pascal e C/ C++. São Paulo: Pearson Prentice Hall, 2003. DEITEL, H. M.; DEITEL, P. J. Como programar em C. Rio de Janeiro: LTC, 1999. MIZRAHI, V. V. Treinamento em Linguagem C: Módulos 1 e 2. São Paulo: Makron Books do Brasil, 1993. ORTH, Afonso Inácio. Algoritmos e programação com resumo das Linguagens Pascal e C. Porto Alegre: AIO, 2001. ZIVIANI, Nivio. Projeto de Algoritmos: com implementações em Pascal e C. 2. ed. São Paulo: Thomson, 2004.
UNITINS • Análise e desenvolvimento de sistemas • 1º PERÍODO
97
Aula 1 • Algoritmos e Programação
Aula 1 Introdução à programação em Linguagem C Objetivos Esperamos que, ao final desta aula, você seja capaz de: • conhecer os conceitos fundamentais da Linguagem C; • construir um programa básico em C.
Pré-requisitos Para atingir os objetivos desta aula, você deve possuir conhecimento prévio de técnicas de criação de algoritmos, particularmente de pseudocódigo. Isso é necessário, na verdade, para todas as aulas que compõem este caderno, pois ao longo do texto são feitas referências aos conceitos estudados nas aulas de Lógica para Programação. Procure sempre relacionar os conteúdos estudados nesta disciplina com as outras.
Introdução O histórico da Linguagem C tem início em 1970, quando o programador Denis Ritchie desenha uma linguagem, nos laboratórios da Bell Telephones, Inc., chamada simplesmente de B. No ano de 1978, Brian Kerningham junta-se a Ritchie para aprimorar a Linguagem B e acabam gerando uma nova versão. À nova versão foi dado o nome de C. Por suas características de portabilidade e estruturação mais compacta, a Linguagem C se torna popular entre os programadores. Em meados de 1980, a linguagem C é padronizada pelo American National Standard Institute: surge o ANSI C. Em 1990, a empresa de software Borland International Co., fabricante de compiladores profissionais, escolhe o C e o Pascal como linguagens de trabalho para o seu Integrated Development Enviroment (Ambiente Integrado de Desenvolvimento): surge o Turbo C.
UNITINS • Análise e desenvolvimento de sistemas • 1º PERÍODO
99
Aula 1 • Algoritmos e Programação
O Turbo C implementa funções específicas para o ambiente Windows, fugindo à especificação ANSI C. Isso dá origem, no meio técnico, a uma divisão da Linguagem C em dois padrões de codificação distintos: o ANSI C e Borland C. Neste caderno, estudaremos as definições segundo o padrão ANSI C. A Linguagem C apresenta uma gama relativamente grande de tipos de variáveis. Permite ainda a criação de estruturas de dados não homogêneas, como os registros. Outra característica marcante dessa linguagem é o seu extenso acesso ao hardware, permitindo a programação em baixo nível. Na verdade, a Linguagem C é bastante pequena quando comparada a outras da sua época. Isso é possível, pois no C os aspectos não indispensáveis da linguagem são implementados como uma biblioteca de funções, que pode ser estendida pelo programador. As idéias por trás de C são tão simplificadoras e naturais que ela serve de base para outras linguagens. Muitos compiladores e ambientes de desenvolvimento (IDE) de outras linguagens são implementados em Linguagem C. Nesta aula, serão abordados os conceitos fundamentais da programação em Linguagem C. Estudaremos os detalhes básicos de um programa codificado nessa linguagem. Esta aula é de fundamental importância para se iniciar na programação usando essa linguagem.
1.1 Estrutura de um programa em C Um programa em C é constituído, normalmente, de: • cabeçalho: contém as diretivas de compilador em que se definem o valor de constantes simbólicas, declaração de variáveis, inclusão de bibliotecas, declaração de rotinas, etc.; • bloco de instruções principal e outros blocos de rotinas; • documentação do programa: comentários. A seguir, cada parte fundamental de um programa em C é discutida. 1.1.1 Conjunto de caracteres válido Um programa fonte em C é, na prática, um texto não formatado escrito em um editor de textos usando um conjunto padrão de caracteres ASCII. Como característica de cada linguagem é definido o conjunto de caracteres que poderão ser usados nesse arquivo fonte.
100
1º PERÍODO • Análise e desenvolvimento de sistemas • UNITINS
Aula 1 • Algoritmos e Programação
A seguir, estão os caracteres permitidos na linguagem C.
Caracteres válidos: abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ 1234567890 +-*/\=|&!?#%(){}[]_‘“.,:
O uso de algum caractere inválido (fora desse conjunto) dará origem a um erro na geração do programa. Por isso, é muito importante conhecer esse conjunto de caracteres antes de iniciar a codificação em qualquer linguagem. 1.1.2 Palavras-chave São identificadores que não podem ser usados pelo usuário – para identificar uma variável ou função, por exemplo, e também são ou constituem partes de comandos ou declarações da linguagem. As palavras-chave são bem poucas, se compararmos com o número de comandos de outras linguagens como PASCAL. A seguir, são listadas todas as palavras-chave da Linguagem C (SILVEIRA FILHO, 1997).
auto
double
int
struct
break
else
long
switch
case
enum
register
typedef
char
extern
return
union
const
float
short
unsigned
continue
for
signed
void
default
goto
sizeof
volatile
do
if
static
while
Esse conjunto de palavras-chave pode variar de compilador para compilador, podendo ter algumas palavras extras, específicas de cada compilador. Porém o uso de palavras-chave fora do padrão poderá criar problemas, caso você queira que um determinado programa construído por você possa ser levado de um compilador para outro ou mesmo para outra
UNITINS • Análise e desenvolvimento de sistemas • 1º PERÍODO
101
Aula 1 • Algoritmos e Programação
máquina. A essa característica de podermos migrar um programa com um mínimo de modificações chamamos de portabilidade. Se você pretende fazer com que seu programa seja o mais portável possível, evite o uso de palavras-chave diferentes das anteriores. Cabe ressaltar que todas as palavras-chave na Linguagem C devem ser escritas em letra minúscula. O C distingue as letras minúsculas de maiúsculas. A essa característica chamamos de case-sensitive. Com isso, os identificadores int e Int são considerados identificadores diferentes pelo compilador. 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 identificado 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 compilador entende que todo o trecho que estiver à direita da linha deve ser considerado como comentário; • caso o trecho a ser comentado ocupe mais de uma linha, é necessário delimitar o início e o final do comentário. Para indicar o início de um comentário, você deve usar o caractere barra seguido do caractere asterisco. Para indicar o final de um comentário, você deve usar o caractere asterisco seguido de um caractere barra.
102
1º PERÍODO • Análise e desenvolvimento de sistemas • UNITINS
Aula 1 • Algoritmos e Programação
O exemplo a seguir mostra trechos de comentário nas duas formas citadas. // Comentário de uma linha /* Esse programa foi desenvolvido pelo Fulano de Tal Blá, blá, blá */ 1.1.4 Diretivas de compilação Na Linguagem C, existem comandos que não denotam instruções e são processados apenas durante a compilação do programa. Esses comandos são chamados de diretivas de compilação. Esses comandos informam ao compilador do C as opções que deverão ser utilizadas na geração do programa. A diretiva #include, por exemplo, informa ao compilador para incluir na compilação do programa outros arquivos que incluem códigos ou definiçõ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 , 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 ”; caso contrário, o compilador não irá reconhecer as funções usadas no programa. Infelizmente, nesse caderno não é possível apresentar todo o conjunto de bibliotecas do C. Mas você deve conhecê-lo!
UNITINS • Análise e desenvolvimento de sistemas • 1º PERÍODO
103
Aula 1 • Algoritmos e Programação
1.1.5 Declaração de variáveis e constantes As variáveis no C devem ser declaradas antes de serem usadas. É na declaração de uma variável que devemos explicitar qual o seu tipo e indicar ao computador a necessidade de reservar um espaço em memória para conter o valor para essa variável. Em C, uma variável deve ser sempre declarada usando a seguinte sintaxe: [, ...];. 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 identificador de variável nem o mesmo identificador de uma palavra-chave nem o de uma função já definida em uma biblioteca ou no próprio programa. 1.1.5.1 Tipos de dados e modificadores As diferenças entre os tipos de variáveis do pseudocódigo para o C são: o tipo inteiro é mapeado para int; o tipo real é mapeado para float ou double; e o tipo caractere é mapeado para char. A Linguagem C ainda permite alterar a precisão dos valores com a utilização de modificadores e com isso acaba definindo novos tipos de dados. A seguir, são listados os modificadores de tipo usados na Linguagem C.
104
1º PERÍODO • Análise e desenvolvimento de sistemas • UNITINS
Aula 1 • Algoritmos e Programação
Tipo de dado
Tamanho (em bits)
Capacidade de representação
Char
8
-127 a 127
unsigned char
8
0 a 255
signed char
8
-127 a 127
Int
16
-32767 a 32767
unsigned int
16
0 a 65.535
signed int
16
-32767 a 32767
short int
16
-32767 a 32767
unsigned short int
16
0 a 65.535
signed short int
16
-32767 a 32767
long int
32
-2.147.483.647 a 2.147.483.647
signed long int
32
-2.147.483.647 a 2.147.483.647
unsigned long int
32
0 a 4.294.967.295
Float
32
seis dígitos de precisão
Double
64
dez dígitos de precisão
80
dez dígitos de precisão
long double Fonte: Feitosa (2004).
1.1.5.2 Escopo de uma variável O escopo de uma variável define a visibilidade de uma variável, ou seja, onde ela pode ser referenciada em seu programa. Na Linguagem C, uma variável pode assumir um de três escopos: • variáveis locais: é declarada dentro de um bloco de código, sendo apenas visível dentro dele; • variáveis não locais: variáveis declaradas em um bloco que contenha outro bloco dentro de si são chamadas de não locais quando estiverem no bloco mais interno, no entanto continuam sendo visíveis; • variáveis globais: uma variável declarada fora de todas as funções é também chamada de variável global. Normalmente, você irá utilizar variáveis globais quando um valor precisar ser conhecido e manipulado em várias partes do programa. Já as variáveis locais serão utilizadas quando a variável tem uma função específica dentro de um bloco de comandos (por exemplo, contador de repetição). 1.1.5.3 Constantes Constantes são valores que são mantidos fixos pelo compilador. Para o C, uma constante pode ter quatro classificações. Vejamos.
UNITINS • Análise e desenvolvimento de sistemas • 1º PERÍODO
105
Aula 1 • Algoritmos e Programação
• Constante de um tipo básico: esse é o tipo de constante mais comum em um programa em C. Essas constantes derivam de um tipo de dado básico da linguagem. A listagem a seguir apresenta essas constantes. Tipo de Dado Char Int long int short int unsigned int Float Double
Exemplos ‘a’ ‘\0’ ‘\t’ 5 2345 -17 234000 -509876 120 -12 50000 35678 0.0 23.7 -12.3e-10 12546354334.0 - 0.0000034236556
• Constante hexadecimal ou octal: em alguns casos, precisamos utilizar valores constantes hexadecimais (base dezesseis) ou octais (base oito) no programa. A linguagem C permite o uso de constantes desse tipo, no qual uma constante hexadecimal inicia com 0x e uma octal com 0. Por exemplo, os valores 0xF2 e 0362 representam o valor 242 (em decimal) em hexadecimal e octal; • Constante string: para a linguagem C, uma string é uma variável do tipo literal, ou seja, um conjunto de caracteres. Uma constante string é delimitada por um par de aspas. Por exemplo, uma string “Florianópolis” é, na verdade, uma constante string; • Constante de formatação: essas constantes, também conhecidas como constantes de barra invertida, são usadas para formatar a saída de dados. Essas constantes são usadas como um caractere comum, por exemplo ‘\t’ para a tabulação horizontal. A listagem a seguir apresenta a lista dessas constantes.
106
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
1º PERÍODO • Análise e desenvolvimento de sistemas • UNITINS
Aula 1 • Algoritmos e Programação
\a
Sinal sonoro (beep)
\N
Constante octal (N é o valor da constante)
\xN
Constante hexadecimal (N é o valor da constante)
1.1.6 A função principal main() Todo programa em C tem de ter uma função main (principal, em inglês). É essa função que será chamada quando o programa for executado. Assim, é a partir dessa função que invocamos as demais funções do nosso programa. A declaração da função main() pode conter parâmetros formais. Mas a definição desses parâmetros é determinada pela linguagem, não podendo ser alterada – 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 diretamente 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; }
UNITINS • Análise e desenvolvimento de sistemas • 1º PERÍODO
107
Aula 1 • Algoritmos e Programação
1.1.8 Entrada e saída de dados A Linguagem C oferece um grande conjunto de funções que permite ler valores dos dispositivos de entrada e escrever nos dispositivos de saída. Iremos estudar as mais utilizadas. 1.1.8.1 Lendo um caractere do teclado Para ler um caractere do teclado, utilize a função getchar(). Ela faz parte do arquivo de cabeçalho stdio.h. Sua utilização é: variavel = getchar(); Essa função retorna o valor inteiro referente ao código ASCII do caractere lido, porém você pode atribuir esse valor a uma variável do tipo caractere. Caso ocorra um erro, ela retorna EOF. 1.1.8.2 Exibindo um caractere Para exibir um caractere, você pode usar a função putchar(), que está no arquivo de cabeçalho stdio.h. Sua sintaxe é: putchar(variavel) em que variável é um número inteiro, porém você pode passar variável como um caractere. putchar retorna o caractere exibido ou EOF, caso ocorra algum erro. 1.1.8.3 Lendo uma string do teclado Você pode ler uma string do teclado usando as funções gets() e fgets(). Elas fazem parte do arquivo de cabeçalho stdio.h. Alguns compiladores C, como o gcc, desencorajam o uso da função gets., por causa de um problema conhecido como bufferoverflow (estouro de buffer, em inglês). A própria man page, do gcc em Linux, para a função gets, explica o problema em sua seção PROBLEMAS. Vejamos. Nunca use gets(). Porque é impossível saber, sem conhecer antecipadamente os dados, quantos caracteres gets() vai ler, e porque gets() vai continuar a guardar caracteres ultrapassado o fim do ‘buffer’, ela é extremamente perigosa de usar. Esse comportamento tem sido utilizado para quebrar a segurança de computadores. Use fgets() no seu lugar (DIAS NETO, [200-]).
Abordaremos apenas o uso e a sintaxe da função fgets(), que substitui a função gets() na leitura de string. É a seguinte:
108
1º PERÍODO • Análise e desenvolvimento de sistemas • UNITINS
Aula 1 • Algoritmos e Programação
fgets (STRING,TAMANHO,STREAM), em que: • STRING é a variável onde a string será armazenada; • TAMANHO é o tamanho máximo da string; • STREAM é de onde os caracteres serão lidos, para ler do teclado o valor padrão para isso é stdin. 1.1.8.4 Exibindo uma string Você pode exibir uma string usando a função printf ou a função puts(). Elas fazem parte do arquivo de cabeçalho stdio.h. A sintaxe de printf para a exibir uma string é: printf(“%s”,STRING); A sintaxe de puts é: puts(string) 1.1.8.5 Saída formatada (printf) A saída formatada é feita utilizando a função printf vista anteriormente. A sintaxe geral do comando printf é: printf (“”,), em que: • 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 %d %o %x %X %u %ld %f %c %e %E
Formato inteiro inteiro em formato octal inteiro em formato hexadecimal unsigned int long int float char float em formato exponencial
UNITINS • Análise e desenvolvimento de sistemas • 1º PERÍODO
109
Aula 1 • Algoritmos e Programação
Especificador
Formato
%g
float. C escolhe melhor maneira de exibição entre normal e exponencial %G %s string %p endereço de um ponteiro %n quantos caracteres a função printf exibiu Fonte: Dias Neto ([200-]).
• a é 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(“”,&variável) 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 estrutura de um programa básico em C, como mostrado no código a seguir: #include /* 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 diz ao compilador para incluir a biblioteca stdio;
110
1º PERÍODO • Análise e desenvolvimento de sistemas • UNITINS
Aula 1 • Algoritmos e Programação
• um bloco de instruções principal: nesse caso, todo o bloco delimitado pelo par de chaves; • documentação do programa: em nosso exemplo, temos o comentá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 indica ao compilador C que as declarações de funções da biblioteca “stdio” devem ser usadas nesse programa. c) 0x123 representa uma constante em hexadecimal. d) Considerando a declaração anterior “int valor;”, a instrução printf (“%s”, valor) deve ser usada para imprimir a variável valor. e) A função main() pode receber parâmetros da linha de comando. 2. Construa um programa básico em C que leia uma variável inteira, outra real do teclado e imprima o valor digitado.
Comentário das atividades Na atividade 1, com base no que foi estudado nesta aula, você deveria ter concluído que a única opção incorreta é a opção (d), pois nessa opção a variável valor é declarada como um inteiro e, portanto, a impressão do seu valor deveria usar o string de formatação “%d”, e não “%s” como argumento para a função printf; a opção (a) está correta, pois todo programa em C deve possuir uma função main ( ), uma vez que essa é a função principal do programa; a opção (b) também está correta, pois a diretiva #include é usada
UNITINS • Análise e desenvolvimento de sistemas • 1º PERÍODO
111
Aula 1 • Algoritmos e Programação
justamente para inserir definições de bibliotecas do compilador ou criadas pelo próprio programador; a opção (c) está correta, pois em C uma constante hexadecimal 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 entendido os principais elementos de um programa em Linguagem C. Uma solução possível para essa atividade seria: #include int main() {
int var1;
float var2;
printf (“\nInforme o valor inteiro: “);
scanf (“%d”, &var1);
printf (“\nInforme o valor real: “);
scanf (“%f”, &var2);
printf (“\nValor inteiro: %d”, var1);
printf (“\Valor real: %f”, var2);
}
Referências ASCENCIO, Ana Fernanda Gomes; CAMPOS, Edilene Aparecida Veneruchi de. Fundamentos da programação de computadores: algoritmos, Pascal e C/ C++. São Paulo: Pearson Prentice Hall, 2003. DEITEL, H. M.; DEITEL, P. J. Como programar em C. Rio de Janeiro: LTC, 1999. DIAS NETO, Samuel. Linguagem C: intermediário. [S.l.: s.n.]: [200-]. Disponível em: . 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: . Acesso em: 20 dez. 2007. MIZRAHI, V. V. Treinamento em Linguagem C: Módulos 1 e 2. São Paulo: Makron Books do Brasil, 1993. ORTH, Afonso Inácio. Algoritmos e programação com resumo das Linguagens Pascal e C. Porto Alegre: AIO, 2001.
112
1º PERÍODO • Análise e desenvolvimento de sistemas • UNITINS
Aula 1 • Algoritmos e Programação
SILVEIRA FILHO, Otton Teixeira da. Linguagem C. [Niterói]: Universidade Federal Fluminense. Departamento de Ciência da Computação, 1997. Disponível em: . Acesso em: 20 dez. 2007. ZIVIANI, Nivio. Projeto de algoritmos: com implementações em Pascal e C. 2. ed. São Paulo: Thomson, 2004.
Na próxima aula Estudaremos os operadores disponíveis na Linguagem C. O conhecimento dos operadores de uma linguagem permite a construção de expressões nessa linguagem. E as expressões representam a maior parte das instruções em um programa de computador.
Anotações
UNITINS • Análise e desenvolvimento de sistemas • 1º PERÍODO
113
Aula 1 • Algoritmos e Programação
114
1º PERÍODO • Análise e desenvolvimento de sistemas • UNITINS
Aula 2 • Algoritmos e Programação
Aula 2 Operadores Objetivos Esperamos que, ao final desta aula, você seja capaz de: • reconhecer e utilizar os principais operadores usados na Linguagem C; • construir corretamente expressões aritméticas e lógicas nessa linguagem.
Pré-requisitos Como principal pré-requisito para esta aula, é fundamental que você tenha entendido os conceitos apresentados na aula anterior, principalmente o que diz respeito à declaração e uso de variáveis e constantes. Se houver dúvidas, retomes seus estudos e consulte a web-tutoria.
Introdução Operadores são elementos funcionais que atuam sobre termos e produzem um determinado resultado. Os operadores são, na prática, instruções especiais pelas quais incrementamos, 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, estudaremos cada um desses operadores.
2.1 Aritméticos Os operadores aritméticos são usados para desenvolver operações matemáticas. Observe, na listagem a seguir, os operadores aritméticos permitidos na Linguagem C.
UNITINS • Análise e desenvolvimento de sistemas • 1º PERÍODO
115
Aula 2 • Algoritmos e Programação
Operador + – * / % ++ --
Ação Soma (inteira e ponto flutuante) Subtração ou troca de sinal (inteira e ponto flutuante) Multiplicação (inteira e ponto flutuante) Divisão (inteira e ponto flutuante) Resto de divisão (de inteiros) Incremento (inteiro e ponto flutuante) Decremento (inteiro e ponto flutuante)
Fonte: UFMG. Centro de Pesquisa e Desenvolvimento em Engenharia Elétrica (CPDEE) (1996-1999).
Em C, os operadores são classificados em unário ou binário. Um operador unário age sobre uma variável apenas, modificando ou não o seu valor, e retornam o valor final da variável. Os binários usam duas variáveis e retornam um terceiro valor, sem alterar o valor das variáveis originais. O operador de multiplicação é um exemplo de operador binário, enquanto o incremento é um exemplo de operador unário. Cabe ressaltar que o operador de divisão, quando aplicado a variáveis inteiras, retornará um valor também inteiro; quando aplicado a variáveis em ponto flutuante, será retornado um valor em ponto flutuante, mesmo que uma das variáveis seja do tipo inteiro.
2.2 Lógicos Na Linguagem C, não há definição do tipo de dado lógico, assim a interpretação do verdadeiro lógico é dada por qualquer valor maior do que zero. Obviamente, o falso lógico é qualquer valor menor ou igual a zero. Portanto, os operadores lógicos irão operar sobre quaisquer variáveis, dando uma resposta correspondente à condição examinada. Os operadores lógicos em C são os listados a seguir. Operador && || !
Ação E lógico (do inglês AND) OU lógico (do inglês OR) NÃO lógico (do inglês NOT)
2.3 Relacionais Os operadores relacionais são utilizados para comparar os valores de duas expressões em um programa, retornando um valor “lógico”.
116
1º PERÍODO • Análise e desenvolvimento de sistemas • UNITINS
Aula 2 • Algoritmos e Programação
São operadores relacionais na linguagem C os listados a seguir. Operador > < >=
! ~ ++ -- . –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 & | ~ ^ >> > quantidade de bits ou valor 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 () . 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 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 anteriormente, uma divisão entre dois valores inteiros no C sempre retorna outro valor inteiro. Isso faria com que o programa dê o resultado incorreto igual a 3.00, ainda que a saída esteja formatada para imprimir um tipo float (“%f”). Para resolver esse caso, foi utilizado o modificador (float) para dizer ao compilador que o resultado da expressão deverá ser retornado como um float. Com isso, o programa irá imprimir o valor correto igual a 3.3333....
2.9 Operadores de endereços Esses operadores serão apenas apresentados, pois serão abordados em diferentes aulas e temas, como Vetores, Ponteiros e Estruturas. A maneira de utilizar cada um será vista em detalhe. Os operadores de endereços em C são os a seguir.
120
1º PERÍODO • Análise e desenvolvimento de sistemas • UNITINS
Aula 2 • Algoritmos e Programação
Operador &
Ação “o endereço de” Ex.: na instrução x = &y, a variável x irá receber o endereço da variável y. Esse operador será discutido na aula sobre Ponteiros.
*
“o conteúdo de” Ex.: na instrução x = *y, a variável x irá receber o conteúdo do endereço de memória apontado pela variável y. Esse operador será discutido na aula sobre Ponteiros.
[]
“no endereço de ... mais um índice” Ex.: na instrução valor = vetor[6], a variável valor recebe o valor da posição de memória apontada pela variável vetor, deslocando 6 unidades. Esse operador será discutido na aula sobre Vetores.
.
(operador ponto) “elemento da estrutura” ou “campo”. Esse operador será discutido na aula sobre Estruturas.
->
(operador seta) “elemento da estrutura apontada por”. Esse operador será discutido na aula sobre Estruturas.
Síntese da aula Nesta aula, foram apresentados os principais operadores disponíveis na Linguagem C. É muito importante que você conheça e saiba utilizar esses operadores na construção de expressões nessa linguagem.
Atividades 1. Supondo o seguinte trecho de código: int x, y; x = 35; y = x/2; É incorreto afirmar que, após a execução desse trecho: a) a expressão (x+y) retorna um valor inteiro;
UNITINS • Análise e desenvolvimento de sistemas • 1º PERÍODO
121
Aula 2 • Algoritmos e Programação
b) a expressão (y*2 == x) retorna um valor que é considerado pelo C como verdadeiro; c) a expressão x*=2; atribui à variável x o valor 70; d) a expressão ((x < 50) && (y == 17)) retorna um valor que é considerado pelo C como verdadeiro; e) a expressão printf (“%d”, --x) irá imprimir o valor 34. 2. Comente o uso do modificador de tipo (cast) disponível na Linguagem C.
Comentário das atividades Na atividade 1, levando em consideração o que foi estudado sobre os operadores disponíveis na Linguagem C, você deveria ter concluído que a opção incorreta é a opção (b), pois vimos que o operador de divisão, quando aplicado a duas variáveis inteiras, sempre retorna um valor inteiro e, nesse caso, a variável y acaba recebendo o valor 17; logo, y*2 irá resultar em 34, que é diferente do valor da variável x; a opção (a) está correta, pois o operador de adição, quando aplicado a dois valores inteiros, sempre retorna um inteiro; a opção (c) também está correta, pois a instrução x*=2 é uma redução da expressão x=x*2 e, com isso, a variável x recebe o dobro do seu valor atual, nesse caso 70; a opção (d) também está correta, pois, se fatorarmos a solução dessa expressão, teremos ((x < 50) && (y == 17)) ↔ ((35 < 50) && (17 == 17)) ↔ (“verdadeiro” && “verdadeiro”) ↔ “verdadeiro”; e, por fim, a opção (e) está correta, pois a expressão printf (“%d”, --x) irá primeiro decrementar o valor de x (pré-incremento) e imprimir o valor resultante, nesse caso, 34. Na atividade 2, você deveria descrever que o modificador de tipo serve para forçar o compilador a converter o valor de uma expressão para um tipo específico. É muito útil em casos como o da divisão inteira, discutida nesta aula. Além disso, serve para evitar erros de incompatibilidade de tipos na atribuição, por exemplo.
Referências ASCENCIO, Ana Fernanda Gomes; CAMPOS, Edilene Aparecida Veneruchi de. Fundamentos da programação de computadores: Algoritmos, Pascal e C/C++. São Paulo: Pearson Prentice Hall, 2003. ORTH, Afonso Inácio. Algoritmos e programação com resumo das Linguagens Pascal e C. Porto Alegre: AIO, 2001.
122
1º PERÍODO • Análise e desenvolvimento de sistemas • UNITINS
Aula 2 • Algoritmos e Programação
UFMG. Centro de Pesquisa e Desenvolvimento em Engenharia Elétrica (CPDEE). Curso de Linguagem C: operadores aritméricos e de atribuição. [Belo Horizonte], 1996-1999. Disponível em: . Acesso em: 20 dez. 2007. ZIVIANI, Nivio. Projeto de Algoritmos: com implementações em Pascal e C. 2. ed. São Paulo: Thomson, 2004.
Na próxima aula Dando continuidade ao estudo da estrutura de um programa em Linguagem C, na próxima aula vamos estudar as principais estruturas de controle dessa linguagem. Essa aula será de fundamental importância para você entender como o fluxo de instruções pode ser controlado em um programa em C.
Anotações
UNITINS • Análise e desenvolvimento de sistemas • 1º PERÍODO
123
Aula 2 • Algoritmos e Programação
124
1º PERÍODO • Análise e desenvolvimento de sistemas • UNITINS
Aula 3 • Algoritmos e Programação
Aula 3 Estruturas de controle Objetivos Esperamos que, ao final desta aula, você seja capaz de: • compreender a importância de cada estrutura de controle disponível na Linguagem C; • construir programas em C usando as diferentes estruturas abordadas.
Pré-requisitos Pelo fato de o estudo da programação ser um processo acumulativo, como pré-requisito para esta aula é necessário que você tenha realmente entendido os conceitos discutidos nas aulas anteriores. Lembre-se de que a web-tutoria está sempre à sua disposição!
Introdução As estruturas de controle são a essência de qualquer linguagem de programação, uma vez que determinam a seqüência pela qual as instruções de um programa são executadas. Nesta aula, estudaremos a sintaxe de cada uma dessas estruturas na Linguagem C.
3.1 Estrutura seqüencial ou bloco Na Linguagem C, o ponto-e-vírgula é o terminador de instruções, ou seja, marca o encerramento de uma instrução. Um par de chaves { } é usado para agrupar instruções em instruções compostas ou blocos, de modo a serem sintaticamente equivalentes a uma instrução única. Assim, um bloco pode ser composto de:
UNITINS • Análise e desenvolvimento de sistemas • 1º PERÍODO
125
Aula 3 • Algoritmos e Programação
• uma única instrução; • um conjunto de instruções; • nenhuma instrução (instrução vazia). Uma instrução composta ou bloco tem a estrutura: { declarações (opcional) instruções }
3.2 Estrutura de decisão simples (if) Assim como estudado em Lógica para Programação, na Seleção Simples, uma instrução ou um conjunto de instruções é executado somente se o teste condicional especificado retornar o valor verdadeiro. Caso o resultado do teste seja falso, nenhuma das instruções delimitadas pela estrutura de seleção será executada e a execução das instruções será desviada para a instrução imediatamente seguinte à estrutura de seleção. O exemplo a seguir demonstra a utilização dessa estrutura: ALGORITMO Selecao_Simples;
#include
VAR N: Inteiro;
int main( ) {
INICIO
int N;
LEIA N;
scanf (“%d”, &N);
SE N>0 ENTAO
if (N > 0)
IMPRIMA N;
{
FIM SE
FIM
}
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).
126
1º PERÍODO • Análise e desenvolvimento de sistemas • UNITINS
Aula 3 • Algoritmos e Programação
O exemplo a seguir demonstra a utilização dessa estrutura. ALGORITMO Selecao_ Composta;
#include
VAR N: Inteiro;
int N;
INICIO
scanf (“%d”, &N);
LEIA N;
if (N > 0)
SE N>0 ENTAO
{
IMPRIMA N;
SENAO
}
IMPRIMA “O valor de N deve ser positivo”;
else
FIM SE
printf (“O valor de N deve ser positivo”);
FIM
int main( ) {
printf (“%d”, N);
{
} }
3.4 Estrutura de decisão encadeada (if..else..if) Em muitas situações, precisamos agrupar os testes a fim de realizar refinamentos nos parâmetros de seleção. Para esses casos, normalmente são utilizadas estruturas de seleção aninhadas. O exemplo a seguir demonstra a utilização dessa estrutura em C. ALGORITMO Selecao_Encadeada;
#include
VAR N: Inteiro;
int main() {
INICIO
int N;
LEIA N;
scanf (“%d”, &N);
SE N>0 ENTAO
if (N > 0)
{
SE N MOD 2 = 0 ENTAO IMPRIMA “ esse valor é par”; SENAO IMPRIMA “ esse valor é ímpar” FIM SE
SENAO
if (N % 2 == 0) {
printf (“%d”, N); }
} else
IMPRIMA “O valor de N deve ser { positivo”; printf (“O valor de N deve ser positivo”); FIM SE FIM
}
}
UNITINS • Análise e desenvolvimento de sistemas • 1º PERÍODO
127
Aula 3 • Algoritmos e Programação
Essa seqüência de else..if´s é uma maneira de implementar uma decisão múltipla. O computador avalia as condições de cima para baixo e, logo que encontre uma verdadeira, executa a instrução que lhe está associada, ignorando o resto da cadeia.
3.5 Estrutura de decisão múltipla (switch..case) Apesar de a instrução else..if permitir construir uma estrutura de escolha múltipla, o C fornece uma outra instrução, a instrução switch, que é específica para isso. Nela, é testada sucessivamente uma variável para verificar se coincide com uma lista de valores inteiros (ou caracteres). A sintaxe dessa instrução é: switch (variável) { case exp_1 : instr_1; break; case exp_2 : instr_2; break; ... default : instr_n; break; } Cada um dos casos é rotulado por uma ou mais constantes inteiras ou expressões com constantes, por exemplo, exp_1 pode ser um inteiro, um caractere ou uma expressão de constantes. Se a variável coincidir com um dos casos, a execução começa a partir desse ponto. Todos os rótulos têm de ser diferentes. O caso com rótulo default é executado se não houver mais nenhuma coincidência. O uso de default é opcional, se não for usado e nenhuma coincidência for encontrada, não será executada nenhuma ação. Como já foi visto, quando se verifica uma coincidência entre o valor da variável e um caso, a execução do programa prossegue a partir desse ponto, executando tudo o que vem a seguir, inclusive as instruções correspondentes aos casos posteriores. Para evitar que isso aconteça, você deve usar a instrução break, que força a saída imediata do switch. A razão pela qual a execução de um switch não se limita às instruções de um caso, mas continua a partir desse ponto, é que essa característica tem bastante utilidade em diversas situações. Por exemplo, podemos ter:
128
1º PERÍODO • Análise e desenvolvimento de sistemas • UNITINS
Aula 3 • Algoritmos e Programação
switch (variável) { case exp_1 : case exp_2 : instr_2; break; ... default : ... break; } Nesse exemplo, é executada a instr_2, se a variável tiver o valor exp_1 ou exp_2. É uma boa prática usar break após o último caso, embora tal não seja necessário. A diferença fundamental entre o switch e o if é que o switch apenas testa igualdade, enquanto a expressão condicional do if pode ser de qualquer tipo. A instrução switch é bastante usada para processar comandos a partir do teclado, tais como a seleção de opções em um menu. Por exemplo, podemos ter uma função que devolva um valor que corresponde à opção selecionada (SIMÕES, 2004). void menu() { char ch; printf(“ Ler ficheiro - 1\n ”); printf(“ Gravar ficheiro - 2\n ”); printf(“ Eliminar ficha - 3\n ”); printf(“ Adicionar ficha - 4\n ”); printf(“Escolha opção: ”); scanf(“%d”,&ch); switch (ch) { case ‘1’ : ler_fich(); break; case ‘2’ : grava_fich(); break; case ‘3’ : apaga_ficha(); break; case ‘4’ : adiciona_ficha(); break; default : printf(“Opção inválida!”);break; } }
UNITINS • Análise e desenvolvimento de sistemas • 1º PERÍODO
129
Aula 3 • Algoritmos e Programação
3.6 Estrutura de repetição (while) Essa estrutura de repetição é equivalente à estrutura ENQUANTO..FACA estudada em Lógica para Programação. A estrutura while tem a sintaxe: while (expressão)
;
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 simplesmente 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)
;
Normalmente, expr_1 é uma inicialização (com uma instrução de atribuiçã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 incremento que define como a variável de controle do ciclo deve ser alterada cada vez que o ciclo é executado. O ciclo for será executado enquanto a condição for verdadeira. Quando a condição se tornar falsa, o programa prossegue na instrução a seguir ao ciclo.
130
1º PERÍODO • Análise e desenvolvimento de sistemas • UNITINS
Aula 3 • Algoritmos e Programação
As expressões expr_1 e expr_3 são atribuições ou chamadas de funções, e expr_2 é uma expressão relacional. Qualquer uma das três partes pode ser omitida, apesar de terem de ser mantidos os ponto-e-vírgula. Quando expr_2 é omitida, o C substitui por uma constante não nula para que o teste retorne sempre verdadeiro. Por exemplo, o trecho: for (;;) ; é um ciclo infinito equivalente ao ciclo while (1) ; 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 void main() { int x; for(x=1; x 0); }
134
1º PERÍODO • Análise e desenvolvimento de sistemas • UNITINS
Aula 3 • Algoritmos e Programação
Referências ASCENCIO, Ana Fernanda Gomes; CAMPOS, Edilene Aparecida Veneruchi de. Fundamentos da programação de computadores: Algoritmos, Pascal e C/ C++. São Paulo: Pearson Prentice Hall, 2003. ORTH, Afonso Inácio. Algoritmos e programação com resumo das Linguagens Pascal e C. Porto Alegre: AIO, 2001. SIMÕES, Carlos. Programação em Linguagem C. [S.l.]: Escola Superior de Tecnologia de Viseu. Instituto Politécnico de Viseu, 2004. Disponível em: . 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, estudaremos esse elemento principal programação em C: as funções.
Anotações
UNITINS • Análise e desenvolvimento de sistemas • 1º PERÍODO
135
Aula 3 • Algoritmos e Programação
136
1º PERÍODO • Análise e desenvolvimento de sistemas • UNITINS
Aula 4 • Algoritmos e Programação
Aula 4 Modularização em C: uso de Funções Objetivos Esperamos que, ao final desta aula, você seja capaz de: • entender os conceitos relacionados ao uso de funções na Linguagem C; • implementar funções nessa linguagem.
Pré-requisitos Para atingir os objetivos declarados para esta aula, é fundamental que você já saiba codificar um programa em C usando variáveis e as principais estruturas de controle. Isso é muito importante para que você possa entender os exemplos discutidos nesta aula.
Introdução Em C, qualquer instrução a ser executada deve ser parte de uma função. Entre os programadores é comum ouvir a frase em C tudo é função. Assim, para que você possa programar com propriedade em C é imperativo que você conheça essa estrutura e seus detalhes. Nesta aula, abordaremos esse tema.
4.1 Funções Uma função em C é declarada usando a seguinte sintaxe geral: TIPO NOME (PARÂMETROS) {
CORPO }
Onde:
UNITINS • Análise e desenvolvimento de sistemas • 1º PERÍODO
137
Aula 4 • Algoritmos e Programação
• TIPO é o tipo de valor retornado pela função. Se nada for especificado, o compilador considera que será retornado um valor inteiro; • NOME é o nome da função; • PARÂMETROS é a lista das variáveis que recebem os argumentos quando a função é chamada. Deve incluir o tipo e nome de cada variável. Sua sintaxe é: (tipo1 variável1, tipo2 variável2, ..., tipo3 variávelN); • CORPO é onde estão as instruções da função. A seguir, é mostrado um exemplo de uma função. A função soma() possui dois parâmetros do tipo inteiro e retorna uma valor também inteiro, representando a soma dos dois parâmetros. int soma(int x,int y) { int resultado; resultado = x + y; return(resultado); }
4.2 Variáveis em funções As variáveis criadas em uma função são locais, assim serão destruídas após o término da função. Caso em uma variável local a função tenha o mesmo nome de uma variável global, a variável local será usada, e não a global. Recomendamos que as variáveis globais sejam evitadas na programação em C. Ao invés disso, você deve trabalhar sempre com a passagem de parâmetros entre as funções.
4.3 Argumentos e parâmetros Argumentos são os valores usados para chamar a função, e parâmetros são as variáveis, declaradas na definição da função, que recebem esses argumentos. Para ficar mais claro, observe o exemplo a seguir.
138
1º PERÍODO • Análise e desenvolvimento de sistemas • UNITINS
Aula 4 • Algoritmos e Programação
/* Argumentos e parâmetros */ #include 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ássica e a forma moderna. A forma clássica tem a seguinte sintaxe: TIPO NOME(PARÂMETRO1, PARÂMETRO2, ... , PARÂMETROn) TIPO DO PARÂMETRO1; TIPO DO PARÂMETRO2; ... ... TIPO DO PARÂMETROn; { CORPO DA FUNÇÃO }
UNITINS • Análise e desenvolvimento de sistemas • 1º PERÍODO
139
Aula 4 • Algoritmos e Programação
Já a forma moderna tem a seguinte sintaxe: TIPO NOME (TIPO PARÂMETRO1, TIPO PARÂMETRO2, ... , TIPO PARÂMETROn) { CORPO DA FUNÇÃO } A seguir, segue um exemplo de função com os dois tipos de declaração de parâmetros. /* Com declaração clássica */ int soma(a, b) int a; int b; {
int resultado;
resultado = a + b;
return(resultado);
} /* Com declaração moderna */ int soma(int a, int b) {
int resultado;
resultado = a + b;
return(resultado);
} Atualmente, utiliza-se a forma moderna, porém, em programas mais antigos, você encontrará a forma clássica.
4.5 Chamada por valor e chamada por referência A chamada por valor é a passagem normal do valor dos argumentos para a função. Utilizando essa chamada, os valores dos argumentos passados não são modificados. Na realidade, é passada uma cópia dos valores para a função. Na chamada por referência, são passados os endereços de memória onde estão os argumentos. Nesse tipo de chamada, os valores podem ser modificados.
140
1º PERÍODO • Análise e desenvolvimento de sistemas • UNITINS
Aula 4 • Algoritmos e Programação
É importante lembrar que as strings e matrizes sempre são chamadas por referência. Quando C passa uma matriz ou string para uma função, é passado o endereço inicial da matriz ou função.
4.6 O comando return O comando return é usado para encerrar a função e retornar um valor para a função chamadora. O valor retornado pela instrução return deve ser compatível com o tipo da função, o qual é definido quando da sua declaração. Se uma função não retornar nenhum valor, ela deve ser declarada como do tipo void. De acordo com o padrão ANSI, a função main devolve um inteiro para o processo chamador, que geralmente é o sistema operacional. Isso é equivalente 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 compilador 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 int soma(int a, int b); /* protótipo da função */ int main( ) { int nr1, nr2; printf(“Entre com o primeiro número :”); scanf(“%d”,&nr1); printf(“Entre com o segundo número :”); scanf(“%d”,&nr2); printf(“\n%d + %d = %d\n\n”,nr1,nr2,soma(nr1,nr2)); return(0); }
UNITINS • Análise e desenvolvimento de sistemas • 1º PERÍODO
141
Aula 4 • Algoritmos e Programação
int soma(int a, int b) /* função propriamente dita */ {
int resultado;
resultado = a + b;
return(resultado);
}
Síntese da aula Nesta aula, você estudou o principal conceito da Linguagem C – as Funções. O domínio desse conceito garante uma programação otimizada. Foram discutidos também os aspectos básicos da declaração e uso de funções, como os parâmetros e os argumentos.
Atividades 1. Suponha que você precise criar uma função calculaAreaTrapezio para calcular a área de um trapézio. A área A do trapézio é o produto da média aritmética entre as medidas das bases pela medida da altura, isto é, A=((base1+base2)*h)/2. Nessas condições, indique a alternativa que apresenta a declaração correta para essa função. a) int calculaAreaTrapezio (float base1, float base2, int altura) b) float calculaAreaTrapezio (float base1, float base2, float altura) c) int calculaAreaTrapezio (float base1, float base2, float altura) d) int calculaAreaTrapezio (int base1, int base2, int altura) e) float calculaAreaTrapezio (float base, int altura) 2. Implemente, em Linguagem C, a função float porcento (parcela: float, porcentagem: float), que recebe como parâmetros dois valores: um representa o valor parcela e outro representando a porcentagem a ser aplicada sobre o valor, por exemplo 4,5 (representando 4,5%). Essa função deverá retornar o valor correspondente à porcentagem passada como argumento. 3. Em uma das atividades da aula anterior, foi apresentado o seguinte problema: implemente um programa, em Linguagem C, que implemente as principais operações aritméticas de um calculadora simples. O programa deverá ler dois valores reais e a operação a partir do teclado e, em
142
1º PERÍODO • Análise e desenvolvimento de sistemas • UNITINS
Aula 4 • Algoritmos e Programação
seguida, imprimir o resultado correspondente à operação. Esse procedimento deverá ser repetido até que seja informado o valor 0 como primeiro valor da operação. E foi comentada a seguinte solução: #include 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 calculaAreaTrapezio deveria retornar um tipo de dado float, uma vez que a sua fórmula
UNITINS • Análise e desenvolvimento de sistemas • 1º PERÍODO
143
Aula 4 • Algoritmos e Programação
pode gerar valores com casas decimais em função do uso do operador de divisão. Assim, você já deveria ter descartado as opções (a), (c) e (d). Além desse problema, algumas dessas opções apresentam também problemas de inadequação de tipos de dados. Ao analisar as opções restantes, você deveria ter notado que a opção (e) apresenta uma insuficiência de parâmetros, uma vez que, para o cálculo da área de um trapézio, precisamos saber os valores das duas bases. Então, deveria ter ficado claro que a opção correta é a opção (b). Na atividade 2, deveria ter sido facilmente solucionada com o conteúdo que você estudou nesta aula. Apesar da multiplicidade de soluções, a seguir é apresentada uma delas. float porcento (float parcela, float porcentagem) {
float resultado;
resultado = parcela*(porcentagem/100);
return (resultado);
} Você poderia ainda usar seus conhecimentos sobre expressões a fim de reduzir o número de instruções em sua função. Lembre-se de que, quanto menos instruções, mais rápido o seu programa executará. A solução melhorada é mostrada a seguir. float porcento (float parcela, float porcentagem) {
return (parcela*(porcentagem/100));
} Na atividade 3, você deveria ter criado no código uma função para cada operação aritmética (soma, subtração, multiplicação e divisão) que recebe dois parâmetros do tipo float e retorne o resultado da operação – o que implica em definir a função como sendo também do tipo float. E, na impressão do resultado, você deveria invocar cada função correspondente à sua operação, passando como argumentos os valores das variáveis valor1 e valor2. O código resultante é mostrado a seguir.
144
1º PERÍODO • Análise e desenvolvimento de sistemas • UNITINS
Aula 4 • Algoritmos e Programação
#include float soma (float a, float b) {
return (a+b);
} float subtrai (float a, float b) {
return (a-b);
} float multiplica (float a, float b) {
return (a*b);
} float divide (float a, float b) {
return (a/b);
} int main() {
float valor1, valor2;
char operacao;
do {
printf (“\nDigite o primeiro valor: “);
scanf (“%f”, &valor1);
if (valor1 != 0)
{
printf (“\nDigite o segundo valor: “);
scanf (“%f”, &valor2);
printf (“\nEscolha a operacao [+, -, * ou / ]: “);
scanf (“%c”, &operacao);
if (operacao == ‘+’) {
printf (“\Resultado: %f”, soma (valor1,valor2));
} else if (operacao == ‘-‘) {
printf (“\Resultado: %f”, subtrai (valor1,valor2));
} else if (operacao == ‘*‘) {
printf (“\Resultado: %f”, multiplica (valor1,valor2));
} else if (operacao == ‘/‘) {
printf (“\Resultado: %f”, divide (valor1,valor2));
} } } while (valor1 > 0);
}
UNITINS • Análise e desenvolvimento de sistemas • 1º PERÍODO
145
Aula 4 • Algoritmos e Programação
Referências ASCENCIO, Ana Fernanda Gomes; CAMPOS, Edilene Aparecida Veneruchi de. Fundamentos da programação de computadores: Algoritmos, Pascal e C/ C++. São Paulo: Pearson Prentice Hall, 2003. ORTH, Afonso Inácio. Algoritmos e programação com resumo das Linguagens Pascal e C. Porto Alegre: AIO, 2001.
Na próxima aula Estudaremos as estruturas de dados, que permitem manipular grandes conjuntos de dados de maneira mais fácil, vetores, matrizes e estruturas (structs).
Anotações
146
1º PERÍODO • Análise e desenvolvimento de sistemas • UNITINS
Aula 5 • Algoritmos e Programação
Aula 5 Estruturas de dados homogêneas (vetores e matrizes) e heterogêneas (estruturas) Objetivos Esperamos que, ao final desta aula, você seja capaz de: • utilizar vetores e matrizes na construção de programas em C; • utilizar estruturas (structs) na construção de programas nessa linguagem.
Pré-requisitos Para esta aula, é fundamental que você conheça os conceitos que envolvem o uso de variáveis e tipos de dados na Linguagem C. Se você ainda tem dúvidas sobre esse assunto, recorra ao seu caderno e reveja o conteúdo estudado. Não fique com dúvidas!
Introdução Em C, existem tipos especiais de variáveis que permitem manipular mais de um tipo de dados ao mesmo tempo. O uso dessas estruturas permite a manipulação de grandes conjuntos de dados, além de diminuir a complexidade do programa e as possibilidades de erros. Nesta aula, estudaremos as principais estruturas disponíveis na Linguagem C: vetores, matrizes e estruturas.
5.1 Estruturas de dados homogêneas (vetores e matrizes) As estruturas homogêneas são aquelas que armazenam dados de um mesmo tipo. Na Linguagem C, possuímos duas estruturas desse tipo: os vetores e matrizes. 5.1.1 Vetores ou array Existem situações em que precisamos manipular muitas variáveis, cada qual mais ou menos com a mesma função. Isso acontece quando trabalhamos com
UNITINS • Análise e desenvolvimento de sistemas • 1º PERÍODO
147
Aula 5 • Algoritmos e Programação
listas ou seqüências de números. Por exemplo, a média de uma lista de n números, X1, X2, ..., Xn, é definida como: média = (X1 + X2 + ... + Xn) / n e o desvio de cada número em relação à média é dado pela fórmula: desvio = Xi - média , para i = 1,2,...,n. considere que queremos fazer um programa para calcular a média de uma lista de 10 números e o desvio de cada número em relação à média. Com o uso de variáveis simples, teríamos de fazer algo semelhante à: float x1, x2, x3, x4, x5, x6, x7, x8, x9, x10; float d1, d2, d3, d4, d5, d6, d7, d8, d9, d10; float media; ... media = (x1+x2+x3+x4+x5+x6+x7+x8+x9+x10) / 10; d1 = x1 - media; d2 = x2 - media; ... d10 = x10 - media; Se em vez de 10 números fossem 100, teríamos de declarar 100 variáveis, e isso seria um grande trabalho. É aqui que se torna extremamente útil o conceito de vetor ou array. A definição float x[10]; define um array de nome x com 10 posições, cada uma correspondendo a uma variável do tipo float. Um array é como se fosse uma lista ou seqüência de variáveis. Na linguagem C, os arrays começam sempre na posição 0. Por isso a declaração float x[10] define as variáveis x[0], x[1], x[2], ..., x[9]. Depois de definido o array, os seus elementos podem ser acessados e modificados individualmente, tal como nas variáveis que estudamos até agora. Por exemplo: x[7] = 54; a = x[7]. A sintaxe geral para a definição de um array em C é: tipo nome[dimensão]. Se quisermos definir um array de nome notas com 5 posições, cada qual podendo conter um número inteiro, temos de escrever:
148
1º PERÍODO • Análise e desenvolvimento de sistemas • UNITINS
Aula 5 • Algoritmos e Programação
int notas[5] Ao trabalhar com array, você deve ter cuidado e não acessar uma posição fora dos limites do array. Por exemplo, se for definido o array: float x[10]; e tentarmos acessar o elemento x[12], o compilador não dá erro, mas o programa vai se comportar de um modo imprevisível. 5.1.2 Matrizes Uma matriz em C é um array com mais de uma dimensão. Por exemplo: int a[3][4]; define um array de 2 dimensões, como se fosse uma tabela com 3 linhas e 4 colunas. Cada elemento da tabela é do tipo inteiro. Não se esqueça de que, na Linguagem C, os arrays começam na posição zero.
5.2 Estruturas de dados heterogêneas (estruturas ou structs) As estruturas em C são equivalentes ao tipo de dado registro que você estudou em Lógica para Programação, e são utilizadas para agrupar informações relacionadas de tipos de dados diferentes. Digamos que você precisa controlar os dados relacionados ao estoque de um pequeno estabelecimento comercial. Dessa forma, para cada produto seriam armazenados dados como: • código • nome do produto • quantidade estocada • valor de compra • valor de venda • margem de lucro • observações sobre o produto Esse seria um caso para o uso de estruturas, pois todos os dados estão relacionados a cada produto. Cada dado possui um tipo diferente, como: • int: código e quantidade • char: nome e observações • float: valor de compra, valor de venda e margem de lucro
UNITINS • Análise e desenvolvimento de sistemas • 1º PERÍODO
149
Aula 5 • Algoritmos e Programação
5.2.1 Declarando uma estrutura A sintaxe para a declaração (ou criação) de uma estrutura é: struct NOME_DA_ESTRUTURA { TIPO CAMPO1; TIPO CAMPO2; ........... ........... TIPO CAMPOn; }; Para o caso exemplificado no item anterior, poderíamos ter algo como: struct produto { int codigo; char nome[50]; int quantidade; float valor_compra; float valor_venda; float margem_lucro; char observacao[200]; }; É importante observar que a declaração da estrutura não cria, ainda, uma variável. A declaração da estrutura apenas cria um novo tipo de dado. Somente após criar a estrutura você pode declarar variáveis do tipo de estrutura criado.
5.2.2 Declarando variáveis do tipo de uma estrutura criada Após a declaração da estrutura, você pode declarar variáveis do tipo da estrutura com a sintaxe: struct NOME_DA_ESTRUTURA NOME_DA_VARIÁVEL; Exemplo: struct produto item;
150
1º PERÍODO • Análise e desenvolvimento de sistemas • UNITINS
Aula 5 • Algoritmos e Programação
Observe que essa sintaxe obedece à sintaxe normal para a declaração de variáveis: TIPO NOME_DA_VARIÁVEL; sendo o TIPO da NOME_DA_ESTRUTURA).
variável,
a
nova
estrutura
criada
(struct
Você também pode declarar a variável logo após a declaração da estrutura 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 /* criando um novo tipo de dado “produto” */ struct produto {
int codigo; char nome[50]; int quantidade; float valor_compra; float valor_venda;
};
UNITINS • Análise e desenvolvimento de sistemas • 1º PERÍODO
151
Aula 5 • Algoritmos e Programação
int main() { struct produto item; /* declarando uma variável “item” do tipo “struct produto” */ printf(“Preenchendo a variável \”item\”\n”); printf(“Item............:”); fgets(item.nome,50,stdin); printf(“Código..........:”); scanf(“%d”,&item.codigo); printf(“Quantidade......:”); scanf(“%d”,&item.quantidade); printf(“Valor de compra.:”); scanf(“%f”,&item.valor_compra); printf(“Valor de revenda:”); scanf(“%f”,&item.valor_venda); printf(“\n”); printf(“Exibindo os dados\n”); printf(“Código..........:%d\n”,item.codigo); printf(“Item............:%s”,item.nome); printf(“Quantidade......:%d\n”,item.quantidade); printf(“Valor de compra.:%.2f\n”,item.valor_compra); printf(“Valor de revenda:%.2f\n”,item.valor_venda); return(0); } 5.2.4 Acessando uma estrutura com ponteiros Estudaremos ponteiros na aula seguinte. Entretanto apresentaremos desde já como manipular uma variável do tipo ponteiro para uma estrutura. Para acessar uma estrutura usando ponteiros, você pode usar duas sintaxes: (*NOME_DA_ESTRUTURA).CAMPO ou NOME_DA_ESTRUTURA->CAMPO Observe o uso de estruturas com ponteiros no exemplo a seguir:
152
1º PERÍODO • Análise e desenvolvimento de sistemas • UNITINS
Aula 5 • Algoritmos e Programação
#include struct registro {
char nome[30];
int idade;
}; altera_estrutura1(struct registro *ficha) {
(*ficha).idade -= 10;
} altera_estrutura2(struct registro *ficha) {
ficha->idade += 20;
} int main() {
struct registro ficha;
printf(“Entre com seu nome:”);
fgets(ficha.nome,30,stdin);
printf(“Qual sua idade?”);
scanf(“%d”,&ficha.idade);
printf(“\nExibindo os dados iniciais\n”);
printf(“Nome: %s”,ficha.nome);
printf(“Idade: %d.\n”,ficha.idade);
altera_estrutura1(&ficha);
printf(“\nExibindo os dados após a primeira alteração\n”);
printf(“Nome: %s”,ficha.nome);
printf(“Idade: %d.\n”,ficha.idade);
altera_estrutura2(&ficha);
printf(“\nExibindo os dados após a segunda alteração\n”);
printf(“Nome: %s”,ficha.nome);
printf(“Idade: %d.\n”,ficha.idade);
return(0);
}
UNITINS • Análise e desenvolvimento de sistemas • 1º PERÍODO
153
Aula 5 • Algoritmos e Programação
Síntese da aula Nesta aula, você estudou os elementos da Linguagem C que permitem manipular grandes conjuntos de dados, nomeadamente: vetores, matrizes e estruturas (structs). A diferença básica entre eles está na possibilidade ou não de agrupar dados de diferentes tipos. Vetores e matrizes, por exemplo, só permitem manipular dados de um mesmo tipo. Já as estruturas permitem manipular, ao mesmo tempo, dados de diferentes tipos.
Atividades 1. Sobre o trecho de código a seguir: #include int main() {
int numeros[10];
int i;
numeros[0] = 1;
for (i=1; i 0 então Calcula o valor da média a partir da média = (a + b)/2 Imprime o valor da média Senão Imprime “Os valores devem ser positivos” Fim se Fim do programa Pseudocódigo
Fim
Fluxograma Figura 1. Exemplo de algoritmo representado nas três formas mais comuns
Não existe consenso entre os especialistas sobre qual é a melhor maneira de representar um algoritmo. Atualmente a maneira mais comum de representar algoritmos é por meio de pseudocódigo. Essa forma de representação tem a vantagem de que o algoritmo pode ser escrito de uma forma que está próxima de uma linguagem de programação de computadores, facilitando a criação do programa. Existem outras formas de representação conhecidas, porém pouco utilizadas, como o Diagrama de Chapin ou Nassi-Shneiderman (N-S), que apresenta a solução do problema por meio de um diagrama de quadros com uma visão hierárquica e estruturada. Essa forma não é muito utilizada devido à sua dificuldade em representar a recursividade.
2.1 Descrição Narrativa Nessa forma de representação, os algoritmos são expressos diretamente em linguagem natural.
194
1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Aula 2 • Lógica para Programação
Esta forma de representação é a mesma utilizada em algoritmos não-computacionais, como receitas culinárias. Dessa forma as instruções são descritas livremente, entretanto devemos tomar alguns cuidados para manter a clareza do algoritmo. Para escrever um algoritmo, precisamos descrever a seqüência de instruções, de maneira simples e objetiva. Para isso devemos obedecer algumas regras básicas: • usar somente um verbo por frase; • imaginar que você está desenvolvendo um algoritmo para pessoas que não trabalham com informática; • usar frases curtas e simples; • ser objetivo; • procurar usar palavras que não tenham sentido dúbio. Um exemplo de representação de um algoritmo usando Descrição Narrativa para o problema de cálculo da média de um aluno ficaria: 1. obter as notas da primeira, segunda e terceira provas; 2. calcular a média aritmética entre as três notas; 3. se a média for maior ou igual que 7,00, o aluno foi aprovado, senão, foi reprovado. No entanto, na prática, essa representação é pouco usada porque o uso da linguagem natural dá muitas vezes oportunidade a más interpretações, ambigüidades e imprecisões. Por esse motivo, não daremos maior atenção a este tipo de representação.
2.2 Fluxograma Essa é a forma gráfica de representar um algoritmo mais conhecida e utilizada. O fluxograma nos permite mostrar graficamente a lógica de um algoritmo, enfatizando passos individuais e o fluxo de execução. É intermediária à descrição narrativa e ao pseudocódigo, pois é menos imprecisa que a primeira e, no entanto, não se preocupa com detalhes de implementação do programa como a segunda, como, por exemplo, o tipo de variáveis utilizadas. Para muitos autores, o fluxograma é a forma universal de representação, pois se utiliza de figuras geométricas padronizadas para ilustrar os passos a
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO
195
Aula 2 • Lógica para Programação
serem seguidos para a resolução de problemas. E o ideal é que um algoritmo seja entendido da mesma forma por diferentes pessoas que o utilizarem. Para que um fluxograma seja interpretado corretamente, é necessário entender sua sintaxe e sua semântica. Sobre sintaxe de um fluxograma, devemos entender como a correta utilização dos seus símbolos gráficos – mostrados na figura 2 – e das expressões que podem ser escritas no seu interior. Já a semântica diz respeito ao significado de cada símbolo, ou seja, como interpretá-lo corretamente. Com isso é possível entender e simular o algoritmo representado.
Terminador
Documento
Referência de página
Entrada Manual
Dados armazenados
Referência fora da página
Dados
Exibição
Seta de orientação do fluxo
Decisão
Preparação
Processamento
Figura 2. Simbologia básica de um fluxograma
A interpretação de um fluxograma, via de regra, se dá de cima para baixo e da esquerda para a direita. É importante seguir essa regra, pois garante que o fluxo de instruções seja entendido corretamente. Por se tratar de uma representação gráfica, o fluxograma não se mostra adequado para a representação de algoritmos maiores e/ou mais complexos. Nesses casos, é comum o uso do pseudocódigo como forma de representação. 2.2.1 Simbologia básica de um fluxograma Estes são alguns dos símbolos mais conhecidos e utilizados ao longo dos anos pelos profissionais da área de informática para a descrição de algoritmos usando fluxograma e são descritos na norma internacional ISO 5807/1985.
196
1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Aula 2 • Lógica para Programação
Inicio
Terminador
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 qualquer outro dispositivo de entrada. Utilizado para representar dados tanto de entrada quanto de saída já definidos no próprio programa, como valores de constantes.
Dados
Dados
Condição SIM
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.
NÃO
Decisão Doc
Documento Dados
Dados Armazenados Variável ou mensagem
Exibição Operações
Preparação
Referência de Página
Referência fora da Página
Seta de orientação de fluxo Processo
Processamento
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. Utilizado para representar a utilização de algum documento específico contendo dados necessários ao algoritmo. Usado para indicar dados que estão ou deverão ser armazenados pelo algoritmo. É utilizado quando se deseja que os dados sejam impressos. Representa um dispositivo de saída como o monitor ou a impressora. Refere-se a um determinado grupo de operações não incluídas da diagramação. Utilizado quando é preciso particionar o diagrama. Quando ocorrer mais de uma partição, é colocada uma letra ou número dentro do símbolo de conexão para identificar os pares de ligação. Específico para indicar conexão do fluxo em outra página. Permite indicar o sentido do fluxo de dados. Serve exclusivamente para conectar os símbolos ou blocos existentes. Símbolo ou bloco que se utiliza para indicar cálculos (algoritmos) a efetuar, atribuições de valores ou qualquer manipulação de dados que tenha um bloco específico para sua descrição.
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO
197
Aula 2 • Lógica para Programação
2.2.2 Construindo um fluxograma Para entendermos como um fluxograma é criado para representar um algoritmo, vamos discutir passo-a-passo a criação de um fluxograma para representar um algoritmo que permita calcular a média final de um aluno considerando que todo aluno realiza três provas no semestre. O aluno é considerado “aprovado” se a sua média for igual ou superior a 7,00, senão é considerado “reprovado”. Antes de iniciarmos a construção do fluxograma, devemos formalizar o algoritmo para solucionar o problema, de acordo com o que estudamos na primeira aula. É evidente que este é um problema de pouca complexidade e que envolve poucas regras. Para resolver esse problema, fica claro que precisaremos conhecer as três notas do aluno, que deverão ser informadas pelo usuário e, em seguida, calcular a média por meio do cálculo de média aritmética simples para a qual devemos aplicar a fórmula média = (nota1+nota2+nota3)/3. Após o cálculo da média, é necessário testar se o seu valor é igual ou superior ao valor 7,00 e, nesse caso, deverá ser listada a mensagem “Aprovado”. Em caso contrário, deverá ser listada a mensagem “Reprovado”. Agora que conhecemos o algoritmo, é possível representá-lo como um fluxograma. Inicialmente a forma mínima de um fluxograma é dada pela junção de seus terminadores de início e fim, como mostrado na figura 3. Na verdade, essa construção mínima executa absolutamente nada. Os símbolos de INICIO e FIM, na verdade, não representam instruções de fato, mas são marcadores essenciais que permitem a correta interpretação do fluxograma. Inicio
Fim Figura 3. Fluxograma mínimo
Entretanto, para nosso algoritmo, será necessário ler os dados de entrada, nesse caso, as três notas do aluno. Com isso, é necessário expandir o nosso fluxograma, como mostra a figura 4. Por motivos didáticos, para cada variável foi utilizado um símbolo de entrada manual. Na prática, entretanto, é comum a utilização de apenas um símbolo contendo todas as variáveis a serem lidas.
198
1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Aula 2 • Lógica para Programação
Inicio
nota1
nota2
nota3
Fim Figura 4. Fluxograma com leitura das notas
De posse do valor de cada uma das três notas, é possível processar a média do aluno. Vamos representar esse processamento utilizando o símbolo de processo, como mostra a figura 5. Em um fluxograma, devemos sempre representar a atribuição de valor a uma variável por meio do símbolo “←”, na forma variável
←
valor. Em um fluxograma, a expressão variável = valor
representa o teste se o valor da variável é igual ao valor informado do lado direito da expressão e não uma atribuição. Inicio
nota1 nota2 nota3
média
(nota1+nota2+nota3)/3
Fim Figura 5. Fluxograma com o cálculo da média
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO
199
Aula 2 • Lógica para Programação
Agora que o valor da média já foi calculado, é hora de testar o seu valor a fim de definir se o aluno foi aprovado ou reprovado. Nesse momento, sentimos a necessidade de controlar o fluxo de instruções, pois caso o valor da média seja superior a 7,00, devemos executar a instrução de impressão da mensagem “Aprovado”; senão devemos apresentar a mensagem “Reprovado”. Para fazer isso é necessário utilizar o símbolo de decisão, como mostrado na figura 6. Como podemos notar, dependendo do resultado da condição media >= 7,00, o fluxo de instruções é devidamente desviado. Inicio
nota1
nota2
nota3
média
(nota1+nota2+nota3)/3
média >= 7,00
NÃO
SIM
“Aprovado”
“Reprovado”
Fim
Figura 6. Fluxograma final
Agora o fluxograma mostrado na figura 6 reflete o algoritmo criado, representando cada passo de forma gráfica. Como já discutido na aula sobre algoritmos, na maioria das vezes precisamos executar um conjunto de passos repetidas vezes, sem alterações no
200
1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Aula 2 • Lógica para Programação
conjunto de instruções. Para representar esses casos em um fluxograma devemos construir um desvio no fluxo de instruções que permita testar uma condição de parada e, dependendo do seu resultado, retornar a um passo anterior a fim de repetir o conjunto de instruções desejado. A fim de compreender como tratar esse tipo de situação, vamos tomar como exemplo a representação de um algoritmo que imprime todos os números pares positivos e menores do que um valor N informado. O fluxograma resultante é mostrado na figura 7. Inicio
N
N>0 SIM
N%2>0 SIM
N NÃO NÃO
N
N-1
Fim
Figura 7. Fluxograma para a impressão de números pares positivos e menores do que um valor N
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO
201
Aula 2 • Lógica para Programação
Nesse fluxograma é possível notar que, após a leitura o valor N, este é então testado para saber se ainda é positivo. Em caso negativo, o programa já é encerrado, pois não haverá valores pares positivos menores do que N. Caso a condição de teste seja satisfeita, ou seja, retorne o valor verdadeiro, esse valor é testado para saber se é um valor par. Para isso, é testado o resto da divisão do valor N por dois. Caso essa expressão retorne o valor zero, o número é par, senão é impar. Caso a condição seja satisfeita – N é par – o valor de N é então exibido e, em seguida, decrementado de uma unidade. Após essa instrução, o fluxo é então desviado para o momento anterior ao conjunto de passos que deverá ser novamente repetido. Com isso conseguimos garantir que esses passos serão executados até que a condição N > 0 retorne o valor falso.
2.3 Pseudocódigo Esse nome é uma alusão à posterior implementação em uma Linguagem de Programação, ou seja, quando formos programar em uma linguagem de programação específica. O pseudocódigo é um código de escrita em que se utilizam termos convencionais 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 – primitiva usada para nomear o algoritmo representado;
202
1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Aula 2 • Lógica para Programação
• INICIO (do inglês START) – esta primitiva é usada para identificar o ponto inicial do algoritmo; • FIM (do inglês END) – identifica o ponto final do algoritmo; • LEIA , (do inglês INPUT) – primitiva usada para a leitura de dados do utilizador. Equivalente à entrada de dados manual do fluxograma; • IMPRIMA , (do inglês OUTPUT) – primitiva usada para a apresentação de dados ao utilizador. Equivalente ao símbolo de exibição do fluxograma; • ← – atribuição do resultado da expressão à variável indicada; • SE ENTAO (do inglês IF ... THEN) SENAO (do inglês ELSE) FIM SE (do inglês END IF) – primitiva de controlo de fluxo equivalente à decisão dos fluxogramas; • ESCOLHA () (do inglês SWITCH) CASO : CASO : ... CASO : CASOCONTRARIO: FIM ESCOLHA – primitiva de controlo de fluxo, usado para representar uma estrutura de controle de seleção múltipla; • ENQUANTO FAÇA (do inglês WHILE) 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)
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO
203
Aula 2 • Lógica para Programação
ATE (do inglês UNTIL) – primitiva de controlo de fluxo, sem equivalência direta em fluxogramas, que implementa um ciclo executado até que a condição referida seja verdadeira; • PARA ATÉ FAÇA [PASSO ] (do inglês FOR ... TO ... [STEP ...] DO)
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 [,]: (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 discutidos em uma aula à frente; • CONST = [,] (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 : [,] (do inglês STRUCT) [: ]
FIM ESTRUTURA (do inglês END STRUCT) – primitiva utilizada na definição de estruturas de variáveis. Os tipos de variáveis são definidos à frente;
• FUNCAO () (do inglês FUNCTION) [RETORNA ] (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âmetros podem ser utilizados para a função exportar valores;
• CHAMA () (do inglês CALL) – primitiva utilizada para executar funções definidas com a primitiva anterior.
204
1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Aula 2 • Lógica para Programação
Um exemplo de pseudocódigo é mostrado a seguir. ALGORITMO Media VAR N1, N2, N3, Media : real INICIO LEIA N1, N2, N3 Media = 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 representaçã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 proximidade com o produto final – o programa codificado em uma Linguagem de Programação – o que diminui o tempo de desenvolvimento e reduz custos. Além disso, o pseudocódigo permite adicionar detalhes específicos da linguagem a ser utilizada.
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO
205
Aula 2 • Lógica para Programação
Atividades Para as atividades 1, 2 e 3, considere a seguinte questão: elabore um algoritmo 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üidades, 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 definidos para garantir que um mesmo fluxograma seja corretamente interpretado, não importa onde tenha sido criado; c) a interpretação de um fluxograma, via de regra, se dá de baixo para cima e da direita para a esquerda; d) um programa deve possuir apenas um terminador de INÍCIO e outro de FIM; e) por se tratar de uma representação gráfica, o fluxograma não se mostra adequado para a representação de algoritmos maiores e/ou mais complexos.
206
1º PERÍODO • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • UNITINS
Aula 2 • Lógica para Programação
6. Sobre o algoritmo em pseudocódigo apresentado a seguir, é correto afirmar que: ALGORITIMO A6; VAR X: Inteiro; INICIO REPITA LEIA (X); SE (X < 0) ENTAO IMPRIMA (“O valor informado deve ser positivo”) SENAO IMPRIMA (X*X); FIM SE ATE (X 0
NÃO
SIM
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 possibilidade de ambigüidade, pois caso um passo seja ambíguo, pode dar margem a entendimentos distintos do algoritmo. Por último, a opção (e) também está correta, pois devemos utilizar frases curtas e simples a fim de manter a clareza e facilitar a interpretação do algoritmo. Considerando o que foi estudado nesta aula sobre fluxograma, você deve ter reconhecido como opção incorreta para a atividade 5 a opção (c), pois a interpretação de um fluxograma deve ser sempre realizada de cima para baixo e da esquerda para a direita. Você deveria ter reconhecido ainda a opção (a) como correta, pois o fluxograma é exatamente uma representação gráfica dos
UNITINS • ANÁLISE E DESENVOLVIMENTO DE SISTEMAS • 1º PERÍODO
209
Aula 2 • Lógica para Programação
passos de um algoritmo. A opção (b) também está correta, pois a norma internacional ISO 5807/1985 define a simbologia a ser adotada na construção de um fluxograma e, com isso, um mesmo fluxograma será corretamente interpretado, 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 representaçã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 encontram-se no bloco de instruções do comando REPITA. Assim esses passos deverão ser executados até que a condição (X
View more...
Comments