【结构体】
1.为什么需要结构体
为了表示一些复杂的事物,而普通的基本类型无法满足实际要求
2.什么叫结构体
把一些基本数据类型组合在一起形成的一个新的复合数据类型叫做结构体
3.如何定义结构体:
有三种方式:
第一种方式: //这只是定义了一个新的数据类型,并没有定义变量
struct Student
{
int age;
float score;
char sex;
}; //最好也最常用的是第一种方式
第二种方式:
struct Student2
{
int age;
float score;
char sex;
} st2;
第三种方式:
struct
{
int age;
float score;
char sex;
} st3;
4.如何使用结构体变量:
赋值和初始化
定义的同时可以整体赋初值
如果定义完之后,则只能单个的赋初值
----------------------------------------
#include
struct Student
{
int age;
float score;
char sex;
};
int main(void)
{
struct Student st = {80, 66.6, 'F'}; //初始化,定义的同时赋初值
struct Student st2;
st2.age = 10;
st2.score = 99;
st2.sex = 'F'; //像这样,定义完之后,就只能单个的赋初值
printf("%d %f %c\n",st.age,st.score,st.sex);
printf("%d %f %c\n",st2.age,st2.score,st2.sex);
return 0;
}
-------------------------------------------------------
5.如何取出结构体变量中的每一个成员
5.1 结构体变量名.成员名
5.2 指针变量->成员名 这种方式更常用
在计算机内部会被转化成 (*指针变量).变量名 的方式来执行
-----------------------------------
#include
struct Student
{
int age;
float score; 《======= 定义的结构体部分
char sex;
}; //分号千万不能省
int main(void)
{
struct Student st = {80, 66.6F, 'F'}; //初始化,定义的同时赋初值,st是结构体struct Student定义的变量
struct Student *pst = &st; //&st不能改成st
//可以把 struct Student * 类似于是指针变量名左边的 int *
pst->age = 99; //指针的这种方式,也是第二种方式
st.score = 66.6f; //直接赋值这种方式,是第一种方式
//66.6在c语言中默认是double,如果希望默认一个实数是float类型,则必须在末尾加f或者F
//因此66.6是double,66.6f或66.6F是float类型
printf("%d %f\n",st.age,pst->score);
return 0;
}
解析:
1.pst->age 在计算机内部会被转化成(*pst).age 这是一种硬性的规定
2.pst->age 等价于 (*pst).age 也等价于 st.age
3.所以pst->age = 99;就相当于 st.age = 99;
4.pst->age 的含义:
pas所指向的是struct Student结构体变量中的age这个成员
6.结构体变量的运算
结构体变量不能相加,不能相减,也不能相互乘除
但结构体变量可以相互赋值:
--------------------------
struct Student st1,st2;
st1 + st2 st1 * st2 st1 / st2 都是错误的
st1 = st2 或者 st2 = st1 都是正确的
---------------------------------------------------
7.结构体变量和结构体变量指针作为函数参数传递的问题
推荐使用结构体变量作为函数参数来传递
-----------------------------------------------------
通过函数完成对结构体变量的输入和输出:
#include
#include
struct Student
{
int age;
char sex;
char name[100];
}; //分号千万不能省
void InputStudent(struct Student *); //InputStudent函数的声明
void OutputStudent(struct Student *); //OutputStudent函数的声明
int main(void)
{
struct Student st; //第12行
InputStudent(&st); //对结构体变量输入 必须发送st的地址
//printf("%d %c %s\n",st.age, st.sex, st.name);
OutputStudent(&st); //对结构体变量输出 可以发送st的弟子也可以直接发送st的内容
//但为了减少内存的耗费,也为了提高执行速度,推荐发送地址
return 0;
}
void InputStudent(struct Student *pstu) //pstu只占4个字节
{
(*pstu).age = 10;
pstu->sex = 'F';
strcpy(pstu->name,"张三"); //或者可以写成 strcpy((*pstu).name ="张三");
}
void OutputStudent(struct Student *ss)
{
printf("%d %c %s\n",ss->age, ss->sex, ss->name);
}
/*本函数无法修改主函数第12行st的值,所以本函数是错误的
void InputStudent(struct Student stu)
{
stu.age =10;
strcpy(stu.name,"张三"); //不能写成stu.name = "张三",必须通过的头文件来实现
stu.sex = 'F';
}
*/
8.举例:
动态构造存放学生信息的结构体数组
动态构造一个数组,存放学生的信息
然后按分数排序输出
------------------------------------------------------------------------
#include
#include
struct Student
{
int age;
float score;
char name[100];
};
int main(void)
{
int len;
struct Student *prr;
int i,j;
struct Student t;
//动态的构造一维数组
printf("请输入学生的个数:\n");
printf("len = ");
scanf("%d",&len);
prr = (struct Student *)malloc(len*sizeof(struct Student)); //为输入的学生数量动态分配内存空间
//一个结构体是struct Student,代表一个学生,所有需要(申请学生数量 * 请求单个学生内存)
//学生信息录入
for(i=0;i
{
printf("请输入第%d个学生的信息:\n",i+1);
printf("Student age = ");
scanf("%d",&prr[i].age);
printf("Student score = ");
scanf("%f",&prr[i].score);
printf("Student name = ");
scanf("%s",prr[i].name); //name是数组名,本身就已经是数组首元素的地址,所以不用再前面加取地址符&
}
//对录入的学生成绩进行升排序
for (i=0;i
{
for(j=0;j
{
if(prr[j].score >prr[j+1].score) //大于 > 表示升序,小于 < 表示降序
{
t=prr[j]; //默认互换的是整体
prr[j]=prr[j+1];
prr[j+1]=t;
}
}
}
//输出
printf("\n\n学生的信息是:\n");
for(i=0;i
{
printf("第%d个学生的信息是:\n",i+1);
printf("Student age = %d\n",prr[i].age);
printf("Student score = %f\n",prr[i].score);
printf("Student name = %s\n",prr[i].name);
}
return 0;
}
程序运行的结果为:
-------------------------------------------------------------------------------------------------------------------
请输入学生的个数:
len = 3
请输入第1个学生的信息:
Student age = 10
Student score = 20
Student name = zhangsan
请输入第2个学生的信息:
Student age = 20
Student score = 50
Student name = lisi
请输入第3个学生的信息:
Student age = 30
Student score = 10
Student name = wangwu
学生的信息是:
第1个学生的信息是:
Student age = 30
Student score = 10.000000
Student name = wangwu
第2个学生的信息是:
Student age = 10
Student score = 20.000000
Student name = zhangsan
第3个学生的信息是:
Student age = 20
Student score = 50.000000
Student name = lisi
-------------------------------------------------------
【冒泡排序】
#include
void sort(int *a, int len)
{
int i,j;
for (i=0;i
{
for(j=0;j
{
if(a[j]>a[j+1]) //大于 > 表示升序,小于 < 表示降序
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
}
int main(void)
{
int a[6] = {10,2,8,-8,11,0}
int i = 0;
sort(a,6);
for(i=0;i<6;++i)
{
printf("%d",a[i]);
}
printf("\n");
return 0;
}
-------------------------------------------------------------------------
9.枚举
什么是枚举
把一个事物所有可能的取值一一列举出来
怎样使用枚举
----------------------------------------------
#include
enum WeekDay
{
MonDay,TuesDay,WednesDay,ThursDay,FriDay,SaturDay,SunDay
};
int main(void)
{
//int day; //day定义成int类型不合适
enum WeekDay day = WednesDay; //赋值不能直接写成数字2,因为不符合逻辑
printf("%d\n",day); //这里输出的值是2,如果是上面赋值为SunDay,则为6
return 0;
}
------------------------------------------------------------------------------
枚举的优缺点
代码更安全
书写麻烦