Apresentação da disciplina

Instituto de Computação — Universidade de Campinas
Algoritmos e Programação de Computadores
Primeiro Semestre de 2020 – MC102QR
Prof. Lehilton Lelis Chaves Pedrosa
Monitores Italos, Welverton (PED) e Andreis, Rafael, Rodrigo (PAD)

Adequação das atividades

Considerando a situação excepcional, devido à pandemia do novo coronavírus, e as instruções da reitoria da Unicamp, as atividades de ensino-aprendizagem devem continuar, adequando as atividades que originalmente foram planejadas para serem realizadas nas salas de aula e de laboratório. Tenham em mente que isso poderá implicar prejuízo no aprendizado, então é importante que tod@s estudantes se mantenham interessad@s e dedicad@s à disciplina.

Recursos necessários

Para a realização das atividades não presenciais, cada estudante deverá ter acesso, em casa ou no local em que preferir trabalhar, aos seguintes recursos:

  • Um computador desktop ou laptop, com sistema operacional Windows ou Unix-like (Linux/MacOS) em que seja possível instalar Python 3 e Git

  • Acesso a Internet com conexão estável nos horários de atendimento programados. Não é necessário ter conexão de alta velocidade.

Plano alternativo

Caso algum@ estudante não tenha acesso aos recursos necessários, ou não possa realizar as atividades programadas por questões pessoais, deve-se enviar um e-mail diretamente para o professor explicando os motivos. Será proposto um plano alternativo adequado a cada caso.

Chat e atendimento

Foi criado uma sala para conversas e dúvidas na plataforma:

http://chat.google.com/

É recomendável acessar esse site utilizando um computador, mas também é possível baixar e instalar o aplicativo de celular disponível. Procurem por Hangouts Chat.

Para acessar, é necessário fazer login com a conta coorporativa da Unicamp, i.e., seu e-mail que tem o formato parecido com a123456@dac.unicamp.br. Uma vez logado no aplicativo, procure pela sala chamada MC102QR.

Todos podem escrever e ler as mensagens nessa sala, assim você pode fazer perguntas ou mesmo responder dúvidas de colegas. O professor e os monitores acompanharão as conversas e tentarão responder sempre que possível. Pelo menos um monitor ficará disponível no chat nos horários de atendimento marcados abaixo:

segunda terça quarta quinta sexta
10h - 11h professor professor
14h - 16h atendimento
16h - 18h atendimento atendimento atendimento atendimento atendimento

Esses horários podem sofre alterações de acordo com a demanda de estudantes e disponibilidade dos monitores.

ATENÇÃO: Se após 15 min após o início da sessão de atendimento não houver nenhum estudante solicitando ajuda, os monitores poderão desconectar-se do chat. Nesse caso, estudantes que precisarem de atendimento poderão devem mandar um e-mail para os monitores em monitores-mc102@googlegroups.com.

Adequação das aulas

Não haverá aulas de laboratório.As aulas expositivas serão substituídas por leituras do material disponível no site e posterior realização de exercícios de fixação. O professor irá utilizar os horários das aulas expositivas para tirar dúvidas ou resolver exercícios de fixação a respeito do último conteúdo ministrado.

No início do horário de atendimento do professor, será disponibilizado um link de uma videoconferência no chat. Os alunos podem participar dessa chamada clicando no link. Será compartilhado o vídeo da tela com o conteúdo e as explicações serão feitas por áudio.

Adequação de avaliação

As tarefas seguirão o mesmo fluxo definido anteriormente. As tarefas verificadoras ainda devem ser apresentadas aos monitores. Para isso, é necessário entrar no Chat em algum dos horários de atendimento e informar que deseja apresentar sua tarefa. O monitor incluirá você na fila em ordem de submissão. Assim que disponível, o monitor enviará um link em particular para uma videoconferência.

Nessa videoconferência, você precisará compartilhar a tela do seu computador e precisará ter microfone e alto-falante funcionando e corretamente configurados. Caso não seja possível, o monitor ainda terá acesso a sua tarefa pelo repositório e dará o feedback de maneira escrita; no entanto, isso tornará o processo mais lento e trabalhoso.

Tenha em mente que a apresentação da tarefa consiste de uma conversa de 5 a 10 min com o monitor, com perguntas, para observar erros e fazer correções eventuais. Se houver muit@s estudantes na fila, pode ser necessário voltar em outro horário de atendimento.

Não será realizado controle de presença (presencial ou virtual) e todos estudantes terão 100% de frequência.

Adequação de exame

O exame será substituído por uma atividade de programação com prazo de entrega de 24h seguida de uma entrevista com o professor via videoconferência sobre essa tarefa, agendada em comum acordo com @ estudante.

Introdução

Este é o plano de desenvolvimento da disciplina e um guia de estudos. Leia-o com atenção e consulte este documento durante todo o semestre. Também, sempre acompanhe os avisos na página da disciplina.

Objetivos

Ao final do curso, @ estudante deverá ser capaz de:

  • descrever problemas computacionais, computabilidade e limitações;
  • descrever organização básica de computadores e de sistemas de software;
  • utilizar estruturas de dados elementares: variável, lista, matriz
  • implementar e testar programas escritos em Python.
  • escrever algoritmos iterativos e recursivos;

Pré-requisitos

A disciplina não tem pré-requisitos formais. O foco será em problemas computacionais e algoritmos, então ter tido uma experiência anterior com programação pode ajudar a desenvolver as atividades ministradas, mas não substitui nem é necessário para o bom andamento da disciplina.

Ao início do curso, é recomendável que @ estudante seja capaz de:

  • desenvolver e executar um cronograma de estudo contínuo;
  • interpretar e descrever problemas e situações textualmente;
  • consultar, organizar e resumir fontes de pesquisa diversas (bibliotecas e internet).

Atividades

Aula expositiva

Durante as aulas, @s estudantes devem participar levantando dúvidas, sugestões, ou possivelmente resolvendo os problemas solicitados. A qualquer momento @ estudante pode e deve tirar dúvidas com o professor. Sempre que adequado, serão propostos exercícios que devem ser feitos em sala. Durante a aula expositiva o uso de qualquer equipamento eletrônico (celular, tablet, notebook etc.) é permitido somente nos momentos em que houver autorização expressa do professor.

Aula no laboratório

As tarefas da disciplina deverão ser feitas em casa e, principalmente, durante as aulas de laboratório. Nessas aulas, há o atendimento direto dos monitores, que poderão auxiliar no entendimento do enunciado, dúvidas específicas sobre o conteúdo e outros assuntos. A participação nas atividade de laboratório é obrigatória. Além disso, o horário das aulas de laboratório corresponde ao horário reservado para a apresentação das tarefas (veja abaixo).

Tarefas

Haverá uma série de tarefas que servirão de avaliação da disciplina. Cada tarefa é um conjunto de uma ou mais atividades, podendo conter questões dissertativas, exercícios de programação ou trabalhos mais elaborados.

Repositório e dinâmica de trabalhos

Todas as tarefas devem ser desenvolvidas em um repositório de controle de versões Git, utilizando a infraestrutura do IC no grupo https://gitlab.ic.unicamp.br/mc102-2020. Para criar uma conta, logue-se no sistema utilizando a senha fornecida pelo IC. Cada estudante terá um repositório de nome raNNNNNN, em que NNNNNN corresponde ao número de RA.

A sequência das atividades será a seguinte:

  1. A tarefa é publicada na página da disciplina após ou simultaneamente os conteúdos correspondentes serem ministrados.

  2. Um conjunto de arquivos auxiliares da tarefa será inserido automaticamente no repositório pessoal em um diretório de nome tarefaNN, onde NN é o número da tarefa. Esse arquivos auxiliares podem ser acessados bastando executar o comando git pull na cópia de trabalho pessoal.

  3. @ estudante realiza os vários exercícios da tarefa, alterando ou incluindo novos arquivos no repositório correspondente. À medida em que cada pequeno passo for realizado, deve-se fazer um git commit com uma mensagem adequada. É importante que todo o desenvolvimento da tarefa seja registrado passo a passo utilizando o controle de versões. Não serão aceitas tarefas que sigam outro fluxo ou submetidas por outros meios.

  4. A cada pequena parte implementada, deve-se testar o programa. Para isso, pode-se executar em um terminal python3 testar.py, o que executará um script de teste fornecido juntamente com os arquivos auxiliares. Além desses, pode ser necessário criar outros testes.

  5. Terminada a hora de trabalho, @ estudante executa o comando git push. Isso enviará as alterações para o repositório remoto. Além disso, ativará um script de correção, que testará automaticamente a tarefa (utilizando os mesmos arquivos auxiliares e/ou outros testes). O resultado dessa correção ficará anotada na planilha de notas disponibilizada para cada aluno.

Tipos de tarefa

As tarefas serão classificadas em dois tipos.

  1. Tarefas regulares: Essas são tarefas mais simples e serão corrigidas apenas pelo script de correção automático, que poderá verificar desde a mera inclusão dos arquivos solicitados até a verificação de casos de testes mais elaborados.

  2. Tarefas de verificação: Essas são tarefas de verificação de aprendizado (checkpoints) e servem para verificar o aprendizado de um conteúdo ou conjunto de conteúdos anteriores. Essas tarefas podem ter formato aberto. Após a submissão e verificação automática de cada uma dessas tarefas, ela deve ser apresentada pessoalmente e sucintamente para algum monitor no horário das aulas de laboratório (ou no horário de atendimento se não houver tempo durante a aula).

Prazos

A disciplina adotará um método de avaliação contínua e individualizado. Assim, as tarefas serão divulgadas continuamente, de acordo com os conteúdos ministrados, mas cada um@ poderá levar mais tempo ou menos tempo para executá-las, de acordo com seu aprendizado sobre o conteúdo. As regras são as seguintes:

  • Todas as tarefas são obrigatórias e devem ser entregues até 5/7/2020.
  • Uma tarefá só será corrigida após as tarefas anteriores terem sido realizadas corretamente.

É responsabilidade de cada um@ organizar e dividir o tempo para realizar cada atividade. Recomenda-se fortemente que se realize a maior parte dos exercícios possível durante as aulas de laboratório e não se deixem tarefas pendentes acumuladas.

Avaliação

A cada tarefa será atribuído um conceito com os seguintes valores e significados:

  • A (valor 10): a tarefa foi executada satisfatoriamente; deve-se prosseguir à proxima atividade;
  • B (valor 7): os objetivos mínimos foram alcançados, mas há questões pontuais que podem ser melhoradas; deve-se prosseguir à proxima atividade;
  • C (valor 5): nem todos os objetivos mínimos foram alcançados; a tarefa é considerada aprovada, mas recomenda-se corrigi-la e submeter novamente;
  • D (valor 0): a tarefa não foi realizada, ou os objetivos não foram satisfeitos; é obrigatório refazer a tarefa.

Serão calculadas as médias aritméticas dos valores atribuídos a todas as tarefas, M. @ estudante será aprovad@ com nota de aproveitamento A := M se satisfizer todos os critérios abaixo:

  1. ter 75% de frequência;
  2. obter conceito pelo menos C em todas as tarefas.

Do contrário, a nota de aproveitamento do semestre será A := mínimo {4, M}.

Observação: A frequência será controlada por listas de presença ou pela participação nas avaliações. É obrigatória a presença nas aulas teóricas e de laboratório. Não poderá assinar a lista @ estudante que chegar com 20 min de atraso ou sair com 20 min de antecedência; em caso de atestado, envie uma cópia por e-mail ao professor no prazo de 15 dias e mantenha o documento original. Estudantes que, justificadamente, não puderem comparecer a pelo menos 75% das aulas devem conversar com o professor no início do semestre. Importante: Em qualquer momento, se tiver dúvidas ou tiver dificuldade em cumprir os critérios, procure o professor (o quanto antes!).

Exame

Poderá realizar exame, com nota E, entre 0 e 10, no dia 14/7/2020, @ estudante com 75% de frequência e nota A ≥ 2,5. Se @ estudante fizer o exame, a nota final será mínimo {5, (A+E)/2}, senão a nota final será A.

Fraude

Em caso de fraude (plágio, atestado falso, assinar lista por colegas, abandonar aula após assinar, usar bibliotecas não permitidas, copiar quaisquer trechos da internet sem autorização expressa, mostrar ou distribuir laboratório de programação individual, cola ou consulta a material proibido etc.), os envolvidos serão reprovados com nota 0 e será registrada a ocorrência no histórico escolar. Fique atento:

  • Cada um@ é responsável por manter seguros os arquivos de seu repositório. Não compartilhe sua senha nem deixe cópias de arquivos em computadores compartilhados. Todas as tarefas são individuais. As tarefas em que for permitido compartilhar ou utilizar trechos de código de outras fontes irão indicar isso explicitamente.

  • O material disponibilizado e os trabalhos apresentados nas avaliações são para uso exclusivo da disciplina. Não compartilhem seus trabalhos mesmo após o término da disciplina. Se desejar publicar algum trabalho que realizou, converse antes com o professor.

Conteúdo e bibliografia

A disciplina não seguirá nenhum livro específico. Serão utilizadas diversas fontes bibliográficas, a depender do conteúdo. A parte introdutória da disciplina abordará conceitos fundamentais para algoritmos e será baseada principalmente nos capítulos introdutórios das referências [1] e [2]. Essas referências estão em inglês, mas as principais definições serão resumidas em português na página da disciplina.

  1. D. Harel. Algorithmics, Addison Wesley, 3ª edição, 2004.
  2. D. Harel. Computers Ltd.: what they really can't do, Oxford Univ. Press, 2000.

As fases seguintes abordarão as principais construções da linguagem de programação Python e serão baseadas principalmente no tutorial disponibilizado na documentação oficial do Python. O tutorial original é escrito em inglês [3], mas a versão traduzida é atualizada e igualmente recomendada [4].

  1. The Python Tutorial, https://docs.python.org/3/tutorial/
  2. O Tutorial Python, https://docs.python.org/pt-br/3/tutorial/

Alguns conteúdos e definições mais formais serão extraídos da referência [5], particularmente a respeito de teste e práticas de programação. Também, vários exemplos e exercícios podem ser extraídos da referência [6], embora não abordaremos alguns assuntos mais avançados desse livro.

  1. Guttag, John V. Introduction to computation and programming using Python, Mit Press, 2013.
  2. Sedgewick, Robert, Kevin Wayne, and Robert Dondero. Introduction to programming in Python: An interdisciplinary approach, Addison-Wesley Professional, 2015.

Além das referências anteriores, pesquisar com cuidado na internet também é um bom jeito de aprender. Se você é proficiente em inglês e gosta de realizar atividades online, então pode ser divertido seguir o livro interativo [7], mas ele segue uma ordem um pouco diferente da adotada na disciplina. Existe uma tradução em português desse livro [8] disponibilizada pelo IME/USP, mas ela não está tão atualizada e contém alguns problemas nos códigos interativos.

  1. Miller, B. et al. How to Think Like a Computer Scientist: Interactive Edition, https://runestone.academy/runestone/static/thinkcspy/index.html
  2. Miller, B. et al. Aprendendo com Python: Edição interativa, https://panda.ime.usp.br/pensepy/static/pensepy/index.html

Nesta disciplina, usaremos principalmente lápis e papel para simular e entender trechos de código, mas algumas vezes pode ser conveniente utilizar alguma ferramenta interativa, como [9]. Ferramentas como essa devem ser utilizadas apenas no início do curso para trechos muito curtos de código; com o decorrer do tempo, utilizaremos ferramentas de teste e depuração.

  1. Philip J. Guo. Online Python Tutor: Embeddable Web-Based Program Visualization for CS Education. In: SIGCSE, 2013. http://pythontutor.com/visualize.html

Material didático

A página da disciplina conterá um material de apoio, incluindo uma breve discussão sobre cada unidade, algumas definições e exemplos utilizados em aula. Esse material não é uma referência completa do conteúdo e existe apenas para auxilar o professor durante as aulas expositivas ou, depois, para relembrar o que foi discutido em sala. Para o estudo, é recomendado que @ estudante, principalmente, pratique programação resolvendo e implementando os exercícios propostos e, além disso, busque e estude exemplos de código-fonte nos capítulos correspondentes dos livros-textos.

O template da página da disciplina foi adaptado de startbootstrap.com

Horário e local

As aulas teóricas serão ministradas das 10 às 12h na sala CB02 às terças e quintas-feiras. As práticas de laboratório serão ministradas pelo docente e pelos monitores no IC3, sala CC00, às segundas-feiras das 14 às 16h (turma Q) e das 16 às 18h (turma R).

Atendimento

Sempre que possível, o professor reservará um momento no final das aulas teóricas para uma sessão breve de dúvidas. Se for necessário, pode-se combinar um atendimento presencial; para isso, envie um e-mail ao professor com antecedência. @s estudantes são fortemente encorajados a procurar monitoria, tirando dúvidas sobre o conteúdo e exercícios. Os horários de atendimento serão divulgados na página da disciplina.

Além disso, se não for possível sanar as dúvidas no horário de atendimento, @s estudantes podem contatar os monitores por e-mail monitores-mc102@googlegroups.com. Sempre que for compartilhar trechos de código do laboratório, certifique-se de que apenas os monitores recebam o código.