Local: LEP-1 (às 2as) e sala F2-029 (às 4as e 6as).
Horário: das 8h às 10h.
Início: 10 de fevereiro de 2014.
Repositório do código criado em sala de aula:
https://github.com/vigusmao/Comp1_2014_1
Não haverá aula nos seguintes dias:
- 07/03, sexta-feira (recesso oficial da UFRJ)
- 09/04, quarta-feira (QCon 2014)
- 11/04, sexta-feira (QCon 2014)
Provas:
- P1: 26/03
- P2: 21/05
- PF: 30/05
- SEGUNDA CHAMADA (apenas para quem perdeu alguma prova): SEXTA-FEIRA, 06/06
Veja aqui
as médias (após a PF).
M = (P1 + P2) / 2 ≥ 6.0 --> aprovação direta;
do contrário, MF = (M + PF) / 2 ≥ 5.0 --> aprovação;
MF < 5.0 --> reprovação.
Slides do Prof. Adriano Cruz aqui.
Blbliografia sugerida (também da página do Prof. Adriano) aqui.
Material de apoio:
Tutorial online sobre arrays e ponteiros em C.
Lista de exercícios.
Conteúdo das aulas
10/02
Laboratório: conversa inicial sobre o curso.
Ambiente de programação: usar uma IDE (CodeBlocks, Dev C etc.) ou compilar diretamente um arquivo com o código via linha de comando (modo Terminal).
12/02
O que é programar um computador? Que tipos de ações um computador "sabe" executar?
Um primeiro exemplo de programa: calculando a média do aluno e exibindo a nota necessária para aprovação na Prova Final.
14/02
Variáveis dos tipos int e float. Entrada e saída de dados via printf() e scanf().
Exemplo de programa simples: calculando o tempo de frenagem de um veículo.
17/02
Laboratório: cálculo do IMC (a partir de peso e altura) e da idade da pessoa (a partir do ano de nascimento).
19/02
Condicionais (if, if...else) e laços com while. Operadores de comparação: <, <=, >, >=, ==, !=.
Exemplo de programa simples: verificando se um número é par ou ímpar.
Outro exemplo: imprimindo todos os números em um intervalo.
21/02
Operadores lógicos: && (and), || (or), ! (not). Os comandos break e continue. Laços infinitos.
Exemplo de programa simples: imprimindo todos os números de 1 a 100, mas pulando os múltiplos de 5.
Outro exemplo: imprimindo o maior número digitado pelo usuário, parando de ler no primeiro número negativo.
24/02
Laboratório: programa para testar se um número é primo; programa para imprimir os divisores de um número;
programa para encontrar números perfeitos
(que são aqueles números x cujos divisores próprios somam x).
26/02
Funções. O comando return.
Exemplo: função para calcular o fatorial de um número.
Exemplo de função chamando função: cálculo da combinação de n, p a p.
Código feito em sala de aula no GitHub.
10/03
Laboratório: geração de números pseudo-aleatórios: rand() e srand(time(NULL)).
Jogo "Adivinhe o Número".
Sugestão de solução no GitHub.
12/03
Simulações usando números pseudo-aleatórios.
Exemplo: cálculo aproximado do valor esperado de uma variável aleatória.
Outro exemplo: Jogo "Trio vs. Dois Pares Seguidos" (utilizando função que retorna o resultado obtido no lançamento de um dado honesto ou desonesto).
Código feito em sala de aula no GitHub.
14/03
Laço com for.
Exemplo: cálculo aproximado de Pi pelas séries de Gregory-Leibniz
e de Nilakantha.
Código feito em sala de aula no GitHub.
17/03
Laboratório: funções e o uso do for em um estudo sobre a Conjectura de Collatz.
Sugestão de solução no GitHub.
19/03
Revisão rápida de tudo.
Novas estruturas de controle: do...while, switch e o comando ternário __?__:__.
21/03
Funções que nada retornam: void.
Ex.: pirâmides de caracteres.
24/03
Laboratório: o problema do robô.
Um robô pode se deslocar uma unidade de distância por vez sobre uma superfície unidimensional (i.e., uma reta).
Sobre essa mesma superfície, há um objeto que o robô precisa encontrar. O robô não sabe se o objeto está à
sua esquerda ou à sua direita. Queremos uma estratédia para o robô encontrar o objeto. Faça passo-a-passo os seguintes exercícios:
1) Escreva uma função que recebe como parâmetros a posição do robô (entre 1 e 80)
e a posição do objeto (entre 1 e 80), e que desenha na tela, utilizando caracteres, a situação.
Mostre cada uma das posições do segmento de reta entre 1 e 80. Use caracteres "_"
para posições vazias, "R" para o robô e "O" para o objeto. Se ambos, robô e objeto, estiverem na mesma posição,
represente-a por um "*".
Exemplo: desenhar(40, 60)
_______________________________________R___________________O____________________
2) Escreva uma função que sorteia uma posição para o objeto entre 20 e 60.
3) Escreva uma função para aguardar uma determinada quantidade de segundos, que é passada como parâmetro.
4) Escreva uma função que ilustra o movimento do robô, passo a passo em linha reta, desde uma posição inicial até uma posição final.
Sua função deve receber como parâmetros as posições inicial e final do robô, e também a posição do objeto.
Utilize a função criada no exercício 1 para mostrar a situação após cada movimento do robô. A cada passo,
aguarde um segundo antes de mostrar o próximo passo.
Obs.: Se o robô, em algum momento, encontrar o objeto, ele deve parar. Nesse caso, a função deve retornar 1. Do contrário, deve retornar 0.
Exemplo: mover(40, 43, 60)
_______________________________________R___________________O____________________
________________________________________R__________________O____________________
_________________________________________R_________________O____________________
__________________________________________R________________O____________________
5) Escreva um programa para simular uma estratégia em zigue-zague do robô, que deve sair da posição inicial 40 e encontrar o objeto numa posiçã esolhida aleatoriamente
pela função criada no exercício 2. Faça um zigue-zague em que os passos crescem segundo uma progressão aritmética. Utilize a função do exercício 4 para ilustrar todo o movimento do robô.
Sugestão de solução no GitHub.
26/03
Primeira prova.
28/03
Resolução da primeira prova em sala de aula.
31/03
Laboratório: finalização do problema do robô. Zigue-zague aritmético e geométrico com contagem do número de passos.
Sugestão de solução no GitHub.
02/04
Arrays. Arrays estáticos.
Ex.1: cálculo do desvio padrão das idades dos alunos da turma.
Ex.2: o problema dos armários. Há n armários numerados de 1 a n no vestiário de uma escola, e n alunos na escola.
Os armários estão todos fechados, inicialmente. O aluno i, para i de 1 a n, muda o estado (aberto/fechado) de todos os armários
cujo número seja múltiplo de i. Que armários estarão abertos no final?
Código feito em sala de aula no GitHub.
04/04
O tipo char. Arrays de caracteres (strings). Algumas funções da biblioteca <string.h> para manipular strings: strlen(), strcpy(), strcat(), strcmp().
Ex.: Contando o número de ocorrências de um caracter numa string.
07/04
Laboratório.
Problema 1: escreva um programa que lê dois arrays de inteiros positivos digitados pelo usuário (um inteiro por vez seguido de <enter>, zero para terminar cada array) e depois imprime a interseção dos dois arrays. (Exemplo de aplicação: determinar os "amigos em comum" de usuários do Facebook).
Problema 2: escreva um programa que lê o nome do usuário e depois o escreve de trás para frente.
Problema 3: escreva um programa que lê uma palavra digitada pelo usuário e depois a escreve na "língua do P". Ex.: boneco --> boponepecopo, melancia --> mepelapancipiapa, cachorro -->capachoporropo.
Para casa os problemas a seguir:
Problema 4: leia um array de números e os apresente em ordem crescente.
Problema 5: verifique se uma frase digitada é palíndroma, isto é, se ela permanece a mesma quando lida de trás para frente (descartando espaços, hífens, pontos e vírgulas). Ex.: "socorram-me, subi no onibus em marrocos."
14/04
Laboratório: escreva um programa que lê um array de inteiros positivos e depois imprime uma permutação aleatória dos
elementos desse array. O usuário deve digitar 0 para indicar o fim da entrada dos dados. Você pode implementar qualquer algoritmo,
mas um algoritmo bastante eficiente para fazer isso é o Knuth shuffle
(também conhecido como Fischer-Yates shuffle).
16/04
Ponteiros. Primeiras idéias. Aritmética de ponteiros. A função sizeof(). Relação entre ponteiros e arrays.
Os operadores ++ e --.
25/04
Estruturas de dados customizadas: criando suas prórias structs.
Exemplo: uma lista telefônica rudimentar. Código sugerido (rascunhado em sala de aula) no GitHub.
28/04
Laboratório: crie uma estrutura ALUNO, com nome, email e nota. Crie uma função para imprimir um ALUNO. Instancie duas dessas estruturas. Imprima-as.
Copie uma estrutura na outra, usando atribuição. Imprima-as novamente. Modifique uma delas. Imprima-as novamente e perceba o que aconteceu. Agore crie uma função que recebe um array
de ALUNOs, encontra a média das notas desses alunos, e imprime os dados do melhor e do pior aluno.
Sugestão de código (sem os testes iniciais) no GitHub.
30/04
Sintaxe alternativa para structs: o comando typedef.
Ex.:
typedef struct {
char nome[30];
int DRE;
float CR;
} ALUNO;
Ponteiros para estruturas. Usando estrutura_ptr->campo ao invés de (*estrutura_ptr).campo.
Alocando e desalocando memória: as funções malloc() e free().
Duas maneiras de se fazer um ponteiro apontar para uma região válida de memória: (1) copiando para eles o endereço de uma variável previamente declarada; ou (2) alocando memória.
Alocando memória dinamicamente para arrays.
Código feito em sala de aula no GitHub aqui e
aqui.
05/05
Laboratório: escreva um programa para fatorar um inteiro.
Sugestão de solução no GitHub.
07/05
Outras diferenças entre alocação estática e dinâmica de arrays.
Arrays e ponteiros como parâmetros de funções e como valores de retorno de funções.
Duas escolas: (1) alocação de memória feita dentro de uma função, que retorna o endereço, e desalocação
feita pelo chamador; (2) [MELHOR] alocação e desalocação de memória feita pelo chamador, que passa o endereço para a função, função
esta que preencherá o array, não retornando nada (void).
Exemplo: função que computa os divisores de um número.
Código feito em sala de aula no GitHub.
09/05
Revisão sobre estruturas, arrays, ponteiros, alocação estática e dinâmica.
Arrays multidimensionais (matrizes). Ponteiros para ponteiros.
12/05
Laboratório. Implementação de matrizes usando alocação estética e dinâmica. Crie uma matriz T
para representar os tempos dos carros de uma corrida de Fórmula 1 a cada volta. A célula T[i][j] armazenará o tempo do carro i na volta j.
Crie uma função que recebe uma matriz de tempos como parâmetro e imprime o tempo da volta mais rápida e o carro que fez esse tempo.
14/05
Não houve aula em função da greve dos ônibus.
16/05
Compilando e executando um programa via linha de comando (terminal).
Redirecionando entrada e saída para arquivos.
Variáveis globais (e o porquê de não devermos usá-las, salvo em raríssimos casos).
Primeiras noções de recursão. Exemplos: fatorial, Fibonacci.
Código feito em sala de aula (fibonnaci recursivo e não-recursivo) no GitHub.
19/05
Laboratório. Resolução da lista.
21/05
Revisão para a prova. Dicas para input/output de strings.
// flush do buffer do teclado
void flush() {
while (fgetc(stdin) == EOF);
}
// substitui o \n final por um 0 (indicador de terminacao)
void remove_linebreak(char* string) {
if (string[strlen(string)-1] == '\n') {
string[strlen(string)-1] = 0;
}
}
PS.: O flush é desejável após uma leitura do stdin via scanf(), pois o scanf() não consome os '\n' que possam lá estar.
PS.2: O fgets(), por sua vez, consome os '\n' e os coloca no fim do array de caracteres. Pode ser interessante, portanto, substituí-los por caracteres \0 (indicadores de terminação).
Código feito em sala de aula no GitHub aqui (arrays, ponteiros, estruturas, strings) e
aqui (arrays multidimensionais dinâmicos).
23/05
Segunda prova.
26/05
Resolução da segunda prova no laboratório.
30/05
Prova final.