Prática de Conversão de Pseudocódigo para C

Faça a ponte entre a "ideia" e a "implementação" de um algoritmo. Ótima preparação para provas de programação.

Tabela de Mapeamento Pseudocódigo ↔ C

Comece vendo como cada construção de pseudocódigo se traduz em C.
PseudocódigoC
Inteiro: xint x;
Real: xdouble x;
Caractere: cchar c;
x ← 10x = 10;
Exibir xprintf("%d", x);
Ler xscanf("%d", &x);
Se x > 0 então
    stmt
Senão
    stmt
FimSe
if (x > 0) {
    stmt;
} else {
    stmt;
}
Para i de 1 até n
    stmt
FimPara
for (int i = 1; i <= n; i++) {
    stmt;
}
Enquanto cond
    stmt
FimEnquanto
while (cond) {
    stmt;
}
Array de inteiros: A[n]int A[n];
Função add(a, b)
    Retornar: a + b
int add(int a, int b) {
    return a + b;
}
|x| (valor absoluto)abs(x) ou fabs(x)
raiz quadrada de xsqrt(x)
Trocar A[i] e A[j]int t=A[i]; A[i]=A[j]; A[j]=t;
Nota sobre pseudocódigo: é atribuição e = é igualdade (o == em C). Ponto-e-vírgula e chaves não são usados — a indentação transmite a estrutura.

Iniciante: Conversões de Sintaxe Básica

P-01
Calcular uma soma
Inteiro: sum ← 0
Para i de 1 até 10
sum ← sum + i
FimPara
Exibir sum
#include <stdio.h>

int main(void) {
    int sum = 0;
    for (int i = 1; i <= 10; i++) {
        sum = sum + i;
    }
    printf("%d\n", sum); // 55
    return 0;
}
P-02
Checagem de sinal
Inteiro: x
Ler x
Se x > 0 então
Exibir "positivo"
Senão se x = 0 então
Exibir "zero"
Senão
Exibir "negativo"
FimSe
#include <stdio.h>

int main(void) {
    int x;
    scanf("%d", &x);
    if (x > 0) {
        printf("positivo\n");
    } else if (x == 0) {      // o = do pseudocódigo vira == em C
        printf("zero\n");
    } else {
        printf("negativo\n");
    }
    return 0;
}
P-03
Contar números pares
Array de inteiros: A[5] ← {3, 8, 15, 22, 7}
Inteiro: count ← 0
Para i de 0 até 4
Se A[i] mod 2 = 0 então
count ← count + 1
FimSe
FimPara
Exibir "Pares:" e count
#include <stdio.h>

int main(void) {
    int A[] = {3, 8, 15, 22, 7};
    int count = 0;
    for (int i = 0; i <= 4; i++) {
        if (A[i] % 2 == 0) {
            count++;
        }
    }
    printf("Pares: %d\n", count); // 2
    return 0;
}
P-04
Contagem regressiva
Inteiro: n ← 5
Enquanto n > 0
Exibir n
n ← n - 1
FimEnquanto
Exibir "Decolar!"
#include <stdio.h>

int main(void) {
    int n = 5;
    while (n > 0) {
        printf("%d\n", n);
        n--;
    }
    printf("Decolar!\n");
    return 0;
}
P-05
Máximo de dois números
Função max(a, b)
Se a > b então
Retornar: a
Senão
Retornar: b
FimSe

Exibir max(7, 12)
#include <stdio.h>

int max(int a, int b) {
    if (a > b) return a;
    else return b;
}

int main(void) {
    printf("%d\n", max(7, 12)); // 12
    return 0;
}

Intermediário: Conversões de Algoritmos

P-06
Máximo do array
Array de inteiros: A[n] // n elementos
Inteiro: max ← A[0]
Para i de 1 até n-1
Se A[i] > max então
max ← A[i]
FimSe
FimPara
Retornar max
int find_max(int A[], int n) {
    int max = A[0];
    for (int i = 1; i < n; i++) {
        if (A[i] > max) {
            max = A[i];
        }
    }
    return max;
}
Nota de conversão: "até n-1" no pseudocódigo vira i < n em C (base zero). Você também precisa passar o tamanho do array como argumento.
P-07
Busca linear
Função search(A, n, key)
Para i de 0 até n-1
Se A[i] = key então
Retornar i
FimSe
FimPara
Retornar -1 // não encontrado
int search(int A[], int n, int key) {
    for (int i = 0; i < n; i++) {
        if (A[i] == key) {  // o = do pseudocódigo vira == em C
            return i;
        }
    }
    return -1;
}
P-08
Bubble sort
Função bubbleSort(A, n)
Para i de 0 até n-2
Para j de n-1 até i+1 decrescendo
Se A[j-1] > A[j] então
Trocar A[j-1] e A[j]
FimSe
FimPara
FimPara
void bubbleSort(int A[], int n) {
    for (int i = 0; i < n - 1; i++) {
        for (int j = n - 1; j > i; j--) {  // laço decrescente
            if (A[j-1] > A[j]) {
                int tmp = A[j-1];  // troca exige uma variável temporária
                A[j-1] = A[j];
                A[j] = tmp;
            }
        }
    }
}
Nota de conversão: "Trocar" é uma linha em pseudocódigo, mas são três linhas e uma variável temporária em C. Laço decrescente usa j--.
P-09
Algoritmo de Euclides (MDC)
Função gcd(a, b)
Enquanto b ≠ 0
Inteiro: temp ← b
b ← a mod b
a ← temp
FimEnquanto
Retornar a
int gcd(int a, int b) {
    while (b != 0) {
        int temp = b;
        b = a % b;
        a = temp;
    }
    return a;
}
P-10
Busca binária
Função binarySearch(A, n, key)
Inteiro: lo ← 0, hi ← n - 1
Enquanto lo ≤ hi
Inteiro: mid ← (lo + hi) ÷ 2
Se A[mid] = key então
Retornar mid
Senão se A[mid] < key então
lo ← mid + 1
Senão
hi ← mid - 1
FimSe
FimEnquanto
Retornar -1
int binarySearch(int A[], int n, int key) {
    int lo = 0, hi = n - 1;
    while (lo <= hi) {
        int mid = (lo + hi) / 2;   // ÷ vira / (divisão inteira)
        if (A[mid] == key) return mid;
        else if (A[mid] < key) lo = mid + 1;
        else hi = mid - 1;
    }
    return -1;
}

Avançado: Recursão, Ponteiros e Structs

P-11
Fatorial (recursão)
Função factorial(n)
Se n ≤ 1 então
Retornar 1
Senão
Retornar n × factorial(n - 1)
FimSe
int factorial(int n) {
    if (n <= 1) return 1;
    return n * factorial(n - 1);
}
P-12
Modificar um valor por ponteiro
Função addTen(endereço de x)
valor no endereço de x ← valor no endereço de x + 10

Inteiro: a ← 5
Chamar addTen(endereço de a)
Exibir a // vira 15
#include <stdio.h>

void addTen(int *px) {     // "endereço" -> parâmetro ponteiro
    *px = *px + 10;          // "valor no endereço" -> *px
}

int main(void) {
    int a = 5;
    addTen(&a);              // "endereço de a" -> &a
    printf("%d\n", a);       // 15
    return 0;
}
Nota de conversão: "endereço" do pseudocódigo mapeia para & (endereço-de) e * (dereferência) de C. Isso é, em resumo, o que ponteiros são.
P-13
Gerenciar coordenadas com struct
Struct Point:
Real: x, y

Função distance(p1, p2) // distância entre dois pontos
dx ← p2.x - p1.x
dy ← p2.y - p1.y
Retornar sqrt(dx² + dy²)

Point: a ← (0.0, 0.0)
Point: b ← (3.0, 4.0)
Exibir distance(a, b) // 5.0
#include <stdio.h>
#include <math.h>

struct Point {
    double x, y;
};

double distance(struct Point p1, struct Point p2) {
    double dx = p2.x - p1.x;
    double dy = p2.y - p1.y;
    return sqrt(dx*dx + dy*dy);
}

int main(void) {
    struct Point a = {0.0, 0.0};
    struct Point b = {3.0, 4.0};
    printf("%.1f\n", distance(a, b)); // 5.0
    return 0;
}
P-14
Quicksort (recursão)
Função quickSort(A, lo, hi)
Se lo >= hi então sair
Inteiro: pivot ← A[hi]
Inteiro: i ← lo
Para j de lo até hi-1
Se A[j] < pivot então
Trocar A[i] e A[j]
i ← i + 1
FimSe
FimPara
Trocar A[i] e A[hi]
quickSort(A, lo, i - 1)
quickSort(A, i + 1, hi)
void swap(int *a, int *b) {
    int t = *a; *a = *b; *b = t;
}

void quickSort(int A[], int lo, int hi) {
    if (lo >= hi) return;
    int pivot = A[hi];
    int i = lo;
    for (int j = lo; j < hi; j++) {
        if (A[j] < pivot) {
            swap(&A[i], &A[j]);
            i++;
        }
    }
    swap(&A[i], &A[hi]);
    quickSort(A, lo, i - 1);
    quickSort(A, i + 1, hi);
}
Nota de conversão: extraia "swap" para uma função própria. "sair" do pseudocódigo vira return; em C.
P-15
Método de Newton
Função newton(f, df, x0, eps)
Real: x ← x0
Laço
Real: x_new ← x - f(x) / df(x)
Se |x_new - x| < eps então
Retornar x_new
FimSe
x ← x_new
FimLaço
#include <math.h>

double f(double x)  { return x*x - 2; }
double df(double x) { return 2*x; }

double newton(double x0, double eps) {
    double x = x0;
    while (1) {                      // "Laço" -> laço infinito
        double x_new = x - f(x) / df(x);
        if (fabs(x_new - x) < eps)  // |...| -> fabs()
            return x_new;
        x = x_new;
    }
}
Nota de conversão: "Laço" incondicional vira while(1), e "|x|" é fabs(x). Passar funções como argumentos usa ponteiros de função em C, embora usar funções globais seja a abordagem mais simples para iniciantes.

Erros Comuns de Conversão

PseudocódigoArmadilha em C
x = y (comparação)x == y (= é atribuição!)
Trocar A[i] e A[j]Precisa de uma variável temporária (não é uma linha só)
raiz quadrada de xsqrt(x) (precisa incluir math.h)
Laço (incondicional)while(1) + break para sair
i de 1 até nfor(i=1; i<=n; i++) (cuidado com arrays base zero)
func(array, tamanho)Você precisa passar o tamanho do array explicitamente — C não tem introspecção de tamanho
passar por endereçoparâmetro ponteiro int *px, com & no local da chamada
÷ (divisão inteira)/ — entre ints trunca automaticamente
Compartilhe este artigo
Compartilhar no X