一 数组的概述
数组是多个相同类型数据的组合;数组属引用类型;
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];
foreach(int 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;
}
}
}