* Tópicos estudados

** Aula 0: Sobre o curso

- Do que vamos precisar
- Requisitos
- O que vamos aprender
- Como vamos aprender
- Por que aprender
- Como clonar o repositório do curso
- Como atualizar o repositório do curso
- Conceitos abordados na aula
  - O que é um programa de computador?
  - O que é linguagem de máquina?
  - O que é uma linguagem de programação?
  - O que são linguagens de baixo e alto nível?
  - O que é compilação?
  - O que são implementações?
  - O que são arquiteturas orientadas a palavras?
  - O que são arquiteturas orientadas a bytes?
- Características da linguagem C
- Implementação GNU/Linux
  - Compilador
  - Biblioteca C Padrão
  - Obter a especificação padrão do gcc
- Exemplo de um programa em C

** Aula 2: Dados e instruções

- Instruções
- Dados
- Dúvidas
  - Para que serve a função =main=?
  - Qual é o significado de =void=?
  - Por que o tipo do retorno de =main= é =int=?
  - A função =main= poderia retornar outros tipos de dados?
  - A função =main= poderia retornar uma string?
  - Por que o cabeçalho =stdio.h= foi incluído no programa?

** Aula 3: Tipos de dados

- Tipos são tamanhos de dados na memória
  - Maior número que se pode escrever com 4 bytes (32bits):
- Tipos primitivos
  - Qualificador =unsigned= (sem sinal):
  - Qualificador =long=:
- Tipos customizados
- Expressões constantes (valores literais)
- O tipo =void=
- Modelagem de tipos (type casting)

** Aula 4: Variáveis e ponteiros

- Declaração e definição
- Atributos das variáveis
- Escopo de variáveis
- Ponteiros
  - Declaração do ponteiro
- Perguntas da aula
  - A cada execução do programa, os endereços das variáveis mudam?
  - O ponto da declaração de uma variável global faz diferença?

** Aula 5: Estruturas de controle de fluxo

- Controle de fluxo
- O loop =for=
- Loop =while=
- Loop =do..while=
- Estrutura de decisão =if..else if..else=
  - Dica: =else if= abreviado
- Estrutura =switch..case=
- Expressão condicional (ternária)

** Aula 6: Vetores

- Utilidade dos vetores
- Declaração e inicialização de vetores
  - Tamanho de um vetor em tempo de compilação
  - Inicialização parcial
- Acesso aos elementos de um vetor
- Iteração pelos elementos
- Vetores e funções
  - Relação entre vetores e ponteiros
- Vetores de caracteres (strings)
  - Mais diferenças entre vetores e ponteiros

** Aula 7: Vetores, ponteiros e strings

- Notações de acesso
- Vetores e funções
- Strings são vetores de caracteres
- Inicializadores escalares e agregados
- Vetores de comprimentos variáveis (VLA)

** Aula 8: Processos e layout de memória

- Filosofia UNIX
  - Primeiro princípio: especialização
  - Segundo princípio: modularidade
  - Terceiro princípio: fluxos de texto
- A interface de linha de comando (CLI)
  - Operadores de controle do shell
- O que são processos
- Como programas são executados
- Layout de memória
  - Conteúdo do binário executável
  - Região do HEAP
  - Região da pilha (stack)

** Aula 9: Argumentos e ambiente

- Vetores e strings
  - Vetores de "ponteiros"
  - Vetores de strings
  - Vetor de strings terminado com NULL
- Parâmetros da função =main=
- Conversão de strings para números

** Aula 10: Entrada e saída de dados

- Tabela de descritores de arquivos
  - Fluxos de dados padrão
  - Uma nota sobre dispositivos
  - Representação em /proc
- Redirecionamentos e pipes
  - Redirecionamentos
  - Pipes
- Acumuladores (buffers)
  - Buffers de entrada e saída do programa
  - Buffer de saída do programa
  - Buffer de entrada do programa
  - Entrada padrão não bufferizada

** Aula 11: Leitura da entrada padrão com =scanf=

- Leitura interativa da entrada padrão
- Leitura formatada de linhas com =scanf=
  - Para reduzir as chances de erro
  - Descarregando o buffer de entrada
  - Inicialização de valores numéricos
  - Buffer overflow

** Aula 12: Leitura da entrada padrão com =fgets=

- A função =fgets=
  - Uma nota sobre o tipo ponteiro para FILE
- O problema da quebra de linha
- Retorno nulo ambíguo
- Conversão para números
  - Conversão para inteiros com =sscanf=
  - Conversão para inteiros longos com =strtol=
  - Outras funções de conversão

** Aula 13: Leitura da entrada padrão com =read=

- A função =read=
- Conversão para string incluindo o terminador nulo
  - Quando não converter os bytes lidos em string
- O buffer do terminal
  - Descarga do buffer do terminal
  - Implementação de =flush_stdin= com a chamada =read=
  - Descarga condicional do buffer do terminal
- Definindo um prompt

** Aula 14: Abertura de arquivos para leitura

- Diferença entre streams e descritores de arquivos
  - Descritores de arquivos (tipo =int=)
  - Streams (tipo ponteiro para =FILE=)
- Procedimento geral de acesso a arquivos para leitura
  - Abertura
  - Processamento
  - Fechamento

** Aula 15: Abertura de arquivos para escrita

- Modos de abertura de arquivos
  - Modos complementares
  - Modos texto e binário
- Modos de escrita
  - Abertura de um arquivo para escrita ("w")
  - Abertura de um arquivo para append ("a")
- Notas gerais

** Aula 16: Abertura de arquivos para leitura e escrita

- Modos de abertura para leitura e escrita
- Manipulação do ponteiro interno
  - A função =fseek=
  - Pontos de origem de =fseek=
  - Abertura de arquivos com "r+"
  - Abertura de arquivos com "a+"
- Procedimentos úteis
  - Quantidade de linhas
  - Obter o tamanho do arquivo
  - Testar se um arquivo está vazio (0 bytes)
