c第3章数组与指针01.ppt_第1页
c第3章数组与指针01.ppt_第2页
c第3章数组与指针01.ppt_第3页
c第3章数组与指针01.ppt_第4页
c第3章数组与指针01.ppt_第5页
已阅读5页,还剩54页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第3章01 数 组,本章主要内容,数组 一维数组的定义与引用 二维数组的定义与引用 字符数组 典型例题精解 指针 指针的概念 指针与数组的关系 指针编程应用,第3章01 数组,数组:相同数据类型的 变量的集合。 数组元素内存中连续存放。,数组中的各变量称为元素。 每个元素用下标区分。 数组用一个名字作为标识。,例如,存放班级30人的c语言成绩。,int a30;,数组必须先说明后使用,目的如下:,说明数组的名字(标识)。 说明数组的类型。 说明数组的维数。 确定各维下标的变化范围。,优 点: 1、方便处理成批数据 2、方便于设计算法 3、方便应用指针访问数组元素,int a30;,3.1 一维数组,3.1.1 一维数组的定义和引用,一般形式:,数据类型 数组名数组长度;,int a5;,数组说明后,编译时系统会分配一段连续的 内存单元给各元素。,a0,a1,a2,a3,a4,说明: (1)数组名:符合C命名规则。特殊含义是地址常量:。 (2) “ ”是下标运算符,是数组的标志。 (3)数组长度:整型常量,元素的个数。 (4)允许同时说明多个数组和变量。,&ai=&a0+isizeof(数组类型),【例3-1】编程实现一维数组的输入输出。,分析: 输入(或输出)数组元素,必须用循环逐个地进行。 通常循环控制变量与数组元素的下标相对应。,#include void main(void) int i, a10; for( i=0;i10;i+) scanf(“%d“, ,3.1.2 一维数组的赋值,1、 定义数组时元素赋初值-初始化,int a10=1,2,3,4,5,6,7,8,9,10;,2、程序运行时元素赋值 一般使用循环赋值,初始化的规则: (1)将初值依次放 内,以“,”分隔。 (2)对全部元素赋初值时,可省略数组长度, 长度由初值个数确定。 (3)对部分元素赋初值时,长度不能省略, 给定的初值依次赋给前面的元素, 初值没有给出的,系统会自动确定为0。,for( i=0;i10;i+) scanf(“%d“, ,举例 输出Fibonacci 数列的前20项。,#include void main(void) int fib20=1,1,i; for(i=2;i20;i+) fib i=fib i-2 +fib i-1 for( i = 0; i 20; i+) if(i%5=0) printf(“ n” ); printf(“ %d” , fib i ); ,3.1.3一维数组应用举例,数组的常用编程方法,数组是同类型数据的集合。便于整体处理数据. 与数组相关的主要编程方法有:, 求极值 排序 查找 4.插入 5.删除,例3-2 输入10个整数,求其中的最大数。,分析: (1)使用数组存储数据,使用循环完成输入。 (2)找最大数的思路是: 首先假设a0为最大数, imax= a0; 在循环中,依次将数组中的元素与imax比较,若比imax大,则更新imax值。循环结束后imax就是要找的最大值。,#include void main(void) int i, a10, imax; for( i=0;i imax) imax=ai; printf(“the biggest is %5dn“,imax); , 求极值,思考题: (1)从键盘输入10个整数,输出最大数和最小数。 (2)从键盘输入10个整数,输出最大数和最小数 及它们所在的下标。,#include void main(void) int i, a10, imax,imin,maxp,minp; for( i=0;i imax) imax=ai; maxp=i; if (ai imax) imin=ai; minp=i; printf(“max:a%d =%5dn“, maxp,imax); printf(“ min:a%d =%5dn“, minp,imin); , 排 序,(1)排序的概念,排序 是将随机排列的一组数,按从大到小或 从小到大重新排列。,(2)排序算法: 简单选择排序法 冒泡排序法,选择排序基本思路(由小到大):,(1)用数组a存储要排序的10个数据。 (2)在a0a9中,选择最小数,记住下标。 将其交换在a0的位置上; (3)在剩余的a1a9中,选择最小数, 将其交换在a1的位置上; (4)如此等等,共进行9趟选择排序。 (5)选择最小数据的同时,记录其位置, 以备进行数据交换,例3-3xz 将10个整数从小到大的次序排列并输出。,#include void main(void) int i,j,minp,t; int a10=4,3,5,1,10,12,2,6,7,9; for(i=0;i9;i+) minp=i; for( j=i+1;j10;j+) if(ajaminp) minp=j; if(minp!=i) t=ai; ai=aminp; aminp=t; for(i=0;i10; i+) printf(“%4d“,ai); ,冒泡的基本思路(由小到大):,(1)用数组 a 存储要排序的n个数据。 (2)从上到下扫描数组元素a0an-1, 相邻元素比较,逆序(ajaj+1), 就交换。 本趟结果:最大数交换到最后的位置an-1上。 (3)第二趟扫描数组元素a0an-2 , 相邻元素比较,逆序(ajaj+1), 就交换。 本趟结果:次大的数交换到an-2的位置上。 (4)依次类推,共进行n-1趟冒泡排序。,例3-3 从键盘输入10个整数,按从小到大的次序排列并 输出。,#include void main(void) int i, j,t; int a10; for( i=0;iaj+1) t=aj; aj=aj+1; aj+1=t; for(i=0;i10; i+) printf(“%4d“,ai); , 查 找,查找是在一组数中,寻找一个特定的数x,并显示查找结果。, 顺序查找,顺序查找算法: 构造循环,循环中“当前元素”和 x 比较, 相等则表示找到,并输出其下标(位置)。,编程中,经常要设置标志变量-整型,记录一些状态, 作为输出时判断的条件。,查找标志的设置: iFlag=0:表示没找到; iFlag=1;表示找到.,标志设置框图,int iFlag;,iFlag=0;,是否找到?,iFlag=1;,yes,no,/顺序查找程序,void main(void) int i,iFlag,x,xpos; int a10=4,3,5,1,10,12,2,6,7,9; iFlag=0; scanf(“%d“, ,折半查找适用于在有序数组中查找,基本思想:将“区间中点值”与 X比较,缩小下一次查找的区间-区间折半,提高查找效率!,步骤: (1)数据有序存放在数组a10中。 (2)初始区间 low=0,high=9; (3)取中点mid=(low+high)/2, 比较amid与x,若相等,找到了;若不相等,缩小查找区间。 (4)只要区间存在,重复执行(3)。,若 amidx,取high=mid-1,左半区间为新的查找区间。,#include void main(void) int low,high,mid,iflag,x; int a10=1,2,3,5,6,8,9,10,11,12; iflag=0; low=0; high=9; scanf(“%d“, ,/折半查找程序,例3-4 统计选票。 有4位候选人,编号分别为1,2,3,4。统计每位候选人得票。,分析: 为了统计每位候选人得票,程序中定义一个用于计数的数组hxsum5,其中元素hxsum0不用,hxsum1 hxsum4分别存放编号为1,2,3,4的得票数。每次读入当前一个字符(一张选票)到xpiao变量中,如果xpia合法(14),则数组中相应数组元素hxsumch加1。,#include void main( ) char xpiao; int hxsum 5, i; for (i=1; i=1 ,void main( ) char xpiao=“12344321231123433215678“; int hxsum 5=0, i; for(i=0;xpiaoi!=0;i+) switch(xpiaoi) case 1:hxsum1+;break; case 2:hxsum2+;break; case 3:hxsum3+;break; case 4:hxsum4+;break; default: break; for(i=1; i5; i+) printf(“候选人 %d: %d 票n“,i,hxsum i); ,4、 数组插入问题。 设有一个数组其元素有序,从键盘输入一个整数, 将其有序地插入数组中。,void main(void) int a10=3,5,7,9,11,13,15,17,19; int i,x; printf(“input x:“); scanf(“%d“, ,/在数组的第i号位置,插入x。i与x从键盘输入。 #include void main() int a10=3,5,7,9,11,13,15,17,19; int i,j,x; printf(“input x,i:“); scanf(“%d%d“, ,5-1、 数组元素的删除问题。 设有一个数组,删除第i号元素 。,#include void main() int a10=3,5,7,9,9,3,15,3,3,3; int i,j; printf(“input i“); scanf(“%d“, ,5-2、 数组元素的删除问题。 设有一个数组,输入一个数key,要求将数组中第一个值为key的元素删除。,#include void main() int a10=3,5,7,9,9,3,15,3,3,1; int i,key; scanf(“%d“, ,5-2、 数组元素的删除问题。 设有一个数组,输入一个数key,要求将数组中值为key的元素删除。,void main() int a10=3,5,7,9,9,3,15,3,3,3; int i,j,key,c=0; scanf(“%d“, ,3.2 字符数组,3.2.1 字符数组的定义,char 字符数组名字符串长度;,说明: (1)长度=实际长度1。字符串以 0 结尾。 多出来的一个空间是为了存放该字符。 (2) 字符串结束标志。 0 是ASCII码为0的字符,用于判断字符串是否结束。 (3)字符串常量是用双引号括起来的字符序列。 例如, “hello” 在内存中实际上占用了6个内存单元。,3.2. 字符数组的初始化,h,e,l,l,o,0,由于字符串的特殊性,其的初始化有其特殊的一面。,字符串作初值,可以不用括起,系统自动在串尾加 0 char str=“hello“ ; 等价于,人工在串尾加 0 : char str=h,e,l,l,o,0; 但不等价于: char str=h,e,l,l,o; /*占用5个单元*/,3.2.3 字符数组的输入输出,1、字符串的输出,(1)printf() 函数,其一:使用%c格式符,利用循环逐个字符输出。,char str=“hello“; for(i=0;stri!=0;i+) printf(“%c“,stri);,其二:使用%s格式符,对应的输出项是字符数组名 或字符串常量,此时进行字符串的整体输出, 不需要使用循环。,char str=“hello“; printf(“%s“,str);,(2)puts() 函数,puts(字符数组名或字符串常量);,作用:将字符串输出到显示屏上,遇第一个0终止, 并将 0 转换成 n 输出。,char str=“hello“; puts(str); puts(“hello“);,2. 字符串的输入,(1)scanf函数,使用%s,其对应项是字符数组名。,char name20; scanf(“%s”,name);,不足: 当遇到空格时,scanf的输入操作将中止。 因此,无法使用scanf输入一个包含空格的字符串。,但是,利用scanf函数可以连续输入多个字符串。 字符串之间用空格分隔 。,char xingstr10,mingstr10; scanf(“%s%s“, xingstr,mingstr);,(2) gets( )函数,用法:,char str 80; gets(str);,作用: 读入一个字符串(包括空格)到str 中,用0 代替换行符。,数组名作参数。,char name100; gets(name); puts(name);,举例,#include void main(void) char str80; int i; gets(str); for(i=0 ; str i !=0; i+) if(stri=a ,3.2.4常用的字符处理函数,该类函数的原型定义在 string.h中。 使用时,加上 # include ,1求字符串长度,strlen(字符数组),#include #include void main( ) char str=“hello“; printf(“%d“,strlen(str); printf(“n“); ,(2)字符串的比较 strcmp(str1,str2),作用:对str1和str2 进行逐个字符的ASCII码比较, 直到对应字符能够确定大小关系或到串尾为止。,返回整型数值结果:,#include #include void main( ) char str1100,str2100; gets(str1); gets(str2); if(strcmp(str1,str2)=0) printf(“stri1 = stri2“); else if(strcmp(str1,str2)0) printf(“str1 str2“); else printf(“str1 str2“); ,(3)串拷贝函数 strcpy(str1,str2),作用:将str2拷贝到字符数组str1中,包括0 。,用法: char str110, str2 =”Computer”; strcpy(str1,str2); strcpy(str1,”Program”);,说明:,str1的长度要足够长; str1只能是字符数组名,str2可以是字符数组名或字符串常量。,分析下面的代码,错在哪? #include #include void main( ) char str15, str2 =“hello“; strcpy(str1,str2); printf(“%s“,str1); printf(“n”); ,(4)串连接函数 strcat(str1, str2),作用:将str2连接到str1后(去掉str1的0)。,用法: char str120=“Dalian”, str2 =” University”; strcat(str1,str2); puts(str1);,说明:,str1 只能是字符数组名,长度要足够长。 str2 可以是字符数组名或字符串常量。,#include #include void main( ) char str130=”The C program ”; char str2 =”language”; strcat(str1,str2); puts(str1); , strlwr(str) 将str中的大写字母转换成小写字母,其他不变。, strupr(str) 将str中的小写字母转换成大写字母,其他不变。,# include # include void main(void) char str1 =“c programming! 123“,str2=“Computer“; strlwr(str2); strupr(str1); puts(str1); puts(str2); ,C PROGRAMMING! 123 computer,字符数组应用,举例 :统计字符串中的各元音字母的个数,#include void main( ) char str80; int i, iCount5=0; gets(str); for(i=0; stri!=0; i+) switch(stri) case a: case A: iCount0+; break; case e: case E: iCount1+; break; case i : case I: iCount2+; break; case o: case O: iCount3+; break; case u: case U: iCount4+; printf”A(a),E(e),I(i),O(o),U(u)的个数分别是:n”); for(i=0;i5;i+) printf(“%5dn”,iCounti); ,例3-6 输入文本,统计其中单词的数目。 单词之间以一个或多个空格隔开。,#include #include void main(void) int i,word=0,wordcount=0; char str80; gets(str); for(i=0; stri!=0; i+) if(stri= ) word=0; else if (word=0) wordcount+; word=1; printf(“dan ci shu mu:%dn“,wordcount); ,if (stri!= &word=0),【 例3-7】 判断一个字符串是否为回文。 回文: 左读和右读都一样的字符串。 比如:“abcba“是一个回文字符串。,#include #include void main(void) char str100; int i, j,len ,flag=1; printf(“nPlease input a string:n “); gets(str); len=strlen(str); for(i=0, j= len-1; ilen/2;i+,j-) if(stri!=strj) flag=0; break; if(flag=1) printf(“This string is a huiwen.“); elseprintf(“This string is not a huiwen.“); ,3.3 二维数组的定义与应用,四个学生三门课的成绩。,此时,数组应有两个下标。 具有多个下标的数组称为多维数组。,行:代表某个学生。,列:代表某门课程。,3.3.1 二维数组的定义,1、一般形式: 数据类型 数组名第一维长度第二维长度;,int a33 , b45;,#include void main() int a23; int i,j; for(i=0;i2;i+) for(j=0;j3;j+) printf(“a%d%d DS:%xn“,i,j, ,【例3-9】 输出二维数组元素的内存地址。,【例3-8】二维数组的输入和输出。,分析: 一般用双重循环逐个元素进行输入输出操作。通常: 外层循环的 i 与行下标相对应; 内层循环的 j 与列下标相对应。,#include void main() int score23, i, j; for(i=0;i2;i+) for(j=0;j3;j+) scanf(“%d“, ,3.2.2 二维数组初始化,1、分行赋初值(第一维可省),int a 3=1,2,3,4,5,6;,按内存顺序赋初值。,部分赋初值,int a23= 1 , 2 ;,2、对全体数组元素赋初值,第一维下标可以省略。,int a 3=1, 2, 3, 4, 5, 6;,初值表放在 内,应与元素在内存中存储顺序一致。,举例: 二维数组求最小值,输出其位置。,#include void main(void) float a34= 1.0, 3.0, 5.2, 7.4,,4.6, 5.5, 4.2, 1.2, 10.5, 0.23,1.3, 0.5; int i, j, minrow=0,mincol=0; for(i=0; i3; i+) for(j=0;j4;j+) if(aijaminrowmincol) minrow = i; mincol = j; printf(“zui xiao zhi :a%d%d=%d”, iRow,iCol, aiRowiCol,); ,【例 3-10】 将2100之间的偶数赋给一个二维数组,然后输出。,分析: 2到100之间的偶数共有50个, 可以定义一个5行10列的二维数组存放。,#include void main( void) int num510, i, j,n=1; for( i=0; i5; i+) /*数组赋值*/ for(j=0; j10; j+) numij= 2*n; n+; for(i=0; i5;i+) /*按行输出数组*/ for(j=0;j10;j+) printf(“%4d”,numij); printf(“n”); /*输出一行后,换行*/ ,数组与矩阵,int a33;,a00 a01 a02 a10 a11 a12 a20 a21 a22,数学上称为“矩阵”,若行数=列数, 称为“方阵”.,矩阵的相关算法, 生成特殊矩阵,生成单位方阵,单位方阵: 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1,#include void main(void) int a44,i,j; for(i=0;i4;i+) for(j=0;j4;j+) if(i=j) aij=1; else aij=0; for(i=0;i4;i+) for(j=0;j4;j+) printf(“%4d”,aij); printf(“n”); , 打印杨辉三角(前8行8列),1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 5 10 10 5 1 1 6 15 20 15 6 1 7 21 35 35 21 7 1 1 8 28 56 70 56 28 1,#include void main(void) int a88,i,j; for(i=0;i8;i+) ai0=1;aij=1; for(i=2;i8;i+) for(j=1;ji;j+) aij=ai-1j-1+ai-1j; for(i=0;i8;i+) for(j=0; j=i ;j+) printf(“%5d”,aij); printf(“n”); , 矩阵及元素求和问题,求方阵主、辅对角线之和。,1 5 2 6 -9 8 7 3 5 4 0 1 9 8 4 2,主对角线: 满足下标i=j或ii的元素和。,辅对角线: 满足下标i+j=3或 i 3-i的所有元素之和。,如何构造程序?,#include void main(void) int a44, zsum=0,fsum=0,i,j; for(i=0;i4;i+) for(j=0;j4;j+) if(i=j) zsum+=aij; if(i+j=3) fsum+=aij; printf(“zhu dui jiao xian he:%4d”,zsum); printf(“fu dui jiao xian he:%4d”,fsum); , 求两个矩阵之和,分析: 要求两个矩阵a、b的行列数相同。 对应元素之和: cij=aij+bij,#include void main(void) int a23=1,2,3,4,5,6; int b23=1,3,5,2,4,6, c23, i,j; for(i=0;i2;i+) for(j=0;j3;j+) cij=aij+bij; for(i=0;i2;i+) for(j=0;j3;j+) printf(“%4d”,cij); printf(“n”); , 矩阵的转置运算,矩阵转置的概念:,1 2 3 4 5 6 a,1 4 2 5 3 6 b,矩阵a转置为矩阵b。 b矩阵 行数 与a矩阵 列数 相同, b矩阵 列数 与a矩阵 行数 相同。 遍历所有下标赋值:b j i =a i j , 非方阵的转置,#include void main() int a34,b4

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论