C语言程序设计第四版ppt课件.ppt
第第6 6章章 数组数组课程内容课程内容lCh1 创建一个创建一个C语言程序语言程序lCh2 算法的重要性及表达算法的重要性及表达lCh3-5 基本程序结构基本程序结构, 数据及运算数据及运算lCh6 数组数组成批数据如何处理?成批数据如何处理?lCh7 函数函数大型的程序如何划分?大型的程序如何划分?lCh8 指针指针变量在内存的存储与访问变量在内存的存储与访问lCh9 结构体结构体较为复杂的数据结构较为复杂的数据结构lCh10 文件文件持久保存数据持久保存数据l补充补充 位运算位运算习题习题5.4 统计一串英文字符中的统计一串英文字符中的大写字母、小写字母、数字、空大写字母、小写字母、数字、空格、其他字符的个数。格、其他字符的个数。l问题扩展:问题扩展:输入输入一句英文,统计并一句英文,统计并输出每个字母使用的频数和频率输出每个字母使用的频数和频率例例5.8 Fibonacci数列数列l问题:如何使用数学中的下标变量问题:如何使用数学中的下标变量x1,x2,xn,形式表示一组相关的数形式表示一组相关的数据据例例5.8 Fibonacci数列用数组解决数列用数组解决 int i,fibo40;fibo0=fibo1=1;for (i=2;i40;i+)fiboi=fiboi-1+fiboi-2;for (i=0;i40;i+)printf(%10d,fiboi);if (i+1)%5=0) printf(n);数组的概念数组的概念l有序数据的集合有序数据的集合l用同一名称表示一组相同类型的相用同一名称表示一组相同类型的相关数据关数据l用下标区分各个元素用下标区分各个元素l相当于数学中的下标变量,如相当于数学中的下标变量,如 x1 , x2 , . a11 , a12 , . , a21 , .一维数组的定义一维数组的定义定义:定义: 类型说明类型说明 数组名数组名常量常量 定义一个数组的名称、类型、元素定义一个数组的名称、类型、元素个数个数一维数组的定义一维数组的定义short int a3;说明:不能动态定义数组,说明:不能动态定义数组,见见P.143说明说明(3)存储地址存储地址数组元素数组元素存储单元存储单元0000000000000110a2=6;一维数组元素的引用一维数组元素的引用 定义后的数组可分别引用各个元素定义后的数组可分别引用各个元素 数组名数组名下标下标 下标是整型常量或表达式下标是整型常量或表达式注意:引用的是数组中的元素,而不注意:引用的是数组中的元素,而不是整个数组;是整个数组;C编译系统对下标越界编译系统对下标越界的引用不给出错误提示的引用不给出错误提示一维数组的定义和引用一维数组的定义和引用-阅读程序阅读程序int a5,i;for (i=0;i=3;i+) ai=2*i;a4=100;for (i=0;i=4;i+) printf(a%d=%dn,i,ai);ai=20;printf(a%d=%dn,i,ai);一维数组的定义和初始化一维数组的定义和初始化 int a10=2,5,3,1,8,6,9,4,7,1;定义整型数组定义整型数组a并给并给a0-a9赋初值赋初值一维数组的定义和初始化一维数组的定义和初始化 int a10=2,5,3,1,8,6;定义整型数组定义整型数组a并给并给a0-a5赋初值,赋初值,其余元素值为其余元素值为0一维数组的定义和初始化一维数组的定义和初始化int a5,i;for(i=0;i5;i+) printf(%dn,ai);一维数组的定义、初始化和引用一维数组的定义、初始化和引用例:显示例:显示Fibonacci数列前数列前40项。项。 int i, fibo40=1,1;for (i=2;i40;i+)fiboi=fiboi-1+fiboi-2;for (i=0;i40;i+)printf(%10d,fiboi);if (i+1)%5=0) printf(n);一维数组的定义和引用一维数组的定义和引用例:求一维数组最大值及下标例:求一维数组最大值及下标int a10=23,41,56,21,15,67,32,44,16,31;int i, max;max=a0;for (i=0;imax) max=ai;printf(最大值: %dn,max);一维数组的定义和初始化一维数组的定义和初始化 int a =2,5,3,1,8,6;定义整型数组定义整型数组a并赋初值,该数组包含并赋初值,该数组包含6个元素个元素a0-a5一维数组的定义和引用一维数组的定义和引用例:在一维数组中查找给定数据及下标例:在一维数组中查找给定数据及下标int a10=23,41,56,21,15,67,32,44,16,31;int i, key, index=-1;printf(输入要查找的值输入要查找的值: );scanf(%d,&key);for (i=0;i10;i+)if (key=ai)index=i;break;if (index=-1) printf(找不到找不到n);else printf(找到,下标是找到,下标是: %dn,index);这是顺序查找法。还有一种常用的折半查找法,数据量大且有序时使用,效率更高。折半查找折半查找 int a11=5,13,19,21,37,56,64,75,80,88,92; int index=-1,key,low,high,middle; scanf(%d,&key); low=0;high=10; while(lowamiddle) low=middle+1; else high=middle-1; if (index!=-1) printf(Index: %d,index); else printf(Not found !);一维数组的定义和引用一维数组的定义和引用例:排序算法例:排序算法算法演示算法演示冒泡排序冒泡排序选择排序选择排序插入排序插入排序快速排序快速排序 基本思路:依次将数组中相邻两元基本思路:依次将数组中相邻两元素比较,并按要求的顺序交换,从而素比较,并按要求的顺序交换,从而将最大将最大/最小的数推至最前或最后;对最小的数推至最前或最后;对余下的数重复上述步骤,最终获得所余下的数重复上述步骤,最终获得所需的顺序需的顺序冒泡排序冒泡排序对数组元素对数组元素a0-a5升序排序升序排序比较比较a5和和a4,若顺序不符则交换;,若顺序不符则交换;比较比较a4和和a3,若顺序不符则交换;,若顺序不符则交换;比较比较a3和和a2,若顺序不符则交换;,若顺序不符则交换;比较比较a2和和a1,若顺序不符则交换;,若顺序不符则交换;比较比较a1和和a0,若顺序不符则交换。,若顺序不符则交换。冒泡排序冒泡排序=结果:最小的数被换到了结果:最小的数被换到了a0中。中。=对对a1-a5重复上述步骤,将其中最重复上述步骤,将其中最小的数换到小的数换到a1中。中。=重复上述步骤直至完成排序。重复上述步骤直至完成排序。冒泡排序冒泡排序冒泡排序冒泡排序 int a6,i,j,t; for (i=0;i6;i+) scanf(%d,&ai); printf(n); for (i=1;i=i;j-) if (aj=aj-1) t=aj; aj=aj-1; aj-1=t; for (i=0;i6;i+) printf(%dn,ai); 基本思路:在一列数中找到最小基本思路:在一列数中找到最小/最最大值,与指定位置的数交换;对余下大值,与指定位置的数交换;对余下的数重复上述步骤,最终获得所需的的数重复上述步骤,最终获得所需的顺序。顺序。选择排序选择排序对数组元素对数组元素a0-a5升序排序升序排序找找a0至至a5的最小值,与的最小值,与a0交换其值交换其值找找a1至至a5的最小值,与的最小值,与a1交换其值交换其值找找a2至至a5的最小值,与的最小值,与a2交换其值交换其值找找a3至至a5的最小值,与的最小值,与a3交换其值交换其值找找a4至至a5的最小值,与的最小值,与a4交换其值交换其值选择排序选择排序for (i=0;i5;i+) imin=i;min=ai; /*求求ai之后元素的最小值之后元素的最小值*/ for (j=i+1;j=5;j+) if (ajmin) min=aj; /*变量变量min记录最小值记录最小值 */ imin=j; /*变量变量imin记录最小值的下标记录最小值的下标 */ temp = ai; ai = aimin; aimin = temp; /*最小值与最小值与ai交换交换*/ 选择排序选择排序选择排序选择排序for (i=0;i5;i+) imin=i; for (j=i+1;j=5;j+) if (ajaimin) imin=j; /*只记录最小值的下标只记录最小值的下标imin,最小值就是,最小值就是aimin */ if (imin!=i) t=ai; ai=aimin; aimax=t; /* 当当imin=i时无需交换时无需交换 */对选择排序法进行改进对选择排序法进行改进二维数组的定义二维数组的定义 类型说明类型说明 数组名数组名常量常量常量常量功能:定义一个二维数组的名称、类功能:定义一个二维数组的名称、类型、元素个数型、元素个数二维数组的定义和存放二维数组的定义和存放说明:二维数组在内存中按行连续存放说明:二维数组在内存中按行连续存放例如定义例如定义 short int a23; 二维数组的定义和逻辑结构二维数组的定义和逻辑结构二维数组可视为一维数组的集合二维数组可视为一维数组的集合例如例如 int a23; 可以被当成两个一维数组的集合:可以被当成两个一维数组的集合:int a0:包括三个元素:包括三个元素a00,a01,a02int a1:包括三个元素:包括三个元素a10,a11,a12二维数组的定义和初始化二维数组的定义和初始化int a23=2,5,3,1,8,6;int a23=2,5,3,1,8,6;int a23=2,1,8,6;int a 3=2,5,3,1,8,6;讨论:以讨论:以矩阵的形矩阵的形式输出这式输出这个数组个数组二维数组元素的引用二维数组元素的引用 数组名数组名下标下标下标下标例:赋值例:赋值 a13=8; 输出输出 printf(%d,a21);二维数组的定义和引用二维数组的定义和引用下面的程序运行时输入下面的程序运行时输入 34 56 12 7 9 41 52,显示结果为显示结果为_。 int a23, i, j; for (i=0; i=1; i+) for (j=0; j=2; j+) scanf(%d, &aij); for (j=0; j=2; j+) for (i=0; i=1; i+) printf(%dt, aij); printf(n);二维数组二维数组例例6.4 二维数组行列对换二维数组行列对换(矩阵转置矩阵转置)例例6.5 对于一个二维数组,求最大值及其下对于一个二维数组,求最大值及其下标标经典实例:杨辉三角(第经典实例:杨辉三角(第6章习题第章习题第6题)题)二维数组二维数组本节要点本节要点l二维数组的物理存储方式二维数组的物理存储方式l二维数组的逻辑概念二维数组的逻辑概念矩阵矩阵l二维数组元素的遍历二维数组元素的遍历双重循环双重循环字符数组字符数组 C语言中没有字符串变量,字符串语言中没有字符串变量,字符串数据需要使用字符数组保存。数据需要使用字符数组保存。字符常量字符常量与与字符串常量字符串常量的区别的区别字符数组字符数组定义字符数组及元素赋值定义字符数组及元素赋值a0=a;a1=n;a2= ;a3=97;a4=n;a5=t;char a6;注意:实际存储二进制码注意:实际存储二进制码字符数组字符数组字符数组的初始化字符数组的初始化char a6=a, n, , a, n, t;char a6=h, a, p, p, y;a5值为值为0char a =h, e, l, l, o;char a =hello;char a10=hello;printf(%dn,sizeof(a);printf(%dn,strlen(a);字符数组字符数组字符数组的输入输出字符数组的输入输出逐个元素输入逐个元素输入 int i; char a10; for (i=0; i=9; i+) scanf(%c,&ai); for (i=0; i=9; i+) ai=getchar();字符数组字符数组字符数组的输入输出字符数组的输入输出逐个元素输出逐个元素输出 int i; char a =hello ; for (i=0;i=4;i+) printf(%c,ai); for (i=0;i=4;i+) putchar(ai);字符数组字符数组字符数组的输入输出字符数组的输入输出整个字符串(字符数组)输出整个字符串(字符数组)输出 int i; char a10=hello ; printf(%s, a);字符串格式符字符串格式符字符数组名字符数组名只输出只输出5个字符个字符(到(到0为止)为止)字符数组字符数组字符数组的输入输出字符数组的输入输出整个字符串(字符数组)输入整个字符串(字符数组)输入 int i; char a10; scanf(%s,a); printf(%s, a);字符串格式符,不可包含空格字符串格式符,不可包含空格字符数组名,不加字符数组名,不加&字符数组字符数组字符数组的输入输出字符数组的输入输出整个字符串(字符数组)输入整个字符串(字符数组)输入 char a5,b5; scanf(%s%s,a,b); printf(%s,%sn, a,b); printf(%x,%x, a,b);输入时两个字符输入时两个字符串以空格分隔串以空格分隔以十六进制显示数组首地址以十六进制显示数组首地址字符数组字符数组字符串处理函数字符串处理函数P.130-134 自学自学字符数组字符数组字符串处理函数字符串处理函数puts(字符数组字符数组) 输出字符数组的值输出字符数组的值对比对比 printf(%s, a)对比对比 putchar(字符变量字符变量)字符数组字符数组字符串处理函数字符串处理函数gets(字符数组字符数组) 输入字符串赋值给字符数组,输入字符串赋值给字符数组,函数值为该数组的首地址函数值为该数组的首地址对比对比 scanf(%s, a) 对比对比 getchar(字符变量字符变量)字符数组字符数组字符串处理函数字符串处理函数strcat(字符数组字符数组1,字符数组字符数组2)连接两个字符连接两个字符数组,保存在数组,保存在字符数组字符数组1中,中,函数值为字符函数值为字符数组数组1的值的值 char s1=Good,s2= Bye;printf(%sn,strcat(s1,s2);printf(%sn, s1);printf(%sn, s2);字符数组字符数组字符串处理函数字符串处理函数strcpy(字符数组字符数组1,字符串字符串2)将字符串将字符串2(字(字符串常量或字符串常量或字符数组)内容符数组)内容复制到字符数复制到字符数组组1中中char s1=Good Morning!;char s2=Hello!;printf(%sn,strcpy(s1,s2);字符数组字符数组字符串处理函数字符串处理函数strncpy(字符数组字符数组1,字符串字符串2,数值数值n)将字符串将字符串2前前n个字符复制到个字符复制到字符数组字符数组1中中char s1=Good Morning!char s2=Hello!;printf(%s,strncpy(s1,s2,4);字符数组字符数组字符串处理函数字符串处理函数strcmp(字符串字符串1,字符串字符串2)比较两个字符的比较两个字符的大小大小逐个字逐个字符进行比较出现符进行比较出现不同的字符或结不同的字符或结束符,返回两者束符,返回两者ASCII值的差值的差char s1=God,s2=Good;printf(%dn,strcmp(s1,s2);C语言中没有字符串语言中没有字符串“=”、“”的运算的运算字符数组字符数组字符串处理函数字符串处理函数strlen(字符串字符串)返回字符串(字返回字符串(字符串常量或字符符串常量或字符数组)中数组)中“0”之前的字符个数之前的字符个数char s110=Good;printf(%d,strlen(s1);printf(%d,strlen(Hello);字符数组字符数组字符串处理函数字符串处理函数strlwr(字符串字符串)将字符串(字符将字符串(字符串常量或字符数串常量或字符数组)中的大写字组)中的大写字母转换为小写母转换为小写char s110=Good;printf(%sn,strlwr(s1);printf(%s,strlwr(Hello);字符数组字符数组字符串处理函数字符串处理函数strupr(字符串字符串)将字符串(字符将字符串(字符串常量或字符数串常量或字符数组)中的小写字组)中的小写字母转换为大写母转换为大写char s110=Good;printf(%sn,strupr(s1);printf(%s,strupr(Hello);字符数组字符数组字符串处理函数字符串处理函数 练习练习main() char pass_str80; int i=0; while(1) printf(Input your password: ); gets(pass_str); if(strcmp(pass_str,ppp)!=0) printf(Password Error!n); else break; i+; if(i=3) return; printf(Welcome to my system!);字符数组字符数组例:例:输入一串字符,判断其中字母、数字、空格输入一串字符,判断其中字母、数字、空格和其他字符的个数和其他字符的个数 char s100; int i,n4=0; gets(s); /* scanf(%s,s); for (i=0;i100;i+)scanf(%c,&si); */ for(i=0;i=a& si=A& si=0& si=9) n1+; else if (si=32) n2+; else n3+; for(i=0;i4;i+)printf(%d ,ni);