Introdução ao curso, Linux, e à Linguagem C

MCTA028-15 - PROGRAMAÇÃO ESTRUTURADA

Victor S. Portella

UFABC

2026-09-15

Hoje

  • Informações sobre a disciplina
  • Breve introdução ao Linux e ao terminal
  • Introdução à linguagem C

Informações sobre a disciplina

Questões logísticas


Site da disciplina: https://victorvsp.github.io/pe_26/


Moodle:

PE-2026.3: Programação Estruturada (MCTA028-15) - Victor Sanches Portella

Objetivos

  • Apresentar noções básica e intermediárias sobre algoritmos;
  • Programação em linguagem compilada (C nesse caso)
  • Vetores, strings, matrizes, registros, arquivos, …
  • Recursão
  • Manipulação de memória (ponteiros e alocação estática/dinâmica)

Avaliação

Componente Peso
Laboratórios 15%
EP1 + EP2 15%
Prova 1 30%
Prova 2 40%

Ideia principal

  • Laboratórios e EPs: prática .
  • Provas: avaliação individual.
  • Precisa de média \(\geq 5\) também nas provas.

Média final: \[ M = 0.15 \cdot L + 0.15 \cdot \mathrm{EP} + 0.3 \cdot \mathrm{P1} + 0.4 \cdot \mathrm{P2} \]

Critério de Aprovação: \[M \geq 5 \quad \text{e} \quad M_P = \frac{0.3 \cdot \mathrm{P1} + 0.4 \cdot \mathrm{P2}}{0.7} \geq 5\]

IA Generativa - o elefante na sala

As ferramentas de IA Generativa (em particular coding models/agents) está mudando a indústria (e pesquisa acadêmica) em computação de forma profunda.

  • Muitos programadores deixaram de escrever código “manualmente”
  • Velocidade de produção e auditação de código super-humana
  • Escrever código correto está se tornando cada vez mais barato.


Assim, surge a pergunta:

Ainda vale a pena aprender a programar?

IA Generativa - o elefante na sala

Ainda vale a pena aprender a programar?

Minha resposta: Na minha opinião, por enquanto, sim

  • Programar nos ensina a traduzir ideia em passos concretos;
  • Saber programar te permite se comunicar com pessoas/agentes de forma mais concreta sobre programação;
  • Os modelos/agentes fazem escolhas a todo momento. Como saber se a escolha, além de funcionar, é boa?

Como gosto de pensar sobre como usar os modelos de IA generativos:

É possível delegar o ato de “pensar”, mas não o de “entender”

O que muda com IA?

Se produzir código ficou mais fácil, outras habilidades se tornam mais importantes:

  • especificar precisamente o que queremos;

  • ler, compreender, e depurar código;

  • testar e encontrar casos em que ele falha;

  • avaliar escolhas de algoritmos, estrutura de dados, e arquitetura;

  • modificar código sem introduzir novos erros.

Uma ressalva importante

Não sabemos como programação será ensinada daqui alguns anos.

Existem propostas recentes bastante radicais:

  • ensinar primeiro especificação, testes e avaliação;
  • usar agentes para gerar grande parte do código;
  • introduzir escrita manual de código mais tarde.

Ainda não sabemos se isso funciona bem para formar cientistas da computação e como a área vai evoluir no futuro.

Sobre o uso de IA na disciplina

Concretament, nessa disciplina o uso de IA é proibido (a não ser que explicitamente dito o contrário por mim em momentos específicos)

Uso de IA comprovado em laboratórios e EPs será considerado plágio.


Evite usar modelos de IA para tirar suas dúvidas de forma imediata

  • Fácil criar o vício de depender da IA ao invés de entender o que está acontecendo

Provas serão fortemente baseadas em exercícios de laboratório e EPs. Então fazer esses exercícios sem IA já lhe prepara para a prova automaticamente.

Breve introdução ao Linux e ao terminal

O que é Linux?

Linux é uma família de sistemas operacionais de código aberto

Construídos em torno do Kernel Linux, criado por Linus Torvalds em 1991

Unix-like: segue a organização e as principais convenções dos sistemas Unix (arquivos hierárquico, permissões, shells, etc.)


Uma distribuição Linux é um sistema operacional completo

Inclui kernel, utilitários, bibliotecas e aplicativos

Exemplos: Ubuntu, Fedora, Debian, Arch Linux, etc.

Aulas e laboratórios serão realizados em ambiente Linux. Detalhes para outros sistemas operacionais não devem ser difíceis de encontrar.

Hierarquia do sistema de arquivos

/
├─ bin      # programas essenciais do sistema
├─ boot     # arquivos do boot loader
├─ dev      # dispositivos do sistema
├─ etc      # arquivos de configuração do sistema
├─ home     # pastas dos usuários
│  ├─ user1
│  └─ user2
├─ usr      # utilidades dos usuários
│  ├─ bin   # programas do usuário
│  │  ├─ gcc
│  │  └─ firefox
│  ├─ share # arquivos compartilhados
│  │  ├─ doc
│  │  ├─ fonts
│  │  ├─ themes
│  │  └─ vim
│  └─ local
│     ├─ bin
│     └─ share
└─ ...

Diretórios e arquivos

O sistema de arquivos Linux é organizado em diretórios e arquivos

  • Cada diretório pode conter arquivos e outros diretórios (subdiretórios)
  • Todos os arquivos e diretórios estão contidos no diretório raiz / (root)
  • A sequência de diretórios até arquivo é chamada de caminho (path)


/
├─ home   
│  └─ user1
      └─ prog_estruturada
         └─ slides.pdf

Caminho: /home/user1/prog_estruturada/slides.pdf

Endereçamento relativo

Cada diretório (e arquivo) pode ser endereçado listando o caminho de diretórios relativo a pasta atual

  • Diretório atual: . (ponto)
  • Diretório superior: .. (dois pontos)
  • Diretório home do usuário: ~ (til)

Exemplo se o diretório atual é /home/user1:

  • prog_estruturada/slides.pdf é o caminho relativo
  • ../user2/arquivo.txt é o caminho relativo para um arquivo em outro diretório

Interface de linha de comando e terminal

Em sistemas Unix-like, é muito comum interagir com o sistema por meio de uma interface de linha de comando (command-line interface ou CLI).

  • O terminal é o ambiente no qual digitamos comandos e vemos sua saída.

  • O programa que interpreta esses comandos é chamado de shell.

  • No Linux, um dos shells mais comuns é o Bash

    • Os comandos são iguais ou muito semelhantes na maioria dos shells.
  • A linha de comando é especialmente conveniente para programadores e administradores de sistemas (e agentes de IA).

Alguns comandos básicos

A sintaxe da linha de commando frequentemente é

nome_do_comando [opções] [argumentos]

Alguns comandos básicos:

  • cd [bla]: muda o diretório atual para aquele em bla
  • pwd: exibe o caminho do diretório atual
  • ls [FLAGS] [bla]: lista os arquivos em bla (diretório atual se vazio)
    • Flag -l exibe detalhes sobre os arquivos
    • Flag -a exibe mesmo arquivos ocultos (aqueles com nome começando com .. Exemplo: .segredos.txt)

Mais comandos básicos

  • cat [bla]: Imprime o conteúdo do arquivo em path
  • mkdir [nome]: cria um novo diretório com o nome especificado
  • rm [FLAGS] [bla]: remove bla
    • Flag -r remove diretórios e seus sub-arquvios/diretórios recursivamente
    • Flag -f ignora arquivos não existentes e perguntas de permissão
  • cp [FLAGS] [origem] [destino]: copia um arquivo de uma localização para outra
    • Flag -r copia diretórios e sub-arquivos recursivamente
  • mv [origem] [destino]: move ou renomeia um arquivo/diretório

Caracteres coringa

O shell permite usar caracteres coringa (wildcards) para representar vários nomes de arquivos.

O mais comum é *, que representa uma sequência qualquer de caracteres.

Exemplo de como listar todos os arquivos .c no diretório atual

ls *.c

Redirecionamento de saída

Normalmente, a saída de um programa aparece no terminal.

Com >, podemos redirecionar essa saída para um arquivo.


Para executar ls e redirecionar o resultado no arquivo saida.txt:

ls > saida.txt


Caso queira adicionar o resultado ao final de saida.txt, use:

ls >> saida.txt

Dicas sobre o terminal

Algumas dicas do terminal

  • Use Ctrl+C para interromper um comando em execução
  • Use man <comando> para ver o manual do comando. Exemplo: man ls
  • Muitos comandos aceitam --help para exibir ajuda rápida
  • Use a tecla Tab para completar nomes de arquivos e diretórios
  • Use as setas para cima/baixo para navegar pelo histórico de comandos
  • Use Ctrl+R para buscar comandos anteriores no histórico

Algoritmos e programação em linguagens de alto nível

Algoritmos

Um algoritmo é uma sequência de etapas bem definidas para realizar uma tarefa.


Exemplos:

  • Verificar se um número é primo;
  • Ordenar uma lista de números;
  • Encontrar uma palavra em um arquivo de texto.

Computador e instruções

A CPU (Central Processing Unit) executa sequências de instruções.


Cada CPU possui um conjunto finito de instruções que varia com a arquitetura (x86, ARM, etc.)

Conhecido como linguagem de máquina


Podemos descrever algoritmos em linguagm de máquina, gerando um programa.

Linguagens de programação

Uma linguagem de programação é uma linguagem com regras precisas usada para descrever operações que um computador pode exercutar.


Inicialmente, existia somente as intruções da CPU

Programas simples já são complexos de se descrever com tais intruções.


Linguagens de alto nível: Linguagens mais expressivas, com maiores abstrações servindo como intermediárias entre o programador e a linguagem de máquina.

Linguagens compiladas e interpretadas

Modos como as linguagens de programação são executadas:

  • Compiladas: um compilador traduz o código-fonte para código de máquina (executável).
  • Interpretadas: Um outro programa (interpretador) executa o código-fonte diretamente.

Essa distinção pode ser mais sutil por uso de máquinas virtuais e compilação just-in-time, por exemplo. C é um exemplo clássico de linguagem normalmente compilada para código nativo.

Paradigmas de programação

Linguagens também podem ser classificadas por paradigma.

  • Estruturado: C
  • Orientado a objetos: Java, C++, Python
  • Funcional: Haskell, OCaml, partes de Python/JavaScript
  • Lógico: Prolog

Compilação

O que é compilação?

Compilar é traduzir um programa de uma linguagem para outra.

Existe diversos compiladores de C: gcc, clang, etc.

Programas executáveis são específicos da plataforma (sistema operacional, arquitetura, etc.)

Compilação de múltiplos arquivos

É possível compilar um programa a partir de diversos arquivos-fonte

Cada arquivo fonte gera um arquivos-objeto (executáveis com partes faltando)

Arquivos-objeto são ligados (linked) gerando o executável final.

Código-fonte e executável

#include <stdio.h>

int main() {
    printf("Hello World!\n");
    return 0;
}


Flags úteis e/ou recomendadas do gcc

Flags recomendadas:

  • -Wall: dá mais warnings de compilação (muito recomendado)
  • -Wextra: dá warnings adicionais de compilação
  • -Wpedantic: avisa sobre construções fora do padrão ISO C escolhido

Flags adicionais úteis:

  • -Werror: warnings viram erros de compilação
  • -g: permite usar gdb e valgrind (mas deixa programa mais pesado)
  • -lm: permite usar funções matemáticas

Exemplo de compilação recomendada:

gcc -Wall -Wextra -Wpedantic programa.c -o programa

Editores e IDEs

Ferramenta Para que serve
Editor de texto Ferramente para escrever e editar arquivos, incluindo código.
Compilador Traduz o código C para um programa executável
IDE (Integrated Development Environment) Ambiente com editor, pode chamar compilador, depurador, auto-complete, etc.

Exemplos de editores: Gedit, vim, Emacs.

Exemplos de IDEs: VSCode, Code::Blocks, PyCharm.

Evitem uso de auto-completes avançados, principalmente no começo.

Linguagem C

Linguagem C

A linguagem C foi criada por Dennis Ritchie no início dos anos 1970.

Alguns marcos/padrões importantes:

  • K&R C, associado ao livro de Kernighan e Ritchie;
  • C89/C90;
  • C99;
  • C11;
  • C17/C18;
  • C23.

Por que estudar C?

C continua importante porque aparece em contextos como, sistemas operacionais, compiladores, sistemas embarcado, etc.


Além disso, C nos força a entender conceitos que outras linguagens escondem parcialmente, como:

  • endereços de memória;
  • alocação dinâmica;
  • representação dos dados.

Popularidade de linguagens

Primeiro programa

Programa mínimo em C

#include <stdio.h>

int main() {
    printf("Hello World!\n");
    return 0;
}

Para compilar (sem flags):

gcc teste.c -o teste

Para executar:

./teste

Programa mínimo em C

#include <stdio.h>

int main() {
    printf("Hello World!\n");
    return 0;
}


Em C, um bloco é delimitado por { e }

Blocos não precisam ser identados como em Python, mas é boa prática


A maioria das linhas em C terminam com ; (blocos são a exceção)

Um programa ainda menor

int main() {
    return 0;
}

Esse programa não imprime nada, mas é um programa C válido.


A função main é o que vai ser executado quando o programa é iniciado.


O return 0; indica, por convenção, que o programa terminou com sucesso.

Valores diferentes indicam diferentes tipos de erro

Tipos de dados

Tipo Tamanho típico Faixa típica
char 1 byte -128 a 127
short int 2 bytes \(-2^{15}\) a \(2^{15}-1\)
int 4 bytes \(-2^{31}\) a \(2^{31}-1\)
long int 8 bytes \(-2^{63}\) a \(2^{63}-1\)
long long int 8 bytes \(-2^{63}\) a \(2^{63}-1\)
float 4 bytes ~7 casas de precisão
double 8 bytes ~15–16 casas precisão

Tamanhos/faixas exatapas dependem do compilador/sistema. Valores acima são típicos para gcc em sistemas Linux de 64 bits.

Booleanos

Não precisamos usar um tipo booleano no começo do curso. Em C, historicamente:

  • 0 representa falso;
  • valores diferentes de 0 representam verdadeiro.

Existe _Bool/bool via <stdbool.h>, mas podemos introduzir isso apenas se for conveniente.

Declaração de variáveis

int main() {
    int num_matricula = 1234;
    return 0;
}

C diferencia maiúsculas de minúsculas

C é case-sensitive.

int num_matricula = 1234;
int Num_matricula = 5678;

Os nomes num_matricula e Num_matricula são diferentes.

Use nomes representativos. Evite nomes como tmp1, tmp2, aux50, exceto em situações muito locais e claras.

Operações aritméticas

Expressão Operação
a + b soma
a - b subtração
a * b multiplicação
a / b divisão
a % b resto da divisão

Cuidado com divisão entre inteiros (discutiremos o que está acontecendo na próxima aula):

7 / 2    // 3
7.0 / 2  // 3.5
7 % 2    // 1

Entrada e saída

Biblioteca padrão de entrada e saída

Em C, usamos funções de uma biblioteca para entrada e saída.

As funções mais básicas ficam em stdio.h.

#include <stdio.h>

Durante o curso, praticamente todos os programas usarão essa biblioteca.

Saída com printf

#include <stdio.h>

int main() {
    printf("Hello World!\n");
    return 0;
}

A função printf imprime texto formatado.

int printf(const char *format, ...);

A string format descreve como imprimir os valores.

Exemplos de printf

#include <stdio.h>

int main() {
    int num = 512;
    int a = 6, b = 7;

    printf("Hello World");
    printf("%d", num);
    printf("%d\n", num);
    printf("A sala do professor eh a %d\n", num);
    printf("%d * %d = %d\n", a, b, a * b);

    return 0;
}

O printf recebe um argumento extra para cada %bla que tem na String de formatação

Alguns especificadores de formato

Especificador Tipo
%d int
%ld long int
%lld long long int
%f float/double em printf
%lf double em scanf
%c char
%s string

Exercícios

Faça as seguintes operações:

  1. Crie um diretório lab1 em seu diretório home com subdiretório programas e backup.
  2. Dentro de programas, crie um programa ola.c em C que escreva “Olá mundo!”. Compile esse programa com as flags -Wall -Wextra -Wpedantic usando o gcc e execute o programa.
  3. Crie uma copia de ola.c chamada ola_bkp.c dentro de backup
  4. Independente de em qual diretório seu shell esteja, crie um arquivo minha_home.txt em lab1/ com a lista de arquvios e diretórios na sua home
  5. Apague o diretório programas e todos os seus sub-arquivos

Exercícios (continuação)

Usando os erros de compilação como guia, faça o seguinte programa compilar e funcionar como esperado:

#include <stdlib.h>

int main() {
    float a = 6.0, float b = 7.0;

    printf("Adição: %f + %f =  %f\n", a, b, a + b);
    pirntf("Multiplicão: %f * %f =  %f\n", a, b, a * b);
    printf("Subtração: %f - %f =  %f\n", a, b, a - b);
    printf("Divisão: %f  / %f = %f \n", a, b, a / b);

    return 0;
}

Referências

  • Paulo Henrique Pisani. Slides de Introdução à Linguagem C, Programação Estruturada, UFABC, 2021.
  • B. W. Kernighan e D. M. Ritchie. The C Programming Language. 2nd ed. Prentice Hall, 1988.
  • S. J. Matthews, T. Newhall e K. C. Webb. Dive Into Systems: A Gentle Introduction to Computer Systems. No Starch Press, 2022.
  • P. Feofiloff. Algoritmos em Linguagem C. Elsevier, 2009.