C语言练习百题之判断星期几

题目:请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母。

解题思路
这题目要求根据输入的星期几的第一个字母来判断是星期几,如果第一个字母相同,则继续判断第二个字母。首先,需要了解星期的命名规则,即星期的全称一般以两个字母缩写为主。

  1. 直接判断法:根据输入的第一个字母进行分支判断,再根据需要,进一步判断第二个字母。
  2. 利用哈希表:构建一个哈希表,将每个字母映射到对应的星期几,然后根据输入的字母查表得到结果。
  3. 使用字符串比较:将输入的字母组合成字符串,逐一比较与已知星期的首字母组合,从而确定星期几。

现在,让我们使用这三种方法来实现根据输入的星期首字母判断星期几。

方法1: 直接判断法

  • 实现代码
#include 
#include 

char* determine_day_direct(char first_char, char second_char) {
    if (first_char == 'm') {
        if (second_char == 'o')
            return "Monday";
        else
            return "None";
    } else if (first_char == 't') {
        if (second_char == 'u')
            return "Tuesday";
        else if (second_char == 'h')
            return "Thursday";
        else
            return "None";
    } else if (first_char == 'w') {
        return "Wednesday";
    } else if (first_char == 'f') {
        return "Friday";
    } else if (first_char == 's') {
        if (second_char == 'a')
            return "Saturday";
        else if (second_char == 'u')
            return "Sunday";
        else
            return "None";
    } else {
        return "None";
    }
}

int main() {
    char first_char, second_char;
    printf("Enter the first letter of the day: ");
    scanf(" %c", &first_char);  // Leading space to skip whitespace characters
    printf("Enter the second letter of the day: ");
    scanf(" %c", &second_char);
    
    char* day = determine_day_direct(first_char, second_char);
    if (strcmp(day, "None") == 0)
        printf("Invalid input.\n");
    else
        printf("The day is: %s\n", day);

    return 0;
}
  • 优点
    • 直观易懂,逻辑清晰。
    • 简单,不依赖额外数据结构。
  • 缺点
    • 可能需要多重嵌套的条件判断,代码可能较长。

方法2: 利用哈希表

  • 解题思路
    • 使用哈希表将输入的字母与对应的星期几建立映射关系,根据输入的字母查找哈希表得到结果。
  • 实现代码
#include 
#include 

char* determine_day_hash(char first_char, char second_char) {
    const char* days[] = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"};
    const char* initials[] = {"mo", "tu", "we", "th", "fr", "sa", "su"};
    int index = -1;

    char input[3];
    input[0] = first_char;
    input[1] = second_char;
    input[2] = '\0';

    for (int i = 0; i < 7; i++) {
        if (strcmp(input, initials[i]) == 0) {
            index = i;
            break;
        }
    }

    if (index != -1)
        return (char*)days[index];
    else
        return "None";
}

int main() {
    char first_char, second_char;
    printf("Enter the first letter of the day: ");
    scanf(" %c", &first_char);  // Leading space to skip whitespace characters
    printf("Enter the second letter of the day: ");
    scanf(" %c", &second_char);
    
    char* day = determine_day_hash(first_char, second_char);
    if (strcmp(day, "None") == 0)
        printf("Invalid input.\n");
    else
        printf("The day is: %s\n", day);

    return 0;
}
  • 优点
    • 更具扩展性,易于维护和修改映射关系。
    • 不需要多重嵌套的条件判断。
  • 缺点
    • 需要额外的哈希表数据结构,可能会稍微增加代码复杂度。

方法3: 使用字符串比较

  • 解题思路
    • 将输入的字母组合成字符串,然后逐一与已知星期的首字母组合比较,从而确定星期几。
  • 实现代码
#include 
#include 

char* determine_day_string_compare(char first_char, char second_char) {
    const char* days[] = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"};
    char input[3];
    input[0] = first_char;
    input[1] = second_char;
    input[2] = '\0';

    for (int i = 0; i < 7; i++) {
        if (strcmp(input, days[i]) == 0)
            return (char*)days[i];
    }

    return "None";
}

int main() {
    char first_char, second_char;
    printf("Enter the first letter of the day: ");
    scanf(" %c", &first_char);  // Leading space to skip whitespace characters
    printf("Enter the second letter of the day: ");
    scanf(" %c", &second_char);
    
    char* day = determine_day_string_compare(first_char, second_char);
    if (strcmp(day, "None") == 0)
        printf("Invalid input.\n");
    else
        printf("The day is: %s\n", day);

    return 0;
}
  • 优点
    • 易于理解,简单明了。
    • 不需要多重嵌套的条件判断。
  • 缺点

相比哈希表法,需要进行多次字符串比较,可能会略微降低效率。

总结和推荐

  • 在这种特定问题中,三种方法都能够实现正确的功能。
  • 从直观易懂、简单明了、效率等方面考虑,方法1(直接判断法)可能更适合这个简单问题,因为它避免了额外的数据结构和复杂的逻辑判断,同时代码量也较少。
  • 在实际情况中,可以根据问题的复杂度、代码的可维护性和可扩展性来选择最适合的实现方法。

你可能感兴趣的:(C语言练习百题,算法,开发语言,c语言)