C语言PPT课件-第6章数组.ppt_第1页
C语言PPT课件-第6章数组.ppt_第2页
C语言PPT课件-第6章数组.ppt_第3页
C语言PPT课件-第6章数组.ppt_第4页
C语言PPT课件-第6章数组.ppt_第5页
免费预览已结束,剩余50页可下载查看

下载本文档

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

文档简介

引言 一维数组的定义和引用 二维数组的定义和引用 字符数组与字符串,第6章 数 组,6.0 引言,一、数组的引入 为了便于处理一批类型相同的数据,引入了数组类型.,假设现在要保存每个学生的成绩,那就需要40个变量,但这样一来输入、输出、计算都会变得繁琐. 在这种情况下,我们可以使用数组类型,声明一个含有40个元素的数组,每个数组元素存放一个成绩,成绩的输入、输出、计算都可通过循环来实现.,例:某班有40名学生,求该班成绩的平均分,#include main( ) int j , sum , s ; float ave ; sum=0; for(j=1; j=40 ; j+) scanf(“%d”, ,二、数组的概念 1.数组:由具有相同类型的 固定数量的元素组成的结构,2.数组元素:每一个数组元素 都是一个变量,为了与一般 的变量相区别,我们称数组 元素为下标变量,3.下标变量在数组中的位置 序号称下标,c语言中下标 从0开始,#include main( ) int j , sum , s40 ; float ave ; sum=0; for(j=0; j=39 ; j+) scanf(“%d”, ,6.1 一维数组的定义和引用,一、 一维数组的定义 1. 格式 : 类型标识符 数组名 常量表达式 ; 例: int a10 ; float b10 , c5;,2. 说明 (1) 数组名是用户定义的标识符, 数组名表示了一个存储区的首地址 (即第一个数组元素的地址),(2) 常量表达式 : 指数组中元素的个数,(3) 数组元素的下标由零开始 数组a 有10个元素: a0 , a1 a9,(4) 定义时中不能包含变量, 中常量表达式的值不能是实数.,1. 引用形式 : 数组名 下标 ,注意: 如果出现 a5 = 72 ; 编译时不会 指出错误, 系统会将a4后下一个 存储单元 赋值为72, 但这样可能 会破坏数组以外其他变量的值,a5,1020,2. 说明 (1) 下标可以是整型常量或整型表达式 如: a1 , a2*3 int i=2; ai,下标不要超范围 数组定义为 int a5 , 数组长度为5 而下标在0 - 4之内, 即a0 - a4,二、 数组元素的引用,(3) 数组元素地址表示 &ai, &a0即a,例1 输入10个数放入一个数组,然后逆序输出。,main( ) int i, a10; for (i=0; i=0; i-) printf(“%4d”,ai); ,三、 一维数组的初始化 1. 概念 : 在定义一维数组时对各元素指定初始值称为数组的初始化,如: int a5 = 1 , 3 , 5 , 7 , 9 ;,2. 说明 对数组的全体元素指定初值, 初值用 括起来, 数据 之间用逗号分开. 在这种情况下, 可以不指明数组的 长度, 系统会根据 内数据的个数确定数组的长度 如 : int a = 1 , 3 , 5 , 7 , 9 ;,(2) 对数组中部分元素指定初值 ( 这时不能省略数组长度 ) 如 : int a5 = 1 , 3 , 5 ; 从前往后,后面元素自动赋0,(3) 使数组中的全部元素初始值都为 0 如: int a5 = 0 , 0 , 0 , 0 , 0 ;,更简单的写法: int a5= 0 ;,讨论:以下几种用法是否正确?,3. int a5; a= 1, 2, 3, 4, 5 ;,4. int a10; float i=3; ai=10;,1. char name0; float weight10.3; int array-100;,6.int i, a5; for(i=0;i5;i+) scanf(“%d”,2. int i=5; int ai= 1, 2, 3, 4, 5;,5. int a5; scanf(“%d”,例2: 用数组求fibonacci数列的前20个数,#include main( ) int i , f20=1,1; for ( i=2 ; i20 ; i+) fi=fi-2+fi-1; for ( i=0; i20 ; i+) if ( i%5=0 ) printf(“n”); printf(“%12d”, fi ); ,f0 f1 f2 f3 f4 f5 : f19,2,3,5,8,6765,i=2 f2=f0+f1,i=3 f3=f1+f2,i=4 f4=f2+f3,例3: 输入一个数据,在已知数组中查找是否有该数据,9,a0 a1 a2 a3 a4 a5 a6 a7 a8 a9,#include main() int i , x ; int a10= 5, 8, 0, 1, 9, 2, 6, 3, 7, 4 ; scanf(“%d”, ,例4: 用冒泡排序法对6个数进行排序(从小到大),a0 a1 a2 a3 a4 a5,2,7,7,5,4,7,1,4,5,1,5,1,4,1,2,冒泡排序方法: 依次比较相邻的两个数,将小数放前面,大数放后面. n个数排序需要进行n-1轮比较, 从第1轮到第n-1轮, 各轮的比较次数依次为:n-1次、n-2次 1次,9,9,9,9,9,7,2,5,4,1,初始状态,第1轮,第2轮,第3轮,第4轮,第5轮,7,#include main( ) int a6 , i , j , t; for ( i=0 ; iaj+1 ) t=aj ; aj=aj+1 ; aj+1=t ; for ( i=0 ; i6 ; i+) printf( “%3d”, ai ); ,输入6个数据,用嵌套的for循环实现排序 外层循环控制进行几轮比较 内层循环控制每轮的比较次数,如果前面的数大于后面的数,则进行交换,否则不做任何改变,输出排序后的6个数据,如何推广到任意个数排序?,#include main( ) int a6 , i , j , t; for ( i=0 ; iaj+1 ) t=aj ; aj=aj+1 ; aj+1=t ; for ( i=0 ; i6 ; i+) printf( “%3d”, ai ); ,a0 a1 a2 a3 a4 a5,第1轮,第2轮,第3轮,第4轮,第5轮,在进行完第二轮比较后,实际上排序已经完成了,从第三轮开始,后面的比较都是多余的。 在这种情况下我们希望可以提前终止比较.,初始状态,冒泡排序法的特殊情况,为了解决问题,设置一个变量flag,用它记录在一轮比较中是否进行了交换。 在每轮比较开始前flag=0,如果在此轮比较中进行了交换,则flag=1,在一轮比较结束后,判断flag的值是否为1,如果值为0,说明在此轮比较中没有进行交换(即已经完成排序了),此时可以终止循环(即结束排序)。如果flag的值为1,则要继续进行排序。,#include main( ) int a6 , i , j , t , flag; for ( i=0; iaj+1 ) t=aj ; aj=aj+1 ; aj+1=t ; flag=1; i+ ; while ( flag ) ; for ( i=0 ; i6 ; i+) printf( “%3d”,ai ); ,例5: 用选择排序法对6个数进行排序(从小到大),a0 a1 a2 a3 a4 a5,选择排序方法: 第1轮比较时,用a0依次与a1到a5 进行比较,如果a0较大则进行交换,否则不变。第1轮结束 后,a0中为最小数. 以后各轮比较过程与第1轮类似.,7,9,5,7,4,5,2,4,7,9,5,7,4,5,7,2,9,7,1,2,初始状态,第1轮,第2轮,第3轮,第4轮,第5轮,7,9,5,7,#include main( ) int a6 , i , j , t; for ( i=0 ; iaj ) t=ai ; ai=aj ; aj=t ; for ( i=0 ; i6 ; i+) printf( “%3d”, ai ); ,i=0 时, 要进行5次比较, a0与a1比, a0与a2比 a0与a5比, 最后a0 中为最小数,i=1 时, 要进行4次比较, a1与a2比, a1与a3比 a1与a5比, 最后a1 中为第2小的数,i=2 时, 要进行3次比较, a2与a3比, a2与a4比, a2与a5比, 最后a2 中为第3小的数 ,用嵌套的for循环实现排序 外层循环控制进行几轮比较 内层循环控制每轮的比较,a0 a1 a2 a3 a4 a5,9,1,初始状态,第1轮,第2轮,第3轮,第4轮,第5轮,选择排序法第二种方法(从小到大),第二种方法: 每轮比较,用p记录所有未排序元素的最小值的下 标,然后将ap与第一个未排序元素交换位置,将其提到前面 排好序.,2,7,4,7,main() int a6 , i , j , p , temp; for( i=0 ; i6 ; i+) scanf(“%d“, ,第1轮比较时,找到所有元素的最小值ap,然后将a0与ap交换,则第1轮结束后,a0中为最小数. 找最小值ap的方法:令p=0,扫描a1a5,有小于a0的即令p记录其下标,否则p不变.之后比较ap与剩余元素,若有比ap小的,则改变p值,否则p不变.该轮比较结束时,p记录的就是最小值的下标.,其他几轮与此类似,只是不要再动已排好的元素.,6.2 二维数组的定义和使用,一、 二维数组的定义 1. 概念 : 一个一维数组, 它的每一个元素都是类型相同 的一维数组, 就形成一个二维数组,2. 定义形式 : 类型说明符 数组名 常量表达式1 常量表达式2 ; 如: int a34 ;,二维数组理解,每个元素ai由包含4个元素 的一维数组组成,二维数组a是由3个元素组成,3. 存储形式 : 数组的元素在内存中是连续存放的 int a33 ; 的存放形式如下 :,a10a11a12,a20a21a22,a00a01a02,a00 a01 a02 a10 a11 a12 a20 a21 a22,1010 1012 1014 1016 1018 1020 1022 1024 1026,二、 二维数组的引用 数组元素的表示形式 : 数组名 下标 下标,注意 : (1) 每个下标都要用 括起来 如 a 2 1 不能写成 a 2,1 (2) 下标从0开始,且不要超过 定义的范围,三、 二维数组的初始化定义同时赋初值 1. 分行初始化 int a34= 1, 2, 3, 4 , 5, 6, 7, 8 , 9, 10, 11, 12 ; 此方法较直观, 第一对 内的数据赋给 第一行数组元素, 依次类推,2. 按数据的排列顺序对数组元素赋初值 int a34= 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12; 将数据依次赋给元素 a00 , a01 a23,注意: 此方法数据无明显的界限, 当数据较多时容易出错,3. 对数组的部分元素赋初值,未赋值元素自动取0 int a34= 1,2 , 3 ,4,5,6 ;,int a34= 1,2,3,4,5,6 ;,4. 对数组的全部元素赋初值时可以省略第一维的长度(行下标), 系统会根据数据的个数和第二维的长度自动求出第一维长度, 但第二维下标不可省. int b 2= 1, 2, 3, 4, 5, 6, 7, 8 ;,数组a 第一维长度为 3,数组b 第一维长度为 4,如仅对部分元素赋初值,要想省略数组的行数,则必须分 行赋值。 int a 4= 1, 2 , 0, 3, 4 , 5 ;,例6: 找出34矩阵中最大的数,并输出其行号和列号,max,0,row,0,col,5,9,3,0,12,1,2,#include main( ) int i , j, row=0, col=0 , max ; int a34=5,2,0,9,3,7,12,6,10,4,1,8; max=a00; for ( i=0 ; imax ) max=aij ; row=i ; col=j ; printf(“max=%dn”, max); printf(“max=a%d%dn”, row , col); ,输出: max=12 max=a12,10 4 1,3 7 12,5 2 0,例7: 将一个矩阵进行转置(即原来的行变为列),第一种情况:矩阵是对称的。,0 1 2,0 1 2,0 1 2,0 1 2,3 7 12,10 4 1,5 2 0,main() int a33,i,j,t; for(i=0;i=2;i+) for(j=0;j=2;j+) scanf(“%d“, ,3 7 12 6,10 4 1 8,5 2 0 9,第二种情况:矩阵是非对称的。,#include main( ) int a34, b43 , i , j ; for ( i=0 ; i3 ; i+ ) for ( j=0 ; j4 ; j+ ) scanf(“%d”, ,a02,b20,a21,b12,例8 读入下表中值到数组,分别求各行、各列及表中所有数之和,main() int x54,i,j; for(i=0;i4;i+) for(j=0;j3;j+) scanf(“%d“, ,main() int k , a10; for(k=0;k10;k+) scanf(“%d”, ,6.3 字符数组和字符串,字符串常量: “china“,c语言中不能定义出字符串变量。字符串在内 存的存储位置以及存储空间通过什么方式才能 得到呢?字符数组:每个元素的类型为char型, 即字符型。,字符串指若干有效字符的序列,可以包括 字母、数字、转义字符等,字符串用0 作为结束标志,回忆字符串知识,一、字符数组 1. 定义 例 char c10, ch34;,2. 字符数组的初始化 1). 逐个字符赋值 2). 用字符串常量,6.3 字符数组和字符串,二、一维字符数组与一个字符串 1、用一维字符数组存放一个字符串,char s15= c, h, i, n , a ; char s210= c, h, i, n , a ; char s3 =c, h, i, n , a ,0 ;,数组名:字符串在内存的地址。,二、一维字符数组与一个字符串 1、用一维字符数组存放一个字符串,char s15= c, h, i, n , a ; char s210= c, h, i, n , a ; char s3 =c, h, i, n , a ,0 ;,等价于: char s210= “china“ ; char s3 = “china“ ;,作为字符串进行存储时,字符串与字符数组的长度可以 不等,系统自动加0为结束标志。,不能写成: char s15= “china“ ; 用字符串作初值时,数组的长度应足够 大以便能容纳全部字符和0。,也不能写成: char s180, s280 ; s1 = “china“ ; s2 = s1 ;,二、一维字符数组与一个字符串 2、字符串的输出,方法一: 用%c依次输出字符串中的每个字符。,/*第2个表达式也可以写成 si!=0*/,#include main() int i; char s80= “china“ ; for(i=0; si!=0 ; i+) printf(“%c“, si ); ,/* putchar(si); */,二、一维字符数组与一个字符串 2、字符串的输出,方法二: 用printf()的%s一次输出整个字符串,遇到0结束,#include main() char s180 = “c language“ , s280= “program“; printf(“%s“, s1); printf(“%s“, s2); ,/*%s对应的输出项为字符串的存储地址 */,运行结果为: c languageprogram,main( ) char a5=h,e,l,l,o; printf(“%s”,a); ,main( ) char a =“hello”; printf(“%s”,a); ,结果:hello#-=*,结果:hello,printf的s输出字符串,main() char a=h,e,l,0,l,o,0; printf(“%s“,a); ,输出:hel,数组中有多个0时,遇第一个结束,用“%s”输出时,遇0结束,二、一维字符数组与一个字符串 2、字符串的输出,方法三: 使用puts()函数一次输出整个字符串,#include main() char s180 = “c language“ ; puts(s1); puts(“programe“ ); ,/* 参数为字符串的存储地址 */,运行结果为: c language programe,/* 参数为字符串常量 */,注意:puts()函数输出字符串后自动换行,二、一维字符数组与一个字符串 3、字符串的输入,方法一: 使用scanf()的%s整体输入,空格或回车结束,#include main() char st15; printf(“input string:n“); scanf(“%s“, st ); printf(“%sn“, st ); ,第一次运行程序: input string: china china,注意: (1)字符串不能包括空格。,再次运行程序: input string: this is a book this,(2)不需要键入双引号。,(3)输入串长度要小于数组长度。,二、一维字符数组与一个字符串 3、字符串的输入,方法二: 使用 gets() 函数,只以回车键结束输入,#include main() char st15; printf(“input string:n“); gets(st); printf(“%sn“, st ); ,第一次运行程序: input string: china china,再次运行程序: input string: this is a book this is a book,讨论:scanf()的%s与gets() 函数的区别?,使用scanf()的%s整体输入,空格或回车结束 使用 gets() 函数,只以回车键结束输入,二、一维字符数组与一个字符串 4、字符串运算函数的使用 #include ,(1)求一个字符串的实际长度函数:strlen() 格式: strlen(字符数组名),程序的运行结果: m is 10 n is 80 c language,#include “string.h“ main() int m,n; char st80=“c language“; m=strlen(st); n=sizeof(st); printf(“m is %dn n is %dn “,m,n); for(i=0;im;i+) printf(“%c“,sti); ,二、一维字符数组与一个字符串 4、字符串运算函数的使用,(2)两个字符串的比较函数:strcmp() 格式: strcmp(s1,s2),功能:比较s1和s2所指的两个字符串的大小 若字符串s1s2,函数返回值为0。 若字符串s1s2,函数返回值为正数。 若字符串s1s2,函数返回值为负数。,字符串比较的规则: 比较两个字符串中从左到右依次对应字符的 ascii码值,char s80= “ibm“; int n; if(strcmp(s, “ computer “)0) n=1; if(strcmp(s, “ computer “)=0) n=0; if(strcmp(s, “ computer “)0) n=-1;,二、一维字符数组与一个字符串 4、字符串运算函数的使用,(3)字符串拷贝函数:strcpy() 格式: strcpy (s1,s2);,功能:把s2所指的字符串拷贝到s1中, 串结束标志0也一同复制。,#include“string.h“ main() char s180; strcpy(s1, “c language“); puts(s1); strcpy( ,程序的运行结果: c language clanguage china,思考与讨论,问题:编程实现将一个字符串(如:“abcabccbacba“ )中所有的字符c删除。,#include #include main() char s80=“abcabccbacba“; int k=0; while(sk!=0) if(sk=c) strcpy( ,二、一维字符数组与一个字符串 4、字符串运算函数的使用,(4)字符串连接函数:strcat() 格式: strcat (s1,s2);,功能:把s2所指的字符串(包括串结束标志0)连接到s1 所指的字符串的有效字符后面。s1要足够大。,#include“string.h“ main() char s130=“my name is “,s210= “wang“; strcat(s1,s2); puts(s1); puts(s2); ,即从s1所指的字符串的结束标志0处存放s2所指的字符串。,运行结果: my name is wang wang,strcpy与strcat举例,#include #include void main() char destination25; char blank = “ “, c = “c+“, turbo = “turbo“; strcpy(destination, turbo); strcat(destination, blank); strcat(destination, c); printf(“%sn“, destination); ,turbo c+,#include #include main() char str1 = “hello!“, str2 = “how are you?“,str20; int len1,len2,len3; len1=strlen(str1); len2=strlen(str2); if(strcmp(str1, str2)0) strcpy(str,str1); strcat(str,str2); else i

温馨提示

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

最新文档

评论

0/150

提交评论