第11章结构体1
C#程序设计 第11章 结构体、联合体与位运算
第11章结构体、联合体与位运算本章介绍结构体、联合体及枚举类型等三种新的构造型数据类型以及位运算的基本方法,包括结构体的含义;结构体类型变量的定义、引用及初始化方法;结构体数组的定义和数组元素的引用;结构体类型指针的概念及链表的基本操作方法;联合体的含义;联合体类型变量的定义方法;枚举类型的定义; TYPEDEF的作用和位运算的基本方法等。
11.1 结构体类型通过前面有关章节的学习,我们认识了整型、实型、字符型等C语言的基本数据类型,也了解了数组这样一种构造型的数据结构,它可以包含一组同一类型的元素。
但仅有这些数据类型是不够的。
在实际问题中,有时需要将不同类型的数据组合成一个有机的整体,以便于引用。
例如,在新生入学登记表中,一个学生的学号、姓名、性别、年龄、总分等,它们属于同一个处理对象,却又具有不同的数据类型。
如图11-1。
每增加、删减或查阅一个学生记录,都需要处理这个学生的学号、姓名、性别、年龄、总分等数据,因此,有必要把一个学生的这些数据定义成一个整体。
图11-1虽然数组作为一个整体可用来处理一组相关的数据,但不足的是,一个数组只能按序组织一批相同类型的数据。
对于一组不同类型的数据,显然不能用一个数组来存放,因为数组中各元素的类型和长度都必须一致。
为了解决这个问题,C语言中给出了另一种构造数据类型——“结构体”。
11.1.1 结构体类型与结构体变量结构体是一种构造类型,它由若干“成员”组成。
每一个成员可以是一个基本数据类型或者又是一个构造类型。
结构体既然是一种构造而成的数据类型,那么在使用之前必须先定义它,如同在调用函数之前要先定义或声明一样。
定义一个结构体类型的一般形式为:struct 结构体名{ 成员1 类型1;成员2 类型2;...成员n 类型n;};“结构体”这个词是根据英文单词structure译出的。
结构体中的每个成员均须作类型说明,成员名的命名应符合标识符的书写规定,成员名可以与程序中的变量名同名,二者不代表同一对象,互不干扰。
C语言程序设计教学大纲
《C语言程序设计》教学大纲(总11页)--本页仅作为文档封面,使用时请直接删除即可----内页可以根据需求调整合适字体及大小--《C语言程序设计》教学大纲课程名称:中文名称:C语言程序设计;英文名称:C Language Programming课程编码:161002学分:分总学时:72学时,其中,理论学时:52学时;上机学时:20学时。
适用专业:全校理工科各专业先修课程:计算机基础执笔人:审订人:一、课程的性质与任务《C语言程序设计》是为全校所有的理工科专业的学生开设的公共基础课,也是一门重要的必修课。
其目的是使学生掌握程序设计的基本方法,培养学生掌握利用计算机处理问题的思维方法与应用能力。
要求学生掌握程序的三种基本结构及结构化的程序设计方法,了解并掌握几种典型的算法,并且能够熟练地运用C语言编写各种应用程序,为进一步学习其它相关课程奠定基础。
二、教学内容与学时分配第一章程序设计基本概念 (3学时)本章重点:一、算法及特性;二、结构化程序设计方法。
难点:算法设计及其表示。
第一节程序和程序设计一、程序;二、程序设计。
第二节算法第三节结构化程序设计方法第四节 C语言程序的基本结构第二章数据类型、运算符和表达式 (5学时)本章重点:一、标识符的正确使用;二、各种基本数据类型的使用;三、算术运算符的优先级和结合性;四、表达式计算中的类型转换。
难点:一、各种类型数据在计算机内存中的存储形式;二、自增自减运算。
第一节 C语言的数据类型第二节常量与变量第三节整型数据第四节实型数据第五节字符型数据第六节算术运算符与算术表达式第七节赋值运算符与赋值表达式一、赋值运算符和赋值表达式;二、复合的赋值表达式;三、自加、自减运算符;四、赋值运算中的类型转换。
第八节逗号运算符与逗号表达式第三章顺序结构程序设计 (4学时)本章重点:一、printf函数;二、scanf函数。
难点:输入与输出时的格式控制。
第一节 C语句概述第二节赋值语句第三节数据的输入与输出一、printf函数;二、putchar函数;三、scanf函数;四、getchar函数第四节顺序结构程序举例第四章选择结构程序设计 (4学时)本章重点:一、逻辑值的表示、使用及其运算;二、关系运算符的运算规则及关系表达式;三、逻辑运算符的运算规则及逻辑表达式;四、if语句;五、switch语句的形式与执行过程。
C语言第11章结构体
29
【例】30张选票,对三名侯选人之一投票选举,输 入得票人名字,按名字计数,输出最后选举结果。 #include "stdio.h" #define N 30 struct person { char name[20]; int count; };
Li
0 Zhang 0 Wang 0
led[0].name
第十一章 结构体与பைடு நூலகம்用体
本章目标
1.理解结构体,共用体的数据类型
2.学会定义结构体、共用体的数据类型 的变量 3.能够正确使用结构体、共用体的成员
§11.1
已了解的数据类型:
引言
整型 浮点型 字符型 数组
简单数据类型
用户定义的数据类型
特点:所有的元素都是同一种类型
指针型 存在的问题:难以处理较复杂的数据
18
圆点运算符
引用形式:结构体变量名 . 成员名 其中:成员运算符’ . ‟ : 一级,自左而右;
stu1.num 引用结构体变量stu1的num成员; 引用stu1的name成员(字符指针); [i] 引用name成员的第i个元素; stu1.birthday.y 只能对最低级成员进行引用;
二、定义完结构体后,定义结构变量并初始化 struct student x2={0002, "Li Ming ", 85.5};
16
§11.4 访问结构成员
访问结构变量实质上是引用其成员 有两种运算符可访问结构成员
17
struct date { int m; int d; iny y; }; struct student { long num; char name[20]; char sex; struct date birthday; float score; char tel[15]; } stu1, stu2;
课后习题及答案
8、按岩体力学的观点,岩体具有什么样 的力学特征? 答:非均质、非连续、各向异性。
第2章 习题 解释下例名词术语 1、岩石的水理性质 2、岩石的空隙度 3、岩石的空隙比
4、岩石的吸水:
5、岩石的饱水率 6、岩石的饱水系数 7、岩石的软化系数 8、岩石的抗冻系数
第2章 习题 1、岩石的水理性质:岩石在水溶液作 用下表现出来的性质,称为水理性质 ,主要有吸水性、软化性、抗冻性及 渗透性等。 2、岩石的空隙度:指岩石的裂隙和孔 隙发育程度,其衡量指标为空隙率(n) 。3、岩石的空隙率:岩石试件内空隙 的体积(VV)占试件总体积(V)的百分比 。
第1章 习题
解释下例名词术语
9、节理张开度:指节理面两壁间的垂直距离。 10、岩体:岩体是指在地质历史过程中形成的, 由岩块和结构面网络组成的,具有一定的结构,赋存 于一定的天然应力状态和地下水等地质环境中的地质 体。 11、结构体:岩体中被结构面切割围限的岩石块 体。 12、岩体结构:岩体中结构面与结构体的排列组 合特征。 13、岩体完整性系数Kv:其是指岩体纵波速度和 岩块纵波速度之比的平方。 14、岩石质量指标RQD:大于10cm的岩芯累计 长度与钻孔进尺长度之比的百分数。
9、岩石的记忆:每次卸载后再加载到原来的应力 后继续增加荷载,即逐级循环加载,则新的加载曲线 段将沿着卸载前的加载曲线方向上升的形象。 10、反复循环:在低于弹性极限的恒定应力下反 复加载、卸载。 11、逐级循环:每次卸载后再加载到原来的应力 后继续增加荷载。 12、疲劳强度:岩块在高于弹性极限的某一应力 下反复加载、卸载时将导致试件进一步的变形,发生 破坏时的应力低于单轴抗压强度,这一应力称为疲劳 强度。 13、岩石的流变性:岩石的变形和应力受时间因 素的影响,在外部条件不变的情况下,岩石的变形或 应力随时间而变化的现象叫流变。 14、蠕变:岩石在恒定的荷载作用下,变形随时 间逐渐增大的性质。
第十一章结构体的试题
(1)()是关于C语言数据类型的正确叙述。
A) 枚举类型不是基本类型B) 变量使用前应定义相应的数据类型C) 不允许使用空类型D) 数组不是构造类型(2) 下列()对结构类型变量定义是错误的。
A) struct teacher{ int num;int age;};struct teacher teach1;B) struct{ int num;int age;} teach1, teach2;C) struct{ int num;int age;} teacher;struct teacher teach1;D) struct teacher{ int num;int age;} teach1;(3) 若有定义:char ch;int j,k;enum day {sun, mon, tue, wed, thu, fri, sat};int a[sat];则()对下列语句是否符合语法规则的判断是正确的。
sun=0; /*语句1*/j=mon+tue; /*语句2*/if (a[mon]>0) j++; /*语句3*/A) 语句1、2、3均正确B) 语句2正确,语句1和语句3错误C) 语句1错误,语句2和语句3正确D) 语句1、2、3均错误(4) 若有定义:struct teacher{ int num;char sex;int age;} teacher1;则下面叙述错误的是()。
A) teacher1是结构类型名B) struct teacher是用户定义的结构类型C) num、sex、age都是结构变量teacher1的成员D) struct是结构类型的关键字(5) 下列程序段运行后,表达式()的值为3。
struct point{ int x;int y;} *p;struct point a[3]={1,2,3,4,5,6};p=a;A) p[1].xB) *(p+2)C) p[3].xD) p[2].x(6) 若有定义:typedef int NUM[100];NUM n;则()语句是正确的。
C语言程序设计(姜学峰版)PPT课件第十一章
8
5)定义结构体类型仅仅声明了一种数据结构,编译 系统不会为类型分配存储空间的;此时可用已定 义的结构体类型去定义结构体变量或数组,编译 系统将为结构体变量分配存储空间;
9
2. 定义结构体类型的变量 有三种方法: 1)先定义结构体类型,再用类型标识去定义变量 struct student stu1, stu2; struct student是已定义的结构体类型标识符; stu1、stu2是所定义的结构体变量;编译时将为 结构体变量分配各自的存储空间; 2)定义类型的同时定义变量 struct student { …; …; } stu1, stu2;
18
5. 结构体变量的指针、结构体成员的指针 注:&优先级为2级,低于.和[ ]; stu1 变量stu1的指针:&stu1 图示: num
num成员指针:&stu1. num
4
20 1
name第i个元素指针:&stu1. name[i]
name sex m
┇
birthday d 最低级成员y的指针:&stu1.birthday.y y score
5
例:定义可表示学生基本情况的结构体类型。
项目: 学号 姓名 性别 出生日期 成绩 电话号码 数据: 010510 Li Feng M 1981.5.4 680 029-8482500
类型: 长整/字串 字串
字符
字串
整型
字串
struct student /*结构体类型标识*/ { long num; char name[20]; char sex; char birthday[12]; float score; char tel[15]; };
第11章 结构体与共用休
定义结构体类型的同时定义结构体变量
一般形式:
struct 结构体名 { 类型标识符 成员名; 类型标识符 成员名; ……………. }变量名表列;
例 struct student { int num; char name[20]; char sex; int age; float score; char addr[30]; }stu1,stu2;
num
25B
name sex age num
name sex age
stu[0]
stu[1]
结构体数组初始化
分行初始化: 结构体数组引用 顺序初始化: struct student struct student 引用方式: 结构体数组名[下标].成员名 { int num; 例 { int student struct num; 例 struct num; char { char name[20]; int name[20]; stu[1].age++; struct student { char num; int sex; char sex; name[20]; int age; num; {char name[20]; int int age; char sex; }; char sex; }; int char name[20]; age; struct student stu[ ]={{100,“WangLin”,„M‟,20, int char sex; age; struct student stu[ ]={100,“Wang Lin”,„M‟,20}, }stu[ ]={{……},{……},{……}}; {101,“LiGang”,„M‟,19, int age; }stu[ ]={{……},{……},{……}}; 101,“Li Gang”,„M‟,19}, strcpy(stu[0].name,”ZhaoDa”); {110,“LiuYan”,„F‟,19}; }str[3]; 110,“Liu Yan”,„域
预处理命令与结构体练习题答案
第11章结构体与共用体一、选择题(在下列各题的A)、B)、C)、D)四个选项中,只有一个选项是正确的,请将正确选项填涂在答题卡相应位置上。
)11.1 C语言结构体类型变量在程序运行期间A)TC环境在内存中仅仅开辟一个存放结构体变量地址的单元B)所有的成员一直驻留在内存中C)只有最开始的成员驻留在内存中D)部分成员驻留在内存中考生答案: 正确答案: B11.2 下列各数据类型不属于构造类型的是A)枚举型 B)共用型 C)结构型 D)数组型考生答案: 正确答案: A11.3 当说明一个结构体变量时系统分配给它的内存是A)各成员所需内存量的总和 B)结构中第一个成员所需内存量C)成员中占内存量最大者所需的容量 D)结构中最后一个成员所需内存量考生答案: 正确答案: A11.4 设有以下说明语句typedef struct{ int n;char ch[8];} PER;则下面叙述中正确的是A)PER 是结构体变量名 B)PER是结构体类型名C)typedef struct 是结构体类型 D)struct 是结构体类型名考生答案: 正确答案: B11.5 已知有如下定义:struct a{char x; double y;}data,*t;,若有t=&data,则对data 中的成员的正确引用是A)(*t).data.x B)(*t).x C)t->data.x D)t.data.x 考生答案: 正确答案: B11.6 以下程序的运行结果是#include "stdio.h"main(){ struct date{ int year,month,day; } today;printf("%d\n",sizeof(struct date));}A)6 B)8 C)10 D)12考生答案: 正确答案: A11.7 设有如下定义:struck sk{ int a;float b;} data;int *p;若要使P指向data中的a域,正确的赋值语句是A)p=&a; B)p=data.a; C)p=&data.a; D)*p=data.a; 考生答案: 正确答案: C11.8 以下对结构体类型变量的定义中,不正确的是A)typedef struct aa{ int n;float m;} AA;AA tdl;B)#define AA struct aaAA { int n;float m;} tdl;C)struct{ int n;float m;} aa;struct aa tdl;D)struct{ int n;float m;} tdl;考生答案: 正确答案: C11.9 若有下面的说明和定义struct test{ int ml; char m2; float m3;union uu { char ul[5]; int u2[2];} ua;} myaa;则sizeof(struct test )的值是A)12 B)16 C)14 D)9考生答案: 正确答案: A11.10 以下程序的输出是struct st{ int x; int *y;} *p;int dt[4]={ 10,20,30,40};struct st aa[4]={ 50,&dt[0],60,&dt[0],60,&dt[0],60,&dt[0]};main(){ p=aa;printf("%d\n",++(p->x));}A)10 B)11 C)51 D)60考生答案: 正确答案: C11.11 有以下程序:#include <stdio.h>union pw{ int i;char ch[2];}a;main(){ a.ch[0]=13;a.ch[1]=0;printf("%d\n",a.i);}程序的输出结果是A)13 B)14 C)208 D)209 考生答案: 正确答案: A11.12 已知学生记录描述为:struct student{ int no;char name[20],sex;struct{ int year,month,day;} birth;};struct student s;设变量s中的“生日”是“1984年11月12日”,对“birth”正确赋值的程序段是A)year=1984;month=11;day=12;B)s.year=1984;s.month=11;s.day=12;C)birth.year=1984;birth.month=11;birth.day=12;D)s.birth.year=1984;s.birth.month=11;s.birth.day=12;考生答案: 正确答案: D11.13 有如下定义struct person{char name[9];int age;};struct person class[10]={"John",17,"paul",19,"Mary",18,"Adam",16,};根据上述定义,能输出字母M的语句是A)printf("%c\n",class[3].name);B)printf("%c\n",class[3].name[1]);C)printf("%c\n",class[2].name[1]);D)printf("%c\n",class[2].name[0]);考生答案: 正确答案: B11.14 下列程序的输出结果是struct abc{ int a, b, c, s; };main(){ struct abc s[2]={{1,2,3},{4,5,6}}; int t;t=s[0].a+s[1].b;printf("%d\n",t);}A)5 B)6 C)7 D)8考生答案: 正确答案: B11.15 若有下面的说明和定义,则sizeof(struct aa)的值是struct aa{ int r1; double r2; float r3;union uu{char u1[5];long u2[2];}ua;} mya;A)30 B)29 C)24 D)22考生答案: 正确答案: D11.16 有以下结构体说明和变量的定义,且指针p指向变量a,指针q指向变量b。
c11文件
4
2
文件类型指针
系统给每个打开的文件都在内存中开辟一个区域, 系统给每个打开的文件都在内存中开辟一个区域 , 用于 存放文件的有关信息(如文件名、文件位置等) 存放文件的有关信息(如文件名、 文件位置等)。这些信息 结构类型变量中 该结构类型由系统定义、 保存在一个结构类型变量 保存在一个结构类型变量中,该结构类型由系统定义、取名 为FILE,包含在 ,包含在stdio.h中。 中
C 3、函数rewind的作用是_______。 函数rewind的作用是_______。 rewind的作用是_______ 使位置指针指向文件的末尾。 A、使位置指针指向文件的末尾。 将位置指针指向文件中所要求的特定位置。 B、将位置指针指向文件中所要求的特定位置。 使位置指针重新返回文件的开头。 C、使位置指针重新返回文件的开头。 使位置指针自动移到下一个字符位置。 D、使位置指针自动移到下一个字符位置。 4、若以“a+”方式打开一个已存在的文件,则以下叙述正确的 若以“a+ 方式打开一个已存在的文件, 方式打开一个已存在的文件 A _______。 是_______。 文件打开时,原有文件内容不被删除, A、文件打开时,原有文件内容不被删除,位置指针移到文 件末尾,可作添加和修改操作。 件末尾,可作添加和修改操作。 文件打开时,原有文件内容不被删除, B、文件打开时,原有文件内容不被删除,位置指针移到文 件开头,可作重写和读写操作。 件开头,可作重写和读写操作。 文件打开时,原有文件内容被删除,只可作写操作。 C、文件打开时,原有文件内容被删除,只可作写操作。 以上皆非。 D、以上皆非。
6
文件的打开──fopen()函数 函数 文件的打开
1.用法: FILE *fp; .用法 fp=fopen(文件名,使用文件方式 ; 文件名, = 文件名 使用文件方式); 例如, FILE *fp; fp=fopen("data.99","r"); 2.说明 . (1)如果不能打开文件,则函数返回一个空指针 )如果不能打开文件,则函数返回一个空指针NULL。 。 为增强程序的可靠性,常用下面的方法打开一个文件: 为增强程序的可靠性,常用下面的方法打开一个文件: if((fp=fopen("文件名 操作方式 文件名","操作方式 文件名 操作方式"))==NULL) { printf("can not open this file\n"); exit(0); 关闭已打开的所有文件,结束程序运行, 关闭已打开的所有文件,结束程序运行, 返回操作系统,并将“程序状态值” 返回操作系统,并将“程序状态值”返 } 回给操作系统。 回给操作系统。
c语言2019课外作业4
第 8、9、11 章 结构体、指针、文件练习题
一、选择题 1.下面对结构数据类型的错误叙述是______。
A.结构变量可以在说明结构类型后定义,也 可在说明结构时定义。
B.结构可由若干个成员组成,各成员的数据 类型可以不同。
C.定义一个结构类型后,编译程序要为结构 的各成员分配存储空间。
s2 的长,函数值为 1,否则函数值为 0
B.FILE *fp ; fp = fopen( "file1.txt" , "r+" ) ;
15.下列关于 C 语言数据文件的叙述中正确的是
C.FILE *fp ; fp = fopen( "file1.txt" , "rb" ) ;
_______。
D.FILE *fp ; fp = fopen( "file1.txt" , "rb+" ) ;
A.printf( "%c\n" , stu[2].name ) ; B.printf( "%c\n" , stu[2].name[1] ) ; C.printf( "%c\n" , stu[1].name[1] ) ; D.printf( "%c\n" , stu[1].name[0] ) ; 6.若已定义 int a = 5 ; 下面对 ①、② 两个语句的 正确解释是_______。 ① int *p = &a ; ② *p = a ; A.语句①和②中的*p 含义相同,都表示给指
24.读取二进制文件的函数调用形式为:
exit( 0 ) ; }
fread( buffer , size , count , fp ) ;其中参数 buffer
第十一章 平面机构运动简图及其自由度
11.3 平面机构的自由度及具有确定运动的条件 MACHINE
一般在高副接触处,若有滚子存在,则滚子绕自身轴线
转动的自由度属于局部自由度,采用滚子结构的目的在于 将高副间的滑动摩擦转换为滚动摩擦,以减轻摩擦和磨损。
3、虚约束 对机构的运动不起独立限制作用的约束称为虚约束。如图a
所示为机车车轮联动机构,图b为其机构运动简图。
11.3 平面机构的自由度及具有确定运动的条件 MACHINE
• 2、局部自由度 不影响机构中其它构件相对运 动的自由度称为局部自由度。 如右图所示 。 在计算机构的自由度时,局部 自由度不应计入。
如图所示的凸轮机构中,自由度计算为:
n=2、PL=2(PL≠ 3)、 PH=1,则 F=3n-2PL-PH=3×2-2×2-1=1。
去两个自由度;每个高副引入一个约束,使构件失去一个
自由度。
11.3 平面机构的自由度及具有确定运动的条件 MACHINE
1. 平面机构自由度计算公式 在机构中,若共有K个构件,除去机架外,其活动构件数 为n=K-1。显然,这些活动构件在未组成运动副之前,其 自由度总数为3n,当它们用PL个低副和PH个高副联接组 成机构后,因为每个低副引入两个约束,每个高副引入 一个约束,所以,总共引入(2PL+PH)个约束。故整个机 构的自由度应为活动构件的自由度总数与全部运动副引 入的约束总数之差,用F 表示,即 F=3n-2PL-PH (1-1) 由上式可知:机构自由度F取决于活动构件的件数与运动 副的性质(高副或低副)和个数。
MACHINE
• ⑵ 移动副——两构件间只能作相对移动的低副称为移动副, 移动副及其简图符号表示如下图所示。
移动副
移动副的表示方法
11.1 平面机构的组成
11章
scanf(“%d,%s,%c,%d,%s”,&student1);
错!
结构体变量的初始化
(一)对外部存储类型的结构体变量初始化: struct student 运行结果为: {long int num; No.:9801 name:Wang hong char name[20]; sex:W char sex; address:2 Linggong Road char addr[20]; } a={9801,”Wang hong”,‟W‟,”2 Linggong Road”}; main( ) {printf(“No.:%ld\nname:%s\nsex:%c\naddress:%s\n”, a.num,,a.sex,a.addr); }
}
1数据)
(一)结构体数组的定义,如 struct student {int num; char name[20]; char sex; int age; char addr[30]; }; struct studnt stu[3];
也可直接定义,如 struct student {int num; … } stu[3]; 或struct {int num; … }stu[3];
2 .若成员本身又属一个结构体类型,只能对最低级的成员进行 赋值或存取以及运算。如:student1.birthday.year (下页续)
(接上片)
3. 对成员变量可以象普通变量一样进行各种运算, 如: sumage=student1.age+student2.age; 4. 可以引用成员的地址,也可以引用结构体变量的 地址,如 输入student1.num的值 scanf(“%d”,& student1.num); printf(“%o”,&student1);
C语言-结构体与共用体
(1)“结构类型名”和“数据项”的命名规则,与变量 名相同。 (2)数据类型相同的数据项,既可逐个、逐行分别定义, 也可合并成一行定义。 例如,上例中的日期结构类型,也可改为如下形式: struct date {int year, month, day; }; (3)结构类型中的数据项,既可以是基本数据类型,也 允许是另一个已经定义的结构类型。 例如,上例中的结构类型std_info,其数据项“birthday” 就是一个已经定义的日期结构类型date。 (4)本书将1个数据项称为结构类型的1个成员(或分 量)。
/*主函数main()*/ main() { int i; /* 打 印 表 头 : " □" 表 示 1 个 空 格 字 符 * / printf("No.□□□□Name□□□□□Sex□Birthday\n"); /*输出三个学生的基本情况*/ for(i=0; i<3; i++) { printf("%-7s",student[i].no); printf("%-9s",student[i].name); printf("%-4s",student[i].sex); printf("%d-%d-%d\n",student[i].birthday.year, student[i].birthday.month, student[i].birthday.day); } }
11.2
定义结构体类型变量的方法
声明一个结构体类型的一般形式: struct 结构类型名 /* struct是结构类型关键字*/ {数据类型 数据项1; 数据类型 数据项2; …… …… 数据类型 数据项n; }; /* 此行分号不能少!*/
C语言11结构体与共用体
struct [结构体名]
{
类类结述…型 型结构…不标 标构体…分识 识的类…配符 符组型…内织定.存成 成形义员员式描名名;;
};2020/5/11
struct student { char name[20];
unsigned int nuloat score[3]; }; 3
} 2020/5/11 stu;
7
• 结构体变量的初始化
struct 结构体名
{ 类型标识符 成员名;
struc类t 型stu标de识nt符 成员名; { in…t n…u…m;……. }; char name[20]; strucctha结r 构sex体; 名 结构体变量={初始数据};
int age; strucctha结r a构dd体r[名30]; }{;stu1={112,“Wang Lin”,‘M’,19, “200 Beijing Road”}; struc类t 型stu标de识nt符stu成1=员{11名2,;“Wang Lin”,‘M’,19, “200 Beijing Road”};
类型标识符 成员名;
……………. } 结构体变量={初始数据};
2020/5/11
8
• 结构体数组的定义和内存分配
形式一:
形式二:
struct student
struct student
{ int num;
{ int num;
char name[20];
char name[20];
char sex;
stu[1]
main()
age
{ struct student *p;
num
for(p=stu; p<stu+3; p++)
C程序设计(第三版)习题答案(9、11章) 谭浩强著
}
printf("value=%format\t",x1);printf("value=%format\t",x2);putchar('\n');
输出结果:
value=5.000000ormat value=5.000000ormat
value=3.000000ormat value=8.000000ormat
break;
case 3:scanf("%s",s);
STRING(s);
break;
default:printf("error");
}
}
9.8main()
{int a,b,c;
scanf("%d,%d,%d",&a,&b,&c);
main()
{int a,b;
scanf("%d,%d",&a,&b);
printf("%d",SURPLUS(a,b));
}
9.3#include"math.h"
#define S(a,b,c) ((a+b+c)/2)
#define AREA(a,b,c) (sqrt(S(a,b,c)*(S(a,b,c)-a)*(S(a,b,c)-b)*(S(a,b,c)-c)))
scanf("%d",&stu.score[j]);
C语言进阶:重点、难点与疑点解析
C语言进阶——重点、难点与疑点解析牟海军 著ISBN:978-7-111-38861-6本书纸版由机械工业出版社于2012年出版,电子版由华章分社(北京华章图文信息有限公司)全球范围内制作与发行。
版权所有,侵权必究客服热线:+ 86-10-68995265客服信箱:service@官方网址:新浪微博 @研发书局腾讯微博 @yanfabook或许绝大多数人都有这样的经历,最初学习C语言的目的是为了应付考试,所以对于C语言只能算是一知半解。
真正运用C语言进行编程时会出现很多问题,让人措手不及,这时才发现自己只能理解C语言的皮毛,虽能看懂简单的代码,却写不出程序来,对于那些稍微复杂的代码就更是望尘莫及了。
为了摆脱对C语言知其然不知其所以然的状态,本书将带领读者重启C语言学习之旅,这次不再是为了考试,而是出于真正的使用需要,所以有针对性地给出了C语言学习中的重点、难点与疑点解析,希望能够帮助更多的C语言爱好者走出困境,真正理解C语言,真正做到学以致用。
为了让读者能够真正地理解C语言学习中的重点、难点与疑点,以及体现本书学以致用的特色,全书没有采用枯燥的文字描述来讲解C语言相关的知识点,而是采用知识点与代码结合的方式,同时对于代码展开相应的分析,这就避免了部分读者在学习了相关知识点之后仍然不知道如何使用该知识点的弊端,使读者可以通过代码来加深对相关知识点的理解。
全书在结构安排上都是围绕C语言学习中的重点、难点与疑点进行讲解,如第1章并没有从讲解C语言中的基础知识点开始,而是先列举了C语言学习中易混淆的核心概念,使读者清晰地区分这些核心概念后再开始相应知识点的学习。
本书对基础知识点也并非概念性地讲解,而是重点讲解了使用中的要点,同时重点讲解了C语言中的一些调试和异常处理的方法,以及误区和陷阱知识点。
最后一章讲解了编程中必须掌握的一些常用算法。
总之,本书能够使读者在现有基础上进一步提高自己的C语言编程能力,更清晰地认识和理解C语言。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2) 结构体数组stu的存储结构
99001 Li Feng\0 89.5
4 20 28
stu[0]
4
84 byte
stu[1]
99002 Wang Yi\0 70.5
stu[2]
99003 Zhao Hui\0 92.0
2. 结构体数组的引用 引用形式:数组名[下标] . 成员名 如: stu[0].num 访问stu数组首元素的成员num; stu[1].score 访问以1为下标那个元素的score成员;
•各成员按定义顺序连续存储 •长度是该结构体变量中所有成员占内存之和 •可用sizeof运算符求出一个结构体的长度
例: struct student { int num; char name[20]; char sex; int age; char addr[30]; };
……
num(4字节)
……
char name[20]; float score; } x1={1,”LiMing”,85.5};
} x;
二、定义完结构体后,定义结构变量并初始化 struct student x2={2, "Li Hua ", 90};
§11.4 访问结构成员
访问结构体变量实质上是引用其成员 有两种运算符可访问结构成员 . 成员运算符 -> 指向运算符
X1: X2:
01 02
m f
zhao yi qian er
78 88
2. 在定义结构体类型的同时定义变量: 定义形式
列
} 变量名表列;
例:struct student { int num; char name[20]; char sex; int age; char addr[30]; } x1, x2;
4 20 1 12
共 56 字 节
4
15
成员字节
§1 1.3 结构体变量的初始化
结构体变量的初始化就是指在定 义结构体变量的同时给该变量赋初值。
一、定义结构体的同时定义变量并初始化
如:struct student
{ unsigned No;
但不能这样写: struct student { unsigned No=1; Char name[20]=“Li”; float score=88;
【例】编程求三位学生的平均成绩,每个学生包含3种信息:学 号、姓名、成绩。 struct student { int num; char name[20]; float score; }; void main( ) {struct student stu[3]={ {99031, "Li Lin", 89.0}, {99032, "Wang Fang", 71.0}, float sum; {99033, "Zhao Ping", 92.0} }; int i; sum=0; for(i=0; i<3; i++) sum=sum+stu[i].score;/*累加各元素score成员*/ printf("\n\taverage=%f\n", sum/3.0); }
1. 结构体数组的定义和初始化 例:struct student { int num; char name[20]; float score; } stu[3]={ {99001, "Li Feng", 89.5}, {99002, "Wang Yi", 70.5}, {99003, "Zhao Hui", 92} }; 说明: 1) 数组stu各元素类型相同,都为struct student型;
2.struct –––关键词(保留字),表示定义一种结构体
类型。 3.一个C程序可定义多个结构体类型;定义的位置可在
函数之内,也可在函数之外;位置决定有效范围;
如:结构体类型1定义;
void main( ) { 结构体类型2定义; ┅; } fun1(┅) { ┅; }
§11.2 结构体变量的定义
注意: 1. 不能整体引用,只能对各个成员分别引用。 printf("%d,%s,%f",stu1);
有个特例: 结构体变量间的赋值运算
如:stu2=stu1;
2. 每一个成员的作用与普通简单变量的引
用相同。 stu1.num=110234;
stu1.birthday.y=1981; sum=stu1.score+stu2.score; stu1.num++; //. 1级 ++ 2级
float score;
char addr[30];
};
分号不能少
我们可以根据需要定义很多类似的类型, 如struct goods,struct book等等。
§11.2 结构体的定义
一、结构体定义的一般形式:
struct 结构体名 { 成员表列 }; 成员表列的写法:类型标识符 成员名;
可以是我们学过的任何类型
stu1.num 引用结构体变量stu1的num成员; 引用stu1的name成员(字符数组名); [i] 引用name成员的第i个元素; stu1.birthday.y 对最低级成员进行引用;
【例】按以上定义输入 scanf("%d", &stu1.num); /* .高于&*/ scanf("%d,%d,%d", &stu1.birthday.m, &stu1.birthday.d, &stu1.birthday.y); 110234 ↙ 5,24,1981 ↙ 【例】gets(); /*成员name的指针*/ scanf("%s", stu1.tel); /*成员tel的指针*/ Li Feng ↙ 021-8482500 ↙
如:建立一份学生档案,对每一个学生至少 需要以下一些信息。 学号(unsigned no) 姓名(char name[20])
性别(char sex)
年龄(int age)
成绩(float score)
地址(char ddr[30])
C 程序可将上述数据的集合定义为一种结构体类型: struct student { unsigned num; char name[20]; char sex; int age;
3. 直接定义结构类型变量 定义形式 例:struct { int num; char name[20]; char sex; int age; char addr[30]; } x1, x2;
struct
{
成员表列
} 变量名表列; 不出现结构体类型名 称为无名结构体
几点说明:
1. 类型名与变量名是不同的概念。只能对 变量赋值、存取或运算。在编译时,对类 型是不分配空间的,只对变量分配空间。 2.结构体变量占用内存情况:
name[0]
……
X1
name[19] sex(1字节) age(4字节)
20字节
59个字节
……
addr[0]
struct student x1; printf(“%d”,sizeof(x1));
sizeof运算符,能够求出变量或类 型所占的内存字节数,例如: sizeof(int) 求int类型占内存字节数
每一个成员也称为结构体中的域
如:struct date { int year;
int month; int day;
结构体名
成员表列
域
};
也可写成: struct date { int year,month,day; };
注意: 1.这只是定义一种新类型的方法,尚未定义变量。
struct date 是一个类型名,类似于int
……
addr[29]
30字节
3. 一个结构体类型的变量可以是另一个结构体的成员
struct date { int m; int d; num iny y; }; name struct student { int num; sex char name[20]; m birthday d char sex; y struct date birthday; score float score; tel char tel[15]; } stu1, stu2; 成员
Li
0 Zhang 0 Wang 0
led[0].name
led[0].count
led[0] led[1] led[2]
void main( ) { struct person led[3]= {{"Li", 0},{ "Zhang", 0},{ "Wang", 0}}; char lname[20]; int i, j; for(i=1; i<=N; i++) /*i控制选票张数*/ { printf("Input NO.%d name:", i); gets(lname); for(j=0; j<3; j++) /*j控制数组下标*/ if(strcmp(led[j].name, lname)==0)/*串比较*/ { led[j].count+=1; break; } /*计票*/ } for(i=0; i<3; i++) printf("\n%-10s:%d", led[i].name,led[i].count); }
成员运算符(.)
引用形式:结构体变量名 . 成员名 其中:成员运算符’ . ‟ : 一级,自左而右; struct date { int m; int d; iny y; };