c语言200例 067

大家好,欢迎来到无限大的频道

今天给大家带来的是c语言200例

题目要求:

设计一个共用体类型,使其成员包含多种数据类型,根据不同的数据类型,输出不同的结果

要设计一个共用体(union)类型,以便其成员可以包含多种数据类型,并根据不同的数据类型输出不同的结果,可以按照以下步骤进行:

  1. 定义一个共用体,包含所需的数据类型。
  2. 使用一个枚举(enum)来标识正在使用的成员类型。
  3. 创建一个函数根据共用体中的数据类型进行不同的输出。

下面是相应的 C 语言代码示例:

c 复制代码
#include <stdio.h>

// 定义一个枚举,表示不同的数据类型
typedef enum {
    INT_TYPE,
    FLOAT_TYPE,
    CHAR_TYPE
} DataType;

// 定义一个共用体,可包含多种数据类型
typedef union {
    int intValue;
    float floatValue;
    char charValue;
} DataValue;

// 定义一个结构体,将共用体与数据类型一起使用
typedef struct {
    DataType type;
    DataValue value;
} Data;

// 输出不同类型的数据
void printData(Data data) {
    switch (data.type) {
        case INT_TYPE:
            printf("Integer value: %d\n", data.value.intValue);
            break;
        case FLOAT_TYPE:
            printf("Float value: %.2f\n", data.value.floatValue);
            break;
        case CHAR_TYPE:
            printf("Character value: %c\n", data.value.charValue);
            break;
        default:
            printf("Unknown data type\n");
            break;
    }
}

int main() {
    // 创建一个整数类型的数据
    Data data1;
    data1.type = INT_TYPE;
    data1.value.intValue = 10;

    // 创建一个浮点类型的数据
    Data data2;
    data2.type = FLOAT_TYPE;
    data2.value.floatValue = 5.75f;

    // 创建一个字符类型的数据
    Data data3;
    data3.type = CHAR_TYPE;
    data3.value.charValue = 'A';

    // 输出数据
    printData(data1);
    printData(data2);
    printData(data3);

    return 0;
}

代码分析:

  1. DataType枚举: 用于标识共用体当前存储的数据类型。
  2. DataValue共用体: 可以存储一个整数、一个浮点数或一个字符。
  3. Data结构体: 结合了枚举和共用体,使得你可以轻松地知道当前存储的数据类型,并访问对应的值。
  4. printData函数 : 根据type的值,判断应该输出哪个值,并使用不同的格式进行打印。

以下是对之前代码的进一步扩展。我们将添加用户输入功能,自动识别输入值的类型,允许用户选择是否继续或终止程序,并扩展输出的信息。

扩展设计要点:

  1. 自动识别输入值类型: 使用字符串输入并根据用户提供的值判断其类型。
  2. 用户控制程序流: 让用户选择继续或终止程序。
  3. 扩展功能: 为每种数据类型添加更多的操作和输出。

下面是扩展后的代码示例:

c 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

// 定义一个枚举,表示不同的数据类型
typedef enum {
    INT_TYPE,
    FLOAT_TYPE,
    CHAR_TYPE,
    UNKNOWN_TYPE
} DataType;

// 定义一个共用体,可包含多种数据类型
typedef union {
    int intValue;
    float floatValue;
    char charValue;
} DataValue;

// 定义一个结构体,将共用体与数据类型一起使用
typedef struct {
    DataType type;
    DataValue value;
} Data;

// 函数声明
DataType identifyType(const char* input);
void printData(Data data);

// 主函数
int main() {
    char input[100];
    int continueProgram = 1;

    while (continueProgram) {
        printf("请输入一个值(整数、浮点数或字符):");
        fgets(input, 100, stdin);
        
        // 去除换行符
        input[strcspn(input, "\n")] = '\0';

        // 识别输入值的类型
        DataType type = identifyType(input);
        
        Data data;
        data.type = type;

        // 根据类型进行相应的处理
        switch (type) {
            case INT_TYPE:
                data.value.intValue = atoi(input);
                break;
            case FLOAT_TYPE:
                data.value.floatValue = atof(input);
                break;
            case CHAR_TYPE:
                data.value.charValue = input[0]; // 取第一个字符
                break;
            default:
                printf("未知的数据类型,无法处理该输入。\n");
                continue; // 跳过本轮循环
        }

        // 输出数据
        printData(data);

        // 提示用户是否继续
        char choice;
        printf("您想继续输入吗?(y/n): ");
        scanf(" %c", &choice);
        getchar(); // 清除输入缓冲区中的换行符
        if (choice != 'y' && choice != 'Y') {
            continueProgram = 0; // 终止程序
        }
    }

    return 0;
}

// 自动识别输入数据类型
DataType identifyType(const char* input) {
    // 检查是否为整数
    char* endPtr;
    strtol(input, &endPtr, 10);
    if (*endPtr == '\0') {
        return INT_TYPE;
    }

    // 检查是否为浮点数
    strtof(input, &endPtr);
    if (*endPtr == '\0') {
        return FLOAT_TYPE;
    }

    // 检查是否为单个字符
    if (strlen(input) == 1 && isprint(input[0])) {
        return CHAR_TYPE;
    }

    return UNKNOWN_TYPE;
}

// 输出不同类型的数据
void printData(Data data) {
    switch (data.type) {
        case INT_TYPE:
            printf("您输入的整数值是: %d\n", data.value.intValue);
            break;
        case FLOAT_TYPE:
            printf("您输入的浮点值是: %.2f\n", data.value.floatValue);
            break;
        case CHAR_TYPE:
            printf("您输入的字符值是: %c\n", data.value.charValue);
            break;
        default:
            printf("未能识别的类型。\n");
            break;
    }
}

代码扩展分析:

  1. 用户输入和类型识别:

    • 使用 fgets 获取用户输入,并去除换行符。
    • 使用 identifyType 函数判断输入的类型。该函数尝试将输入解析为整数、浮点数及字符,返回相应的类型。
  2. 动态程序控制:

    • 添加一个循环,询问用户是否继续输入,用户可以选择 'y' 或 'n' 来决定。
  3. 增强的输出功能:

    • 输出时根据数据类型不同,提供不同的格式。
    • 接受并处理字符类型的输入,限制为单个可打印字符。

这个设计提高了程序的灵活性和用户交互性,使得用户能够更方便地输入多种类型的数据并查看结果。

相关推荐
charlie1145141911 分钟前
如何使用Qt创建一个浮在MainWindow上的滑动小Panel
开发语言·c++·qt·界面设计
Dcs5 分钟前
VSCode等多款主流 IDE 爆出安全漏洞!插件“伪装认证”可执行恶意命令!
java
神仙别闹9 分钟前
基于Python实现LSTM对股票走势的预测
开发语言·python·lstm
保持学习ing10 分钟前
day1--项目搭建and内容管理模块
java·数据库·后端·docker·虚拟机
京东云开发者22 分钟前
Java的SPI机制详解
java
超级小忍44 分钟前
服务端向客户端主动推送数据的几种方法(Spring Boot 环境)
java·spring boot·后端
程序无bug1 小时前
Spring IoC注解式开发无敌详细(细节丰富)
java·后端
小莫分享1 小时前
Java Lombok 入门
java
程序无bug1 小时前
Spring 对于事务上的应用的详细说明
java·后端
食亨技术团队1 小时前
被忽略的 SAAS 生命线:操作日志有多重要
java·后端