C#: Exercício: Matrizes e métodos combinados

1. Classificação por bolhas

Objetivo: Implementar o algoritmo de classificação por bolhas para classificar uma matriz de inteiros em ordem crescente, exibindo os resultados antes e depois da classificação.

Requisitos:

▶ Exemplo

CSHARP
int[] numbers = { 64, 34, 25, 12, 22, 11, 90, 5 };

Console.WriteLine("Before sorting: " + string.Join(", ", numbers));

int swapCount = 0;

for (int i = 0; i < numbers.Length - 1; i++)
{
    bool swapped = false;
    for (int j = 0; j < numbers.Length - 1 - i; j++)
    {
        if (numbers[j] > numbers[j + 1])
        {
            (numbers[j], numbers[j + 1]) = (numbers[j + 1], numbers[j]);
            swapped = true;
            swapCount++;
        }
    }
    if (!swapped) break;
}

Console.WriteLine("After sorting: " + string.Join(", ", numbers));
Console.WriteLine($"Swap count: {swapCount}");
▶ Experimente
TEXT 📖 Somente leitura
Before sorting: 64, 34, 25, 12, 22, 11, 90, 5
After sorting: 5, 11, 12, 22, 25, 34, 64, 90
Swap count: 20

2. Estatísticas de notas dos alunos

Objetivo: Usar um array para armazenar as notas dos alunos e calcular a média, a nota mais alta, a nota mais baixa e o número de alunos acima da média por meio de métodos.

Requisitos:

▶ Exemplo

CSHARP
int[] scores = { 85, 92, 78, 60, 95, 88, 72, 66, 91, 83 };

double average = CalcAverage(scores);
int max = CalcMax(scores);
int min = CalcMin(scores);
int aboveAvg = CountAbove(scores, average);

Console.WriteLine($"Score list: {string.Join(", ", scores)}");
Console.WriteLine($"Average: {average:F1}");
Console.WriteLine($"Highest: {max}");
Console.WriteLine($"Lowest: {min}");
Console.WriteLine($"Above average count: {aboveAvg}");

double CalcAverage(int[] arr)
{
    double sum = 0;
    foreach (int s in arr) sum += s;
    return sum / arr.Length;
}

int CalcMax(int[] arr)
{
    int max = arr[0];
    foreach (int s in arr) if (s > max) max = s;
    return max;
}

int CalcMin(int[] arr)
{
    int min = arr[0];
    foreach (int s in arr) if (s < min) min = s;
    return min;
}

int CountAbove(int[] arr, double threshold)
{
    int count = 0;
    foreach (int s in arr) if (s > threshold) count++;
    return count;
}
▶ Experimente
TEXT 📖 Somente leitura
Score list: 85, 92, 78, 60, 95, 88, 72, 66, 91, 83
Average: 81.0
Highest: 95
Lowest: 60
Above average count: 5

3. Lista de tarefas

Objetivo: Implementar uma lista de tarefas simples usando uma matriz de strings, com suporte às operações de adicionar, remover e visualizar.

Requisitos:

▶ Exemplo

CSHARP 📖 Somente leitura
string[] todos = new string[10];
int count = 0;

AddItem("Learn C# arrays");
AddItem("Complete exercises");
AddItem("Review methods and parameters");
ListAll();
RemoveItem(1);
ListAll();

void AddItem(string item)
{
    if (count >= todos.Length)
    {
        Console.WriteLine("⚠️ To-do list is full, cannot add.");
        return;
    }
    todos[count] = item;
    count++;
    Console.WriteLine($"Added: {item}");
}

void RemoveItem(int index)
{
    if (index < 0 || index >= count)
    {
        Console.WriteLine("⚠️ Invalid index, removal failed.");
        return;
    }
    string removed = todos[index];
    for (int i = index; i < count - 1; i++)
    {
        todos[i] = todos[i + 1];
    }
    todos[count - 1] = null;
    count--;
    Console.WriteLine($"Removed: {removed}");
}

void ListAll()
{
    Console.WriteLine("--- To-Do List ---");
    if (count == 0)
    {
        Console.WriteLine("(empty)");
        return;
    }
    for (int i = 0; i < count; i++)
    {
        Console.WriteLine($"{i}. {todos[i]}");
    }
}
48 linhas de lógica (limite de 40, somente leitura)
TEXT 📖 Somente leitura
Added: Learn C# arrays
Added: Complete exercises
Added: Review methods and parameters
--- To-Do List ---
0. Learn C# arrays
1. Complete exercises
2. Review methods and parameters
Removed: Complete exercises
--- To-Do List ---
0. Learn C# arrays
1. Review methods and parameters

4. Analisador de Texto Simples

Objetivo: Realizar uma análise de frequência de palavras no texto de entrada, usar o StringBuilder para concatenar os resultados e encapsular as funções de análise em métodos.

Requisitos:

▶ Exemplo

CSHARP
string text = "CSharp is a powerful programming language and programming is fun";

int wordCount = CountWords(text);
int charCount = CountChars(text);
string longest = FindLongestWord(text);

var report = BuildReport(text, wordCount, charCount, longest);
Console.WriteLine(report);

int CountWords(string input)
{
    if (string.IsNullOrWhiteSpace(input)) return 0;
    string[] words = input.Split(' ', StringSplitOptions.RemoveEmptyEntries);
    return words.Length;
}

int CountChars(string input)
{
    return input.Length;
}

string FindLongestWord(string input)
{
    if (string.IsNullOrWhiteSpace(input)) return "";
    string[] words = input.Split(' ', StringSplitOptions.RemoveEmptyEntries);
    string longest = words[0];
    foreach (string w in words)
    {
        if (w.Length > longest.Length) longest = w;
    }
    return longest;
}

StringBuilder BuildReport(string input, int words, int chars, string longestWord)
{
    var sb = new StringBuilder();
    sb.AppendLine("===== Text Analysis Report =====");
    sb.AppendLine($"Original: {input}");
    sb.AppendLine($"Word count: {words}");
    sb.AppendLine($"Character count: {chars}");
    sb.AppendLine($"Longest word: {longestWord} ({longestWord.Length} chars)");
    sb.Append("===== Analysis Complete =====");
    return sb;
}
▶ Experimente
TEXT 📖 Somente leitura
===== Text Analysis Report =====
Original: CSharp is a powerful programming language and programming is fun
Word count: 10
Character count: 60
Longest word: programming (11 chars)
===== Analysis Complete =====

❓ Perguntas Frequentes

P: O que if (!swapped) break faz na ordenação por bolhas? R: Se não ocorrerem trocas em uma passagem, a matriz já está ordenada. Interromper a operação antecipadamente economiza tempo, evitando iterações desnecessárias.

P: Por que precisamos deslocar o array para a frente depois de remover um elemento da lista de tarefas? R: Os arrays são armazenados de forma contígua. Após remover um elemento do meio, os elementos subsequentes devem ser deslocados para a frente para preencher a lacuna; caso contrário, surgiriam lacunas nulas.

P: Qual é a diferença entre o StringBuilder e a concatenação de strings com +? R: O StringBuilder reutiliza o mesmo buffer na memória, evitando a criação de um novo objeto string a cada concatenação. Ele apresenta melhor desempenho em casos de grande número de concatenações.

P: O que StringSplitOptions.RemoveEmptyEntries faz? R: Por padrão, o Split mantém as entradas com string vazia. Ao adicionar essa opção, os itens vazios gerados por delimitadores consecutivos são removidos automaticamente.

📖 Resumo

📝 Exercícios

  1. Modifique o algoritmo de classificação por bolhas para classificar em ordem decrescente e exiba os resultados intermediários após cada passagem
  2. Adicione um método às estatísticas de notas dos alunos que retorne uma lista de índices para todas as notas reprovadas (abaixo de 60)
  3. Adicionar um recurso de “marcar como concluído” à lista de tarefas; as tarefas concluídas devem ser exibidas com o prefixo [✓]
  4. Adicionar a contagem de frequência de palavras ao analisador de texto, exibindo o número de ocorrências de cada palavra
Web-Tutorial.com

Equipe Técnica Web-Tutorial

Uma plataforma de tutoriais mantida por diversos desenvolvedores. Cada tutorial é escrito e revisado por profissionais da área correspondente. Trabalhamos para manter nosso conteúdo preciso e confiável — se encontrar algum problema, avise-nos.

100%