您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > C语言程序设计第四版PPT谭浩强
第6章数组课程内容Ch1创建一个C语言程序Ch2算法的重要性及表达Ch3-5基本程序结构,数据及运算Ch6数组——成批数据如何处理?Ch7函数——大型的程序如何划分?Ch8指针——变量在内存的存储与访问Ch9结构体——较为复杂的数据结构Ch10文件——持久保存数据补充位运算习题5.4统计一串英文字符中的大写字母、小写字母、数字、空格、其他字符的个数。问题扩展:输入一句英文,统计并输出每个字母使用的频数和频率例5.8Fibonacci数列问题:如何使用数学中的下标变量x1,x2,…xn,…形式表示一组相关的数据例5.8Fibonacci数列用数组解决inti,fibo[40];fibo[0]=fibo[1]=1;for(i=2;i40;i++)fibo[i]=fibo[i-1]+fibo[i-2];for(i=0;i40;i++){printf(%10d,fibo[i]);if((i+1)%5==0)printf(\n);}数组的概念有序数据的集合用同一名称表示一组相同类型的相关数据用下标区分各个元素相当于数学中的下标变量,如x1,x2,...a11,a12,...,a21,...一维数组的定义定义:类型说明数组名[常量]定义一个数组的名称、类型、元素个数一维数组的定义shortinta[3];说明:不能动态定义数组,见P.143说明(3)存储地址数组元素存储单元0000000000000110a[2]=6;一维数组元素的引用定义后的数组可分别引用各个元素数组名[下标]下标是整型常量或表达式注意:引用的是数组中的元素,而不是整个数组;C编译系统对下标越界的引用不给出错误提示一维数组的定义和引用-阅读程序inta[5],i;for(i=0;i=3;i++)a[i]=2*i;a[4]=100;for(i=0;i=4;i++)printf(a[%d]=%d\n,i,a[i]);a[i]=20;printf(a[%d]=%d\n,i,a[i]);一维数组的定义和初始化inta[10]={2,5,3,1,8,6,9,4,7,1};定义整型数组a并给a[0]-a[9]赋初值一维数组的定义和初始化inta[10]={2,5,3,1,8,6};定义整型数组a并给a[0]-a[5]赋初值,其余元素值为0一维数组的定义和初始化inta[5],i;for(i=0;i5;i++)printf(%d\n,a[i]);一维数组的定义、初始化和引用例:显示Fibonacci数列前40项。inti,fibo[40]={1,1};for(i=2;i40;i++)fibo[i]=fibo[i-1]+fibo[i-2];for(i=0;i40;i++){printf(%10d,fibo[i]);if((i+1)%5==0)printf(\n);}一维数组的定义和引用例:求一维数组最大值及下标inta[10]={23,41,56,21,15,67,32,44,16,31};inti,max;max=a[0];for(i=0;i10;i++)if(a[i]max)max=a[i];printf(最大值:%d\n,max);一维数组的定义和初始化inta[]={2,5,3,1,8,6};定义整型数组a并赋初值,该数组包含6个元素a[0]-a[5]一维数组的定义和引用例:在一维数组中查找给定数据及下标inta[10]={23,41,56,21,15,67,32,44,16,31};inti,key,index=-1;printf(输入要查找的值:);scanf(%d,&key);for(i=0;i10;i++)if(key==a[i]){index=i;break;}if(index==-1)printf(找不到\n);elseprintf(找到,下标是:%d\n,index);这是顺序查找法。还有一种常用的折半查找法,数据量大且有序时使用,效率更高。折半查找inta[11]={5,13,19,21,37,56,64,75,80,88,92};intindex=-1,key,low,high,middle;scanf(%d,&key);low=0;high=10;while(low=high){middle=(low+high)/2;if(key==a[middle]){index=middle;break;}elseif(keya[middle])low=middle+1;elsehigh=middle-1;}if(index!=-1)printf(Index:%d,index);elseprintf(Notfound!);一维数组的定义和引用例:排序算法算法演示•冒泡排序•选择排序•插入排序•快速排序基本思路:依次将数组中相邻两元素比较,并按要求的顺序交换,从而将最大/最小的数推至最前或最后;对余下的数重复上述步骤,最终获得所需的顺序冒泡排序对数组元素a[0]-a[5]升序排序比较a[5]和a[4],若顺序不符则交换;比较a[4]和a[3],若顺序不符则交换;比较a[3]和a[2],若顺序不符则交换;比较a[2]和a[1],若顺序不符则交换;比较a[1]和a[0],若顺序不符则交换。冒泡排序=》结果:最小的数被换到了a[0]中。=》对a[1]-a[5]重复上述步骤,将其中最小的数换到a[1]中。=》重复上述步骤直至完成排序。冒泡排序冒泡排序inta[6],i,j,t;for(i=0;i6;i++)scanf(%d,&a[i]);printf(\n);for(i=1;i6;i++)for(j=5;j=i;j--)if(a[j]=a[j-1]){t=a[j];a[j]=a[j-1];a[j-1]=t;}for(i=0;i6;i++)printf(%d\n,a[i]);基本思路:在一列数中找到最小/最大值,与指定位置的数交换;对余下的数重复上述步骤,最终获得所需的顺序。选择排序对数组元素a[0]-a[5]升序排序找a[0]至a[5]的最小值,与a[0]交换其值找a[1]至a[5]的最小值,与a[1]交换其值找a[2]至a[5]的最小值,与a[2]交换其值找a[3]至a[5]的最小值,与a[3]交换其值找a[4]至a[5]的最小值,与a[4]交换其值选择排序for(i=0;i5;i++){imin=i;min=a[i];/*求a[i]之后元素的最小值*/for(j=i+1;j=5;j++)if(a[j]min){min=a[j];/*变量min记录最小值*/imin=j;/*变量imin记录最小值的下标*/}temp=a[i];a[i]=a[imin];a[imin]=temp;/*最小值与a[i]交换*/}选择排序选择排序for(i=0;i5;i++){imin=i;for(j=i+1;j=5;j++)if(a[j]a[imin])imin=j;/*只记录最小值的下标imin,最小值就是a[imin]*/if(imin!=i){t=a[i];a[i]=a[imin];a[imax]=t;}/*当imin=i时无需交换*/}对选择排序法进行改进二维数组的定义类型说明数组名[常量][常量]功能:定义一个二维数组的名称、类型、元素个数二维数组的定义和存放说明:二维数组在内存中按行连续存放例如定义shortinta[2][3];二维数组的定义和逻辑结构二维数组可视为一维数组的集合例如inta[2][3];可以被当成两个一维数组的集合:inta[0]:包括三个元素a[0][0],a[0][1],a[0][2]inta[1]:包括三个元素a[1][0],a[1][1],a[1][2]二维数组的定义和初始化inta[2][3]={2,5,3,1,8,6};inta[2][3]={{2,5,3},{1,8,6}};inta[2][3]={{2},{1,8,6}};inta[][3]={{2,5,3},{1,8,6}};讨论:以矩阵的形式输出这个数组二维数组元素的引用数组名[下标][下标]例:赋值a[1][3]=8;输出printf(%d,a[2][1]);二维数组的定义和引用下面的程序运行时输入345612794152,显示结果为______。inta[2][3],i,j;for(i=0;i=1;i++)for(j=0;j=2;j++)scanf(%d,&a[i][j]);for(j=0;j=2;j++){for(i=0;i=1;i++)printf(%d\t,a[i][j]);printf(\n);}二维数组例6.4二维数组行列对换(矩阵转置)例6.5对于一个二维数组,求最大值及其下标经典实例:杨辉三角(第6章习题第6题)二维数组本节要点二维数组的物理存储方式二维数组的逻辑概念——矩阵二维数组元素的遍历——双重循环字符数组C语言中没有字符串变量,字符串数据需要使用字符数组保存。字符常量与字符串常量的区别字符数组定义字符数组及元素赋值a[0]='a';a[1]='n';a[2]='';a[3]=97;a[4]='n';a[5]='t';chara[6];注意:实际存储二进制码字符数组字符数组的初始化chara[6]={'a','n','','a','n','t'};chara[6]={'h','a','p','p','y'};a[5]值为'\0'chara[]={'h','e','l','l','o'};chara[]={hello};chara[10]=hello;printf(%d\n,sizeof(a));printf(%d\n,strlen(a));字符数组字符数组的输入输出——逐个元素输入inti;chara[10];for(i=0;i=9;i++)scanf(%c,&a[i]);for(i=0;i=9;i++)a[i]=getchar();字符数组字符数组的输入输出——逐个元素输出inti;chara[]=hello;for(i=0;i=4;i++)printf(%c,a[i]);for(i=0;i=4;i++)putchar(a[i]);字符数组字符数组的输入输出——整个字符串(字符数组)输出inti;chara[10]=hello;printf(%s,a);字符串格式符字符数组名只输出5个字符(到'\0'为止)字符数组字符数组的输入输出——整个字符串(字符数组)输入inti;chara[10];scanf(%s,a);printf(%s,a);字符串格式符,不可包含空格字符数组名,不加&字符数组字符数组的输入输出——整个字符串(字符数组)输入chara[5],b[5];scanf(%s%s,a,b);printf(%s,%s\n,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的值chars1[]=Good,s2[]=Bye;printf(%s\n,strcat(s1,s2));printf(%s\n,s1);printf(%s\n,s2);字符数组字符串处理函数strcpy(字符数组1,字符串2)将字符串2(字符串常量或字符数组)内容复制到字符数组1中chars1[]=GoodMorning!;chars2[]=Hello!;printf(%s\n,strcpy(s1,s2));字符数组字符串处理函数strncpy(字符数组1,字符串2,数值n)将字符串2前n个字符复制到字符数组1中chars1[]
本文标题:C语言程序设计第四版PPT谭浩强
链接地址:https://www.777doc.com/doc-4479925 .html