C# 数组的声明与分配空间

news2024/11/19 3:19:49

一 数组的概述

数组是多个相同类型数据的组合;数组属引用类型

1 一维数组声明

一维数组的声明方式:
int[] a1;注意方括号写到变量名的签名;
double [] b
mydate[] c;

C# 语言中声明的数组时不能指定其长度(数组中元素的个数),例如:
int a[5]; //非法

二 数组初始化

数组定义与未数组元素分配空间并赋值的操作分开进行。

int [] a=new int[3];
a[0]=3;
a[1]=9;
a[2]=8;

mydate []dates;
dates=new mydate[3];
dates[0]=new mydate(22,7,1964);
dates[1]=new mydate(1,1,2000);
dates[2]=new mydate(22,12,1964);

1) 静态初始化

在定义数组的同时就为数组元素分配空间并赋值。
int [] a={3,9,8};也可以写为 int[] a=new int[] {3,9,8};

mydate[] dates={new mydate(22,7,1964),
new mydate(1,1,2000),
new mydate(22,12,1964)
};
注:最后可以多一个都号。如{3,9,8,};

2) 数组元素的默认初始化

数组是引用类型,它的元素相当于类的成员变量,因此数组一经分配空间,其中的每个元****素也被按照成员变量同样的方式呗隐式初始化。
例如:
(数值类型是0,引用类型null)
int [ ] a=new int[5];
//a[3]则是0;

3) 数组元素的引用

数组元素的引用方式
① index为数组元素下标,可以是整型常量或整型表达式。如a[3],b[i],c[6*i];
② 数组元素下班从0开始;长度为n的数组合法下标取值范围:0~n-1;
每个数组都有一个属性Length指明它的长度,例如:a.Length指明数组a的长度(元素个数);

4) foreach语句

foreach可以方便地处理数组、集合中各元素
如:

int[] ages=new int[10];
foreachint age in ages)
{
    //...
}

foreach 是只读式的遍历。

5) 复制数组

Array.Copy方法提供了数组元素复制功能:
//源数组
int[] source={1,2,3,4,5,6};
//目的数组
int[] dest={10,9,8,7,6,5,4,3,2,1};
//复制源数组中从下标0开始的source.length个元素到
//目的数组,从下标0的位置开始存储
Array.Copy(source,0,dest,0,source.Length);

6) 多维数组

二维数组举例:
int[,] a={{1,2,5},{3,4,0},{5,6,7}};
可以用a.GetLenth(0),a.GetLength(1)来获得各个维度的长度;

7)交错数组

C# 中交错数组是数组的数组
int[] []=new int[3][];
t[0]=new int[2];
t[1]=new int[4];
t[2]=newint[3];
在这里插入图片描述
C#中多维数组的声明和初始化应按从高维到低维的顺序进行。
int t1[][]=new int[][4];//非法,这与C++是不一样的;

示例:
筛法求素数

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 筛法求素数
{
    internal class Program
    {
        public static void Main(string[] args)
        {
            int N = 100;
            bool[] a = new bool[N + 1];
            for(int i=2;i<=N;i++)
            {
                a[i] = true;
            }

            for(int i=2;i<N;i++)
            {
                if (a[i])
                    for (int j = i * 2; j <= N; j += i)
                        a[j] = false;
            }

            for (int i = 2; i <= N; i++)
                if (a[i])
                    Console.Write(i + " ");

            Console.ReadKey();
        }
    }
}

排块游戏
要点:
① 按钮的数组;
② 按钮的生产、加入、事件;
③ 按钮的Tag;
④ 函数的书写;
⑤ 注释的书写;
新建一个Winform窗体添加按钮button然后添加如下代码即可;

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace 排块游戏
{
    public partial class Form1 : Form
    {
        const int N = 4;//按钮的行、列数
        Button[,] buttons = new Button[N, N];//按钮的数组

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //生成所有按钮
            GenerateAllButtons();
        }
        /// <summary>
        /// 开始按钮执行打乱顺序
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            shuffle();
        }
        /// <summary>
        /// 打乱顺序
        /// </summary>
        void shuffle()
        {
            //多次随机交换两个按钮
            Random rnd = new Random();
            for (int i = 0; i < 100; i++)
            {
                int a = rnd.Next(N);
                int b = rnd.Next(N);
                int c = rnd.Next(N);
                int d = rnd.Next(N);
                Swap(buttons[a, b], buttons[c, d]);
            }
        }
        /// <summary>
        /// 生成所有的按钮
        /// </summary>
        void GenerateAllButtons()
        {
            int x0 = 10, y0 = 10, w = 45, d = 50;
            for (int r = 0; r < N; r++)
            {
                for (int c = 0; c < N; c++)
                {
                    int num = r * N + c;
                    Button btn = new Button();
                    btn.Text = (num + 1).ToString();
                    btn.Top = y0 + r * d;
                    btn.Left = x0 + c * d;
                    btn.Width = w;
                    btn.Height = w;
                    btn.Visible = true;
                    btn.Tag = r * N + c;//这个数据用来表示它所在行列位置

                    //注册事件
                    btn.Click += new EventHandler(btn_Click);

                    buttons[r, c] = btn;//放到数组中
                    this.Controls.Add(btn);//加到界面上
                }
            }
            buttons[N - 1, N - 1].Visible = false;//最后一个不可见
        }
        /// <summary>
        /// 交换两个按钮
        /// </summary>
        /// <param name="btna"></param>
        /// <param name="btnb"></param>
        void Swap(Button btna, Button btnb)
        {
            string t = btna.Text;
            btna.Text = btna.Text;
            btnb.Text = t;

            bool v = btna.Visible;
            btna.Visible = btnb.Visible;
            btnb.Visible = v;
        }
        /// <summary>
        /// 按钮点击事件处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void btn_Click(object sender, EventArgs e)
        {
            Button btn = sender as Button;//当前点中的按钮
            Button blank = FindHiddenButton();//空白按钮

            //判断是否与空白相邻,如果是,则交换
            if (IsNeighbor(btn, blank))
            {
                Swap(btn, blank);
                blank.Focus();
            }

            //判断是否完成了
            if (ResultIsOK())
            {
                MessageBox.Show("ok");
            }
        }

        Button FindHiddenButton()
        {
            for (int r = 0; r < N; r++)
            {
                for (int c = 0; c < N; c++)
                {
                    if (!buttons[r, c].Visible)
                    {
                        return buttons[r, c];
                    }
                }
            }
            return null;
        }
        /// <summary>
        /// 判断是否相邻
        /// </summary>
        /// <param name="btnA"></param>
        /// <param name="btnB"></param>
        /// <returns></returns>
        bool IsNeighbor(Button btnA, Button btnB)
        {
            int a = (int)btnA.Tag;//Tag中记录是行列位置
            int b = (int)btnB.Tag;
            int r1 = a / N, c1 = a % N;
            int r2 = b / N, c2 = b % N;

            if (r1 == r2 && (c1 == c2 - 1 || c1 == c2 + 1)
                || c1 == c2 && (r1 == r2 - 1 || r1 == r2 + 1))左右相邻
            {
                return true;
            }
            return false;
        }
        /// <summary>
        /// 检查是否完成
        /// </summary>
        /// <returns></returns>
        bool ResultIsOK()
        {
            for (int r = 0; r < N; r++)
            {
                for (int c = 0; c < N; c++)
                {
                    if (buttons[r, c].Text != (r * N + c + 1).ToString())
                        return false;
                }
            }
            return true;
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/81018.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【RPA进阶】 一文了解使用Visual Studio扩展UiPath Activity Creator创建自定义Activity

&#x1f40b;作者简介&#xff1a;博主是一位.Net开发者&#xff0c;同时也是RPA和低代码平台的践行者。 &#x1f42c;个人主页&#xff1a;会敲键盘的肘子 &#x1f430;系列专栏&#xff1a;UiPath &#x1f980;专栏简介&#xff1a;UiPath在传统的RPA&#xff08;Robotic…

Dockerfile构建Springboot镜像

Dockerfile构建Springboot镜像 文章目录Dockerfile构建Springboot镜像简介实例演示前期准备Docker环境Springboot项目Dockerfile文件Windows要求构建镜像启动测试Linux要求构建镜像启动测试简介 容器技术大流行的时代&#xff0c;也是docker大流行的时代。 此文章以一个简单的实…

无线网卡收包流程

环境 x86_64 Linux&#xff0c; AR9462 无线网卡&#xff0c;PCIe 接口 ath9k 驱动 收包过程 ① 无线网卡从空气中捕获到无线数据包 【物理层】 ② 无线网卡把帧 DMA 到内存的 Ring Buffer ③ 无线网卡向 CPU 发起中断请求 ④ CPU 响应中断&#xff0c;执行 ISR&#xff0c;…

fatfs相关宏定义说明

fat16文件系统DBR 宏定义如下&#xff1a; #define BS_JmpBoot 0 //跳转指令。3字节。/* x86 jump instruction (3-byte) */ #define BS_OEMName 3 //OEM名称。8字节。/* OEM name (8-byte) */ #define BPB_BytsPerSec 11 //扇区字节数。2字节。/* Sector size [byte…

Python学习基础笔记四十五——包

C:\Program Files\Python310\Lib 1、 包的概念&#xff1a;把解决同一类问题的模块放在同一个文件夹里&#xff0c;我们就称为包。 2、在PyCharm中创建一个包&#xff1a; 文件夹中会有一个init.py文件。 在Python3中没有这个__init__.py文件也没有问题。 3、在包A和包B下有同…

Go设计与实现 -- map哈希表

Go语言中的哈希表有它自己的一套实现方式。和Java的哈希表还是有些不同的&#xff0c;但是为了保证知识体系的完整性&#xff0c;我还是准备从头开始说起。 哈希表设计原理 哈希表的读写时间复杂度是O(1)&#xff0c;因为它提供了键值之间的映射。要实现一个性能优异的哈希表…

spring——AOP面向切面编程——基于XML的AspectJ AOP开发(转载)

我们可以在 Spring 项目中通过 XML 配置&#xff0c;对切面(Aspect 或 Advisor)、切点(PointCut)以及通知(Advice)进行定义和管理&#xff0c;以实现基于 AspectJ 的 AOP 开发。Spring 提供了基于 XML 的 AOP 支持&#xff0c;并提供了一个名为“aop”的命名空间&#xff0c;该…

Docker笔记--使用Docker部署MySQL

1--Docker部署MySQL ① 搜索MySQL镜像 docker search mysql ② 拉取MySQL镜像 docker pull mysql:latest ③ 创建MySQL容器 首先在宿主机创建MySQL的映射目录&#xff0c;即数据卷&#xff1a; cd /home mkdir mysql cd mysql 之后在当前目录创建MySQL容器&#xff08;$PW…

【事故复盘】吐血整理一场线上事故——CPU飙升200%

&#x1f50d; 经验使你在第二次犯相同错误时及时发现。 —— 琼斯 &#x1f516; 事故时间&#xff1a;12.7日 17:43 ~ 21:03 &#x1f516; 事故影响&#xff1a;服务接口查询慢&#xff0c;用户查看数据转圈 &#x1f516; 事故过程&#xff1a; 那是一个宛如平静的下午&…

128-150-mysql-高级篇-索引及调优篇

115-mysql-高级篇-索引及调优篇&#xff1a; 索引及调优篇 1、索引的创建与设计原则 1. 索引的声明与使用 1.1 索引的分类 从功能逻辑上说&#xff0c;索引主要有 4 种&#xff0c;分别是普通索引、唯一索引、主键索引、全文索引。按照物理实现方式&#xff0c;索引可以分…

BUUCTF Web1

[极客大挑战 2019]EasySQL 试了个万能密码就能上去了 flag: flag{8e685472-02e4-440a-b04e-b0d9b6d9c27f} [HCTF 2018]WarmUp 看源码有个source.php <?phphighlight_file(__FILE__);class emmm{public static function checkFile(&$page){$whitelist ["source&qu…

Mysql 创建存储过程和函数及各种例子

Mysql 创建存储过程和函数及各种例子1. Mysql 创建存储过程1.1 前言知识1.1.1 语法结构1.1.2 简单解释1.2 创建存储过程入门例子1.2.1 无参存储过程1.2.1.1 不带变量1.2.1.2 带变量1.2.2 有入参的存储过程1.2.3 有出参的存储过程1.2.4 有入参和存储的存储过程1.2.5 inout的存储…

如何将镜像上传至阿里云?如何从阿里云中拉取自己的镜像?

目录 如何将制作好的镜像上传至阿里云&#xff1f; 一、前期准备 1、注册阿里云账户 2、登录账号 3、配置Docker加速器 4、创建镜像仓库的命名空间&#xff08;私有的&#xff09; 5.创建镜像仓库(创建镜像仓库时要绑定一个代码托管网站&#xff0c;例如&#xff1a;githu…

Zookeeper集群搭建

文章目录前言Zookeeper集群搭建&#xff08;一&#xff09;LeaderFollower模式&#xff08;二&#xff09;下载zookeeeper的压缩包&#xff08;三&#xff09;解压&#xff08;四&#xff09;修改配置文件&#xff08;五&#xff09;添加myid配置&#xff08;六&#xff09;安装…

痞子衡嵌入式:存储器大厂Micron的NOR Flash芯片特殊丝印设计(FBGA代码)

大家好&#xff0c;我是痞子衡&#xff0c;是正经搞技术的痞子。今天痞子衡给大家讲的是存储器大厂Micron的NOR Flash芯片特殊丝印设计(FBGA代码)。 痞子衡之前写过一篇文章 《J-Flash在Micron Flash固定区域下载校验失败的故事》&#xff0c;这篇文章里提及了 Micron 家的串行…

明峰医疗IPO终止:亏损超过14亿元,王瑶法、潘华素夫妇为实控人

近日&#xff0c;上海证券交易所科创板披露的信息显示&#xff0c;明峰医疗系统股份有限公司&#xff08;下称“明峰医疗”&#xff09;向上海证券交易所提交了撤回上市申请文件的申请&#xff0c;保荐人海通证券提交了撤回保荐的申请。 因此&#xff0c;上海证券交易所决定终…

设计模式之创建型模式---单例模式

文章目录1.介绍2.应用场景3.实现3.1 结构3.2 类图3.3 代码示例3.3.1 饿汉式3.3.2 懒汉式3.3.3 双重检验锁3.3.3 静态内部类实现单例3.3.4 枚举类实现单例总结1.介绍 单例模式(singleton) 是指某个类中能生成一个实例&#xff0c;该类提供了一个全局访问点&#xff0c;提供一个唯…

JUC并发编程与源码分析笔记07-volatile与JMM

被volatile修饰的变量有两大特点 可见性、有序性&#xff0c;但是不保证原子性。 当写一个volatile变量时&#xff0c;JMM会把该线程对应的本地内存中的共享变量值立即刷新回主内存中。当读一个volatile变量时&#xff0c;JMM会把该线程对应的本地内存设置为无效&#xff0c;重…

Java开发:汇编语言

一、为什么学习汇编语言 中国人和中国人沟通需要学习汉语 中国人和美国人沟通在会汉语的基础上还要学习英语 那么&#xff0c;人和机器沟通的话需要学习哪些语言呢&#xff1f; 答案是&#xff1a;人类的语言机器语言 但是&#xff0c;机器语言都是由0和1组成&#xff0c;人类…

opencv图像直方图

灰度直方图&#xff1a;从数学上来说&#xff0c;图像直方图是描述图像的各个灰度级的统计特性&#xff0c;它是图像灰度值的函数&#xff0c;统计图像中各个灰度级出现的次数或频率。从图像上来说&#xff0c;灰度直方图是一个二维图像&#xff0c;横坐标为图像中各个像素点的…