Microsoft PowerPoint - C语言课件-9-结构体.pptx

Similar documents
Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.06.doc

CC213

untitled

2015年计算机二级(C语言)模拟试题及答案(三)

Generated by Unregistered Batch DOC TO PDF Converter , please register! 浙江大学 C 程序设计及实验 试题卷 学年春季学期考试时间 : 2003 年 6 月 20 日上午 8:3

Microsoft PowerPoint - 4. 数组和字符串Arrays and Strings.ppt [兼容模式]

C 1

Microsoft PowerPoint - 07 派生数据类型

OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料

epub 33-8

Microsoft PowerPoint - 5. 指针Pointers.ppt [兼容模式]

C 1 # include <stdio.h> 2 int main ( void ) { 4 int cases, i; 5 long long a, b; 6 scanf ("%d", & cases ); 7 for (i = 0;i < cases ;i ++) 8 { 9

新・明解C言語入門編『索引』

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

2015年计算机二级(C语言)模拟试题及答案(四)

《C语言程序设计》教材习题参考答案

网C试题(08上).doc

untitled

untitled

《计算概论》课程 第十九讲 C 程序设计语言应用

PowerPoint 演示文稿

C/C++语言 - C/C++数据

6 C51 ANSI C Turbo C C51 Turbo C C51 C51 C51 C51 C51 C51 C51 C51 C C C51 C51 ANSI C MCS-51 C51 ANSI C C C51 bit Byte bit sbit

2013 C 1 # include <stdio.h> 2 int main ( void ) 3 { 4 int cases, a, b, i; 5 scanf ("%d", & cases ); 6 for (i = 0;i < cases ;i ++) 7 { 8 scanf ("%d %d

untitled

《人员招聘与任用》

C/C++ 语言 - 循环

Microsoft Word - 第3章.doc

《C语言程序设计》教材习题参考答案

chap07.key

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

Microsoft PowerPoint - L17_Inheritance_v4.pptx

《C语言程序设计》第2版教材习题参考答案

技能竞赛C试题

3.1 num = 3 ch = 'C' 2

第3章.doc

nooog

PowerPoint 演示文稿

C

untitled

C++ 程式設計

untitled

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.07.doc

c_cpp

OOP with Java 通知 Project 2 提交时间 : 3 月 21 日晚 9 点 作业提交格式 学习使用 文本编辑器 cmd, PowerShell (Windows), terminal(linux, Mac)

int *p int a 0x00C7 0x00C7 0x00C int I[2], *pi = &I[0]; pi++; char C[2], *pc = &C[0]; pc++; float F[2], *pf = &F[0]; pf++;

一 关于内存 数据存储 变量分类 局部变量 全局变量 静态变量 请看下面代码, 分析变量类型? int pi = 3; int Area(int r, int *sum) { int b; static int c =0; b = pi * r * r; c += b; *sum = c; retu

Microsoft Word - 新1-12.doc

《C语言程序设计》教材习题参考答案

FY.DOC

untitled

Microsoft Word - 《C语言开发入门》课程教学大纲-2.doc

2015年计算机二级(C语言)模拟试题及答案(四)

Ps22Pdf

Microsoft PowerPoint - 8. 运算符重载 Operator Overloading.pptx

( CIP) /. :, ( ) ISBN TP CIP ( 2005) : : : : * : : 174 ( A ) : : ( 023) : ( 023)

<4D F736F F D20CBB6CABFD1D0BEBFC9FAC8EBD1A7BFBCCAD4B4F3B8D92D383835B3CCD0F2C9E8BCC62E646F63>

目 录 第 一 部 分 毕 业 设 计 / 毕 业 实 习 工 作 计 划 总 则 成 立 毕 业 设 计 毕 业 实 习 工 作 领 导 小 组 毕 业 设 计 时 间 安 排...4 第 二 部 分 毕 业 设 计 任 务 书 毕

新版 明解C++入門編

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点

文件

党 政 投 资 基 金 落 户 上 城 区 曰 全 年 新 批 外 商 投 资 项 目 30 个 袁 实 际 利 用 外 资 万 美 元 曰 引 进 市 外 内 资 项 目 598 个 袁 实 际 到 位 资 金 亿 元 曰 推 进 区 市 协 作 工 程 袁 出 台 实 施

社 工 系 师 生 继 续 服 务 金 竹 林 儿 童 之 家.7 专 业 技 能 训 练 动 员 大 会..7 顶 岗 实 习 动 员 会 级 本 科 班 专 业 技 能 训 练...9 保 山 学 院 盈 江 青 爱 小 屋 支 教 行 级 政 本 班 德 育

信工学生工作简报 第四期.doc

教学设计方案

2009杭州市小学地方课程

任 务 单 一 ~2: 文 具 书 本 摆 整 齐, 争 得 自 理 星 争 星 要 求 : 文 具 用 品 摆 放 好, 书 本 叠 叠 放 整 齐 探 秘 任 务 一 ~2: 文 具 书 本 摆 整 齐, 争 得 自 理 星 任 务 1: 跟 小 辅 导 员 一 起 参 观 高 年 级 的 教

???h?????????W??????

簡 述 所 有 參 與 教 案 編 寫 人 員 之 學 經 歷 及 負 責 內 容 參 與 教 案 編 寫 人 員 魏 俊 陽 學 歷 經 歷 負 責 內 容 國 立 臺 灣 師 範 新 北 市 閩 南 語 教 案 編 寫 大 學 課 程 與 教 輔 導 團 教 學 者 學 研 究 所 博 士 新

支撑材料4.4.doc

课程整体教学设计指导意见

天天星期三

第4章 栈和队列

技能竞赛C试题

公開徵求廠商提供「採購專業人員訓練計畫企劃書」公告

untitled

untitled

1 Project New Project 1 2 Windows 1 3 N C test Windows uv2 KEIL uvision2 1 2 New Project Ateml AT89C AT89C51 3 KEIL Demo C C File

Strings

C/C++语言 - 分支结构

Microsoft PowerPoint - 6. 用户定义类型User-defined Datatypes.ppt [兼容模式]

CC213

JAVA 单元 2.1 四则运算机 ( 一 ) 单元教学进度设计 教学环节 教学内容 教师学生活动活动 反馈 反馈课前作业完成情况 反馈加分 1. 下面哪些是合法的变量名? ( ) A.2variable 答案 :DEG B..variable2 解答 : C.._whatavariable A:/

Python a p p l e b e a r c Fruit Animal a p p l e b e a r c 2-2

公共圖書館利用教育方案規劃之研究


<4D F736F F D B0EABB79A4E5B8D5C344BBBCB065AAA9>


康體藝術

Microsoft Word - ACL chapter02-5ed.docx

Department of Science and Engineering Computing School of Mathematics School Peking University October 9, 2007

JLX

PowerPoint 演示文稿

中国证券业协会远程培训系统

强迫症毁灭天才

试卷代号 :1253 座位号 E 口 国家开放大学 ( 中央广播电视大学 )2014 年秋季学期 " 开放本科 " 期末考试 C 语言程序设计 A 试题 2015 年 1 月 E 四! 五 总分! 一 单选题 ( 每小题 2 分, 共 20 分 ) 1. 由 C 语言源程序文件编译而成的目标文件的默

PowerPoint 演示文稿

做党和人民满意的好老师

Transcription:

第九章结构体 郎大鹏

第九章结构体 9.1 结构体类型的声明方法 9.2 结构体类型变量的定义与使用 9.3 结构体数组 9.4 编程举例 9.5 习题

9.1 结构体类型的声明方法 结构体声明的语法形式如下 : struct 结构体标识符 成员变量列表 ; }; 例如, 为了描述班级 ( 假设仅仅包括班级编号 专业 人数等信息 ), 可以声明如下的结构体类型 struct Class char Code[10]; /* 编号 */ char Major[30]; /* 专业 */ unsigned int Count; /* 人数 */ };

9.2 结构体类型变量的定义与使用 9.2.1 变量的三种定义方法 1. 先声明结构体类型, 再定义变量先声明一个结构体类型, 其中 student 为结构体类型名, 如 : struct student /* 该类型共包含 4 个成员, 各成员的类型可以不同 */ int num; char name[20]; int age; float score; }; /* 作为结构体类型的声明, 此行最后的 ; 不可缺少 */ struct student stud1,stud2; /* 使用时定义两个属于 struct student 类型的结构体变量 stud1 和 stud2 其中 struct student 为结构体类型名 */

9.2 结构体类型变量的定义与使用 9.2.1 变量的三种定义方法 2. 在声明结构体类型的同时定义变量如 :struct student int num; char name[20]; int age; float score; }stud1,stud2; /* 定义了两个 struct student 类型的变量 stud1 stud2*/ 这种情况直接将结构体变量 stud1 和 stud2 放在声明结构体类型时的 } 和 ; 之间定义

9.2 结构体类型变量的定义与使用 9.2.1 变量的三种定义方法 3. 直接定义结构体类型变量如 :struct /* 结构体名并不出现, 而直接定义变量 */ int num; char name[20]; int age; float score; }stud1,stud2; 与第一种和第二种方法相比, 若要再定义一些与 stud1 stud2 相同类型的结构体变量时, 这种方法显然不方便

9.2 结构体类型变量的定义与使用 关于结构体类型的几点说明 : 类型与变量是不同的概念, 不能混淆 ; 可以对变量进行存取 赋值等运算 ; 却不能对类型进行这些操作或运算 ; 在编译时只对变量分配空间, 并不对类型分配空间 ; 可以单独使用结构体变量中的成员, 其地位和作用相当于普通变量

9.2.2 结构体变量的初始化 简单变量的初始化形式如下 : 数据类型变量名 = 初始化值 ; 例如, 定义整型变量 a, 并给其初始化值 10 的语句如下 : int a=10; 数组的初始化, 需要通过一常量数据列表, 对其数组元素分别进行初始化, 形式如下 : 数据类型 数组名称 [ 数组长度 ]= 初始化值 1, 初始化值 2,, 初始化值 n}; 例如, 定义长度为 5 的整型数组, 并对其初始化的语句如下 : int A[5]=20,21,0,3,4};

9.2.2 结构体变量的初始化 结构体变量的初始化方式与数组类似, 分别给结构体的成员变量赋以初始值, 而 结构体成员变量的初始化遵循简单变量或数组的初始化方法 具体的形式如下 : struct 结构体标识符 成员变量列表 ; }; struct 结构体标识符变量名 = 初始化值 1, 初始化值 2,, 初始化值 n };

9.2.2 结构体变量的初始化 表 9.1 基本数据类型成员变量的初始化缺省值 数据类型 缺省初始化值 int 0 char \0x0 float 0.0 double 0.0 char Array[n] "" int Array[n] 0,0,0}

9.2.2 结构体变量的初始化 例如 : struct Line int id; struct Point StartPoint; struct Point EndPoint; } oline1= 0, /* 初始化 id */ 0,0,0}, /* 初始化 StartPoint*/ 100,0,0} /* 初始化 EndPoint */ };

9.2.3 结构体变量的使用 1. 结构体成员变量的引用结构体变量包括一个或多个成员变量, 引用其成员变量的语法格式如下 : 结构体变量名. 成员变量名例如, 有如下的定义 : struct Point op1=0.0,0.2,0.3}; 结构体 struct Point 具有三个成员, double x; double y; double z;

9.2.3 结构体变量的使用 2. 结构体变量本身的引用结构体变量本身的引用是否遵循基本数据类型变量的引用规则呢? 例如下面的程序 : struct Point op1=0.0,0.2,0.3}; struct Point op2,op3; op2= op1; op3= op1+ op2*2; 在 C 语言的语法中, 这样引用结构体类型变量是违法的 在 C 语言定义的所有的运算符中, 只有运算符. 和 & 以及 sizeof 可以用于结构体变量, 其中. 用于获得成员变量, 如 op1.x & 用于获得变量地址, 如 &op1 sizeof 用于获得变量存储空间的大小, 单位为字节, 如 sizeof(op1)

9.2.3 结构体变量的使用 例 9.1 输入 10 个同学的姓名 数学成绩 英语成绩和物理成绩, 确定总分最高 的同学, 并打印其姓名及其三门课程的成绩 #include "stdio.h" struct Student /* 定义结构体 struct Student*/ char Name[20]; /* 姓名 */ float Math; /* 数学 */ float English; /* 英语 */ float Physical; /* 物理 */ };

for(i=0;i<10;i++)/* 读入当前同学的相关信息 */ scanf("%s %f %f %f",ostu.name,&ostu.math,&ostu.english,&ost void main() struct Student ostu; struct Student omaxstu; int i; float fmaxscore; float ftotal; printf("\nplease input 10 students and there scores\n");/* 提示信息 */ printf("----------------------------------------\n"); printf("name Math English Physical \n"); printf("----------------------------------------\n"); fmaxscore=0; u.physical); ftotal=ostu.math+ostu.english+ostu.physical; if(fmaxscore<ftotal) fmaxscore=ftotal; /* 保存当前最大成绩和 */ /* 保存当前最大成绩和的同学的相关信息 */ strcpy(omaxstu.name,ostu.name); omaxstu.math=ostu.math; omaxstu.english=ostu.english; omaxstu.physical=ostu.physical; }} printf("----------------------------------------\n"); printf("%s %f %f %f \n ", omaxstu.name,omaxstu.math,omaxstu.english,omaxstu.physical); }

9.2.4 结构体变量指针 1. 结构体指针变量的定义定义结构体指针变量的一般形式如下 : 形式 1: struct 结构体标识符 成员变量列表 ; }; struct 结构体标识符 * 指针变量名 ; 形式 2: struct 结构体标识符 成员变量列表 ; } * 指针变量名 ; 形式 3: struct 成员变量列表 ; }* 指针变量名 ;

9.2.4 结构体变量指针 2. 结构体指针变量的初始化 结构体指针变量在使用前必须进行初始化, 其初始化的方式与基本数据类型指针变量的初始化相同, 在定义的同时赋予其一结构体变量的地址 例如 struct Point opoint=0,0,0}; struct Point *ppoints=& opoint; /* 定义的同时初始化 */ 在实际应用过程中, 可以不对其进行初始化, 但是在使用前必须通过赋值表达式赋予其有效的地址值 例如 : struct Point opoint=0,0,0}; struct Point *ppoints2; ppoints2=& opoint; /* 通过赋值表达式 */

9.2.4 结构体变量指针 3. 结构体指针变量的引用和运算 与基本类型指针变量相似, 结构体指针变量主要作用是存储其结构体变量的地址或结构体数组的地址, 通过间接方式操作对应的变量和数组 在 C 语言中规定, 结构体指针变量可以参与的运算符如下 : ++,--,+,*,->,.,,&,! 下面通过例题说明, 如何引用结构体指针变量存储结构体变量地址, 以及如何通过结构体指针变量间接的引用结构体变量以及其成员变量

9.2.4 结构体变量指针 例 9.2 应用结构体指针变量, 打印结构体成员变量的信息 #include "stdio.h" struct Point double x; /*x 坐标 */ double y; /*y 坐标 */ double z; /*z 坐标 */ }; int main() struct Point opoint1=100,100,0}; struct Point opoint2; struct Point *ppoint; /* 定义结构体指针变量 */ ppoint=& opoint2;/* 结构体指针变量赋值 */ (*ppoint).x= opoint1.x; (*ppoint).y= opoint1.y; (*ppoint).z= opoint1.z; printf("opoint2=%7.2f,%7.2f,%7.2f} \n",opoint2.x,opoint2.y,opoint2.z); return(0); }

9.2.4 结构体变量指针 通过结构体指针变量获得其结构体变量的成员变量的一般形式如下 : (* 结构体指针变量 ). 成员变量其中 结构体指针变量 为结构体指针变量名, 成员变量 为结构体成员变量名,. 为取结构体成员变量的运算符 另外 C 语言中引入了新的运算符 ->, 通过结构体指针变量直接获得结构体变量的成员变量, 一般形式如下 : 结构体指针变量 -> 成员变量其中 结构体指针变量 为结构体指针变量名, 成员变量 为结构体成员变量名, -> 为运算符

9.3 结构体数组 9.3.1 结构体数组的定义 数组是一组具有相同数据类型变量的有序集合, 可以通过下标获得其 中的任意元素 结构体类型数组与基本类型数组的定义与引用规则是相同 的, 区别在于结构体数组中的所有元素均为结构体类型变量

9.3.1 结构体数组的定义 方式 1: struct 结构体标识符 成员变量列表 ; }; struct 结构体标识符数组名 [ 数组长度 ]; 方式 2: struct 结构体标识符 成员变量列表 ; } 数组名 [ 数组长度 ]; 方式 3: struct 成员变量列表 ; } 数组名 [ 数组长度 ];

9.3.1 结构体数组的定义 例 : 定义长度为 10 的 struct Point 类型数组 opoints 的方法有如下三种形式 : 方式 1: struct Point double x; double y; double z; }; struct Point opoints[10]; 方式 2: struct Point double x; double y; double z; } opoints[10]; 方式 3: struct double x; double y; double z; } opoints[10];

9.3.2 结构体数组的初始化 结构体类型数组的初始化遵循基本数据类型数组的初始化规律, 在定义数组的同时, 对其中的每一个元素进行初始化 例如 : struct Student /* 声明结构体 struct Student*/ char Name[20]; /* 姓名 */ float Math; /* 数学 */ float English; /* 英语 */ float Physical; /* 物理 */ }ostus[2]= "Liming",78,89,95}, "Majun",87,79,92} };

9.3.2 结构体数组的初始化 在定义数组并同时进行初始化的情况下, 可以省略数组的长度, 系统根据初始化数据的多少来确定数组的长度 例如 : struct Key char word[20]; int count; }keytab[]= "break",0}, "case",0}, "void",0} }; 结构体数组 keytab 的长度, 系统自动确认为 3

9.3.3 结构体数组的使用 1. 结构体数组元素的引用结构体数组元素引用的语法形式如下 : 结构体数组名 [ 数组下标 ]; [] 为下标运算符, 数组下标的取值范围为 (0,1,2,...,n-1),n 为数组长度

9.3.3 结构体数组的使用 例 9.3 某班有若干名学生, 每一位学生的信息包括学号 姓名 2 门课程 的成绩 定义一个可以存放 3 个学生的结构体数组, 实现对结构体数组的输 入与输出 #include "stdio.h" struct student // 声明结构体类型 long int number; char name[8]; float score[2]; 程的成绩 }; // 学号 // 姓名 // 2 门课

9.3.3 结构体数组的使用 void main() struct student stud[3]; // 定义结构体数组 int i,j; // 输入 for(i=0;i<3;i++) scanf("%ld",&stud[i].number); scanf("%s",stud[i].name); for(j=0;j<2;j++) scanf("%f",&stud[i].score[j]);} // 输出 printf("\n 学号姓名数学英语 \n"); for(i=0;i<3;i++) printf("%ld",stud[i].number); printf("%7s ",stud[i].name); for(j=0;j<2;j++) printf("%7.1f\n",stud[i].score[j]); }

9.3.3 结构体数组的使用 2. 结构体数组的引用结构体数组作为一个整体的引用, 一般表现在如下两个方面 : (1) 作为一块连续存储单元的起始地址与结构体指针变量配合使用, 此问题可参考结构体指针部分 (2) 作为函数参数 函数的形式参数为结构体类型数组, 在调用函数时将实际参数即定义好的结构体数组名作为整体传入

9.3.3 结构体数组的使用 例 9.4 某班有若干名学生, 每一位学生的信息包括学号 姓名 2 门课程的成绩 定义一个可以存放 3 个学生的结构体数组, 实现对学生 2 门课平均成绩的排序

9.3.3 结构体数组的使用 #include "stdio.h" struct student // 声明结构体类型, 同例 9-3 long int number; // 学号 char name[8]; // 姓名 float score[2]; // 2 门课程的成绩 }; void sort(struct student stud[],int n);// 声明成绩排序函数 void main() struct student stud[3]; // 定义结构体数组 int i,j; // 输入 for(i=0;i<3;i++) scanf("%ld",&stud[i].number); scanf("%s",stud[i].name); for(j=0;j<2;j++) scanf("%f",&stud[i].score[j]); } sort(stud,3); // 输出

printf("\n 名次学号 姓名 数学 英语 \n"); for(i=2;i>=0;i--) printf("%d ",3-i); printf("%ld ",stud[i].number); printf("%7s ",stud[i].name); for(j=0;j<2;j++) printf("%7.1f",stud[i].score[j]); printf("\n"); // 换行 }} void sort(struct student stud[],int n) int i,j,min; struct student t; for(i=0;i<n;i++) min=i; for(j=i+1;j<n;j++) if((stud[j].score[0]+stud[j].score[1])/2<(stud[min].score[ 0]+stud[min].score[1])/2) t=stud[j]; stud[j]=stud[min]; stud[min]=t; min=j;} }}

9.3.4 结构体数组指针 下面介绍如何应用结构体指针变量存储结构体数组的首地址, 以及如何通过 结构体指针变量获得结构体数组的元素及其成员变量 如所示, 首先定义结构体数组 student[4] 及结构体指针 p, 然后利用 p=student 语句将数组的首地址赋值给指针 p, 使 p 指向了一维数组 student, 最后通过 p+i 即第 i 个数组元素来逐个输出数组的内容

9.3.4 结构体数组指针 例 9.5 利用结构体数组指针输出数组内容 #include "stdio.h" struct data/* 定义结构体类型 */ int year; int month; int day; }; struct stu/* 定义结构体类型 */ char name[20]; long num; struct data birthday; };

9.3.4 结构体数组指针 void main() int i; struct stu*p,student[4]="liying",1,1978,5,23},"wangping",2,1979,3,14},"libo",3,198 0,5,6},"xuyan",4,1980,4,21}}; /* 定义结构体数组并初始化 */ p=student;/* 将数组的首地址赋值给指针 p,p 指向了一维数组 student*/ printf(" 姓名, 序号, 出生年, 月, 日 \n"); for(i=0;i<4;i++)/* 采用指针法输出数组元素的各成员 */ printf("%s,%ld,%d,%d,%d\n",(p+i)->name,(p+i)->num, (p+i)->birthday.year,(p+i)->birthday.month,(p+i)->birthday.day); }

9. 4 编程举例 例 1: 简单的数据结构题 ( 普通和指针变量引用两种方法 ) struct point int x; int y; } struct point pt;// 定义结构体变量 struct point *ppt; // 定义结构体指针 ppt=&pt;// 将结构体变量 pt 的地址赋给结构体指针 ppt pt.x=0; /* 通过 pt 访问 pt 的成员即是普通的结构体引用, 即可以通过这个语句来访问成员 x 并为其赋值 */ (*ppt).x=0; /* 通过 ppt 访问 pt 的成员即是指针变量的引用, 即可以通过该语句或下面的等价语句来访问成员 x 并为其赋值 */ ppt->x=0;

9. 4 编程举例 例 2: 结构体数组例题 ( 普通 指针和指针变量引用三种方法 ) 此处仍使用以上例 1 已经定义的 point 结构体 struct point pt_array[3]=1,0}, 1,1},0,1}};// 定义结构体数组 pt_array struct point *ppt; // 定义结构体指针 for(i=0;i<3;i++)/* 普通引用, 直接使用各个数组元素即结构体引用成员 x 和 y */ printf( 第 %d 个结构体元素的 x 值为 :%d,y 值为 :%d,i,pt_array[i].x, pt_array[i].y);

9. 4 编程举例 for(i=0;i<3;i++) printf(" 第 %d 个结构体元素的 x 值为 :%d,y 值为 :%d",i, (pt_array+i)->x, (pt_array+i)->y); /* 指针引用, 使用数组名作为数组起始地址并通过指针运算逐个引用各元素的成员 x 和 y */ i=0; for(ppt= pt_array;ppt<pt_array+3;ppt++) printf(" 第 %d 个结构体元素的 x 值为 :%d,y 值为 :%d",i++,ppt->x, ppt- >y); /* 指针变量引用, 使用指针变量 ppt 初始化为数组起始地址并递增来逐个引用各元素的成员 x 和 y */