一、重载
在不同条件下,解决同一类问题(同一类型)
根据参数区别不同类型
//根据分钟数计算总秒数
//根据分钟数、小时数计算总秒数
//根据分钟数、小时数、天数计算总秒数
private static int GetTotalSecondByMinute(int minute)
{
return minute * 60;
}
private static int GetTotalSecondByMinutehour(int minute,int hour)
{
return GetTotalSecondByMinute(minute+hour*60);
}
private static int GetTotalSecondByMinutehourday(int minute, int hour,int day)
{
return GetTotalSecondByMinutehour(minute,hour+day*24);
}
使用重载
private static int GetTotalSecond(int minute)
{
return minute * 60;
}
private static int GetTotalSecond(int minute, int hour)
{
return GetTotalSecond(minute + hour * 60);
}
private static int GetTotalSecond(int minute, int hour, int day)
{
return GetTotalSecond(minute, hour + day * 24);
}
二、递归
方法内部调用自身的过程
核心思想:将问题转移给范围缩小的子问题
适用性:在解决问题过程中,又遇到相同问题
优势:将复杂的问题简单化
缺点:性能较差(能不用就不用)
注意:堆栈溢出
//计算阶乘
private static int GetFactorial(int num)
{
if(num==1)return 1;
return num*GetFactorial(num-1);
}
//计算参数为8时的结果为多少?(使用递归)
//规律为1-2+3-4+5.......
private static int GetResult(int num)
{
if(num==1) return 1;
if(num%2==0) return GetResult(num-1)-num;
else return GetResult(num-1)+num;
}
三、数组
1、常规定义数组
//声明数组
int[] array;
//初始化 new 数据类型[容量]
array = new int[6];
//通过索引读写每个元素
array[0] = 1;
array[2] = 1;
array[3] = 3;
for (int i = 0; i<array.Length;i++)
{
Console.WriteLine(array[i]);
}
练习:
//在控制台中录入学生成绩float[]
//”请输入学生总数“:”new float[5]“
//”请输入第一个学生成绩:“
//要求:如果成绩不在0-100之间,则提示成绩有误
static float[] CreatScoreArray()
{
Console.WriteLine("请输入学生总数:");
int numByStudents = int.Parse(Console.ReadLine());
float[] gradeByStudents = new float[numByStudents];
for (int i = 0; i < numByStudents;)
{
Console.WriteLine("请输入第{0}个学生成绩", i + 1);
float grade = float.Parse(Console.ReadLine());
if (grade < 0 || grade > 100)
Console.WriteLine("成绩有误");
else
gradeByStudents[i++] = grade;//正确了再加加
}
return gradeByStudents;
}
//定义查找数组元素最大值的方法float[]
private static float GetMax(float[] array)
{
//获取第一个元素
float max = array[0];
for (int i = 1;i < array.Length; i++)
{
if (array[i] > max)
max = array[i];
}
return max;
}
2、数组的其他写法
//初始化+赋值
string[] array01 = new string[2] { "a", "b" };
//声明+初始化+赋值
bool[] array02 = { true, false };
//直接使用
float max = GetMax(new float[] { 5, 3, 7 });
练习:
//定义方法:根据年月日,计算当天是本年的第几天
//先累加整月的天数
//再累加当月天数
//提示:将每月天数存储到数组中
private static bool IsLeapYear(int year)
{
//if ((year % 4 ==0 && year %100 != 0) || year % 400 == 0) return true;
//else return false;
return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
}
private static int GetTotalDays(int year,int month, int day)
{
int[] dayArray = { 31,28,31,30,31,30,31,31,30,31,30,31};
if (IsLeapYear(year)) dayArray[1] = 29;
int todays = 0;
for (int i = 0; i < month - 1; i++)
todays += dayArray[i];
todays += day;
return todays;
}
3、foreach
foreach(元素类型 变量名 in 数组名称)
{
变量名 即 数组中的每个元素
}
从头到尾 依次 读取 数组元素
优点:使用简单
int[] array = new int[] { 1, 2, 3 };
foreach (int item in array)
{
Console.WriteLine(item);
}
4、一些知识点
①var推断类型
根据所赋数据,推断类型
适用性:数据类型名称较长
var v1 = 1;
var v2 = "1";
var v3 = '1';
var v4 = true;
var v5 = 1.0;
②父类类型
声明 父类类型 赋值 子类对象
static void Main(){
Array arr01 = new int[2];
Array arr02 = new double[2];
Array arr03 = new string[2];
PrintElement(new int[] {1,2,3});//方法使用父类参数,调用参数用任意类型子类都行
}
private static void PrintElement(Array arr)
{
foreach(var item in arr)
{
Console.WriteLine(item);
}
}
③object
万类之祖
object o1 = 1;
object o2 = "1";
object o3 = new int[3];
5、常用数组功能
数组长度:数组名.Length
清除元素值:Array.Clear
复制元素:Array.copy 数组名.CopyTo
克隆:数组名.Clone
查找元素:Array.IndexOf Array.LastIndexOf
排序:Array.Sort
反转:Array.Reverse
练习:
//彩票生成器
//红球:1--33 6个 不能重复
//篮球:1--16 1个
(1)在控制台中购买彩票的方法int[7]
”请输入第一个红球的号码“
”号码不能超过1--33“当前号码已经存在“
(2)随机产生一注彩票的方法int[7]
random.Next(1,34)
要求:红球号码不能重复,且按照从小到大顺序排序
(3)两注彩票比较方法,返回中将等级
先计算红球,篮球中将个数
/// <summary>
/// 购买彩票
/// </summary>
/// <returns>彩票号码的数组</returns>
private static int[] BuyLottery()
{
int[] myLotteryNum = new int[7];
for (int i = 0; i < 6;)
{
Console.WriteLine("请输入第{0}个红球的号码",i+1);
Console.WriteLine("号码不能超过1--33");
int redNum = int.Parse(Console.ReadLine());
if (redNum < 1 || redNum > 33)
Console.WriteLine("购买的号码超过范围");
else if(Array.IndexOf(myLotteryNum, redNum) >= 0)
Console.WriteLine("当前号码已存在");
else
myLotteryNum[i++] = redNum;
}
while (true)
{
Console.WriteLine("请输入蓝球的号码");
Console.WriteLine("号码不能超过1--16");
int blueNum = int.Parse(Console.ReadLine());
if (blueNum < 0 || blueNum > 16)
Console.WriteLine("购买的号码超过范围");
else
{
myLotteryNum[6] = blueNum;
break;
}
}
return myLotteryNum;
}
static Random random = new Random();
/// <summary>
/// 产生一注中将的彩票号码
/// </summary>
/// <returns>中将彩票号码数组</returns>
private static int[] WinLottery()
{
int[] WinLotteryNum = new int[7];
for (int i = 0;i < 6;)
{
int item = random.Next(1,34);
if (Array.IndexOf(WinLotteryNum, item) < 0)
WinLotteryNum[i++] = item;
}
WinLotteryNum[6] = random.Next(1,17);
Array.Sort(WinLotteryNum,0,6);
Console.Write("中奖号码为:红球:");
for (int i = 0; i < 6; i++)
Console.Write("{0}\t", WinLotteryNum[i]);
Console.Write("蓝球:");
Console.WriteLine(WinLotteryNum[6]);
return WinLotteryNum;
}
/// <summary>
/// 判断中奖等级
/// </summary>
/// <param name="myLotteryNum">购买的彩票号码数组</param>
/// <param name="winLotteryNum">中奖的彩票号码数组</param>
private static void WinGrade(int[] myLotteryNum,int[] winLotteryNum)
{
//判断中奖红球蓝球数量
//int[] myRedNum = new int[6];
//Array.Copy(myLotteryNum, myRedNum, 6);
//int[] winRedNum = new int[6];
//Array.Copy(winLotteryNum, winRedNum, 6);
int redCount = 0;
for (int i = 0; i < 6;i++)
{
if (Array.IndexOf(winLotteryNum, myLotteryNum[i], 0, 6) > 0)
redCount++;
}
Console.WriteLine("红球中了{0}个",redCount);
int blueCount = myLotteryNum[6] == winLotteryNum[6] ? 1 : 0;
Console.WriteLine("蓝球中了{0}个", blueCount);
//判断是几等奖
if (redCount == 6 && blueCount == 1)
Console.WriteLine("恭喜中一等奖");
else if (redCount == 6 && blueCount == 0)
Console.WriteLine("恭喜中二等奖");
else if (redCount == 5 && blueCount == 1)
Console.WriteLine("恭喜中三等奖");
else if (redCount + blueCount == 5)
Console.WriteLine("恭喜中四等奖");
else if (redCount + blueCount == 4)
Console.WriteLine("恭喜中五等奖");
else if ((redCount == 2 || redCount == 1 || redCount == 0) && blueCount == 1)
Console.WriteLine("恭喜中六等奖");
else Console.WriteLine("很遗憾,没中奖");
}
static void Main()
{
WinGrade(BuyLottery(), WinLottery());
}