10.1 数组简介
数组是一种数据结构,它一次性存储多个相同类型的变量。数组是使用类型声明的,数组具有以下属性:
1)数组从字面上理解就是存放一组数,但在C#语言中数组存放的并不一定是数字,也可以是其他数据类型。
2)数组的索引从零开始:具有n个元素的数组的索引是从0到n-1。
3)数组元素可以是任何类型,包括数组类型。
4)在一个数组中存放的值都是同一数据类型的,并且可以通过循环以及数据操作的方法对数组的值进行运算或操作。
定义数组:
数据类型[] 数组名;
int[] i;
10.2 一维数组
一维数组在数组中最常用,即将一组值存放到一个数组中,并为其定义一个名称,通过数组中元素的位置来存取值。创建一维数组的语法形式如下,在C#中,数组是对象,必须进行实例化。
语法:
//定义数组
int[] numbers;
//多种方式声明一维数组
数据类型[] 数组名 = new 数据类型[长度];
int[] i = new int[4];
数据类型[] 数组名 = {值 1, 值 2, …};
int[] i = {1, 2, 3, 4, …};
数据类型[] 数组名 = new 数据类型[长度]{值 1,值 2,…}
int[] i = new int[4]{1,2,3,4};
注意:
1)在定义数组时定义的数据类型代表了数组中每个元素的数据类型。
2)在使用数组前必须初始化数据,即为数组赋初值。
3)在初始化数组时指定了数组中的长度,也就是数组中能存放的元素个数。
4)在指定数组的长度后,数组中的元素会被系统自动赋予初始值,与类中段的初始化类似,数值类型的值为0、引用类型的值为null。
5)如果在初始化数组中直接对数组赋值了,那么数组中值的个数就是数组的长度。
6)由于在数组中存放了多个元素,在存取数组中的元素时要使用下标来存取。
10.3 二维数组
在C# 语言里多维数组中比较常用的是二维数组,也可以称之为多维数组。从定义的语法来看,它与一维数组的定义非常类似,每多一个维度则在定义时的[]中增加一个“,”。存取数组中的值也是将下标用“,”隔开。
语法:
//定义多维数组
数据类型[ , , ...] 数组名;
//创建多维数组并初始化
数据类型[ , , ...] 数组名 = new 数据类型[m,n,...] {{ , , ...},{ , , ...}};
多维数组最简单的形式是二维数组。一个二维数组,在本质上,是一个一维数组的列表。
初始化二维数组:
多维数组可以通过在括号内为每行指定值来进行初始化。下面是一个带有3 行 4 列的数组。
int [,] a = new int [3,4]
{
{0, 1, 2, 3} ,
{4, 5, 6, 7} ,
{8, 9, 10, 11}
};
二维数组示例:定义一个存放学生成绩的二维数组,并将该数组中每个学生的成绩输出。
double[,] points = {{ 90, 80 }, { 100, 89 }, { 88.5, 86 }};
for(int i = 0; i < points.GetLength(0); i++)
{
Console.WriteLine("第" + (i + 1) + "个学生成绩:");
for(int j = 0; j < points.GetLength(1); j++)
{
Console.Write(points[i,j] + " ");
}
Console.WriteLine();
Console.ReadKey();
}
输出结果:
第1个学生成绩:
90 80
第2个学生成绩:
100 89
第3个学生成绩:
88.5 86
10.4 foreach遍历
foreach循环用于列举出集合中所有的元素,foreach语句中的表达式由关键字 in 隔开的两个项组成。in 右边的项是集合名,in 左边的项是变量名,用来存放该集合中的每个元素。
语法:
foreach(数据类型 变量名 in 数组名)
{
//语句块;
}
foreach遍历实例1
int[] arr3 = new int[5] {1, 2, 3, 4, 5};
foreach (int item in arr3)
{
Console.WriteLine("foreach输出:{0}",item);
}
输出结果:
foreach输出:1
foreach输出:2
foreach输出:3
foreach输出:4
foreach输出:5
注意:
1)这里变量名的数据类型必须与数组的数据类型相兼容。
2)在foreach循环中,如果要输出数组中的元素,不需要使用数组中的下标,直接输 出变量名即可。
3)foreach语句仅能用于数组、字符串或集合类数据类型。
foreach遍历实例2
int[] n = new int[5]; //n是一个带有5个整数的数组
for ( int i = 0; i < 5; i++ )
{
n[i] = i + 100; //初始化数组n中的元素
}
foreach (int j in n ) //输出每个数组元素的值
{
int i = j-100;
Console.WriteLine("Element[{0}] = {1}", i, j);
}
Console.ReadKey();
输出结果:
Element[0] = 100
Element[1] = 101
Element[2] = 102
Element[3] = 103
Element[4] = 104
foreach遍历实例3:根据班级的人数创建一个数组,要求将每个人的名字都要放进去,并遍历输出
Console.WriteLine("请输入班级的总人数:");
int numbers = Convert.ToInt32(Console.ReadLine());
string[] names = new string[numbers];
for (int i = 0; i < numbers; i++)//numbers-1次循环
{
Console.WriteLine($"请输入第{i + 1}个人的姓名");
names[i] = Console.ReadLine();
}
Console.WriteLine("输入完毕,请按回车键查看!");
Console.ReadKey();
foreach (string item in names)
{
Console.WriteLine(item);
}
Console.ReadKey();
10.5 冒泡排序
冒泡排序是一种简单的排序算法,它重复地遍历要排序的数列,每次比较相邻两个元素,如果顺序不对就交换它们的位置,直到遍历完整个数列。这样一轮下来,最大或最小的元素会被排到数列的末尾或开头,然后再从剩余的元素中继续进行相邻元素的比较和交换,直到所有元素都有序为止。由于排序过程中较大或较小的元素会像气泡一样逐渐升上去或降下来,因此称为冒泡排序。
对于大规模数据的排序效率较低,但对于小规模数据或基本有序的数据,冒泡排序是一种简单有效的排序方法。
经典冒泡排序代码
int[] list = new int[] { 7, 2, 4, 3, 8, 1, 5, 6, 9 };
int num = list.Length - 1;
for (int i = 0; i < num; i++)
{
for (int j = 0; j < num - i; j++)
{
if (list[j] > list[j + 1])//若改为<,则为降序排列
{
int temp = list[j];//如果后值比本值大,则将本值后移
list[j] = list[j + 1];//将后值赋予本值的位置
list[j + 1] = temp;//将本值赋予后值的位置
}
}
}
foreach (int item in list)
{
Console.Write(item);
}
Console.ReadKey();
输出结果:1 2 3 4 5 6 7 8 9
冒泡排序练习1:控制台输入班级人数,将每个人的年龄放入数组,将所有人的年龄求总和,求平均年龄,求最大年龄。
Console.Write("请输入班级人数:");
int num = int.Parse(Console.ReadLine());
int[] age = new int[num];
int sum = 0;
for (int i = 0; i < num; i++)
{
Console.Write("请输入第{0}个人的年龄:", i + 1);
age[i] = int.Parse(Console.ReadLine());
sum += age[i];
}
Console.WriteLine("年龄总和为:" + sum);
Console.WriteLine("平均年龄为:" + (sum / num));
Console.ReadLine();
int agemax = 0;
for (int i = 0; i < num; i++)
{
if (agemax < age[i])
{
agemax = age[i];
}
}
Console.WriteLine("最大年龄是:" + agemax);
Console.ReadLine();
冒泡排序练习2:输入班级人数,输入每个人的分数,求总分、平均分、两个最高分,两个最低分。
Console.WriteLine("请输入班级的人数:");
int nums = int.Parse(Console.ReadLine());
int[] scores = new int[nums];
int allScores = 0;
for (int i = 0; i < nums; i++)
{
Console.Write("请输入第{0}个学生的分数:", i + 1);
scores [i] = int.Parse(Console.ReadLine());
scores += scores [i];
}
Console.WriteLine($"总分为{allScores}");
Console.WriteLine($"平均分为{(allScores / nums)}");
Console.ReadLine();
for (int i = 0; i < nums; i++)//冒泡排序
{
for (int j = 0; j < nums - 1; j++)
{
if (scores[j] > scores[j + 1])
{
int temp = scores[j];
scores[j] = scores[j + 1];
scores[j + 1] = temp;
}
}
}
Console.WriteLine($"两个最高分为:{scores[nums-1]},{scores [nums-2]}");
Console.WriteLine($"两个最低分为:{scores[0]},{scores[1]}");
Console.ReadLine();
10.6 综合练习
有五个学生,用结构体存储姓名、学号、年龄、分数;
1、通过循环,在控制台将学生信息依次输入
2、按照成绩从小到大的顺序排序,然后输出所有学生信息
public struct Person
{
public string name;
public int age;
public string studentID;
public int score;
}
class Program
{
public static void Main (string[] args)
{
Person[] persons = new Person[5];
for (int i = 0; i < persons.Length; i++)
{
Console.WriteLine($"请输入第{i + 1}位学生的姓名:");
persons[i].name = Console.ReadLine();
Console.WriteLine($"请输入第{i + 1}位学生的学号:");
persons[i].studentID =
int.Parse(Console.ReadLine());
Console.WriteLine($"请输入第{i + 1}位学生的年龄:");
persons[i].age = int.Parse(Console.ReadLine());
Console.WriteLine($"请输入第{i + 1}位学生的成绩:");
persons[i].score = int.Parse(Console.ReadLine());
}
Console.ReadKey();
for (i = 0; i < persons.Length-1; i++)
{
for (int j = 0; j < persons.Length-(i+1); j++)
{
if(persons[j].score> persons[j+1].score)
{
Person temp = persons[j];
persons[j] = persons[j + 1];
persons[j + 1] = temp;
}
}
}
foreach (Person item in persons)
{
Console.WriteLine ($"姓名:{item.name} 年龄:{item.age},学号:{item.studentID},分数{item.score}");
}
Console.ReadKey();
}
}