C#学习之旅--Day04-重载-递归-数组-

一、重载

在不同条件下,解决同一类问题(同一类型)
根据参数区别不同类型

//根据分钟数计算总秒数
//根据分钟数、小时数计算总秒数
//根据分钟数、小时数、天数计算总秒数

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());
}

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秦果

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值