C 语言基础教程(我的C之旅开始了)[五]

下面详细讲解“C语言基础教程(我的C之旅开始了)[五]”的完整攻略。

标题

C 语言基础教程(我的 C 之旅开始了)[五]

概述

本次教程主要涵盖C语言中的结构体和联合体。在学习本篇教程前,需要先掌握C语言中的变量、循环、条件语句、指针等基础知识。

结构体

结构体是 C 语言中自定义的一种数据类型,通过结构体可以将多个不同类型的变量组合成一个整体,方便统一管理和使用。结构体定义的方式如下:

struct [结构体名]
{
    [成员变量1类型] [成员变量1名];
    [成员变量2类型] [成员变量2名];
    ...
    [成员变量n类型] [成员变量n名];
};

其中,[成员变量]可以是其他任意合法的数据类型,例如 int、char、float等。下面是一个结构体的示例:

struct student
{
    int id;
    char name[20];
    int age;
    float score;
};

结构体的使用

定义结构体之后,可以通过以下方式声明结构体变量:

struct student stu1;
struct student stu2 = {1, "张三", 18, 89.5};
struct student stu3 = {.name = "李四", .score = 77.5};

通过点运算符可以访问结构体的成员变量,例如:

stu1.id = 1;
strcpy(stu1.name, "张三");
stu1.age = 18;
stu1.score = 89.5;

结构体还可以作为函数的形参和返回值,例如:

struct student getStudent(int id, char name[], int age, float score)
{
    struct student stu;
    stu.id = id;
    strcpy(stu.name, name);
    stu.age = age;
    stu.score = score;
    return stu;
}

联合体

联合体是一种特殊的结构体,它所有成员都是从同一块内存中分配的,因此联合体只能存储其中任意一个成员。联合体定义的方式如下:

union [联合体名]
{
    [成员变量1类型] [成员变量1名];
    [成员变量2类型] [成员变量2名];
    ...
    [成员变量n类型] [成员变量n名];
}

下面是一个联合体的示例:

union number
{
    int i;
    float f;
};

可以通过以下方式声明联合体变量并访问:

union number n;
n.i = 10;
printf("%d\n", n.i);
n.f = 3.14;
printf("%f\n", n.f);
printf("%d\n", n.i);

这段代码中,先将 n.i 赋值为 10,然后将 n.f 赋值为 3.14。由于 n 的内存空间只有 4 个字节,所以在将 n.f 的值赋给 n.i 时,n.i 的值会发生改变。

示例说明

示例 1

假设需要设计一个学生成绩管理系统,每个学生有学号、姓名、年龄和成绩四个属性。定义一个结构体,然后通过动态内存分配的方式创建一个包含 3 个学生信息的数组,然后输出这个数组中每个学生的信息和总成绩。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct student
{
    int id;
    char name[20];
    int age;
    float score;
};

int main()
{
    struct student *stuArr;
    int i, n = 3;
    float sum = 0;
    stuArr = (struct student *)malloc(sizeof(struct student) * n);
    for (i = 0; i < n; i++)
    {
        printf("请输入第 %d 个学生的学号、姓名、年龄和成绩:", i + 1);
        scanf("%d %s %d %f", &stuArr[i].id, stuArr[i].name, &stuArr[i].age, &stuArr[i].score);
        sum += stuArr[i].score;
    }
    for (i = 0; i < n; i++)
    {
        printf("第 %d 个学生的信息:\n", i + 1);
        printf("学号:%d\n", stuArr[i].id);
        printf("姓名:%s\n", stuArr[i].name);
        printf("年龄:%d\n", stuArr[i].age);
        printf("成绩:%0.2f\n", stuArr[i].score);
    }
    printf("总成绩:%0.2f\n", sum);
    free(stuArr);
    return 0;
}

运行结果:

请输入第 1 个学生的学号、姓名、年龄和成绩:1001 张三 18 89.5
请输入第 2 个学生的学号、姓名、年龄和成绩:1002 李四 19 77.5
请输入第 3 个学生的学号、姓名、年龄和成绩:1003 王五 20 94.0
第 1 个学生的信息:
学号:1001
姓名:张三
年龄:18
成绩:89.50
第 2 个学生的信息:
学号:1002
姓名:李四
年龄:19
成绩:77.50
第 3 个学生的信息:
学号:1003
姓名:王五
年龄:20
成绩:94.00
总成绩:261.00

示例 2

假设需要设计一个数据类型转换程序,实现将整数、浮点数、字符等各种数据类型的值转换成字符串类型。由于不同类型的值要求显示的格式不同,因此可以使用联合体来存储各种类型的值。下面是这个程序的基本思路:

  1. 定义一个 union 类型 str,其中包含一个 char 数组 strArr 和一个整型变量 len,分别用来存储字符串和字符串的长度。
  2. 定义一个函数,它根据传入的数据类型将其值转换成字符串并存储到 str 变量中。具体转换方法如下:
  3. int 类型:使用 sprintf 函数将其转换为字符串。
  4. float 类型:使用 sprintf 函数将其转换为字符串,但需要指定格式为 "%.2f",表示保留 2 位小数。
  5. char 类型:直接将其赋值给 strArr 数组,同时将 len 变量赋值为 1。
  6. 其他类型:提示用户输入一个字符串,并将其赋值给 strArr 数组,并将 len 变量设为字符串的长度。
  7. 在主函数中分别测试各种类型的值的转换结果。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAXLEN 100

union str
{
    char strArr[MAXLEN];
    int len;
};

void convertToInt(int num, union str *s)
{
    sprintf(s->strArr, "%d", num);
    s->len = strlen(s->strArr);
}

void convertToFloat(float num, union str *s)
{
    sprintf(s->strArr, "%.2f", num);
    s->len = strlen(s->strArr);
}

void convertToChar(char c, union str *s)
{
    s->strArr[0] = c;
    s->len = 1;
}

void convertToString(char *str, union str *s)
{
    strcpy(s->strArr, str);
    s->len = strlen(s->strArr);
}

int main()
{
    union str s;
    int num = 123;
    convertToInt(num, &s);
    printf("%s\n%d\n\n", s.strArr, s.len);
    float fnum = 3.1415926;
    convertToFloat(fnum, &s);
    printf("%s\n%d\n\n", s.strArr, s.len);
    char c = 'a';
    convertToChar(c, &s);
    printf("%s\n%d\n\n", s.strArr, s.len);
    char str[MAXLEN];
    printf("请输入一个字符串:");
    scanf("%s", str);
    convertToString(str, &s);
    printf("%s\n%d\n\n", s.strArr, s.len);
    return 0;
}

运行结果:

123
3

3.14
5

a
1

请输入一个字符串:hello
hello
5

总结

本篇教程介绍了 C 语言中的结构体和联合体,讲解了它们的定义、声明和使用方法,并通过两个示例展示了它们在实际程序中的应用。同时,还向大家推荐了动态内存分配的方法。希望大家能够掌握这些知识并在实践中进行多次练习,提升自己的编程能力。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C 语言基础教程(我的C之旅开始了)[五] - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • C++中4种类型转换的方法分享

    当我们在C++编程中需要将一个数据类型转换为另一个数据类型时,可以使用以下四种类型转换方法: 1. 隐式类型转换 隐式类型转换(implicit conversion)是由编译器自动完成的类型转换,不需要程序员显式地调用转换函数或者使用强制类型转换运算符。例如,将整型变量赋给浮点型变量时,编译器会自动将整型变量转换为浮点型变量。示例代码如下: int i =…

    C 2023年5月30日
    00
  • C语言实现自行车存放管理系统

    C语言实现自行车存放管理系统攻略 简介 自行车存放管理系统是一种用于管理自行车存放的软件系统,旨在为用户提供方便快捷的自行车存放服务,并帮助用户进行存放位置和存放时长的管理。本攻略将详细介绍如何使用C语言实现自行车存放管理系统。 系统需求 本系统需要满足以下功能需求: 注册用户账号 登录到系统 存放自行车 取出自行车 查询自行车存放信息 数据结构设计 为了实…

    C 2023年5月23日
    00
  • 浅谈静态变量、成员变量、局部变量三者的区别

    浅谈静态变量、成员变量、局部变量三者的区别 定义和声明 静态变量:在函数内部或类的成员变量之外声明的变量,具有静态存储持续时间,意味着在整个程序执行期间都会一直存在,并且只会给初始化一次。 成员变量:定义在类中的变量,只有在创建对象时才会被初始化,属于每个对象所特有,不同的对象具有独立的成员变量。 局部变量:定义在函数或者代码块内部的变量,只在函数内或者该代…

    C 2023年5月22日
    00
  • Win10提示错误代码 0xc000012F(坏图像)怎么办?

    首先,针对Win10提示错误代码 0xc000012F(坏图像),我们可以采取以下几个步骤进行处理: 确认错误类型 在处理问题之前,我们需要明确错误类型。针对这个错误代码,我们可以初步推断是系统文件损坏导致,因此我们可以采取以下思路进行处理。 运行磁盘扫描 在确认了错误类型之后,我们可以通过运行磁盘扫描,检查系统文件是否存在问题。具体的步骤如下: 打开“此电…

    C 2023年5月23日
    00
  • Qt线程池QThreadPool的使用详解

    接下来我将详细讲解“Qt线程池QThreadPool的使用详解”的完整攻略,并且提供两条示例说明。 Qt线程池QThreadPool的使用详解 什么是Qt线程池 Qt线程池(QThreadPool)是一个线程池管理器,可以管理多个线程。通过QThreadPool的api,我们可以创建、销毁线程,设置线程池最大线程数,以及任务的优先级等等。 Qt线程池的使用步…

    C 2023年5月22日
    00
  • C++实现ping程序实例

    下面我将详细解释如何使用C++实现ping程序。先说一下ping程序的原理,它的作用是测试网络连接是否正常,通常是通过向相应的网络主机发送数据包并接收响应包,来计算数据包的往返时间和丢失率。 在C++中,要实现ping程序,我们需要使用操作系统提供的网络编程API,比如Linux中的socket API。下面是实现ping程序的具体步骤: 创建socket …

    C 2023年5月23日
    00
  • Go错误和异常CGO fallthrough处理教程详解

    Go错误和异常CGO fallthrough处理教程详解 异常和错误的区别 在Go语言中,没有类似于Java的异常处理机制,而是采用了错误处理机制。Go语言中的错误是一种可以提前预判到的普通值,包含了自定义的错误信息。与其他语言不同,Go语言中的错误处理是基于返回值的,而不是异常。 如何处理错误 在Go语言中,一个函数的返回值通常由一个值和一个错误组成。当函…

    C 2023年5月23日
    00
  • 基于C语言实现五子棋游戏完整实例代码

    基于C语言实现五子棋游戏完整实例代码攻略 1. 程序概述 五子棋,一种传统的策略性棋类游戏。本文主要介绍使用C语言编写五子棋游戏的实例代码过程。该代码使用了控制台界面实现,基于Windows操作系统。 2. 程序实现 (1)游戏逻辑实现 游戏逻辑设计了游戏的核心模块,包括棋盘的绘制、游戏过程的实时响应、胜负判断等等。游戏逻辑由主函数以及多个子函数组成。 (2…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部