枚举与结构体

本文主要介绍了C/C++中枚举和结构体的使用。枚举中的单词被赋予顺序数值,本身为int类型且不可改变。结构体可包含各种类型的数据,可作为函数参数,单个结构名能返回主函数多个结构体内的变量值,还介绍了结构体指针的赋值和使用方法。

枚举 eunm

当定义很多定义很多字母为顺序数字,枚举中的每一个单词都被赋予顺序数值,本身为int类型,且不可改变

定义:

enum 大写类型名字{变量名=数字,变量名 ,...... }枚举名;

enum 大写类型名字{变量名=数字,变量名 ,...... };

enum 大写类型名字 枚举名;

使用

变量名相当于数字去使用

#include<stdio.h>
int main()
{
    enum CLPLOR
    {red,yellow,green, blue};         //未定义时red下角标为0,后面一次递增,表示 red=0,yellow=1
    enum CLPLOR c;                    //enum CLPLOR=int c枚举名;相当于int c
    c = red;                        //c=0

    int b;                            
    b = yellow;                        //b=1

    b = b * c;                        //

    printf("%d",b);
    return 0;
}

 

 结构体

包含各种类型的数据

#include<stdio.h>
int main()
{
    /*方式一*/
    struct student                        //struct student都为数据类型
    {
        int num;
        char name[32];
    };

    student lucy = { 100,"lucy" };            //lucy为结构体名,赋值通过顺序和数据类型赋值

    printf("%d\n", lucy.num);                //结构体调用;结构名.内变量名


    /*方式二*/
    struct theacher
    {
        int year;
        char tname[33];
    }linux;                                //赋予结构体的第二种名字                    
    linux.year = 17;                    //给结构体赋值的第二种方式
    printf("%d\n",linux.year);    


    /**/
    struct                                //该函数为无名结构,正常只能使用一次
    {
        int a=11;                        //结构体内赋值的三种方式

    }phd;
    printf("%d\n",phd.a);

    
    /*结构体赋值*/


    struct ios
    {
        int day;
        int year;
        int mons;
    };
    ios p1={ 30,2022,10 };;
    
    struct ios art;
    art = p1;                    //结构体不同于函数,结构体可赋值,结构变量名仅代表值,而不是地址

    printf("今天是时间是%i-%i-%i\n",p1.year,p1.mons,p1.day);
    printf("今天是时间是%i-%i-%i\n", art.year, art.mons, art.day);

    return 0;
}

结构体作为函数参数:可以少些参数,而调用多个变量

#include<stdio.h>
#pragma warning(disable:4996)
/*计算明天日期*/
struct date
{
    int month;
    int day;
    int year;
};

bool isleap(struct date d);      //声明两函数
int number0fDays(struct date d);

int main()
{
    struct date today,tomorrow;    //定义两个存储日期结构名
    
    printf("请输入今天的日期(日 月 年)");
    scanf("%i %i %i",&today.year,&today.month,&today.day);

    if (today.day != number0fDays(today))    //但今天不是这个月最后一天,则只有天加一
    {
        tomorrow.day = today.day + 1;
        tomorrow.month = today.month;
        tomorrow.year = today.year;
    }
    else if(today.month==12)            //单位12月的最后一天,日,月变成一,年加一
    {
        tomorrow.day = 1;
        tomorrow.month = 1;
        tomorrow.year =today.year+1;
    }

    /*当为这个月的最后一天,天变一,月加一,年不变,*/
    else
    {
        tomorrow.day = 1;
        tomorrow.month = today.month++;
        tomorrow.year = today.year;
    }
    printf("明天的日期是%i-%i-%i",tomorrow.year,tomorrow.month,tomorrow.day);

    return 0;
}


bool isleap(struct date d)                    //定义函数,判断是否为润年
{
    bool leap = false;                        
    /*bool判断真假,储存0和1int数据类型,leap为该类型变量名,正常返回假,不是闰年*/


    if ((d.year % 4 == 0 && d.year % 100 != 0) || d.year % 400 == 0)        //当为闰年,4,100或400都能整除时
        leap = true;
    return 0;
}


int number0fDays(struct date d)                   //判断这个月有多少天
{
    int day;

    const int daysPerMonth[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };    //储存每个月有多少天
    if (d.month == 2 && isleap(d))                        //当为参数为二月且为闰年,二月就是29天
        day = 29;                                        //返回29天
    else
        day = daysPerMonth[d.month - 1];                //输入的月份-1找到对应数组的天数
    return day;
}
/*总结
1.bool类型的变量从

#include<stdio.h>
#pragma warning(disable:4996)
int main()
{
    struct date            //为什么归属于结构类型而不是结构名,可能结构体内有各种类型变量排列,而这特殊排列赋予一种结构名称
    {
        int month;
        int day;
        int year;
    }myday;

    struct date* p = &myday;     //同类型的结构体,将结构体地址赋予相同类型指针

 /*结构指针的两种赋值方式*/

    (*p).month = 12;                //*p就是myday,升级为下一种方法,更容易编写
    p->month = 12;                    //->表示指针所指的结构体中的成员
    return 0;
}
 

函数返回到循环判断
2.定义形参数为结构体,结构体名可随意取,只用意义,实际看输入什么值
3.调用结构体函数时,实际参数输入结构名,即可以使用结构体内数据
*/

单个结构名可以返回主函数多个结构体内的变量值

#include<stdio.h>
#pragma warning(disable:4996)

struct point
{
    int x;
    int y;
};

struct point getStruct(void);
void output(struct point);

int main(int argc,char const*argv)
{
    struct point y = {0,0};                    //对结构体两个赋值

    /*调用两个函数*/

    y=getStruct();                            //得到返回的结构体
    output(y);
}

struct point getStruct(void)
{
    struct point p;
    scanf("%d",&p.x);                    //对结构体两个赋值
    scanf("%d",&p.y);
    printf("%d,%d\n",p.x,p.y);            
    return p;                            //对该函数的内赋值的结构体返回
}

void output(struct point p)
{
    printf("%d,%d",p.x,p.y);
}

/*除了指针和数组作为函数参数,其他参数(结构体,变量)都只是传入了值,对主体函数的变量并无变化
而指针作为参数,将变量的地址输入进去,通过*指针形参指针名,对该地址的值进行操作,且无需传回
数组作为参数,同样接受地址,也i可以数组[序号]对值操作
结构体也可以通过返回结构体名,用于多个变量的返回*/

结构体形指针

#include<stdio.h>
#pragma warning(disable:4996)
int main()
{
    struct date            //为什么归属于结构类型而不是结构名,可能结构体内有各种类型变量排列,而这特殊排列赋予一种结构名称
    {
        int month;
        int day;
        int year;
    }myday;

    struct date* p = &myday;     //同类型的结构体,将结构体地址赋予相同类型指针

 /*结构指针的两种赋值方式*/

    (*p).month = 12;                //*p就是myday,升级为下一种方法,更容易编写
    p->month = 12;                    //->表示指针所指的结构体中的成员
    return 0;
}

或者

#include<stdio.h>
#pragma warning(disable:4996)

struct point                    //两结构体
{
    int x;
    int y;
};


struct point* getStruct(struct point*);        //参数struct poin类型结构体的指针
void output(const struct point *p);            //打印函数
void print(const struct point *p);

int main( int argc,char const*argv[])     
{
    struct point y = { 0,0 };
    printf("%d,%d\n",y.x,y.y);
    getStruct(&y);                        //传入struct poin类型的结构体地址,可以对该结构体内的变量进行操作
    output(y);                            //存入结构体打印
    output(*getStruct(&y));                //使用p所指向的结构体 
    print(getStruct(&y));                    //使用getStruct传回的指针
    return 0;
}

struct point* getStruct(struct point*p)                //传入的结构体地址上的值进行操作
{
    scanf("%d",&p->x);                                //对p指向的结构体内x成员进行赋值
    scanf("%d",&p->y);
    printf("%d,%d/n",p->x,p->y);
    return p;                                        //返回指针
}

void output(struct point p)
{
    printf("%d,%d/n", p.x, p.x);
}

void print(const struct point* p)
{
    printf("%d,%d",p->x,p->y);
}


/*1.声明函数时,形参为指针时,只用写指针类型和*,先可以不写指针名
在定义函数时,要带上指针名,因为函数内要用形参名操作
参数为结构体性状,输入结构体地址,可直接对结构体内的值进行调整
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值