← Aulas

Conceitos Básicos 2

Estrutura Procedimental de um Programa, Metodologias de Desenvolvimento e Ambientes Integrados.

Disciplina:Introdução à Programação em C (EET126) Público-alvo:Licenciatura em Eng. Electrónica e Telecomunicações Carga Horária:3 horas (1h T + 2h P) Docente:Isac Osvaldo de Venâncio Daniel

Objectivos da Aula

02

Ao final desta aula, o estudante deverá ser capaz de:

  • Compreender a estrutura procedimental de um programa em C
  • Identificar os elementos que compõem um programa C
  • Descrever as etapas do processo de compilação
  • Conhecer diferentes metodologias de desenvolvimento de software
  • Utilizar um IDE para escrever, compilar e depurar programas
  • Configurar e utilizar o Arduino IDE para programação embarcada

Estrutura de um Programa em C

03
/* 1. COMENTÁRIOS (opcionais) */
// Comentário de uma linha

/* 2. DIRECTIVAS DE PRÉ-COMPILAÇÃO */
#include <stdio.h>
#define PI 3.14159

/* 3. DEFINIÇÕES GLOBAIS */
int contadorGlobal = 0;

/* 4. PROTÓTIPOS DE FUNÇÕES */
int soma(int a, int b);
void saudacao(void);

/* 5. FUNÇÃO main() */
int main() {
    // Código principal
    return 0;
}

/* 6. DEFINIÇÕES DE FUNÇÕES */
int soma(int a, int b) {
    return a + b;
}

Comentários

04

Textos inseridos no código para documentar o programa — ignorados pelo compilador.

// Comentário de uma única linha (C99 e C++)

/* Comentário de múltiplas linhas
   Pode ocupar várias linhas
   Útil para cabeçalhos e explicações extensas */

Boas práticas

  • Resumo no início do programa: nome, autor, data, descrição
  • Explicar a lógica de partes complexas
  • Manter comentários actualizados com o código

Directivas de Pré-compilação

05

Instruções para o compilador, processadas antes da compilação. Começam com #.

// Inclusão de bibliotecas
#include <stdio.h>      // Biblioteca padrão
#include "meuModulo.h"  // Biblioteca local

// Definição de constantes
#define MAXIMO 100
#define MEDIA(a, b) ((a + b) / 2)

// Compilação condicional
#ifdef DEBUG
    printf("Modo de depuração ativado\n");
#endif
💡
#include insere o conteúdo de outro ficheiro. #define cria macros substituídas antes da compilação.

Função main()

06

Ponto de entrada de todo programa em C. É a primeira função executada.

💻 Computadores (retorno)

int main() {
    // Código
    return 0;
}

🔧 Embarcados (void + loop)

void main(void) {
    // setup
    for(;;) {
        // loop infinito
    }
}
⚠️
Em sistemas embarcados, main() normalmente nunca termina — contém um ciclo infinito.

Funções

07

Blocos de código que realizam tarefas específicas e podem ser reutilizados.

// Protótipo
int calcularMedia(int a, int b, int c);

// Definição
int calcularMedia(int a, int b, int c) {
    return (a + b + c) / 3;
}

// Chamada
int resultado = calcularMedia(10, 20, 30);
ComponenteDescriçãoExemplo
Tipo de retornoO que a função devolveint, float, void
NomeIdentificador únicocalcularMedia
ParâmetrosValores que recebeint a, int b
CorpoCódigo executado{ return ...; }

Programa Completo — Calculadora

08
/* PROGRAMA: Calculadora Simples
   AUTOR: Estudante ISPS
   DESCRIÇÃO: Operações básicas entre dois números */

#include <stdio.h>
#define MSG_INICIO "Bem-vindo à Calculadora"

float somar(float a, float b);

int main() {
    float num1, num2, resultado;

    printf("%s\n", MSG_INICIO);
    printf("Digite dois números: ");
    scanf("%f %f", &num1, &num2);

    resultado = somar(num1, num2);
    printf("Soma: %.2f\n", resultado);
    return 0;
}

float somar(float a, float b) {
    return a + b;
}

Processo de Compilação

09
Código Fonte (.c)
↓
1. Pré-compilação
Processa #include, #define, remove comentários
↓
2. Compilação
Análise sintáctica e semântica → Assembly
↓
3. Montagem (Assembler)
Assembly → Código máquina (.obj)
↓
4. Ligação (Linking)
Combina objectos e bibliotecas → executável
↓
Programa Executável

Ciclo de Vida do Software

10

1 · Análise de Requisitos

  • Compreender o problema
  • Identificar necessidades do utilizador
  • Requisitos funcionais e não funcionais

2 · Projecto (Design)

  • Arquitectura do sistema
  • Escolher algoritmos e estruturas
  • Definir funções a criar

3 · Implementação

  • Escrever o código-fonte
  • Usar a linguagem C
  • Seguir padrões e boas práticas

4 · Testes e Depuração

  • Executar testes unitários
  • Corrigir erros
  • Validar contra requisitos

5 · Implantação

  • Instalar e configurar
  • Gravar no microcontrolador

6 · Manutenção

  • Correcção de erros
  • Evolução e melhorias

Modelo Cascata (Waterfall)

11

Abordagem sequencial onde cada fase deve ser concluída antes da próxima começar.

Requisitos
→
Projecto
→
Código
→
Testes
→
Deploy

✅ Vantagens

  • Simples e fácil de gerir
  • Documentação clara

❌ Desvantagens

  • Pouca flexibilidade
  • Difícil corrigir erros tarde

Desenvolvimento Incremental

12

Divide o projecto em partes menores (incrementos), desenvolvidas e entregues gradualmente.

PROJECTO COMPLETO
Incremento 1
Func. base
Incremento 2
Func. interm.
Incremento 3
Func. avanç.
↓
Teste
Teste
Teste
✅
Vantagem para embarcados: permite testar funcionalidades básicas (ex.: acender LED) antes de avançar, detectando cedo problemas de hardware.

Programação Incremental

13

Técnica recomendada para embarcados: desenvolve-se uma versão mínima funcional e adiciona-se funcionalidades gradualmente.

// VERSÃO 1: Apenas acende um LED
void main() {
    setup();
    for(;;) {
        ligarLED();
    }
}

// VERSÃO 2: Adiciona piscar o LED
void main() {
    setup();
    for(;;) {
        ligarLED();
        delay(1000);
        desligarLED();
        delay(1000);
    }
}

// VERSÃO 3: Adiciona leitura de um botão
void main() {
    setup();
    for(;;) {
        if(leBotao()) ligarLED();
        else desligarLED();
    }
}

Indentação

14

Organiza visualmente o código, mostrando a hierarquia dos blocos.

❌ Sem indentação

for(;;){
ssdUpdate();
newKey = kpRead();
if (newkey != key){
newkey = key;
for(i=0;i<10;i++){
if (BitTst(key,i)){
lcdChar(i+'0');
}
}
}
}

✅ Com indentação

for(;;) {
    ssdUpdate();
    newKey = kpRead();
    if (newkey != key) {
        newkey = key;
        for(i = 0; i < 10; i++) {
            if (BitTst(key, i)) {
                lcdChar(i + '0');
            }
        }
    }
}

Convenções de Nomenclatura

15
TipoConvençãoExemplo
VariáveisMinúsculas, camelCasecontador, temperaturaAtual
FunçõesPrimeira letra maiúsculaInicializarTeclado(), CalcularMedia()
ConstantesMaiúsculas, underscoreNUMERO_DE_VOLTAS, PI
MacrosMaiúsculas#define MAX_TENTATIVAS 3
📝
Escolhe uma convenção e sê consistente em todo o projecto.

O que é um IDE?

16

IDE (Integrated Development Environment) — software que reúne várias ferramentas de desenvolvimento.

📝 Editor de Código

  • Destaque de sintaxe
  • Auto-completar
  • Numeração de linhas

⚙️ Compilador

  • Traduz código-fonte → máquina
  • Gera executáveis

🐞 Depurador (Debugger)

  • Execução passo-a-passo
  • Breakpoints
  • Inspeção de variáveis

📁 Gestor de Projectos + Gravação

  • Organiza ficheiros
  • Upload para placa (embarcados)

IDEs para Programação em C

17

💻 Propósito Geral

IDECaracterísticasUso Recomendado
Code::BlocksGratuito, leve, multiplataformaIniciantes em C/C++
Dev-C++Simples, gratuito, WindowsPrimeiros passos
Visual Studio CodeModerno, extensívelDesenvolvimento profissional
CLionPago, completoProjectos complexos

🔧 Sistemas Embarcados

PlacaIDE
Arduino UnoArduino IDE
Chipkit UNO32MPIDE
Freedom KL05zKinetis Design Studio

Arduino IDE — Exemplo

18
void setup(void) {
    // Inicialização dos periféricos
    kpInit();
    lcdInit();
}

void loop(void) {
    int tecla;

    // Atualiza o teclado (debounce)
    kpDebounce();

    // Lê a tecla pressionada
    tecla = kpReadKey();

    // Exibe no LCD
    lcdPosition(0, 0);
    lcdNumber(tecla);
}
🎯
Estrutura Arduino: setup() corre uma vez; loop() corre continuamente.

O Bootloader e a Gravação

19
1. Ligar a placa
↓
2. Bootloader inicia — verifica comando
↓

Com comando

3a. Modo de gravação

Sem comando

3b. Executa o programa
↓
4. Recebe novo programa → Flash
↓
5. Reinicia a placa

Exercícios de Fixação

20

1 · Estrutura do Programa

Analisa o programa abaixo e identifica:

#include <stdio.h>
#define PI 3.14159
float calculArea(float raio);

int main() {
    float r, area;
    scanf("%f", &r);
    area = calculArea(r);
    printf("%.2f\n", area);
    return 0;
}

a) Directivas? b) Macro? c) Protótipo? d) main()?

2 · Ordem de Compilação

Ordena as etapas:

  • ( ) Liga arquivos objecto
  • ( ) Converte Assembly → máquina
  • ( ) Gera código Assembly
  • ( ) Processa directivas

3 · Metodologias

Explica a diferença entre modelo cascata e desenvolvimento incremental. Qual é mais adequado para sistemas embarcados?

4 · Arduino

Escreve um programa que configure o pino 13 como saída e faça o LED piscar a cada 1 segundo.

Síntese da Aula

21
TópicoConceitos-Chave
Estrutura do ProgramaComentários, directivas, protótipos, main(), funções
Função main()Ponto de entrada, loop infinito (embarcados), retorno (PC)
CompilaçãoPré-compilação → Compilação → Montagem → Ligação
MetodologiasCascata, incremental, ciclo de vida
Boas PráticasIndentação, nomenclatura, comentários
IDEsEditor, compilador, depurador, gestor de projectos
Arduino IDEsetup() e loop(), bootloader

Fim da Aula

Bons estudos e boa programação em C.

Próxima aula:Arrays Unidimensionais (Vetores) Prática:Resolver exercícios 1 a 4
← Voltar à lista de aulas