C#基础- 字符串讲解与重载和递归-10

某天晚上老王正在睡觉,忽然惊醒,感觉有点不舒服,第二天到医院看了看,跟医生讲描述:感觉一股无形的力量扼住了喉咙,呼吸困难,脖子后面老有风。医生检查了半天后,得出结论:秋衣穿反了!

========================手动分割线==========================

  • 上节练习答案

首先定义方法:

    class MyClass
    {
        1、交换三个整形变量的值(按由小到大的顺序交换),在 Main方法中输出结果。(要求用ref)
        public void ChangeThree (ref int a, ref int b, ref int c)
        {
            int temp = 0;
            if (a > b) {
                temp = a;
                a = b;
                b = temp;
            }
            if (a > c) {
                temp = a;
                a = c;
                c = temp;
            } 
            if (b > c) {
                temp = b;
                b = c;
                c = temp;
            }
        }
      2、写一个方法,可以将数组按a[0]-a[1]+a[2]- a[3]+a[4]......的格式返回结果,
      在Main方法中调用该方法。 (参数要求用params修饰)
        public int Comput (params int[] arr)
        {
            int sum = 0;
            int s = 0;
            for (int i = 0; i < arr.Length; i++) {
                s = i % 2;
                switch (s) {
                case 0:
                    sum += arr [i];
                    break;
                default:
                    sum -= arr [i];
                    break;
                }
            }
            return sum;
        }
    }

在Main函数中调用:

        static void Main(string[] args)
        {
             1、交换三个整形变量的值(按由小到大的顺序交换),在 Main方法中输出结果。(要求用ref)
            int a = 23, b = 14, c = 5;
            mc.ChangeThree(ref a, ref b, ref c);
            Console.WriteLine("a = {0}, b = {1}, c = {2}", a, b, c);

             2、写一个方法,可以将数组按a[0]-a[1]+a[2]- a[3]+a[4]......的格式返回结果,
            在Main方法中调用该方法。 (参数要求用params修饰)
            int[] arr = { 1, 2, 3, 4, 5 };
            int result = mc.Comput(arr);
            Console.WriteLine(result);
        }

本节首先要讲的是string类型,此类型在之前已经使用过多次,大家应该都是非常熟悉的,那么关于string类型还有那些特殊点,下面我们来进行详细说明。

一、不可变字符串 -- String类型

1.1 是一种特殊的引用类型

            string a = "张三";// 变量a指向了一块内存空间
            string b = a;// 变量b和变量a指向了同一块内存空间
            b = "haha";// 此时,变量b指向了一块新的内存空间

            Console.WriteLine (a);

输出的结果是张三。
那么此时出现了问题,之前我们说string是引用类型,那么引用类型的特点是当其中一个变量的值改变时,另外一个也会跟着改变,因为他们指向的是同一块内存空间。
但是在这里,我们发现a的值并没有改变。这就是string类型的特殊之处,不可变字符串。

1.2 字符串的本质是一个char类型的一维数组,也可以称字符串对象

            char[] arr = { '1', '2', '3' };
            string c = new string (arr);

            Console.WriteLine (c);

            b = c;
            Console.WriteLine (b);

打印结果123

1.3 字符串常用方法

现有两个字符串:

            string a = "lanoumeizi";

            string b = "gebilaohan";

1.3.1 访问字符串中的单个字符

[] 运算符可以用于对 string 的各个字符的只读访问。

           Console.WriteLine (a [2]);// 输出a字符串中的字符'n'

1.3. 2 判断是否包含某个子串

            bool result = a.Contains ("l");// 可以是单个字符或一个字符串

            Console.WriteLine (result);

1.3.3 判断某个子串第一次出现的下标,如果没有则返回-1

            int index = a.IndexOf ("mei");

            Console.WriteLine (index);

1.3.4 判断某个子串最后一次出现的下标,如果没有则返回-1

            index = a.LastIndexOf ('i', 9);

            Console.WriteLine (index);

1.3. 5 设置字符串的宽度,以及宽度不足时填充的方向和填充的字符,如果不给定字符,默认是空格

            a = a.PadLeft (15);

            Console.WriteLine (a);

            b = b.PadRight (20, 's');

            Console.WriteLine (b);

1.3.6 从给定的下标开始删除指定个数的元素,如果不给定个数,就一直删除到最后

            a = a.Remove (1, 2);

            Console.WriteLine (a);

1.3.7 字符串替换

            b = b.Replace ("laohan", "laowang");

            Console.WriteLine (b);

1.3.8 按照给定的字符,将字符串截取成多个子字符串,存储到一个数组中并返回

            string[] arr = b.Split ('a');

            for (int i = 0; i < arr.Length; i++) {
                Console.WriteLine (arr [i]);
            }

1.3.9 全部转成大写

            b = b.ToUpper ();

            Console.WriteLine (b);

1.3.10 从当前 String 对象移除所有前导空白字符和尾部空白字符

            a = a.TrimStart ();

            Console.WriteLine (a);

1.3.11.字符串截取 -- 从给定的下标开始,截取给定长度的,如果不给定长度,默认截取到最后

            a = a.Substring (5);

            Console.WriteLine (a);

练习1:“lanoukeji/weikemu/gaoxinqu/zhengzhou2016”。要求:将字符串中的每个单词分别单独输出到控 制台上;

            string str = "lanoukeji/weikemu/gaoxinqu/zhengzhou2016";
            string[] strArr = str.Split ('/');

            foreach (var temp in strArr) {
                Console.WriteLine (temp);
            }

练习2:有一段文本,“Because of you I never stray to far from the sidewalk Because of you I learned to play on the safe side ”
要求:
1.将文本中的所有you 换成 lanou, to 换成 too
2.统计出此段文本中有多少个单词

            string str = "Because of you I never stray to far from the sidewalk Because of you I learned to play on the safe side";
            str = str.Replace ("you", "lanou");
            str = str.Replace ("to", "too");
            Console.WriteLine (str);

            // 方法一:字符串截取,取数组长度
            string[] strArr = str.Split (' ');
            Console.WriteLine ("count = " + strArr.Length);

            // 方法二:挨个计数
            int count = 0;
            for (int i = 0; i < str.Length; i++) {
                if (str [i] == ' ') {
                    count++;
                    continue;
                }
            }

            count++;// 加上最后一个单词
            Console.WriteLine (count);

二、可变字符串

  • 不需要返回值接收,直接操作的是原字符串所在的地址
  • 引用命名空间 System.Text 可以直接使用 StringBuilder
  • 不可变字符串的部分方法可以适用于可变字符串

2.1引入命名空间

  • 可以直接在Main函数内部写:
 System.Text.StringBuilder mStr = new System.Text.StringBuilder ("Hellow Meizi");
  • 或者在顶部引入System.Text
using System.Text;
  • 然后可以直接:
            StringBuilder mStr = new StringBuilder ("Hellow Meizi");

2.2 方法使用

            // 字符串替换
            mStr.Replace ("zi", "fu");
            Console.WriteLine (mStr);
            // 字符串拼接
            mStr.Append (" hehe");
            Console.WriteLine (mStr);
            // 拼接字符串后,还会拼接一个回车
            // mStr.AppendLine (" nani");
            mStr.Append (" doubi");
            Console.WriteLine (mStr);

三、方法重载

  • 本质:多个方法的方法名一样

  • 作用:可以使方法的调用更加方便

  • 条件:
    1.方法名必须一样
    2.方法中参数列表必须不同(参数类型不同、参数个数不同)

  • 注意:在方法重载中,与返回值类型无关

  • 在调用重载方法时,系统会根据实际参数的类型或数量来推导出最终调用的那个方法

3.1 创建新的文件NewFileTest,在文件中创建命名空间FileTest来实现方法的重载

using System;
// 如何定义一个命名空间
namespace FileTest
{
    // 定义一个类,用于方法的重载
    class MyMath
    {
        // 定义一个用于输出整数的方法
        public void PrintF (int a)
        {
            Console.WriteLine ("整数:" + a);
        }
        // 定义一个用于输出浮点数的方法
        public void PrintF (float b)
        {
            Console.WriteLine ("浮点数:{0:f3}", b);
        }
        // 定义一个用于输出字符的方法
        public void PrintF (char c)
        {
            Console.WriteLine ("字符:" + c);
        }
        // 定义了一个与输出重名,但返回值不同的方法,此时编译错误
        //        public int PrintF(int c) {
        //            return c * 2;
        //        }
    }
}
 //*****************上面的内容在新的文件中填写*************

       在当前的cs文件中引入命名空间FileTest,并添加如下代码
          // 调用输出整数的方法
            MyMath math = new MyMath ();// 如果自定义的类与系统类重名,则需要加上命名空间名
            int a = 10;
            math.PrintF (a);
            float b = 3.3f;
            math.PrintF (b);// 如果PrintF方法没有给定浮点型参数,编译错误
            char c = 'A';
            math.PrintF (c);

练习:创建重载方法,求两个数的乘积,参数类型分别为整形、单精度浮点型、双精度浮点型。

 //定义两个数的乘积(在自定义的命名空间中实现)
        public int Multiply (int a, int b)
        {
            return a * b;
        }

        public float Multiply (float a, float b)
        {
            return a * b;
        }
        public double Multiply (double a, double b)
        {
            return a * b;
        }
        //在当前的cs中调用
            int aa = 2;
            int bb = 3;
            Console.WriteLine (math.Multiply (aa, bb));

四、递归(讲解递归之前,先讲清楚方法的调用过程)

  • 在方法内部调用方法本身
  • 条件:
    1.必须有结束条件;
    2.将大的复杂的问题分解为与原问题类似的问题来解决并且小问题和原问题是一件事情并且更简单

4.1 斐波那契数列

Fibonacci数列是按以下顺序排列的数字: 1,1,2,3,5,8,13,21,34,55,...
如果F0 = 0 并且 F1= 1 那么Fn = Fn-1 + Fn-2 编辑方法计算Fn

  • 在自定义的命名空间里添加如下代码,用来讲解递归
        // 斐波那契数列
        public int Fibonacci (int n) {
            if (n == 1 || n == 0) {
                return 1;
            } else {
                return Fibonacci (n - 2) + Fibonacci (n - 1);
            }
        }
        在当前的CS文件里添加如下代码
        for (int i = 0; i < 10; i++) {
                // i代表得到第几个数字
                Console.Write (math.Fibonacci (i) + " ");
            }
        Console.WriteLine ();

练习:利用递归计算1+2+3+4+...+100的值

  • 先在自定义的命名空间中添加如下代码
   // 利用递归计算1+2+3+4+...+100的值
    public int Sum (int a)
    {
        Console.WriteLine (a);
        if (a <= 1) {
            return 1;
        } else {
            return a + Sum (a - 1);
        }
    }
  • 在当前的CS文件中添加如下代码
    int resul = math.Sum (100);
    Console.WriteLine (resul);

本次讲解就到这里,有关技术问题请小伙伴们添加QQ群:941928511,大家一起探讨!
版权声明:本文为博主原创文章,转载请附上原文出处链接和本声明

你可能感兴趣的:(C#基础- 字符串讲解与重载和递归-10)