← Aulas

Trabalhando com Vetores

Arrays Unidimensionais em Linguagem C — declaração, inicialização, strings e aplicações embarcadas.

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

Objectivos da Aula

02

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

  • Compreender o conceito de array unidimensional (vetor) e sua importância
  • Declarar, inicializar e acessar elementos de um vetor em C
  • Utilizar vetores para resolver problemas de pequena e média complexidade
  • Aplicar vetores em sistemas embarcados: sensores, buffers e displays
  • Compreender a relação entre vetores e strings em C

O que é um Vetor?

03

Estrutura de dados que armazena uma sequência de elementos do mesmo tipo, acessíveis por índice numérico, em posições contíguas de memória.

Características

  • Todos os elementos são do mesmo tipo
  • O primeiro elemento ocupa a posição 0
  • Tamanho definido na declaração — não pode mudar em execução
  • Acesso por vetor[índice]
int num[5];  // Vetor de 5 inteiros

Memória:
+------+------+------+------+------+
|num[0]|num[1]|num[2]|num[3]|num[4]|
+------+------+------+------+------+

Por que usar Vetores?

04

📦 Armazenamento

Grandes quantidades de dados do mesmo tipo sem declarar várias variáveis.

🔄 Loops

Facilita a manipulação de dados através de loops.

🧮 Algoritmos

Ordenação, busca, médias e outras operações.

🔧 Embarcados

Leituras de sensores, buffers, tabelas para displays.

Declaração de Vetores

05

Sintaxe: <tipo> nomeVetor[numeroDeElementos];

int idades[10];         // 10 inteiros
float temperaturas[5];    // 5 floats
char nome[20];            // 20 caracteres (string)
💡
O número de elementos deve ser uma constante inteira positiva. Usa #define para definir o tamanho:
#define TAM 10
int vetor[TAM];

Inicialização na Declaração

06
int num[5] = {10, 20, 30, 40, 50};
float notas[3] = {7.5, 8.0, 9.2};
char vogais[5] = {'a', 'e', 'i', 'o', 'u'};

Tamanho omitido

int num[] = {10, 20, 30};  // Compilador conta: 3 elementos
✅
O compilador conta automaticamente o número de elementos quando o tamanho é omitido.

Inicialização Parcial e com Zero

07

Parcial

int num[5] = {10, 20};
// num[0]=10, num[1]=20, num[2..4]=0 (preenchidos com zero)

Com zero (todos)

int num[5] = {0};  // Todos os elementos valem 0
⚠️
Variáveis locais NÃO são inicializadas automaticamente. Inicializa sempre antes de usar!

Acesso aos Elementos

08
int num[5] = {10, 20, 30, 40, 50};

int x = num[2];    // x = 30
num[4] = 100;        // Altera o 5º elemento para 100

Percorrer com loop

int i;
int num[5] = {10, 20, 30, 40, 50};

for (i = 0; i < 5; i++) {
    printf("num[%d] = %d\n", i, num[i]);
}
🚫
O índice deve estar entre 0 e tamanho-1. Acessar fora deste intervalo causa comportamento indefinido — pode corromper memória.

Exemplo — Média de Valores

09
#define TAM 5

int valores[TAM] = {10, 20, 30, 40, 50};
int soma = 0;
float media;
int i;

for (i = 0; i < TAM; i++) {
    soma += valores[i];
}
media = (float)soma / TAM;

printf("Média: %.2f\n", media);
💡
O cast (float)soma força a divisão com casas decimais. Sem ele, a divisão seria inteira.

Vetores de Caracteres e Strings

10

Em C, uma string é um vetor de char terminado pelo caractere nulo '\0'.

char nome[10] = "Jose";

// Ocupa 5 posições: 'J', 'o', 's', 'e', '\0'

Inicialização de Strings

char msg[] = "Bom dia";      // Tamanho 8 (7 chars + '\0')
char nome[10] = "Ana";       // 10 posições, só 4 usadas
char vazio[20] = "";         // String vazia

Imprimindo uma String

11
char msg[] = "Hello World";
int i = 0;

while (msg[i] != '\0') {
    lcdChar(msg[i]);  // Função hipotética para display LCD
    i++;
}
💡
Também podes usar printf("%s", msg) ou puts(msg) para imprimir strings directamente.

Armazenar Leituras de Sensores

12
#define AMOSTRAS 10
int leituras[AMOSTRAS];
int i;

for (i = 0; i < AMOSTRAS; i++) {
    leituras[i] = adRead(0);  // Lê canal 0 do ADC
    timerDelay(100);           // Aguarda 100 ms
}
✅
Padrão clássico em sistemas de aquisição de dados: guardar várias amostras num vetor para processamento posterior (média, filtro, etc.).

Buffer Circular

13

Usado para armazenar dados temporariamente — típico em comunicação serial.

#define TAM_BUFFER 10
char buffer[TAM_BUFFER];
int inicio = 0, fim = 0;

void adicionaBuffer(char dado) {
    buffer[fim] = dado;
    fim = (fim + 1) % TAM_BUFFER;
}

char removeBuffer(void) {
    char dado = buffer[inicio];
    inicio = (inicio + 1) % TAM_BUFFER;
    return dado;
}
🔄
O operador % faz o índice "dar a volta" — quando chega ao fim, volta ao início.

Tabela de Conversão — Display 7 Segmentos

14
const char conv[16] = {
    0xD7, // 0
    0x11, // 1
    0xCD, // 2
    0x5D, // 3
    0x1B, // 4
    0x5E, // 5
    0xDE, // 6
    0x15, // 7
    0xDF, // 8
    0x5F, // 9
    0x9F, // A
    0xDA, // b
    0xC6, // C
    0xD9, // d
    0xCE, // E
    0x8E  // F
};

void displayDigit(char pos, char valor) {
    soWrite(conv[valor]);
    digitalWrite(pos, HIGH);
}

Filtro de Média Móvel

15
#define N 5
int amostras[N] = {0};
int soma = 0;
int i;

int filtroMedia(int novaAmostra) {
    soma -= amostras[0];
    for (i = 0; i < N - 1; i++) {
        amostras[i] = amostras[i + 1];
    }
    amostras[N - 1] = novaAmostra;
    soma += novaAmostra;
    return soma / N;
}
📊
Padrão muito usado em embarcados para suavizar leituras de sensores com ruído.

Exemplo — Leitura e Exibição no LCD

16
#include "lcd.h"
#include "ad.h"
#define TAM 5

void main(void) {
    int valores[TAM];
    int i, soma = 0;

    lcdInit();
    adInit();

    for (i = 0; i < TAM; i++) {
        valores[i] = adRead(2);
        lcdPosition(0, i*3);
        lcdNumber(valores[i]);
        timerDelay(500);
    }

    for (i = 0; i < TAM; i++) {
        soma += valores[i];
    }

    lcdPosition(1, 0);
    lcdString("Media: ");
    lcdNumber(soma / TAM);

    for (;;);
}

Padrões de LEDs com Vetor

17
#include "io.h"

const char padroes[8] = {
    0x01, 0x02, 0x04, 0x08,
    0x10, 0x20, 0x40, 0x80
};

void main(void) {
    int i;
    systemInit();

    for (;;) {
        for (i = 0; i < 8; i++) {
            ioWrite(padroes[i]);
            timerDelay(200);
        }
    }
}
💡
const coloca o vetor em memória de programa — poupa RAM preciosa em microcontroladores.

Exercícios Propostos

18

1 · Criação

Cria um vetor de 10 inteiros, inicializa com 1 a 10 e imprime todos.

2 · Soma e Média

Lê 8 temperaturas num vetor. Calcula e exibe média e maior valor.

3 · Inversão

Cria um vetor de 6 elementos e imprime-os na ordem inversa.

4 · Busca

Vetor de 20 inteiros. Pede um número e verifica se existe (indica posição ou "não encontrado").

5 · String

Cria um vetor de char com teu nome e imprime cada caractere numa linha do LCD.

6 · Buffer Circular

Implementa buffer circular de 10 posições para caracteres da serial.

7 · 7 Segmentos

Usa a tabela de conversão e exibe 0-9 sequencialmente.

8 · Filtro

Filtro de média móvel N=5 para suavizar leitura de sensor analógico.

Resumo e Considerações Finais

19

📌 Conceitos-Chave

  • Vetores armazenam múltiplos dados do mesmo tipo
  • Indexação: 0 a tamanho-1
  • Strings = vetores de char terminados em '\0'

🔧 Embarcados

  • Buffers circulares
  • Tabelas de conversão
  • Leituras de sensores
  • Filtros de média

⚠️ Cuidados

  • Inicializar sempre antes de usar
  • Nunca ultrapassar os limites
  • Verificar consumo de memória

🚀 Próximos Passos

  • Matrizes (vetores bidimensionais)
  • Structs (estruturas heterogéneas)
  • Ponteiros

Bibliografia

20

📚 Principal

ASCENCIO, Ana F. G.; VENERUCH, Edilene A.
Fundamentos da Programação de Computadores. 3. ed. Pearson, 2014.

📚 Complementar

ALMEIDA, Rodrigo M. A.; MORAES, Carlos H. V.; SERAPHIM, Thatyana F. P.
Programação de Sistemas Embarcados. Elsevier, 2016. (Cap. 5 — Estruturas Compostas)

📚 Material Didático

Material do ISPSongo — Plano Analítico de Introdução à Programação em C.

Fim da Aula

Bons estudos e boa programação em C.

Próxima aula:Arrays Bidimensionais (Matrizes) Prática:Resolver exercícios 1 a 8
← Voltar à lista de aulas