Mobile App Development · Dart/Flutter

18 · Exercícios Avulsos

Um conjunto de programas de prática independentes, não amarrados a uma única lição — cada um explora classes, listas de objetos, funções e leitura de entrada de um jeito diferente.

Exercício

cadastro_fornecedores.dart

Cadastra fornecedores em uma List<Fornecedor> tipada, usando uma classe com construtor nomeado (required), e percorre a lista com um laço for indexado para montar um relatório numerado no console.

// Exercício: cadastrar fornecedores em uma lista de objetos e exibir o relatório.
// Demonstra classe com construtor nomeado, List<T> tipada e laço 'for' com índice.
class Fornecedor {
  final String nome;
  final String cnpj;
  final String telefone;
  final String email;

  Fornecedor({
    required this.nome,
    required this.cnpj,
    required this.telefone,
    required this.email,
  });
}

void main() {
  final fornecedores = <Fornecedor>[
    Fornecedor(
      nome: 'Mercado Central',
      cnpj: '12.345.678/0001-99',
      telefone: '(11) 99999-1111',
      email: 'contato@mercadocentral.com',
    ),
    Fornecedor(
      nome: 'Distribuidora Sul',
      cnpj: '98.765.432/0001-10',
      telefone: '(11) 98888-2222',
      email: 'vendas@distribuidorasul.com',
    ),
  ];

  print('=== Cadastro de Fornecedores ===');
  for (var i = 0; i < fornecedores.length; i++) {
    final f = fornecedores[i];
    print('Fornecedor ${i + 1}');
    print('Nome: ${f.nome}');
    print('CNPJ: ${f.cnpj}');
    print('Telefone: ${f.telefone}');
    print('Email: ${f.email}');
    print('----------------------------');
  }
}

Saída esperada

=== Cadastro de Fornecedores ===
Fornecedor 1
Nome: Mercado Central
CNPJ: 12.345.678/0001-99
Telefone: (11) 99999-1111
Email: contato@mercadocentral.com
----------------------------
Fornecedor 2
Nome: Distribuidora Sul
CNPJ: 98.765.432/0001-10
Telefone: (11) 98888-2222
Email: vendas@distribuidorasul.com
----------------------------

Como executar

dart run 18-Exercicios/codigo_fonte/cadastro_fornecedores.dart

Exercício

contatos.dart

Gerencia uma lista de contatos usando uma classe Contato com construtor nomeado, onde cada contato é um objeto com três atributos final — imutáveis após a criação. Segue o mesmo padrão de relatório numerado do exercício de fornecedores.

// Exercício: gerenciar uma lista de contatos usando classe com construtor nomeado.
// Cada contato é um objeto com três atributos 'final' — imutáveis após a criação.
class Contato {
  final String nome;
  final String telefone;
  final String email;

  Contato({required this.nome, required this.telefone, required this.email});
}

void main() {
  final contatos = <Contato>[
    Contato(
      nome: 'Ana Souza',
      telefone: '(11) 97777-1000',
      email: 'ana@email.com',
    ),
    Contato(
      nome: 'Carlos Lima',
      telefone: '(11) 96666-2000',
      email: 'carlos@email.com',
    ),
  ];

  print('=== Lista de Contatos ===');
  for (var i = 0; i < contatos.length; i++) {
    final c = contatos[i];
    print('Contato ${i + 1}');
    print('Nome: ${c.nome}');
    print('Telefone: ${c.telefone}');
    print('Email: ${c.email}');
    print('----------------------');
  }
}

Saída esperada

=== Lista de Contatos ===
Contato 1
Nome: Ana Souza
Telefone: (11) 97777-1000
Email: ana@email.com
----------------------
Contato 2
Nome: Carlos Lima
Telefone: (11) 96666-2000
Email: carlos@email.com
----------------------

Como executar

dart run 18-Exercicios/codigo_fonte/contatos.dart

Exercício

cotacao.dart

Calcula o valor final de uma cotação com desconto percentual, encapsulando a fórmula em uma função calcularCotacao separada para reutilização e clareza. Usa toStringAsFixed para formatar preços e percentuais na exibição.

// Exercício: calcular o valor final de uma cotação com desconto percentual.
// Encapsula a fórmula em uma função separada para reutilização e clareza.
double calcularCotacao(
  double precoUnitario,
  int quantidade,
  double descontoPct,
) {
  // Subtotal = preço unitário × quantidade (sem desconto).
  final double subtotal = precoUnitario * quantidade;
  // Desconto = subtotal × (percentual / 100).
  final double desconto = subtotal * (descontoPct / 100);
  return subtotal - desconto;
}

void main() {
  final produto = 'Notebook';
  final precoUnitario = 4200.00;
  final quantidade = 2;
  final descontoPct = 7.5;

  final total = calcularCotacao(precoUnitario, quantidade, descontoPct);

  print('=== Cotacao de Produto ===');
  print('Produto: $produto');
  print('Preco unitario: R\$ ${precoUnitario.toStringAsFixed(2)}');
  print('Quantidade: $quantidade');
  print('Desconto: ${descontoPct.toStringAsFixed(1)}%');
  print('Valor final: R\$ ${total.toStringAsFixed(2)}');
}

Saída esperada

=== Cotacao de Produto ===
Produto: Notebook
Preco unitario: R$ 4200.00
Quantidade: 2
Desconto: 7.5%
Valor final: R$ 7770.00

Como executar

dart run 18-Exercicios/codigo_fonte/cotacao.dart

Exercício

lista_fornecedores_prompt.dart

Cadastro interativo de fornecedores via stdin: pede nome, CNPJ, telefone e email um a um, valida que nenhum campo fique vazio (repetindo a pergunta se faltar algo) e, ao final de cada fornecedor, pergunta se o usuário quer cadastrar outro. Ao encerrar o laço, exibe a lista completa de fornecedores cadastrados na sessão — ou uma mensagem avisando que nenhum foi cadastrado.

// Exercício: cadastro interativo de fornecedores via stdin com validação e listagem final.
// Combina classe com construtor nomeado, laço 'while' e leitura de stdin em loop.
import 'dart:io';

class Fornecedor {
  final String nome;
  final String cnpj;
  final String telefone;
  final String email;

  Fornecedor({
    required this.nome,
    required this.cnpj,
    required this.telefone,
    required this.email,
  });
}

String lerTexto(String mensagem) {
  stdout.write(mensagem);
  return stdin.readLineSync()?.trim() ?? '';
}

void main() {
  final lista = <Fornecedor>[];

  print('=== Cadastro Interativo de Fornecedores ===');

  while (true) {
    final nome = lerTexto('Nome do fornecedor: ');
    final cnpj = lerTexto('CNPJ: ');
    final telefone = lerTexto('Telefone: ');
    final email = lerTexto('Email: ');

    if (nome.isEmpty || cnpj.isEmpty || telefone.isEmpty || email.isEmpty) {
      print('Todos os campos sao obrigatorios. Tente novamente.');
    } else {
      lista.add(
        Fornecedor(nome: nome, cnpj: cnpj, telefone: telefone, email: email),
      );
      print('Fornecedor cadastrado com sucesso.');
    }

    final continuar = lerTexto('Deseja cadastrar outro? (s/n): ').toLowerCase();
    if (continuar != 's') break;
    print('');
  }

  print('\n=== Fornecedores Cadastrados ===');
  if (lista.isEmpty) {
    print('Nenhum fornecedor cadastrado.');
    return;
  }

  for (var i = 0; i < lista.length; i++) {
    final f = lista[i];
    print('Fornecedor ${i + 1}');
    print('Nome: ${f.nome}');
    print('CNPJ: ${f.cnpj}');
    print('Telefone: ${f.telefone}');
    print('Email: ${f.email}');
    print('----------------------------');
  }
}

Saída esperada

Este programa lê do stdin, então a saída depende do que o usuário digitar em cada execução — não há uma saída fixa. Ele imprime prompts pedindo nome, CNPJ, telefone e email; repete a pergunta se algum campo ficar vazio; pergunta "Deseja cadastrar outro? (s/n): " após cada fornecedor; e, ao final, lista todos os fornecedores cadastrados na sessão (ou avisa que a lista está vazia, caso o usuário nunca confirme um cadastro válido).

Como executar

dart run 18-Exercicios/codigo_fonte/lista_fornecedores_prompt.dart