C#学习03---数组-and-Array

介绍C#中数组的用法。

以整型数组为例。

参考了下面链接内容,在此表示对作者的感谢。

https://blog.csdn.net/jia18337935154/article/details/87880529

https://www.runoob.com/csharp/csharp-array-class.html

一、整型数组的定义和遍历

题目要求:输入一个整数N,生成一个大小为N的数组 nums,输入N个整数,从前到后存入 nums,遍历nums,把 nums 中数据从前到后输出到屏幕上,中间用一个空格隔开。

1、输入一行字符串

string s=Console.ReadLine();//

2、把字符串转换为整数

int N;            
N = Convert.ToInt32(s);

3、定义一个大小为N的数组

int[] nums = new int[N];

4、从键盘输入N个整数并存入数组nums

for(int i=0;i<N;i++)
            {
                s = Console.ReadLine();
                nums[i] = Convert.ToInt32(s);

            }

5、遍历数组nums并输出

public static void print(int[] nums)
        {
            foreach(int x in nums)
            {
                Console.Write("{0} ", x);
            }
            Console.WriteLine("\n");
        }

注意:

nums是一个变量,里面存储N个数据的首地址,这N个数据在内存中是连续的,如下图所示:

二、数组的逆转(倒置)

Array.Reverse(nums);
print(nums);

注意:Array是一个类,是所有数组的父类,其中实现了对数组的通用操作。它是超越类型的,无论什么类型都可以。

三、数组的排序(从小到大排列)

Array.Sort(nums);
print(nums);

四、数组的排序(从大到小排列)

Array.Sort(nums, (a, b) =>-a.CompareTo(b));
print(nums);

注意:sort的第二个参数是lamda函数形式:(a, b) =>-a.CompareTo(b)

如果去掉  a.CompareTo(b) 前面的负号,就是默认的按照升序排列。

加上负号,就是降序排列。


五、减少输入的小技巧

从上面例子我们可以看出,每次运行程序,我们都需要输入数据,比较浪费时间。

下面,我们引入随机类Random,随机生成数据,这样就可以不必每次输入数据了。可以节省学习的时间。

1、定义随机对象

Random r = new Random();

2、得到随机数

int x=r.Next();

得到的是[0,32767]之间的整数。

可以用求余数的方法限定随机数范围。

int x=m+r.Next()%n;

就得到[m,m+n)之间的数。

3、一个比较完整的程序

public static void print(int[] nums)
        {
            foreach(int x in nums)
            {
                Console.Write("{0} ", x);
            }
            Console.WriteLine("\n");
        }
        public static void GetRandom(int[] nums)
        {
            Random r = new Random();
            
            for (int i = 0; i < nums.Length; i++)
            {
                nums[i] = r.Next() % 10;
            }
        }
        static void Main(string[] args)
        {
            int N=5;
            int[] nums = new int[N];
            GetRandom(nums);
            Console.WriteLine("新生成的数据:");
            print(nums);

            Console.WriteLine("逆转后:");
            Array.Reverse(nums);
            print(nums);
            Console.WriteLine("按升序排列:");
            Array.Sort(nums);
            print(nums);
            Console.WriteLine("按降序排列:");
            Array.Sort(nums, (a, b) =>-a.CompareTo(b));
            print(nums);
           
        }

一次运行结果:

六、数组名之间赋值

int[] nums = { 1, 3, 2, 6, 4, 5 };
            int[] A;
            A = nums;
            print(nums);
            print(A);

输入结果一模一样。这是因为:

1、在C#中,数组名A、nums是变量;要存储数组第一个元素的地址。

2、A=nums;相当于A和nums中存储的那个地址数据一样。

七、数组之间真正拷贝数据

int[] nums = { 1, 3, 2, 6, 4, 5 };
            int[] A;
            A=(int[])nums.Clone();//复制,克隆
            print(nums);
            print(A);
            A[0] = 999;
            print(nums);
            print(A);

八、限制

 int[] nums;
            int N = 6;
            nums = new int[N];

这样定义的数组nums,一旦new之后,大小就是N。

如果在程序运行过程中,发现N不足,无法容纳到来的数据。

就应该再开辟一个新数组B,大小足够大,把nums中数据拷贝进去,然后再把新数据插入B中。

最后让nums也指向新的空间,即nums=B。

这就是《数据结构》上顺序表的思想。

猜你喜欢

转载自blog.csdn.net/weixin_43917370/article/details/106890098