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

相关文章
|
JavaScript Unix Linux
⨯ cannot execute cause=fork/exec...pnpm\bin\pnpm.cjs: %1 is not a valid Win32 application.
⨯ cannot execute cause=fork/exec...pnpm\bin\pnpm.cjs: %1 is not a valid Win32 application.
1484 0
|
9天前
|
人工智能 自然语言处理 安全
阿里云千问办公 QwenWork详细介绍:产品核心能力、典型场景、价格及常见问题解答
千问办公是阿里云推出的一站式AI办公平台,主打"不止于对话,更注重交付",依托通义千问旗舰大模型,用户一句话即可完成数据分析、PPT生成、视频剪辑等复杂任务,直接输出可用成果。产品深度打通钉钉生态与企业OA,覆盖桌面端、网页端,提供企业标准版198元/人/月等多档订阅方案,新用户注册即赠2000积分,适配工程师、HR、财务等多职业办公场景,成为能动手干活的"全能AI同事"。
|
9天前
|
人工智能
千问办公官网入口:阿里AI办公QwenWork产品页和免费网页端链接
千问办公官网含两大入口:一是网页端(qwenwork.cn),即开即用,支持浏览器直接访问;二是阿里云产品页 https://t.aliyun.com/U/JNKJuO 提供免费/付费版详情、功能介绍及使用指南。
|
16天前
|
网络协议 Linux iOS开发
【2026实测】Wireshark下载+安装+汉化+使用教程(图文版,巨详细)
Wireshark 是一款免费开源的网络协议分析工具,可实时捕获、解析并可视化数据包,助你诊断网络故障、分析通信协议(如HTTP、DNS、TCP等)。支持Windows/macOS/Linux,含中文界面,新手入门便捷。(239字)
|
10天前
|
人工智能 API 内存技术
刚刚 DeepSeek V4.1 Flash 开启内测,1 分钟教你用上!
刚刚 DeepSeek 内测群发布了 DeepSeek V4.1 Flash 中间版本内测的消息,这次的模型采用了新的结构,原生支持多模态、能力更强、速度更快、且成本更低。
1915 15
|
8天前
|
IDE 开发工具
Qoder 上线 Sonus 模型,Computer Use 能力全面增强
Qoder国际版上线全新内置大模型Sonus(/ˈsoʊnəs/),全球领先,专精超长任务执行与电脑操作(Computer Use)。配合Qoder桌面端0.2.3版本,可自主完成编程、金融建模、科研及表格制作等复杂工作。现全面支持Qoder全系产品,效率提升3.2倍。
1047 1
Qoder 上线 Sonus 模型,Computer Use 能力全面增强
|
15天前
|
人工智能 运维 BI
阿里云千问办公QwenWork深度解析:基于Qwen3.8,六大核心能力重构企业全自动化工作流与计费选型指南
传统AI办公工具大多停留在对话问答、文档摘要、简单文案生成层面,只能完成单点碎片化任务,无法自主拆解复杂业务流程,很难串联多工具、多文档、外部业务系统完成端到端完整工作交付。很多企业在落地AI办公的时候,需要组合多款不同工具,来回切换界面,手动复制粘贴中间结果,智能化改造落地门槛居高不下。千问办公QwenWork是整合多款智能体产品能力打造的一体化企业办公智能体平台,底层基座依托Qwen3.8大模型,打通桌面端Agent、云端Agent、企业协同Agent三种运行形态,不再局限简单问答,接收业务目标之后自主拆解任务步骤,调用各类工具,处理文档、表格、浏览器自动化、数据查询,直接输出可交付的办公
1671 4
|
10天前
|
缓存 人工智能 自然语言处理
阿里云qwen3.8-flash大模型介绍:模型能力、模型价格、免费额度与最新活动
本文是阿里云百炼平台Qwen3.8-Flash大模型的选型接入指南,作为兼顾性能与响应速度的高性价比多模态模型,它支持百万级上下文窗口、全场景多模态输入与完整智能体能力矩阵,适配编程辅助、智能体协作等核心场景。文中同步梳理了最新下调的阶梯定价、夜间4折等优惠活动,搭配OpenAI兼容流式调用示例,帮助开发者低成本快速落地高并发AI应用。
阿里云qwen3.8-flash大模型介绍:模型能力、模型价格、免费额度与最新活动
|
16天前
|
缓存 数据可视化 开发工具
DeepSeek Harness 怎么更新?dsh 更新完整指南:更新本体(npx、npm、源码)与更新插件两种方式
DeepSeek Harness 的更新分两层:本体更新(npx 自动最新、npm update -g、源码 git pull)与插件更新(插件市场点更新、命令行覆盖安装)。本文按「准备 → 更新本体 → 更新插件 → 更新后检查」四步走,覆盖新手常见疑问。
1849 1
DeepSeek Harness 怎么更新?dsh 更新完整指南:更新本体(npx、npm、源码)与更新插件两种方式
|
11天前
|
SQL 人工智能 前端开发
QoderWake 1.0 正式发布:从桌面里的 Agent,到工作现场的数字员工
QoderWake v1.0正式发布:企业级数字员工团队平台。支持“一句话建岗”,预置10类特训岗位;Waker常驻钉钉/飞书群,@即响应、自动协作、跨任务记忆;具备定时/事件/API多触发方式与统一任务看板;已沉淀27.6万条记忆、12.3万项技能,助力组织实现人机协同增效。
834 2

热门文章

最新文章