枚举 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.声明函数时,形参为指针时,只用写指针类型和*,先可以不写指针名
在定义函数时,要带上指针名,因为函数内要用形参名操作
参数为结构体性状,输入结构体地址,可直接对结构体内的值进行调整
*/
本文主要介绍了C/C++中枚举和结构体的使用。枚举中的单词被赋予顺序数值,本身为int类型且不可改变。结构体可包含各种类型的数据,可作为函数参数,单个结构名能返回主函数多个结构体内的变量值,还介绍了结构体指针的赋值和使用方法。
2279

被折叠的 条评论
为什么被折叠?



