C# 练习题 数组结构
排序问题
上午
复习
----------------------------------------------------
1.复习:冒泡排序
问题:有一组数据,排序之前: -1 10 - 20 -30
要求按从小到大的顺序排序
---------------------------------------------------
解答:
1) 排序过程:
第一轮:3次,最大值,冒到最后 10
1) -1 10 不交换 -1 10 - 20 -30
2)10 -20 交换 -1 -20 10 -30
3)10 -30 交换 -1 -20 -30 10
-------------------------------------------------
注:第一轮之后,数组变为: -1 -20 -30 10
-----------------------------------------------
第二轮:2次, -1 -20 -30
1)-1>-20 -20 -1 -30
2) -1>--30 -20 -30 -1
------------------------------------------------
注:第一轮之后,数组变为: -20 -30 -1 10
-----------------------------------------------
第三轮: -20 -30 -1 10
1) -20 > -30 -30
-30 -20 -1 10
-----------------------------------------------
注:第三轮之后,数组变为: -30 -20 -1 10
-----------------------------------------------
2) 总结: 4个数按从小到大的顺序排序,双重for循环排序时:
第1轮:3次
第2轮:2次
第3轮:1次
//注:冒泡排序时,每经过一轮,都会找到那个大的数
第一轮找到最大数,第二轮找到倒数第二个大的数,
第三轮找到倒数第三个大的数
....所以,内层循环循环条件,不用每次都要比较到最后
每次比较一轮后,找到了大数,下次时,就不需要再比较
这个位置上的数字.所以 j < n.Length -1-i
3) 核心代码:
for ( int i = 0 ; i < n.Length-1 ; i++ )//1
{
for( int j = 0 ; j < n.Length-1-i ; j++ )//1 2
{
if( n[j]>n[j+1] )
{
int temp = n[j];
n[j] = n[j+1];
n[j+1] = n[j];
}
}
}
---------------------------------------------------
2.复习二维数组
1) 定义: int[,] score ;
2) 初始化: 元素的个数和每个元素的值
静态:
int[,] score = { {50,60},{60,70},{59,40} }
动态:new
int[,] score = new int[3,2];
3)特点:
1.二维数组的表示:行和列 [行,列]
2. 二维数组中的每个元素描述由行和列配合描述
数组名 [ 行的索引值,列的索引值]
3. 二维数组的遍历
//二维数组的行数
for (int i = 0 ; i < n.GetLength(0) ; i++ )
{ //二维数组的列数
for( int j = 0 ; j <n.GetLength(1); j++ )
{
Console.WriteLine( score[i,j] );
}
}
注: 数组名.GetLength(0)获取的是二维数组有多少行
数组名.GetLength(1)获取的是二维数组有多少列
练习:定义一个3行3列的二维数组,
并求这个二维数组对角线之和.
代码详见:DAY06_01_Array02 工程中的 LianXi2.cs
4) 标准的二维数组,使用场景:
适合规则的多行多列的数据操作: 比如:
三消类的游戏
扫雷游戏
---------------------------------------------------
网站验证码
补充功能: 4个验证中不能有重复的字符
说明:
代码详见:DAY06_01_Array02 项目下:
“网站验证码” 文件夹下的两个类:
CodeHomeWork1.cs --- 未处理重复
CodeHomeWork2.cs --- 处理重复的验证码了
-----------------------------------------------------
下午
方法
方法又称为“函数”
代码重用性,降低冗余度
1.方法的定义
static void Main(string[] args)
{
}
--方法名: Main(),
命名规则:Pascal,每个单单词首字母大写
--方法返回值:void 空,没有任何返回值。除此之外
还可以使用任意值类型,具体使用哪一种类型,根据
方法完成的功能来定义。
表示当执行了这个方法后,有没有
相应的内容返回给调用者。
--参数列表.
当有多个参数时,多个参数之间使用,分隔
这些参数构成参数列表。
参数分别:形式参数 ,又称“形参”
实际参数,又称“实参”
形式参数:指的是方法定义时,在方法名后面的小括号
写的参数。当然,可以写也可以不写;
static void IsNarcNumber( int number )
{ }
上面的方法中就有一个参数,number,形式参数
实际参数:指的是在其它的方法调用某一些方法时,
调用时在方法名后面添加的有实际值的一些参数
至于需要不需要传递参数,要根据方法定义时
来决定的。
int n = 60 ;
IsNarcNumber( n );
注:将实际参数传递给形式参数.在传递过程中,
参数的类型和个数要匹配。否则会报错。
练习:水仙花数 narcissistic number
1000以内所有的水仙花数
要求:写一个方法,该方法用于求1000以内所有水仙花数
方法的名字:FindNarcNumber()
方法的返回值:void
370 153 371 407
370 = 3^3 + 7^3 + 0^3 = 370
代码详见:DAY07_01_Method01 项目下 LianXi1.cs
--------------------------------------------------------
练习2:
在上面类中再来添加一个方法,基本形式:
void IsNarcNumber ( int number )
---该方法的返回值为 void
---方法有一个参数,参数为int类型,名为 number 。
---方法作用:用于判断指定的数字是否是水仙花数。
--方法体:方法中一组大括号中间的代码块内容
方法体中可以写一条语句,可以写多条语句,
也可以一条也不写。
--....
2.方法的调用
方法定义后,在合适的位置就可以去调用。
调用时,如何调用呢?
方法名( ); 或
方法名( 参数列表 );
3.方法返回值
当方法执行结束后,需不需要返回给调用者结果。
如果不需要,定义方法返回值应该写成:void.
如果需要,不能写void,得看具体情况。可以是:
int float double
练习:定义一个工具类,工具类中有几个方法:
完成两个数的四则运算,比如:有负责加法的方法
int Add( int a, int b )
然后在主方法中调用该方法,并打印结果。
代码详见:DAY07_01_Method01 项目下 CalculateUtil.cs
----------------------------------------------------
练习:定义一个数组,并为数组元素赋值,然后
找出数组中的最大值。要求:
定义一个方法:int GetMaxNumber( )
用于查找数组中最大的那个元素。
找到之后,将这个元素的值返回。
思路:
1.准备一个数组
2.找出数组中的最大数
1)定义 max 变量,为max 变量赋值
假定整个数组的第一个元素就是最大值
将第一个元素的值赋值给 max变量
int max = n[0] ;
2) 构建for循环,在循环体中完成:
if语句,拿 max 先跟第一个元素判断,
如果这个元素比max要大,为max 重新赋值
不大,不赋值,继续max值与第二个元素判断
如果第二个元素比max大,max重新赋值
不大,不赋值,继续max值与第三个元素...
max 始终存储都是整个数组的最大值。
3.返回最大数
代码详见:DAY07_01_Method01 项目下 LianXi2.cs
----------------------------------------------------
补充知识点:局部变量 与 全局变量
代码详见:DAY07_01_Method01 项目下 :
VarDemo1.cs
VarDemo2.cs
4.方法的重载
5.out ref params
day07 周三作业
一. 代码题
定义三个方法:(必做)
1) 写一个方法,求一个int和一个float数的和
float sum(int a,float b)
2) 写一个方法,判断键盘输入的这个数是否是8的倍数
bool isEightNumber( int number)
3) 写一个方法,用于求键盘输入的数字的阶乘
long GetFac(int number)
4) 下午已经实现在数组中查找数组的最大值了,
请继续完成功能,查找数组中的最小值。
最后,要求:在Main()方法中调用并进行测试。
二.写出下列程序的运行结果(必做)
class MethodDemo1
{
static void Main(string[] args)
{
int a = 10 ;
Change( a );
Console.WriteLine( a );
}
static void Change( int a )
{
a = 20 ;
}
}
(2)
class MethodDemo2
{
static void Main(string[] args)
{
int a = 10 ; //a是局部变量
Change( a );
Console.WriteLine( a );/10
}
static int Change( int a )
{
a += 20 ; //a =a +20 =30
return a;
}
}
(3)
class MethodDemo3
{
static void Main(string[] args)
{
int a = 10 ;
a = Change( a );
Console.WriteLine( a );
}
static int Change( int b )
{
b+=20 ;
return b;
}
}
三、编程题
1. 考查:数组的应用 (必做)
定义一个3行3列的二维数组,通过随机数为数组元素赋值
随机数(0,10)之间。
要求:找到数组中的最大数和最小数。
提示:二维数组中查找最大数和最小数,和一维数组是
一样的。也是定义max变量,然后构建双重for循环,
在内层循环体中进行判断。
2. 考查:数组的应用 (选做)
定义一个方法,方法用于:
在数组中指定位置插入指定的元素值
int[] num = {1,-100,2,-200,3};
int[] newNum = {*,*,*,*,*,* }
请输入要插入元素的位置:2
请输入要插入元素的值: 4
1.定义一个新数组,新数组长度为原数组长度+1
2.将num数组中所有元素复制到新数组中
int[] newNum = {1,-100,2,-200,3,* }
3.提示用户输入在哪个位置插入元素:2
提示用户插入元素的值:1000
4.最后遍历新数组:
{ 1,-100,2,-200, 3, 0 }
四、拓展分析题。
方法使用经验总结:
当我们使用方法时会发现,要定义一个方法,完成某一个
功能,方法的形式写起来可以有多种,如何找到复用性最
高,且 可读性更强、质量更高的那个方法呢?
一般遵循以下两个规则:
1) 方法只负责完成功能,它表示一段功能代码块的封装,
定义时,只需要给它合适的参数。使用时,调用者只要
按照定义的形式传递合适的实际值即可。
2) 在方法中,一般不要有打印输出等语句。如果真不能
写 打印输出语句,那么如果在方法在计算出了相应
结果,如何将结果告诉调用者呢?----利用返回值。
也就是说,在定义方法时,根据方法完成的功能,尽量给
方法合适的返回值,最好不要是空。
这样的好处是:当调用者调用该方法时,只要传递类型
相同,个数相同的参数,方法就可以帮助我们实现功能,
至于传递的值是多少,其实方法不关心。
方法做完操作之后,会将处理结果返回给调用者。
如果调用者需要结果,则可以定义变量或做其它处理 。
如果不需要,也不会影响程序的健壮性。
下面在Test类中定义了三个方法,完成的功能都是计算两个
数的和。根据方法的使用规则,请分析哪个方法综合是
最合适的,然后在Main()方法中分别调用这几个方法,体会
方法的使用。
class Test
{
static void Main(string[] args)
{
}
static void Add1( int a, int b )
{
int sum = a + b ;
Console.WriteLine( sum );
}
static int Add2( int a, int b )
{
return a + b ;
}
static int Add3( )
{
int a = 10 ;
int b = 20 ;
int sum = a + b ;
Console.WriteLine( sum ); ;
}
}
如何引入BigInteger
注:
如果对一个大的数字求阶乘,long类型接收的结果会变成0,
原因:阶乘结果已经超过了long类型的最大范围。如何解决?
引用 BigInteger 。
第一步:右击当前项目下的“引用”---添加引用,
在打开的对话框中搜索 Numerics 内容,然后将查找到的选中
最后选择“确定”。
第二步:在当前.cs文件的最上面,添加:using System.Numerics;这句话。
第三步:修改 GetFac()方法的返回值类型为:BigInteger,
同时,修改这个方法中定义接收结果的sum变量的类型也是
BigInteger类型。
注:如果Main()方法中需要结果,应该将返回结果的类型也定义
为 BigInteger类型。