c语言200例 067

news2024/12/28 5:31:50

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

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

题目要求:

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

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

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

下面是相应的 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. 扩展功能: 为每种数据类型添加更多的操作和输出。

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

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2179775.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何判断主机字节序

测试代码: #include <stdio.h> void byteorder() {union{short value;char union_bytes[sizeof(short)];//union_bytes数组}test;test.value 0x0102;if((test.union_bytes[0] 1) && (test.union_bytes[1]2)){printf("big endian\n");}else if((test…

初识Java反序列化漏洞

目录 为什么需要序列化&#xff1f; 序列化与反序列化基础案例 Serializable 接口 序列化对象 反序列化对象 Java 反序列化漏洞 readObject() 序列化&#xff1a;将对象的状态信息转换为可以存储或传输的形式的过程&#xff0c;即将对象转换为字节序列。反序列化&#x…

如何突破科技服务领域的客户管理困境?

在知识产权与科技服务领域&#xff0c;企业面临着独特的客户管理需求和挑战&#xff0c;这些挑战不仅要求高度的专业性和精细化操作&#xff0c;还涉及复杂的法律流程、数据保密性以及不断变化的客户需求。传统的客户管理方式&#xff0c;如纸质档案、简单的电子表格或人工处理…

[教程]Crystal源码下载及编译

描述&#xff1a; 随着 Crystal Source 代码的更新&#xff0c;用于构建源代码和编译它们的指南已经过时&#xff0c;这导致了很多混淆和寻求帮助。 本指南将是一个完整的分步指南&#xff0c;从下载 Visual Studio 到启动到您的服务器。 此外&#xff0c;请确保下载此存储库中…

如何使用 Python 读取数据量庞大的 excel 文件

使用 pandas.read_excel 读取大文件时&#xff0c;的确会遇到性能瓶颈&#xff0c;特别是对于10万行20列这种规模的 .xlsx 文件&#xff0c;常规的 pandas 方法可能会比较慢。 要提高读取速度&#xff0c;关键是找到更高效的方式处理 Excel 文件&#xff0c;特别是在 Python 的…

Docker版MKVtoolnix的安装及中文显示

本文是应网友 kkkhi 要求折腾的&#xff0c;只研究了 MKVtoolnix 的安装及中文显示&#xff0c;未涉及到软件的使用&#xff1b; 什么是 MKVtoolnix &#xff1f; MKVToolnix 是一款功能强大的多媒体处理工具&#xff0c;用于在 Linux、其他 Unix 系统和 Windows 上创建、修改和…

uniapp/vue项目 import 导入文件时提示Module is not installed,‘@/views/xxx‘路径无法追踪

文章目录 背景解决方案1.IDE配置2.alias&#xff08;别名&#xff09;配置webpackvue-clivite 3.检查 jsconfig.json 或 tsconfig.json 写在最后 前往闪闪の小窝以获得更好的阅读和评论体验 背景 Vue3在我自学Vue的时候看过一点&#xff0c;实操过一点&#xff0c;但是太久没用…

css 下拉框展示:当hover的时候展示下拉框 z-index的用法解释

代码如下&#xff1a; <template><div class"outer"><div class"left"></div><div class"aTest2"><div class"box">显示方框</div><div class"aTest3"></div></…

2024年度全球前2%顶尖科学家榜单发布!大陆10687人上榜,占比仅4.92%,附大陆Top 1000榜单!

9月16日&#xff0c;美国斯坦福大学的John Ioannidis教授团队新近在爱思唯尔(Elsevier)出版集团官网上发布了2024年全球各学科前2%科学家榜单(第七版)&#xff0c;通过统计每个科学家发表的论文数及其引用次数&#xff0c;采用6种指标建模进行综合评分(模型和指标附后)&#xf…

MIC麦克风工作原理:【图片+公式计算讲解】

Mic一个声电传换装置&#xff0c;广泛应用于电子产品中&#xff0c;最常见的就是手机。我们通常也叫它送话器&#xff0c;今天我们就来好好学习一下Mic的电路和它的工作原理。 1&#xff1a;电路结构图 1&#xff1a;C&#xff1a;Mic的核心部件&#xff0c;是一个可以膜片震动…

Linux之Docker虚拟化部署

上传docker安装包 解压安装包 将解压后的docker文件夹移动到/usr/local/文件夹下 docker 启动命令/usr/local/docker/dockerd 但是启动报错&#xff0c;意思是没有docker用户组 创建docker用户组&#xff0c;执行完会生成套接字文件 将套接字文件加入该用户组管理 第二个错误原…

【Lcode 随笔】C语言版看了不后悔系列持续更新中。。。

文章目录 题目一&#xff1a;最长回文子串题目描述&#xff1a;示例输入与输出&#xff1a;题目分析&#xff1a;解题思路&#xff1a;示例代码&#xff1a;深入剖析&#xff1a; 题目二&#xff1a;合并K个有序链表题目描述&#xff1a;示例输入与输出&#xff1a;题目分析&am…

k8s中,ingress的实现原理,及其架构。

图片来源&#xff1a;自己画的 图片来源&#xff1a;k8s官网 首先&#xff0c;什么是ingress? 是服务还是控制器&#xff1f; 都不精确 ingress是一个api资源 service和deployment也是api资源。 这几个相互协作&#xff0c;组建成一个对外提供服务的架构。 ingress提供的…

java学习-idea编辑器基础使用设置

首先打开电脑中的idea编辑器&#xff0c;点击头部&#xff1a;File按钮 → Settings… 打开设置界面&#xff1b; 设置idea的主题 设置idea代码注释的字体颜色 设置idea编辑器的字体和字体大小 设置idea通过提示回车自动导入包 设置idea输入忽略大小写进行提示

计算机网络面试题——第二篇

1. TCP拆包和粘包 现象 粘包&#xff1a;指在TCP传输中&#xff0c;发送方的多个数据包在接收方被合并在一个包接收&#xff0c;导致多条消息数据粘在一起&#xff0c;接收方无法正确区分这些消息的边界。拆包&#xff1a;指的是发送方的一个数据包在接收方被分成了多个包接收…

CHARLS数据库系列教程(4)--多模型效应分析、Per SD、P for trend及限制立方样条图绘制

CHARLS 是一项具备中国大陆 45 岁及以上人群代表性的追踪调查&#xff0c;旨在建设一个高质量的公共微观数据库&#xff0c;采集的信息涵盖社会经济状况和健康状况等多维度的信息&#xff0c;以满足老龄科学研究的需要。 为利用国际上最佳的数据采集方式&#xff0c;并确保研究…

shinyproxy部署streamlit记录

shinyproxy部署streamlit记录 streamlit 也是构建shinyproxy的后段是docker&#xff0c;所以不但可以部署shiny应用&#xff0c;还可以部署streamlit应用以及其它的应用程序。 部署的过程分两步&#xff0c;第一步是构建streamlit应用的docker镜像&#xff0c;就是构建Docker…

Linux高级编程_26_shell

文章目录 shell概述:分类&#xff1a;语法&#xff1a;1、#&#xff01;2、#3、执行&#xff1a;方式1&#xff1a;方式2&#xff1a;方式3&#xff1a; 注意&#xff1a; 第一个shell脚本变量变量的定义&#xff1a;变量的修改变量的取值撤销变量声明只读变量导出变量&#xf…

【HDP】zookeeper未授权漏洞修复

目录 一、禁用四字命令 二、ZK-Client增加kerberos 一、禁用四字命令 Zookeeper四字命令的使用方式非常简单&#xff0c;通常有两种方式。第一种是通过Telnet方式&#xff0c;使用Telnet客户端登录ZooKeeper的对外服务端口&#xff0c;然后直接使用四字命令即可&#xff1b;第…

Kafka快速实战与基本原理详解

笔记:https://note.youdao.com/ynoteshare/index.html?id=b0357bdb4821ed2e35ecdbdacd65aa06&type=note&_time=1727570043631 启动kafka之前先启动zookper 看看ZK里面都有什么数据 : 刚开始什么数据都没有 接下来启动kafka,启动好后,日志在这里看: 启动好了kaf…