Voltar aos Cursos
AI036 Undergraduate

Programação em Python: Uma Introdução à Ciência da Computação

Este é um livro-texto introdutório do nível universitário projetado para ensinar os princípios fundamentais da ciência da computação usando Python como linguagem de programação principal. Foca na resolução de problemas, no design e na programação por meio de um modelo de abordagem espiralada e uma abordagem orientada para gráficos.

4.9
39.0h
793 estudantes
0 curtidas
Inteligência Artificial
Começar a Aprender

Visão Geral do Curso

📚 Resumo do Conteúdo

Este é um livro-texto introdutório de nível universitário projetado para ensinar os princípios fundamentais da ciência da computação usando Python como linguagem principal de programação. Ele foca na resolução de problemas, no design e na programação por meio de um modelo de cobertura espiralada e uma abordagem orientada a gráficos.

Uma introdução suave e abrangente à arte da ciência da computação por meio da perspectiva do Python.

Autor: John M. Zelle

Agradecimentos: Guido van Rossum (Prefácio), Jim Leisy, e colegas acadêmicos da Wartburg College e diversas universidades, incluindo Owen Astrachan, Cay Horstmann e Nell Dale.

🎯 Objetivos de Aprendizagem

  1. Distinguir entre hardware/software e algoritmos/programas.
  2. Explicar como um interpretador Python traduz código de alto nível em instruções executáveis por meio de bytecode.
  3. Definir e invocar funções simples em Python usando parâmetros e argumentos.
  4. Listar e descrever as seis etapas do Processo de Desenvolvimento de Software.
  5. Aplicar regras de sintaxe do Python para criar identificadores válidos e expressões matemáticas com precedência correta de operadores.
  6. Diferenciar os modelos de variáveis "Caixa" e "Nota-cola" e explicar o processo de avaliação e atribuição.
  7. Distinguir os tipos de dados int e float e aplicar conversões explícitas de tipo.
  8. Implementar o padrão de acumulador para resolver problemas matemáticos como fatoriais.
  9. Utilizar a biblioteca math do Python para resolver equações algébricas, incluindo a fórmula quadrática.
  10. Definir e aplicar conceitos centrais de POO: objetos, métodos, acessores, mutadores e aliasing.

🔹 Lição 1: Introdução à Ciência da Computação e Noções Básicas do Python

Visão Geral: Esta lição apresenta a ciência da computação como o estudo de processos computáveis, e não apenas o estudo de máquinas físicas. Os alunos explorarão o conceito da "Máquina Universal", onde o software fornece o poder para transformar hardware em qualquer ferramenta imaginável. A sessão termina com uma introdução técnica às noções básicas do Python, incluindo sua execução baseada em interpretador, definição de funções e a distinção entre sintaxe e semântica.

Resultados de Aprendizagem:

  • Distinguir entre hardware/software e algoritmos/programas.
  • Explicar como um interpretador Python traduz código de alto nível em instruções executáveis por meio de bytecode.
  • Definir e invocar funções simples em Python usando parâmetros e argumentos.

🔹 Lição 2: O Processo de Desenvolvimento de Software e Programas Simples

Visão Geral: Esta lição apresenta a abordagem sistemática para criar software por meio do processo de desenvolvimento de seis etapas e os blocos fundamentais da programação em Python. Os alunos explorarão a sintaxe básica, incluindo identificadores, expressões e atribuição, contrastando o modelo de variável "Nota-cola" com conceitos tradicionais. A lição termina com a implementação de laços definidos usando a função range() para lidar com cálculos repetitivos.

Resultados de Aprendizagem:

  • Listar e descrever as seis etapas do Processo de Desenvolvimento de Software.
  • Aplicar regras de sintaxe do Python para criar identificadores válidos e expressões matemáticas com precedência correta de operadores.
  • Diferenciar os modelos de variáveis "Caixa" e "Nota-cola" e explicar o processo de avaliação e atribuição.

🔹 Lição 3: Representação de Dados Numéricos e a Biblioteca Math

Visão Geral: Esta lição explora como os computadores representam e manipulam dados numéricos, distinguindo números inteiros discretos (inteiros) das aproximações de números reais (ponto flutuante). Os alunos aprenderão a realizar cálculos complexos usando operadores embutidos no Python e a biblioteca math, enquanto compreendem as limitações subjacentes da representação binária e da precisão.

Resultados de Aprendizagem:

  • Distinguir os tipos de dados int e float e aplicar conversões explícitas de tipo.
  • Implementar o padrão de acumulador para resolver problemas matemáticos como fatoriais.
  • Utilizar a biblioteca math do Python para resolver equações algébricas, incluindo a fórmula quadrática.

🔹 Lição 4: Gráficos Orientados a Objetos e GUIs Interativas

Visão Geral: Esta lição transfere os alunos da programação baseada em texto para interfaces gráficas de usuário (GUIs) usando uma abordagem orientada a objetos (OO). Os alunos aprenderão a manipular objetos gráficos (pontos, linhas, formas), gerenciar sistemas de coordenadas e criar programas interativos que respondem a cliques do mouse, pressionamentos de teclas e entradas de texto.

Resultados de Aprendizagem:

  • Definir e aplicar conceitos centrais de POO: objetos, métodos, acessores, mutadores e aliasing.
  • Construir e exibir objetos gráficos, incluindo Pontos, Linhas, Círculos, Retângulos, Elipses e Polígonos.
  • Implementar transformações de coordenadas e elementos interativos (mouse/teclado/caixas de entrada) para criar GUIs funcionais.

🔹 Lição 5: Sequências: Strings, Listas e Entrada/Saída de Arquivos

Visão Geral: Esta lição explora como a ciência da computação representa e manipula sequências de dados, com foco específico em strings e listas. Os alunos aprenderão os mecanismos de indexação e fatiamento, a distinção crítica entre objetos mutáveis e imutáveis, e como interagir com dados externos por meio do processamento de arquivos. Além disso, a lição aborda codificação de dados via Unicode e os princípios fundamentais da criptografia usando cifras básicas.

Resultados de Aprendizagem:

  • Realizar manipulações avançadas de strings e listas usando indexação, fatiamento e métodos embutidos (split, join, upper, lower).
  • Projetar e implementar algoritmos básicos de codificação/descodificação e cifras criptográficas (César e Substituição).
  • Desenvolver programas de processamento em lote que abrem, leem, processam e fecham arquivos de dados externos.

🔹 Lição 6: Definição de Funções e Escopo de Variáveis

Visão Geral: Esta lição explora a transição de escrever scripts monolíticos para criar programas modulares usando funções. Ela cobre a sintaxe para definir e chamar funções, o mecanismo de passagem de informações por meio de parâmetros formais e reais, e como as funções comunicam resultados de volta por meio de valores de retorno (incluindo múltiplos valores e o objeto None). Os alunos também aprenderão sobre escopo de variáveis — especificamente a diferença entre variáveis locais e globais — e como funções podem modificar parâmetros mutáveis para influenciar o estado do programa.

Resultados de Aprendizagem:

  • Demonstrar como definir e invocar funções para reduzir duplicação de código e melhorar a estrutura do programa.
  • Diferenciar entre parâmetros formais e reais e explicar o correspondência por posição.
  • Implementar funções que retornam um único valor, múltiplos valores ou padrão para o objeto None.

🔹 Lição 7: Estruturas de Decisão e Tratamento de Exceções

Visão Geral: Esta lição introduz estruturas de decisão, que permitem que os programas executem sequências diferentes de instruções com base em condições específicas. Os alunos aprenderão a formar expressões booleanas usando operadores relacionais, implementar decisões simples, duplas e múltiplas, e usar aninhamento para lógica complexa. A lição também aborda execução modular com a variável __name__ e gerenciamento robusto de erros por meio do tratamento de exceções.

Resultados de Aprendizagem:

  • Implementar estruturas de decisão simples, duplas e múltiplas usando if, else e elif.
  • Construir e avaliar expressões booleanas usando operadores relacionais e ordenação lexicográfica para strings.
  • Aplicar o padrão try-except para lidar com erros em tempo de execução e evitar falhas no programa.

🔹 Lição 8: Laços Indefinidos e Lógica Booleana

Visão Geral: Esta lição transita dos laços definidos ("contados") para laços indefinidos, que executam com base em condições, em vez de uma sequência fixa. Os alunos dominarão a instrução while e diversos padrões de design para processamento de dados, incluindo laços interativos, laços com sinalizador e laços baseados em arquivos. Além disso, a lição aborda a Lógica Booleana, fornecendo as ferramentas algébricas necessárias para construir e simplificar estruturas de tomada de decisão complexas no código.

Resultados de Aprendizagem:

  • Projetar e implementar laços indefinidos usando a instrução while do Python.
  • Aplicar padrões comuns de laço, incluindo laços interativos, laços com sinalizador e o padrão de leitura inicial.
  • Simplificar condições lógicas complexas usando Álgebra Booleana e Leis de DeMorgan.

🔹 Lição 9: Simulação, Design e Refinamento Progressivo

Visão Geral: Esta lição explora o processo sistemático de desenvolver programas de computador complexos por meio do Design Top-Down e do Refinamento Progressivo. Os alunos aprenderão a decompor problemas grandes em partes menores e gerenciáveis usando abstração e modularização, visualizar hierarquias de programas por meio de Diagramas de Estrutura, e implementar simulações usando técnicas de Monte Carlo. O currículo também aborda estratégias de desenvolvimento iterativo como Prototipagem e Desenvolvimento em Espiral, além de métodos robustos de teste como Testes Unitários.

Resultados de Aprendizagem:

  • Decompor um problema complexo em subproblemas menores e solucionáveis usando o Design Top-Down.
  • Construir e interpretar Diagramas de Estrutura que ilustram fluxo de dados (parâmetros e valores de retorno) entre módulos.
  • Aplicar técnicas de simulação de Monte Carlo para modelar eventos probabilísticos usando a biblioteca random do Python.

🔹 Lição 10: Definição de Classes e Programação Baseada em Eventos

Visão Geral: Esta lição transita da abordagem procedural baseada em funções para o design baseado em objetos usando classes em Python. Os alunos aprenderão a encapsular dados (variáveis de instância) e comportamentos (métodos) em uma única unidade, criar widgets de interface gráfica interativa, e gerenciar o fluxo do programa por meio de programação baseada em eventos e loops de animação sincronizados.

Resultados de Aprendizagem:

  • Diferenciar entre designs de programas baseados em funções e baseados em objetos.
  • Definir classes personalizadas em Python usando construtores (__init__), variáveis de instância e o parâmetro self.
  • Implementar encapsulamento e documentação usando docstrings.

🔹 Lição 11: Coleções de Dados: Listas Avançadas e Dicionários

Visão Geral: Esta lição explora técnicas avançadas de coleção de dados em Python, com foco na natureza versátil de listas e dicionários. Os alunos aprenderão a distinguir listas de arrays tradicionais, realizar operações complexas em listas como fatiamento e ordenação de registros, e aplicar mapeamento não sequencial através de dicionários. O módulo culmina com a aplicação dessas estruturas em análises estatísticas e algoritmos clássicos como o Crivo de Eratóstenes.

Resultados de Aprendizagem:

  • Contrastar as listas dinâmicas do Python com arrays de tamanho fixo e homogêneos.
  • Realizar manipulações avançadas de listas, incluindo fatiamento, exclusão seletiva e ordenação personalizada de registros de objetos.
  • Implementar algoritmos estatísticos (média, mediana, desvio padrão) e designs baseados em tabelas usando coleções.

🔹 Lição 12: Princípios do Design Orientado a Objetos (OOD)

Visão Geral: Esta lição explora a transição do design funcional top-down para o Design Orientado a Objetos (OOD), uma abordagem centrada em dados onde sistemas são descritos como uma coleção de "caixas pretas" interativas (objetos). Os alunos aprenderão a identificar objetos e métodos candidatos, implementar simulações multi-classe como Racquetball e Poker com Dados, e aplicar os três pilares da POO: Encapsulamento, Polimorfismo e Herança. A lição culmina com a gestão de interações complexas em interfaces gráficas (GUIs) por meio de herança e sobrecarga de métodos.

Resultados de Aprendizagem:

  • Identificar classes e métodos potenciais a partir de um enunciado de problema analisando substantivos e verbos.
  • Implementar uma simulação complexa com múltiplos objetos usando classes estruturadas (por exemplo, Player, Game, Stats).
  • Distinguir e aplicar os conceitos fundamentais de encapsulamento, polimorfismo e herança.

🔹 Lição 13: Projeto de Algoritmos, Recursão e Eficiência

Visão Geral: Esta lição explora as técnicas fundamentais usadas para resolver problemas computacionais de forma eficiente. Ela abrange estratégias de busca, os mecanismos da resolução recursiva de problemas (casos-base e etapas recursivas), e uma comparação entre algoritmos de ordenação como Selection Sort e Merge Sort para entender como o design de algoritmos afeta o desempenho.

Resultados de Aprendizagem:

  • Comparar e implementar estratégias de Busca Linear e Busca Binária.
  • Projetar funções recursivas usando casos-base e etapas recursivas para problemas como inversão de string e exponenciação rápida.
  • Analisar trade-offs de desempenho entre recursão e iteração e entre diferentes algoritmos de ordenação (n^2 vs. n \log n).