练习题
- 有如下字符串:【"患者:“大夫,我咳嗽得很重。” 大夫:“你多大年记?” 患者:“七十五岁。” 大夫:“二十岁咳嗽吗”患者:“不咳嗽。” 大夫:“四十岁时咳嗽吗?” 患者:“也不咳嗽。” 大夫:“那现在不咳嗽,还要等到什么时咳嗽?”"】。需求:请统计出该字符中“咳嗽”二字的出现次数,以及每次“咳嗽”出现的索引位置。
代码1:原始方法,用简单算法来解决。定义一个nums数组用来存储“咳嗽出现的位置”,定义一个current变量,用来作为数组的索引,并可以表位为第几次出现咳嗽(current+1)然后遍历字符串,判断字符串i的位置是否为“咳”,i+1的位置是否为“嗽”。若恰好是这种情况,则将i存储到nums数组中。
string strs = @"患者:“大夫,我咳嗽得很重。” 大夫:“你多大年记?” 患者:“七十五岁。” 大夫:“二十岁咳嗽吗”患者:“不咳嗽。” 大夫:“四十岁时咳嗽吗?” 患者:“也不咳嗽。” 大夫:“那现在不咳嗽,还要等到什么时咳嗽?”"; #region 原始方法,用算法解决 int current = -1; int[] nums = new int[strs.Length / 2]; for (int i = 0; i < nums.Length; i++) { nums[i] = -1; } for (int i = 0; i < strs.Length; i++) { if (strs[i] == ‘咳‘ && strs[i + 1] == ‘嗽‘) { nums[++current] = i; // Console.Write("第{0}个咳嗽的位置在{1}\n", current+1, nums[i]); } } for (int i = 0; i <= current; i++) { Console.Write("第{0}个咳嗽的位置在{1}\n", i + 1, nums[i]); } Console.ReadKey();
代码2:string.IndexOf(string needstr,int position)从position位置开始查找字符串needstr,并返回我们所查找到的第一个字符串的位置。因为题目要求我们查找出所有needstr的位置。所以我们从字符串strs的0位置开始查找到第一位needstr后(返回needstr的位置position1),继续从position1+1位置开始查找。直到position位置为-1(表示再也没有找到)为止。因此,我们可以首先定义一个position变量,给定初始化值为-1.这样每次都从position+1位置开始查找。
int count = 0; int position = -1; do { position = strs.IndexOf("咳嗽", position + 1); if (position != -1) { count++; Console.Write("第{0}个咳嗽的位置是:{1}\n", count, position); } } while (position != -1); Console.Write("咳嗽总共出现了{0}次", count); Console.ReadKey();
代码3:正则表达式,Regex.Matchs(string str,string str1)。表示匹配所有str中字符串中的str1,返回一个集合 MatchCollection mc。该集合的个数就代表了匹配到str1的所有个数,遍历mc集合,mc[i].Index表示匹配的str1的位置。
string rex = "咳嗽"; MatchCollection mc = Regex.Matches(strs, rex); Console.Write("总共查找出{0}个咳嗽\n", mc.Count); for (int i = 0; i < mc.Count; i++) { Console.Write("第{0}个咳嗽的位置在{1}\n", i, mc[i].Index); } Console.ReadKey();
- 将字符串" hello world,你 好 世界 ! "两端空格去掉,并且将其中的所有其他空格都替换成一个空格,输出结果为:"hello world,你 好 世界 !"。
代码1:利用string类的spilt(char[] chs,StringSpiltOptions.RemoveEmptyEntries)方法将字符串str分割,得到一个字符串数组,通过调用string类的string.Join(string str1,string[] str2)方法(表示将字符串数组上str2用str1连接起来),再将该字符串数组组合起来。
string[] strs = str.Split(new char[] { ‘ ‘ }, StringSplitOptions.RemoveEmptyEntries); str = string.Join(" ", strs); Console.WriteLine("修改后的字符串为{0}", str); Console.ReadKey();
代码2:正则表达式,Regex.Replace(string str,string str1,string str2)表示将字符串数组str中str替换成str2
string str = " hello world,你 好 世界 ! "; string rex = " +"; str = Regex.Replace(str, rex, " "); Console.WriteLine("修改后的字符串为{0}",str); Console.ReadKey();
- 制作一个控制台小程序。要求:用户可以在控制台录入每个学生的姓名,当用户输入quit(不区分大小写)时,程序停止接受用户的输入,并且显示出用户输入的学生的个数,以及每个学生的姓名。统计各个姓氏的个数
代码1:定义一个List<string> ls以用来存储用户输入的姓名,写一个死循环,用来不断接受用户的输入,如果用户输入的是quit,就跳出循环,否则将用户输入的姓名添加到ls中。跳出循环的时候打印ls.Count(输入姓名的总数),然后遍历ls集合,依次打印用户输入的姓名ls[i]。
统计各姓氏的个数:定义一个Dictionary<char xing,int num> dic用来存储姓氏和姓氏的个数,当用户输入的不是quit的时候,判断用户输入的字符串的首字母是已经能够存在于dic中,所存在,则dic[xing]++;若不存在,则dic.Add(xing,1);跳出循环后,遍历dic(foreach),打印item.Key和Item.Value。注意,代码中,可以将
Dictionary<string ,int> dic可以定义成Dictionary<char xing,int num> dic,这样后面就不用进行字符转换为字符串的操作了。
List<string> ls = new List<string>(); Dictionary<string, int> dic = new Dictionary<string, int>(); while (true) { Console.WriteLine("请输入您的姓名"); string input=Console.ReadLine(); if (input=="quit") { break; } ls.Add(input); string xing = input[0].ToString(); if (dic.ContainsKey(xing)) { dic[xing]++; } else { dic.Add(xing, 1); } } Console.Write("总共输入{0}个学生\n", ls.Count); for (int i = 0; i < ls.Count;i++ ) { Console.Write("第{0}个学生的名字为{1}\n", i+1, ls[i]); } Console.Write("==============\n"); foreach (KeyValuePair<string,int> item in dic) { Console.Write("姓为{0}的有{1}个\n", item.Key, item.Value); } Console.ReadKey();
- 请将字符串数组 中的内容反转。然后输出反转后的数组。不能用数组的Reverse()方法。
代码1
string[] strs = { "中国", "美国", "巴西", "澳大利亚", "加拿大" }; Console.WriteLine(string.Join(",", strs)); for (int i = 0; i < strs.Length/2;i++ ) { string temp = strs[i]; strs[i] = strs[strs.Length-i-1]; strs[strs.Length-i-1] = temp; } Console.Write(string.Join(",", strs)); Array.Reverse(strs); Console.Write(string.Join(",",strs)) Console.ReadKey();
- 创建一个Person类,属性:姓名、性别、年龄;方法:SayHi() 。再创建一个Employee类继承Person类,扩展属性Salary,重写SayHi方法
代码:
class Program { static void Main(string[] args) { Person[] p = { new Person("小红", 12, ‘女‘), new Employee("小名", 19, ‘男‘,3000) }; for (int i = 0; i < p.Length; i++) { p[i].SayHi(); } Console.ReadKey(); } }
Person类
class Person { public Person(string name,int age,char gender) { this.name = name; this.age = age; this.gender = gender; } private string name; public string Name { set { name = value; } get { return name; } } private int age; public int Age { get { return age; } set { age = value; } } private char gender; public char Gender { get { return gender; } } public virtual void SayHi() { Console.WriteLine("大家好,我叫{0},我今年{1}岁了,我是{2}生", name, age, gender); } }
Employee类
class Employee:Person { private decimal salary; public decimal Salary { get { return salary; } } public override void SayHi() { Console.WriteLine("您好,我是{0},我今年{1}岁了,我是{2}生,我的工资是{3}", Name, Age, Gender,salary); } public Employee(string name,int age,char gender,int salary):base(name,age,gender) { this.salary = salary; } }
- 请编写一个类:ItcastClass,该类中有一个私有字段_names,数据类型为:字符串数组,长度为5,并且有5个默认的姓名。要求:为ItcastClass类编写一个索引器,要求该索引器能够通过下标来访问_names中的内容。
class ItcastClass { private string[] names; public ItcastClass() { this.names = new string[] { "11", "22", "33", "44", "55" }; } public string this[int index] { set { names[index] = value; } get { return names[index]; } } }
class Program { static void Main(string[] args) { ItcastClass c = new ItcastClass(); Console.WriteLine(c[2]); Console.ReadKey(); } }
- 案例:使用WinForm窗体,制作一个简易计算器,默认为“请选择”。要求具有+、-、*、/功能,当用户点击“等于”按钮时,如果输入的为非数字则提示用户。
代码1:
private void button1_Click(object sender, EventArgs e) { float numA, numB; string texA = textBox1.Text; string textB = textBox2.Text; if( !float.TryParse(texA,out numA)){ MessageBox.Show("您的输入格式有误"); return; } if (!float.TryParse(textB, out numB)) { MessageBox.Show("您的输入格式有误"); return; } float result; switch (comboBox1.Text) { case "+": result = numA + numB; break; case "-": result = numA - numB; break; case "*": result = numA * numB; break; case "/": if (numB == 0) { MessageBox.Show("除数不能为0", "提示"); return; } result = numA / numB; break; default: throw new Exception("未知符号"); } textBox3.Text = Convert.ToString(result); }
代码2:面向对象的封装,简单的类加工厂
abstract class OperteClass { public abstract float GetResult(float num1,float num2); } class AddClass:OperteClass { public override float GetResult(float num1,float num2) { return num1 + num2; } } class SubtractClass:OperteClass { public override float GetResult(float num1,float num2) { return num1 - num2; } } class MultiplyClass:OperteClass { public override float GetResult(float num1,float num2) { return num1 * num2; } } class DivideClass:OperteClass { public override float GetResult(float num1,float num2) { //if (num2 == 0) //{ // MessageBox.Show("除数不能为0","提示"); // return; //} return num1 / num2; } class FactoryClass1 { public static OperteClass CreateClass(int operate) { switch (operate) { case 0: return new AddClass(); case 1: return new SubtractClass(); case 2: return new MultiplyClass(); case 3: return new DivideClass(); default: return null; } } private void button1_Click(object sender, EventArgs e) { string txtNum1 = textBox1.Text; string txtNum2 = textBox2.Text; float num1, num2; if (!float.TryParse(txtNum1,out num1)) { MessageBox.Show("输入的字符串格式有问题"); return; } if (!float.TryParse(txtNum2, out num2)) { MessageBox.Show("输入的字符串格式有问题"); return; } OperteClass obj=FactoryClass1.CreateClass(comboBox1.SelectedIndex); if (obj == null) { MessageBox.Show(""); } else { textBox3.Text = obj.GetResult(num1, num2).ToString(); } }
- 生成1-10个不同的随机数
代码1:
int[] nums = new int[10] { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }; Random random = new Random(); #region for循环来实现 for (int i = 0; i < nums.Length; i++) { int temp = random.Next(10); int j = -1; for (j = 0; j < nums.Length; j++) { if (temp == nums[j]) { break; } } if (j == nums.Length) { nums[i] = temp; } else { i--; } }
代码2:
int current=-1; while (current <9) { int temp = random.Next(10); int j = -1; for (j = 0; j < nums.Length; j++) { if (temp == nums[j]) { break; } } if (j == nums.Length) { nums[++current] = temp; } else { continue; } } for (int i = 0; i < nums.Length;i++ ) { Console.Write(nums[i]+ ","); } Console.ReadKey();
- 打星星
代码:
static void Main(string[] args) { int num = 3; for (int i = 1; i <=num; i++) { Console.Write("\n"); for (int j =1 ; j < 2*num; j++) { if (j>num-i &&j<=num+i-1) { Console.Write("*"); } else { Console.Write(" "); } } } Console.ReadKey(); }
- 写一个读取控制台数字的方法,写一个转换字符串为数字的方法
代码:读取数字,首先写一个死循环,若是读取的字符串格式正确则跳出循环并将读到的字符串以数字类型返回。这里调用类库里面的Int.TryParse()方法,以将字符串转成整型数字。我们可以自己写一个方法来实现类库Int.TryParse()方法。思路为:定义一个方法,返回类型为bool,返回值为真表示转换成功,否则转换失败。方法的第一个参数为即将进行准转的字符串str,第二个参数为out int num(传出参数),用来存储转换成功后的数值,并将其传给到调用方法。方法内部,遍历字符串str,若是str[i]字符>48 且<57,则表示该字符为0-9。这里我们可以便捷的调用类库中的char.INum()方法判断字符是否为0-9.如果不是的话,就返回false,num=0,转换不成功,说明字符串格式不正确。若字符在0-9范围之间,我们 num+=(str[i]-‘0‘)*(int)Math.Pow(10,str.Length-1-i)*tag来计算该字符串转成数字的值。因为考虑到负数的情况,若字符串的首字符为‘-‘,则截取字符串后面的部分进行是否为数字的判断,满足数字的情况后对字符串进行数字计算,计算时将其乘以-1(tag),若首字符不是‘-’,则tag=1.
class JkConsole { public static int ReadNum() { string strNum = null; int num = 0; while (true) { strNum=Console.ReadLine(); if (int.TryParse(strNum,out num)) { break; } else { Console.WriteLine("输入有误,请重新输入"); } } return num; } public static int ReadNum(int max) { string strNum ; int num = 0; while (true) { strNum = Console.ReadLine(); if (MyTryParse(strNum,out num)) { if (num>=max || num<0) { Console.Write("输入不再范围内,请重新输入"); continue; } break; } else { Console.WriteLine("请重新输入"); } } return num; } public static bool MyTryParse(string str,out int num){ int tag = 1; if (str[0]==‘-‘) { str = str.Substring(1); tag = -1; } num=0; for(int i=0;i<str.Length;i++) { if (!char.IsNumber(str[i])) { return false; } else{ num+=(str[i]-‘0‘)*(int)Math.Pow(10,str.Length-1-i)*tag; } } return true; } }
: