Computação 1  —   Linguagem C   —  2014/1

Página principal

Informações


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.  
 

Voltar ao topo