C#学习教程05——数组

5.数组

数组能通过一个变量存放多个相同类型的值,在存取数组中的值时直接根据数组中的下标即可完成,数组索引从0开始。

5.1 一维数组

//定义数组
数据类型[]  数组名;
//初始化数组中的元素
数据类型[]  数组名 = new  数据类型[长度];
数据类型[]  数组名 = {值 1, 值 2, ...};
数据类型[]  数组名 = new  数据类型[长度]{值 1,值 2,...};
using System;
class Program
{
    static void Main(string[] args)
    {
        int[] a = new int[5];
        Console.WriteLine("请输入5个整数:");
        for(int i = 0; i < a.Length; i++)
        {
            a[i] = int.Parse(Console.ReadLine());//将字符串类型转换成整型
        }
        int max = a[0];//这里假设a[0]是最大的
        for(int i = 1; i < a.Length; i++)
        {
            if (a[i] > max)
            {
                max = a[i];
            }
        }
        Console.WriteLine("数组中最大值为:" + max);
    }
}

5.2 多维数组

//定义多维数组
数据类型[ , , ...]  数组名;
//创建多维数组并初始化
数据类型[ , , ...]   数组名 = new  数据类型[m,n,...]  {{ , , ...},{ , , ...}};

与一维数组的定义非常类似,每多一个维度则在定义时的[]中增加一个,

using System;
class Program
{
    static void Main(string[] args)
    {
        double[,] grades = { { 67, 81 }, { 100, 98 }, { 84.5, 86 } };
        for (int i = 0; i < grades.GetLength(0); i++)
        {
            Console.WriteLine("第" + (i + 1) + "个学生成绩:");
            for (int j = 0; j < grades.GetLength(1); j++)
            {
                Console.Write(grades[i, j] + " ");
            }
            Console.WriteLine();
        }
    }
}

在遍历多维数组元素时使用GetLength(维度)方法能获取多维数组中每一维的元素,维度也是从 0 开始的,因此在该实例中获取数组中第一维的值时使用的是points.GetLength(0)

  • 锯齿型数组,即在多维数组中的每一维中所存放值的个数不同。
// 定义锯齿型数组的语法形式
数据类型[][]  数组名 = new 数据类型[数组长度][];
数组名[0] = new 数据类型[数组长度];
using System;
class Program
{
    static void Main(string[] args)
    {
        int[][] arrays = new int[3][];
        arrays[0] = new int[] { 1, 2 };
        arrays[1] = new int[] { 3, 4, 5 };
        arrays[2] = new int[] { 6, 7, 8, 9 };
        for(int i = 0; i < arrays.Length; i++)
        {
            Console.WriteLine("输出数组中第" + (i + 1) + "行的元素:");
            for(int j=0;j<arrays[i].Length; j++)
            {
                Console.Write(arrays[i][j] + " ");
            }
            Console.WriteLine();
        }
    }
}

在这里插入图片描述

5.3 foreach循环

foreach循环用于列举出集合中所有的元素,foreach语句中的表达式由关键字in隔开的两个项组成。in右边的项是集合名,in左边的项是变量名,用来存放该集合中的每个元素。

foreach(数据类型  变量名  in  数组名)
{
    //语句块;
}

该循环的运行过程如下:每一次循环时,从集合中取出一个新的元素值。放到只读变量中去,如果括号中的整个表达式返回值为 true,foreach块中的语句就能够执行。一旦集合中的元素都已经被访问到,整个表达式的值为 false,控制流程就转入到foreach块后面的执行语句。

foreach语句仅能用于数组、字符串或集合类数据类型。

下面的例子实现的功能是计算5名学生的总成绩和平均成绩。

using System;
class Program
{
    static void Main(string[] args)
    {
        double[] grades = { 68, 83, 96, 90, 78.5 };
        double sum = 0;
        double avg = 0;
        foreach(double grade in grades)
        {
            sum = sum + grade;
        }
        avg = sum / grades.Length;
        Console.WriteLine("总成绩为:" + sum);
        Console.WriteLine("平均成绩为:" + avg);
    }
}

// 总成绩为:415.5
// 平均成绩为:83.1

5.4 Split()拆分

Split()方法用于按照指定的字符串来拆分原有字符串,并返回拆分后得到的字符串数组。

using System;
class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("请输入一个字符串:");
        string str = Console.ReadLine();
        string[] condition = { "," };
        // 第一个参数是拆分的条件数组,可以在该数组中存放多个字符串作为拆分的条件
        // 第二个参数StringSplitOptions.None是拆分的选项,表示如果在拆分时遇到空字符也拆分出一个元素
        string[] result = str.Split(condition, StringSplitOptions.None);
        for(int i = 0; i < result.Length; i++)
        {
            Console.Write("["+result[i] + "] ");
        }
    }
}

在这里插入图片描述

在这里插入图片描述

using System;
class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("请输入一个字符串:");
        string str = Console.ReadLine();
        string[] condition = { "," };
        // StringSplitOptions.RemoveEmptyEntries参数表示拆分时不需要包含空字符串
        string[] result = str.Split(condition, StringSplitOptions.RemoveEmptyEntries);
        for(int i = 0; i < result.Length; i++)
        {
            Console.Write("["+result[i] + "] ");
        }
    }
}

在这里插入图片描述

5.5 冒泡排序

冒泡排序的原理是将数组元素中相邻两个元素的值进行比较,将较小的数放到前面,每一次交换都将最大的数放到最后,依次交换后最终将数组中的元素从小到大排序。

using System;
class Program
{
    static void Main(string[] args)
    {
        int[] a = { 55, 16, 7, 28, 36 };
        for(int i = 0; i < a.Length; i++)
        {
            for(int j = 0; j < a.Length - i - 1; j++)
            {
                if (a[j] > a[j + 1])
                {
                    int temp = a[j];
                    a[j] = a[j + 1];
                    a[j + 1] = temp;
                }
            }
        }
        Console.Write("升序排序后的结果为:");
        foreach(int b in a)
        {
            Console.Write(b + " ");
        }
        Console.WriteLine();
    }
}

// 升序排序后的结果为:7 16 28 36 55

如果要对数组中的元素从大到小排序,只需要将if(a[j]>a[j+1])语句更改成if(a[j]<a[j+1])即可。

5.6 System.Array

System.Array是所有数组的基类,其提供的属性和方法也可以被用到任何数组中。数组的Length属性就是该基类提供的。

方法描述
Clear()清空数组中的元素
Sort()冒泡排序,从小到大排序数组中的元素
Reverse()将数组中的元素逆序排列
IndexOf()查找数组中是否含有某个元素,返回该元素第一次出现的位置,如果没有与之匹配的元素,则返回 -1
LastIndexOf()查找数组中是否含有某个元素,返回该元素最后一次出现的位置
using System;
class Program
{
    static void Main(string[] args)
    {
        int[] a = { 55, 16, 7, 28, 36 };
        Array.Sort(a);
        Console.Write("升序排序后的结果为:");
        foreach(int b in a)
        {
            Console.Write(b + " ");
        }
        Console.WriteLine();
        Array.Reverse(a);
        Console.Write("降序排序后的结果为:");
        foreach(int b in a)
        {
            Console.Write(b + " ");
        }
    }
}

// 升序排序后的结果为:7 16 28 36 55
// 降序排序后的结果为:55 36 28 16 7

虽然在数组中并没有提供对其降序排序的方法,但可以先将数组中的元素使用 Sort 排序,再使用Reverse方法将数组中的元素逆序,这样就完成了从大到小的排序。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
对于第一个问题,以下是使用 C# 编写的程序代码,实现了生成哈夫曼树和哈夫曼编码的功能: ```csharp using System; using System.Collections.Generic; namespace HuffmanEncoding { class Program { static void Main(string[] args) { int[] freq = { 5, 2, 1, 4, 3 }; char[] chars = { 'a', 'b', 'c', 'd', 'e' }; // 构造哈夫曼树 HuffmanNode root = BuildHuffmanTree(chars, freq); // 生成哈夫曼编码 Dictionary<char, string> codes = GenerateHuffmanCode(root); // 输出结果 Console.WriteLine("Original array: "); for (int i = 0; i < freq.Length; i++) { Console.WriteLine(chars[i] + ": " + freq[i]); } Console.WriteLine("\nHuffman tree: "); PrintHuffmanTree(root); Console.WriteLine("\nHuffman codes: "); foreach (var code in codes) { Console.WriteLine(code.Key + ": " + code.Value); } } // 定义哈夫曼树节点类 class HuffmanNode { public char Char { get; set; } public int Freq { get; set; } public HuffmanNode Left { get; set; } public HuffmanNode Right { get; set; } } // 构造哈夫曼树函数 static HuffmanNode BuildHuffmanTree(char[] chars, int[] freq) { List<HuffmanNode> nodes = new List<HuffmanNode>(); for (int i = 0; i < chars.Length; i++) { nodes.Add(new HuffmanNode { Char = chars[i], Freq = freq[i] }); } while (nodes.Count > 1) { nodes.Sort((a, b) => b.Freq - a.Freq); HuffmanNode leftNode = nodes[nodes.Count - 1]; HuffmanNode rightNode = nodes[nodes.Count - 2]; HuffmanNode parentNode = new HuffmanNode { Freq = leftNode.Freq + rightNode.Freq, Left = leftNode, Right = rightNode }; nodes.RemoveAt(nodes.Count - 1); nodes.RemoveAt(nodes.Count - 1); nodes.Add(parentNode); } return nodes[0]; } // 生成哈夫曼编码函数 static Dictionary<char, string> GenerateHuffmanCode(HuffmanNode root) { Dictionary<char, string> codes = new Dictionary<char, string>(); Stack<Tuple<HuffmanNode, string>> stack = new Stack<Tuple<HuffmanNode, string>>(); stack.Push(new Tuple<HuffmanNode, string>(root, "")); while (stack.Count > 0) { Tuple<HuffmanNode, string> tuple = stack.Pop(); HuffmanNode node = tuple.Item1; string code = tuple.Item2; if (node.Left == null && node.Right == null) { codes[node.Char] = code; } if (node.Left != null) { stack.Push(new Tuple<HuffmanNode, string>(node.Left, code + "0")); } if (node.Right != null) { stack.Push(new Tuple<HuffmanNode, string>(node.Right, code + "1")); } } return codes; } // 打印哈夫曼树 static void PrintHuffmanTree(HuffmanNode node, string indent = "") { if (node != null) { Console.WriteLine(indent + node.Freq); if (node.Left != null) { PrintHuffmanTree(node.Left, indent + " "); } if (node.Right != null) { PrintHuffmanTree(node.Right, indent + " "); } } } } } ``` 该程序首先定义了一个 `HuffmanNode` 类来表示哈夫曼树节点,包括字符、频率和左右子树。然后定义了 `BuildHuffmanTree` 函数来构造哈夫曼树,该函数接受两个数组作为输入,分别为字符和频率。函数首先根据字符和频率构造叶子节点,然后将这些节点作为初始节点列表,循环进行以下操作:从节点列表中选取频率最小的两个节点作为左右子节点,生成一个新的父节点,将父节点加入节点列表中。最终生成的哈夫曼树即为节点列表中的唯一节点,函数返回该节点。这个构造哈夫曼树的过程与教材上的描述相同。 接下来定义了 `GenerateHuffmanCode` 函数来生成哈夫曼编码,该函数接受哈夫曼树的根节点作为输入。函数通过深度优先遍历哈夫曼树,将从根节点到每个叶子节点的路径表示为 0 或 1 的编码,保存在一个字典中,键为字符,值为该字符的编码。这个生成哈夫曼编码的过程与教材上的描述相同。 最后在 `Main` 函数中定义了两个数组作为测试输入,然后调用 `BuildHuffmanTree` 和 `GenerateHuffmanCode` 函数,最终输出生成的哈夫曼树和哈夫曼编码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

暄踽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值