Ficha 01 · C# fundamentos
Exercício 1 · Setup + Hello
Cria um projecto dotnet new console -n Pratica. Modifica Program.cs para pedir nome e idade, e responder com saudação formatada usando string interpolation.
Resposta:
dotnet new console -n Pratica
cd Pratica
Program.cs:
Console.Write("Nome: ");
string? nome = Console.ReadLine();
Console.Write("Idade: ");
int idade = int.Parse(Console.ReadLine() ?? "0");
Console.WriteLine($"Olá, {nome}! Daqui a 10 anos terás {idade + 10} anos.");
dotnet run
Exercício 2 · Conversor de temperaturas
Cria uma aplicação que pergunta um valor em Celsius e mostra-o convertido em Fahrenheit (F = C × 9/5 + 32) e Kelvin (K = C + 273.15).
Resposta:
Console.Write("Temperatura em Celsius: ");
double c = double.Parse(Console.ReadLine() ?? "0");
double f = c * 9.0 / 5 + 32;
double k = c + 273.15;
Console.WriteLine($"{c}°C = {f:F2}°F = {k:F2}K");
// :F2 = 2 casas decimais
Exercício 3 · Classe Livro
Cria classe Livro com propriedades auto Titulo, Autor, Ano, Preco. Construtor recebe os 4. Método Descrever() imprime tudo. No Main, cria 2 livros e descreve-os.
Resposta:
public class Livro
{
public string Titulo { get; set; }
public string Autor { get; set; }
public int Ano { get; set; }
public double Preco { get; set; }
public Livro(string titulo, string autor, int ano, double preco)
{
Titulo = titulo;
Autor = autor;
Ano = ano;
Preco = preco;
}
public void Descrever()
{
Console.WriteLine($"{Titulo} ({Ano}) — {Autor} — {Preco:F2}€");
}
}
// Main
var l1 = new Livro("Os Maias", "Eça de Queirós", 1888, 19.90);
var l2 = new Livro("Memorial do Convento", "Saramago", 1982, 24.50);
l1.Descrever();
l2.Descrever();
Exercício 4 · Propriedade com validação
Cria classe ContaBancaria com Titular (string) e Saldo (double). Saldo deve ser propriedade com setter que valide ≥ 0 (lança ArgumentException se negativo). Construtor recebe titular e saldo inicial. Métodos Depositar(double) e Levantar(double).
Resposta:
public class ContaBancaria
{
private double _saldo;
public string Titular { get; set; }
public double Saldo
{
get => _saldo;
private set
{
if (value < 0)
throw new ArgumentException("Saldo não pode ser negativo");
_saldo = value;
}
}
public ContaBancaria(string titular, double saldoInicial)
{
Titular = titular;
Saldo = saldoInicial;
}
public void Depositar(double valor)
{
if (valor <= 0)
throw new ArgumentException("Valor inválido");
Saldo += valor;
}
public void Levantar(double valor)
{
if (valor <= 0)
throw new ArgumentException("Valor inválido");
if (valor > Saldo)
throw new InvalidOperationException($"Saldo insuficiente: {Saldo}€");
Saldo -= valor;
}
}
// Uso
var c = new ContaBancaria("Ana", 100);
c.Depositar(50);
c.Levantar(30);
Console.WriteLine(c.Saldo); // 120
Exercício 5 · Herança e override
Cria classe abstracta Forma com método abstracto Area(). Cria Circulo (raio) e Quadrado (lado) que herdam de Forma. No Main, cria um List<Forma> com 3 formas e imprime a área de cada uma.
Resposta:
public abstract class Forma
{
public abstract double Area();
public void Descrever()
{
Console.WriteLine($"{GetType().Name}: área = {Area():F2}");
}
}
public class Circulo : Forma
{
public double Raio { get; set; }
public Circulo(double raio) => Raio = raio;
public override double Area() => Math.PI * Raio * Raio;
}
public class Quadrado : Forma
{
public double Lado { get; set; }
public Quadrado(double lado) => Lado = lado;
public override double Area() => Lado * Lado;
}
// Main
var formas = new List<Forma>
{
new Circulo(5),
new Quadrado(4),
new Circulo(2)
};
foreach (var f in formas)
{
f.Descrever();
}
double total = formas.Sum(f => f.Area());
Console.WriteLine($"Total: {total:F2}");
Exercício 6 · Interface e polimorfismo
Cria interface IPagamento com método Processar(double valor). Implementa-a em CartaoCredito, Mbway, Multibanco. Cada um imprime mensagem diferente. No Main, processa o mesmo valor em 3 métodos diferentes.
Resposta:
public interface IPagamento
{
void Processar(double valor);
}
public class CartaoCredito : IPagamento
{
public string Numero { get; set; }
public CartaoCredito(string num) => Numero = num;
public void Processar(double valor)
{
Console.WriteLine($"💳 Cartão {Numero[^4..]}: {valor:F2}€");
}
}
public class Mbway : IPagamento
{
public string Telemovel { get; set; }
public Mbway(string tel) => Telemovel = tel;
public void Processar(double valor)
{
Console.WriteLine($"📱 MB WAY {Telemovel}: {valor:F2}€");
}
}
public class Multibanco : IPagamento
{
public void Processar(double valor)
{
var entidade = Random.Shared.Next(10000, 99999);
var referencia = Random.Shared.Next(100000000, 999999999);
Console.WriteLine($"🏧 MB: Ent {entidade}, Ref {referencia}: {valor:F2}€");
}
}
// Main
var pagamentos = new List<IPagamento>
{
new CartaoCredito("1234567890123456"),
new Mbway("912345678"),
new Multibanco()
};
foreach (var p in pagamentos)
{
p.Processar(99.99);
}
Note Numero[^4..] — index from end (C# 8+).
Exercício 7 · Record
Cria um record Produto(string Nome, double Preco). No Main, cria 2 produtos iguais e verifica que == retorna true. Cria também uma cópia modificada usando with.
Resposta:
public record Produto(string Nome, double Preco);
// Main
var p1 = new Produto("Caneta", 1.50);
var p2 = new Produto("Caneta", 1.50);
Console.WriteLine(p1 == p2); // True — value equality
Console.WriteLine(p1); // Produto { Nome = Caneta, Preco = 1.5 }
// Cópia modificada
var p3 = p1 with { Preco = 2.00 };
Console.WriteLine(p3); // Produto { Nome = Caneta, Preco = 2 }
// Deconstrução
var (nome, preco) = p1;
Console.WriteLine($"{nome}: {preco}");
Exercício 8 · Lista + busca
Cria uma classe Aluno(string Nome, double Nota). No Main, cria uma List<Aluno> com 5 alunos. Pede ao user uma nota mínima e imprime os alunos com nota ≥ esse valor, ordenados decrescente.
Resposta:
public record Aluno(string Nome, double Nota);
// Main
var alunos = new List<Aluno>
{
new("Ana", 17.5),
new("Bruno", 12.3),
new("Carla", 19.0),
new("Diana", 8.5),
new("Eduardo", 14.2)
};
Console.Write("Nota mínima: ");
double min = double.Parse(Console.ReadLine() ?? "0");
var aprovados = alunos
.Where(a => a.Nota >= min)
.OrderByDescending(a => a.Nota)
.ToList();
Console.WriteLine($"\nAlunos com nota >= {min}:");
foreach (var a in aprovados)
{
Console.WriteLine($" {a.Nome}: {a.Nota}");
}
double media = alunos.Average(a => a.Nota);
Console.WriteLine($"\nMédia da turma: {media:F2}");