Instituto de Computação — Universidade de Campinas |
---|
Algoritmos e Programação de Computadores |
Primeiro Semestre de 2021 – MC10W |
Prof. Lehilton Lelis Chaves Pedrosa |
Monitores Guilherme, Marcelo (PED) e Henrique, Matheus, Giovani (PAD) |
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).
Adequação das atividades
Considerando a situação excepcional, devido à pandemia do novo coronavírus, as atividades de ensino-aprendizagem dar-se-ão online. Espera-se que cada estudante tenha disponível
-
Um computador desktop ou laptop, com sistema operacional Unix-like (Linux/MacOS) ou Windows 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.
Caso algum@ estudante não tenha acesso aos recursos necessários, ou não possa realizar as atividades programadas por quaisquer questões pessoais, deve-se enviar um e-mail diretamente para o professor explicando os motivos no início do semestre. Será proposto um plano alternativo adequado a cada caso.
Atividades
Aula expositiva
As aulas ocorrerão online via Google Meet. O professor fará a exposição do conteúdo das várias unidades e, depois disso, os @s estudantes devem participar levantando questões, sugestões, ou possivelmente resolvendo os problemas solicitados. A qualquer momento, estudantes podem tirar dúvidas com o professor.
Listas de exercícios para fixação
Serão propostos diversas listas de exercícios para fixação para serem realizados após as aulas. O conteúdo das listas é considerado parte integrante do curso. Há tanto questões teóricas quanto práticas. Implementar os programas solicitados nas questões serve como um exercício mais simples antes das tarefas de programação. Recomenda-se tentar fazer esses exercícios tanto individualmente quanto em grupo.
Vocês podem compartilhar e discutir e trechos de códigos nessas listas de exercícios para fixação. Sempre que copiar ou discutir qualquer trecho de código de um exercício, é obrigatório fazer um comentário indicando a fonte ou as pessoas com quem discutiu. Essa é uma oportunidade de compartilhar e trocar experiências com seus colegas. Como as questões são abertas, não há gabarito; as dúvidas devem ser anotadas e levadas a monitoria nos horários de atendimentos, ou ao professor.
Todos os exercícios de fixação deverão ser colocados no repositório pessoal git de cada estudante, de maneira organizada. Esses exercícios não serão corrigidos e não é obrigatório realizar cada lista completamente, mas ter realizado ou tentado realizar uma parte considerável dos exercícios regularmente é importante para a nota de participação.
Tarefas
Haverá 10 tarefas individuais que servirão de avaliação da disciplina.
O número previsto de tarefas pode mudar a depender do andamento da
turma. Cada tarefa é um conjunto de um ou mais exercícios de
programação ou trabalhos mais elaborados, que deverão ser
implementados na linguagem de programação C. Todas as tarefas devem
ser desenvolvidas em um repositório de controle de versões Git,
utilizando a infraestrutura do IC https://gitlab.ic.unicamp.br/.
Para criar uma conta, logue-se no sistema utilizando a senha fornecida
pelo IC. Cada estudante terá um repositório de nome raXXXXXX
, em que
XXXXXX
corresponde ao número de RA.
A sequência das atividades será a seguinte:
-
O enunciado da tarefa é publicado após ou simultaneamente os conteúdos correspondentes serem ministrados.
-
Um conjunto de arquivos auxiliares da tarefa será inserido automaticamente no repositório pessoal em um diretório de nome
tarefaNN
, ondeNN
é o número da tarefa. Esses arquivos auxiliares podem ser acessados bastando executar o comandogit pull
na cópia de trabalho pessoal. -
@ 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. É obrigatório que todo o desenvolvimento da tarefa seja registrado utilizando o controle de versões, isso é, não escreva suas tarefas e copie de outros locais e faça commit mesmo dos programas não prontos, parcialmente escritos. Não serão aceitas tarefas que não tenham histórico de commits ou submetidas por outros meios. -
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. -
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.
As tarefas serão corrigidas pelo sistema de correção automática e/ou por um monitor. Algumas tarefas determinadas (especificadas no enunciado), deverão ser apresentadas pessoalmente a um monitor por meio de videoconferência de maneira sucinta nos horários de atendimento disponíveis. Além disso, @s estudantes são encorajad@s a mostrar e conversar sobre suas dúvidas e seus códigos com os monitores, via chat e videoconferência, sempre que desejarem nos canais de atendimento.
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 8): os objetivos mínimos foram alcançados, mas há questões pontuais que podem ser melhoradas; deve-se prosseguir à proxima atividade;
- C (valor 6): 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.
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:
- Cada tarefa terá um prazo recomendado de pelo menos uma semana a partir da publicação. Se uma tarefa for entregue depois do prazo recomendado, será descontado 10% da nota correspondente.
- Todas as tarefas são obrigatórias e devem ser entregues até 9/7/2021.
- Uma tarefá só será corrigida após as tarefas anteriores tiverem sido realizadas corretamente (tiverem recebido conceitos A, B ou C).
É 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 nota da disciplina será a média ponderada de duas partes
- A média aritmética M das notas de todas as tarefas, valendo de 0 a 10.
- A nota de participação P do estudante atribuída pessoalmente pelo professor, valendo de 0 a 10.
Serão considerados aprovados os estudantes que tiverem obtido conceito pelo menos C em todas as tarefas. Nesse caso, a nota de aproveitamento será A=0,7M+0,3P. Do contrário, a nota de aproveitamento do semestre será A=mínimo{4,M}.
Nota de participação
Todos estudantes terão frequência 100%. Para calcular a nota de participação serão levadas em conta tanto a participação nas aulas online quanto a realização das demais atividades. Isso será monitorado considerando a atividade regular no repositório git bem como a participação nas aulas, no chat de discussão e no atendimento. Para garantir a nota máxima de participação, deve-se:
- Manter atividade regular no repositório git com realização de 50% ou mais das questões em cada uma das listas de exercícios para fixação (até 5 pontos).
- Participar continuamente das aulas e/ou dos canais de chat, compartilhando dúvidas, respondendo perguntas ou fazendo comentários pertinentes sobre a disciplina (até 5 pontos).
- Apresentar uma tarefa (entre as de número 4 a 10) ao professor nos canais de atendimento aumentará a nota de participação em 3 pontos. Não será uma correção ou atribuição de nota da tarefa. O objetivo é dar uma oportunidade para conversar e receber feedback diretamente do professor sobre alguma atividade mais elaborada realizada.
Exame
Aquel@ estudante que não tiver conseguido completar todas as tarefas até o prazo poderá realizar exame. Como exame, o professor solicitará a realização de um subconjunto das tarefas com prazo de pelo menos uma semana e atribuirá nota E. Para estudantes que fizerem o exame, a nota final será mínimo{5,(A+E)/2}.
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 independentemente de origem, 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.
- É proibido utilizar ajuda de terceiros (amigos, professores particulares, etc.) para realizar as tarefas sem autorização expressa do professor da disciplina.
- É permitido compartilhar e discutir sobre trechos de código apenas dos exercícios para fixação. Sempre que utilizar trechos de código de outras pessoas ou de outras fontes, deve-se indicar isso explicitamente.
- É permitido tirar dúvidas e discutir a respeito de tarefas de programação com colegas e monitores. Mas toda discussão deve ser feita em canais abertos no Discord e não é permitido compartilhar algoritmos (em português, código ou pseudocódigo) nem ideias prontas de solução etc.
- 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.
- Cláusula de arrependimento: se você cometer qualquer tipo de fraude, mas reconhecê-la antes de ser comunicad@, então o professor irá relaxar as ações acima por ações locais.
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.
- D. Harel. Algorithmics, Addison Wesley, 3ª edição, 2004.
- 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].
- The Python Tutorial, https://docs.python.org/3/tutorial/
- 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.
- Guttag, John V. Introduction to computation and programming using Python, Mit Press, 2013.
- 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.
- Miller, B. et al. How to Think Like a Computer Scientist: Interactive Edition, https://runestone.academy/runestone/static/thinkcspy/index.html
- 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.
- 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.
Aulas e atendimento
As aulas expositivas com o professor serão via Google Meet às terças das 21 às 23h e às quintas das 19 às 21h. Será divulgado um link individual acessar a videoconferência de cada aula. Para acessar o link, deve-se usar a conta de e-mail institucional DAC (i.e., o e-mail da forma 123456@dac.unicamp.br).
O atendimento e comunicação entre estudantes, professor e monitores
serão feitos via Discord. Cada estudante
receberá um link por e-mail com o convite para se cadastrar no
servidor. Você pode utilizar uma conta de Discord existente, mas deve
alterar seu apelido no servidor da disciplina para seu nome completo e
número de RA (e.g., Fulano da Silva (123456)
). Se preferir, também
pode criar uma conta nova com e-mail institucional.
É recomendável utilizar o Discord a partir do computador (utilizando o programa para desktop ou o site), mas também é possível baixar e instalar o aplicativo de celular disponível.
Todos podem escrever e ler as mensagens nas salas de atendimento e vocês são fortemente encorajados tanto a fazer perguntas quanto a 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 na tabela abaixo. Os horários de atendimento podem sofrer alterações de acordo com a demanda de estudantes e disponibilidade dos monitores.
Observações importantes:
-
Observe os horários de atendimento com atenção e siga as regras descritas no servidor do Discord.
-
Para correção de tarefas que peçam apresentação, compareça a um atendimento com um monitor PED.
-
O professor responderá dúvidas gerais durante as aulas após a parte inicial com a exposição do conteúdo. Para conversar pessoalmente e individualmente com o professor, você deve procurar atendimento nos horários marcados com asterisco que correspondem aos horários de laboratório reservados para a disciplina. Se houver várias pessoas procurando atendimento ao mesmo tempo, deve-se esperar a vez ou voltar no próximo horário disponível, respeitando a fila.