基于自然语言思想的递进C_C++教程2ppt.ppt_第1页
基于自然语言思想的递进C_C++教程2ppt.ppt_第2页
基于自然语言思想的递进C_C++教程2ppt.ppt_第3页
基于自然语言思想的递进C_C++教程2ppt.ppt_第4页
基于自然语言思想的递进C_C++教程2ppt.ppt_第5页
已阅读5页,还剩83页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

我们采用的教材,为了解决大量数据的复杂关系,C/C+语言中在前面简单名词的基础上,发展出集合名词,这是本章要讲解的内容。,第3章 C/C+语言的横向名词性扩充,3.1 C/C+语言的横向名词扩充(1):同类变量的集合数组 将同类型的、多个变量用一个名字来表示,这个名字所代表的多个同类型变量的全体,就是数组 这个名字不能叫做数组变量,应该称它为变量数组。因为这个名字本身不是变量,是常量(后面讲解),是这个名字引领了多个同类型的变量。 用数组名和下标来唯一地确定数组中的一个元素,即某一个变量。,3.1.1一维数组 1.一维数组的定义 类型说明 数组名常量表达式 “常量表达式”代表数组的长度,即该数组中共有多少个变量。 如: int a10; float x4+2; char name10;,说明: 数组长度一定用方括号。 方括号中的常量表达式表示数组长度,但实际元素是从第0到第长度减一元素。 定义数组长度只能是常量和符号常量,不能是变量。 下面对数组的定义是错误的。 int n; scanf(“%d”, ,2. 一维数组的初始化 可以使用赋值语句或输入语句给数组中的变量赋值。用赋值语句在定义数组时的赋值,叫做数组初始化。 初始化有如下几种形式: (1) 定义时初始化。 int a5=1, 2, 3, 4, 5;,(2)可以只给部分元素初始化。 int a5=1; 这时只给a0赋值1,其它没被赋值项会被赋值0,该赋值方法非常适合数组中只有少数项有确定值的情况。 (3) 用初始化来定义数组长度。 int a =1, 2, 3, 4, 5, 6; 这时,数组的长度会根据赋值常量的个数来自动确定为6。,3.一维数组元素的引用 一维数组中的元素是用数组名和角标来引用的,如a3是数组中的第3号元素。值得注意的是:最前面的元素是a0,而不是a1,最后一个元素是aN-1,而不是aN。 数组中的每一个元素就是一个该类型普通变量。该类型普通变量在程序中能够出现的地方,数组中的一个元素都可以出现。,3.一维数组元素的引用 在引用数组中元素时,不能出现定义时使用的类型符号,只用数组名和方括号整数,该整数应该是0到N-1之间的一个整数 当引用数组元素的下标整数超过N时,语法上不会出错,但引用的值不可预知,4.一维数组程序举例 例3. 1向整型数组a中输入若干数,分拣数组a中的素数和合数,分别置于整型数组b和c中。 #include #include void main() int a50, b50,c50; int count_a=0, count_b=0, count_c=0; int i, j, k; int tem; printf(“n请输入若干个(少于50个)整数,空格分隔,用0结束输入。n“);,scanf(“%d“, ,if (j=k+1) bcount_b+=ai; /如果是素数,存入数组b printf(“%d is a prime number n“, ai); else ccount_c+=ai; /如果不是素数,存入数组c printf(“%d is not a prime number n“,ai); i+; ,printf(“n素数有:n“); for (i=0;icount_b;i+) printf(“n%d“, bi); printf(“n合数有:n“); for (i=0; icount_c; i+) printf(“n%d“, ci); printf(“n“); ,例3. 2 用冒泡算法对5个数排序(由小到大)。 冒泡法排序过程见图3.2所示。,#include void main() int a5; int i, j, t; printf(“请输入5个无序整数:n“); for (i=0; iaj+1) t=aj;aj=aj+1; aj+1=t; printf(“排序后的数为 :n“); for (i=0; i5; i+) printf(“%d “,ai); ,3. 1. 2 二维数组 二维数组是一维数组的延伸和发展,是一维数组的嵌套。 二维数组的定义的一般形式: 类型说明符 数组名常量表达式1 常量表达式2 float a34; int b47; char name1510;,二维数组的初始化 (1)分行赋初值。 (2)根据线性排列,直接赋初值。如 (3)对部分元素赋初值。如,(4)全部元素都赋初值,定义数组时对第一维的长度可以不指定如 int a34=1,2,3,4,5,6,7,8,9,10,11,12; int a 4= 1,2,3,4,5,6,7,8,9,10,11,12; int a 4=1,2,3, ,0,12; 角标确定了列数,赋值形式确定了行数,所以数组的大小是确定的。,二维数组元素的引用 二维数组中的元素是用两个角标来唯一确定的。如a34是数组中第3行第4列的元素。,二维数组举例 例3. 3 将二维数组中每行元素求和,放置到另一个一维数组相应列的元素中。 #include void main() int a34=1,2,3,4, 5,6,7,8, 9,10,11,12; /3行的二维数组 int i,j; int b3=0, 0, 0; /3列的一维数组,每列存放一行的和,for (i=0; i3; i+) /二维数组3行,循环3次 for (j=0; j4; j+) / 二维数组4列,循环4次 bi+=aij; printf(“n“); ,printf(“ 数组中的值为 : n“); for (i=0; i3; i+) for (j=0; j4; j+) printf(“%5d“, aij); printf(“n“); printf(“数组各行的和为 : n“); for (i=0; i3; i+) printf(“%5dt“, bi); printf(“n“); ,例3. 4 用冒泡法将3*5二维数组中每行元素,按从小到大排序。 #include void main() int a35; int i, j, k, t; printf(“n请输入15个整数,空格分隔“); for (i=0; i3; i+) /对二维数组每行循环 for (j=0; j5; j+) /对二维数组每列循环 scanf(“%d“, /用于接收回车符 ,for (i=0; iaik+1) t=aik; aik=aik+1; aik+1=t; ,for (i=0; i3; i+) for (j=0; j5; j+) printf(“t%dt“, aij); printf(“n“); ,例3. 5 矩阵的转置。 #include void main() int a23=1,2,3,4,5,6; int b32,i,j; /数组b用于存放转置后的数据 printf(“转置前的数组为 : n“);,for (i=0; i=1; i+) for (j=0; j=2; j+) printf(“%5d“, aij); bji=aij; /转置赋值 printf(“n“); ,printf(“转置后的数组为 : n“); for (i=0; i=2; i+) for (j=0 ; j=1; j+) printf(“%5d“, bij); printf(“n“); ,3.1.3 n 维数组 n维数组是n-1维数组中的每个元素都是同类的长度相同的一维数组的结果。,3.1.4字符数组 字符数组是数组,数组中的每个元素是一个字符型变量 以单个字符来操作字符数组效率低,C允许以字符串的形式操作字符数组。,字符数组的声明和初始化,以字符量值的观点使用字符数组元素 例3. 6 字符数组的输入和输出 #include void main() char a43; int i,j; printf(“请连续输入(43)12个字符(字符间不要留空格或回车): n“); for (i=0; i4; i+) for (j=0; j3; j+) scanf(“%c“, ,printf(“ 输出数组内容 : n“); for (i=0; i4; i+) for (j=0 ; j3; j+) printf(“%ct“, aij); printf(“n“); ,字符输入和输出的函数 字符输入的函数getchar()和输出的函数putchar(字符量值) getchar()用于从键盘输入一个字符,putchar()会将一个字符输出到显示器。,例3. 7 getchar()和putchar()的使用 #include void main() char c; c=getchar(); putchar(c); ,例3. 8用getchar()和putchar()函数改写例3.6字符数组示例程序。 #include void main() char a43; int i,j; printf(“请连续输入12个字符(43): n“); for (i=0; i4; i+) for (j=0; j3; j+) aij=getchar();/scanf(“%c“, ,printf(“ 输出数组内容 : n“); for (i=0; i4; i+) for (j=0 ; j3; j+) putchar(t); /输出一个制表符 putchar(aij); / printf(“%ct“, aij); printf(“n“); ,以字符串的观点来使用字符数组,例3. 9用字符串给字符数组赋值和输出 #include void main() char a10=“ABCDEFG“; /赋值字符数要少于10,否则会有不可预知错误 printf(“%sn“,a); /从a代表的字符串起始地址,按字符输出,遇到0结束 ,字符串的操作函数,( 1 ) 字符串输入函数gets(字符数组名)和字符串输出函数puts(字符数组名) 例3. 10 用gets()和puts()对字符数组的输入和输出 #include void main() char a=“DaLian Maritime University,nLiaoNingnChina“; puts(a); printf(“n请输入字符串,以回车结束n“); gets(a); / 如输入“We are learning C language.” putchar(n); /输出换行符 puts(a); /输出a数组中的字符串 ,( 2 ) 字符串复制函数strcpy(字符数组,字符串常量或字符数组) 例3. 11 使用strcpy()复制字符串 #include #include void main() char a=“DaLian“; char b7; strcpy(b,a); puts(b); ,( 3 )测量字符串长度函数strlen(字符串量值) 例3. 12测定“字符串量值”的实际长度,不包括0所占的一位 #include #include void main() char a=“DaLian“; int len; len=strlen(“Chian”); printf(“n%dt“,len); len=strlen(a); printf(“n%dt“,len); ,( 4 ) 字符串连接函数strcat(字符数组,字符串量值) 例3. 13 字符串的连接和输出 #include #include void main() char a30=“DaLian Maritime“; strcat(a,“University“); puts(a); putchar(n); ,( 5 )字符串比较函数strcmp(字符串量值1,字符串量值2),例3. 14 字符串比较示例,融合了二维字符数组、字符、字符串操作函数,语句嵌套和break 及continue语句的使用。 #include #include void main() int i,j; char tem10; char name310=“LiLiang“,“WangFang“,“ZhangHong“; printf(“n现有人员:n“);,for (i=0; i=3) /已经完成了字符数组三行的比较 puts(“没有该人n“); ,3.2 C/C+语言的横向名词性扩充(2):自定义类型typedef,C/C+使用动词性的关键字typedef在现有类型基础上来定义新的类型名(名词),定义的格式为: typedef ,3.2.1简单类型的自定义 在大型程序设计中,为了增加程序的可读性,可以对已有的简单类型重新命名。如: typedef int Person; /定义Person是int类型,它们是等价的。 Person engineer; (等价于) int engineer; typedef double Currency; /定义Currency是double类型,它们是等价的。 Currency wage; double wage;,3.2.1简单类型的自定义 类型定义的作用是: (1)提高程序可读性; (2)提高代码的简洁性; (3)提高程序的移植性。,3.2.2同类集合类型的自定义变量数组类型的定义 一维数组类型定义语句格式为: typedef 已有类型名 新类型名数组长度 二维数组类型定义语句格式为: typedef已有类型名 新类型名数组长度1数组长度0 n维数组类型定义语句格式为: typedef 已有类型名 新类型名数组长度n-1数组长度1数组长度0,3.3 C/C+语言的横向名词性扩充(3):异类集合类型和异类集合变量结构体型(值)、共用体型(值)、枚举型(值),3.3.1结构体类型和结构体变量 结构体类型的定义和变量的声明 在C/C+中允许使用struct关键字,通过组合已有类型定义新的类型。 使用typedef定义的数组类型,是同类的集合类型。而使用struct定义的是异类的集合类型,struct Person int id; char name10; ;,也可以省略struct声明变量,但在一些老的C/C+编译环境通不过。 Person LiLi, WangQiang ; 也可在创建类型的同时,声明变量。 struct Person int id; char name10; LiLi, WangQiang;,结构体变量的初始化 广义地认为结构体变量是元素类型不同的数组。 struct Person LiLi=5, “LiLi”; /C格式 Person LiLi=5, “LiLi”; /C格式 Person WangQiang=LiLi; /同类型结构体变量可以相互赋值,但同类型变量的数组不可以这样赋值。,结构体类型的再定义 可以使用关键字typedef将已经定义的结构体类型再定义成新的名字,或定义结构体数组类型。(类似于typedef int Num100;)。,例3. 15一个使用自定义类型的示例程序,程序中使用了teypedef定义的简单类型和结构体类型。 #include #include typedef int Score3; /定义长度3的int数组类型Score typedef char Name10; /定义长度10的char数组类型Name struct Person / 定义结构体类型 Person int id; Name name; Score score; ;,void main() int i; Person LiLi; printf(“n请输入整数编号,回车结束:“); scanf(“%d“, ,例3. 16将typedef类型定义方法应用到结构体类型,上例可以改写成如下形式: #include #include typedef int Score3; typedef char Name10; struct Person int id; Name name; Score score; ; typedef Person PersonDef;,void main() int i; PersonDef LiLi; printf(“n请输入整数编号,回车结束:“); scanf(“%d“, ,3.3.2共用体类型和共用体变量 共用体的概念、类型定义和变量声明 共用体是是一种自定义类型。 使用覆盖技术将几个不同类型的变量置于同一段内存,起始地址相同。 所消耗的内存以不同类型中消耗内存多的类型为准。,共用体类型的定义形式: union 共用体名 成员表列 变量表列; 例如: union data int i; char ch; float f; a, b, c;,结构体和共用体机制上的区别: 结构体变量所占内存长度是各成员占的长度之和。即每个成员分别占有其自己的内存单元。 共用体变量所占内存长度是最长的成员的长度。,共用体变量的引用 引用方法类似结构体,如a.i a.ch a.f。 printf(“%d”, a);是错误的 如经过以下三次赋值后,只有a.f=1.5有效。 a.i=1; a.ch=a; a.f=1.5; 共用体类型的再定义,3.3.3枚举类型和枚举变量 如果变量只有几种可能的值,可以定义为枚举类型。 枚举类型定义方法举例如下: enum weekday sun, mon, tue, wed, thu, fri, sat;,变量声明方法举例如下: enum weekday workday, week_end; /C格式 weekday workday, week_end; /C格式 workday和week_end被定义为枚举变量,它们只能取值于sun到sat之一。 如: workday=mon; week_end=sum;,例3. 17 本例用二维数组存储了一周课表,以枚举量值作为索引实现了对课表的查询。这是一个死循环程序,用Ctrl+C来结束程序。 #include #include enum Week sun, mon, tue, wed, thu, fri, sat; void main() int i, j; char table750=“星期天,休息“, “星期一,高等数学“, “星期二,大学物理“, “星期三,C语言“, “星期四,大学英语“, “星期五,思想品德“, “星期六,休息“;,int tem0; Week tem1; while (1) putchar(n); printf(“n请输入下面星期标号,查询课表:(0, 1, 2, 3, 4, 5, 6)n“); scanf(“%d“, ,例3. 18 本例实现了一周课表的输出,演示了不同环境下,在循环中枚举变量的使用。 #include #include enum Week sun, mon, tue, wed, thu, fri, sat; void main() char table750=“星期天,休息“, “星期一,高等数学“, “星期二,大学物理“, “星期三,C语言“, “星期四,大学英语“, “星期五,思想品德“, “星期六,休息“;,Week i; int j=0; for (i=sun; i=sat; +j, i=(Week)j ) /for (i=sun; i=sat; i+) /在Turbo C+中,上面两行代码,可以用此一行代替, /不需要声明变量j。 putchar(n); puts(tablei); ,3.4 C/C+语言的横向名词性扩充(4):异类集合类型的同类集合类型结构体数组,将同类集合类型和异类集合类型的构造方法融合,就得到了异类集合类型的同类集合类型结构体数组、共用体数组和枚举数组。 其中结构体数组应用广泛,只比较详细地介绍结构体数组。,例3. 19 用结构体数组实现了多名学生成绩的输入和输出。为了温故知新,本例使用了自定义数组类型。在一个结构体类型中,含有另一个结构体类型的变量。 #include #include typedef int Score 2; /定义int型的,长度2的数组类型Score。 typedef char Name 10; /定义char型的,长度10的数组类型Name。 struct Person /定义结构体类型Person。 int id; Name name; /name 为字符数组。 ;,struct Student /定义结构体类型Student。 Person id_name; /Student类型中,含有Person类型的变量。 Score score; /score 为整型数组。 ; void main() int i,j ; Student students3; /定义结构体类型Student型的数组students,长度是3 。,for (j=0; j3; j+) printf(“n请输入整数编号,回车结束:“); scanf(“%d“, ,for (j=0; j3; j+) printf(“n%d %s %d %d n“,studentsj.id_name.id, studentsj.id_, studentsj.score0, studentsj.score1); ,例3. 20 本例简单演示了共用体数组和枚举数组的定义和使用。由于它们应用的不多,而定义和引用方法和结构体数组类似,所以仅以本例说明。 #include union x_y int x; float y; ; enum Week sun, mon, tue, wed, thu, fri, sat;,void main() x_y aa3; /定义共有体数组 aa1.x=5; /给数组的1号元素赋值。 aa1.y=2.8; /给数组的1号元素赋值,x中值已不存在。 printf(“n%d“, aa1.x); printf(“n%f“, aa1.y ); Week bb3; /定义枚举数组 bb0=sun; /给枚举数组中的0号元素赋值 printf(“n%dn“, bb0); ,3.5各种横向扩充类型的融合使用,同类集合类型数组,异类集合类型结构体、共用体和枚举类型都可以认为是已有简单类型的融合。 当集合类型被定义后,从类型的角度看,它是一个类型,就应该具有简单类型的基本属性,当然就可以进一步融合。,例3. 21数组、结构体、共用体和枚举类型的相互嵌套 问题描述:用C语言管理学校信息。,#include #include /类型定义部分开始 enum Week sun, mon, tue, wed, thu, fri, sat; union Tec_Stu /为管理学生的“班级”和教师的“职称”而定义的共有体类型 int Class; char position10; ;,struct Person /管理人员信息的结构体类型,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论