Day04
方法重载
- 调用者需要解决同一个问题,记忆大量方法
- 在不同条件下,解决同一类问题,让调用者仅仅记忆1个方法。--所以使用方法重载
定义 :方法名称相同,参数列表不同(名字是一个,参数不一样)
- 两个方法名称相同,但参数列表不同。
- 用于在不同条件下解决同一类型的问题
- 仅仅 out 与 ref 的区别不可以构成重载
方法重载的例子
//1.根据分钟数 计算 总秒数
//2.根据分钟数 小时数 计算总秒数
//3.根据分钟数 小时数 天数 计算总秒数
private static int GetTotalSecondByMinute(int minute)
{//分钟->秒
return minute * 60;
}
private static int GetTotalSecondByMinute(int minute, int hour)
{//小时->分钟
return GetTotalSecondByMinute(minute + hour * 60);
}
private static int GetTotalSecondByMinute(int minute, int hour, int day)
{//小时->分钟
return GetTotalSecondByMinute(minute, hour + day * 24);
}
递归
方法内部又调用自身的过程
- 核心思想:将问题转移给范围缩小的子问题
- 适用性:在解决问题的过程中,又遇到相同的问题
- 优势:将复杂的问题简单化
- 缺点:性能差
- 注意:无限递归就是栈的溢出
计算阶乘(请使用递归算法实现)
static void Main(string[] args)
{
}
private static int GetFactorial(int num)
{
if (num == 1)
return 1;
//方法内部又调用自身的过程
//核心思想 : 将问题转移给范围缩小的子问题
return num * GetFactorial(num - 1);
//2 *2 -1
//return先执行方法,然后执行完方法再去与num相乘
}
编写一个函数,计算当参数为8时的结果为多少(请使用递归实现)
1-2+ 3-4+ 5 - 6
static void Main(string[] args)
{
int result=GetValue(9);
Console.WriteLine(result);
}
private static int GetValue(int num)
{
if (num == 1) return 1;//这行注释了的话就是无限递归死循环
if (num % 2 == 0)
return GetValue(num - 1) - num;
else
return GetValue(num - 1) + num;
}
数组
什么是数组
元素通过索引(位置的序号)进行操作 – 第一位是0,最后一位是总数减一
一旦数组创建成功就装数据(数据的默认值)
初始化+赋值,声明+赋值
static void Main()
{
//声明
int[] a;
//初始化 new 数据类型[容量]
a = new int[6];
//通过索引读写每个元素
a[0] = 1;//将数据1赋值给数组的第1个元素
a[1] = 2;//将数据2赋值给数组的第2个元素
a[3] = 3;//将数据3赋值给数组的第4个元素
//Console.WriteLine(a[0]);
//Console.WriteLine(a[1]);
//Console.WriteLine(a[5]);
for (int i = 0; i < a.Length; i++)
{
Console.WriteLine(a[i]);
}
}
- Ctrl+"."改名字
- F11调试
案例一 在控制台中录入学生成绩float[]
“请输入学生总数 :”new float[5]
请输入第1个学生成绩 :”
要求:如果成绩不在0–100之间,则提示成绩有误
static void Main()
{
float[] scoreArray = CreateScoreArray();
float max = GetMax(scoreArray);
Console.WriteLine("最高分为 :" + max);
}
static float[] CreateScoreArray()
{
Console.WriteLine("请输入学生总数 :");
int count = int.Parse(Console.ReadLine());
float[] scoreArray = new float[count];
for (int i = 0; i < scoreArray.Length;)
{
Console.WriteLine("请输入第{0}个学生成绩 :", i + 1);
float score = float.Parse(Console.ReadLine());
if (score >= 0 && score <= 100)
scoreArray[i++] = score;
else
Console.WriteLine("成绩有误");
}
return scoreArray;
}
//定义查找数组元素最大值的方法
private static float GetMax(float[] array)
{
//假设第一个元素为最大值
float max = array[0];
//依次与后面元素进行比较
for (int i = 1; i < array.Length; i++)
{
//如果发现更大的元素
if (max < array[i])
max = array[i];//替换最大值
}
return max;
}
数组其他写法
- 初始化 + 赋值(数字可以删除,但前后数据类型要一致)
string[] array01 = new string[2] { "a", "b" };
- 声明 + 初始化 + 赋值
bool[] array02 = { true, false, false };
三种相同的写法
float[] temp = new float[3];
temp[0] = 1;
temp[1] = 3;
temp[2] = 7;
float max = GetMax(temp);
float[] temp = new float[3] { 1, 3, 7 };
float max = GetMax(temp);
float max = GetMax(new float[3] { 1, 3, 7 );
案例二 定义方法: 根据年月日,计算当天是本年的第几天
2016年3月5日
累加1、2 正月天数 31 + 29
再累加 当月 天数+5
提示: 将每月天数存储到数组中
private static int GetTotalDays(int year, int month, int day)
{
int[] daysOfMonth = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
//如果闰年,2月为29天
if (IsLeapYear(year)) daysOfMonth[1] = 29;
int days = 0;
//month 3
for (int i = 0; i < month - 1; i++)
{//0 1
days += daysOfMonth[il;
}
days += day;
return days;
}
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;
}
将数组里面的所有元素写到控制台里面
static void Main()
{
int[] array = new intll { 3, 465, 56, 76, 78, 990, 5);
//将数组每个元素显示到控制台中
//1.正序
for (int i = 0; i < array.Length; i++)
{ //0 12 3 4 5 ......
Console.WriteLine(array[i]);
}
//......5 4 3 2 1 0
//2.倒序
for (int i = array.Length - 1; i >= 0; i--)
{
Console.WriteLine(array[i]);
}
}
访问数组元素
通过索引访问
可以通过数组的索引(位置的序号)进行读写操作
例如:
stringl] array = new stringl]{"a","b","c"};
Console.WriteLine(array[0]);--获取数组第一个元素
Console.WriteLine(array[2]);--获取数组第三个元素
通过for遍历
- 遍历:按照某种顺序访问每一个元素。
- for循环遍历数组元素,正序输出到控制台中:
stringl] array = new string[]{"a","b","c"};
for(int i =0;i<array.Length;i++)//正序
//for(int i<array.Length-1;i>=0;i--)//倒序
{
Console.WriteLine(array[i]);
}
通过foreach遍历
从头到尾 依次 读取 数组元素滴
优点:使用简单
- foreach 是一种更简单更明了的读取数组元素的语句。
- 局限性:
–只能读取全部元素(语句本身)
–不能修改元素
–只能遍历实现l enumerable 接口的集合对象 - 语 法 :
foreach(元素类型变量名 in 数组名)
{
变量名表示数组中的每个元素
}
foreach (int item in array)
{
Console.WriteLine(item);
}
推断类型 :var
推断类型 : 根据所赋数据,推断出类型
适用性: 数据类型名称较长
var v1 = 1;//int
var v4 = true;//bool
var v5 = 1.0;//double
foreach (var item in array)
{
}
声明父类类型赋值 子类对象
Array arr01 = new int[2];
Array arr02 = new double[2];
Array arr03 = new string[1];
PrintElement(new int[] { 12, 34, 5, 6 });
PrintElement(new float[] { 12, 34, 5, 6 });
声明object类型 赋值 任意类型
object o1 = 1;
object o2 = true;
object o3 = new int[3];
//定义方法,将数组所有元素显示到控制台中
private static void PrintElement(Array arr)
{
foreach (var item in arr)
{
Console.WriteLine(item);
}
}
每日一练(购买彩票)
- 在控制台中购买彩票的方法int[7]
"请输入第1个红球号码”
"号码不能超过1 – 33”"当前号码已经存在 - 随机产生一注彩票的方法int[7]
random.Next(1,34)
要求 : 红球号码不能重复,且按照从小到大排序 - 两注彩票比较的方法,返回中奖等级
先计算红球、蓝球中奖数量
在Main中测试
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Day05
{
class Program
{
/*(1)在控制台中购买彩票的方法int[7]
"请输入第1个红球号码”
"号码不能超过1 -- 33”"当前号码已经存在
(2)随机产生一注彩票的方法int[7]
random.Next(1,34)
要求 : 红球号码不能重复,且按照从小到大排序
(3)两注彩票比较的方法,返回中奖等级
先计算红球、蓝球中奖数量
在Main中测试
*/
private static int[] BuyTicket()
{
int[] ticket = new int[7];
//前6个红球
for (int i = 0; i < 6;)
{
Console.WriteLine("请输入第[0]个红球号码 :", i + 1);
int redNumber = int.Parse(Console.ReadLine());
if (redNumber < 1 || redNumber > 33)
Console.WriteLine("购买的号码超过范围");
else if (Array.IndexOf(ticket, redNumber) >= 0)
Console.WriteLine("号码已经存在");
else
ticket[i++] = redNumber;
}
// 第7个蓝球
while (true)
{
Console.WriteLine("请输入蓝球号码 :");
int blueNumber = int.Parse(Console.ReadLine());
if (blueNumber >= 1 && blueNumber <= 16)
{
ticket[6] = blueNumber;
break;
}
else
Console.WriteLine("号码超过范围");
}
return ticket;
}
//2
static Random random = new Random();
private static int[] CreateRandomTicket()
{
int[] ticket = new int[7];
for (int i = 0; i < 6; i++)
{
int redNumber = random.Next(1, 34);
//redNumber在数组中不存在
if (Array.IndexOf(ticket, redNumber) < 0)
ticket[i++] = redNumber;
}
ticket[6] = random.Next(1, 17);
//红球号码排序
Array.Sort(ticket, 0, 6);
return ticket;
}
private static int TicketEquals(int[] myTicket, int[] randomTicket)
{
//计算红球 、蓝球中奖数量
int blueCount = myTicket[6] == randomTicket[6] ? 1 : 0;
int redCount = 0;
//我的第1个红球号码,在随机彩票中的红球号码中是否存在
//myTicket[0]randomTicket
for (int i = 0; i < 6; i++)
if (Array.IndexOf(randomTicket, myTicket[i], 0, 6) >= 0)
redCount++;
int level;
if (blueCount + redCount == 7)
level = 1;
else if (redCount == 6)
level = 2;
else if (redCount + blueCount == 6)
level = 3;
else if (redCount + blueCount == 5)
level = 4;
else if (redCount + blueCount == 4)
level = 5;
else if (blueCount == 1)
level = 6;
else
level = 0;
return level;
}
private static void Main()
{
int[] myTicket = BuyTicket();
int level;
int count = 0;
do
{
count++;
int[] randomTicket = CreateRandomTicket();
level = TicketEquals(myTicket, randomTicket);
if (level != 0)
Console.WriteLine("恭喜,{0}等奖。累加消费 :{1:c}元", level, count * 2);
} while (level != 1);
}
}
}