C/C++表驱动法

发布于:2025-05-13 ⋅ 阅读:(7) ⋅ 点赞:(0)

第1章 原始底代码

#include <cstdio>
#include <cstring>

static void Func1(const char *str);

int main() {
    Func1("Sun");
    return 0;
}

void Func1(const char *str){
    if(strcmp(str, "Mon") == 0){
        printf("Monday\n");
    } else if(strcmp(str, "Tue") == 0){
        printf("Tuesday\n");
    } else if(strcmp(str, "Wed") == 0){
        printf("Wednesday\n");
    } else if(strcmp(str, "Thur") == 0){
        printf("Thursday\n");
    } else if(strcmp(str, "Fri") == 0){
        printf("Friday\n");
    } else if(strcmp(str, "Sat") == 0){
        printf("Saturday\n");
    } else if(strcmp(str, "Sun") == 0){
        printf("Sunday\n");
    } else {
        printf("Unknown day\n");
    }
}

第2章 方法一

#include <cstdio>
#include <cstring>

typedef struct {
    char *weekAbbreviation;
    char *weekFullName;
} TWeek;

static TWeek arr[] = {
        {"Mon", "Monday"},
        {"Tue", "Tuesday"},
        {"Wed", "Wednesday"},
        {"Thu", "Thursday"},
        {"Fri", "Friday"},
        {"Sat", "Saturday"},
        {"Sun", "Sunday"}
};

static void Func2(const char *str){
    for(int i = 0; i < sizeof (arr)/ sizeof (arr[0]); i++){
        if(strcmp(arr[i].weekAbbreviation, str) == 0){
            printf("%s\n", arr[i].weekFullName);
        }
    }
}


int main(int argc, char **argv){
    Func2("Thu");
    return 0;
}

第3章 方法2

#include <cstring>
#include <cstdio>

// 枚举:代表一周七天
typedef enum {
    Mon,   // 默认为 0
    Tue,   // 1
    Wed,   // 2
    Thu,   // 3
    Fri,   // 4
    Sat,   // 5
    Sun,   // 6
    TotalDays  // 自动为 7,可以用于循环边界等用途
} TWeekEnum;

// 结构体:关联枚举与星期全称
typedef struct {
    TWeekEnum weekAbbreviation;
    const char *weekFullName;  // 更安全地使用 const char*
} TWeek;

// 静态全局数组:枚举到全名的映射
static TWeek array[] = {
        {Mon, "Monday"},
        {Tue, "Tuesday"},
        {Wed, "Wednesday"},
        {Thu, "Thursday"},
        {Fri, "Friday"},
        {Sat, "Saturday"},
        {Sun, "Sunday"}
};

// 根据枚举值输出对应的星期全名
static void Func3(TWeekEnum weekEnum) {
    for (int i = 0; i < TotalDays; ++i) {
        if (array[i].weekAbbreviation == weekEnum) {
            printf("Day: %s\n", array[i].weekFullName);
            return;
        }
    }
    printf("Unknown day.\n");
}

// 测试函数
int main() {
    Func3(Mon);  // 输出 Monday
    Func3(Wed);  // 输出 Wednesday
    Func3(Sun);  // 输出 Sunday
    Func3((TWeekEnum)10);  // 输出 Unknown day.

    return 0;
}

第4章 方法3

3.1 大杂烩

#include <cstring>
#include <stdio.h>

typedef void (*pFunc)(void);

typedef struct{
    const char *weekAbbreviation;
    pFunc func;
}TWeek;

static void func1(void){
    printf("Monday\n");
}

static void func2(void){
    printf("Tuesday\n");
}

static void func3(void){
    printf("Wednesday\n");
}

static void func4(void){
    printf("Thursday\n");
}

static void func5(void){
    printf("Friday\n");
}

static void func6(void){
    printf("Saturday\n");
}

static void func7(void){
    printf("Sunday\n");
}

static TWeek arr[] = {
        {"Mon", func1},
        {"Tue", func2},
        {"Wed", func3},
        {"Thu", func4},
        {"Fri",func5},
        {"Sat", func6},
        {"Sun", func7}
};

void funcHandle(const char *str){
    int arrSize = sizeof (arr) / sizeof (arr[0]);
    for(int i = 0; i < arrSize; i++){
        if(strcmp(str, arr[i].weekAbbreviation)==0){
            arr[i].func();
        }
    }
}

int main(){
    funcHandle("Sun");
};

3.2 C++语言风格

  • WeekHandler.h

#ifndef WEEKHANDLER_H
#define WEEKHANDLER_H

#include <cstring>

// 定义函数指针类型
typedef void (*pFunc)(void);

// 定义包含星期缩写和对应函数的结构体
typedef struct {
    const char *weekAbbreviation;
    pFunc func;
} TWeek;

class WeekHandler {
public:
    WeekHandler();
    void funcHandle(const char *str);

private:
    static void func1(void);
    static void func2(void);
    static void func3(void);
    static void func4(void);
    static void func5(void);
    static void func6(void);
    static void func7(void);

    static TWeek arr[7];
};

#endif // WEEKHANDLER_H
  • WeekHandler.cpp

#include "WeekHandler.h"
#include <cstdio>

// 定义并初始化静态成员变量
TWeek WeekHandler::arr[] = {
    {"Mon", WeekHandler::func1},
    {"Tue", WeekHandler::func2},
    {"Wed", WeekHandler::func3},
    {"Thu", WeekHandler::func4},
    {"Fri", WeekHandler::func5},
    {"Sat", WeekHandler::func6},
    {"Sun", WeekHandler::func7}
};

// 构造函数
WeekHandler::WeekHandler() {
    // 如果有需要初始化的内容可以在这里添加
}

// 成员函数:处理输入字符串并调用对应的函数
void WeekHandler::funcHandle(const char *str) {
    int arrSize = sizeof(arr) / sizeof(arr[0]);
    for (int i = 0; i < arrSize; ++i) {
        if (std::strcmp(str, arr[i].weekAbbreviation) == 0) {
            arr[i].func();  // 调用对应的函数
            return;         // 找到匹配后退出循环
        }
    }
    printf("No matching day found.\n");  // 如果没有找到匹配项
}

// 静态成员函数定义
void WeekHandler::func1(void) {
    printf("Monday\n");
}

void WeekHandler::func2(void) {
    printf("Tuesday\n");
}

void WeekHandler::func3(void) {
    printf("Wednesday\n");
}

void WeekHandler::func4(void) {
    printf("Thursday\n");
}

void WeekHandler::func5(void) {
    printf("Friday\n");
}

void WeekHandler::func6(void) {
    printf("Saturday\n");
}

void WeekHandler::func7(void) {
    printf("Sunday\n");
}
  • main.cpp
#include "WeekHandler.h"
#include <iostream>
#include <memory>

int main() {
    WeekHandler handler;
    handler.funcHandle("Sun");
    handler.funcHandle("Sun");


    std::unique_ptr<WeekHandler> funcHandle = std::make_unique<WeekHandler>();
    funcHandle->funcHandle("Thu");
    funcHandle->funcHandle("Mon");
    return 0;
}

3.3 c语言风格

  • week_handler.h

#ifndef WEEK_HANDLER_H
#define WEEK_HANDLER_H

#include <cstddef> // For size_t

// 定义函数指针类型
typedef void (*pFunc)(void);

// 定义包含星期缩写和对应函数的结构体
typedef struct {
    const char *weekAbbreviation;
    pFunc func;
} TWeek;

// 声明处理函数
void funcHandle(const char *str);

#endif // WEEK_HANDLER_H
  • week_handler.c

#include "week_handler.h"
#include <cstring>
#include <cstdio>

// 静态函数定义
static void func1(void) {
    printf("Monday\n");
}

static void func2(void) {
    printf("Tuesday\n");
}

static void func3(void) {
    printf("Wednesday\n");
}

static void func4(void) {
    printf("Thursday\n");
}

static void func5(void) {
    printf("Friday\n");
}

static void func6(void) {
    printf("Saturday\n");
}

static void func7(void) {
    printf("Sunday\n");
}

// 静态数组,包含星期缩写及其对应的函数
static TWeek arr[] = {
    {"Mon", func1},
    {"Tue", func2},
    {"Wed", func3},
    {"Thu", func4},
    {"Fri", func5},
    {"Sat", func6},
    {"Sun", func7}
};

// 处理输入字符串并调用对应的函数
void funcHandle(const char *str) {
    size_t arrSize = sizeof(arr) / sizeof(arr[0]);
    for (size_t i = 0; i < arrSize; ++i) {
        if (std::strcmp(str, arr[i].weekAbbreviation) == 0) {
            arr[i].func();  // 调用对应的函数
            return;         // 找到匹配后退出循环
        }
    }
    printf("No matching day found.\n");  // 如果没有找到匹配项
}
  • main.c
#include "week_handler.h"

int main() {
    funcHandle("Sun");
    return 0;
}


网站公告

今日签到

点亮在社区的每一天
去签到