收藏 分享(赏)

c语言课件7章.ppt

上传人:j35w19 文档编号:8115026 上传时间:2019-06-09 格式:PPT 页数:61 大小:1.68MB
下载 相关 举报
c语言课件7章.ppt_第1页
第1页 / 共61页
c语言课件7章.ppt_第2页
第2页 / 共61页
c语言课件7章.ppt_第3页
第3页 / 共61页
c语言课件7章.ppt_第4页
第4页 / 共61页
c语言课件7章.ppt_第5页
第5页 / 共61页
点击查看更多>>
资源描述

1、第五章 数 组,5.1 一维数组 5.2 二维数组 5.3 字符数组,例 求4名学生某课程平均成绩,并按降序排序。,main( ) float k1 , k2, k3, k4, ave ,t ;scanf(“ %f%f%f%f ”,问题的提出:1、 求100名学生某课程平均成绩,并按降序排序。2、 求2006年全省高考理工类各科平均成绩,并按降序排序。,构造类型数据 由基本类型(整型、字符型、实型) 数据按照一定规律组成的。,数 组 构造类型 结构体共用体,数 组 有限个同一类型数据的集合,即该组数据都属于同一数据类型。,表达形式 用一个数组名来标识这一组数,每一个数组元素(下标变量)用数组名

2、和下标来唯一地确定。如:,数学表达形式: x1 , x2 , x3, x4, , xi , sc11 , sc12 , sc13, sc14 , sc21 , sc22 , sc23, sc24 , age0 ,age1 ,age2, age3 ,C中表示形式:x 1 , x2 , x3, x4, , x i ,score11 , score12 , score13, , scorei j, age0,age1 ,age2, age3 , , 5.1 一维数组,一维数组,每个元素在数组中的位置用一个下标来确定。,一、一维数组的定义,auto int a3; /* int a3; */ stat

3、ic char ch5; /* static 表示 “静态” */static float b5;,数组长度,说 明1.数组名的命名规则和变量名相同。 2. 元素个数,必须是整型常量表达式(含符号常量),不能包含变量。正确 int a 3 , b3+5 ; 3 . 数组元素的序号(即下标)是从0开始的:int a 3; a数组的3个元素是 a 0 、a1、 a 2,格 式 存储类别 类型标识符 数组名元素个数,错误,二、一维数组的使用,说 明 1.数组的使用是指:引用数组元素,不能一次引用整个数组。,引用形式 数组名下标,错误的引用,下标越界,main( ) int a4; ( 其元素: a0

4、,a1,a2,a3 )a0=2;a 1=3; a3=3+a0+a1;a4=2; printf(“%d”, a1 );,2下标:必须是整型表达式。a0, a2+i,a2*j (i,j 为整型变量,且有确定的值) 3可用赋值语句或输入函数调用语句给数组元素赋值。如:a1=6; scanf(“%d”,4数组元素在内存中是按其下标递增的次序连续存放的。int a5;因此,可通过其下标值,用循环的办法来操作数组。第i号元地址:&ai 即 &a0+i*d,学生暂时不掌握,例5.1 逆序输出数组各元素值。,程序演示,main( ) int i, a6;for(i=0 ; i=0 ; i-) printf(“

5、%3d“, ai);,a0=0 a1=2 a2=4 a3=6 a4=8 a5=10,程序运行结果:10 8 6 4 2 0,三、一维数组初始化 在定义数组的同时对各元素(下标变量)指定初始值。,存储类别为static 或 extern的数组可初始化。 初始值表,是用逗号分隔的且与元素数据类型一致的常量表。,初始化的形式 1给全部元素赋初值(可不指定长度) 。static int a6= 1, 3, 5, 7, 9, 11; 或 static int a = 1, 3, 5,7, 9, 11;,存储类别 类型标识符 数组名元素个数 =初始值表;,2给部分元素赋初值(必须指定长度)。 static

6、 int a4= 1, 3 ; 即:a0=1; a1=3;3对全部数组元素赋初值0。如:int a6= 0, 0, 0, 0, 0, 0; 或 static int a6; 对static或extern数值数组不赋初值,系统对所有元素自动赋以0值。4新的C标准也允许对主函数中auto型数组初始化。如果不对自动型数组初始化,则其初始值为一些不可预料的数。如: main( ) auto int a6; /* int a6; */ 则:a0 、 a1、a2、a3、a4、a5 中的值不可预料。,例 求100名学生某课程平均成绩。,#define N 100 main( ) float scoreN ,

7、 sum=0 ;int i;for( i=0 ; iN ; i+) scanf(“ %f”,例5.2 使用数组输出Fibonacci(意大利数学家)数列的前20项。 Fibonacci数列为: 1,1,2,3,5,8,。其特点是,前两个数是1、1, 自第三个数开始,每个数都是其前两个数之和。,算法: i=0 f 0=1i=1 f 1=1i=2 f i=f i-1+f i-2;,月份 1 2 3 4 5 6,数量 1 1 2 3 5 8,程序演示,main( ) int i, n=0;static int f 20=1,1; /* 数组初始化 */for(i=2; i=19; i+)fi=fi-

8、1+fi-2; /* 第i项的计算,i2 */for(i=0; i=19; i+) printf(“%12d“, fi );n+; if(n%5=0) printf(“n“); /* 每行输出5个数 */,例5.3 用冒泡法对10个数由小到大排序。,for(j=0; jN-1; j+),算法: 将相邻两个数比较,若为逆序,则将其交换,依此类推,其结果使最大数“沉底”,较小数“上浮”。如果有n个数,则要进行n-1趟比较,在第j趟比较中要进行n-j次两两比较。,for(i=0; iN-1-j ; i+),if (aiai+1)t=ai;ai=ai+1;ai+1=t;,同学们: 上课要认真听讲!,具

9、体算法: 对于待排序的N(如N=6)个数,for(j=0; jN-1; j+),for(i=0; iN-1-j ; i+),if (aiai+1)t=ai;ai=ai+1;ai+1=t;,程序演示,#define N 10 main( ) int aN, i , j , t ;printf(“Input %d numbers:n“, N );for(i=0; iaj+1) 进行排序 t=aj; aj=aj+1; aj+1=t; printf(“The sorted numbers:n“);for(i=0; iN; i+) /*输出N-1个数*/printf(“%4d“,ai);printf(“

10、n“);, 5.2 二维数组,二维数组,每个元素在数组中的位置用两个下标来确定。,a00 a01 a02 a03 a10 a11 a12 a13 a20 a21 a22 a23 a30 a31 a32 a33,二维数组主要是用来存放矩阵的,一、 二维数组的定义,如: #define N 100#define M 5 int a23; float bNM;,行数,说 明 “行数”和“列数”,必须是整型常量表达式(含符号常量) 。如: a2-12*2-1合法。,存储类别 类型标识符 数组名常量表达式1常量表达式2,列数,错误的书写 int a2,3 int a(2,3),说 明 2.数组的上限、下

11、限 (1) 若有定义: double w10; 则数组元素下标的上限是 ,下限是 . (2) 若有定义: int w34; 则数组元素行下标下限是 列下标的下限是 ,数组元素行下标上限是 ;列下标上限是 .,二、 二维数组的存放形式,如: float a34;我们可以把数组a看成是一维数组,它有三个元素: a0、a1、a2 每个元素又是一个包含4个元素的一维数组,见图7.4。可以把 a0、a1、a2 看成是3个一维数组名,上面定义的二维数组可以理解成定义了3个一维数组: float a04, a14, a24;,a00 a01a02 a03a10 a11a12 a13a20 a21a22 a2

12、3图 7.5,二维数组可以看成是特殊的一维数组,它的元素又是一个一维数组。,a0 a00 a01a02 a03 a a1 a10 a11a12 a13 a2 a20 a21a22 a23图 7.4,引用形式 数组名下标1下标2,说 明 1. 各下标值应在已定义的数组范围内。如: int a23; 其元素:a00 a01 a02 a10 a11 a12,元素所在行,元素所在列,三、 二维数组的引用,23,2下标可以是整型表达式。如: n=1;a2-11, a1n+1 /*n有确定的值*/,3.数组元素可以出现在表达式中,也可以赋值:a12=a00+a02,错误引用: a23 =6 a03=3 下

13、标越界,四、二维数组初始化 在定义数组的同时对各元素(下标变量)指定初始值。,初始化的形式 1将所有元素按行赋初值。 如:static int a23= 1, 2, 3 , 4, 5, 6 ;,二维数组在内存中的排列顺序是“按行存放”。,1 2 3 4 5 6,2按数组元素在内存中的排列顺序对各元素赋初值。 如:static int a23= 1, 2, 3, 4, 5, 6;,比较: static int a23= 1, 2, 3 , 4, 5, 6 ;3只对部分元素赋初值。这时,其余元素的初值自动为0。 如: static int a23= 1, 3, 5 ; 等价 static int

14、a23=1,3,0,5,0,0; 又如: static int a23=1,3,5; 等价 static int a23=1,3,5,0,0,0;,4对全部元素赋初值,则定义数组时可不指定第一维的大小, 但第二维 的大小不能省略。 如: static int a 3=1,2,3,4,5,6; 等价:static int a23=1,2,3,4,5,6;错误: static int a2 =1,2,3,4,5,6; ,无法判定 每行有多少列,5只对部分元素赋初值时,也可以省略第一维的大小,但应按行赋初值。 如: static int a 3=1,1,2,0,1; 等价:static int a3

15、 3= 1,0,0, 1,2,0, 0,1,0 ;,例如:以下不能正确定义二维数组的选项是 (1)int a22=1,2;(2)int a 2=1,2,3,4;(3)int a22=1,2,3;(4)int a2 =1,2,3,4;,(4),例5.4将二维数组的行元素和列元素互换(即矩阵转置),存到另一个二维数组中。,bji=aij;,main( ) static int a23=1,2,3,4,5,6 , b32 ;int i, j; /* 按行输出矩阵 a ,并转置*/printf(“array a:n“);for(i=0; i2; i+) for(j=0; j3; j+) printf(

16、“%5d“,aij); bji=aij; printf(“n“);,/* 按行输出矩阵 b */printf(“array b:n“);for(i=0; i3; i+) for(j=0; j2; j+)intf(“%5d“,bij);printf(“n“); ,1,2,3,4,5,6,1,2,3,4,5,6,5.3 字符数组,字符数组中的每一元素只能存放一个字符(包括转义字符)。,一、字符数组的定义,char ch5; ch0=b; ch1=o; ch2=o; ch3=k; ch4=0;,格 式 char 数组名元素个数,b o o k 0,初始化的形式 1逐个字符赋给各元素。 如: stat

17、ic char ch5=C , h, i,n, a; 全部元素赋初值时,数组的长度可省略 static char ch =C , h, i,n, a;,2若字符个数少于元素个数,则依次将这些字符赋给前面那些元素,其余的元素系统自动定为空字符( 0 )。 static char c6=B , o, o,k ; 等价 static char c6=B , o, o,k , 0, 0 ;,二、字符数组初始化 在定义数组的同时对各元素(下标变量)指定初始值。,C h i n a,同理,也可以定义和初始化一个二维字符数组。 如: static char c 3= * , *,*, *,*,* ; 等价

18、static char c 3= * , 0, 0, , *,* , 0, *,*,* ; 得到的二维字符数组各元素的状态如下:* * * * * *,3如果字符个数多于数组元素个数,则作语法错误处理。 static char c3=B , o, o,k ;,for(i=0;i=2;i+) for(j=0;j=2;j+)printf(“%c”,cij);printf(“n”);,程序演示,例B 逐个输出字符数组中各元素的值。,main( ) static char c7=s,t,u,d,e,n,t;int i;for(i=0; i7; i+) printf(“%c“,ci);printf(“n

19、“);for(i=0; i7; i+) printf(“%5d“,ci);printf(“n“); ,程序运行结果如下: student,三、 字符数组的使用,引用形式 数组名下标,元素在数组中的位置,115 116 117 100 101 110 116,四、字符数组与字符串,字符串及字符串的存储方法,字符串存储 为了测定字符串的实际长度,系统约定用0作为串的结束标志,并把它与串一起存入字符数组中。 如: static char c = “China“ ;,字符串“China“ “x+y=z” “3.14” “%dn“,C语言中,没有字符串变量。可以利用字符数组来存放、处理字符串。,c0 c

20、1 c2 c3 c4 c5,字符串长度+1,字符数组初始化的其它方法,1在初始化时可以直接将一个字符串赋予某一字符数组。static char c =“C program“; 或 static char c = “C program“ ;,不等价:static char c =C,p,r,o,g,r,a,m;,给各元素分别 赋予字符常量,等价:static char c =C, ,p,r,o,g,r,a,m,0;,2初始化一个已明确长度的字符数组时,数组的长度应大于字符串长度。如: static char c20=“string“;,五、字符串的输入输出,将整个字符串一次输入输出(%s)cha

21、r str8 ;scanf(“%s”, str);printf(“%s”, str);,2.输入字符串时不必加双引号,系统自动在串尾加上0。 3.输出字符串时不包括结符0 4.如果数组长大于字符串的实际长度,也只输出到遇0结束static char c10=“China”; printf(“%s”,c);,说明 1.输入项是字符数组名,它代表该数组的起始地址。错误 : scanf(“%s”,字符数组名,5.用scanf函数不能完整地输入含有空格的字符串。 例如:char c8;scanf(“%s“,c); 输入: Turbo C 则 : c 数组仅得到6个字符,解决方法: char str18

22、,str23; scanf(“%s%s“,str1,str2 ); 输入: Turbo C,原因:用scanf输入时,以空格或回车符作为数据的分隔符。,6. 用%s方式输出时,如果在一个字符数组中含有一个以上0,则遇到第一个0时输出便结束。 char str20 =“abc0ef“ ; printf(“%s“, str );,输出 abc,逐个字符输入输出(%C),int i ; char a10; for(i=0;i10;i+)scanf(“%c“,元素的地址,比较 scanf(“%s“, a ); printf(“%s“, a );,b o o k 0,六、字符串处理函数,gets put

23、s 相关的头文件stdio.h strlen strcpy strcmp 相关的头文件string.h strcat strlwr strupr,字符串输入函数 gets,调用形式 gets(str);,功能 从终端(键盘)输入一个字符串到字符数组,该函数的返回值是字符数组的起始地址。,说明 1.参数str,通常是字符数组名(或字符型指针)。 2.该函数可输入包含空格的全部字符,直至遇到回车符为止。,例如 char a10;gets(a); 输入: C program (不超过9 个字符),字符串输出函数 puts,调用形式 puts(str) ;,功能 将一个字符串输出到终端(显示器),说明

24、 1.参数str,为字符串常量或已被初始化的字符数组名。static char s =“China”;puts (s); puts ( “Bei jing ”);,2.puts函数输出的字符串中也可含转义字符,如:static char name = “ChinanBei jing“puts(name);,输出:ChinaBeijing,puts函数将0转换成换行符,如:static char c = “China”,3. puts函数的作用与printf(“%s”, str)相当。 但有以下不同: puts函数一次只能输出一个字符串,如: 错误:puts(str1, str2); (只能是一

25、个参数) 正确:printf(“%s%s “, str1,str2);,c0 c1 c2 c3 c4 c5,puts(c); 等价 printf(“%sn“,c);,字符串连接函数 strcat,调用形式 strcat(str1, str2);,功能 连接两个字符数组中的字符串,将str2连接到str1的后面,结果放在st1中,函数值是st1的首地址。,说明 1.st1定义得足够大,使其能存放连接后的新字符串。 2.连接时自动删去str1的0,只在新串最后留一个0。,例如 连接两个字符串。#include “stdio.h“ #include “string.h“main( ) char st

26、r130, str210;gets(str1);gets(str2);strcat(str1, str2);puts(str1);,输入 China beijin 输出 China beijin,同学们:你们一定要认真读书!,字符串拷贝函数 strcpy,调用形式 strcpy(str1, str2);,功能 将str2串复制到字符数组str1中去,函数值是str1的首地址。 其中,str1 字符数组名;str2 字符串常量或已含一字符串的字符数组名。,例如 将“China“这个字符串复制到str1数组中。static char a10, b =“China“ ;strcpy(a , b);或

27、 strcpy(a , “China“);,说明,1.拷贝时, str2的结束标志0也一起拷贝到str1中。因此str1的大小 (str2中的字符个数+1)。 static char a6, b =“China” strcpy(a , b);,2.不能用赋值语句将一个字符串或字符数组直接赋给一个字符数组。char str15,str25; 错误: str1=“ABC“; str2=str1; ,正确: strcpy(str1,“ABC“);strcpy(str2 , str1);,或 str10=A; str11=B; str12=C; str13=0;,赋值语句只能将一个字符赋给一个字符型变

28、量或字符数组元素,具体见上面方框,字符串比较函数 strcmp,调用形式 strcmp(str1, str2);,其中,str1和str2可以是字符串常量或已含字符串的字符数组名。 如: strcmp(str1,str2);strcmp(“China”,”Korea”); strcmp(str1,”Beijing”);功能 比较str1和str2这两个字符串。,返回值 1. 如果str1等于str2, 则函数值为0;2. 如果str1大于str2, 则函数值为一正整数;3. 如果str1小于str2, 则函数值为一负整数。,比较规则:两个字符串从左向右逐个字符进行比较,直到出现不相同的字符或遇

29、到0为止。如果所有的对应字符都相同,则认为这两个字符串相等;若出现不相同的字符,则以第一个不相同字符的比较结果为准,并将它们的ASCII值的差作为函数的返回值。,例如 #include “string.h” main( ) int t; t=strcmp(“China“, “Chair“); /*i105,a97*/printf(“t=%d”,t); ,输出: t=8,两个字符串相等的判断: 正确形式: if( strcmp(str1,str2)= =0 ) printf(“yes”);,错误形式: if( str1= =str2 ) printf(“yes”);,求字符串长度函数 strle

30、n,调用形式 strlen(str) ;,功能: 求字符串的实际长度(不包括0在内)。该函数的返回值为整型常量。,例如 int len;static char s12=“computer“;printf(“%d“, strlen(s); len=strlen(“China0Beijin“);printf(“%d“, len);,8,5,在以上介绍的字符串运算函数中: 以字符数组名形式出现的参数,都可以是已指向数组首地址的字符型指针。 以字符串常量形式出现的参数,也可以是已指向一字符串的字符型指针。,学生暂时只作了解!,字符数组应用举例,例7.8 输入一行字符,统计其中有多少个单词,单词之间用空

31、格分隔。char c81; gets(c);,算法:,c0,例7.8 #include “stdio.h” main( ) char str81 ;int i , num=0, word=0;char c;gets(str);for(i=0; (c=stri)!=0; i+)if(c= ) word=0;elseif(word=0) word=1; num+; printf(“There are %d words in the line.n”,num); ,程序演示,例7.9 有3个字符串,要求找出其中是大者。,程序演示,#include “stdio.h” #include “string.

32、h” main( ) char string20 , str320;int i ;for(i=0; i0 ) strcpy (string, str0);else strcpy (string, str1);if(strcmp(string , str2) 0 );elsestrcpy (string, str2);printf(“the largest string is : n%s ”, string ); ,说明: str0、str1、str2 分别代表每行的起始地址,即: str0&str00 str1&str10 str2&str20,对数组str初始化,补充 任给一个字符串,从该串

33、中删除指定的字符后输出。,算法:将字符数组中待删除的指定字符之前的所有字符保留,而将其之后的所有字符顺次前移(左移)一个字符位置。最后在变短了的字符串后置结束标志0。,删除前str:,删除后 str:,若待删除字符为 l,stri,strj,i=0;j=0; 当 stri!=l时strj=stri; j+;i+; 当 stri=l时i+;,str3,str4,例 #include “stdio.h” main( ) char str80, c ;int i, j ;printf(“Input a string: “);gets(str ); printf(“Delete:“);c=getcha

34、r( ); j=0;for(i=0 ; stri != 0 ; i+)if(stri != c) strj+=stri;strj=0; /*设置串的结束标志 */puts(str); ,程序演示,strj=stri; j+; ,例delete,习题7.2 从键盘输入10个整数,用选择法将它们由小到大排序。 算法: 对于待排序的N个数 (如:N=6 3 2 4 1 9 0),第一趟,找出N 个数中的最小数并将它与左边第一个数对换; 第i 趟,找出剩下的 N-i个数中最小的数并将它与左边第i个数(亦即这剩下的N-i个数中最左边的数)对换; 如此重复N-1趟。,3 2 4 1 9 00 2 4 1

35、9 30 1 4 2 9 30 1 2 4 9 30 1 2 3 9 40 1 2 3 4 9,N-1趟,for(i=0;iaj) t=ai;ai=aj;aj=t;,具体算法: 对于待排序的N(如N=6)个数,程序演示,作 业 例题 5.6 用选择法排序(P68) 要求:阅读分析其算法,并上机调试习题五 3、 5 (P70) 3、 算法提示int a10= 1,3,4,5,5,7,9,13,15; (给前9个元素赋值)int i ,x;从键盘上输入待插入的数赋给x;通过循环, for(i=8;i0;i-)if(xai)ai+1=ai; elseai+1=x; brek; 依次输出各元素,5、算

36、法提示int a88;int i,j;通过二重循环给各元素赋值 if(j=0|i=j)aij=1; elseaij=ai-1j-1+ai-1j通过二重循环输出各元素值,附加 P70 习题 1 算法 P184-185,作 业 习题五 4、 10、11 (P70),10、算法提示char str120,str220;int i,j;gets(str2); 通过循环,条件str2i!=0str1i=str2i;str1i=0;puts(str1);puts(str2);,11、算法提示char str120;int i,len;gets(str1);len=strlen(str1); 通过循环,条件 ilen/2) 输出相关信息如 ABCECFBA,4、 算法提示int a10; int i,k,max;通过循环给各元素赋值max=a0;通过循环,逐个比较if(maxai) max=ai; k=i;交换 a9 ak 依次输出各元素,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报