C语言程序设计第四版PPT谭浩强.ppt
第6章 数组,课程内容,Ch1 创建一个C语言程序Ch2 算法的重要性及表达Ch3-5 基本程序结构,数据及运算Ch6 数组成批数据如何处理?Ch7 函数大型的程序如何划分?Ch8 指针变量在内存的存储与访问Ch9 结构体较为复杂的数据结构Ch10 文件持久保存数据补充 位运算,习题5.4 统计一串英文字符中的大写字母、小写字母、数字、空格、其他字符的个数。,问题扩展:输入一句英文,统计并输出每个字母使用的频数和频率,例5.8 Fibonacci数列,问题:如何使用数学中的下标变量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);,数组的概念,有序数据的集合用同一名称表示一组相同类型的相关数据用下标区分各个元素相当于数学中的下标变量,如 x1,x2,.a11,a12,.,a21,.,一维数组的定义,定义:类型说明 数组名常量 定义一个数组的名称、类型、元素个数,一维数组的定义,short int a3;,说明:不能动态定义数组,见P.143说明(3),存储地址,数组元素,存储单元,0000000000000110,a2=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,这是顺序查找法。还有一种常用的折半查找法,数据量大且有序时使用,效率更高。,折半查找,int a11=5,13,19,21,37,56,64,75,80,88,92;int index=-1,key,low,high,middle;scanf(%d,一维数组的定义和引用,例:排序算法,算法演示冒泡排序选择排序插入排序快速排序,基本思路:依次将数组中相邻两元素比较,并按要求的顺序交换,从而将最大/最小的数推至最前或最后;对余下的数重复上述步骤,最终获得所需的顺序,冒泡排序,对数组元素a0-a5升序排序比较a5和a4,若顺序不符则交换;比较a4和a3,若顺序不符则交换;比较a3和a2,若顺序不符则交换;比较a2和a1,若顺序不符则交换;比较a1和a0,若顺序不符则交换。,冒泡排序,=结果:最小的数被换到了a0中。=对a1-a5重复上述步骤,将其中最小的数换到a1中。=重复上述步骤直至完成排序。,冒泡排序,冒泡排序,int a6,i,j,t;for(i=0;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,二维数组,例6.4 二维数组行列对换(矩阵转置)例6.5 对于一个二维数组,求最大值及其下标经典实例:杨辉三角(第6章习题第6题),二维数组,本节要点二维数组的物理存储方式二维数组的逻辑概念矩阵二维数组元素的遍历双重循环,字符数组,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值为0,char 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,字符数组,字符数组的输入输出,逐个元素输出 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;i=a,