C#基础知识--Day04

Day04

方法重载

  1. 调用者需要解决同一个问题,记忆大量方法
  2. 在不同条件下,解决同一类问题,让调用者仅仅记忆1个方法。--所以使用方法重载

定义 :方法名称相同,参数列表不同(名字是一个,参数不一样)

  1. 两个方法名称相同,但参数列表不同。
  2. 用于在不同条件下解决同一类型的问题
  3. 仅仅 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);
}

递归

方法内部又调用自身的过程

  1. 核心思想:将问题转移给范围缩小的子问题
  2. 适用性:在解决问题的过程中,又遇到相同的问题
  3. 优势:将复杂的问题简单化
  4. 缺点:性能差
  5. 注意:无限递归就是栈的溢出
    计算阶乘(请使用递归算法实现)
        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]);
            }
        }
  1. Ctrl+"."改名字
  2. 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;
        }

数组其他写法

  1. 初始化 + 赋值(数字可以删除,但前后数据类型要一致)
string[] array01 = new string[2] { "a", "b" };
  1. 声明 + 初始化 + 赋值
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遍历
  1. 遍历:按照某种顺序访问每一个元素。
  2. 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遍历

从头到尾 依次 读取 数组元素滴
优点:使用简单

  1. foreach 是一种更简单更明了的读取数组元素的语句。
  2. 局限性:
    –只能读取全部元素(语句本身)
    –不能修改元素
    –只能遍历实现l enumerable 接口的集合对象
  3. 语 法 :
    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);
    }
}

每日一练(购买彩票)

  1. 在控制台中购买彩票的方法int[7]
    "请输入第1个红球号码”
    "号码不能超过1 – 33”"当前号码已经存在
  2. 随机产生一注彩票的方法int[7]
    random.Next(1,34)
    要求 : 红球号码不能重复,且按照从小到大排序
  3. 两注彩票比较的方法,返回中奖等级
    先计算红球、蓝球中奖数量
    在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);
        }
    }
}
  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值