《c语言课件(非计算机专业)》由会员分享,可在线阅读,更多相关《c语言课件(非计算机专业)(54页珍藏版)》请在金锄头文库上搜索。
1、数 组,第七章,数组的定义与使用 数组的基本应用 字符串基本操作 数组与函数的关系,本章要点,如何处理一个班学生的学习成绩? 一行文字怎样存储? 一个矩阵怎样存储 ?,7.1 数组的概念,一组具有相同数据类型的数据的有序集合,这些数据的特点:具有相同的数据类型。 为了很方便地使用这些数据,C语言提供了一种构造数据类型:数组。,数组是数据的有序集合。 数组中的每一个元素都属于同一数据类型。 使用同一数组名和不同下标来唯一的确定数组中的元素。 只需要一个下标就能确定数组元素的数组称为一维数组。,7.2 一维数组,一维数组的一般说明形式是: 类型说明符 数组名常量表达式 说明: 数据类型是数组全体数
2、组元素的数据类型。 数组名后是用方括号括起来的常量表达式,不能用圆括号。 C语言规定数组名表示数组在内存中的首地址。,常量表达式中可以包括常量和符号常量,不能包含变量。C语言不允许对数组的大小作动态定义,即数组的大小不依赖于程序运行过程中变量的取值。 所有数组都以0作为第一个元素的下标!例如 int a10; 数组的10个元素为: a0,a1,a9,数组元素个数的表达式必须是整型常量表达式! int k=4, bk ; int c(4) ; # define N 5 int aN ; int b2+3 ; int c10 ;,错,正确,错,数组元素在内存中的存储方式,a0,a1,a2,a3,a
3、4,a,例如 有定义: char a5 ;,数组元素在内存中按顺序连续存放,C语言要求数组必须先定义然后才能使用,并且规定只能逐个引用数组元素而不能一次引用整个数组。 数组元素的引用形式为: 数组名下标,一维数组元素的引用,数组中每个元素在功能上等价于一个一般变量 例如:输出100个学生成绩,并求出总成绩。 不用数组:float x, sum; for (i=0; i100; i+) scanf(”%fn”, ,对于非字符数组,只能访问数组的单个元素, 不能进行整体操作。 输入/输出数组:int x10; 正确:for (k=0; k10; k+) scanf (”%d”, ,C语言中可以采用
4、如下方法对数组元素进行初始化: 在定义数组时对数组元素赋初值。如: int a10=0,1,2,3,4,5,6,7,8,9; 这种方法是将数组元素的初始值依次放在一对花括号内。 也可以只对一部分数组元素赋值。如: int a10=0,1,2,3,4;,一维数组的初始化,在对全部数组元素赋初值时,可以不指定数组的长度。如: int a=0,1,2,3,4,5,6,7,8,9; 但是如果被定义的数组长度与提供的初值的个数不同时,则数组的长度不能省略。, 称为下标运算符。 数组名、数组元素是两种不同性质的数据: 数组名是数组的首地址,是一个地址常量 数组元素则是数值 引用数组元素时,根据首地址和下标
5、,自动计算出该元素的实际地址,取出该地址的内容进行操作。,下标与地址的关系,例如: float mark100; 如引用 mark2 (1)计算 2000+2*4=2008 (2)从取出2008的内容,元素存储地址=数组首地址+偏移量,数组元素存储地址的计算公式:,#define NUM 20 main( ) int aNUM=1, 1; int j; for (j=2; jNUM; +j) aj = aj-1+aj-2; for ( j=0; jNUM; j+) printf(“%dt“, aj); ,例:求Fibonacci数列的前20项的值,气泡法排序,气泡法排序: 若要对 n 个数排序
6、,则需要 (n-1) 轮排序 第 j 轮排序中,从第一个数开始,相邻两个数进行比较,若不符合排序要求则交换两个数的位置,直到第 (n-j+1) 个数为止,共比较 (n-j) 次 此时第 (n-j+1) 个位置上的数已经按要求排好,所以不参加以后的比较和交换操作。,例如 对4个数0,2,3,9按从大到小的 顺序排序,#define N 4 main( ) int i,j,m ; int aN=0,2,3,9 ; for( j=1;j=N-1;j+) /*N-1轮排序*/ for( i=0 ; iN-j ; i+) /*N-j次两个相邻数组元素比较*/ if( ai ai+1 ) /*顺序不符合要
7、求时交换位置*/ m = ai ; ai = ai+1 ; ai+1 = m ; for( i=0 ; iN ; i+) printf(“%5d”, ai) ; ,选择法排序,选择法排序: n 个数从小到大排序,需要 (n-1) 轮排序处理 第一轮排序中从第一个数到第 n 个数中找出最小的数,然后把它与第一个数交换位置,第一个数确定,以后的排序不涉及该数 第 j 轮排序中从第 j 个数到第 n 个数中找出最小的数,然后把它与第 j 个数交换位置,第 j 个数确定。,选择法排序,选择法排序: 第 j 轮比较 (n-j) 次,至多交换一次。 第 (n-1) 轮排序中从第 (n-1) 个数和第 n
8、个数中找出最小的数,然后把它与第 (n-1) 个数交换位置,完成排序操作。,例如 对5个数5,7,4,2,8按从小到大的顺序排序,#define N 5 main( ) int i,j,m,p ; int aN=5,7,4,2,8 ; for( i=0;i aj ) p=j ; if(p!=i) /*最小值不是ai时需要ai与ap交换*/ m = ap ; ap = ai ; ai = m ; for( i=0 ; iN ; i+) printf(“%5d”, ai) ; ,7.3 一维字符数组,字符串 字符串:用双引号( “ ” )括起来的字符或转义符序列。 串长:字符串中所包含的字符数。
9、串结束标记:转义字符 0 称为字符串结束标记,C语言中的字符串以 0 结束。,字符串可以存在一个一维数组中,字符串中的一个字符占用字符数组中一个字节。具有数组特性。 字符串实际占有单元的数量等于字符串长度+1。 例如:要定义一个存放字符串“CHINA”的字符数组c,应定义为: char c6;,字符串在数组中的存储格式,一维字符数组的定义形式类似于一维数组的定义,只是将数据类型改为char。 例如: char a6,b10; 注意:若定义的字符数组用来存放k个字符的字符串,则定义的字符数组元素的个数至少为(k+1),一定要有一个数组元素存放字符串结束符0。,一维字符数组的定义,用字符串对字符数
10、组初始化,如: char ch6=“CHINA“; char ch6=“CHINA“; /*省略 */ char ch =“CHINA“;/* 省略长度值 */ 用单个字符对字符数组初始化,如: char ch6=C,H,I,N,A,0; 注意:该种方式大括号不能省略。,一维字符数组的初始化,对字符数组不仅可以引用它的数组元素,也可以引用整个字符数组。 例如: char a = “CHINA” ; printf(“%sn”, a) ; 输出结果: CHINA,一维字符数组的引用,1 逐个字符输入输出,采用格式符“%c”输入输出一个字符。如 printf(“%c”,c4); 2 将整个字符串一次
11、输入输出,采用“%s”格式符,如: char c=“China”; 或 char c=“China”; printf(“%s”,c);,字符串的输入输出,1 输出字符不包括字符串结束标志0。 2 用“%s”格式符输出字符数组时,printf函数中的输出项是字符数组名,而不是数组的元素。 3 如果数组长度大于字符串的实际长度,输出时也只输出到遇到0结束。如: char c10=“China”; printf(“%s”,c);,注意:,4 如果一个字符数组中包含一个以上0,则遇到第一个0时输出结束。如: char a7=“Chi0na”; printf(“%s”,a); Output:Chi 5
12、用格式符s不能输入带空格、回车或跳格的字符串。因为空格、回车或跳格是输入数据的结束标志。,gets()函数调用形式: gets(sadr); 功能是从键盘读入字符串,直到读入换行符为止,用0代替换行符并把读入的字符串存入以sadr为首地址的存储区中。 例如: char ch80; gets(ch);,gets()函数,puts()函数调用形式: puts(sadr); 其功能是把首地址为sadr的字符串显示在屏幕上,并换行。 注意:用puts和gets函数只能输入或输出一个字符串,而不能写成: puts(str1,str2); 或 gets(str1,str2);,puts()函数,7.4 字
13、符串处理函数,对于字符串的整体操作(如复制、 比较、连接、计算字符串长度等),C语 言没有提供相应的运算符,而是以库函 数的形式实现这些操作。用户只要在程 序开头加上命令行 #inlucde “string.h” 就可以调用这些库函数完成相应的操作。,strcpy是字符串复制函数,其作用是将字符串2复制到字符数组1中去,其标准形式为: strcpy(字符数组1,字符数组2) 如: char str110,str2 =“China”; strcpy(str1,str2);,7.4.1 字符串复制函数, 字符数组1必须足够大,以便容纳被复制的字符串,即字符数组1的长度不小于字符串2的长度。 “字符
14、数组1”必须写成数组名的形式,而“字符数组2”可以是字符数组名,也可以是一个字符串常量。如: strcpy(str1,“China”); 复制时连同字符串后面的0一起复制到字符数组1中。,说明:, 不能使用赋值语句将一个字符串常量或一个字符数组直接赋给一个字符数组。如下面两条语句是不合法的: str1=“China”; str1=str2; 只能使用语句: strcpy(str1,“China”); strcpy(str1,str2);, 可以使用strcpy函数将字符串2中的前面若干个字符复制到字符数组中去,如: strcpy(str1,str2,2); 其作用是将str2中前面的2个字符复
15、制到str1中,然后再加上一个0。,所谓字符串的长度是指字符串中字符的个数,但不包括字符串结束符0。C语言使用strlen函数测试字符串长度。其调用形式为: strlen(字符数组); 如: char str10=“China”; printf(“%d”,strlen(str);,7.4.2 求字符串的长度,strcat函数的作用是连接两个字符数组中的字符串,把字符串2接到字符串1的后面,结果存放在字符数组1中,函数调用后得到的函数值是字符数组1的地址。其调用形式为: strcat(字符数组1,字符数组2); 如:char str130=“Peoples Republic of”; char str2 =“China”; printf(“%s”,strcat(str1,str2);,7.4.3 字符串连接,说明: 字符数组1必须足够大,以便容纳连接后的新字符串。 在连接前两个字符串的后面都有一个0,连接时将字符串1后面的0取消,只在新字符串的后面保留一个0。,strcmp(字符串1,字符串2); strcmp函数作用是比较字符串1和字符串2。 字符串比较