Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas


Introdução à Programação em Python: Histórico, Linguagens e Aplicações, Notas de aula de Lógica

Este documento oferece uma introdução abrangente à programação em python, explorando seu histórico, diferentes linguagens de programação e suas aplicações. ele discute a evolução das linguagens de programação, desde o pseudocódigo até linguagens modernas como python, c e java, destacando as características e aplicações de cada uma. O texto também aborda a arquitetura de von neumann e a importância das bibliotecas de funções. ideal para estudantes que buscam uma base sólida em programação.

Tipologia: Notas de aula

2024

Compartilhado em 26/04/2025

cintia-gabriela-wolochwianski
cintia-gabriela-wolochwianski 🇧🇷

1 documento

1 / 33

Toggle sidebar

Esta página não é visível na pré-visualização

Não perca as partes importantes!

bg1
LÓGICA DE PROGRAMAÇÃO
E ALGORITMOS
AULA 1
Prof. Vinicius Pozzobon Borin
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e
pf1f
pf20
pf21

Pré-visualização parcial do texto

Baixe Introdução à Programação em Python: Histórico, Linguagens e Aplicações e outras Notas de aula em PDF para Lógica, somente na Docsity!

LÓGICA DE PROGRAMAÇÃO

E ALGORITMOS

AULA 1

Prof. Vinicius Pozzobon Borin

CONVERSA INICIAL

O objetivo desta abordagem é introduzir os principais conceitos inerentes à lógica de programação e algoritmos. Vamos iniciá-la compreendendo o que significam as palavras-chave do nosso estudo: lógica e algoritmos. Investigaremos um pouco do raciocínio lógico necessário para o desenvolvimento de programas computacionais, bem como iremos definir, em um contexto até mesmo fora da computação, o que são algoritmos. Após essas definições, iremos tratar dos recursos necessários para que um sistema computacional execute algoritmos. Portanto, veremos a arquitetura computacional-base para a execução de programas, o hardware. Investigaremos, também, as maneiras distintas de representarmos um algoritmo. Para tal, estudaremos a nomenclatura de pseudocódigo e de fluxogramas. Esses conceitos nos acompanharão ao longo de todo o nosso estudo. Por fim, encerraremos esta abordagem compreendendo o que são linguagens de programação e como um sistema computacional entende-as. Focaremos no entendimento da linguagem Python, a qual adotaremos para o nosso estudo. Ao longo deste estudo, serão apresentados exemplos de algoritmos escritos tanto em pseudocódigo, quanto em fluxogramas e também em linguagem de programação Python, que será conceituada e abordada no decorrer do nosso estudo. Todos os conceitos trabalhados nesta abordagem continuarão aparecendo de forma recorrente ao longo do nosso estudo.

TEMA 1 – INTRODUÇÃO À LÓGICA E AOS ALGORITMOS

Nossa área de estudo é chamada de Lógica de Programação e Algoritmos. Portanto, nada melhor do que iniciarmos esta abordagem conceituando esse nome. Afinal, o que é lógica? E o que são algoritmos? E como tudo isso se conecta, na área da computação e da programação? Vamos compreender isso no decorrer desta abordagem.

1.1 Introdução à lógica

Você já parou para pensar na maneira com que você racionaliza para realizar suas tarefas cotidianas? Por exemplo, ao acordar você segue, mesmo que de maneira não intencionalmente, uma ordem para suas atividades. Quando acorda, você veste-se, escova seus dentes, toma café, dentre outras tarefas.

simbólicas e máquinas universais de cálculo eram muito empregadas para auxiliar em cálculos complexos, como diferenciais e integrais. Utilizar dispositivos como a calculadora de Leibniz^1 requerem uma sequência correta de passos para se atingir o resultado. Na matemática, resolver problema é seguir as etapas previstas, na ordem correta. Assim, o conceito de algoritmo surge: um algoritmo é dado como uma sequência de passos a serem realizados para que uma determinada tarefa seja concluída ou um objetivo, atingido. A ideia do uso de algoritmos, antes da era da informatização, foi fundamental na matemática, uma vez que naturalmente empregamos uma sequência de passos fixa e imutável para resolver equações algébricas. Por exemplo, qual seria a sequência de passos para resolvermos a equação [(a + b) ∗ c + d]? Considerando a , b , c e d como números inteiros e positivos, você deve:

  • Realizar o cálculo dentro dos parênteses a + b.
  • Multiplicar o resultado de dentro dos parênteses por c.
  • Por fim, somá-lo com d. Observe que qualquer outra ordem de execução desses passos resultaria em um valor incorreto, uma vez que, na matemática, devemos respeitar a ordem de precedência dos operadores, ou seja, primeiro calculamos o que está dentro dos parênteses; e, por fim, fazemos o cálculo da multiplicação antes da adição, sempre. Vejamos outros exemplos de algoritmos, mas agora mais do nosso cotidiano. Um exemplo clássico de algoritmo é uma receita de bolo. Qualquer receita de bolo é uma sequência exata de passos que, caso não forem seguidos corretamente, resultarão em um bolo, no mínimo, imperfeito. Outro exemplo prático: você está em sua casa e abre a geladeira. Como faz tempo que você não vai ao mercado, só encontra, dentro dela, manteiga, queijo e presunto fatiados. Você também lembra que tem algumas fatias de pão de forma no armário e pensa: Vou fazer um sanduíche! Para construir seu sanduíche, mesmo que involuntariamente, você faz um algoritmo! Está duvidando? Quer ver só? Tente imaginar (ou anote no seu caderno) a sequência de passos que você utiliza para montar o seu lanche.

(^1) Sugestão: faça uma busca on-line pelas palavras Leibniz calculator ou calculadora de Leibniz. E você verá a máquina manual construída por ele, no séc. XVII.

Depois, volte aqui e compare com as etapas a seguir. Observe que você deve utilizar somente os ingredientes que citamos nesse exemplo (i.e., pão de forma, queijo fatiado, presunto fatiado e manteiga). Assim sendo: a. Pegue uma fatia de pão de forma. b. Com a ponta da faca, raspe duas vezes na manteiga, dentro do pote. c. Com a mesma faca, espalhe uniformemente a manteiga em um dos lados do pão de forma. d. No mesmo lado que você espalhou a manteiga, coloque uma fatia de queijo e uma de presunto, esta última em cima da de queijo. e. Em cima das fatias, coloque o outro pão de forma e pronto, seu sanduíche está finalizado! Ficou parecido com o seu? É claro que cada um tem suas preferências culinárias, como colocar ainda mais manteiga. Ou, quem sabe, mais fatias de queijo? De todo modo, a ideia será bastante semelhante com a que foi apresentada. Note, também, o nível de detalhes do algoritmo. Se pensarmos que um computador deverá executar esse algoritmo, quanto mais se carecer de detalhes, menos a máquina saberá como proceder, podendo resultar em um sanduíche errado. Quer ver um exemplo de erro? Na etapa 2 do algoritmo, se não fosse especificado que a ponta da faca deveria ser passada na manteiga, qualquer parte dela poderia ser usada, inclusive o cabo. E, caso você não tenha dito para usar uma faca, bom, aí seria possível usar até mesmo sua própria mão para espalhar. Portanto, é necessário informar da maneira mais minuciosa como construir o sanduíche. Exercício de revisão : escreva uma sequência de passos (um algoritmo) para resolver a equação do delta (Δ), na fórmula de Bhaskara (Δ = b^2 − 4ac). Resposta: disponível em Puga e Risseti (2016, p. 10). Exercício de fixação : um cliente deseja fazer a consulta do saldo de sua conta-corrente no computador, pela internet. Suponha que o computador já esteja ligado e conectado à internet. A seguir estão os passos que poderiam ser utilizados, porém dispostos fora de ordem. Organize-os na ordem correta (Puga; Risseti, 2016, p. 16).

a. Inserir a senha. b. Clicar no botão OK , de acesso.

por máquinas capazes de realizar codificações e decodificações cada vez mais complexas e mais rapidamente havia se iniciado. No início da guerra, tínhamos computadores construídos com milhares de válvulas e relés, pesando toneladas e consumindo montantes gigantescos de energia elétrica. Uma das mais famosas e proeminentes dessa época foi o electronic numerical integrator and compute (Eniac). A Figura 1 contém uma imagem desse imenso computador.

Figura 1 – Eniac

Crédito: Everett Historical/Shutterstock.

O Eniac começou a ser construído em 1943 e continha 18 mil válvulas, 1,5 mil relés, pesava 30 toneladas e consumia 140 kW de potência. Tudo isso para ser capaz de manipular 20 unidades de memória (registradores), cada uma com um tamanho, em base decimal de 10 dígitos. O Eniac só ficou pronto em 1946, após o término da guerra, e acabou nem sendo útil para tal propósito. O Eniac continha, ainda, 6 mil interruptores, que precisavam ser manualmente configurados para programar o computador (Tanenbaum, 2013). Nesta época, começou a ficar evidente que máquinas como o Eniac podiam não ser a melhor solução para o meio da computação, devido à falta de

praticidade no seu uso, e pesquisadores ao redor do mundo começaram a estudar novas maneiras de projetar e construir computadores. Em 1946, o matemático húngaro John von Neumann, apoiando-se em trabalhos anteriores de pesquisadores como Alan Tuning, propôs o que viria a ser de fato o primeiro computador digital. E não só isso, mas o húngaro criou a arquitetura computacional basilar empregada em todos os computadores modernos até os dias atuais. Logo de início, von Neumann percebeu que programar computadores com imensas quantidades de interruptores é uma tarefa lenta, cara e manual demais, requerendo muita mão de obra só para acionar os seus interruptores. Ele também percebeu que fazer computadores trabalharem com aritmética decimal (a mesma com a qual nós humanos estamos habitualmente familiarizados) não fazia sentido, uma vez que, para representar um dígito, eram necessárias dez válvulas (uma acesa e nove apagadas). Substituí-la por uma aritmética binária seria um caminho de mais fácil manipulação pelos computadores, caminho este adotado até hoje. O projeto, que ficou posteriormente conhecido como máquina de von Neumann , foi então o primeiro computador de programa armazenado criado.

1.3 A máquina de von Neumann

Vamos dedicar, agora, um tempo a entendermos melhor o que von Neumann propôs; afinal, essa é a arquitetura-base de qualquer sistema computacional do séc. XXI.

Figura 2 – Diagrama da máquina de von Neumann

A máquina de von Neumann contém cinco elementos elementares, conforme ilustrado na Figura 2:

Em suma, a arquitetura de von Neumann, hoje considerada clássica, por conta dos computadores modernos, é tida como o hardware mínimo necessário para um computador digital funcionar. Qualquer software de computador que iremos aprender a desenvolver ao longo deste estudo requer uma máquina de von Neumann. Porém, desde a proposta de computador digital feita por von Neumann, em meados de 1945, as tecnologias para construção de computadores evoluíram abruptamente. Na década de 1950 deu-se início à era da miniaturização dos computadores, com o surgimento dos primeiros dispositivos construídos a base de transistores e não mais valvulados. A evolução para máquinas transistorizadas foi um firmamento, para a aritmética binária. Transistores são componentes eletrônicos que, quando parametrizados corretamente, podem operar no que chamamos de região de saturação , funcionando como uma chave que liga e desliga milhares de vezes por segundo. Em 1960, evoluímos para projetos com circuitos integrados, reduzindo ainda mais o tamanho dos computadores e chegando a máquinas com tamanhos e custos compatíveis para vendas residenciais. Toda a história e evolução dos computadores pode ser lida em detalhes no livro Organização estruturada de computadores (Tanenbaum, 2013a). De todo modo, o que todas essas gerações tem em comum é que a arquitetura que serviu como base está contida dentro de todas as nossas máquinas digitais e não só em computadores e laptops , mas também em smartphones e até mesmo em dispositivos eletrônicos embarcados, como forno de micro-ondas, lâmpadas inteligentes etc. Tudo isso tem a máquina de von Neumann como seu ponto de partida.

1.4 O bit , o byte e a palavra

Sabemos que um computador digital contém uma memória que manipula e armazena dados de maneira binária. Mas o que isso realmente significa? Aprendemos, desde os primeiros anos de escola, a realizar operações aritméticas na denominada base decimal. Decimal vem do numeral 10 , o que nos indica que, para representarmos qualquer número na base decimal, precisaremos de 10 símbolos diferentes – nesse caso, os números de 0 até 9. Podemos realizar qualquer combinação de dígitos de 0-9 para representarmos o número que quisermos, em base decimal.

O termo bit é originário de binary digit (dígito binário), no que se escolheu pegar as duas primeiras letras da palavra binary ( bi ) e a última letra da palavra digit ( t ) para formar a palavra bit ( bi + t ). Um bit nos indica que, diferentemente da base decimal, na base binária podemos representar números utilizando somente dois ( bi ) símbolos. Nesse caso, 0 ou 1, que também são chamados de nível lógico baixo (0) e nível lógico alto (1) ou então de falso (0) e verdadeiro (1). Qualquer número que antes podíamos representar em base decimal podemos também representar em base binária, com base em combinações de zeros e uns, somente. Um computador digital armazena, calcula e manipula dados com esse tipo de aritmética devido à facilidade que é para ele realizar operações nessa base (graças aos transistores!). Em aspectos físicos, um valor 0, em uma memória, poderá ser a ausência de um sinal elétrico (ou carga elétrica) naquele ponto, e o valor 1 poderá representar a existência de sinal elétrico (ou carga elétrica). Se pudéssemos enxergar a olho nu as informações armazenadas em uma memória, veríamos quantidades quase que infinitas de sequências de sinais (ou cargas elétricas) dentro dela^2. Se o computador trabalha com aritmética binária, talvez você esteja se perguntando: como é que, para nós, usuários, as informações aparecem na tela em base decimal? Bom, o fato é que é possível convertermos números de uma base para a outra. Embora aritmética binária e cálculos de conversão de base não sejam objeto do nosso estudo, caso tenha interesse em compreender como convertemos números de base decimal para binária, e vice-versa, recomendamos a leitura dos capítulos 1 e 2 do livro Sistemas digitais: princípios e aplicações (Tocci et al., 2007). O que precisa ficar compreendido é que todo e qualquer computador projetado com base na máquina de von Neumann é binário e, portanto, só compreende dígitos 0 e 1, o bit , e nada além disso. O bit é a menor unidade de armazenamento. Porém, é mais comum mensurarmos a memória em unidades maiores, para facilitar nossa compreensão. Sendo assim, adotamos convenções de que um octeto, ou seja, 8 bits , é denominado byte****. Assim como 1.024 bytes correspondem a 1 kilobyte (Tabela 1).

(^2) O nível e o tipo de sinal usado para representar o bit dependerão da tecnologia de memória empregada no armazenamento. Por exemplo, memórias RAM convencionais trabalham com capacitores, em que um capacitor carregado representaria nível lógico alto.

desenvolver o programa para uma única plataforma e configuração, tornando o software limitado e comercialmente inviável. E, acredite: até meados da década de 1970 era assim que se desenvolviam programas computacionais exclusivos para um determinado hardware! Porém, é importante ressaltarmos que tínhamos bem menos hardwares e tecnologias disponíveis, naquela época. O surgimento do conceito de sistema operacional fez com que a vida do desenvolvedor melhorasse bastante. Um sistema operacional é também um software , mas bastante complexo e capaz de gerenciar a execução de outros programas executando em concorrência, em uma mesma máquina. O sistema operacional, dentre suas principais características, tem como objetivo permitir, ou não, a execução de um software , gerenciar o uso da memória e do processador por cada um dos programas e, por fim, abstrair por completo o hardware da máquina, tanto para o usuário quanto para o programador. Desse modo, ao desenvolver o seu player de música, você não irá desenvolvê-lo para um hardware específico, mas sim para um sistema operacional específico, o que facilita enormemente o processo de desenvolvimento^3. Talvez você esteja se perguntando se já utilizou algum sistema operacional, ao longo da sua vida de usuário de computadores. A resposta é: com toda a certeza! Quer ver alguns exemplos?

  • Em computadores ( desktops e laptops ) os mais conhecidos são os da Microsoft, que iniciou com o MS-DOS, ao que se seguiu o Windows. Em contrapartida, temos os baseados em Unix/Linux e suas diferentes distribuições (Ubuntu, Mint, Fedora etc.). Citemos também o sistema da Apple, o macOS. Dentre outros menos conhecidos, temos o FreeBSD e o Solaris.
  • No meio dos dispositivos móveis, temos sistemas operacionais desenvolvidos exclusivamente para eles e que se preocupam mais com atender a necessidades desse tipo de mercado, como otimização máxima dos recursos de energia. Dentre os largamente adotados nesse sentido, citamos o Android, do Google, e o iOS, da Apple.
  • Diversos outros sistemas computacionais também contêm um sistema operacional. Videogames são um exemplo disso: no Playstation 4 da

(^3) O assunto de sistemas operacionais é bastante complexo e requer um material inteiro para ele. Caso tenha interesse em aprofundar-se no assunto, recomendamos a leitura complementar do livro Sistemas operacionais modernos (Tanenbaum, 2013b).

Sony, temos uma variação do FreeBSD chamada de Orbis OS. No ramo de dispositivos embarcados inteligentes, cada vez mais comuns hoje em dia, sistemas operacionais também são empregados. O mais difundido deles é o FreeRTOS.

TEMA 3 – REPRESENTAÇÕES DOS ALGORITMOS

Algoritmos são sequências de passos a serem seguidos para que uma tarefa seja executada com sucesso. Esses passos, os quais podemos chamar também de instruções , apresentam maneiras distintas de representação, especialmente na área da computação, em que já buscamos fazer uma aproximação com a linguagem computacional. Neste tópico vamos, portanto, aprender três diferentes tipos de representações de algoritmos. Essas representações acompanharão você ao longo deste estudo, bem como da vida de programador(a). São elas: a descrição narrativa, o pseudocódigo e o fluxograma.

3.1 Descrição narrativa

A maneira mais simples e intuitiva de construirmos nossos algoritmos é com base em uma linguagem natural. Descrever as instruções utilizando esse tipo de linguagem significa representar, em modo texto, por meio de frases, os passos como se estivéssemos simplesmente tendo uma conversa informal com alguém. É por isso que a descrição narrativa apresenta pouco formalismo e é bastante flexível, não contendo regras. O problema disso é que abre margem para ambiguidades e dupla interpretação, o que faz com que ela acabe não sendo empregada na construção de algoritmos computacionais. Você se lembra do nosso algoritmo do sanduíche, lá na Seção 1.2? Pois bem, ele está escrito na forma de descrição narrativa. Note que muitas das frases lá construídas, por mais detalhadas que estejam, são bastante dúbias, e o que a instrução nos diz para fazer nem sempre fica claro. Vejamos, então, outro exemplo de descrição narrativa. A seguir, temos um algoritmo que recebe dois valores numéricos ( x e y ), verifica se eles são iguais, ou não, e informa, por meio de uma mensagem, o resultado dessa validação. Passo a passo:

a. Ler dois valores ( x e y ).

e. Ler ( x , y ) f. Se (x = y), então... g. Mostrar ( Valores iguais! ) h. Se não... i. Mostrar ( Valores diferentes! ) j. Fim! Não vamos nos ater ainda às nuanças e regras de construção do pseudocódigo. Porém, consegue perceber como temos um conjunto de regras formais bem definidas? Por exemplo, um algoritmo em pseudocódigo deve, sempre, iniciar com a palavra Algoritmo seguida de um nome dado ao seu código (linha 1); assim como sempre finalizar com a palavra Fim (linha 11). Qualquer outra nomenclatura ali utilizada quebra o formalismo do pseudocódigo, resultando em um erro. Outras palavras como Ler , Mostrar , Se , então etc. estão ali empregadas propositalmente e têm um significado específico que será trabalhado no decorrer deste estudo.

3.3 Fluxograma

A última maneira para representar algoritmos com que vamos trabalhar é o fluxograma. Esse tipo de representação serve para escrever um algoritmo de maneira gráfica e empregando símbolos. Embora fluxogramas não sejam interpretados literalmente por nenhum software de programação, o uso de fluxogramas é fundamental para representar a ideia de um código e serve para organizar o raciocínio lógico. Fluxogramas também são muito utilizados para mostrar algoritmos em trabalhos científicos, em apresentações acadêmicas e profissionais, uma vez que mostrar códigos completos em exposições orais tende a não render uma boa prática didática. Sendo assim, é fundamental que você conheça como construir fluxogramas de seus algoritmos, pois em algum momento irá precisar trabalhar com esse recurso, seja no estudo, seja no mercado de trabalho. Existe mais de uma nomenclatura de símbolos distintos, para fluxogramas. A nomenclatura adotada neste estudo é a padronizada e documentada na norma ISO 5807:1985, de Puga e Risseti (2016). A Figura 3 apresenta a simbologia completa da ISO (1985).

Figura 3 – Simbologia para fluxogramas com base na ISO 5807:

Fonte: Elaborado com base em ISO, 1985; Puga; Risseti, 2016, cap. 2.

O mesmo algoritmo proposto na descrição narrativa e no pseudocódigo, agora representado em um fluxograma, pode ser visto na Figura 4. Trabalharemos mais fluxogramas, em detalhes, no decorrer deste estudo.

TEMA 4 – LINGUAGENS DE PROGRAMAÇÃO E COMPILADORES

Aprendemos que pseudocódigo é uma maneira genérica de representar algoritmos em linguagem computacional, sendo o mais próximo que temos de uma linguagem de programação sem necessitar de um software para programar. Mas, afinal, o que é uma linguagem de programação?

4.1 Linguagem de programação

Conforme já aprendemos nesta abordagem, um computador trabalha com codificação binária e, portanto, não compreende mais nada além de bits. Agora, tente imagina um cenário em que você, programador(a), senta na frente do seu computador e começa a escrever seu programa utilizando a linguagem que o computador compreende. O seu algoritmo iria se assemelhar ao ilustrado na Figura 6, ou seja, seria uma sequência quase infinita de zeros e uns. Você consegue se imaginar escrevendo um código dessa maneira? Não? Pois bem, nem nós! Isso porque escrever em binário, embora não impossível, requer um esforço enorme, aumentando demasiadamente o tempo de desenvolvimento de um software.

Figura 6 – Exemplo de código em binário

Crédito: Iunewind/Shutterstock.

Saiba que, no passado, já construímos códigos assim, em binário, mas nessa época desenvolvíamos programas bem mais simples e com pouquíssimos recursos. Um exemplo de máquina programada diretamente bit a bit foi o Altair 8800, criado em 1975 e que funcionava com uma CPU Intel 8080. Todos os interruptores no painel frontal serviam para programar o computador.

Figura 7 – Painel frontal do Altair 8800

Crédito: Jefferson Schnaider.

O surgimento das linguagens de programação mudou para sempre a maneira como programamos. Com elas, passamos a escrever algoritmos de maneira muito mais simples e próxima da forma como nos comunicamos. Boas linguagens são pensadas para serem de fácil entendimento por um ser humano. Não obstante, linguagens de programação apresentam outras facilidades, como a de se escrever códigos que não deem margens para erros de interpretação pelo computador, graças a criação de conjuntos bem rígidos e específicos de regras que, se forem seguidos pelo programador, não irão resultar em instruções ilegíveis pela máquina. Uma linguagem de programação é, portanto, esse conjunto de regras com palavras-chaves, verbos, símbolos e sequências específicas. Chamamos todo esse conjunto de sintaxe da linguagem. A gama de linguagens que temos hoje no mercado é realmente grande e, em breve, comentaremos um pouco mais sobre algumas das mais importantes delas. Mas, vamos primeiro a um breve histórico das linguagens.