Local: LEP-1 (às 5as) e sala F2-006 (às 3as e 6as).
Horário: das 8h às 10h.
Início: 12 de abril de 2022.
Às sextas-feiras, eventualmente, a aula será remota
nesta sala do Google Meet.
Aulas remotas nas seguintes sextas: 29/04, 13/05, 20/05, 27/05, 03/06, e também excepcionalmente nos dias 24/05, 31/05, 02/06 e 07/06 por conta da COVID do professor. :-(
Repositório do código criado em sala de aula:
https://github.com/vigusmao/Comp1_2022_1
Ementa aproximada:
- Introdução à programação em linguagem C
- Variáveis
- Entrada e saída de dados
- Funções
- Operações aritméticas e lógicas
- Estruturas condicionais
- Laços
- Recursão
- Structs
- Alocação de memória
- Arrays estáticos e dinâmicos
- Ponteiros
Provas:
- P1: sexta-feira, 10/06
- P2: terça-feira, 19/07
- PF: quinta-feira, 28/07
Critérios de aprovação:
M = (P1 + P2) / 2 ≥ 5.0 --> aprovação direta;
do contrário, MF = (max(P1, P2) + PF) / 2 ≥ 5.0 --> aprovação;
MF < 5.0 --> reprovação.
Material de apoio:
Curso online de C em português (sem arrays, sem ponteiros e sem structs).
Tutorial online sobre arrays e ponteiros em C.
Curso online de C em inglês.
Prova de período anterior, para ajudar nos estudos.
Lista de Exercícios para a P2 aqui.
Conteúdo das aulas
12/04
Conversa inicial sobre o curso. Apresentação da ementa. Linguagens compiladas e interpretadas. Alguns prós e contras da linguagem C.
14/04
LAB 1.
Variáveis do tipo int. Saída de dados via printf(). Declarando funções que retornam algo e funções que nada retornam (void).
Programando sem muitos recursos num editor de texto como o vi e compilando pelo terminal: "gcc -o arquivo_executavel codigo_fonte.c"
A função main(). Exemplo de programa simples: o famigerado "Hello World", depois um simples cálculo de Índice de Massa Corporal.
Código feito em sala de aula no GitHub.
26/04
Um pouco mais sobre declaração de variáveis e atribuições. Escopo das variáveis.
Condicional com if e com if...else.
Operadores ==, >, >=, <, <=.
28/04
LAB 2.
Exercitando condicionais, entrada via scanf e saída via printf.
Laços com o while. As instruções break e continue dentro de um laço.
30/04
Sexta-Feira Remota de código com o professor: exercitando tudo que vimos até aqui, e introduzindo comentários (em linha e em bloco) no código.
Gravação da aula no Google Drive.
Código escrito durante a aula no GitHub.
03/05
Loops com for.
Operadores ++, --, +=, -=.
Exercício em sala de aula: Fizz-Buzz. Comparando soluções.
05/05
LAB 3.
(1) Escreva uma função que diga se um número inteiro, passado como parâmetro, é um número primo.
(2) Escreva a função main(), pedindo números para o usuário, e classificando-os como primo ou não-primo.
(3) Liste todos os primos menores ou iguais ao número digitado pelo usuário.
Solução proposta em sala de aula no GitHub.
06/05
Comentários sobre como melhorar a performance da função que descobre se um número é primo:
testando divisibilidade apenas por 2 e pelos ímpares menores que a raiz quadrada do número. Obtendo a raiz quadrada via sqrt(),
da biblioteca math.h (que precisa ser incluída via #include).
Arrays estáticos e dinâmicos. Declaração, alocação de memória e devolução da memória.
Como "crescer" um array? Não é possível. Não dá pra fazer um "puxadinho"; é preciso alocar novo array e copiar tudo do velho para o novo.
10/05
Ponteiros.
Passagem de parâmetros para funções por valor versus por referência.
12/05
LAB 4.
Treinando passagem por valor versus passagem por referência.
Para casa: escrever uma função que receba um array como parâmetro e inverta as k primeiras posições desse array, para um k dado.
13/05
Três maneiras de se atribuir valor a uma variável declarada como um ponteiro:
(1) copiando o endereço de outra variável já existente;
(2) alocando memória explicitamente;
(3) copiando outro ponteiro.
Exercício ilustrando passagem de parâmetros por valor e por referência.
Solução do problema final do LAB 4.
Gravação da aula no Google Drive.
20/05
LAB 5 (execpcionalmente numa sexta-feira, devido às duas aulas perdidas na semana).
Treinando quase tudo.
O problema dos armários.
Fazendo com que uma mesma função retorne mais de um valor, via parâmetros passados por referência.
O problema das temperaturas.
Gravação da aula no Google Drive.
24/05
Arrays sendo passados como parâmetros. Arrays multidimensionais.
Código escrito durante a aula.
Gravação da aula no Google Drive.
26/05
LAB 6.
Um sisteminha bancário. Enunciado no próprio arquivo.
27/05
Solução do LAB 6 (vide arquivo apresentado na aula anterior).
Arrays "paralelos".
Variáveis globais.
Gravação da aula no Google Drive.
31/05
Arrays multidimensionais dinâmicos.
Gravação da aula no Google Drive.
02/06
Resolução da lista de exercícios (prova de 2014).
Aprendendo a gerar números aleatórios com o rand(), e inicializando o gerador com srand(time(NULL)).
Gravação da aula no Google Drive.
03/06
Aula de exercícios. Diversos exercícios curtos.
Gravação da aula no Google Drive.
07/06
Recursão: funções que chamam a si próprias. Definindo a base da recursão. Usando memoização para evitar resolver o mesmo subproblema repetidas vezes. Exemplos: fatorial, Fibonacci.
Outros exercícios incluíram cálculo do número de combinações de n, k a k, Triângulo de Pascal.
Gravação da aula no Google Drive.
09/06
LAB 7.
Como inicializar corretamente o gerador de números aleatórios.
Usando o switch..case.
Exercício: um trio contra dois pares consecutivos.
10/06
P1.
Segunda parte do curso, de 14/06 15/07
Infelizmente não fiz o registro aula-a-aula aqui, por conta de diversas complicações de saúde, minha e de minha esposa, como é do conhecimento de todos.
A matéria coberta durante essa segunda parte compreendeu:
- strings em C: arrays de caracteres, byte 0 como terminação; as principais funções da biblioteca strings.h;
- structs: definindo tipos de dados compostos; passagem de structs por valor e por referência; uso do typedef; structs que referem-se a si próprias; ponteiros para structs e o uso do p->campo ao invés de (*p).campo, onde p é um ponteiro para uma struct;
- argumentos passados na linha de comando;
- redirecionamento da entrada e da saída do programa para arquivos.