chapter 9用户自己建立数据类型(上)

简介: chapter 9用户自己建立数据类型

9.1定义和使用结构体变量


9.1.1用户建立结构体类型


首先说一下什么是结构体类型,就是把咱们之前学过的,系统提供的变量,来一个复合打包。

比如

int a;
char b;
float c;
double d;
long long e;


现在我打包起来

struct student
{
  int a;
  char b;
  float c;
  double d;
  long long e;
}


为什么这样做呢,我们一般解决实际问题是,很多不同类型数据都存在相关练习。比如我描述一个人,可以从年龄,性别,学历,工作,四个角度去描述一个人,这四个不同变量类型。往往存在一定的联系。那我们把这些数据打包,组成一个组合数据,这样我们就能够用一个数据表示所有的情况,是不是很方便,精炼。

用户自己建立有不同类型数据组成的组合型数据结构,称之为结构体


一般形式:

struct 结构体名

{成员表列};

结构体名也叫“结构体标记”。成员列表也成为“域表“;

域表元素的命名规则: 类型名 成员名;


可以同时建立多个结构体,并且一个结构体可以是另外一个结构体的成员。

struct Date
{
  int month;
  int day;
  int year;
};
struct student 
{
  int num;
  char name[20];
  char sex;
  int age;
  struct Date birthday;
  char addr[30];
}

1670499014018.jpg

9.1.2 定义结构体类型变量


这里我们学习如何在程序中使用结构体变量;总的包括,定义结构体变量,然后初始化,最后能存取数值。这里我先讲解如何定义;

1.先声明结构体类型,再定义该类型的变量

struct Date
{
  int month;
  int day;
  int year;
};
struct student 
{
  int num;
  char name[20];
  char sex;
  int age;
  struct Date birthday;
  char addr[30];
}//先声明结构体类型
struct student student1,student 2;//然后定义该类型的变量。


定义了两个变量,定义的类型式没有储存空间的,只有定义变量才有储存空间。

现在变量student 1,student 2;的结构如下图。

1670499056267.jpg

2.在声明类型的同时定义变量

struct Date
{
  int month;
  int day;
  int year;
};
struct student 
{
  int num;
  char name[20];
  char sex;
  int age;
  struct Date birthday;
  char addr[30];
} student 1,student 2;


一般形式:

struct 结构体名

{

成员列表

}变量名列表;


3.不指定类型名而直接定义结构体类型变量


一般形式:

struct

{

成员列表

}变量名列表;

这种方法的局限性在于,他只能定义变量名列表的变量,由于没有变量名,所以不能定义其他变量为此结构体了。


注意:

a.结构体类型和结构体变量完全是两个不同的概念;

b.结构体中的成员名比如num,和程序中的num完全是不同的概念。名字相同,但是表达的意义是不相同的。

c.结构体中的成是可以当作普通变量去使用的,可以运算,赋值等等,怎么引用,一般是结构变量名.成员名


9.1.3结构体变量的初始化和引用


看个例子;

/*把一个学生的信息(学号,姓名,性别,住址)放在一个结构体中,然后输出这个学生的信息*/ 
#include <stdio.h>
int main()
{
   struct student
   {
    long int num;
    char name [20];
    char sex;
    char addr[20];
   }a={10100,"wu mingda",'M',"XIN DE BAN DAO"};
   printf("NO.:%1d\nname:%s\nsex:%c\naddr:%s\n",a.num,a.name,a.sex,a.addr);
}

1670499100481.jpg


从上面的例子咱们可以看出,如何初始化一个结构体变量。

a={10100,"wu mingda",'M',"XIN DE BAN DAO"};
 如果想对某一起其中的元素单独初始化也可以(C99以上),如下:
 ={.num=1};//{a.name=1};也行
/*把一个学生的信息(学号,姓名,性别,住址)放在一个结构体中,然后输出这个学生的信息*/ 
#include <stdio.h>
int main()
{
  struct student
  {
  long int num;
  char name [20];
  char sex;
  char addr[20];
  }a={.num=1};//{a.name=1};也行
  printf("NO.:%1d\nname:%s\nsex:%c\naddr:%s\n",a.num,a.name,a.sex,a.addr);
}
其他元素没有被初始化的元素首先就是,数值型=0;字符型=\0;指针型:NULL;


如何引用结构体变量名字

结构体变量名.成员名

. 是成员运算符,优先级最高。


赋值:a.num=10010;同类型结构体变量的可以相互赋值;
可以进行各种运算;
可以引用结构体变量的地址:&student1;
也可以引用结构体变量成员名的地址:&student1.num;
如果成员本身就是一个结构体,如何引用呢;
student1.num;
student1.birthday.month;
注意结构体变量只能一个一个输出:
printf("NO.:%1d\nname:%s\nsex:%c\naddr:%s\n",a.num,a.name,a.sex,a.addr);
不能一次性输出,一次性读入:
printf("%s\n",student1);
scanf("%d,%s,%c,%s",%student1);


在看一个例题


输入两个学生的相关信息,输出成绩较高的那个人相关信息
#include <stdio.h>
int main()
{
  struct student
  {
  int num;
  char name[20];
  float score;
  }student1,student2;
  scanf("%d%s%f",&student1.num,student1.name,&student1.score);
  scanf("%d%s%f",&student2.num,student2.name,&student2.score);
  printf("the higher score is:\n");
  if(student1.score>student2.score)
  printf("%d  %s  %6.2f\n",student1.num,student1.name,student1.score);
  else if(student1.score<student2.score)
  printf("%d  %s  %6.2f\n",student2.num,student2.name,student2.score);
  else 
  {
  printf("%d  %s  %6.2f\n",student1.num,student1.name,student1.score);
  printf("%d  %s  %6.2f\n",student2.num,student2.name,student2.score);
  }
  return 0;
}


9.2使用结构体数组


9.2.1定义结构体数组


/*有三个候选人,每个选民只能投票一人,要求编一个统计票数的程序,先后输入被选人的名字
,最后输出各人的的票结果*/
#include <stdio.h>
#include <string.h>
struct person
{
  char name[20];
  int count;
}leader[3]={"Li",0,"zhang",0,"sun",0};
int main()
{
  int i,j;
  char leader_name[20];
  for(i=1;i<=10;i++)
  {
    scanf("%s",leader_name);//把名字储存到数组中 
    for(j=0;j<3;j++)
    if(strcmp(leader_name,leader[j].name)==0) leader[j].count++;
/* 
    strcmp(字符串1,字符串2);
意思就是让两个字符串进行比较 ;如果两个比较等价;那么输出得结果就是0;
小于;那么输出的结果就是一个负整数;
大于;;;;;输出的结果就是一个正整数;
那么你坑定会问 ;怎么进行比较的呢;
首先自左向右进行比较;通过ascall
1)完全相同; 说明字符串完全相等;
2)有不同 以第一对为准;
3)如果两个字符串都是英语都是英文;大写小于小写;在英文字典在后面得位置为大;*/
  }
  printf("\nResult:\n");
  for(i=0;i<3;i++)
    printf("%5s:%d\n",leader[i].name,leader[i].count);
  return 0;
}

1670499213681.jpg

1670499227002.jpg

定义结构体数组的一般形式:


struct 结构体名

{

成员表列

} 数组名[数组长度];

或者


先声明定义一个结构体类型 ;

结构体类型 数组名[数组长度];

例如

struct person
{
   char name[20];
   int count;
}leader[3]={"Li",0,"zhang",0,"sun",0};初始化1
或者:
struct person
{
   char name[20];
   int count;
};
struct person leader[3]={"Li",0,"zhang",0,"sun",0};初始化2
初始化就是在定义的变量后面直接加上初始化表列;


9.2.2 结构体数组的应用举例


/*有n个学生的信息(包括学号,姓名,成绩),要求按照成绩的高低
顺序输出各个学生的信息*/
 #include <stdio.h>
 struct student
 {
  int num;
  char name[20];
  float score;
  } ;//
  int main()
  {
    struct student stu[5]={ {10101,"zhang",78 },{10103,"wang",98.5},{10106,"Li",86},{10108,"ling",73.5},{10110,"sun",100}};//
    struct student temp;
    const int n=5;
    int i,j,k;
    printf("the order is:\n");
    for(i=0;i<n-1;i++)
    {
    k=i;
    for(j=i+1;j<n;j++)
      if(stu[j].score>stu[k].score) k=j;
      temp=stu[k];stu[k]=stu[i];stu[i]=temp;
   }
   for(i=0;i<n;i++)
    printf("%6d %8s %6.2f\n",stu[i].num,stu[i].name,stu[i].score);
    printf("\n");
    return 0;
  }

1670499260143.jpg

相关文章
|
C语言
chapter 9用户自己建立数据类型(下)
chapter 9用户自己建立数据类型
68 0
chapter 9用户自己建立数据类型(下)
|
SQL 测试技术 数据库
使用VS2010的Database项目模板统一管理数“.NET研究”据库对象
  Visual Studio 2010 有一个数据库项目模板:Visual Studio Database Project(以下简称VSDP),VS 2003/2005/2008也有类似的项目,在VS2010上的得到了很大的加强,现在还具备了智能感知,构建时验证和自动部署功能,VSDP是针对典型的数据库开发任务而设计的,可以对原有数据库反向工程,添加表,存储过程和其他数据库项目,而且有选择性地将修改部署到目标数据库中。
816 0
Go基础(复杂类型):映射
映射 映射将键映射到值。 映射的零值为 nil 。nil 映射既没有键,也不能添加键。 make 函数会返回给定类型的映射,并将其初始化备用。
811 0
|
测试技术 C#
C# /VB.NET 创建PDF项目符号列表和多级编号列表
使用项目符号和编号,可以让文档的层次结构更清晰、更有条理,也更容易突出重点。在编辑文档的过程中,我个人也比较偏爱项目标号来标注文章重点信息。在之前的文章中,介绍了如何在Word中来创建项目标号和编号列表,在本篇文章中,将介绍创建PDF项目符号列表和多级编号列表的方法。
3525 0
|
网络协议 人工智能 存储
UNP总结 Chapter 11 名字与地址转换
本章讲述在名字和数值地址间进行转换的函数:gethostbyname和gethostbyaddr在主机名字与IP地址间进行转换,getservbyname和getservbyport在服务器名字和端口号间进行转换。
791 0