前言

在上一篇博客中,为大家分享了C#中的枚举、结构体,这一次来分享一下数组。这里主要对数组的求最值和数组排序来做重点说明。   

   

目录

前言

思维导图

正文

数组是什么?

数组有什么好处?

数组有什么缺点?

怎么声明数组的四种方式?

怎么给数组赋值?

数组的常用方法有哪些?

实战演练

1.一次语文测试后,老师让班长统计每一个学生的成绩并计算全班(全班共5人)的平均成绩,然后把所有成绩显示出来。

2.求一个数组的最大值、最小值、平均值、总和

3.冒泡排序

4.数组排序

方法一、正向输出

方法二、逆向输出

5.利用数组方法调用:计算一个数组所有元素的最大值、最小值、平均值、和

6.数组里面的人名(贝拉, 爱德华, 雅各布, 爱丽丝, 卡莱尔)分割成:例如:“贝拉|爱德华……”

7.将一个整数数组的每一个元素进行如下的处理:如果元素是正数则将这个位置的元素的值+1;如果元素是负数则将这个位置的元素的值-1;如果元素是0,则不变

8.forr:反转,颠倒原来数组

9.数组的取值和赋值

10.数组的复制和拷贝

总结


思维导图

                      

C#基础——数组(冒泡排序、求最值、数组排序、forr反转)_i++

正文

数组是什么?

一组数据类型相同的数

C#基础——数组(冒泡排序、求最值、数组排序、forr反转)_i++_02

 

数组有什么好处?

一次声明相同类型的数

数组有什么缺点?

数组的大小在声明后是固定的,无法动态改变。如果需要动态调整集合大小,可以考虑使用其他集合类型(如List)

怎么声明数组的四种方式?

//第一种方式
 int[] num1 = new int[10];             //长度为10,下标为0-9,int类型

//第二种方式
int[] num2 = new int[] { 1,2,3,4,5};   //此数组就存5个值

//第三种方式
int[] num3 = new int[3] { 1, 2, 3 };   //个数和声明数必须一致。此数组就存3个值,值都清楚

//第四种方式
int[] num4 = { 1, 2, 3, 4, 5 };        //简写法

怎么给数组赋值?

int[] num1 = new int[10];   //长度为10,下标为0-9,int类型
num1[8] = 20;               //给8这个地方赋个值
Console.WriteLine(num1[8]);                                                
Console.ReadKey();

 比方,盖一栋楼,一共有10层,有个开房的,它就去找6层房牌号为100的这个房间    

数组的常用方法有哪些?

  • Length属性:获取数组的长度(即元素的数量)。例如:int length = numbers.Length;
  • Rank属性:获取数组的维度数。例如:int rank = matrix.Rank;
  • GetLength方法:获取指定维度的长度。例如:int length = matrix.GetLength(0);
  • for循环:遍历一维数组
  • foreach循环:遍历多维数组
  • 可以使用Array类的Copy()方法来复制数组中的元素到另一个数组。
  • 可以使用Array类的Clone()方法来创建一个数组的浅拷贝。

实战演练

1.一次语文测试后,老师让班长统计每一个学生的成绩并计算全班(全班共5人)的平均成绩,然后把所有成绩显示出来。

Console.WriteLine("请输入班级人数");                        //用户输入人数
int number = 0;  //平均成绩
int  sum = 0;   //总成绩
 
 if (int.TryParse(Console.ReadLine(), out    number))      //如果用户输入的人数正确
 {
 
      int[] score = new int[number];                       //声明一个数组用来存放成绩
 
      for (int i = 0; i <    score.Length; i+1)
      {
          Console.WriteLine("请输入第{0}个人的成绩", i++);   //用户输入成绩
 
            score[i] = int.Parse(Console.ReadLine());      //把用户输入的成绩转换为int类型并存到数组中
 
             sum += score[i];                              //对分数进行求和 
       }
      Console.WriteLine("总成绩为{0},平均成绩为{1}",sum,sum/number);
 }
 else                                                     //如果用户输入的人数错误
{
       Console.WriteLine("输入有误");
}
Console.ReadKey();

2.求一个数组的最大值、最小值、平均值、总和

最大值:MaxValue

最小值:MinValue

平均值:Average

总和:Sum

int[] nums =   { 1, 2, 3, 0, 9 };
int    max = int.MinValue;    //求最大值
int    min = int.MaxValue;    //求最小值
int    sum = 0;              //总和初始化为0
 
for (int i = 0; i    < nums.Length ; i++)
 {
    if(nums[i]> max)    //求最大值
    {
        max = nums[i]; 
     }
 
     if(nums[i]< min)    //求最小值
     {
           min = nums[i];
     }
 
      sum += nums[i];     //求和
}
Console.WriteLine("最大值为{0},最小值为{1},总和为{2},平均值为{3}",max,min,sum,sum/nums.Length );
Console.ReadKey();

3.冒泡排序

是一种简单的排序算法,它通过相邻元素的比较和交换来进行排序

int[] nums = new int[] { 98, 54, 54, 322, 43, 23 };         //一个数组nums,并赋值(要被排序的数组)
int temp = 0;

for (int i = 0; i < nums.Length - 1; i++)                   //循环的轮数,需要6-1=5轮
{
    for (int j = 0; j < nums.Length - 1 - i; j++)           //比较的次数(随着轮数的增加,比较次数减少)
    {
       if (nums[j] > nums[j + 1])                           //相邻两数进行比较,如果前一位>后一位 
        {
            temp = nums[j];                                 //交换位置
            nums[j] = nums[j + 1];
           nums[j + 1] = temp;
        }
    }
}

for (int i = 0; i < nums.Length ; i++)                      //循环输出排序之后的数组元素
{
    Console.Write(nums[i]+"\t");                            //在控制台输出结果,并排序(\t)
}
Console.ReadKey();

在冒泡排序算法中,外层循环控制比较轮数,内层循环用于执行相邻元素的比较和交换。每一轮内层循环结束后,最大的元素都会“冒泡”到数组的末尾。随着轮数的增加,排序范围逐渐缩小,直到排序完成。

4.数组排序

方法一、正向输出

int[] nums = new int[] { 1, 2, 4, 3, -1 };      //定义一个数组,并赋值
Array.Sort(nums);                               //Array类,对数组元素进行排序
for (int i = 0; i < nums.Length ; i++)          //for循环输出数组元素
{
    Console.Write(nums[i] + "\t");              //在控制台输出内容,注:\t是水平制表符
}
Console.ReadKey();

方法二、逆向输出

int[] nums = new int[] { 1, 2, 4, 3, -1 };      //定义一个数组,并赋值
Array.Sort(nums);                               //Array类,对数组元素进行排序
//Array.Reverse(nums);                          //反转,颠倒原来数组,如,颠倒后:-1,3,4,2,1
for (int i = nums.Length - 1; i >= 0; i--)      //倒着输出结果
{
   Console.Write(nums[i] + "\t");
}
Console.ReadKey();

5.利用数组方法调用:计算一个数组所有元素的最大值、最小值、平均值、和

class Program
{
    static void Main(string[] args) 
    {
         Program.ArraySort();                              //调用ArraySort这个方法
         Console.ReadKey();
     }
    
    
    public static void ArraySort()                         //写了一个ArraySort方法,对数组进行排序
    {
       int[] nums = new int[] { 2, 3, 43, 23, 243, 3 };    //定义一个数组,并赋初值
       int max = int.MinValue;                             //最大值
       int min = int.MaxValue;                             //最小值
       int sum = 0;                                        //给求和赋初值为0

       for (int i = 0; i < nums.Length; i++)               //for循环,对数组进行遍历
       {
           if (nums[i] > max)                              //求最大值
           { 
                max = nums[i];                           
           }

           if (nums[i] < min)                              //求最小值
           {
               min = nums[i];
           }
           sum += nums[i];                                 //求和
        }
        Console.WriteLine("最大值为:{0},最小值为:{1}", max, min);             //在控制台输出最大值、最小值
        Console.WriteLine("和为:{0},平均值为:{1}", sum, sum / nums.Length);   //在控制台输出和、平均数
    }
}

6.数组里面的人名(贝拉, 爱德华, 雅各布, 爱丽丝, 卡莱尔)分割成:例如:“贝拉|爱德华……”

string[] names = new string[] { "贝拉", "爱德华", "雅各布", "爱丽丝", "卡莱尔", };     //定义一个字符串变量并赋值
            
string result = "";                                     //定义一个字符串result用来接收加|之后的元素
for(int i = 0; i < names.Length-1; i++)                 //for循环遍历数组元素
{
    result += names[i] + "|";                           //result=names某个元素+|
}
Console.WriteLine(result+names[names.Length -1]);       //在控制台输出结果,最后一个元素不加“|”
Console.ReadKey();

7.将一个整数数组的每一个元素进行如下的处理:如果元素是正数则将这个位置的元素的值+1;如果元素是负数则将这个位置的元素的值-1;如果元素是0,则不变

for (int i = 0; i    < nums.Length; i++)
{
    if(nums[i]>0)                         //如果数>0
    {
        nums[i]++;
    }
 
    if (nums[i] < 0)                      //如果数<0
    {
        nums[i]--;
    }
}
 
for (int i = 0; i < nums.Length; i++)     //循环输出数值
{
    Console.Write(nums[i]+"\t");
}
Console.ReadKey();

8.forr:反转,颠倒原来数组

将一个字符串数组的元素的顺序进行反转:{”我“,”是“,“好人”}{”好人“,”是“,”我“}。第i个和第length-i-1个进行交换

方法一:Array.Reverse
string[] text = new string[] {"我", "是", "好人"};      //定义一个数组text并赋值
Array.Reverse(text);                                   //反转
for (int i = 0; i < str.Length; i++)                   //遍历数组
{
    Console.Write(str[i]+"\t");                        //在控制台输出结果,注:\t是水平制表符
}
Console.ReadKey();


方法二:forr反转
Array.Sort(text);
for (int i = text.Length  - 1; i >= 0; i--)
{
    Console.Write(text[i] + "\t");
}
Console.ReadKey();

9.数组的取值和赋值

int[] nums = new int[5];              //声明一个数组

for (int i = 0; i < 5; i++)           //赋值
{
    nums[i] = 10;
}

for(int i = 0; i < 5; i++)            //取值
{
    Console.WriteLine(nums[i]);
}
Console.ReadKey();

10.数组的复制和拷贝

// 原始数组
int[] originalArray = { 1, 2, 3, 4, 5 };

// 使用Copy()方法复制数组
int[] copiedArray = new int[originalArray.Length];
Array.Copy(originalArray, copiedArray, originalArray.Length);

// 使用Clone()方法拷贝数组
int[] clonedArray = (int[])originalArray.Clone();

// 输出结果
Console.WriteLine("Copied Array:");
foreach (int num in copiedArray)
{
    Console.Write(num + " ");
}

Console.WriteLine("\nCloned Array:");
foreach (int num in clonedArray)
{
    Console.Write(num + " ");
}

输出结果:

Copied Array: 1 2 3 4 5

Cloned Array: 1 2 3 4 5

通过Copy()方法和Clone()方法,我们可以实现对原始数组的复制和拷贝。需要注意的是,Copy()方法是将原始数组的元素复制到目标数组中,而Clone()方法是创建原始数组的一个浅拷贝。因此,对于引用类型的数组,Clone()方法只会复制引用,而不会复制对象本身。如果需要深拷贝,可以使用其他方法来实现

总结

枚举:一组固定范围、相同的命名常量

结构体:不同类型的数据组合在一起表示一个新的数据类型

数组:一次声明多个相同数据类型的数据