C# 课堂总结5-数组

时间:2020-11-30 14:27:11

一、

数组:解决同一类大量数据在内存存储和运算的功能。

1、一维数组
定义:制定类型,指定长度,指定名称。
int[] a=new int[5]
int[] a=new int[5]{23,23,23,1,2,1}
int[] a=new int[]{45,23,34}会把前三个值赋值,后两个元素保持默认值0.
int[] a=new int[]{34,234,5,3,4,23};

取值:
数组名[下标值]

数组的优点:
1.对于大量数据来说,保存的时候,定义一个数组即可解决。
2.用循环来控制数组的下标,可以对数组进行批量操作。
eg.
int[] a=new int[5];
//数组的批量赋值
for(int i=0;i<5;i++)
{
a[i]=(i+1)*4;
}
//数组的批量取值
for(int j=0;j<5;j++)
{
console.writeline(a[j]);
}

案例一:做一个教练为10个球员打分的程序。

  //eg.7  球员成绩打分
static void Main7(string[] args)
{
int[] a=new int[];
int sum = ;
double aver = 0.0;
//Console.WriteLine("请输入球员成绩的总个数:");
//int n=int.Parse(Console.ReadLine()); for (int i = ; i < a.Length; i++)
{
Console.WriteLine("请输入第"+(i+)+"个球员的成绩:");
a[i] = Convert.ToInt32(Console.ReadLine());
} for (int i = ; i <= a.Length - ; i++)
{
for (int j = ; j <= a.Length - i; j++)
{
if (a[j - ] < a[j])
{
int t = a[j - ];
a[j - ] = a[j];
a[j] = t;
}
}
} foreach (int e in a)
{
Console.Write(e+"\t");
} for (int i = ; i < a.Length - ; i++)
{
sum += a[i];
} aver = sum / (a.Length - ); Console.WriteLine("该选手的平均成绩是{0}。",aver);
}

数组的应用
一、冒泡排序
1.冒泡排序是用双层循环解决。外层循环的是趟数,里层循环的是次数。
2.趟数=n-1;次数=n-趟数。
3.里层循环使用if比较相邻的两个数的大小。进行数值交换。

程序如下

 static void Main2(string[] args)
{
int[] a = new int[] { , , , , , , , };
for (int i = ; i <= a.Length - ; i++)//趟数
{
for (int j = ; j <= a.Length - i - 1; j++)//次数, 趟数+次数==数组个数,a.Length - i,每趟都有沉到底的一个不用再排
{
if (a[j - ] < a[j])
{
int t = a[j - ];
a[j - ] = a[j];
a[j] = t;
}
}
}
//显示
for (int k = ; k < a.Length; k++)
{
Console.WriteLine(a[k]);
}
Console.ReadKey();
}

二、折半查找
前提:数组必须是有序的
思路:用两个变量分别代表上限(top)和下限(bottom)的下标,再用一个变量代表中间的下标(mid)。
1.求中间的下标:mid=(top+bottom)/2
2.上限下标下移:top=mid+1.假设数组是升序排列。
3.下限下标上移:bottom=mid-1.
4.循环条件是:bottom>=top

程序如下:

 //折半查找
static void Main3(string[] args)
{
int[] d = new int[] { , , , , , , , };
Console.Write("请输入要查找的数字:");
int find = Convert.ToInt32(Console.ReadLine());
int top = ;
int bottom = d.Length - ;
int mid;
while (top <= bottom)
{
//取中间的坐标
mid = (bottom + top) / ;
//取中间的值
int n = d[mid];
if (find > n)
{
top = mid + ;
}
else if (find < n)
{
bottom = mid - ;
}
else
{
Console.WriteLine("你找到了该数字,在第" + (mid + ) + "个");
break;
}
}
Console.ReadKey();
}

二维数组

eg.1推箱子

 //eg.6 推箱子 自己做
static void Main6a(string[] args)
{
//定义地图
#region 定义地图,初始化坐标
int[,] a = new int[, ]{
{,,,,,,,,,},
{,,,,,,,,,},
{,,,,,,,,,},
{,,,,,,,,,},
{,,,,,,,,,},
{,,,,,,,,,},
{,,,,,,,,,},
{,,,,,,,,,},
{,,,,,,,,,},
{,,,,,,,,,}};
int x, y, t, m, n, k;
x = ; y = ;
m = ; n = ;
#endregion #region 显示地图
//把地图显示,必须显示地图,否则会有等待按键的延时!
Console.Clear();//清屏
for (int i = ; i < ; i++)
{
for (int j = ; j < ; j++)
{
//Console.ForegroundColor = ConsoleColor.White; if (a[i, j] == )
Console.Write("♀");
else if (a[i, j] == )
Console.Write(" ");
else if (a[i, j] == )
{
//Console.ForegroundColor = ConsoleColor.Red;
Console.Write("☆");
// Console.ForegroundColor = ConsoleColor.White;
}
else if (a[i, j] == )
Console.Write("■");
else
Console.Write("□");
}
Console.WriteLine();
}
#endregion while (a[,]!=)
{ ConsoleKeyInfo s = Console.ReadKey(); #region 向右移动
if ((s.Key.ToString() == "RightArrow"))
{
t = a[x, y];
k = a[m, n]; //小人走的下一步有3种情况:是不是墙?是不是箱子?是不是终点?
if (a[x, y + ] != && a[x, y + ] != && a[x, y + ] != )
{
a[x, y] = a[x, y + ];
a[x, y + ] = t;
y++;
} else if (a[x, y + ] == )//小人的下一步如果是箱子的话
{
if (a[m, n + ] != && a[m, n + ] != )//箱子的下一步只有墙,终点 这两个分支
{
//箱子移动后的改变
a[m, n] = a[m, n + ];
a[m, n + ] = k;
n++; //人移动后的替换
a[x, y] = a[x, y + ];
a[x, y + ] = t;
y++;
}
else if (a[m, n + ] == )//箱子的下一步是墙,空操作,不动
{
Console.WriteLine("\a");
}
else if (a[m, n + ] == )//箱子的下一步 是 终点
{
a[x, y + ] = ;
a[x, y + ] = ;
a[x, y] = ;
//y++;
//m++;
} } else if (a[x, y + ] == || a[x, y + ] == )//小人的下一步如果是墙或者终点的话
{
Console.WriteLine("\a");
}
}
#endregion #region 向上移动
else if ((s.Key.ToString() == "UpArrow"))
{
t = a[x, y];
k = a[m, n]; //小人走的下一步有3种情况:是不是墙?是不是箱子?是不是终点?
if (a[x - , y] != && a[x - , y] != && a[x - , y] != )
{
a[x, y] = a[x - , y];
a[x - , y] = t;
x--;
} else if (a[x - , y] == )//小人的下一步如果是箱子的话
{
if (a[m - , n] != && a[m - , n] != )//箱子的下一步只有墙,终点 这两个分支
{
//箱子移动后的改变
a[m, n] = a[m - , n];
a[m - , n] = k;
m--; //人移动后的替换
a[x, y] = a[x - , y];
a[x - , y] = t;
x--;
}
else if (a[m - , n] == )
{ }
else if (a[m - , n] == )
{
a[m, n] = a[x - , y] = ;
a[m - , n] = ;
a[x, y] = ;
m--;
y--;
}
} else if (a[x - , y] == || a[x - , y] == )//小人的下一步如果是墙或者终点的话
{ }
}
#endregion #region 向下移动
else if ((s.Key.ToString() == "DownArrow"))
{
t = a[x, y];
k = a[m, n]; //小人走的下一步有3种情况:是不是墙?是不是箱子?是不是终点?
if (a[x+, y] != && a[x+, y] != && a[x+, y] != )
{
a[x, y] = a[x+, y];
a[x+, y] = t;
x++;
} else if (a[x + , y] == )//小人的下一步如果是箱子的话
{
if (a[m + , n] != && a[m + , n] != )//箱子的下一步只有墙,终点 这两个分支
{
//箱子移动后的改变
a[m, n] = a[m + , n];
a[m + , n] = k;
m++; //人移动后的替换
a[x, y] = a[x + , y];
a[x + , y] = t;
x++;
}
else if (a[m + , n] == )
{ }
else if (a[m + , n] == )
{
a[m, n] = a[x+, y] = ;
a[m+, n] = ;
a[x, y] = ;
m++;
y++;
}
} else if (a[x + , y] == || a[x + , y] == )//小人的下一步如果是墙或者终点的话
{ }
}
#endregion #region 向左移动
else if ((s.Key.ToString() == "LeftArrow"))
{
t = a[x, y];
k = a[m, n]; //小人走的下一步有3种情况:是不是墙?是不是箱子?是不是终点?
if (a[x, y - ] != && a[x, y - ] != && a[x, y - ] != )
{
a[x, y] = a[x, y - ];
a[x, y - ] = t;
y--;
} else if (a[x, y - ] == )//小人的下一步如果是箱子的话
{
if (a[m, n - ] != && a[m, n - ] != )//箱子的下一步只有墙,终点 这两个分支
{
//箱子移动后的改变
a[m, n] = a[m, n - ];
a[m, n - ] = k;
n--; //人移动后的替换
a[x, y] = a[x, y - ];
a[x, y - ] = t;
y--;
}
else if (a[m, n - ] == )
{ }
else if (a[m, n - ] == )
{
a[m, n] = a[x, y - ] = ;
a[m, n - ] = ;
a[x, y] = ;
n--;
y--;
}
} else if (a[x, y - ] == || a[x, y - ] == )//小人的下一步如果是墙或者终点的话
{ }
}
#endregion #region 显示地图
//把地图显示,必须显示地图,否则会有等待按键的延时!
Console.Clear();//清屏
for (int i = ; i < ; i++)
{
for (int j = ; j < ; j++)
{
//Console.ForegroundColor = ConsoleColor.White; if (a[i, j] == )
Console.Write("♀");
else if (a[i, j] == )
Console.Write(" ");
else if (a[i, j] == )
{
//Console.ForegroundColor = ConsoleColor.Red;
Console.Write("☆");
// Console.ForegroundColor = ConsoleColor.White;
}
else if (a[i, j] == )
Console.Write("■");
else
Console.Write("□");
}
Console.WriteLine();
}
#endregion
}
}
//eg.6 推箱子 老师版
static void Main6b(string[] args)
{
#region 定义地图,初始化坐标
int[,] a = new int[, ]{
{,,,,,,,,,},
{,,,,,,,,,},
{,,,,,,,,,},
{,,,,,,,,,},
{,,,,,,,,,},
{,,,,,,,,,},
{,,,,,,,,,},
{,,,,,,,,,},
{,,,,,,,,,},
{,,,,,,,,,}}; int x = , y = ;//定义坐标的时候不用定义多个,可以用x,y与之关联性相加或相减
#endregion #region 显示地图
//把地图显示,必须显示地图,否则会有等待按键的延时!
//Console.Clear();//清屏
for (int i = ; i < ; i++)
{
for (int j = ; j < ; j++)
{
//Console.ForegroundColor = ConsoleColor.White; if (a[i, j] == )
Console.Write("♀");
else if (a[i, j] == )
Console.Write(" ");
else if (a[i, j] == )
{
//Console.ForegroundColor = ConsoleColor.Red;
Console.Write("☆");
// Console.ForegroundColor = ConsoleColor.White;
}
else if (a[i, j] == )
Console.Write("■");
else
Console.Write("□");
}
Console.WriteLine();
}
#endregion while (a[, ] != || a[, ] != || a[, ] != )
{
ConsoleKeyInfo key = Console.ReadKey(); #region 向右走
if (key.Key.ToString() == "RightArrow")
{
if (y < )//右移最大不会超过y=8坐标
{
if (a[x, y + ] == )//人的下一步只能是空地,或箱子,或墙,或终点,先判断空地,老师选择是==情况,我选的是!=情况,区别
{
a[x, y + ] = ;
a[x, y] = ;
//走过终点后,再让终点恢复出来!
if (a[, ] != )
a[, ] = ;
if (a[, ] != )//当箱子推入终点后,如果人的下一步是空地的话,此时就不能让终点的坐标还显示,而是显示箱子
a[, ] = ;
if (a[, ] != )
a[, ] = ;
y++; }
else if (a[x, y + ] == )//人的下一步是终点
{
a[x, y + ] = ;
a[x, y] = ;
y++;
}
else if (a[x, y + ] == && a[x, y + ] == )//人的下一步是箱子,箱子的下一步是空地
{
a[x, y + ] = ;
a[x, y + ] = ;
a[x, y] = ; if (a[, ] != && a[, ] != )
a[, ] = ;
if (a[, ] != && a[, ] != )//当箱子推入终点后,如果人的下一步是空地的话,此时就不能让终点的坐标还显示,而是显示箱子
a[, ] = ;
if (a[, ] != && a[, ] != )
a[, ] = ; y++;
}
else if (a[x, y + ] == && a[x, y + ] == )//人的下一步是箱子,箱子的下一步是终点
{
a[x, y + ] = ;
a[x, y + ] = ;
a[x, y] = ; if (a[, ] != )
a[, ] = ;
if (a[, ] != )//当箱子推入终点后,如果人的下一步是空地的话,此时就不能让终点的坐标还显示,而是显示箱子
a[, ] = ;
if (a[, ] != )
a[, ] = ; y++;
}
else //其中包括,人的下一步是墙,箱子的下一步是墙
Console.WriteLine("\a");
}
else
Console.WriteLine("\a");
}
#endregion #region 向左走
if (key.Key.ToString() == "LeftArrow")
{
if (y > )//左移最小不会小于y=1坐标
{
if (a[x, y - ] == )//人的下一步只能是空地,或箱子,或墙,先判断空地
{
a[x, y - ] = ;
a[x, y] = ; if (a[, ] != )
a[, ] = ;
if (a[, ] != )//当箱子推入终点后,如果人的下一步是空地的话,此时就不能让终点的坐标还显示,而是显示箱子
a[, ] = ;
if (a[, ] != )
a[, ] = ;
y--;
}
else if (a[x, y - ] == )
{
a[x, y - ] = ;
a[x, y] = ;
y--;
}
else if (a[x, y - ] == && a[x, y - ] == )//人的下一步是箱子
{
a[x, y - ] = ;
a[x, y - ] = ;
a[x, y] = ;
y--;
}
else if (a[x, y - ] == && a[x, y - ] == )//人的下一步是箱子,箱子的下一步是终点
{
a[x, y - ] = ;
a[x, y - ] = ;
a[x, y] = ;
y--;
}
else //其中包括,人的下一步是墙,箱子的下一步是墙
Console.WriteLine("\a");
}
else
Console.WriteLine("\a");
}
#endregion #region 向上走
if (key.Key.ToString() == "UpArrow")
{
if (x > )//上移不能超过x=8坐标
{
if (a[x - , y] == )//人的下一步只能是空地,或箱子,或墙,先判断空地
{
a[x - , y] = ;
a[x, y] = ; if (a[, ] != )
a[, ] = ;
if (a[, ] != )//当箱子推入终点后,如果人的下一步是空地的话,此时就不能让终点的坐标还显示,而是显示箱子
a[, ] = ;
if (a[, ] != )
a[, ] = ; x--;
}
else if (a[x - , y] == )//人下一步是终点,走上去的时候照样替换,走之后,就是人下一步是空地的问题了
{
a[x - , y] = ;
a[x, y] = ;
x--;
}
else if (a[x - , y] == && a[x - , y] == )//人的下一步是箱子,箱子的下一步是空地
{
a[x - , y] = ;
a[x - , y] = ;
a[x, y] = ; if (a[, ] != &&a[, ] != )
a[, ] = ;
if (a[, ] != &&a[, ] != )//当箱子推入终点后,如果人的下一步是空地的话,此时就不能让终点的坐标还显示,而是显示箱子
a[, ] = ;
if (a[, ] != &&a[, ] != )
a[, ] = ; x--;
}
else if (a[x - , y] == && a[x - , y] == )//人的下一步是箱子,箱子的下一步是终点
{
a[x - , y] = ;
a[x - , y] = ;
a[x, y] = ; if (a[, ] != )
a[, ] = ;
if (a[, ] != )//当箱子推入终点后,如果人的下一步是空地的话,此时就不能让终点的坐标还显示,而是显示箱子
a[, ] = ;
if (a[, ] != )
a[, ] = ; x--;
}
else //其中包括,人的下一步是墙,箱子的下一步是墙
Console.WriteLine("\a");
}
else
Console.WriteLine("\a");
}
#endregion #region 向下走
if (key.Key.ToString() == "DownArrow")
{
if (x < )//下移不能超过x=8坐标,只能下走增大,给个上限就可以
{
if (a[x + , y] == )//人的下一步只能是空地,或箱子,或墙,先判断空地
{
a[x + , y] = ;
a[x, y] = ;
if (a[, ] != )
a[, ] = ;
if (a[, ] != )//当箱子推入终点后,如果人的下一步是空地的话,此时就不能让终点的坐标还显示,而是显示箱子
a[, ] = ;
if(a[, ] != )
a[, ] = ;
x++;
}
else if (a[x + , y] == )//解决人不能通过终点坐标问题
{
a[x + , y] = ;
a[x, y] = ;
x++;
}
else if (a[x + , y] == && a[x + , y] == )//人的下一步是箱子,箱子的下一步是空地
{
a[x + , y] = ;
a[x + , y] = ;
a[x, y] = ; if (a[, ] != &&a[, ] != )
a[, ] = ;
if (a[, ] != &&a[, ] != )//当箱子推入终点后,如果人的下一步是空地的话,此时就不能让终点的坐标还显示,而是显示箱子
a[, ] = ;
if (a[, ] != &&a[, ] != )
a[, ] = ; x++;
}
else if (a[x + , y] == && a[x + , y] == )//人的下一步是箱子,箱子的下一步是终点
{
a[x + , y] = ;
a[x + , y] = ;
a[x, y] = ; if (a[, ] != )
a[, ] = ;
if (a[, ] != )//当箱子推入终点后,如果人的下一步是空地的话,此时就不能让终点的坐标还显示,而是显示箱子
a[, ] = ;
if (a[, ] != )
a[, ] = ; x++;
}
else //其中包括,人的下一步是墙,箱子的下一步是墙
Console.WriteLine("\a");
}
else
Console.WriteLine("\a");
}
#endregion #region 重新显示地图(按键之后的地图)
//把地图显示,必须显示地图,否则会有等待按键的延时!
Console.Clear();//清屏
for (int i = ; i < ; i++)
{
for (int j = ; j < ; j++)
{
//Console.ForegroundColor = ConsoleColor.White; if (a[i, j] == )
Console.Write("♀");
else if (a[i, j] == )
Console.Write(" ");
else if (a[i, j] == )
{
//Console.ForegroundColor = ConsoleColor.Red;
Console.Write("☆");
// Console.ForegroundColor = ConsoleColor.White;
}
else if (a[i, j] == )
Console.Write("■");
else
Console.Write("□");
}
Console.WriteLine();
}
#endregion
}
Console.WriteLine("恭喜你过关了!");
Console.ReadLine();
}

eg.2 抽手机号中奖问题

   //eg.8  抽奖游戏
static void Main8(string[] args)
{
Console.WriteLine("请输入要抽奖的手机号的个数:");
int a = int.Parse(Console.ReadLine()); string[] b=new string[a]; for (int i = ; i < b.Length; i++)
{
Console.WriteLine("请输入第"+(i+)+"个手机号:");
b[i] = Console.ReadLine();
} DateTime dt = DateTime.Now;
dt = dt.AddSeconds();
while (true)
{
for (int i = ; i < b.Length;i++ )
{
Console.Clear();
Console.WriteLine(b[i]);
Thread.Sleep(); //break 跳出的只是for 不是 while 循环,错误
//if (dt.ToString("yyyy/MM/ddHHmmss") == DateTime.Now.ToString("yyyy/MM/ddHHmmss"))
//{
// //Console.WriteLine("18753351659");
// break;
//}
//else
//{ //} } if (dt.ToString() == DateTime.Now.ToString())
{
//Console.WriteLine("18753351659");
break;
}
else
{ }
}
//Console.Clear(); 作弊方法
//Console.WriteLine("18753351639");
Console.ReadLine();
}

eg.3 红篮球摇号问题

  //eg.9 摇号 蓝球,红球
static void Main9(string[] args)
{
//int lan = 0;
string[] a = new string[];
Random r = new Random(); //a[0] =Convert.ToString(r.Next(17));
//a[1] = " "; int i = ;
for ( ; i<= a.Length - ; )
{
int b = r.Next();
//if(a.Contains(a[i])),这样就永远返回true类型了
if (a.Contains(b.ToString()))//也可用(!=)i--;来做
{
continue;
}
else
{
a[i] = b.ToString();
i++;
}
} a[] = Convert.ToString(r.Next());
a[] = " "; foreach (string j in a)
{
Console.Write(j+"\t");
}
}

eg.4 投票选举问题(下标的选择 也可由投票的号码来定)

 //eg.5-1 投票 0--代表第一个人候选人,1代表第二个候选人。。。。共5个人(老师版)
static void Main51(string[] args)
{
//
int[] vote = new int[];
for (int i = ; i < ; i++)
{
Console.Write("请第" + (i + ) + "位同学投票(0-4):");
int temp = Convert.ToInt32(Console.ReadLine());
if (temp < || temp > )
{
Console.WriteLine("废票");
continue;
}
else
{
vote[temp]++;
}
} //计算最终得票
int max = , maxSub = ;
for (int i = ; i < vote.Length; i++)
{
//把每位候选人的票数显示出来。
Console.WriteLine("第" + (i + ) + "号候选人的票数是" + vote[i]);
//计算谁得票最多
if (vote[i] > max)
{
max = vote[i];
maxSub = i;
}
}
//显示最终结果
Console.WriteLine("最终投票结果为:" + maxSub + "号候选人当选,当选的票数是" + max + "票。");
Console.ReadKey();
}
//eg.5-2 投票 1--代表第一个人候选人,2代表第二个候选人。。。。共5个人
static void Main52(string[] args)
{
int[] ren = new int[];
int[] vote = new int[]; for (int i = ; i <= ren.Length - ; i++)
{
Console.WriteLine("请第" + (i + ) + "公民投票:");
ren[i] = int.Parse(Console.ReadLine());
if (ren[i] > || ren[i] < )
{
Console.WriteLine("废票,请重投票!");
i--;
continue;
}
else
{
vote[ren[i] - ]++;
}
} int max = vote[];
for (int i = ; i < vote.Length; i++)
{
if (max <= vote[i])
{
max = vote[i];
}
}
Console.WriteLine("最高票数是{0}票", max); for (int i = ; i < vote.Length; i++)
{
if (max == vote[i])
{
//int y = i + 1;
Console.WriteLine("候选人是第{0}位选手。", i + );
}
}
}