最近几日,有不少的读者咨询有关结构体的问题!再加上笔者最近在学习结构体的深层问题,所以,打算书写几个博客,来帮助一些读者来解决部分问题!!不敢自托大!!哎!
在之前,我们就已经对于结构体有着接触!所以,我们也能成功的知道:结构体的成员不仅可以是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;
}
代码的运行结果为: