c语言笔记之自定义数据类型

14 自定义数据类型

14.1 枚举

语法规则:

enum 枚举名称 
{
    枚举元素1,
    枚举元素2,
    ...
    枚举元素N
};

注意:元素之间是用逗号,逗号隔开的,真无语。



烦死了,今天放假了,似乎又没有

img


特点:

枚举元素的值必须在同一枚举中是唯一的.

枚举元素的值必须是整数类型,通常是int

如果没有为枚举元素指定值,编译器会自动为它们分配值,从0开始,依次递增。

定义枚举的时候也可以为枚举元素自定义值,需保证唯一性和整型类型。

如果有的元素赋值,有的元素没赋值,没有赋值元素的值是,紧挨着的,上一个,元素的值加1

14.1.4 枚举的应用

枚举常量的值应该是连续的,如果不连续,则无法遍历。

也不是完全不会遍历,会遍历一部分,或者是错的

#include<stdio.h>

enum Weekday{
    MOD = 1,
    TUE,
    WED,
    THU = 7,
    FRI = 9,
    SAT,
    SUN
}day;

int main(){

    //用循环遍历出所有的枚举常量
    for (day = MOD; day < SUN; day++)
    {
        printf("%d\n",day);
    }
    
    return 0;
}
//1       2       3       4       5       6       7       8     //  9       10

这个循环的判断条件是day < 11,但是初始条件MOD = 1,所以会遍历从1 到10,会出现一个不正常的赋值。

枚举可以和switch结合。

14.2 结构体

14.2.3 声明结构体
struct 结构体名
{ 
    数据类型1 成员名1;   
    数据类型2 成员名2; 
    ……
    数据类型n 成员名n;
};

元素之间是用分号隔开,

14.2.4 声明结构体变量
// 定义结构体
struct Student
{
    int id;           // 学号
    int age;          // 年龄
    char *name;       // 姓名
    char gender;      // 性别
    char *address;    // 家庭住址
};

// 定义结构体变量
struct Student stu1,stu2;

Student是结构体

stu1,stu2是结构体变量

14.2.5 成员的获取和赋值

了解一下指针的赋值和取值

#include <stdio.h>

// 声明结构体以及结构体变量,并给结构体成员赋值
struct Student{
     int id;        // 学号
     int age;       // 年龄
     char *name;    // 姓名
     char gender;   // 性别
     char *address; // 家庭住址
};

int main()
{
    struct Student stu1;
    stu1 = {1002, 19, "Jim Liu", 'f', "Songjiang Shanghai"};
    // 获取成员的值
    printf("id: %d \n", stu1.id);
    printf("name: %s \n", stu1.name);
    printf("age: %d \n", stu1.age);
    printf("gender: %c \n", stu1.gender);
    printf("address: %s \n \n", stu1.address);
    return 0;
}
14.2.6 结构体指针

是一个指针,指向结构体。

语法规则:

struct 结构体名 *结构体指针变量名;

​ 结构体指针访问结构体成员用 ->

好几个方法可以访问成员变量的值:look

#include<stdio.h>

struct Student
{
    char * name;
    int age;
    char sex;
    double score;
};

int main(){

    struct Student stu = {"cuicui",12,'f',76.5};
    struct Student *pstu = &stu;
    printf("name = %s\n",pstu->name);
    printf("age = %d\n",(*pstu).age);
    printf("sex = %c\n",(&stu)->sex);
    printf("score = %lf\n",stu.score);
    return 0;
}

// name = cuicui
// age = 12
// sex = f
// score = 76.500000
14.2.7 案例

小狗案例:

编写一个Dog结构体,包含name(char *)、age(int)、weight(double)属性。
编写一个say函数,返回字符串,方法返回信息中包含所有成员值。
在main方法中,创建Dog结构体变量,调用say函数,将调用结果输出

#include <stdio.h>

struct Dog
{
    char *name;
    int age;
    double weight;
};

char *say(struct Dog dog)
{
    static char info[50];
    sprintf(info, "name=%s,age=%d,weight=%.2lf", dog.name, dog.age, dog.weight);
    return info;
}

int main()
{
    struct Dog dog;
    dog.name = "小黄";
    dog.age = 12;
    dog.weight = 45;
    char *info = say(dog);
    printf("%s", info);
    return 0;
}

盒子案例:

(1)编程创建一个Box结构体,在其中定义三个成员表示一个立方体的长、宽和高,长宽高可以通过控制台输入。
(2)定义一个函数获取立方体的体积(volume)。
(3)创建一个结构体指针,打印给定尺寸的立方体的体积。

#include <stdio.h>

struct Box{
    double length;
    double wide;
    double high;
};

void volumn(struct Box *box){

    double mult = (box->high) * (box->length) * (box->wide);
    printf("%lf", mult);
}

int main(){
    struct Box *box;
    printf("请输入盒子的长:");
    scanf("%lf", &box->length);

    printf("请输入盒子的宽:");
    scanf("%lf", &box->wide);

    printf("请输入盒子的高:");
    scanf("%lf", &box->high);
    volumn(box);
    return 0;
}

景区门票案例:

(1)一个景区根据游人的年龄收取不同价格的门票。

(2)请编写游人结构体(Visitor),根据年龄段决定能够购买的门票价格并输出。

(3)规则:年龄>18,门票为20元,其它情况免费。

(4)可以循环从控制台输入名字和年龄,打印门票收费情况,如果名字输入n,则退出程序。

#include<stdio.h>

struct Visitor
{
    char *name;
    int age;
    double peice;
};

void tick(struct Visitor *visitor){

    if (visitor->age > 18)
    {
        visitor->peice = 20;
    }else{
        visitor->peice = 0;
    }
    

}


int main(){

    struct Visitor *visitor;

    while (1)
    {
        printf("请输入游客的名字");
        scanf("%s",visitor->name);
        if (!strcmp("n",visitor->name))
        {
            break;
        }else{
            printf("请输入游客的年龄:");
            scanf("%d",&(visitor->age));
            tick(visitor);
            printf("游客应当付:%.2lf\n",visitor->peice);

        }
        
    }
    return 0;
}

14.3 共用体

共用体与结构体是不一样的,共用体是凉饿成员共用一个内存区,后一个成员的值会占据前一个成员的值。他的长度是以最长的变量所占的内存为主。

14.3.2 声明共用体

格式:

union 共用体类型名称{
    数据类型 成员名1;
    数据类型 成员名2;
    ...
    数据类型 成员名3;
}

14.3.3 声明共用体变量

这三种自定义数据类型结构声明共用体变量都一样。

1.先定义类型再定义变量

2.定义类型的同时一起定义变量

3.不给类型名直接定义变量

14.3.4 共用体内存分析

以最长的成员变量进行分配

14.3.5 成员的获取和赋值
//方式1
union data a;
a.c = 4;

//方式2
union data a = {.c = 4};

//方式3
union data a = {8};

14.4 typedef

14.4.1 typedef

为其他的数据类型起别名

typedef 类型名 别名;

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值