Algoritmos e Programação II

Repetições, Arrays e Strings em C

Professor: Gabriel Soares Baptista

Objetivos de Aprendizado

  • Dominar as estruturas de repetição while, for e do-while.
  • Compreender e evitar a ocorrência de laços infinitos.
  • Manipular fluxos complexos com aninhamento e comandos break/continue.
  • Utilizar arrays (vetores e matrizes) para organizar grandes volumes de dados.
  • Compreender a natureza das strings como arrays de caracteres terminados em \0.
  • Aplicar funções da biblioteca <string.h> para manipulação de texto.

Estruturas de Repetição

Lógica por Condição

A repetição por condição permite que um bloco de instruções seja executado repetidamente enquanto uma determinada condição permanecer verdadeira.
A lógica fundamental é: "enquanto uma condição for válida, faça a sequência de comandos".

FlowchartInicioInícioReadLeia CondiçãoInicio->ReadCondVerdade?Read->CondCmdExecuta ComandosCond->CmdSimFimFimCond->FimNãoCmd:w->Cond:w

O Risco do Laço Infinito

Um laço infinito (infinite loop) ocorre quando a condição de parada nunca é satisfeita. Isso geralmente acontece por:

  • Ausência de critério de parada: Não se define quando o ciclo deve acabar.
  • Condição inalcançável: A lógica interna do código afasta a variável de controle do objetivo de parada.
Exemplo de Erro Comum
X = 4;
enquanto (X < 5) faca
    X = X - 1; // X diminui sempre, nunca chegará a 5
    Imprima X;
fim enquanto

O programa consumirá processamento sem nunca concluir a tarefa.

O Comando while e do-while

Comando while

Testa a condição antes de executar o bloco. Se for falsa inicialmente, o bloco nunca é executado.

while (condição) {
    // comandos
}

Comando do-while

Executa o bloco pelo menos uma vez, testando a condição apenas ao final.

do {
    // comandos
} while (condição); // ; obrigatório

O Comando for

Projetado para condensar inicialização, condição e incremento em uma única linha.

for (inicialização; condição; incremento) {
    sequência de comandos;
}

Flexibilidade no for:

  • Omissão: É possível omitir cláusulas, como for (; a <= b; a++), desde que os ; permaneçam.
  • Múltiplos Controles: O operador vírgula permite controlar duas variáveis ao mesmo tempo: for (i=0, j=10; i < j; i++, j--).

Controle de Fluxo: break e continue

  • break: Interrompe o laço imediatamente e salta para fora da estrutura de repetição.
  • continue: Interrompe apenas a iteração atual, saltando direto para o teste da próxima repetição.
FlowStartInício do LaçoCondCondição?Start->CondCmd1Comando 1Cond->Cmd1SimEndFim do LaçoCond->EndNãoBreakbreak;Cmd1->BreakSe erroContcontinue;Cmd1->ContSe pularCmd2Comando 2Cmd1->Cmd2Break->EndCont->CondCmd2->Cond

Questões de fixação - 1 / 3

  1. Escreva um programa em C que utilize um laço for para imprimir todos os números inteiros de 1 a 20 na tela.
  2. Crie um programa que utilize o laço while para exibir uma contagem regressiva de 10 até 0. Ao final, imprima a mensagem "FIM!".
  3. Peça ao usuário para digitar um número inteiro. Utilize um laço para imprimir a tabuada desse número de 1 a 10.
  4. Escreva um programa que leia 5 números inteiros. Utilize um laço para somá-los e, ao final, imprima a soma total e a média.
  5. Utilize do-while para pedir uma nota entre 0.0 e 10.0. Repita até que uma nota válida seja inserida.
  6. Crie um programa que receba dois números A e B (A < B). Use for para imprimir apenas os números pares no intervalo.

Questões de fixação - 1 / 3 (cont.)

  1. Escreva um programa que calcule o fatorial de um número inteiro não negativo ($N! = N \times (N-1) \times \dots \times 1$).
  2. Utilize laços aninhados para desenhar um quadrado de asteriscos (*) com lado N informado pelo usuário.
  3. Escreva um programa que leia um número N e imprima as N primeiras linhas do Triângulo de Floyd.
  4. Determine se um número inteiro positivo maior que 1 é PRIMO (divisível apenas por 1 e por ele mesmo).
  5. Imprima os N primeiros termos da sequência de Fibonacci (0, 1, 1, 2, 3, 5...).

Arrays: Vetores e Matrizes

Por que utilizar arrays?

As variáveis simples armazenam apenas um valor. Para gerenciar, por exemplo, 100 notas de alunos, seriam necessárias 100 variáveis individuais, o que é inviável.
O Array permite:

  • Agrupar variáveis do mesmo tipo sob um único nome.
  • Organização contígua na memória.
  • Acesso eficiente via índices numéricos.

Vetores (Unidimensionais)

A declaração segue o formato: tipo_dado nome[tamanho];.
O índice começa sempre em ZERO e termina em N-1.

float notas[5];
notas[0] = 8.5;
notas[1] = 7.0;
// ...
notas[4] = 9.2;
GarrayÍndice01234Valor8.57.0......9.2
Atenção aos Limites

Tentar acessar notas[5] em um vetor de tamanho 5 resultará em acesso a memória inválida.

Matrizes (Bidimensionais)

Utilizadas para organizar dados em linhas e colunas.

int mat[3][2]; // 3 linhas e 2 colunas

Para percorrer uma matriz, utilizamos laços aninhados:

for (i = 0; i < linhas; i++) {
    for (j = 0; j < colunas; j++) {
        scanf("%d", &mat[i][j]);
    }
}

Inicialização de Arrays

Podemos atribuir valores no momento da declaração usando chaves {}.

Vetores

int v[3] = {10, 20, 30};

Matrizes

int m[2][2] = {{1, 2}, {3, 4}};
  • Preenchimento Parcial: Se houver menos valores que o tamanho, o restante é zerado automaticamente.
  • Omissão de Tamanho: int v[] = {1, 2, 3}; define o tamanho como 3 automaticamente.

Questões de fixação - 2 / 3

  1. Declare um vetor de inteiros com 5 posições {10, 20, 30, 40, 50} e imprima o valor da terceira posição (índice 2).
  2. Crie um programa que leia 5 números e os imprima na ordem inversa.
  3. Desenvolva um programa que leia as notas de 5 alunos, armazene-as e calcule a média aritmética.
  4. Leia 10 números e conte quantos números pares foram digitados.
  5. Verifique se um número X está presente em um vetor de 10 posições e informe seu índice.
  6. Peça ao usuário para preencher uma matriz 3x3 e imprima-a formatada em linhas e colunas.

Questões de fixação - 2 / 3 (cont.)

  1. Leia uma matriz 3x3 e calcule a soma dos elementos da diagonal principal (linha == coluna).
  2. Dados dois vetores A e B, gere um vetor C onde C[i] = A[i] + B[i].
  3. Identifique o maior valor em uma matriz 4x4 e informe sua linha e coluna.
  4. Calcule a soma de cada linha de uma matriz 3x3 separadamente e armazene os resultados em um vetor.
  5. Implemente a multiplicação de duas matrizes 2x2: C = A * B.

Strings: Texto em C

Definição e Terminador Nulo

Uma string é um array de caracteres (char).

Diferença vital: O caractere nulo \0 deve ser o último elemento para marcar o fim do texto.

  • Sem o \0, funções de texto lerão "lixo de memória" após a palavra.
  • Espaço: Para um texto de 10 letras, declare um array de tamanho 11.

Entrada e Saída de Texto

A leitura de strings exige cuidado com espaços e buffers.

Função Comportamento
scanf("%s", str) Interrompe a leitura no primeiro espaço.
gets(str) Lê frases completas, mas é perigosa (sem limite de tamanho).
fgets(str, tam, stdin) Recomendada. Limita o tamanho e é segura.

Limpeza de Buffer

Use setbuf(stdin, NULL) antes da leitura para evitar que resíduos do teclado (como o 'Enter') pulem o comando de entrada.

Funções da Biblioteca <string.h>

Ferramentas fundamentais para manipular textos:

  • strlen(s): Retorna o tamanho real da string (caracteres antes do \0).
  • strcpy(dest, orig): Copia o conteúdo de uma string para outra.
  • strcat(dest, orig): Concatena (anexa) a origem ao final do destino.
  • strcmp(s1, s2): Compara strings. Retorna 0 se forem exatamente iguais.
Case-Sensitive

A função strcmp diferencia maiúsculas de minúsculas. "Lógica" e "lógica" são diferentes.

Questões de fixação - 3 / 3

  1. Inicialize uma string com "Teste" e imprima-a na tela.
  2. Leia o nome do usuário e imprima "Ola, [Nome]!".
  3. Leia uma frase completa (com espaços) usando fgets e exiba-a.
  4. Imprima o número de caracteres de uma palavra usando strlen.
  5. Leia duas palavras e use strcat para juntá-las com um espaço entre elas.
  6. Copie o conteúdo de str1 para str2 usando strcpy.

Questões de fixação - 3 / 3 (cont.)

  1. Verifique se duas strings fornecidas são iguais ou diferentes usando strcmp.
  2. Sem usar strlen, conte manualmente quantos caracteres uma string possui percorrendo o array.
  3. Escreva um programa que leia uma string e imprima apenas as 4 primeiras letras.
  4. Substitua todas as ocorrências da letra 'a' (minúscula) em uma string pelo caractere '*'.
  5. Verifique se uma palavra é um palíndromo (lida igual de trás para frente, ex: ANA).
  6. Imprima uma string de trás para frente (invertida) sem usar funções prontas.

Próximos Passos

No próximo capítulo, estudaremos Funções:

  • Modularização de código.
  • Passagem de parâmetros e retorno de valores.
  • Introdução ao uso de ponteiros e gestão direta de endereços de memória.