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:
- Escreva a lógica da ordenação por bolhas que compara elementos adjacentes e os troca de lugar a cada passagem
- Exibir o conteúdo do array antes e depois da classificação
- Contar o número real de trocas realizadas
▶ Exemplo
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}");
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:
- Definir métodos para calcular separadamente a média, o máximo e o mínimo
- Contar o número de alunos com notas acima da média
- Formatar e exibir todos os resultados
▶ Exemplo
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;
}
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:
- Capacidade máxima da matriz de 10 itens
- Verifique se a lista está cheia ao adicionar elementos e valide o índice ao removê-los
- Encapsular a lógica de adição, remoção e exibição em métodos
▶ Exemplo
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]}");
}
}
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:
- Contar o número total de palavras e o número total de caracteres
- Encontre a palavra mais longa
- Use o StringBuilder para criar o relatório de análise
- Dividir a lógica de análise em métodos independentes
▶ Exemplo
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;
}
===== 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) breakfaz 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.RemoveEmptyEntriesfaz? 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
- A ordenação por bolhas alcança a ordem crescente por meio de loops aninhados e trocas a cada passagem; a otimização de saída antecipada reduz as varreduras desnecessárias
- Passar matrizes como parâmetros de método permite a percorrida e o cálculo dentro dos métodos, mantendo a lógica principal clara
- Uma lista de tarefas baseada em array exige o gerenciamento manual da contagem e do deslocamento dos elementos, o que ilustra a natureza de tamanho fixo dos arrays
- O StringBuilder é adequado para concatenação repetida de strings; a decomposição em métodos facilita a manutenção e a reutilização da lógica de análise de texto
📝 Exercícios
- Modifique o algoritmo de classificação por bolhas para classificar em ordem decrescente e exiba os resultados intermediários após cada passagem
- 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)
- Adicionar um recurso de “marcar como concluído” à lista de tarefas; as tarefas concluídas devem ser exibidas com o prefixo
[✓] - Adicionar a contagem de frequência de palavras ao analisador de texto, exibindo o número de ocorrências de cada palavra