C语言课件(王曙燕)chp6数组.ppt_第1页
C语言课件(王曙燕)chp6数组.ppt_第2页
C语言课件(王曙燕)chp6数组.ppt_第3页
C语言课件(王曙燕)chp6数组.ppt_第4页
C语言课件(王曙燕)chp6数组.ppt_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

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

文档简介

,第七章 数 组,C语言程序设计 第七章 数 组,7.1 一维数组,C语言中提供了一种构造类型数据数组,它有一组带下标变量组成。用数组存储数据,可利用循环改变下标值对各个变量进行相同的重复处理。,定义:数组元素只带一个下标 格式: 元素类型名 数组名数组长度=元素初值列表; 说明: 元素类型名定义数组中每个元素的类型,数组名的命名规则同变量名合法的标识符 中的数组长度表示该数组中包含的元素个数。应为常量表达式(常量和符号常量),不允许有变量 int a(10); float b10.0; int i; int ni+5;,C语言程序设计 第七章 数 组,#define N 5 int aN;,C语言程序设计 第七章 数 组,C语言中,数组元素的下标一律从0开始升序编排。,可选项“=元素初值列表”是给各元素赋初值,称为对数组进行初始化。 初值列表由逗号分割组成,列表含全部元素的初始值,int n10=1,2,3,4,5,6,7,8,9,10; int n10=1,1,1,1,1,1,1,1,1,1;,元素初值列表中仅含前面部分元素的初值,int n10=1,2,3,4,5; /*n5n9系统设置为0*/,如果元素初值列表含全部元素的初始值,可省略数组长度。数组长度由初值个数来自动确定,int a =0,1,2,3,4,5; /*数组长度为 */,6,存储方式:元素按下标的顺序连续分配在内存中,C语言程序设计 第七章 数 组,一维数组元素的引用 格式:数组名下标,注意:下标不能越界,main() int i,d9=1,2,3,4,5,6,7,8,9; i=d0+d8; d3=d0+dd3*2; d9=i; d0=di-d3; for(i=1;i=9;i+) printf(“d%d=%dn”,i,di); ,数组名表示每个数组的首地址 a 表示 &a0,C语言程序设计 第七章 数 组,一维数组应用举例 例7.1 将任意一个十进制数转换成二进制数,然后以二进制数形式 输出。 算法分析:1、十进制到二进制数转换原理,2、方法,C语言程序设计 第七章 数 组,main() int i=0,n,d40; scanf(“%d”, ,C语言程序设计 第七章 数 组,例7.2 从键盘输入10个学生的成绩,由高到低排序输出成绩。 算法分析:排序每趟选择最大值 设有n个数,排序方法如下: 第1趟:在n个数中找出最大数的放在第一个元素 第1个和其他n-1个元素逐个比较,有更大的则交换到第1个元素 第2趟:在n-1个数中找出第2大的数放在第二个元素 从第2个和其他n-2个元素逐个比较,有第2大的则交换到第2个元素 第 i趟:在剩下的n-i+1个元素中找出第i大的数,放在第i个元素 ,C语言程序设计 第七章 数 组,#define N 10 main() int dN; int i,j,t; printf(“Input %d scores:n”,N); for(i=0;iN;i+) scanf(“%d”, ,Input 10 scores: 74 87 67 78 62 75 96 91 88 The sorted scores: 96 91 88 87 81 78 75 74 67 62,【例7.3 】 用起泡法对10个数排序(从小到大),a0不用,数组下标从1开始 (1)比较第一个数与第二个数,若为逆序a1a2,则交换;然后比较第二个数与第三个数;依次类推,直至第n-1个数和第n个数比较为止第一趟起泡排序,比较n-1次,结果最大的数被安置在最后一个元素位置上 (2)对前n-1个数进行第二趟起泡排序,比较n-2次,结果使次大的数被安置在第n-1个元素位置 (3)重复上述过程,共经过n-1趟起泡排序后,排序结束 (4)结论:需要n-1趟起泡排序,第j趟需要n-j次比较,排 序 过 程,例,38,49,76,97,13,97,27,97,30,97,13,76,76,76,27,30,13,65,27,65,30,65,13,13,49,49,30,49,27,38,27,38,30,38,n=8,思考:,对于N个数,采用起泡排序,总共要比较多少次? 对于本来有序的序列,要比较多少次? 根据起泡排序的思想,写出数列 1 2 7 6 8 3 9 4 5一趟起泡排序后的序列?,(N-1)+(N-2)+.+1=N(N-1)/2,(N-1)+(N-2)+.+1=N(N-1)/2,1 2 6 7 3 8 4 5 9,#include main() int a11,i,j,t; printf(“Input 10 numbers:n“); for(i=1;iai+1) t=ai; ai=ai+1; ai+1=t; printf(“The sorted numbers:n“); for(i=1;i11;i+) printf(“%d “,ai); ,【例7.3 】 用起泡法对10个数排序(从小到大),起泡排序的核心程序段分析,for(j=1;jai+1) t=ai; ai=ai+1; ai+1=t; ,【例7.4 】 用简单选择法对10个数排序,(1)首先通过n-1次比较,从n个数中找出最小的, 将它与第一个数交换第一趟选择排序,结果最小的数被安置在第一个元素位置上 (2)再通过n-2次比较,从剩余的n-1个数中找出关键字次小的记录,将它与第二个数交换第二趟选择排序 (3)重复上述过程,共经过n-1趟排序后,排序结束,排 序 过 程,例,初始: 49 38 65 97 76 13 27 ,i=1,13,49,一趟: 13 38 65 97 76 49 27 ,i=2,27,38,六趟: 13 27 38 49 65 76 97 ,【例7.4 】 用简单选择法对10个数排序,#include main() int a11,i,j,k,x; printf(“Input 10 numbers:n“); for(i=1;i11;i+) scanf(“%d“, ,简单选择排序的核心程序段分析,for(i=1;i10;i+) k=i; for(j=i+1;j=10;j+) if(ajak) k=j; if(i!=k) x=ai; ai=ak; ak=x; ,查找第i 趟排序中最小值的位置,记录在k中,交换ai和ak的值,C语言程序设计 第七章 数 组,7.2 二维数组,定义格式: 元素类型名 数组名常量表达式1常量表达式2 =元素初 值列表; 说明: 常量表达式1表示行值,常量表达式2表示列值 int a45; float x52*4; 存放方式:按行存放(存放时,最右边的下标变化最快),int d35=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15;,d00 d01 d02 d03 d04 d10 d11 d12 d13 d14 d20 d21 d22 d23 d24,1 2 3 4 5 6 7 8 9 10 11 12 13 14 15,用选项“=元素初值列表”给各数组元素赋初值(初始化) 由逗号分割,前几行的元素必须连续填满,C语言程序设计 第七章 数 组,int a34=1,2,3,4,5,6,7,8,9,10,11,12;,int b34=1,2,3,4,5,6,7,8;,用 将每行元素括起来,int a34= 1,2,3,4 , 5,6,7,8 , 9,10,11,12 ;,int b34= 1,2,3,4 , 5,6,7,8 ;,用 将每行元素括起来,对部分元素赋初值,int a34= 1,2 , 3 , 8 ;,int a34=1,2 ,3 ,8;,C语言程序设计 第七章 数 组,定义数组的第一维的长度可省略(其他维长度决不能省略), 通过初值列表决定第一维的大小,int a 4= 1,2 , 3 , 8 ; int b 4=1,2,0,0,3,0,0,0,8,0,0,0; int c 23=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15;,czyx,C语言程序设计 第七章 数 组,二维数组元素的引用 格式:数组名行下标列下标 注意: 下标不能越界,0行、列下标减1 除函数调用语句外,其他语句都只能逐个引用数组元素, 不能单独用数组引用整个数组,不能给数组整体赋值。 数组先定义,后引用,C语言程序设计 第七章 数 组,例7.4 求两个矩阵A和B之和。,main() int A34=1,2,3,4,3,4,5,6,5,6,7,8; int B34=1,2,3,4,5,6; int i,j;,+,for(i=0;i3;i+) for(j=0;j4;j+) Aij+=Bij; for(i=0;i3;i+) for(j=0;j4;j+) printf(“%6d”,Aij); printf(“n”); ,C语言程序设计 第七章 数 组,说明: 如果不在数组定义时赋初值,数组元素必须逐个赋值。 用scanf()通过键盘输入时,数组元素名前加“&”。,int A34; for(i=0;i3;i+) for(j=0;j4;j+) scanf(“%d”,C语言程序设计 第七章 数 组,二维数组应用举例 例 将一个二维数组行和列元素互换,存到另一个二维数组中(转置矩阵)。,Bji=A ij,main ( ) int a23=1,2,3,4,5,6; int b32, i, j; printf(“array a: n“); for (i=0; i2; i+) for (j=0; j3; j+) printf(“%5d“, aij); bji=aij; printf(“n“); printf(“array b:n“); for (i=0; i=2; i+) for (j=0; j=1; j+) printf(“%5d“, bij); printf(“n“); ,C语言程序设计 第七章 数 组,例7.5 求两个矩阵A和B的乘积C,C00=A00*B00+A01*B10+A02*B20,C01=A00*B01+A01*B11+A02*B21,Cij+=Aik*Bkj;,C语言程序设计 第七章 数 组,main ( ) int A23=1,2,3,4,5,6; int B32=1,4,2,5,3,6; int C22, i, j,k; for (i=0; i2; i+) for (j=0; j2; j+) for(k=0;k3;k+) Cij+=Aik*Bkj; printf(“Array C=A*B:n“); for (i=0; i2; i+) for (j=0; j2; j+) printf(“%6d“, Cij); printf(“n“); ,Array C=A*B: 14 32 32 77,C语言程序设计 第七章 数 组,例7.6 输出杨辉三角形,1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 ,特点:0列和对角线元素都是1 其他元素均为上一行的同列元素与前一列元素之和,1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 ,C语言程序设计 第七章 数 组,#define N 6 main ( ) int i,j,yNN; for(i=0;iN;i+) yi0=1; yii=1; for(i=0;iN;i+) for(j=1;ji;j+) yij=yi-1j+yi-1j-1; for (j=0;jn-i+1;j+) printf(“ “); for(j=0;j=i;j+) printf(“%5d”,yij); printf(“n”); ,C语言程序设计 第七章 数 组,可以各行共同使用一个一维数组, 节省存储单元。先将0号元素置1, 其它元素置0, 一维数组中存储的是首行的值, 输出该行。再以此行的值为基础, 从后向前计算新行, 每个元素值等于原值与前一元素之和, 输出此行。然后, 重复此步骤, 直到所有行输出完为止。 程序如下: main() int a6=1; /* 定义数组,0号元素置1其它置0*/ int i,j; for(i=0;i0;j-) /* 从后向前 */ aj= aj+ aj-1; /*原值与前一元素之和*/ for(j=0;j=i;j+) printf(“%5d“, aj); printf(“n“); ,C语言程序设计 第七章 数 组,例7.8 从键盘输入8个学生三门课程的成绩求每个学生各门课的平均分,并按平均分从高到低的顺序输出每个学生各门课程的成绩和平均成绩。,分析:1、二维数组:第一维各学生 第二维各门成绩 2、排序,算法思路: 定义数组 int sN3;存储三门课程的成绩。 数组 float aN;存储平均成绩。 用for循环从键盘按行输入每个学生各门课的成绩,计算 出平均成绩并存入数组a对应下标的数组元素 用选择排序对平均成绩排序,交换时应整行交换,C语言程序设计 第七章 数 组,C语言程序设计 第七章 数 组,7.3 字符数组 元素类型是字符 定义格式 char 数组名数组长度 =元素初值列表; 说明 数组长度为常量表达式,char c10;,char a8=G,O,O,D;,初始化 直接分立的给出字符数组中的各字符(定义数组长度),C语言程序设计 第七章 数 组,可以去掉定义时的长度设置, 此时字符数组的长度等于 中的字符数。后面不会自动加字符串结束符0。,char x =I, ,a,m, ,a, ,s,t,u,d,e,n,t,.;,数组x的长度为15,后面无字符串结束符 0。,字符数组的引用 引用格式: 数组名下标; 说明: 引用一个元素相当于引用一个字符变量 与其他数组不同:除函数调用语句外,字符数组可整体用 于输入输出语句。,C语言程序设计 第七章 数 组,字符串 字符串常量 双引号括起来的字符序列 存储时与字符数组相似,将其中的字符顺序存放在连续的 内存单元中,并在最后自动加一个字符串结束符0 存储长度 = 字符序列长度 + 1,字符数组可用来存储字符串常量 要求:字符数组的长度应大于存在其中的有效字符序列的长度 有效长度(有效字符序列) 为了测定有效长度,C规定,用0作为字符串结束标志 字符串定义 字符数组中若没有结束符0,不能当字符串整体处理可能出错,C语言程序设计 第七章 数 组,字符数组的初始化(方法三) 用字符串常量给字符数组赋初值 将字符串常量放在初始化的 中,char x20=“I am a student.”;,也可省略 ,char x20=“I am a student.”;,也可去掉定义时的长度设置,char x=“I am a student.”;,char x=“I am a student.”;,注意:定义字符数组时,数组长度一定要大于实际使用的有效长度,如果用分立的字符初始化,同时去掉定义时的长度设置,并使字符数组存储字符串,则应在最后增加字符串结束符0,char x =I, ,a,m, ,a, ,s,t,u,d,e,n,t,., 0;,C语言程序设计 第七章 数 组,字符数组的输入和输出 用scanf()和printf()输入/输出字符数组时, 采用如下格式: %c逐个元素输入/输出字符(char) %s整体一次输入/输出字符(string) 用格式符%c 使用方法: 将scanf()和printf()放在循环中 “%c”指定格式,数组元素作输入/输出项(输入时加&) 例.9,C语言程序设计 第七章 数 组,用格式符%s整体输入字符串 在scanf()中用格式串“%s”指定格式时,用数组名作输入项,char c20; scanf(“%s”,c);,char s110,s210,s310; scanf(“%s%s%s”,s1,s2,s3);,char str20; scanf(“%s”,str);,C语言程序设计 第七章 数 组,用格式符%s整体输出字符串 在printf()中用格式串“%s”指定格式时,用数组名作输入项,char c=“How are you”; printf(“%s”,c);,char c=B, O, O, K; printf(“%s”,c);,注意: 如果数组长度大于字符串长度,则遇到0结束,char c40=“How are you”; printf(“%s?”,c);,只有字符数组可以整体输入/输出,其他类型的数组都不能整体输入/输出。,?,C语言程序设计 第七章 数 组,字符串处理函数 C语言程序库中提供了一些专门处理字符串的函数: gets(字符数组); 输入一行字符序列到字符数组 puts(字符串); 将字符串输出到终端 strcat(字符数组1,字符串2); 字符串连接 strcpy(字符数组1,字符串2); 复制字符串 strcmp(字符串1, 字符串2); 两个字符串比较 strlen(字符串); 测字符串长度,C语言程序设计 第七章 数 组,gets()字符串整行输入函数 格式: gets(字符数组); 功能: 从键盘将带空格的字符序列(以回车键结束)全部输入到指定的字符数组中,并自动加字符串结束符0。,char str40; gets(str);,puts()字符串整体输出函数 格式: puts(字符串); 功能: 将指定的字符串作为一行输出到终端。 puts(str)与printf(“%sn”,str)功能相同。 str可以是字符串常量或存有0的字符数组,字符串中可以有转 义字符。,char s=“I am a student.n You are a worker.“; puts(s); puts(“He is a teacher.“);,C语言程序设计 第七章 数 组,strlen()测字符串长度函数 格式: strlen(字符串); 功能: 返回字符串有效长度,不包括0。 strcmp()字符串比较函数 格式: strcmp(字符串1,字符串2); 功能: 对字符串1和字符串2从左至右逐个字符按其ASCII码值比较 若相等,返回整数0; 若字符串1的字符大,返回正整数 若字符串2的字符大,返回负整数,char s120= “teacher.“; printf(“%d %d“, strcmp(s1,“teacher.“), strcmp(“abcd“,“abccd“);,C语言程序设计 第七章 数 组,strcpy()字符串复制函数 格式: strcpy(字符串1,字符串2); 功能: 将字符串2包括0复制到字符数组1中 函数返回值为字符数组1的首地址 注意: 字符数组1应该有足够的长度, 以便能存放下字符串2。,char s120 strcpy(s1,“teacher.“); puts(s1);,运行时输出: teacher.,C语言程序设计 第七章 数 组,strcat()字符串连接函数 格式: strcat(字符数组1,字符串2); 功能: 将字符串2连接到字符数组1中的字符串后面 函数返回值为字符数组1的首地址 注意: 字符数组1应该有足够的长度, 以便能存放下连接后的字符串2。 连接时字符数组1中的字符串尾0被覆盖,两个字符串连接为一 个,在字符数组中只保留新字符串后的0。,char s120= “You are a “; puts(strcat(s1,

温馨提示

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

评论

0/150

提交评论