最近几日,有不少的读者咨询有关结构体的问题!再加上笔者最近在学习结构体的深层问题,所以,打算书写几个博客,来帮助一些读者来解决部分问题!!不敢自托大!!哎!
在之前,我们就已经对于结构体有着接触!所以,我们也能成功的知道:结构体的成员不仅可以是int 型和double,float型等基本类型,还可以是数组或者结构体!!本次博客,笔者就来带领大家学习;作为结构体的成员的结构体!!
表示坐标的结构体:请看笔者的书写的代码:
#include <stdio.h> #include <math.h> #define sqr(n) ((n)*(n)) //计算平方 //表示点坐标的结构体 typedef struct { double x; double y; }point ; double distance_of(point pa, point pb) { return sqrt(sqr(pa.x - pb.x) + sqr(pa.y - pb.y)); //返回点pa与 pb之间的距离! } int main() { point crnt, dest; printf("当前的地点X的坐标:"); scanf("%lf", &crnt.x); printf(" Y的坐标:"); scanf("%lf", &crnt.y); printf("目的地的X的坐标:"); scanf("%lf", &dest.x); printf(" Y的坐标"); scanf("%lf", &dest.y); printf("到目的地的距离为:%.2f.\n", distance_of(crnt, dest)); return 0; }
1.这里没有为表示点的坐标的结构体赋结构名!!仅为其赋了typedef名的point !该结构体是由:double 型的成员:x和y构成;
2.distance_of函数是求pa 和pb之间的距离的函数!
在main 函数中,读取当前地址crnt和目的地dest的值,并显示其距离!
上述的代码,其实对于不少的读者而言,可能能看清楚,但是,依靠自己并不一定能够正确的书写出来!所以,需要加强练习!
代码的运行结果为:
但是,当我们在考虑一下汽车的结构体:该结构体的成员有两个:——当前位置的坐标和剩余燃料,坐标直接使用point,因此,我们就可以通过下面来进行描述!!
虽然说:car的成员有两个,但是表示坐标的成员pt本身也是有着两个成员的point型的结构体,因此,成员总共有3个!!
需要知道:无法分解的成员称谓:构成成员!
!成员:pt 和 fuel两个
!!构成成员:pt.x , pt.y 和 fuel 三个
对象c的成员可以通过c.pt 和 c.fuel来访问!另外,访问c.pt中的构成成员的表达式是使用了两个句点运算符的c.pt.x 和 c.pt.y
在下面的程序中:假设燃料的消耗设为1,所以每移动1个距离,燃料就减少1
请看笔者的最新代码:
#include <stdio.h> #include <math.h> #define sqr(n) ((n)*(n)) //计算平方 //表示点坐标的结构体 typedef struct { double x; //X的坐标 double y; //Y的坐标 }point ; //表示汽车的结构体 typedef struct { point pt; //当前位置 double fuel; //剩余燃料 }car; //返回点pa与点pb之间的距离 double distance_of(point pa, point pb) { return sqrt(sqr(pa.x - pb.x) + sqr(pa.y - pb.y)); } //显示汽车当前的位置和剩余燃料 void put_off(car c) { printf("当前位置:(%.2f,%.2f)\n", c.pt.x, c.pt.y); printf("剩余燃料:%.2f升\n", c.fuel); } //使c指向的汽车向目标坐标dest行驶 int move(car* c, point dest) { double d = distance_of(c->pt, dest); //行驶距离 if (d > c->fuel) //行驶距离超过了燃料 { return 0; //无法行驶 } c->pt = dest; //更新当前位置(向dest移动) c->fuel -= d; //更新燃料(减去行驶距离d所消耗的燃料) return 1; //成功行驶 } int main() { car mycar = { {0.0,0.0},{90.0} }; while (1) { int select; point dest; put_off(mycar); printf("开动汽车吗?【yes……1/no……0】:"); scanf("%d", &select); if (select != 1) { break; } printf("目的地X的坐标:"); scanf("%lf", &dest.x); printf(" Y的坐标:"); scanf("%lf", &dest.y); if (! move(&mycar, dest)) { puts("\a燃料不足无法行驶!"); } } return 0; }
代码的运行结果为: