-
数组与循环——用C#批量数据统计工具
第一部分:C#基础入门
实例4:数组与循环——批量数据统计工具
实例介绍
数组是存储批量数据的容器,循环是处理批量数据的核心逻辑。本实例通过实现一个批vb.net教程C#教程python教程SQL教程access 2010教程量数据统计工具,综合运用一维数组和循环,掌握数组的声明、初始化、遍历,以及循环的灵活组合,完成常见统计功能(最大值、最小值、总和、平均值、中位数、方差)。通过这个实例,你将理解“容器+遍历”是批量数据处理的通用模式,为后续复杂数据结构学习打下基础。
需求分析
1.批量数据输入:支持自定义输入数据数量,批量录入整数;
2.输入验证:确保输入的是有效整数,无效输入时提示并重新输入;
3.基本统计:计算最大值、最小值、总和、平均值;
4.进阶统计:计算中位数(反映数据中间水平)、方差(反映数据离散程度);
5.边界处理:应对数据数量为0、数据全部重复等特殊场景。
代码实现
csharp
using System;
namespace ArrayAndLoopDemo
{
class BatchDataStatistics
{
static void Main(string[] args)
{
// 1. 输入数据数量并验证(必须是正整数)
int dataCount;
Console.Write("请输入数据数量(正整数):");
while (!int.TryParse(Console.ReadLine(), out dataCount) || dataCount <= 0)
{
Console.WriteLine("输入无效!请输入大于0的整数。");
Console.Write("重新输入数据数量:");
}
// 2. 初始化数组存储批量数据
int[] dataArray = new int[dataCount]; // 动态初始化数组,指定长度为dataCount
bool hasValidData = false; // 标记是否存在有效数据
// 3. 循环录入数据(带验证)
for (int i = 0; i < dataCount; i++)
{
Console.Write($"请输入第{i+1}个整数:");
while (!int.TryParse(Console.ReadLine(), out dataArray[i]))
{
Console.WriteLine("输入无效!请输入整数。");
Console.Write($"重新输入第{i+1}个整数:");
}
hasValidData = true; // 只要有一个有效数据就标记
}
// 处理无有效数据的极端情况
if (!hasValidData)
{
Console.WriteLine("未录入有效数据,无法统计!");
Console.ReadKey();
return;
}
// 4. 统计计算(核心逻辑)
// 基本统计量:最大、最小、总和、平均值
int max = dataArray[0];
int min = dataArray[0];
long sum = 0; // 用long避免int溢出(数据量大时sum可能超int范围)
foreach (int num in dataArray)
{
if (num > max) max = num;
if (num < min) min = num;
sum += num;
}
double average = (double)sum / dataCount; // 强制转换为double避免整数除法
// 进阶统计量:中位数(需先排序)
double median;
int[] sortedArray = (int[])dataArray.Clone(); // 克隆数组(避免修改原数据)
Array.Sort(sortedArray); // 排序
if (dataCount % 2 == 1)
{
median = sortedArray[dataCount / 2]; // 奇数长度取中间元素
}
else
{
median = (sortedArray[dataCount/2 -1] + sortedArray[dataCount/2]) / 2.0; // 偶数取中间两数平均
}
// 进阶统计量:方差(数据离散程度)
double variance = 0;
foreach (int num in dataArray)
{
variance += Math.Pow(num - average, 2); // 每个数据与平均值的差的平方
}
variance /= dataCount; // 除以数据数量
### 逐行讲解
#### 1. 数组的声明与初始化
```csharp
int[] dataArray = new int[dataCount];
int[]:声明一维整数数组;
new int[dataCount]:动态初始化数组,指定长度为dataCount(长度一旦确定不可修改);
数组是引用类型,即使元素是值类型(如int),数组本身仍存储在托管堆上,变量dataArray存储的是数组的内存地址。
2. 循环录入数据
csharp
for (int i = 0; i < dataCount; i++)
{
while (!int.TryParse(Console.ReadLine(), out dataArray[i]))
{
// 无效输入处理
}
}
for循环:通过索引遍历数组,适合需要修改数组元素的场景(这里直接将输入值存入数组对应位置);
TryParse:确保输入是有效整数,避免程序崩溃;
dataArray[i]:通过索引访问数组元素,索引从0开始(注意:索引越界会抛出IndexOutOfRangeException)。
3. 基本统计量计算
csharp
foreach (int num in dataArray)
{
if (num > max) max = num;
if (num < min) min = num;
sum += num;
}
foreach循环:无需索引,直接遍历数组元素,适合只读访问场景(代码更简洁);
sum用long类型:当数据量大时,int类型的sum可能溢出(int最大值约21亿),long可避免此问题;
average强制转换:(double)sum将sum转为浮点数,确保除法结果是小数(否则sum/dataCount会是整数除法)。
4. 中位数计算
csharp
int[] sortedArray = (int[])dataArray.Clone();
Array.Sort(sortedArray);
Clone():克隆原数组生成新数组,避免Array.Sort修改原数据(保持输入数据的原始性);
Array.Sort():对数组进行升序排序(中位数依赖排序后的位置);
中位数逻辑:奇数长度取中间元素,偶数长度取中间两元素的平均值(注意用2.0而非2,确保结果是浮点数)。
5. 方差计算
csharp
variance += Math.Pow(num - average, 2);
Math.Pow(a,b):计算a的b次方(这里是差的平方);
方差意义:反映数据与平均值的离散程度,方差越大,数据波动越明显。
基础知识拓展
- 数组的类型与内存结构
| 数组类型 | 定义示例 | 内存特点 | 适用场景 |
|---|---|---|---|
| 一维数组 | int[] arr = new int[5] | 连续内存块,元素按顺序存储 | 批量线性数据 |
| 多维数组 (矩形) | int[,] arr = new int[2,3] | 二维连续内存块 | 矩阵、表格数据 |
| 交错数组 | int[][] arr = new int[2][] | 数组的数组,每行长度可不同 | 不规则表格(如稀疏矩阵) |
内存注意:数组是引用类型,无论元素是值类型还是引用类型,数组本身都存储在托管堆上;元素为值类型时,直接存储值;元素为引用类型时,存储引用地址。
2. 循环遍历的选择
| 循环类型 | 语法示例 | 优势 | 局限性 |
|---|---|---|---|
| for循环 | for(int i=0; i<len; i++) | 可修改元素、控制步长 | 需要手动管理索引 |
| foreach循环 | foreach(int num in arr) | 代码简洁、无需索引 | 只读访问(无法修改元素) |
| while循环 | while(i<len) | 适合未知循环次数的场景 | 需手动初始化/更新循环变量 |
-
统计量的数学意义
中位数:不受极端值影响(如数据中有极大/极小值时,中位数比平均值更能反映中间水平);
方差:计算每个数据与平均值的偏差平方和,消除正负偏差的抵消,量化数据离散程度;
标准差:方差的平方根(后续可扩展,直接对variance开平方即可)。
扩展思考
1.浮点数支持:将数组改为double[],支持小数数据统计;
2.文件交互:从文本文件读取批量数据(每行一个数),统计后写入结果文件;
3.更多统计量:添加众数(出现次数最多的数)、标准差(方差的平方根);
4.泛型扩展:用泛型数组T[]实现通用统计工具(支持int、double等类型);
5.性能优化:对大数据量(如10万条),优化排序和遍历效率(如用快速排序替代默认排序)。
总结
本实例通过数组+循环的组合,实现了批量数据的完整统计流程。核心是理解“数组存储数据、循环处理数据”的模式,掌握数组的索引访问、遍历方式,以及循环的灵活运用。后续学习集合(如List)时,你会发现数组是集合的基础,而循环逻辑是通用的——只要掌握了这套模式,就能应对所有批量数据处理场景。
本站原创,转载请注明出处:https://www.xin3721.com/ArticlecSharp/c49395.html










