实战:数组与方法综合
冒泡排序
目标:实现冒泡排序算法,对整数数组进行升序排列,展示排序前后的结果。
要求:
- 编写冒泡排序逻辑,逐轮比较相邻元素并交换
- 显示排序前和排序后的数组内容
- 统计实际发生的交换次数
示例
CSHARP
int[] numbers = { 64, 34, 25, 12, 22, 11, 90, 5 };
Console.WriteLine("排序前: " + 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("排序后: " + string.Join(", ", numbers));
Console.WriteLine($"交换次数: {swapCount}");
TEXT
排序前: 64, 34, 25, 12, 22, 11, 90, 5
排序后: 5, 11, 12, 22, 25, 34, 64, 90
交换次数: 20
学生成绩统计
目标:使用数组存储学生成绩,通过方法计算平均分、最高分、最低分及高于平均分的人数。
要求:
- 定义方法分别计算平均值、最大值、最小值
- 统计高于平均分的学生人数
- 所有结果格式化输出
示例
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($"成绩列表: {string.Join(", ", scores)}");
Console.WriteLine($"平均分: {average:F1}");
Console.WriteLine($"最高分: {max}");
Console.WriteLine($"最低分: {min}");
Console.WriteLine($"高于平均分人数: {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;
}
TEXT
成绩列表: 85, 92, 78, 60, 95, 88, 72, 66, 91, 83
平均分: 81.0
最高分: 95
最低分: 60
高于平均分人数: 5
待办事项列表
目标:使用字符串数组实现一个简易待办事项列表,支持添加、删除和查看功能。
要求:
- 数组最大容量为 10 项
- 添加时检查是否已满,删除时检查索引是否有效
- 使用方法封装添加、删除和显示逻辑
示例
CSHARP
string[] todos = new string[10];
int count = 0;
AddItem("学习C#数组");
AddItem("完成练习题");
AddItem("复习方法与参数");
ListAll();
RemoveItem(1);
ListAll();
void AddItem(string item)
{
if (count >= todos.Length)
{
Console.WriteLine("⚠️ 待办列表已满,无法添加。");
return;
}
todos[count] = item;
count++;
Console.WriteLine($"已添加: {item}");
}
void RemoveItem(int index)
{
if (index < 0 || index >= count)
{
Console.WriteLine("⚠️ 无效索引,删除失败。");
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}");
}
void ListAll()
{
Console.WriteLine("--- 待办列表 ---");
if (count == 0)
{
Console.WriteLine("(空)");
return;
}
for (int i = 0; i < count; i++)
{
Console.WriteLine($"{i}. {todos[i]}");
}
}
TEXT
已添加: 学习C#数组
已添加: 完成练习题
已添加: 复习方法与参数
--- 待办列表 ---
0. 学习C#数组
1. 完成练习题
2. 复习方法与参数
已删除: 完成练习题
--- 待办列表 ---
0. 学习C#数组
1. 复习方法与参数
简易文本分析器
目标:对输入文本进行词频统计,使用 StringBuilder 拼接结果,通过方法封装各项分析功能。
要求:
- 统计单词总数、字符总数
- 找出最长的单词
- 使用 StringBuilder 构建分析报告
- 将分析逻辑拆分为独立方法
示例
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("===== 文本分析报告 =====");
sb.AppendLine($"原文: {input}");
sb.AppendLine($"单词数: {words}");
sb.AppendLine($"字符数: {chars}");
sb.AppendLine($"最长单词: {longestWord} ({longestWord.Length}字符)");
sb.Append("===== 分析结束 =====");
return sb;
}
TEXT
===== 文本分析报告 =====
原文: CSharp is a powerful programming language and programming is fun
单词数: 10
字符数: 60
最长单词: programming (11字符)
===== 分析结束 =====
❓ 常见问题
Q 冒泡排序中
if (!swapped) break 有什么作用?A 如果某一轮没有发生交换,说明数组已经有序,提前结束排序以节省时间。
Q 待办列表删除元素后为什么要前移数组?
A 数组是连续存储的,删除中间元素后需要将后面元素前移填补空位,否则会出现 null 间隙。
Q StringBuilder 和直接用
+ 拼接字符串有什么区别?A StringBuilder 在内存中复用同一缓冲区,避免每次拼接都创建新字符串对象,大量拼接时性能更优。
Q
StringSplitOptions.RemoveEmptyEntries 有什么用?A Split 默认会保留空字符串条目,加上此选项可自动移除连续分隔符产生的空项。
📖 小节
- 冒泡排序通过嵌套循环逐轮交换实现升序排列,提前退出优化可减少不必要的遍历
- 将数组作为方法参数传递,可以在方法内部遍历和计算,保持主逻辑清晰
- 数组版待办列表需手动管理元素数量和位移,理解了数组固定大小的特性
- StringBuilder 适合多次字符串拼接场景,方法拆分使文本分析逻辑更易维护复用
📝 作业
- 修改冒泡排序为降序排列,并输出每轮排序后的中间结果
- 为学生成绩统计添加一个方法,返回所有不及格(低于60分)的成绩索引列表
- 为待办列表添加"标记完成"功能,已完成的项显示时在前面加上
[✓] - 为文本分析器添加词频统计功能,输出每个单词的出现次数



