8 文本

0 思维导图

如图 1.1。


图1.1 文本思维导图

1 String

String 类型的对象是不可变的,这意味着,一旦我们创建了对象,我们就不能改变它,当我们对一个 String 类型的对象使用它内部的一些方法时,它返回的是一个新的字符串,而原字符串的值不受影响。我们不可以通过下标的方式操作字符串的某一个字符。


2 StringBuilder

StringBuilder 是一个可变字符的字符串,该类不可以被继承。当我们需要对字符串本身进行大量操作时,我们可以使用 StringBuilder 类来创建字符串对象。StringBuilder 通过维护一个缓冲区来容纳对字符串的扩展,如果追加字符串的操作超出了它的容量,就会重新分配一个更大的缓冲区,然后将旧的缓冲区中的数据复制到新缓冲区中,然后再将新加入的字符串写到新的缓冲区中。但也由于其工作原理,StringBuilder 不支持对字符串的搜索操作,如果需要使用到搜索,就需要根据 StringBuilder 生成对应的 String 类型的对象,这有可能使得使用 StringBuilder 的优势被转换操作所拖累,因此如果对字符串本身的操作不多时,应选用 String 类。


3 面向过程编程

面向过程编程是与面向对象编程不同的编程范式,在使用面向过程编程时,我们应该解决问题的过程放在函数中,而非全部堆砌在 Main 函数中,对于面向过程编程来说,一个有效提取函数的方式是,将输出与操作分离,将处理逻辑相关的代码提取出来作为一个函数,输出的部分留在 Main 函数中,函数的参数和返回值应该跟输入和需要获得的结果的类型分别保持一致。对于 Main 函数来说,应该只关心我们需要拿到的结果,而不是取得结果的过程,得到结果的过程就交由其他函数决定,同时,在运算的过程中我们尽量避免对输入参数本身进行修改,而是应该返回一个新的对象。


4 练习

对于所有的练习题,除了特别要求以外,都假定用户按照程序给定的格式输入。

  • 练习 68_1:编写一个程序要求用户输入一些用连字符连接的数字,计算这组数据是否有序。例如,对于输入 "5-6-7-8-9" 或者 "20-19-18-17-16",输出 "Consecutive" 否则输出 "Not Consecutive"。
public static void Exercise68_1()
{
    Console.WriteLine("Please enter numbers separate with hyphen:");
    var input = Console.ReadLine();
    var isConsecutive = CheckIfConsecutive(input);

    Console.WriteLine(isConsecutive ? "Consecutive" : "Not Consecutive");
}

private static bool CheckIfConsecutive(string input)
{
    var isConsecutive = false;
    var strList = input.Split('-');
    var numbers1 = new List();
    var numbers2 = new List();

    foreach (var s in strList)
    {
        numbers1.Add(Convert.ToInt32(s));
        numbers2.Add(Convert.ToInt32(s));
    }

    numbers2.Sort();
    if (numbers1.SequenceEqual(numbers2))
    {
        isConsecutive = true;
    }
    else
    {
        numbers2.Reverse();
        if (numbers1.SequenceEqual(numbers2))
        {
                isConsecutive = true;
        }
    }

    return isConsecutive;
}
  • 练习 68_2:编写一个程序,要求用户输入一些用连字符连接的数字。如果直接输入回车,则没有输出直接返回,否则判断这些数字是否相同,如果全部相同输出 "Duplicate"。
public static void Exercise68_2()
{
    Console.WriteLine("Please enter numbers separate with hyphen:");
    var input = Console.ReadLine();
    if (!String.IsNullOrEmpty(input))
    {
        var isDuplicate = CheckIfDuplicate(input);

        Console.WriteLine(isDuplicate?"Duplicate":"");
    }
}
private static bool CheckIfDuplicate(string input)
{
    var isDuplicate = false;
    var strList = input.Split('-');
    var numbers = new List();

    foreach (var s in strList)
    {
        numbers.Add(Convert.ToInt32(s));
    }
    numbers.Sort();

    isDuplicate = (numbers[0] == numbers[numbers.Count - 1]);
    return isDuplicate;
}
  • 练习 68_3:编写一个程序要求用户输入一个24小时制的时间(比如19:00)。有效时间为 00:00 - 23:59。如果输入的时间是有效时间,则输出 "Ok";否则输出 "Invalid Time"。如果用户不提供任何值,也视为无效时间。
public static void Exercise68_3()
{
    Console.WriteLine("Please enter a time value in the 24-hour time format:");
    var input = Console.ReadLine();
    var isValidTime = CheckIfValidTime(input);

    Console.WriteLine(isValidTime ? "Ok" : "Invalid Time");
}

private static bool CheckIfValidTime(string input)
{
    var isValid = true;
    var timeList = input.Split(':');
    var times = new List();

    foreach (var s in timeList)
    {
        times.Add(Convert.ToInt32(s));
    }

    if (times[0] < 0 || times[0] > 23)
    {
        isValid = false;
    }

    if (times[1] < 0 || times[1] > 59)
    {
        isValid = false;
    }


    return isValid;
}
  • 练习 68_4:编写一个程序,要求用户输入一些用空格分开的单词。使用这些单词创建一个以帕斯卡命名法命名的变量。比如说,如果用户输入:"number of students" 就输出"NumberOfStudents"。同时也要确保结果不会受到输入的影响,例如说,如果用户输入 "NUMBER OF STUDENTS",结果也依然要为 "NumberOfStudent"。
public static void Exercise68_4()
{
    Console.WriteLine("Please enter some words separate with space:");
    var input = Console.ReadLine();
    var pascalCase = ChangeToPascalCase(input);
    Console.WriteLine(pascalCase);
}

private static string ChangeToPascalCase(string input)
{
    var strList = input.Split(' ');
    var variableList = new List();

    foreach (var s in strList)
    {
        var temp = s.ToLower();
        var c = temp.ToArray();
        c[0] = (char)(c[0] - 32);
        temp = String.Join("",c);
        variableList.Add(temp);
    }

    return String.Join("", variableList);
}

练习 68_5:编写一个程序,要求用户输入一个英文单词并计算元音 (a, e, i, o, u) 的数量。例如,用户输入 "inadequate",则在控制台输出 6。

public static void Exercise68_5()
{
    Console.WriteLine("Please enter an English word:");
    var input = Console.ReadLine();
    var count = GetVowelCount(input);
    Console.WriteLine(count);
}

private static int GetVowelCount(string input)
{
    var regex = new Regex("[aeiouAEIOU]");
    var matches = regex.Matches(input);
    return matches.Count;
}

你可能感兴趣的:(8 文本)