C语言使用教程_第1页
C语言使用教程_第2页
C语言使用教程_第3页
C语言使用教程_第4页
C语言使用教程_第5页
已阅读5页,还剩52页未读 继续免费阅读

下载本文档

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

文档简介

1、第5章 同类型数据集合,主要内容 数组与数组元素、一维数组、二维数组、多维数组、字符数组 字符串处理函数 指向字符串的指针变量,5.1数组与数组元素的概念,由若干类型相同的数据按一定顺序存储所形成的有序集合,称为数组 (Array) 。通常,用某个名字标识这个集合,这个名字称为数组名。构成数组的每个数据项称为数组的元素,同一数组中的元素必须具有相同的数据类型。同一数组中的数组元素在内存中占据的地址空间是连续的。 数组定义的一般形式为: 类型标识符 数组名常量表达式1常量表达式2;,数组首地址,(1) 数组的下标必须使用整型常量或整型常量表达式。C语言中不允许用变量作为下标,对数组进行动态定义。

2、例如, #define N 10 int nScore N; int n=3; int nScore n; /*不正确的定义方式*/ (2) C语言规定数组的下标都是从0开始的。,(3) 数组的存储结构:数组一经定义,系统则根据数组的数据类型为每一个元素安排相同长度的、连续的存储单元,而且,C语言的数组在内存中是按行存放的,即存完第一行后存第二行,然后存第三行,以此类推。 (4) 数组元素的作用相当于简单变量。 (5) 用sizeof来计算类型长度。,5.2数组与数组元素的概念,5.2.1一维数组的定义 一维数组定义的一般形式为:,类型说明符 数组名常量表达式;,int a5;,例5-1 查看

3、数组nArray10的内存占用情况。,通过不同的输出方式,能够看到数组名(nArray)和 或 数据类型 数组名=值1,值2,值n;,2. 用赋值语句初始化 用赋值语句初始化是在程序执行时实现的。,1. 在数组定义时初始化,定义数组时对数组元素赋初值: int a5=1,2,3,4,5; 只给部分元素赋初值 对全部元素赋初值时,可以不指定长度: int a =1,2,3,4,5;,int a5=1,2,3; int a5=0; 其余元素初值为零,例5-2用赋值语句初始化数组nNum10,然后按逆序输出数组nNum10中元素。,输入一组数,值为09,然后按逆序输出。,引用形式 数组名下标 说明

4、下标即可以是整型常量或整型表达式,也可以是含有已赋值的整型变量或整型变量表达式 数组下标范围为0(N-1)(N为数组长度) 注意:防止数组下标越界 举例 a0=a5+aj*3;,5.2.3 一维数组的引用,例: int data5; data5=10;,C语言对数组不作越界检查,使用时要注意,只能逐个对数组元素进行操作(字符数组例外),输入方法:,int a10, i;,输入第i个数组元素:,scanf(%d,输入整个数组元素:,for( i=0;i10;i+ ) scanf(%d,输出方法:,输出第i个数组元素:,printf(%d,ai);,输出整个数组元素:,for( i=0;i10;i

5、+ ) printf(%d,ai);,一维数组的输入和输出,例5-3 求数组nAarr10中各元素的和。,#include /* 求数组中各元素的和 */ void main() int i,nArr10,nSum; nSum=0; printf(请输入10个整数:n); for(i=0;i10;i+) scanf(%d, ,5.2. 4 一维数组程序举例,例5-4编写程序,每名学生有四门课考试成绩,用一维数组实现计算每个学生的平均成绩。,由于该例题只要求计算平均成绩,因此可以用4个整型数组存放数学、物理、英语和计算机的成绩,用一个实型数组存放每个学生的平均成绩。程序可按如下步骤实现: 1)输

6、入数据,把数学、物理、英语、计算机成绩分别存放在数组nMath,nPhysics,nEnglish,nComputer中。 2)计算平均成绩,将结果放在dAverage数组中。 3)输出结果。,例5-4编写程序,每名学生有四门课考试成绩,用一维数组实现计算每个学生的平均成绩。,5.3 相同类型数据的二维及多维存储,5.3.1 二维数组的定义 二维数组定义的一般形式是:,类型说明符 数组名常量表达式1常量表达式2;,二维数组在内存中的存储:,a0,a1,a2,行数,列数,元素个数=行数*列数,每个元素ai由包含4个元素 的一维数组组成,二维数组a是由3个元素组成,a0,a1,a2,二维数组理解,

7、5.3.2 二维数组的初始化 分行初始化:,按元素排列顺序初始化,在声明二维数组形参时,不能省略数组第二维的长度,二维数组的输入和输出,数组的输入和输出只能逐个对数组元素进行操作(字符数组例外),int b23,i,j;,例5-5用二维数组实现如下表5-2所示的计算每门课的平均分数。,可设一个二维数组nScore53存放五个人三门课的成绩。再设一个一维数组nAver 3存放所求得各科平均成绩,设变量nAverage 为全组各科总平均成绩。,/* 用二维数组解决求学生平均成绩问题*/ #include #include void main() int i,j,nSum=0, nAverage,n

8、Aver3; int nScore53=80,75,92,61,65,71,59,63,70,85,87,90,76,77,85; for(i=0;i3;i+) for(j=0;j5;j+) nSum=nSum+nScoreji; nAveri=nSum/5; nSum=0; nAverage=(nAver0+nAver1+nAver2)/3; printf(math:%dnc languag:%dndFoxpro:%dn,nAver0,nAver1,nAver2); printf(total:%dn, nAverage); ,#include #include void main() int

9、 i,j,nSum=0, nAverage,nAver3; int nScore35=80,61,59,85,76,75,65,63,87,77,92,71,70,90,85; for(i=0;i3;i+) for(j=0;j5;j+) nSum=nSum+nScoreij; nAveri=nSum/5; nSum=0; nAverage=(nAver0+nAver1+nAver2)/3; printf(math:%dnclanguag:%dndFoxpro:%dn,nAver0,nAver1, nAver2); printf(total:%dn, nAverage); ,5.3.3二维数组元

10、素的引用 二维数组引用的一般形式是:,数组名下标下标;,例5-6一个电脑公司销售两种规格的磁盘:3英寸和5英寸,每一片磁盘可以有以下4种容量:单面双密;双面双密;单面高密;双面高密。用一个二维表格可以很好的表述磁盘的价格。要求将表格存入一个二维数组,并按表格的行列格式实现表格的分行打印。,可以使用多个赋值语句,完成把这些价格存入一个表格的任务。用嵌套for循环打印输出结果。输出时用转移字符t控制对齐,行号变化时必须插入一个n以输出回车换行。为了在输出中增添描述性标题,只需简单地在首行数值打印之前打印一行标题,在首列数值打印前打印一列标题即可。,5.3.4 多维数组的初始化和引用 (1)多维数组

11、的定义及初始化,类型说明符 数组名常量表达式1 常量表达式 2常量表达式n;,(2)多维数组的引用,数组名e1e2e3;,5.3.5 数组程序举例,例5-7有一个34的矩阵,编写程序找出值为最大的元素及其所在的行号和列号。,对于矩阵,用二维数组来描述会很方便。求矩阵中值最大的元素,可以这样实现:定义一个变量nMax并初始化为nArr00,用双重循环访问矩阵中所有的元素,将每个元素和nMax相比较,用大于nMax值的元素替换nMax中原有的值,同时记录下来该元素的行列下标。循环结束后,输出nMax和所记录的下标值。该问题解决方法可以用下面的流程图5-14来表示。,5.4 字符类型数据集合的存储,

12、字符串 一串以0结尾的字符在C语言中被看作字符串 用双引号括起的一串字符是字符串常量,C语言自动为其添加0终结符 C语言并没有为字符串提供任何专门的表示法,完全使用字符数组和字符指针来处理 字符数组 每个元素都是字符类型的数组 字符数组中的一个元素存放一个字符。 char string80;,5.4.1字符数组的定义,例: char c10, ch34,5.4.2 字符数组的初始化,逐个字符赋值 用字符串常量,例:,字符串及其结束标志 无字符串变量,用字符数组处理字符串 字符串结束标志:0,字符串,逐个字符I/O: %c 整个字符串I/O: %s,例:用%c main() char str5;

13、 int i; for(i=0;i5;i+) scanf(“%c”, ,例:用%s main() char str5; scanf(“%s”, str); printf(“%s”, str); ,用字符数组名,不要加 char a5; scanf(%s,a); for(i=0;i5;i+) printf(%d,ai); ,运行情况: (1)若输入 hel , 正常 (2)若输入 hell , 正常 (3)若输入 hello , 用%s 输出时,会出现问题,输入字符串长度数组维数,例:,#include main() char a15,b5,c5; scanf(%s%s%s,a,b,c); pr

14、intf(a=%snb=%snc=%sn,a,b,c); scanf(%s,a); printf(a=%sn,a); ,运行情况: 输入:How are you? 输出:a=How b=are c=you? 输入:How are you? 输出:a=How,scanf中%s输入时,遇空格或回车结束,例:字符串输入举例,例 #include main( ) char string80; printf(“Input a string:”); gets(string); puts(string); 输入: How are you? 输出: How are you ?,5.5 字符串处理函数,C语言提

15、供了丰富的字符串处理函数, 大致可分为字符串的输入、输出、合并、修改、比较、转换、复制、搜索几类。 使用这些函数可大大减轻编程的负担。 用于输入输出的字符串函数,在使用前应包含头文件stdio.h,使用其它字符串函数应包含头文件string.h。,包含在头文件 string.h,字符串输出函数puts 格式:puts(字符数组名) 功能:向显示器输出字符串(输出完,换行) 说明:字符数组必须以0结束,字符串输入函数gets 格式:gets(字符数组名) 功能:从键盘输入一以回车结束的字符串放入字符数组中, 并自动加0 说明:输入串长度应小于字符数组维数,例 #include main( ) c

16、har string80; printf(“Input a string:”); gets(string); puts(string); 输入: How are you? 输出: How are you ?,常用的字符串处理函数,字符串连接函数strcat 格式:strcat(字符数组名1,字符数组名2) 功能:把字符数组2连到字符数组1后面 返回值:返回字符数组1的首地址 说明:字符数组1必须足够大 连接前,两串均以0结束;连接后,串1的0取消, 新串最后加0,字符串拷贝函数strcpy 格式:strcpy(字符数组名1,字符串名2) 功能:将字符串2,拷贝到字符数组1中去 返回值:返回字符

17、数组1的首地址 说明:字符数组1必须足够大 拷贝时0一同拷贝 不能使用赋值语句为一个字符数组赋值,例: char str120 =“Hello!”; char str220; str2=str1; (),常用的字符串处理函数(2),字符串比较函数strcmp 格式:strcmp(字符串名1,字符串名2) 功能:比较两个字符串 比较规则:对两串从左向右逐个字符比较(ASCII码), 直到遇到不同字符或0为止 返回值:返回int型整数,a. 若字符串1 字符串2, 返回正整数 c. 若字符串1= 字符串2,返回零 说明:字符串比较不能用“=”,必须用strcmp,字符串长度函数strlen 格式:

18、strlen(字符数组名) 功能:计算字符串长度 返回值:返回字符串实际长度,不包括0在内,本程序中把输入的字符串和数组st2中的串比较,比较结果返回到k中,根据k值再输出结果提示串。当输入为dbase时,由ASCII 码可知“dBASE”大于“C Language”故k0,输出结果“st1st2”。,How are you?Hello! Len1=6,Len2=12,Len3=18,例:strcmp与strlen举例,#include main() char p20=a,b,c,d,q =abc,r =abcde; strcpy(p+strlen(q),r); strcat(p,q); pr

19、intf(%d %d,sizeof(p),strlen(p); ,20 11,例:,5.6 字符串指针变量与字符数组,(1)字符串 一串以0结尾的字符在C语言中被看作字符串 用双引号括起的一串字符是字符串常量,C语言自动为其添加0终结符 C语言并没有为字符串提供任何专门的表示法,完全使用字符数组和字符串指针变量来处理,字符串指针变量本身是一个变量,用于存放字符串的首地址。 字符数组是由于若干个数组元素组成的,它可用来存放整个字符串。,字符数组 每个元素都是字符类型的数组 char string100; 字符串指针变量 指向字符类型的指针 char *p; 数组和指针可以等同看待,定义方法不同,

20、字符串指针变量与字符数组的区别,初始化含义不同 char *pstr = ” china ”; 等价于 char *pstr; pstr = ” china ”; char str14 = ” china ”; 不等价于 char str14; str = ” china ”; 字符串指针是变量,而数组名是地址常量,字符串指针变量与字符数组的区别,在定义一个数组时,在编译时即分配单元,有确定地址,而定义一个字符指针变量时,如未对它赋初值,则其所指数据是不定的,因而使用是危险的。 例如,输入字符串时 char str10; scanf(%s, str); /*正确*/ char *a; scan

21、f(%s, a); /*错误*/ 应为: char *a; char str10; a = str; scanf(%s, a); /*正确*/,字符串指针变量与字符数组的区别,例:字符串拷贝,方法1:用字符数组编程实现 /*函数功能: 字符串拷贝 函数参数: 字符型数组srcStr,存储源字符串 字符型数组dstStr,存储目的字符串 函数返回值:无 */ void MyStrcpy(char dstStr, char srcStr) int i = 0; while (srcStri != 0) dstStri = srcStri; i+; dstStri = 0; ,例:字符串拷贝,例:字

22、符串拷贝,方法2:用字符指针编程实现 /*函数功能:字符串拷贝 函数参数: 字符型指针srcStr,指向源字符串 字符型指针dstStr,指向目的字符串 函数返回值:无 */ void MyStrcpy(char *dstStr, const char *srcStr) while (*srcStr != 0) *dstStr = *srcStr; srcStr+; dstStr+; *dstStr = 0; ,5.7 综合应用实例,问题描述:学生成绩档案管理要对学生的各门课程成绩、姓名、学号等信息进行增、删、改、查的相应操作。要求用数组来实现数据的存储。,这两个实例的讲解要根据教师讲课的需要

23、及课时安排,自行从书中选取,设某汽车维修厂仓库存有多种型号的汽车零 件, 请为该仓库管理员编写一查询程序,用于查 询每种零件的库存量是多少?,EXERCISE 1:,s00 s01 s02 s03 s04,s10 s11 s12 s13 s14,#include main() int s25=150001,150002,150003, 150004,150005,1000,500,230,700,998,x, i; scanf(%d, ,main() int s25=150001,150002,150003,150004,150005,1000,500,230,998,x,i; char z=y; printf(nn*n); while(z=y|z=Y) printf(n 请输入零件:); scanf(%d,1,#include main() int s25=150001,150002,150003,150004,150005,1000,500,2 30,998,x,i; char z; printf(nn*n); do printf(n 请输入零件:); scanf(%d, ,2,#include main() int s25=150001,150002,150003

温馨提示

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

评论

0/150

提交评论