昨天习题答案
- 定义一个函数,找出三个数中的最小值
- 定义一个函数,找出三个数中的最大值
- 定义一个函数,计算一个数的 N 次方 Pow(2, 3)返回8
- 定义一个函数,传递一个数组参数(参数列表),找出参数当中的最大值 >FindMax(1,2,3,6,10)返回10
- 定义一个方法,传入一个字符串类型的数组参数,输出倒叙的字符串 ReverseString(“a”, “c”, “e”)返回 “eca”
- 定义一个方法,传入一个字符串类型的数组参数,输出这些字符是否为回文串
一个字符串,正着和倒着是一样的
abcba、12321、121、11、1221
Test(“a”, “b”, “c”) 返回 false
Test(“a”, “b”, “a”) 返回 true
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _01_昨天作业
{
internal class Program
{
static void Main(string[] args)
{
Console.WriteLine(FinMin(1,5,6));
Console.WriteLine(FinMax(1, 5, 6,10));
Console.WriteLine(Phone("15560092945"));
}
static public double FinMin(double a, double b, double c)
{
double min = a < b ? a : b;
min = min < c ? min : c;
return min;
}
static public double FinMax(params double[] numbers)
{
//定义一个变量存储最大值,初始化为负无穷,这样任何数和他相比都大
double MaxNum = double.NegativeInfinity;
for (int i = 0; i < numbers.Length; i++)
{
if (MaxNum < numbers[i])
{
MaxNum = numbers[i];
}
}
return MaxNum;
}
static public double Pow(double baseNum, double count)
{
//注意
double res = 1;
for (int i = 0; i < count; i++)
{
res = res * baseNum;
}
return res;
}
//abc
//a
//cba
public static string ReverseString(string words)
{
string res = "";
for (int i = 0; i < words.Length; i++)
{
res = words[i] + res;
}
return res;
}
public static bool IsPlalindrome(string words)
{
string s = ReverseString(words);
return s == words;
}
public static string Phone(string phone)
{
string res = "";
for (int i = 0; i < phone.Length; i++)
{
if (i >= 3 && i <= 6)
{
res += "*";
}
else
{
res += phone[i];
}
}
return res;
}
}
}
Random类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
namespace _02_Random类
{
internal class Program
{
static void Main(string[] args)
{
//Random 随机数
//计算机中并没有随机这个概念,我们使用代码生成的随机,其实是计算机经过
一系列算法,计算出大量的数字,从中一个个给我们(假随机/伪随机)
//使用场景:抽奖 点名 注册账号 唯一标识符....
//C#中常用的生成随机的方式有三种
//1.Random类,可以根据传入的一个种子,生成一系列的随机数队列,我们可以调用
Next方法,获取这个队列的下一个随机数
//1.1 创建一个随机数队列,并指定种子
Random random = new Random(10);//指定种子为10
//1.2 获取随机数
Console.WriteLine(random.Next());
Console.WriteLine(random.Next());
//可以给Next方法传递参数,指定随机数的范围
Console.WriteLine(random.Next(2)); //小于指定值的非负整数 0 1
Console.WriteLine(random.Next(10)); //小于指定值的非负整数 0-9
Console.WriteLine(random.Next(10,15)); //大于等于10 小于15的随机数
//关于种子
//计算机中的随机数,是根据一系列算法计算出来的,随机数生成的算法需要一个
初始向量,这个种子就是随机数生成的初始向量,
//比如:我们给两个随机队列指定了相同的种子,那么他们两个生成的随机队列也一定是相同的
Random random2 = new Random(100);
Random random3 = new Random(100);
Console.WriteLine($"random2的随机数是{random2.Next()},random3的随机数是{random3.Next()}");
Console.WriteLine($"random2的随机数是{random2.Next()},random3的随机数是{random3.Next()}");
Console.WriteLine($"random2的随机数是{random2.Next()},random3的随机数是{random3.Next()}");
Console.WriteLine($"random2的随机数是{random2.Next()},random3的随机数是{random3.Next()}");
//通常我们不会手动指定随机类的种子(不给他传递参数),C#会自动使用当前系统的时间作为种子
//这个例子会生成10个相同的随机数,因为代码块的执行的速度太快,导致这10个Random类使用了
相同的时间作为种子
for (int i = 0; i < 10; i++)
{
Random random4 = new Random();
Console.WriteLine(random4.Next());
}
//解决方案:将Random类的创建写到循环的外部
Random random5 = new Random();
for (int i = 0; i < 10; i++)
{
Console.WriteLine(random5.Next());
}
//--------------------------------了解-----------------------------
//2.
//GUID: 即Globally Unique Identifier(全球唯一标识符)
//GUID的计算依赖当前的系统时间,计算机的硬件ID码等进行计算,生成128位随机数
无限接近于为唯一的输出
//使用场景:生成产品秘钥 订单号 .....
// GUID 的格式为“xxxxxxxx - xxxx - xxxx - xxxx - xxxxxxxxxxxx”,其中每个 x
是 0 - 9 或 a-f 范围内的一个32位十六进制数。例如:
6F9619FF - 8B86 - D011 - B42D - 00C04FC964FF 即为有效的 GUID 值。
//a27fc3ff-f785-4522-bced-7c0f24f0d0e8
Console.WriteLine(Guid.NewGuid());
// MD5(仅做了解)
// MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),是一种广泛应用的加密算法
被广泛用于确保数据的完整性和安全性。它是一种单向散列函数,在不可逆的情况下将任意长度
的数据映射为128位的哈希值。当输入数据发生变化时,生成的哈希值也随之变化。相同的输入
数据生成相同的哈希值,不同的输入数据生成不同的哈希值。作用是对一段信息(message)生成
信息摘要(message - digest),该摘要对该信息具有唯一性,可以作为数字签名。用于验证文件的
V有效性(是否有丢失或损坏的数据),对用户密码的加密,在哈希函数中计算散列值
在C#中,你可以使用`System.Security.Cryptography`命名空间下的`MD5`类来生成MD5哈希。这里 是一个简单的例子,展示了如何把字符串转换为MD5哈希。
using System;
using System.Text;
using System.Security.Cryptography;
public class MD5Example
{
public static string ComputeMD5Hash(string input)
{
// 使用MD5的时候,首先创建MD5对象
using (MD5 md5 = MD5.Create())
{
// 将输入字符串转换为一个字节序列
byte[] inputBytes = Encoding.ASCII.GetBytes(input);
// 计算字节序列的MD5哈希
byte[] hashBytes = md5.ComputeHash(inputBytes);
// 将字节序列转换为十六进制的字符串
StringBuilder sb = new StringBuilder();
for (int i = 0; i < hashBytes.Length; i++)
{
// 使用"X2"格式化来得到十六进制
sb.Append(hashBytes[i].ToString("X2"));
}
// 返回十六进制字符串
return sb.ToString();
}
}
static void Main()
{
string input = "Hello World!";
string md5Hash = ComputeMD5Hash(input);
Console.WriteLine("MD5 of '" + input + "' is: " + md5Hash);
}
}
这段代码中,`ComputeMD5Hash`方法接受一个字符串作为输入,然后生成它的MD5哈希,
并以字符串形式返回。在`Main`方法中,我们为"Hello World!"字符串生成并输出它的MD5哈希值。
请注意,由于可能存在hash collision(哈希碰撞)和安全问题,MD5不再被建议用于需要高安全性
的场合,如密码存储或其他敏感信息的加密。更安全的做法是使用SHA256或其他更新、更安全的算法。
第三种随机数(参考即可)
//RNGCryptoServiceProvider rcsp = new RNGCryptoServiceProvider();
//byte[] bytes =new byte[10];//创建一个字节数组,用于接收随机数,数字指定随机数的长度
//rcsp.GetBytes(bytes);//生成随机数字符,并且填充到字符数组中
//Console.WriteLine(BitConverter.ToString(bytes));//xx-xx-xx ...
}
}
}
DateTime类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace _03_DateTime类
{
internal class Program
{
static void Main(string[] args)
{
//DateTime类 用来进行时间操作的
//DateTime类型的变量用于存储一个时间
//DateTime.Now属性 用于获取当前系统时间
DateTime time = DateTime.Now;
Console.WriteLine(time);//2024/3/12 11:20:34
//可以通过时间对象的属性获取时间的详情信息
Console.WriteLine("年:"+time.Year);
Console.WriteLine("月:" + time.Month);
Console.WriteLine("日:" + time.Day);
Console.WriteLine("时:" + time.Hour);
Console.WriteLine("分:" + time.Minute);
Console.WriteLine("秒:" + time.Second);
Console.WriteLine("毫秒:" + time.Millisecond);
//DayOfWeek 是一个枚举类型 0表示周日 1表示周一 2表示周二....
Console.WriteLine("今天是周几"+time.DayOfWeek);
//可以转成int
Console.WriteLine("今天是周几" + (int)time.DayOfWeek);
Console.WriteLine("今天是今年的第几天:"+time.DayOfYear);
//把当前时间转为字符串类型 可以有不同的格式
//2024/3/12 2024-03-12 2023.03.12....
Console.WriteLine(time.ToString());//2024/3/12 11:31:57
//DateTime的ToString 方法可以接收一个参数,用于进行时间的格式化
Console.WriteLine(time.ToString("G"));//2024/3/12 11:33:09
Console.WriteLine(time.ToString("s"));//2024-03-12T11:33:31
Console.WriteLine(time.ToString("d"));//2024/3/12
Console.WriteLine(time.ToString("D"));//2024年3月12日
Console.WriteLine(time.ToString("F"));
//格式化的时候,可以使用特殊的字母表示对应的时间
//y 表示年份
//M 表示月份
//d dd 表示日
// ddd dddd 表示周
// h H 表示小时
// m 表示分钟
// s 表示秒
// fff 表示毫秒
Console.WriteLine(time.ToString("yy"));//24 年份的后两位
Console.WriteLine(time.ToString("yyyy"));//2024 完整的年份
Console.WriteLine(time.ToString("今年是yyyy年"));//今年是2024年 可以和普通的字符串一起使用
Console.WriteLine(time.ToString("M"));//3月12日
Console.WriteLine(time.ToString("MM"));//03
Console.WriteLine(time.ToString("MMM"));//3月
Console.WriteLine(time.ToString("MMMM"));//三月
Console.WriteLine(time.ToString("d"));//
Console.WriteLine(time.ToString("dd"));//
Console.WriteLine(time.ToString("今天是d号"));
Console.WriteLine(time.ToString("现在的小时是h"));// 12小时制
Console.WriteLine(time.ToString("现在的小时是H"));// 24小时制
Console.WriteLine(time.ToString("m"));
Console.WriteLine(time.ToString("mm"));
Console.WriteLine(time.ToString("s"));
Console.WriteLine(time.ToString("ss"));
Console.WriteLine(time.ToString("fff"));
Console.WriteLine(time.ToString("ddd"));//周几
Console.WriteLine(time.ToString("dddd"));//星期几
Console.WriteLine(time.ToString("今年是yyyy年MM月dd日HH时mm分ss秒,今天dddd"));
//时间戳
DateTime dateTime = DateTime.Now;
//是指格林威治时间 1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起 到现在的总 秒/毫秒数
Console.WriteLine(new DateTimeOffset(dateTime).ToUnixTimeSeconds());//秒戳
Console.WriteLine(new DateTimeOffset(dateTime).ToUnixTimeMilliseconds());//毫秒戳
//生成目标时间对象
DateTime myTime = new DateTime(2003,3,11,12,32,59);
Console.WriteLine(myTime.ToString());
//while (true)
//{
// Console.Clear();
// Console.WriteLine(DateTime.Now.ToString("今年是yyyy年MM月dd日HH时mm分ss秒,今天dddd"));
// //让代码停止1秒 继续程序
// Thread.Sleep(1000);
//}
}
}
}
时间的计算与对比
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _04_时间的计算与对比
{
internal class Program
{
static void Main(string[] args)
{
//时间的操作
DateTime dateTime =DateTime.Now;
//可以通过调用时间对象的AddXXXX()方法,来修改时间对象中的年月日时分秒
//不会直接修改原来的时间对象,而是返回一个新的对象
dateTime= dateTime.AddYears(1);
dateTime = dateTime.AddMonths(1);
dateTime = dateTime.AddYears(-51);
Console.WriteLine(dateTime.ToString());
//如果需要进行时间的对比 可以直接使用 > < == >= <= 进行比较
if (DateTime.Now<new DateTime(2028,1,1))
{
Console.WriteLine("今天是2008年之前");
}
else
{
Console.WriteLine("今天是2008年之后");
}
//可以直接使用- 进行 时间的计算, 得到TimeSpan类型 表示这个时间的跨度
TimeSpan timeSpan = new DateTime(2026, 1, 1) - DateTime.Now;
Console.WriteLine($"到2026年1月1日还有{timeSpan.Days}天");
Console.WriteLine($"到2026年1月1日还有{timeSpan.TotalSeconds}秒");
}
}
}
String类API
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.WebSockets;
using System.Runtime.DesignerServices;
using System.Text;
using System.Threading.Tasks;
namespace _05_String类API
{
internal class Program
{
static void Main(string[] args)
{
//字符串属性
string a = "abcdf";
//1.可以通过索引获取字符串中某一个字符 索引:从0开始编号
// [0] 获取第一个字符 [1] 获取第二个字符 ....
// char c= a[5];
Console.WriteLine(a[4]);
//2.可以通过Length属性获取字符串的长度 字符串中字符的个数
Console.WriteLine(a.Length);
//字符串内置了很多API(函数),供我们灵活处理字符串
string s1 = "abc";
string s2 = "吴亦凡";
string s3 = "123";
// string s4 = s1+s2+s3;
//1.Concat() 拼接字符串
string s4 = string.Concat(s1, s2, s3);
Console.WriteLine(s4);
//2.Contains() 判断参数字符串是否出现在源字符串中
bool b = s2.Contains("亦凡");
Console.WriteLine(b);
声明一个长度为10的字符数组
char[] chars = new char[10];
//3.CopyTo() 从字符串中复制一部分字符,放到一个字符数组中
//被复制的字符串.CopyTo(被复制开始的索引,复制到的数组,从数组中
第几个索引开始放,复制的个数)
s2.CopyTo(1, chars, 0, 2);
//将char类型的数组转为字符串
string charString = new string(chars);
Console.WriteLine(charString);
string name = "吴亦凡罗志祥";
//4.StartsWith() 判断源字符串是否以参数字符串开头
Console.WriteLine(name.StartsWith("吴"));
Console.WriteLine(name.StartsWith("吴亦"));
Console.WriteLine(name.StartsWith("亦"));
//5.EndsWith() 判断源字符串是否以参数字符串结尾
Console.WriteLine(name.EndsWith("fanfna"));
//6.Equals() 判断源字符串是否和参数字符串完全相同 等于与 ==
Console.WriteLine(name.Equals(s2));
string str1 = "ABCabc123c";
//7.IndexOf()从前向后查询参数字符串首次在源字符串中出现的
索引位置(如果查询不到则返回-1)
Console.WriteLine(str1.IndexOf("a"));
Console.WriteLine(str1.IndexOf("bc"));
Console.WriteLine(str1.IndexOf("c"));
Console.WriteLine(str1.IndexOf("c", StringComparison.OrdinalIgnoreCase));
//2 忽略大小写进行查询(了解)
Console.WriteLine(str1.IndexOf("b", 3));//从3的位置开始查询
Console.WriteLine(str1.IndexOf("B", 3));//-1 因为从3的位置开始查询 后面没有B
//8.LastIndexOf()从后向前查询参数字符串首次在源字符串中出现的索引位置
(如果查询不到则返回-1)
Console.WriteLine(str1.LastIndexOf("c"));
Console.WriteLine(str1.LastIndexOf("c", 8));//从索引8的位置开始向前查询
//9.IndexOfAny()从前向后查询源字符串中首次出现的指定字符数组中任意一个字符的位置
Console.WriteLine(str1.IndexOfAny(new char[] { 'a', 'b', 'c' }));
//10.LastIndexOfAny()从后向前查询源字符串中首次出现的指定字符数组中
任意一个字符的位置
Console.WriteLine(str1.LastIndexOfAny(new char[] { 'a', 'b', 'c' }));
//11.Insert() 在指定的位置插入字符串,生成新的字符串
Console.WriteLine(name.Insert(2, "老王"));
string str2 = "";
//12.IsNullOrEmpty() 判断变量是否为null或者Empty(空字符串)
Console.WriteLine(string.IsNullOrEmpty(str2));
char[] cs = new char[] { 'a', 'b', 'c' };
string[] ss = new string[] { "aa", "bb", "cc" };
//13.Join() 将字符数组或者字符串数组 按照给定的字符拼接成一个字符串
//参数1:用什么字符进行拼接
//参数2:要拼接的数组
Console.WriteLine(string.Join("_",ss));
string str3 = "吴亦凡是劣迹男艺人";
//14.Replace() 替换关键字
Console.WriteLine(str3.Replace("吴","罗"));
Console.WriteLine(str3.Replace("吴", "*"));
Console.WriteLine(str3.Replace("吴亦凡", "***"));
string str4 = "aBDC";
//15.ToUpper() 将小写字母转换为大写字母
Console.WriteLine(str4.ToUpper());
//16.ToLower() 将大写字母转换为小写字母
Console.WriteLine(str4.ToLower());
//17.Remove() 删除
Console.WriteLine(str3.Remove(6));//从索引6的位置开始,删除后面所有的
字符串,返回删除后的字符串
Console.WriteLine(str3.Remove(2, 3));//从索引2的位置开始,删除后面
3个字符,返回删除后的字符串
string str5 = "吴亦凡,罗志祥,李云迪,郑爽,李易峰";
//18.Split() 使用指定的字符 将字符串分割成一个数组
Console.WriteLine(str5.Split(','));
//[吴亦凡,罗志祥 , 云迪,郑爽, 易峰]
string[] strArr = str5.Split(',');
for (int i = 0; i < strArr.Length; i++)
{
Console.WriteLine(strArr[i]);
}
//19.ToCharArray() 将字符串转化为字符数组
//['吴','亦','凡',',']
char[] chars2 = str5.ToCharArray();
//字符串格式化
Console.WriteLine("我是{0}今年{1}岁","名字",18);
//{数字} 表示后续传入的参数
Console.WriteLine(string.Format("我是{0}今年{1}岁", "名字", 18));
//也可以在{}中加上一些其他的字符 {0,10} 表示此处至少占用10个字符的位置
Console.WriteLine(string.Format("我是{0,10}今年{1}岁", "名字", 18));
//:Cn 以货币的格式显示 并保留n位小数
Console.WriteLine(string.Format("我的银行卡{0:C3}", 432789483.3749378));
Console.WriteLine(string.Format("我的银行卡{0:F3}", 432789483.3749378));
//可以对时间进行格式化操作处理,用法和DateTime对象的ToString方法相同
Console.WriteLine(string.Format("我是:{0},现在的时间是{1:yyyy年MM月dd日HH时mm分ss秒}", "姓名", DateTime.Now));
}
}
}
StringBuilder
- String类型在C#中用于保存字符,为引用类型,一旦创建,就不能再进行修改,其底层是根据字符数组(char[])实现的
- StringBuilder表示可变字符字符串类型,其中的字符可以被改变、增加、删除,当向一个已满的StringBuilder添加字符时,其会自动申请内存进行扩容
字符串一旦创建就不可修改大小,每次使用System.String类中的方法之一时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间。在需要对字符串执行重复修改的情况下,与创建新的String对象相关的系统开销可能会非常昂贵。
所以对字符串添加或删除操作不频繁的话,就几个固定的string累加的时候就不需要StringBuilder了,毕竟StringBuilder的初始化也是需要时间的。对字符串添加或删除操作比较频繁的话那就用StringBuilder。
测试代码示例
以5万次循环来统计字符串连接方式,和StringBuilder方式那个耗时更高
//字符串连接方式
System.Diagnostics.Stopwatch stopwatch = new System.Diagnostics.Stopwatch();
stopwatch.Start();
string msg = string.Empty;
for (int i = 0; i < 50000; i++)
{
msg += i.ToString();
}
//Console.WriteLine(msg);
stopwatch.Stop();
string res = string.Format("耗时:{0}分 {1}秒 {2}毫秒", stopwatch.Elapsed.Minutes, stopwatch.Elapsed.Seconds, stopwatch.Elapsed.Milliseconds);
Console.WriteLine(res);
Console.ReadKey();
//StringBuilder 方式
System.Diagnostics.Stopwatch stopwatch = new System.Diagnostics.Stopwatch();
stopwatch.Start();
StringBuilder sb = new StringBuilder(50000);
for (int i = 0; i < 50000; i++)
{
sb.Append(i);
}
//Console.WriteLine(sb);
stopwatch.Stop();
string res = string.Format("耗时:{0}分 {1}秒 {2}毫秒", stopwatch.Elapsed.Minutes, stopwatch.Elapsed.Seconds, stopwatch.Elapsed.Milliseconds);
Console.WriteLine(res);
Console.ReadKey();
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _06_StringBuilder
{
internal class Program
{
static void Main(string[] args)
{
//string s1 = "abc";
//s1 += "a";
//Console.WriteLine(s1);
StringBuilder sb = new StringBuilder();
//向StringBuilder 内追加字符串
sb.Append("hello");
sb.Append("world");
//sb.Insert(4, "我是添加的字符串");
Console.WriteLine(sb.Length);
//参数1 开始删除的索引位置
//参数2 是要删除的长度
sb.Remove(3, sb.Length-5);
sb.Replace("h", "*");
Console.WriteLine(sb);
}
}
}
tryCatch
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _07_tryCatch
{
internal class Program
{
static void Main(string[] args)
{
//代码中常见的错误分为两种:
//1.编译错误:编译不通过,编辑器中就已经出现了错误,运行不了
语法错误(少符号 ,多符号,中英文问题 类型错误....)
//2.运行时错误:程序在运行期间出现错误,比如:格式转换出错,对null进行操作....
//InputNum:
// Console.WriteLine("请输入一个整数");
// //try 代码块中与书写可能会出现运行错误的代码
// try
// {
// string s = Console.ReadLine();
// int l = int.Parse(s);
// Console.WriteLine($"s的三次方是" + Math.Pow(l, 3));
// }
// catch //如果try中的代码报错,就会执行catch中的代码
// {
// Console.WriteLine("代码报错了");
// goto InputNum;
// }
//InputNum:
// Console.WriteLine("请输入一个整数");
// //try 代码块中与书写可能会出现运行错误的代码
// try
// {
// string s = Console.ReadLine();
// int l = int.Parse(s);
// Console.WriteLine($"s的三次方是" + Math.Pow(l, 3));
// }
// catch (Exception errInfo)//在catch中写上(Exception 异常变量名)
// {
// Console.WriteLine("代码报错了"+ errInfo.Message);
// goto InputNum;
// }
try
{
string s = Console.ReadLine();
int l = int.Parse(s);
Console.WriteLine($"s的三次方是" + Math.Pow(l, 3));
}catch (FormatException)
{
Console.WriteLine("输入的数值不是一个整数");
}catch (OverflowException)
{
Console.WriteLine("输入的数值不是一个整数");
}
catch (Exception errInfo)
{
//抛出错误 用于使代码报错
throw errInfo;
}
finally
{
Console.WriteLine("无论是否有错误都会执行");
}
//注意:当我们使用tryCatch代码块捕获错误的时候,必须要进行错误的处理
如果这个错误不在我们的处理范围内,(比如:我们只处理错误A.B 引发错误C)
//就应该在最后catch代码块中捕获所有的错误,并使用throw抛出错误
Console.WriteLine("后续的代码");
Concat("吴亦凡","罗志祥");
}
public static string Concat (params string[] strings)
{
return "";
}
}
}
本期习题
将字符串大写转小写,小写转大写
例:HIDhiHIHDBDNdfhsihfdn===>hidHIhihdbdnDFHSIHFDN
用户输入一句话,判断话中有没有吴亦凡,如果有吴亦凡就替换成这种形式然后输出,如:加拿大劣迹男艺人吴亦凡===>加拿大劣迹男艺人***
让用户输入一句话含有e的话,找出所有e的位置
自定义
Concat() 连接字符串 Contains(“吴亦凡”,“凡)”) StartsWith() IndexOf() LastIndexOf() Remove()