Partilhar: WhatsApp
aulify
UC UC00620 · T. Desenv. Software

Ficha 01 · C# fundamentos

Sintaxe, OOP, propriedades
Versão · Aluno
Tempo · 45 minutos
Aluno(a)
Turma
Data

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}");