首页 > 编程语言 >C语言程序设计-11 结构体与共用体

C语言程序设计-11 结构体与共用体

时间:2024-06-19 22:30:24浏览次数:26  
标签:11 ps name C语言 stu score printf 程序设计 struct

11.1 定义一个结构的一般形式

11.2 结构类型变量的说明

1. 先定义结构,再说明结构变量。

2. 在定义结构类型的同时说明结构变量。

3. 直接说明结构变量。

11.3 结构变量成员的表示方法

11.4 结构变量的赋值

结构变量的赋值就是给各成员赋值。可用输入语句或赋值语句来完成。
【例 11.1】给结构变量赋值并输出其值。

#include <math.h>
#include <stdio.h>

void main()
{
    struct stu
    {
        int num;
        char *name;
        char sex;
        float score;
    } boy1, boy2;
    boy1.num = 102;
    boy1.name = "Zhang ping";
    printf("input sex and score\n");
    scanf("%c %f", &boy1.sex, &boy1.score);
    boy2 = boy1;
    printf("Number=%d\nName=%s\n", boy2.num, boy2.name);
    printf("Sex=%c\nScore=%f\n", boy2.sex, boy2.score);
    
}

本程序中用赋值语句给 num 和 name 两个成员赋值,name 是一个字符串指针变量。用 scanf
函数动态地输入 sex 和 score 成员值,然后把 boy1 的所有成员的值整体赋予 boy2。最后分
别输出 boy2 的各个成员值。本例表示了结构变量的赋值、输入和输出的方法。

11.5 结构变量的初始化

和其他类型变量一样,对结构变量可以在定义时进行初始化赋值。
【例 11.2】对结构变量初始化。

#include <math.h>
#include <stdio.h>

void main()
{
    struct stu /*定义结构*/
    {
        int num;
        char *name;
        char sex;
        float score;
    } boy2, boy1 = {102, "Zhang ping", 'M', 78.5};
    boy2 = boy1;
    printf("Number=%d\nName=%s\n", boy2.num, boy2.name);
    printf("Sex=%c\nScore=%f\n", boy2.sex, boy2.score);
}

本例中,boy2,boy1 均被定义为外部结构变量,并对 boy1 作了初始化赋值。在 main 函
数中,把 boy1 的值整体赋予 boy2,然后用两个 printf 语句输出 boy2 各成员的值。

11.6 结构数组的定义

【例 11.3】计算学生的平均成绩和不及格的人数。

#include <math.h>
#include <stdio.h>

struct stu
{
    int num;
    char *name;
    char sex;
    float score;
} boy[5] = {
    {101, "Li ping", 'M', 45},
    {102, "Zhang ping", 'M', 62.5},
    {103, "He fang", 'F', 92.5},
    {104, "Cheng ling", 'F', 87},
    {105, "Wang ming", 'M', 58},
};
void main()
{
    int i, c = 0;
    float ave, s = 0;
    for (i = 0; i < 5; i++)
    {
        s += boy[i].score;
        if (boy[i].score < 60)
            c += 1;
    }
    printf("s=%f\n", s);
    ave = s / 5;
    printf("average=%f\ncount=%d\n", ave, c);
}

本例程序中定义了一个外部结构数组 boy,共 5 个元素,并作了初始化赋值。在 main 函
数中用 for 语句逐个累加各元素的 score 成员值存于 s 之中,如 score 的值小于 60(不及格)
即计数器 C 加 1,循环完毕后计算平均成绩,并输出全班总分,平均分及不及格人数。

【例 11.4】建立同学通讯录

#include "stdio.h"
#define NUM 3


struct mem
{
    char name[20];
    char phone[10];
};
void main()
{
    struct mem man[NUM];
    int i;
    for (i = 0; i < NUM; i++)
    {
        printf("input name:\n");
        gets(man[i].name);
        printf("input phone:\n");
        gets(man[i].phone);
    }
    printf("name\t\t\tphone\n\n");
    for (i = 0; i < NUM; i++)
        printf("%s\t\t\t%s\n", man[i].name, man[i].phone);
}

本程序中定义了一个结构 mem,它有两个成员 name 和 phone 用来表示姓名和电话号码。
在主函数中定义 man 为具有 mem 类型的结构数组。在 for 语句中,用 gets 函数分别输入各
个元素中两个成员的值。然后又在 for 语句中用 printf 语句输出各元素中两个成员值。

11.7 结构指针变量的说明和使用

11.7.1 指向结构变量的指针

下面通过例子来说明结构指针变量的具体说明和使用方法。
【例 11.5】

#include "stdio.h"
#define NUM 3

struct stu
{
    int num;
    char *name;
    char sex;
    float score;
} boy1 = {102, "Zhang ping", 'M', 78.5}, *pstu;
main()
{
    pstu = &boy1;
    printf("Number=%d\nName=%s\n", boy1.num, boy1.name);
    printf("Sex=%c\nScore=%f\n\n", boy1.sex, boy1.score);
    printf("Number=%d\nName=%s\n", (*pstu).num, (*pstu).name);
    printf("Sex=%c\nScore=%f\n\n", (*pstu).sex, (*pstu).score);
    printf("Number=%d\nName=%s\n", pstu->num, pstu->name);
    printf("Sex=%c\nScore=%f\n\n", pstu->sex, pstu->score);
}

本例程序定义了一个结构 stu,定义了 stu 类型结构变量 boy1 并作了初始化赋值,还定
义了一个指向 stu 类型结构的指针变量 pstu。在 main 函数中,pstu 被赋予 boy1 的地址,因
此 pstu 指向 boy1。然后在 printf 语句内用三种形式输出 boy1 的各个成员值。从运行结果
可以看出:
结构变量.成员名
(*结构指针变量).成员名
结构指针变量->成员名
这三种用于表示结构成员的形式是完全等效的。

11.7.2 指向结构数组的指针

【例 11.6】用指针变量输出结构数组。

#include "stdio.h"
#define NUM 3

struct stu
{
    int num;
    char *name;
    char sex;
    float score;
} boy[5] = {
    {101, "Zhou ping", 'M', 45},
    {102, "Zhang ping", 'M', 62.5},
    {103, "Liou fang", 'F', 92.5},
    {104, "Cheng ling", 'F', 87},
    {105, "Wang ming", 'M', 58},
};
main()
{
    struct stu *ps;
    printf("No\tName\t\t\tSex\tScore\t\n");
    for (ps = boy; ps < boy + 5; ps++)
        printf("%d\t%s\t\t%c\t%f\t\n", ps->num, ps->name, ps->sex, ps->score);
}

11.7.3 结构指针变量作函数参数

【例 11.7】计算一组学生的平均成绩和不及格人数。用结构指针变量作函数参数编程。

#include "stdio.h"

struct stu
{
    int num;
    char *name;
    char sex;
    float score;
} boy[5] = {
    {101, "Li ping", 'M', 45},
    {102, "Zhang ping", 'M', 62.5},
    {103, "He fang", 'F', 92.5},
    {104, "Cheng ling", 'F', 87},
    {105, "Wang ming", 'M', 58},
};
main()
{
    struct stu *ps;
    void ave(struct stu * ps);
    ps = boy;
    ave(ps);
}
void ave(struct stu *ps)
{
    int c = 0, i;
    float ave, s = 0;
    for (i = 0; i < 5; i++, ps++)
    {
        s += ps->score;
        if (ps->score < 60)
            c += 1;
    }
    printf("s=%f\n", s);
    ave = s / 5;
    printf("average=%f\ncount=%d\n", ave, c);
}

本程序中定义了函数 ave,其形参为结构指针变量 ps。boy 被定义为外部结构数组,因
此在整个源程序中有效。在 main 函数中定义说明了结构指针变量 ps,并把 boy 的首地址赋
予它,使 ps 指向 boy 数组。然后以 ps 作实参调用函数 ave。在函数 ave 中完成计算平均成
绩和统计不及格人数的工作并输出结果。
由于本程序全部采用指针变量作运算和处理,故速度更快,程序效率更高。

11.8 动态存储分配

【例 11.8】分配一块区域,输入一个学生数据。

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

main()
{
    struct stu
    {
        int num;
        char *name;
        char sex;
        float score;
    } *ps;
    ps = (struct stu *)malloc(sizeof(struct stu));
    ps->num = 102;
    ps->name = "Zhang ping";
    ps->sex = 'M';
    ps->score = 62.5;
    printf("Number=%d\nName=%s\n", ps->num, ps->name);
    printf("Sex=%c\nScore=%f\n", ps->sex, ps->score);
    free(ps);
}

本例中,定义了结构 stu,定义了 stu 类型指针变量 ps。然后分配一块 stu 大内存区,
并把首地址赋予 ps,使 ps 指向该区域。再以 ps 为指向结构的指针变量对各成员赋值,并用
printf 输出各成员值。最后用 free 函数释放 ps 指向的内存空间。整个程序包含了申请内存
空间、使用内存空间、释放内存空间三个步骤,实现存储空间的动态分配。

11.9 链表的概念

【例 11.9】建立一个三个结点的链表,存放学生数据。为简单起见, 我们假定学生数据结
构中只有学号和年龄两项。可编写一个建立链表的函数 creat。程序如下:

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

#define NULL1 0
#define TYPE struct stu
#define LEN sizeof(struct stu)
struct stu
{
    int num;
    int age;
    struct stu *next;
};
TYPE *creat(int n)
{
    struct stu *head, *pf, *pb;
    int i;
    for (i = 0; i < n; i++)
    {
        pb = (TYPE *)malloc(LEN);
        printf("input Number and Age\n");
        scanf("%d%d", &pb->num, &pb->age);
        if (i == 0)
            pf = head = pb;
        else
            pf->next = pb;
        pb->next = NULL1;
        pf = pb;
    }
    return (head);
}

在函数外首先用宏定义对三个符号常量作了定义。这里用 TYPE 表示 struct stu,用 LEN
表示 sizeof(struct stu)主要的目的是为了在以下程序内减少书写并使阅读更加方便。结构
stu 定义为外部类型,程序中的各个函数均可使用该定义。
creat 函数用于建立一个有 n 个结点的链表,它是一个指针函数,它返回的指针指向 stu
结构。在 creat 函数内定义了三个 stu 结构的指针变量。head 为头指针,pf 为指向两相邻结
点的前一结点的指针变量。pb 为后一结点的指针变量。

11.10 枚举类型

11.10.1 枚举类型的定义和枚举变量的说明

11.10.2 枚举类型变量的赋值和使用

【例 11.10】

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

main()
{
    enum weekday
    {
        sun,
        mon,
        tue,
        wed,
        thu,
        fri,
        sat
    } a,
        b, c;
    a = sun;
    b = mon;
    c = tue;
    printf("%d,%d,%d", a, b, c);
}

【例 11.11】

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

main()
{
    enum body
    {
        a,
        b,
        c,
        d
    } month[31],
        j;
    int i;
    j = a;
    for (i = 1; i <= 30; i++)
    {
        month[i] = j;
        j++;
        if (j > d)
            j = a;
    }
    for (i = 1; i <= 30; i++)
    {
        switch (month[i])
        {
        case a:
            printf(" %2d %c\t", i, 'a');
            break;
        case b:
            printf(" %2d %c\t", i, 'b');
            break;
        case c:
            printf(" %2d %c\t", i, 'c');
            break;
        case d:
            printf(" %2d %c\t", i, 'd');
            break;
        default:
            break;
        }
    }
    printf("\n");
}

11.11 类型定义符 typedef

typedef 定义的一般形式为:
typedef 原类型名 新类型名

标签:11,ps,name,C语言,stu,score,printf,程序设计,struct
From: https://blog.csdn.net/qq_43071699/article/details/139812921

相关文章

  • C语言程序设计-10 指针
    指针是C语言中广泛使用的一种数据类型。运用指针编程是C语言最主要的风格之一。利用指针变量可以表示各种数据结构;能很方便地使用数组和字符串;并能象汇编语言一样处理内存地址,从而编出精练而高效的程序。指针极大地丰富了C语言的功能。学习指针是学习C语言中最重要的一环,能......
  • C语言程序设计-8 函 数
    8.1概述在前面已经介绍过,C源程序是由函数组成的。虽然在前面各章的程序中大都只有一个主函数main(),但实用程序往往由多个函数组成。函数是C源程序的基本模块,通过对函数模块的调用实现特定的功能。C语言中的函数相当于其它高级语言的子程序。C语言不仅提供了极为丰富的库函......
  • 6.11
    我第一周的计划抽出时间弥补之前的欠缺并提高自己的编程能力。熟练掌握安卓系统的增删改查操作,能够独立完成课程要求内容。总的来说,勉强达到了课程要求,但是还是远远不够你在课程开始快速浏览了《构建之法》,提了 5个问题,请回顾那些问题,自己回答它们。如果不能回答,为何软......
  • linux下C语言如何操作文件(四)
    structstring_segment*parse_path(constchar*file_path)函数,解析路径,将一个linux的路径分成两部分路径和文件名。返回一个字符串分段接头体指针,里边有三个字符串。第0个是原始的file_path,第二个是已经拆分好的路径,第三个是文件名部分。代码如下:/***解析linux下的路径......
  • 6.11
    数据库规范化是设计数据库结构的过程,旨在减少数据冗余、提高数据完整性。反规范化则是为了提高数据查询的速度和性能而有意地添加冗余数据。--规范化示例:用户表和订单表CREATETABLEUsers(UserIDINTPRIMARYKEY,UserNameVARCHAR(50));CREATETABLEOrders......
  • 5.11
    实验三  综合性训练(搭建中小企业园区网)  一、实验目的:1.通过对网络设备的连通和对拓扑的分析,加深对常见典型局域网拓扑的理解;2.通过路由建立起网络之间的连接,了解网络路由的设计与配置;3.进一步熟悉交换机、路由器的基本操作命令。二、实验设备:PacketTracer三、实验拓......
  • win11安装WSL
    win11安装WSLwsl与Linux发行版之间的关系:要先安装wsl才能安装Linux发行版。wsl1和wsl2的区别:wsl2提供了完整的Linux内核。所谓wsl1改为wsl2,实际上是将Linux发行版的版本改为2,如:wsl--set-versionUbuntu-22.042,将Ubuntu-22.04转到wsl2。wsl.conf和.wslconfig配置wsl.conf......
  • 双11互联网电商Java秒杀解决方案 视频教程 下载
    双11互联网电商Java秒杀解决方案视频教程下载001_课程介绍.wmv002_学习目标.wmv003_如何设计一个秒杀系统.wmv004_项目搭建.wmv005_2次MD5加密.wmv006_逆向工程.wmv007_功能开发前期准备工作.wmv008_开发登录功能.wmv009_测试登录功能.wmv010_自定义注解参数校验.......
  • 4.11
    《构建之法》是一本深入探讨软件工程实践与项目管理精髓的书籍,它不仅仅局限于技术层面的讲解,而是从更广阔的视角出发,涵盖了团队协作、项目规划、质量控制、持续集成等多个方面,为读者提供了一套全面而实用的软件开发方法论。阅读此书后,我深受启发,以下是我几点深刻的体会。首先,书中......
  • 3.11
    时长:二十分钟左右代码量:7-1jmu-python-输入输出-计算字符串中的数分数10全屏浏览切换布局作者 郑如滨单位 集美大学将字符串中的每个数都抽取出来,然后统计所有数的个数并求和。输入格式:一行字符串,字符串中的数之间用1个空格或者多个空格......