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. 增强的输出功能:

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

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

相关推荐
z202305081 分钟前
linux之调度管理(13)- wake affine 唤醒特性
java·开发语言
AI人H哥会Java2 分钟前
【JAVA】Java高级:Java网络编程——TCP/IP与UDP协议基础
java·开发语言
小白要加油哈15 分钟前
Lua--1.基础知识
开发语言·junit·lua
bbppooi26 分钟前
堆的实现(完全注释版本)
c语言·数据结构·算法·排序算法
网络安全Ash28 分钟前
企业网络安全之OPENVPN
开发语言·网络·php
xcLeigh30 分钟前
C# Winform贪吃蛇小游戏源码
开发语言·c#
易辰君33 分钟前
【Python爬虫实战】深入解析 Scrapy:从阻塞与非阻塞到高效爬取的实战指南
开发语言·python
FFDUST34 分钟前
C++ 优先算法 —— 无重复字符的最长子串(滑动窗口)
c语言·c++·算法·leetcode
荒-漠34 分钟前
php CURL请求502
开发语言·php
shiming887935 分钟前
C/C++链接数据库(MySQL)超级详细指南
c语言·数据库·c++