您的位置:首页 > 职场人生

黑马程序员-----结构体数组

2015-12-21 00:41 411 查看
------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -----

第一讲 结构体数组

一、结构体数组的概念

数组的元素也可以是结构类型的。因此可以构成结构型数组。结构数组的每一个元素都是具有相同结构类型的下表结构变量。在实际应用中,经常用结构数组来表示具有相同数据结构的一个群体。如一个班的学生档案,一个车间职工的工资表等。

二、结构数组定义

定义格式:

struct 结构名{

成员表列

}数组名[数组长度];

例如:定义一个长度为5的数组,其中每一个元素都是stu结构类型。

struct stu{

int num;

char *name;

char sex;

float score;

}boy[5];

定义了一个结构数组boy,共有5个元素,boy[0]~boy[4].每个数组元素都具有struct stu的结构形式。

1 /*
2     结构体数组:
3
4             用来存放大量的结构体相同的结构体变量。
5
6     结构体数组定义:
7
8         结构体数组定义的第一种方式:
9         1.定义结构体的同时,定义数组
10         struct Student{
11              int age;
12              char *name;
13              int sno;
14              float score;
15
16             }stu[5];
17
18                2.先定义结构体,后定义数组
19         struct Student boy[5];
20
21 */
22
23 // 二、结构数组的初始化和遍历
24
25 #include <stdio.h>
26 #include <string.h>
27 int main(int argc,const char * argv[]) {
28
29     //一、结构体数组的初始化方法
30
31     //1.定义结构体数组的时候,进行初始化
32     struct Student{
33
34        char name[20];
35        int age;
36     }boy[3]={{"sb",18},{"zbz",38},{"cgx",28}};
37
38    //2.定义的同时进行初始化
39       struct Student girls[2]={{"fengjie",18},{"cjk",28}};
40
41
42    //3.先定义后初始化,整体赋值
43     struct Student ds[2];
44 //    ds[0]=(struct Student){"xzmly",18};
45 //    ds[1]=(struct Student){"bdjy",18};
46
47    //4.先定义结构体数组,后初始化
48        struct Student stu[2];
49        //stu[0].name = "zhangsan";  不能
50        strcpy(stu[0].name,"zhangsan");  //第一种方法
51        scanf("%s",stu[0].name );  //第二种方法
52
53        stu[0].age = 19;
54
55  //二、结构数组的遍历*******
56
57        for (int i =0;i<3;i++){
58
59             printf("name:%s,age:%d\n",boy[i].name,boy[i].age);
60        }
61
62       return 0;
63 }


1 /*
2   思考&实现1:
3     struct stu{
4              int num;
5             char  *name;
6             char sex;
7             float score;
8   };
9     struct stu boy[5]={
10         {101,"Li ping",'F',45},
11         {102,"Zhang ping",'M',62.5},
12         {103,"He fang",'F',92.5},
13         {104,"Cheng ling",'M',87},
14         {105,"Wang ming",'M',58}
15
16  };
17     1) 利用上面stu的结构体,计算学生平均成绩和不及格的人数
18
19         2)打印80-100分学生的成绩及姓名
20 */
21
22 #include <stdio.h>
23
24 int main(int argc,const char * argv[]) {
25
26       struct stu{
27               int num;
28               char  *name;
29               char sex;
30               float score;
31        };
32
33      //1.定义结构体数组
34      struct stu boy[5]={
35         {101,"Li ping",'F',45},
36         {102,"Zhang ping",'M',62.5},
37         {103,"He fang",'F',92.5},
38         {104,"Cheng ling",'M',87},
39         {105,"Wang ming",'M',58}
40
41      };
42
43       //2.有一个循环
44      //
45      float sum = 0.0f;
46      int count = 0; //保存不及格的人数
47      for (int i = 0;i<5;i++) {
48
49        // 去计算总成绩
50         sum+=boy[i].score;
51         //判断成绩是否小于60 ,如果小于60 ,要让计算器+1
52      if(boy[i].score<60){
53             count++;
54     }else if(boy[i].score>=80 && boy[i].score<=100){
55          //判断是否大于80小于100
56
57          //如果在这个区间,应该输出姓名和成绩
58           printf ("姓名:%s,成绩:%.2f\n",boy[i].name,boy[i].score);
59      }
60      }
61
62         printf("平均值:%.2f\n",sum/5);
63         printf("不及格人数:%d\n",count);
64
65       return 0;
66 }
67
68 /*
69 运行结果:
70
71 姓名:He fang,成绩:92.50
72 姓名:Cheng ling,成绩:87.00
73 平均值:69.00
74 不及格人数:2
75 Press any key to continue
76
77 */


1 三、实现简易通讯录
2      思考&实现1:
3     1)用结构体数组实现通讯录
4
5 #include <stdio.h>
6 #define LEN 5
7
8 struct Person{
9         //定义数组保存联系人姓名
10          char name[21];
11     //保存电话号码
12     char telNum[12];
13
14   }contacts[LEN];
15
16 int main(int argc,const char * argv[]) {
17
18          //1.先定义结构体
19
20     //2.定义结构体数组
21        struct  Person contacts[LEN];
22
23         //3.让用户输入要保存的联系人信息
24        printf("请输入要保存的联系人,格式:姓名,电话\n");
25
26        for (int i=0;i<LEN;i++){
27
28        scanf("%s %s",contacts[i].name,contacts[i].telNum);
29       }
30       //4.保存以后,立即查看一下
31         for (int j=0;j<LEN;j++){
32
33       printf("姓名:%s,电话:%s\n",contacts[j].name,contacts[j].telNum);
34       }
35
36     return 0;
37 }


第二讲 结构指针定义和初始化

一、指向结构体变量的指针

推导:

int num = 10;

int *p = #

p-->num

struct Person s1;

struct Peron *p2 = &s1;

一个指针变量当用来指向一个结构变量时,称之为结构指针变量。结构指针变量中的值是所指向的结构变量的首地址。通过结构指针即可访问该结构变量,这与数组指针和函数指针的情况是相同的。

结构指针变量说明的一般形式为:

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

/*

1.什么是结构体指针?

用来存放结构体变量地址的指针变量

2.结构体指针定义

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

//定义一个结构体

struct Car{

int lunzi;

int speed;

}car1;

struct Car *p=NULL; //定义一个结构体指针变量

p = &car1;

p = &Car; //错误的 它是一个结构体

//结构体名 Car

//结构体变量名 car1

//结构体指针 p

*/

第三讲 结构体指针间接访问成员值

一、指向结构体变量的指针

其访问的一般形式为:

(*结构体指针变量).成员名

或为:

结构体指针变量->成员名

例如:

(*pstu).num

或者:

pstu->num

1 /*
2    1.结构体变量的成员值
3
4     struct Student{
5
6           int age ;
7           char *name ;
8     };
9
10    //定义一个结构体的变量
11
12        struct Student stu1={18,"张三丰"};
13
14        //结构体变量的成员值有2个
15        //stu1.age  值 18
16        //stu1.name 值  张三丰
17
18   2.用结构体指针间接的访问结构体变量的成员值
19
20       struct Student *p = &stu1;
21
22       //使用p  获取  18  张三丰
23
24       两种方法:
25
26       1.   (*p).age    访问年龄    (*p)--->stu1
27             (*p).name   访问姓名
28
29       2.     p->age
30          p->name
31
32         注意: p一定是一个结构体指针
33 */
34
35 #include <stdio.h>
36
37 int main(int argc,const char *argv[]){
38
39      // 1.结构体变量的成员值
40
41     struct Student{
42
43           int age ;
44           char *name ;
45     };
46
47        //定义一个结构体的变量
48
49        struct Student stu1={18,"张三丰"};
50
51        //结构体变量的成员值有2个
52        //stu1.age  值 18
53        //stu1.name 值  张三丰
54
55    // 2.用结构体指针间接的访问结构体变量的成员值
56
57       struct Student *p = &stu1;
58       printf("姓名: %s,年龄: %d\n",(*p).name,(*p).age);
59       printf("姓名: %s,年龄: %d\n",p->name,p->age);
60
61       return 0;
62 }


第四讲 结构体嵌套使用

一、 结构体嵌套使用

我们学过的有if嵌套

if(){

if(){

}

}

三目运算符

(?:)?:

for运算符

for(){

for(){

}

}

递归函数

max(max(),45);



1、成员也可以又是一个结构,即构成了嵌套的结构。

//结构体嵌套:结构体定义的里面有其他结构体。

//结构体不可以嵌套自己变量,可以嵌套指向自己这种类型的指针。

例如;

struct Date{

int month;

int day;

int year;

};

struct stu{

int num;

char *name;

char sex;

struct Date birhday;

float score;

};



1 /*
2    结构体嵌套:
3
4     结构体定义中,结构体的成员又是另外一个结构体变量
5
6   结构体的嵌套的注意事项:
7
8     1.结构体定义中可以嵌套其他结构体类型的变量
9        不可以嵌套自己这个类型的变量
10
11             struct  Date{
12          int year;
13          int month;
14          int day;
15
16      };
17            //定义了一个学生的结构体
18     struct Student {
19          char *name;
20          int age;
21          float score;
22         // strcut Student stu; //错误的  不能嵌套自己类型的变量
23         // struct Student *stu;  //正确的 嵌套了一个当前类型的结构体指针
24         struct Date birthday;
25     };
26
27       2.可以嵌套自己类型的指针
28 */
29
30 #include <stdio.h>
31
32 int main(int argc,const char *argv[]){
33
34 //  结构体嵌套:
35
36 //结构体定义中,结构体的成员又是另外一个结构体变量
37
38 //  结构体的嵌套的注意事项:
39
40 //1.结构体定义中可以嵌套其他结构体类型的变量
41 //不可以嵌套自己这个类型的变量
42
43     struct Time{
44        int hour;
45        int min;
46        int sec;
47        };
48      //定义了一个Date的结构体
49             struct  Date{
50             int year;
51             int month;
52             int day;
53             //嵌套Time的结构体
54             struct Time time;
55
56     };
57      //定义了一个学生的结构体
58     struct Student {
59         char *name;
60         int age;
61          float score;
62          // strcut Student stu; //错误的  不能嵌套自己类型的变量
63          // struct Student *stu;  //正确的 嵌套了一个当前类型的结构体指针
64         struct Date birthday;
65      };
66
67  //  2.可以嵌套自己类型的指针
68  // struct Student *stu;  //正确的 嵌套了一个当前类型的结构体指针
69
70 //    嵌套的结构体如何进行初始化
71     struct Student stu1={"张三丰",28,59.99f,{1200,12,12,{12,12,12}}}; //定义了一个结构体变量
72
73 //    嵌套的结构体如何进行访问
74  printf("姓名: %s,年龄: %d(生日: %d-%02d-%02d ),成绩: %.2f\n",stu1.name,stu1.age,stu1.birthday.year,stu1.birthday.month,stu1.birthday.day,stu1.score);
75 //访问时间
76 printf("姓名: %s,年龄: %d(生日: %d-%02d-%02d %02d:%02d:%02d),成绩: %.2f\n",stu1.name,stu1.age,stu1.birthday.year,stu1.birthday.month,stu1.birthday.day,stu1.birthday.time.hour,stu1.birthday.time.min,stu1.birthday.time.sec,stu1.score);
77
78 // 3.结构体嵌套自身的指针
79
80       struct Person{
81
82             char *name;
83             int age;
84             //嵌套自己类型的指针
85             struct Person *child;
86
87       };
88        //结构体嵌套自身指针的,初始化
89        //定义kim
90       struct Person kim = {"kim",8,NULL};
91       //struct Person *child = &kim;
92       struct Person p1 = {"林志颖",38,&kim};
93
94      //结构体嵌套自身指针的,访问
95     printf("%s的儿子是:%s,儿子的年龄: %d\n",p1.name,(*p1.child).name,(*p1.child).age );
96       printf("%s 的儿子是: %s,儿子的年龄: %d\n",p1.name,p1.child->name,p1.child->age );
97     return 0;
98 }


第五讲 结构体变量及成员作为函数参数

1、成员值做函数的参数

结构体成员属性作为函数的参数就是值传递(成员变量是数组除外)。

2、结构体变量名作为函数的参数

在ANSI C标准中允许用结构变量做函数参数进行整体传送。但是这种传送要将全部成员逐个传送,特别是成员为数组时将会使传送的时间和空间开销很大,严重地降低了程序的效率。因此最后的办法就是使用指针,即用指针变量做函数参数进行传送。这时由实参传向形参的只是地址,从而减少了时间和空间的开销。

1 #include <stdio.h>
2
3 struct Car{
4
5 int lunzi;
6 int speed;
7
8 };
9
10 void xiuche(int n){
11
12     n =2;
13 }
14
15 //用结构体变量作为函数的参数
16 void xiuche1(struct Car c1){
17
18    c1.lunzi = 2;     //这个轮子数这两种方法都改不了
19
20 }
21 int main(int argc, const char *argv[]){
22
23     //定义一个结构体变量
24     struct Car car1={4,200};
25        //car1.lunzi 结构体变量成员值
26        //1.用结构体变量的成员值作为函数的参数,实质是值传递
27        xiuche(car1.lunzi);
28        printf("%d\n",car1.lunzi);   //4
29        //2.用结构体变量作为函数的参数,实质上还是值传递
30        xiuche1(car1);
31        printf("%d\n",car1.lunzi);   //4
32
33    return 0;
34 }


第六讲 结构指针作为函数的参数

1 #include <stdio.h>
2
3 struct Car{
5 int lunzi;
6 int speed;
8 };
9 //结构体指针作为函数的参数
10 // c1   是一个结构体指针
11 void xiuche2(struct Car *c1){
13    c1->lunzi = 2;
15 }
16 int main(int argc, const char *argv[]){
17
18     //定义一个结构体变量
19     struct Car car1={4,200};
20
21     //注意:用结构体变量的地址传递给函数
22     //     也可以理解为用结构体指针作为函数的参数
23
24     //实质 : 是地址传递
25     xiuche2(&car1);
26     printf("%d\n",car1.lunzi);  //2
27
28    return 0;
29 }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: