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

简介: 作为成员的结构体(作为结构体的成员的结构体)

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


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


0a2653c851af460fa595bd959398a8f1.png


2.distance_of函数是求pa 和pb之间的距离的函数!


在main 函数中,读取当前地址crnt和目的地dest的值,并显示其距离!


上述的代码,其实对于不少的读者而言,可能能看清楚,但是,依靠自己并不一定能够正确的书写出来!所以,需要加强练习!


代码的运行结果为:


2d65d23f6d4748949b924e4057485923.png


但是,当我们在考虑一下汽车的结构体:该结构体的成员有两个:——当前位置的坐标和剩余燃料,坐标直接使用point,因此,我们就可以通过下面来进行描述!!


6de278e6d6694ce5bb08e7e842b7e74b.png


虽然说: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;
}


代码的运行结果为:


12c3b7f3f8814309a195c64f051d4445.png


相关文章
结构体成员相关知识
结构体成员相关知识
94 0
|
编译器 C语言 C++
结构体中最后一个成员为[0]或[1]长度数组(柔性数组成员)的用法
结构体中最后一个成员为[0]长度数组的用法:这是个广泛使用的常见技巧,常用来构成缓冲区。比起指针,用空数组有这样的优势:(1)、不需要初始化,数组名直接就是所在的偏移;(2)、不占任何空间,指针需要占用int长度空间,空数组不占任何空间。
1452 0
|
C语言
【C 语言】结构体 ( 结构体中嵌套二级指针 | 为 结构体内的二级指针成员 分配内存 | 释放 结构体内的二级指针成员 内存 )
【C 语言】结构体 ( 结构体中嵌套二级指针 | 为 结构体内的二级指针成员 分配内存 | 释放 结构体内的二级指针成员 内存 )
932 0
【C 语言】结构体 ( 结构体中嵌套二级指针 | 为 结构体内的二级指针成员 分配内存 | 释放 结构体内的二级指针成员 内存 )
|
9月前
|
安全
C learning_15 结构体类型的声明、结构体初始化、结构体成员访问、结构体传参
C learning_15 结构体类型的声明、结构体初始化、结构体成员访问、结构体传参
|
Linux C语言 C++
结构体中的柔性数组成员(数组长度为0成员)!
其实很早在看LINUX下就看到这个东西,后来在MFC内存池里同样也看到了类似的东西,还依照MFC写过一个类似的小内存池,(MFC用的是return this + 1)后来在李先静的《系统程序员成长计划》里看到了类似的定义,于是心里想着总结一下,结果发现网上已经有牛人总结的很好了,于是乎就转了过来,谢谢你们的分享,这是我前进的动力!同时,需要引起注意的:ISO/IEC 9899-1999里面,这么写是非法的,这个仅仅是GNU C的扩展,gcc可以允许这一语法现象的存在。
1262 0
结构体、联合体的成员内存对齐的情况
结构体、联合体的成员内存对齐的情况
148 0
结构体、联合体的成员内存对齐的情况
|
9月前
|
存储 编译器 Linux
匿名结构体类型、结构体的自引用、结构体的内存对齐以及结构体传参
匿名结构体类型、结构体的自引用、结构体的内存对齐以及结构体传参
结构体基础
结构体基础
|
9月前
|
算法 C语言
结构体相关知识
结构体相关知识

热门文章

最新文章