作为成员的结构体(作为结构体的成员的结构体)

最近几日,有不少的读者咨询有关结构体的问题!再加上笔者最近在学习结构体的深层问题,所以,打算书写几个博客,来帮助一些读者来解决部分问题!!不敢自托大!!哎!

在之前,我们就已经对于结构体有着接触!所以,我们也能成功的知道:结构体的成员不仅可以是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;
}

代码的运行结果为:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

念君思宁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值