petcarescript
Version:
PetCareScript - A modern, expressive programming language designed for humans
1,977 lines (1,628 loc) • 118 kB
Markdown
# PetCareScript - Guia Completo de Estudos
## 🎯 Bem-vindo ao PetCareScript!
**PetCareScript** é uma linguagem de programação moderna, expressiva e humanizada, projetada para tornar a programação mais acessível e intuitiva. Com sintaxe próxima à linguagem natural, é ideal para iniciantes aprenderem programação e para desenvolvedores experientes prototiparem rapidamente.
### 📚 Sobre Este Guia
Este guia está estruturado em módulos progressivos, levando você desde os conceitos mais básicos até técnicas avançadas de programação. Cada módulo inclui:
- **Teoria**: Conceitos fundamentais
- **Sintaxe**: Como escrever código
- **Exemplos**: Código prático e funcional
- **Exercícios**: Atividades para praticar
- **Projetos**: Aplicações do mundo real
### 🛣️ Trilha de Aprendizado
```
📍 Módulo 1: Fundamentos
📍 Módulo 2: Estruturas de Dados
📍 Módulo 3: Funções e Escopo
📍 Módulo 4: Estruturas de Controle
📍 Módulo 5: Programação Orientada a Objetos
📍 Módulo 6: Projetos Práticos
📍 Módulo 7: Tópicos Avançados
```
### ⚡ Instalação Rápida
```bash
# Via NPM (recomendado)
npm install -g petcarescript
# Verificar instalação
pcs --version
# Executar arquivo
pcs meucodigo.pcs
# REPL interativo
pcs repl
```
---
## 📍 Módulo 1: Fundamentos
### 🎯 Objetivos do Módulo
- Entender a filosofia do PetCareScript
- Aprender sintaxe básica
- Trabalhar com variáveis e tipos
- Usar comentários e formatação
### 1.1 Primeiro Programa
**Todo programa começa com "Olá, Mundo!"**
```javascript
// meu_primeiro_programa.pcs
show "Olá, Mundo!";
```
**Para executar:**
```bash
pcs meu_primeiro_programa.pcs
```
### 1.2 Comentários
```javascript
// Comentário de linha única
/*
Comentário de
múltiplas linhas
*/
/*
TODO: Implementar nova funcionalidade
FIXME: Corrigir bug na função de cálculo
NOTE: Esta seção pode ser otimizada
*/
```
### 1.3 Variáveis e Tipos
#### Declaração de Variáveis
```javascript
// Palavra-chave 'store' para declarar variáveis
store nome = "Maria";
store idade = 25;
store ativo = yes;
store vazio = empty;
```
#### Tipos de Dados Primitivos
```javascript
// Números
store inteiro = 42;
store decimal = 3.14159;
store negativo = -17;
// Strings (texto)
store mensagem = "Bem-vindo ao PetCareScript!";
store template = 'Texto com aspas simples';
store emoji = "🚀 Linguagem incrível! 🎉";
// Booleanos
store verdadeiro = yes; // true
store falso = no; // false
// Nulo
store indefinido = empty; // null/undefined
```
#### Convenções de Nomenclatura
```javascript
// ✅ Boas práticas
store userName = "joao"; // camelCase
store user_age = 30; // snake_case
store MAX_USERS = 100; // CONSTANTES
// ❌ Evitar
store 123abc = "erro"; // Não pode começar com número
store user-name = "erro"; // Hífen não permitido
store store = "erro"; // Palavra reservada
```
### 1.4 Operações Básicas
#### Operadores Aritméticos
```javascript
store a = 10;
store b = 3;
store soma = a + b; // 13
store subtracao = a - b; // 7
store multiplicacao = a * b; // 30
store divisao = a / b; // 3.333...
show "Soma: " + soma;
show "Divisão: " + divisao;
```
#### Concatenação de Strings
```javascript
store primeiro_nome = "João";
store ultimo_nome = "Silva";
store nome_completo = primeiro_nome + " " + ultimo_nome;
show "Nome completo: " + nome_completo; // "Nome completo: João Silva"
// Misturando tipos
store produto = "Notebook";
store preco = 2500;
store mensagem = "O " + produto + " custa R$ " + preco;
show mensagem; // "O Notebook custa R$ 2500"
```
### 1.5 Entrada e Saída
#### Saída Simples
```javascript
show "Texto simples";
show 42;
show yes;
show [1, 2, 3];
// Múltiplas variáveis
store nome = "Ana";
store pontos = 95;
show nome + " tem " + pontos + " pontos";
```
### 🏋️ Exercícios do Módulo 1
#### Exercício 1.1: Variáveis Pessoais
```javascript
// Complete o código abaixo com suas informações
store meu_nome = "SEU_NOME_AQUI";
store minha_idade = 0; // Sua idade
store gosto_programacao = yes; // ou no
show "Olá! Meu nome é " + meu_nome;
show "Tenho " + minha_idade + " anos";
show "Gosto de programação: " + gosto_programacao;
```
#### Exercício 1.2: Calculadora Básica
```javascript
// Crie uma calculadora que soma dois números
store numero1 = 15;
store numero2 = 25;
store resultado = numero1 + numero2;
show numero1 + " + " + numero2 + " = " + resultado;
// Agora faça para subtração, multiplicação e divisão
```
#### Exercício 1.3: Informações de Produto
```javascript
// Sistema de loja simples
store produto_nome = "Smartphone";
store produto_preco = 899;
store produto_disponivel = yes;
// Mostre as informações formatadas
show "=== INFORMAÇÕES DO PRODUTO ===";
show "Nome: " + produto_nome;
show "Preço: R$ " + produto_preco;
show "Disponível: " + produto_disponivel;
```
---
## 📍 Módulo 2: Estruturas de Dados
### 🎯 Objetivos do Módulo
- Trabalhar com arrays (listas)
- Manipular objetos
- Acessar e modificar dados
- Entender estruturas complexas
### 2.1 Arrays (Listas)
#### Criação e Acesso
```javascript
// Criando arrays
store numeros = [1, 2, 3, 4, 5];
store frutas = ["maçã", "banana", "laranja"];
store misto = [1, "texto", yes, empty];
store vazio = [];
// Acessando elementos (índice começa em 0)
store primeira_fruta = frutas[0]; // "maçã"
store segunda_fruta = frutas[1]; // "banana"
store ultimo_numero = numeros[4]; // 5
show "Primeira fruta: " + primeira_fruta;
```
#### Modificação de Arrays
```javascript
store cores = ["vermelho", "azul", "verde"];
// Modificar elemento existente
cores[1] = "amarelo";
show cores; // ["vermelho", "amarelo", "verde"]
// Adicionar elemento (simulação)
store novo_indice = length(cores);
cores[novo_indice] = "roxo";
show cores; // ["vermelho", "amarelo", "verde", "roxo"]
```
#### Trabalhando com Arrays
```javascript
store notas = [8.5, 7.2, 9.1, 6.8, 8.9];
// Encontrar tamanho
store total_notas = length(notas);
show "Total de notas: " + total_notas;
// Calcular soma manual
store soma = notas[0] + notas[1] + notas[2] + notas[3] + notas[4];
store media = soma / total_notas;
show "Média: " + media;
```
### 2.2 Objetos
#### Criação e Estrutura
```javascript
// Objeto simples
store pessoa = {
nome: "Carlos",
idade: 28,
profissao: "Programador",
ativo: yes
};
// Acessando propriedades
store nome_pessoa = pessoa.nome;
store idade_pessoa = pessoa.idade;
show "Nome: " + nome_pessoa;
show "Idade: " + idade_pessoa;
```
#### Objetos Complexos
```javascript
store empresa = {
nome: "TechCorp",
fundacao: 2020,
endereco: {
rua: "Rua das Flores, 123",
cidade: "São Paulo",
cep: "01234-567"
},
funcionarios: [
{ nome: "Ana", cargo: "Developer" },
{ nome: "Bruno", cargo: "Designer" },
{ nome: "Carla", cargo: "Manager" }
]
};
// Acessando dados aninhados
store nome_empresa = empresa.nome;
store cidade_empresa = empresa.endereco.cidade;
store primeiro_funcionario = empresa.funcionarios[0].nome;
show "Empresa: " + nome_empresa;
show "Localizada em: " + cidade_empresa;
show "Primeiro funcionário: " + primeiro_funcionario;
```
#### Modificando Objetos
```javascript
store produto = {
nome: "Notebook",
preco: 2500,
categoria: "Eletrônicos"
};
// Modificar propriedades
produto.preco = 2200;
produto.categoria = "Computadores";
// Adicionar nova propriedade
produto.desconto = 10;
show "Produto: " + produto.nome;
show "Novo preço: R$ " + produto.preco;
show "Desconto: " + produto.desconto + "%";
```
### 2.3 Estruturas Mistas
#### Array de Objetos
```javascript
store biblioteca = [
{
titulo: "1984",
autor: "George Orwell",
ano: 1949,
disponivel: yes
},
{
titulo: "Dom Casmurro",
autor: "Machado de Assis",
ano: 1899,
disponivel: no
},
{
titulo: "O Hobbit",
autor: "J.R.R. Tolkien",
ano: 1937,
disponivel: yes
}
];
// Acessando livros
store primeiro_livro = biblioteca[0];
store titulo_primeiro = primeiro_livro.titulo;
store autor_segundo = biblioteca[1].autor;
show "Primeiro livro: " + titulo_primeiro;
show "Autor do segundo livro: " + autor_segundo;
```
#### Objeto com Arrays
```javascript
store loja = {
nome: "SuperMercado ABC",
categorias: ["Alimentação", "Limpeza", "Bebidas"],
produtos: [
{ nome: "Arroz", preco: 4.50, categoria: "Alimentação" },
{ nome: "Detergente", preco: 2.80, categoria: "Limpeza" },
{ nome: "Refrigerante", preco: 5.00, categoria: "Bebidas" }
],
funcionarios: {
gerente: "Maria Silva",
caixas: ["João", "Ana", "Pedro"],
estoquistas: ["Carlos", "Lucia"]
}
};
// Navegando pela estrutura
store nome_loja = loja.nome;
store total_categorias = length(loja.categorias);
store gerente = loja.funcionarios.gerente;
store primeiro_caixa = loja.funcionarios.caixas[0];
show loja.nome + " tem " + total_categorias + " categorias";
show "Gerente: " + gerente;
show "Primeiro caixa: " + primeiro_caixa;
```
### 🏋️ Exercícios do Módulo 2
#### Exercício 2.1: Lista de Compras
```javascript
// Crie uma lista de compras com 5 itens
store lista_compras = ["pão", "leite", "ovos", "frutas", "carne"];
// Mostre cada item com seu número
show "=== LISTA DE COMPRAS ===";
show "1. " + lista_compras[0];
show "2. " + lista_compras[1];
show "3. " + lista_compras[2];
show "4. " + lista_compras[3];
show "5. " + lista_compras[4];
// Adicione mais um item à lista
store novo_item = "chocolate";
store novo_indice = length(lista_compras);
lista_compras[novo_indice] = novo_item;
show "Total de itens: " + length(lista_compras);
```
#### Exercício 2.2: Perfil de Usuário
```javascript
// Crie um perfil completo de usuário
store usuario = {
informacoes_pessoais: {
nome_completo: "João Silva Santos",
idade: 30,
email: "joao@email.com"
},
endereco: {
rua: "Rua A, 123",
cidade: "Rio de Janeiro",
estado: "RJ"
},
hobbies: ["leitura", "natação", "programação"],
redes_sociais: {
twitter: "@joaosilva",
linkedin: "joao-silva-santos"
}
};
// Exiba um resumo formatado do usuário
show "=== PERFIL DO USUÁRIO ===";
show "Nome: " + usuario.informacoes_pessoais.nome_completo;
show "Idade: " + usuario.informacoes_pessoais.idade + " anos";
show "Cidade: " + usuario.endereco.cidade + "/" + usuario.endereco.estado;
show "Hobbies: " + usuario.hobbies[0] + ", " + usuario.hobbies[1] + ", " + usuario.hobbies[2];
```
#### Exercício 2.3: Sistema de Notas
```javascript
// Sistema para calcular média de um aluno
store aluno = {
nome: "Maria Oliveira",
disciplina: "Matemática",
notas: [8.5, 7.0, 9.2, 6.8],
faltas: 2
};
// Calcule a média das notas
store soma_notas = aluno.notas[0] + aluno.notas[1] + aluno.notas[2] + aluno.notas[3];
store media = soma_notas / length(aluno.notas);
// Determine se está aprovado (média >= 7.0 e faltas <= 5)
store aprovado = (media >= 7.0) also (aluno.faltas <= 5);
show "=== BOLETIM ESCOLAR ===";
show "Aluno: " + aluno.nome;
show "Disciplina: " + aluno.disciplina;
show "Média: " + media;
show "Faltas: " + aluno.faltas;
show "Situação: " + (aprovado ? "APROVADO" : "REPROVADO");
```
---
## 📍 Módulo 3: Funções e Escopo
### 🎯 Objetivos do Módulo
- Criar e usar funções
- Entender parâmetros e retorno
- Trabalhar com escopo de variáveis
- Organizar código com funções
### 3.1 Declaração e Uso de Funções
#### Funções Simples
```javascript
// Função sem parâmetros
build saudar() {
show "Olá! Bem-vindo ao PetCareScript!";
}
// Chamando a função
saudar(); // Saída: "Olá! Bem-vindo ao PetCareScript!"
```
#### Funções com Parâmetros
```javascript
// Função com um parâmetro
build saudarPessoa(nome) {
show "Olá, " + nome + "! Como você está?";
}
// Função com múltiplos parâmetros
build apresentar(nome, idade, profissao) {
show "Meu nome é " + nome;
show "Tenho " + idade + " anos";
show "Trabalho como " + profissao;
}
// Chamando as funções
saudarPessoa("Maria");
apresentar("João", 28, "Programador");
```
#### Funções com Retorno
```javascript
// Função que retorna um valor
build somar(a, b) {
store resultado = a + b;
give resultado; // 'give' é equivalente ao 'return'
}
// Função que calcula área de retângulo
build calcularArea(largura, altura) {
give largura * altura;
}
// Usando funções que retornam valores
store soma = somar(10, 5);
store area = calcularArea(8, 12);
show "Soma: " + soma; // 15
show "Área: " + area; // 96
```
### 3.2 Funções Práticas
#### Validação e Verificação
```javascript
// Função para verificar se é maior de idade
build ehMaiorIdade(idade) {
check (idade >= 18) {
give yes;
} otherwise {
give no;
}
}
// Função para validar email (versão simples)
build validarEmail(email) {
// Verifica se contém @ e .
store temArroba = no; // Simulação
store temPonto = no; // Simulação
// Em uma implementação real, você verificaria os caracteres
check (length(email) > 5) {
give yes; // Validação simplificada
} otherwise {
give no;
}
}
// Testando as funções
store idade = 20;
store email = "user@email.com";
check (ehMaiorIdade(idade)) {
show "Usuário é maior de idade";
} otherwise {
show "Usuário é menor de idade";
}
check (validarEmail(email)) {
show "Email válido";
} otherwise {
show "Email inválido";
}
```
#### Cálculos Matemáticos
```javascript
// Funções matemáticas úteis
build calcularCircunferencia(raio) {
store pi = 3.14159;
give 2 * pi * raio;
}
build calcularIMC(peso, altura) {
give peso / (altura * altura);
}
build converterCelsiusParaFahrenheit(celsius) {
give (celsius * 9 / 5) + 32;
}
// Usando as funções
store raio_circulo = 5;
store circunferencia = calcularCircunferencia(raio_circulo);
store peso = 70;
store altura = 1.75;
store imc = calcularIMC(peso, altura);
store temp_celsius = 25;
store temp_fahrenheit = converterCelsiusParaFahrenheit(temp_celsius);
show "Circunferência: " + circunferencia;
show "IMC: " + imc;
show temp_celsius + "°C = " + temp_fahrenheit + "°F";
```
### 3.3 Escopo de Variáveis
#### Escopo Local vs Global
```javascript
// Variável global
store contador_global = 0;
build incrementarContador() {
// Variável local à função
store incremento = 1;
contador_global = contador_global + incremento;
show "Contador agora é: " + contador_global;
}
build exemploEscopo() {
// Esta variável só existe dentro desta função
store variavel_local = "Só existe aqui";
show variavel_local;
// Pode acessar variáveis globais
show "Contador global: " + contador_global;
}
incrementarContador(); // Contador: 1
incrementarContador(); // Contador: 2
exemploEscopo();
// show variavel_local; // ❌ ERRO! Variável não existe aqui
```
#### Parâmetros e Escopo
```javascript
build calcularDesconto(preco_original, percentual_desconto) {
// Os parâmetros são variáveis locais à função
store valor_desconto = preco_original * (percentual_desconto / 100);
store preco_final = preco_original - valor_desconto;
// Variáveis locais
store mensagem = "Desconto aplicado com sucesso!";
show mensagem;
give preco_final;
}
store preco = 100;
store desconto = 15;
store preco_com_desconto = calcularDesconto(preco, desconto);
show "Preço original: R$ " + preco;
show "Preço final: R$ " + preco_com_desconto;
// Os parâmetros da função não existem aqui
// show preco_original; // ❌ ERRO!
```
### 3.4 Funções Avançadas
#### Funções que Chamam Outras Funções
```javascript
build calcularSalarioLiquido(salario_bruto, percentual_desconto) {
store valor_desconto = calcularDesconto(salario_bruto, percentual_desconto);
give salario_bruto - valor_desconto;
}
build calcularDesconto(valor, percentual) {
give valor * (percentual / 100);
}
build exibirRelatorioSalario(nome, salario_bruto, desconto_ir) {
store salario_liquido = calcularSalarioLiquido(salario_bruto, desconto_ir);
store valor_ir = calcularDesconto(salario_bruto, desconto_ir);
show "=== RELATÓRIO SALARIAL ===";
show "Funcionário: " + nome;
show "Salário Bruto: R$ " + salario_bruto;
show "IR (" + desconto_ir + "%): R$ " + valor_ir;
show "Salário Líquido: R$ " + salario_liquido;
}
// Usando o sistema
exibirRelatorioSalario("Ana Silva", 5000, 15);
```
#### Funções com Arrays
```javascript
build somarArray(numeros) {
store soma = 0;
store i = 0;
// Simulando um loop (veremos loops no próximo módulo)
soma = soma + numeros[0];
soma = soma + numeros[1];
soma = soma + numeros[2];
soma = soma + numeros[3];
give soma;
}
build encontrarMaior(numeros) {
store maior = numeros[0];
check (numeros[1] > maior) {
maior = numeros[1];
}
check (numeros[2] > maior) {
maior = numeros[2];
}
check (numeros[3] > maior) {
maior = numeros[3];
}
give maior;
}
build calcularMediaArray(numeros) {
store soma = somarArray(numeros);
store total = length(numeros);
give soma / total;
}
// Testando com notas de um aluno
store notas = [8.5, 7.2, 9.1, 6.8];
store soma_total = somarArray(notas);
store maior_nota = encontrarMaior(notas);
store media = calcularMediaArray(notas);
show "Soma das notas: " + soma_total;
show "Maior nota: " + maior_nota;
show "Média: " + media;
```
### 🏋️ Exercícios do Módulo 3
#### Exercício 3.1: Calculadora de Funções
```javascript
// Crie funções para operações matemáticas básicas
build somar(a, b) {
give a + b;
}
build subtrair(a, b) {
give a - b;
}
build multiplicar(a, b) {
give a * b;
}
build dividir(a, b) {
check (b == 0) {
show "Erro: Divisão por zero!";
give 0;
} otherwise {
give a / b;
}
}
// Função principal que usa todas as outras
build calcular(operacao, num1, num2) {
check (operacao == "soma") {
give somar(num1, num2);
} otherwise check (operacao == "subtracao") {
give subtrair(num1, num2);
} otherwise check (operacao == "multiplicacao") {
give multiplicar(num1, num2);
} otherwise check (operacao == "divisao") {
give dividir(num1, num2);
} otherwise {
show "Operação inválida!";
give 0;
}
}
// Teste sua calculadora
store resultado1 = calcular("soma", 10, 5);
store resultado2 = calcular("divisao", 20, 4);
store resultado3 = calcular("multiplicacao", 7, 8);
show "10 + 5 = " + resultado1;
show "20 ÷ 4 = " + resultado2;
show "7 × 8 = " + resultado3;
```
#### Exercício 3.2: Sistema de Avaliação
```javascript
// Sistema para avaliar performance de funcionários
build calcularBonus(salario, performance) {
check (performance >= 90) {
give salario * 0.15; // 15% de bônus
} otherwise check (performance >= 80) {
give salario * 0.10; // 10% de bônus
} otherwise check (performance >= 70) {
give salario * 0.05; // 5% de bônus
} otherwise {
give 0; // Sem bônus
}
}
build avaliarFuncionario(nome, salario, performance) {
store bonus = calcularBonus(salario, performance);
store salario_total = salario + bonus;
show "=== AVALIAÇÃO DE PERFORMANCE ===";
show "Funcionário: " + nome;
show "Salário Base: R$ " + salario;
show "Performance: " + performance + "%";
show "Bônus: R$ " + bonus;
show "Salário Total: R$ " + salario_total;
check (performance >= 80) {
show "Status: EXCELENTE PERFORMANCE! 🌟";
} otherwise check (performance >= 70) {
show "Status: BOA PERFORMANCE 👍";
} otherwise {
show "Status: PRECISA MELHORAR 📈";
}
}
// Teste o sistema
avaliarFuncionario("Maria Santos", 4000, 92);
avaliarFuncionario("João Silva", 3500, 78);
avaliarFuncionario("Ana Costa", 4500, 65);
```
#### Exercício 3.3: Conversor de Unidades
```javascript
// Sistema de conversão de unidades
build metrosParaKilometros(metros) {
give metros / 1000;
}
build kilometrosParaMetros(km) {
give km * 1000;
}
build quilosParaGramas(quilos) {
give quilos * 1000;
}
build gramasParaQuilos(gramas) {
give gramas / 1000;
}
build segundosParaMinutos(segundos) {
give segundos / 60;
}
build minutosParaSegundos(minutos) {
give minutos * 60;
}
// Função universal de conversão
build converter(valor, tipo_conversao) {
check (tipo_conversao == "m_para_km") {
give metrosParaKilometros(valor);
} otherwise check (tipo_conversao == "km_para_m") {
give kilometrosParaMetros(valor);
} otherwise check (tipo_conversao == "kg_para_g") {
give quilosParaGramas(valor);
} otherwise check (tipo_conversao == "g_para_kg") {
give gramasParaQuilos(valor);
} otherwise check (tipo_conversao == "s_para_min") {
give segundosParaMinutos(valor);
} otherwise check (tipo_conversao == "min_para_s") {
give minutosParaSegundos(valor);
} otherwise {
show "Conversão não suportada!";
give 0;
}
}
// Teste o conversor
show "=== CONVERSOR DE UNIDADES ===";
show "5000 metros = " + converter(5000, "m_para_km") + " km";
show "2.5 kg = " + converter(2.5, "kg_para_g") + " gramas";
show "300 segundos = " + converter(300, "s_para_min") + " minutos";
```
---
## 📍 Módulo 4: Estruturas de Controle
### 🎯 Objetivos do Módulo
- Dominar condicionais (if/else)
- Trabalhar com loops (while/for)
- Entender controle de fluxo
- Aplicar em problemas reais
### 4.1 Condicionais (If/Else)
#### Estrutura Básica
```javascript
// Condicional simples
store idade = 20;
check (idade >= 18) {
show "Você é maior de idade";
}
// If-else
store nota = 7.5;
check (nota >= 7.0) {
show "Aprovado!";
} otherwise {
show "Reprovado!";
}
```
#### Múltiplas Condições
```javascript
store pontuacao = 85;
check (pontuacao >= 90) {
show "Classificação: A - Excelente!";
} otherwise check (pontuacao >= 80) {
show "Classificação: B - Muito Bom!";
} otherwise check (pontuacao >= 70) {
show "Classificação: C - Bom";
} otherwise check (pontuacao >= 60) {
show "Classificação: D - Regular";
} otherwise {
show "Classificação: F - Insuficiente";
}
```
#### Operadores Lógicos
```javascript
store idade = 25;
store tem_carteira = yes;
store tem_carro = no;
// Operador AND (also)
check (idade >= 18 also tem_carteira == yes) {
show "Pode dirigir!";
} otherwise {
show "Não pode dirigir";
}
// Operador OR (either)
check (tem_carro == yes either tem_carteira == yes) {
show "Tem algum meio de transporte";
} otherwise {
show "Precisa de transporte público";
}
// Operador NOT (!)
check (!tem_carro) {
show "Não tem carro";
}
// Combinações complexas
store salario = 5000;
store idade_funcionario = 30;
store tem_experiencia = yes;
check ((salario > 4000 also idade_funcionario > 25) either tem_experiencia == yes) {
show "Candidato qualificado para promoção";
} otherwise {
show "Candidato precisa se qualificar mais";
}
```
### 4.2 Loops (Repetições)
#### Loop While (repeat)
```javascript
// Contador simples
store contador = 1;
repeat (contador <= 5) {
show "Contagem: " + contador;
contador = contador + 1;
}
// Acumulador
store numero = 1;
store soma = 0;
repeat (numero <= 10) {
soma = soma + numero;
numero = numero + 1;
}
show "Soma de 1 até 10: " + soma; // 55
```
#### Loop For (again)
```javascript
// Loop for básico
again (store i = 0; i < 5; i = i + 1) {
show "Iteração: " + i;
}
// Trabalhando com arrays
store frutas = ["maçã", "banana", "laranja", "uva"];
again (store i = 0; i < length(frutas); i = i + 1) {
show "Fruta " + (i + 1) + ": " + frutas[i];
}
// Tabuada
store numero_tabuada = 7;
show "=== TABUADA DO " + numero_tabuada + " ===";
again (store i = 1; i <= 10; i = i + 1) {
store resultado = numero_tabuada * i;
show numero_tabuada + " x " + i + " = " + resultado;
}
```
#### Loops Aninhados
```javascript
// Matriz de números
show "=== TABELA DE MULTIPLICAÇÃO ===";
again (store i = 1; i <= 5; i = i + 1) {
store linha = "";
again (store j = 1; j <= 5; j = j + 1) {
store produto = i * j;
linha = linha + produto + "\t";
}
show linha;
}
// Padrão de estrelas
show "=== PADRÃO DE ESTRELAS ===";
again (store linha = 1; linha <= 5; linha = linha + 1) {
store estrelas = "";
again (store col = 1; col <= linha; col = col + 1) {
estrelas = estrelas + "*";
}
show estrelas;
}
```
### 4.3 Aplicações Práticas
#### Sistema de Menu
```javascript
build exibirMenu() {
show "=== MENU PRINCIPAL ===";
show "1. Cadastrar usuário";
show "2. Listar usuários";
show "3. Buscar usuário";
show "4. Remover usuário";
show "5. Sair";
}
build processarOpcao(opcao) {
check (opcao == 1) {
show "Função: Cadastrar usuário selecionada";
} otherwise check (opcao == 2) {
show "Função: Listar usuários selecionada";
} otherwise check (opcao == 3) {
show "Função: Buscar usuário selecionada";
} otherwise check (opcao == 4) {
show "Função: Remover usuário selecionada";
} otherwise check (opcao == 5) {
show "Saindo do sistema...";
} otherwise {
show "Opção inválida! Tente novamente.";
}
}
// Simulando sistema de menu
store opcao_usuario = 1;
store continuar = yes;
repeat (continuar == yes) {
exibirMenu();
processarOpcao(opcao_usuario);
// Em um sistema real, você pediria nova entrada do usuário
opcao_usuario = opcao_usuario + 1;
check (opcao_usuario > 5) {
continuar = no;
}
}
```
#### Validação de Dados
```javascript
build validarIdade(idade) {
check (idade < 0 either idade > 120) {
give no;
} otherwise {
give yes;
}
}
build validarEmail(email) {
// Validação simples: deve ter mais de 5 caracteres
// e conter @ (simulação)
check (length(email) < 5) {
give no;
} otherwise {
give yes;
}
}
build validarSenha(senha) {
// Senha deve ter pelo menos 6 caracteres
check (length(senha) < 6) {
give no;
} otherwise {
give yes;
}
}
build cadastrarUsuario(nome, idade, email, senha) {
store erros = [];
store erro_count = 0;
// Validar idade
check (!validarIdade(idade)) {
erros[erro_count] = "Idade inválida";
erro_count = erro_count + 1;
}
// Validar email
check (!validarEmail(email)) {
erros[erro_count] = "Email inválido";
erro_count = erro_count + 1;
}
// Validar senha
check (!validarSenha(senha)) {
erros[erro_count] = "Senha muito fraca";
erro_count = erro_count + 1;
}
check (erro_count == 0) {
show "✅ Usuário cadastrado com sucesso!";
show "Nome: " + nome;
show "Idade: " + idade;
show "Email: " + email;
} otherwise {
show "❌ Erros encontrados:";
again (store i = 0; i < erro_count; i = i + 1) {
show "- " + erros[i];
}
}
}
// Testando cadastros
cadastrarUsuario("João Silva", 25, "joao@email.com", "123456");
cadastrarUsuario("", -5, "email", "123");
```
#### Busca em Array
```javascript
build buscarProduto(produtos, nome_busca) {
store encontrado = no;
store indice_encontrado = -1;
again (store i = 0; i < length(produtos); i = i + 1) {
check (produtos[i].nome == nome_busca) {
encontrado = yes;
indice_encontrado = i;
// Em linguagens reais, usaríamos 'break' aqui
}
}
check (encontrado) {
store produto = produtos[indice_encontrado];
show "✅ Produto encontrado:";
show "Nome: " + produto.nome;
show "Preço: R$ " + produto.preco;
show "Categoria: " + produto.categoria;
} otherwise {
show "❌ Produto '" + nome_busca + "' não encontrado";
}
}
// Base de dados de produtos
store produtos = [
{ nome: "Notebook", preco: 2500, categoria: "Eletrônicos" },
{ nome: "Mouse", preco: 50, categoria: "Acessórios" },
{ nome: "Teclado", preco: 150, categoria: "Acessórios" },
{ nome: "Monitor", preco: 800, categoria: "Eletrônicos" }
];
// Testando busca
buscarProduto(produtos, "Mouse");
buscarProduto(produtos, "Webcam");
```
### 🏋️ Exercícios do Módulo 4
#### Exercício 4.1: Classificador de Idade
```javascript
// Crie um sistema que classifica pessoas por faixa etária
build classificarIdade(idade) {
check (idade < 0) {
give "Idade inválida";
} otherwise check (idade < 12) {
give "Criança";
} otherwise check (idade < 18) {
give "Adolescente";
} otherwise check (idade < 60) {
give "Adulto";
} otherwise {
give "Idoso";
}
}
// Teste com diferentes idades
store idades = [5, 15, 25, 45, 70];
again (store i = 0; i < length(idades); i = i + 1) {
store idade_atual = idades[i];
store classificacao = classificarIdade(idade_atual);
show idade_atual + " anos: " + classificacao;
}
```
#### Exercício 4.2: Contador de Números Pares e Ímpares
```javascript
// Sistema que conta números pares e ímpares em um intervalo
build contarParesImpares(inicio, fim) {
store pares = 0;
store impares = 0;
again (store numero = inicio; numero <= fim; numero = numero + 1) {
store resto = numero - ((numero / 2) * 2); // Simulação do módulo
check (resto == 0) {
pares = pares + 1;
} otherwise {
impares = impares + 1;
}
}
show "=== CONTAGEM DE " + inicio + " ATÉ " + fim + " ===";
show "Números pares: " + pares;
show "Números ímpares: " + impares;
show "Total: " + (pares + impares);
}
// Teste a função
contarParesImpares(1, 20);
contarParesImpares(10, 30);
```
#### Exercício 4.3: Sistema de Login
```javascript
// Sistema simples de autenticação
store usuarios_cadastrados = [
{ username: "admin", password: "admin123", tipo: "administrador" },
{ username: "user1", password: "senha123", tipo: "usuario" },
{ username: "manager", password: "manage456", tipo: "gerente" }
];
build autenticar(username, password) {
again (store i = 0; i < length(usuarios_cadastrados); i = i + 1) {
store usuario = usuarios_cadastrados[i];
check (usuario.username == username also usuario.password == password) {
show "✅ Login realizado com sucesso!";
show "Bem-vindo, " + username + "!";
show "Tipo de usuário: " + usuario.tipo;
give yes;
}
}
show "❌ Usuário ou senha incorretos!";
give no;
}
build sistemaLogin() {
store tentativas = 0;
store max_tentativas = 3;
store logado = no;
repeat (tentativas < max_tentativas also logado == no) {
show "=== SISTEMA DE LOGIN ===";
show "Tentativa " + (tentativas + 1) + " de " + max_tentativas;
// Simulando entrada do usuário
store test_users = ["admin", "user1", "hacker"];
store test_passes = ["admin123", "senha123", "123456"];
store username = test_users[tentativas];
store password = test_passes[tentativas];
show "Tentando login com: " + username + " / " + password;
logado = autenticar(username, password);
tentativas = tentativas + 1;
check (!logado also tentativas < max_tentativas) {
show "Tente novamente.\n";
}
}
check (!logado) {
show "🔒 Muitas tentativas falharam. Acesso bloqueado!";
}
}
// Execute o sistema
sistemaLogin();
```
---
## 📍 Módulo 5: Programação Orientada a Objetos
### 🎯 Objetivos do Módulo
- Entender conceitos de POO
- Criar blueprints (classes)
- Trabalhar com herança
- Aplicar encapsulamento
### 5.1 Conceitos Fundamentais
#### O que são Blueprints?
```javascript
// Blueprint é como um "molde" para criar objetos
blueprint Pessoa {
// Construtor - executado quando criamos uma nova pessoa
build init(nome, idade) {
self.nome = nome; // 'self' refere-se ao objeto atual
self.idade = idade;
self.energia = 100;
}
// Métodos - ações que a pessoa pode fazer
build falar() {
show self.nome + " está falando";
}
build andar() {
check (self.energia > 0) {
self.energia = self.energia - 10;
show self.nome + " está andando. Energia: " + self.energia;
} otherwise {
show self.nome + " está muito cansado para andar";
}
}
build descansar() {
self.energia = 100;
show self.nome + " descansou e recuperou a energia!";
}
build apresentar() {
show "Olá! Meu nome é " + self.nome + " e tenho " + self.idade + " anos";
}
}
// Criando objetos (instâncias) do blueprint
store pessoa1 = Pessoa("Maria", 25);
store pessoa2 = Pessoa("João", 30);
// Usando os métodos
pessoa1.apresentar(); // "Olá! Meu nome é Maria e tenho 25 anos"
pessoa2.falar(); // "João está falando"
pessoa1.andar(); // "Maria está andando. Energia: 90"
pessoa1.andar(); // "Maria está andando. Energia: 80"
pessoa1.descansar(); // "Maria descansou e recuperou a energia!"
```
### 5.2 Blueprints Complexos
#### Sistema de Conta Bancária
```javascript
blueprint ContaBancaria {
build init(numero_conta, titular, saldo_inicial) {
self.numero = numero_conta;
self.titular = titular;
self.saldo = saldo_inicial;
self.historico = [];
self.contador_transacoes = 0;
}
build depositar(valor) {
check (valor > 0) {
self.saldo = self.saldo + valor;
self.adicionarHistorico("Depósito", valor);
show "✅ Depósito realizado! Novo saldo: R$ " + self.saldo;
} otherwise {
show "❌ Valor inválido para depósito";
}
}
build sacar(valor) {
check (valor > 0 also valor <= self.saldo) {
self.saldo = self.saldo - valor;
self.adicionarHistorico("Saque", valor);
show "✅ Saque realizado! Novo saldo: R$ " + self.saldo;
} otherwise check (valor > self.saldo) {
show "❌ Saldo insuficiente. Saldo atual: R$ " + self.saldo;
} otherwise {
show "❌ Valor inválido para saque";
}
}
build transferir(valor, conta_destino) {
check (valor > 0 also valor <= self.saldo) {
self.saldo = self.saldo - valor;
conta_destino.saldo = conta_destino.saldo + valor;
self.adicionarHistorico("Transferência enviada", valor);
conta_destino.adicionarHistorico("Transferência recebida", valor);
show "✅ Transferência realizada!";
show "Seu novo saldo: R$ " + self.saldo;
} otherwise {
show "❌ Transferência não autorizada";
}
}
build consultarSaldo() {
show "💰 Saldo atual de " + self.titular + ": R$ " + self.saldo;
}
build adicionarHistorico(tipo, valor) {
store transacao = {
tipo: tipo,
valor: valor,
saldo_apos: self.saldo
};
self.historico[self.contador_transacoes] = transacao;
self.contador_transacoes = self.contador_transacoes + 1;
}
build extrato() {
show "=== EXTRATO BANCÁRIO ===";
show "Conta: " + self.numero + " - " + self.titular;
again (store i = 0; i < self.contador_transacoes; i = i + 1) {
store trans = self.historico[i];
show (i + 1) + ". " + trans.tipo + ": R$ " + trans.valor;
}
show "Saldo atual: R$ " + self.saldo;
}
}
// Testando o sistema bancário
store conta_maria = ContaBancaria("12345", "Maria Silva", 1000);
store conta_joao = ContaBancaria("67890", "João Santos", 500);
conta_maria.consultarSaldo();
conta_maria.depositar(200);
conta_maria.sacar(150);
conta_maria.transferir(100, conta_joao);
conta_joao.consultarSaldo();
conta_maria.extrato();
```
### 5.3 Herança
#### Blueprint Base e Especialização
```javascript
// Blueprint base para todos os animais
blueprint Animal {
build init(nome, especie) {
self.nome = nome;
self.especie = especie;
self.energia = 100;
self.felicidade = 50;
}
build comer() {
self.energia = self.energia + 20;
self.felicidade = self.felicidade + 10;
show self.nome + " está comendo. Energia: " + self.energia;
}
build dormir() {
self.energia = 100;
show self.nome + " dormiu e restaurou a energia!";
}
build brincar() {
check (self.energia >= 20) {
self.energia = self.energia - 20;
self.felicidade = self.felicidade + 30;
show self.nome + " está brincando! Felicidade: " + self.felicidade;
} otherwise {
show self.nome + " está muito cansado para brincar";
}
}
build status() {
show "=== STATUS DE " + self.nome + " ===";
show "Espécie: " + self.especie;
show "Energia: " + self.energia;
show "Felicidade: " + self.felicidade;
}
}
// Especialização para cães
blueprint Cachorro from Animal {
build init(nome, raca) {
parent.init(nome, "Cachorro"); // Chama o construtor do Animal
self.raca = raca;
self.latidos = 0;
}
build latir() {
self.latidos = self.latidos + 1;
self.energia = self.energia - 5;
show self.nome + " faz: Au au! (" + self.latidos + "º latido)";
}
build buscarBola() {
check (self.energia >= 30) {
self.energia = self.energia - 30;
self.felicidade = self.felicidade + 25;
show self.nome + " correu atrás da bola! 🎾";
} otherwise {
show self.nome + " está muito cansado para buscar a bola";
}
}
build status() {
parent.status(); // Chama o método status do Animal
show "Raça: " + self.raca;
show "Latidos hoje: " + self.latidos;
}
}
// Especialização para gatos
blueprint Gato from Animal {
build init(nome, cor) {
parent.init(nome, "Gato");
self.cor = cor;
self.ronronos = 0;
}
build miar() {
show self.nome + " faz: Miau!";
}
build ronronar() {
self.ronronos = self.ronronos + 1;
self.felicidade = self.felicidade + 15;
show self.nome + " está ronronando... ♪ (" + self.ronronos + "º ronrono)";
}
build escalarArvore() {
check (self.energia >= 25) {
self.energia = self.energia - 25;
self.felicidade = self.felicidade + 20;
show self.nome + " subiu na árvore! 🌳";
} otherwise {
show self.nome + " está muito cansado para escalar";
}
}
build status() {
parent.status();
show "Cor: " + self.cor;
show "Ronronos hoje: " + self.ronronos;
}
}
// Testando herança
store rex = Cachorro("Rex", "Golden Retriever");
store mimi = Gato("Mimi", "Branco");
rex.latir();
rex.buscarBola();
rex.comer();
rex.status();
show "";
mimi.miar();
mimi.ronronar();
mimi.escalarArvore();
mimi.status();
```
### 5.4 Sistema Complexo com POO
#### Sistema de Gerenciamento de Escola
```javascript
// Blueprint base para pessoas na escola
blueprint Pessoa {
build init(nome, idade, cpf) {
self.nome = nome;
self.idade = idade;
self.cpf = cpf;
self.ativo = yes;
}
build apresentar() {
show "Nome: " + self.nome + ", Idade: " + self.idade;
}
}
// Aluno herda de Pessoa
blueprint Aluno from Pessoa {
build init(nome, idade, cpf, matricula) {
parent.init(nome, idade, cpf);
self.matricula = matricula;
self.notas = [];
self.faltas = 0;
self.total_notas = 0;
}
build adicionarNota(nota) {
check (nota >= 0 also nota <= 10) {
self.notas[self.total_notas] = nota;
self.total_notas = self.total_notas + 1;
show "Nota " + nota + " adicionada para " + self.nome;
} otherwise {
show "Nota inválida! Deve estar entre 0 e 10";
}
}
build adicionarFalta() {
self.faltas = self.faltas + 1;
show self.nome + " faltou. Total de faltas: " + self.faltas;
}
build calcularMedia() {
check (self.total_notas == 0) {
give 0;
} otherwise {
store soma = 0;
again (store i = 0; i < self.total_notas; i = i + 1) {
soma = soma + self.notas[i];
}
give soma / self.total_notas;
}
}
build situacao() {
store media = self.calcularMedia();
check (media >= 7.0 also self.faltas <= 5) {
give "APROVADO";
} otherwise check (media >= 5.0 also self.faltas <= 10) {
give "RECUPERAÇÃO";
} otherwise {
give "REPROVADO";
}
}
build boletim() {
show "=== BOLETIM DE " + self.nome + " ===";
show "Matrícula: " + self.matricula;
show "Notas: ";
again (store i = 0; i < self.total_notas; i = i + 1) {
show " " + (i + 1) + "ª nota: " + self.notas[i];
}
show "Média: " + self.calcularMedia();
show "Faltas: " + self.faltas;
show "Situação: " + self.situacao();
}
}
// Professor herda de Pessoa
blueprint Professor from Pessoa {
build init(nome, idade, cpf, disciplina, salario) {
parent.init(nome, idade, cpf);
self.disciplina = disciplina;
self.salario = salario;
self.turmas = [];
self.total_turmas = 0;
}
build adicionarTurma(turma) {
self.turmas[self.total_turmas] = turma;
self.total_turmas = self.total_turmas + 1;
show "Professor " + self.nome + " adicionado à turma " + turma;
}
build darNota(aluno, nota) {
aluno.adicionarNota(nota);
show "Professor " + self.nome + " deu nota " + nota + " para " + aluno.nome;
}
build relatorio() {
show "=== RELATÓRIO DO PROFESSOR ===";
show "Nome: " + self.nome;
show "Disciplina: " + self.disciplina;
show "Salário: R$ " + self.salario;
show "Turmas: " + self.total_turmas;
}
}
// Escola - sistema principal
blueprint Escola {
build init(nome) {
self.nome = nome;
self.alunos = [];
self.professores = [];
self.total_alunos = 0;
self.total_professores = 0;
}
build matricularAluno(aluno) {
self.alunos[self.total_alunos] = aluno;
self.total_alunos = self.total_alunos + 1;
show "✅ Aluno " + aluno.nome + " matriculado na " + self.nome;
}
build contratarProfessor(professor) {
self.professores[self.total_professores] = professor;
self.total_professores = self.total_professores + 1;
show "✅ Professor " + professor.nome + " contratado pela " + self.nome;
}
build relatorioEscola() {
show "=== RELATÓRIO DA " + self.nome + " ===";
show "Total de alunos: " + self.total_alunos;
show "Total de professores: " + self.total_professores;
show "\n--- ALUNOS ---";
again (store i = 0; i < self.total_alunos; i = i + 1) {
store aluno = self.alunos[i];
show (i + 1) + ". " + aluno.nome + " - " + aluno.situacao();
}
show "\n--- PROFESSORES ---";
again (store i = 0; i < self.total_professores; i = i + 1) {
store prof = self.professores[i];
show (i + 1) + ". " + prof.nome + " - " + prof.disciplina;
}
}
}
// Testando o sistema escolar
store escola = Escola("Colégio PetCareScript");
// Criando alunos
store aluno1 = Aluno("Ana Silva", 16, "123.456.789-01", "2024001");
store aluno2 = Aluno("Bruno Santos", 17, "987.654.321-02", "2024002");
// Criando professores
store prof_mat = Professor("Carlos Oliveira", 35, "111.222.333-44", "Matemática", 4500);
store prof_port = Professor("Diana Costa", 28, "555.666.777-88", "Português", 4200);
// Matriculando e contratando
escola.matricularAluno(aluno1);
escola.matricularAluno(aluno2);
escola.contratarProfessor(prof_mat);
escola.contratarProfessor(prof_port);
// Professores dando notas
prof_mat.darNota(aluno1, 8.5);
prof_mat.darNota(aluno1, 7.2);
prof_mat.darNota(aluno1, 9.1);
prof_port.darNota(aluno2, 6.8);
prof_port.darNota(aluno2, 7.5);
// Adicionando faltas
aluno2.adicionarFalta();
aluno2.adicionarFalta();
// Relatórios
aluno1.boletim();
show "";
aluno2.boletim();
show "";
escola.relatorioEscola();
```
### 🏋️ Exercícios do Módulo 5
#### Exercício 5.1: Sistema de Veículos
```javascript
// Crie um sistema de veículos com herança
blueprint Veiculo {
build init(marca, modelo, ano, preco) {
self.marca = marca;
self.modelo = modelo;
self.ano = ano;
self.preco = preco;
self.ligado = no;
self.velocidade = 0;
}
build ligar() {
check (!self.ligado) {
self.ligado = yes;
show self.marca + " " + self.modelo + " foi ligado";
} otherwise {
show "Veículo já está ligado";
}
}
build acelerar(incremento) {
check (self.ligado) {
self.velocidade = self.velocidade + incremento;
show "Acelerando... Velocidade atual: " + self.velocidade + " km/h";
} otherwise {
show "Ligue o veículo primeiro!";
}
}
build frear() {
check (self.velocidade > 0) {
self.velocidade = 0;
show "Veículo parou";
} otherwise {
show "Veículo já está parado";
}
}
build info() {
show "=== INFORMAÇÕES DO VEÍCULO ===";
show "Marca: " + self.marca;
show "Modelo: " + self.modelo;
show "Ano: " + self.ano;
show "Preço: R$ " + self.preco;
show "Status: " + (self.ligado ? "Ligado" : "Desligado");
show "Velocidade: " + self.velocidade + " km/h";
}
}
blueprint Carro from Veiculo {
build init(marca, modelo, ano, preco, portas) {
parent.init(marca, modelo, ano, preco);
self.portas = portas;
self.tanque = 50; // litros
}
build abrirPorta() {
show "Porta do " + self.modelo + " aberta";
}
build abastecer(litros) {
self.tanque = self.tanque + litros;
show "Abastecido com " + litros + "L. Tanque: " + self.tanque + "L";
}
build info() {
parent.info();
show "Portas: " + self.portas;
show "Combustível: " + self.tanque + "L";
}
}
blueprint Moto from Veiculo {
build init(marca, modelo, ano, preco, cilindradas) {
parent.init(marca, modelo, ano, preco);
self.cilindradas = cilindradas;
}
build empinar() {
check (self.ligado also self.velocidade > 20) {
show self.modelo + " empinando! 🏍️";
} otherwise {
show "Precisa estar ligado e em movimento para empinar";
}
}
build info() {
parent.info();
show "Cilindradas: " + self.cilindradas + "cc";
}
}
// Teste seu sistema
store carro = Carro("Toyota", "Corolla", 2023, 85000, 4);
store moto = Moto("Honda", "CB600", 2022, 35000, 600);
carro.ligar();
carro.acelerar(50);
carro.abrirPorta();
carro.abastecer(30);
carro.info();
show "";
moto.ligar();
moto.acelerar(40);
moto.empinar();
moto.info();
```
#### Exercício 5.2: Sistema de E-commerce
```javascript
// Sistema de loja online com produtos e carrinho
blueprint Produto {
build init(id, nome, preco, categoria, estoque) {
self.id = id;
self.nome = nome;
self.preco = preco;
self.categoria = categoria;
self.estoque = estoque;
}
build reduzirEstoque(quantidade) {
check (self.estoque >= quantidade) {
self.estoque = self.estoque - quantidade;
give yes;
} otherwise {
give no;
}
}
build info() {
show "ID: " + self.id + " | " + self.nome;
show "Preço: R$ " + self.preco;
show "Categoria: " + self.categoria;
show "Estoque: " + self.estoque + " unidades";
}
}
blueprint CarrinhoCompras {
build init() {
self.itens = [];
self.total_itens = 0;
}
build adicionarItem(produto, quantidade) {
check (produto.reduzirEstoque(quantidade)) {
store item = {
produto: produto,
quantidade: quantidade,
subtotal: produto.preco * quantidade
};
self.itens[self.total_itens] = item;
self.total_itens = self.total_itens + 1;
show "✅ " + quantidade + "x " + produto.nome + " adicionado ao carrinho";
} otherwise {
show "❌ Estoque insuficiente para " + produto.nome;
}
}
build calcularTotal() {
store total = 0;
again (store i = 0; i < self.total_itens; i = i + 1) {
total = total + self.itens[i].subtotal;
}
give total;
}
build exibirCarrinho() {
show "=== CARRINHO DE COMPRAS ===";
check (self.total_itens == 0) {
show "Carrinho vazio";
give;
}
again (store i = 0; i < self.total_itens; i = i + 1) {
store item = self.itens[i];
show (i + 1) + ". " + item.produto.nome;