




已阅读5页,还剩49页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第七章 数 组(The Array),掌握一维数组、二维数组的定义、初始化和引用。 掌握字符串和字符数组的概念及其处理函数。 掌握用数组进行编程的技术。,先看一个例子:,例:给出10个儿童的体重,要求计算平均体重 并打印出低于平均体重的数值。,用变量来解决问题: main() int w1, w2, w3, w4, w5, w6, w7, w8, w9, w10; int t; scanf( “%d%d%d%d%d%d%d%d%d%d“,t=(w1+w2+w3+w4+w5+w6+w7+w8+w9+w10)/10; if( w1 t ) printf( “%dn“, w1 ); if( w2 t ) printf( “%dn“, w2 ); if( w3 t ) printf( “%dn“, w3 ); if( w4 t ) printf( “% dn“, w4 ); if( w5 t ) printf( “%dn“, w5 ); if( w6 t ) printf( “%dn“, w6 ); if( w7 t ) printf( “%dn“, w7 ); if( w8 t ) printf( “%dn“, w8 ); if( w9 t ) printf( “%dn“, w9 ); if( w10 t ) printf( “%dn“, w10 ); ,用数组来解决问题: main() int w10; /* 定义 1 个整型数组存放体重 */ int t, i; for( i=0; i10; i+ ) scanf( “%d“, ,数组及其相关概念,数组是一组有序的、类型相同的数据的集合,这些数据被称为数组的元素。,数组下标,每个数组都有一个名字,称之为数组名。 为标识数组中的每个元素,需要对它们进行编号,称为数组元素的下标。,下标使数组元素在数组中的位置(或排列顺序)被唯一地确定下来;用数组名加上下标可以准确地访问数组中的某个元素。,如:w0代表数组w中的第一个元素 w9代表数组w中的第十个元素,注意:C语言规定下标从0开始。,说明:数组名代表数组的起始地址。 数组元素在内存中是连续存储的。,7.1 一维数组的定义和引用 (One Dimension Array),一、一维数组的定义,指明数组元素的数据类型,指明数组所含的元素个数,例如:int a10; /*定义的整型数组a含10个元素*/ float b20; /*定义的实型数组b含20个元素*/,说明:, 数组名的命名规则同变量名的命名规则一样;,数组名后用方括号 ,不能用();,常量表达式必须是大于0的整型常量表达式,不 能包含变量,即其大小不依赖运行过程中变量值; (4)定义数组时,数组的长度必须是确定的,C语言 不允许对数组的大小作动态定义,。,int a(10);,例如:,int n; int an,char name0; float weight10.3; float array-100;,二、一维数组的初始化,1 .定义时初始化,方法:将初值依次写在花括号 内。,如: int a5= 2 , 4 , 6 , 8 , 10 ;,存储形式:,存储单元,说明:,如果定义一维数组时给出了全部元素的初值,则数组的下标允许省略。此时编译系统自动根据初始化数据的个数来确定数组的长度。,如: int a = 2 , 4 , 6 , 8 , 10 ;,int a ; ,初始化的数据个数允许少于数组的长度,但不 能多于数组的长度。当初始化的数据个数(至 少要有一个)少于数组的长度时,未初始化部 分将被编译系统自动用 0 赋值。,如:int a5= 2 , 4 ;,相当于:a0=2, a1=4, a2=0, a3=0, a4=0,int a5=1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ; ,2 .使用其它方法初始化,利用输入语句初始化 main() char as26; int i ; for(i=0; i26; i+) scanf(“%c“, . ,利用赋值语句初始化 main() char as26,ch; for(ch=A;ch=Z;ch+) asch-A=ch; . ,三、一维数组的引用,数组元素类似于单个变量,可以自由地存取。但是,它与一般变量相比,有以下特殊之处:, 数组元素是通过数组名加上该元素在数组中的位置(即数组元素的下标)来访问的。,如: a3,其中,下标可以是整型常量、整型变量或整型表达式。,如: int a10 ; float i=3 ; ai=10 ;, 数组元素的下标是从0开始的。 如果定义了an,则可使用a0、a1、an-1。但是,不能使用an。 C语言编译系统不检查数组下标越界的错误,在编程的时候要注意避免这种错误。,如:int a2; scanf(“%d,%d”, 数组元素的赋值是逐个元素进行的,不允许把一个数组作为一个整体赋给另一个数组。除了数组初始化外,也不允许用在花括号中列表的方式对数组整体赋值。,例1: int a5= 2 , 4 , 6 , 8 , 10 , b5 ; b5=a5 ;,例2 :int a5 ; a5= 2 , 4 , 6 , 8 , 10 ;, 数组名a代表的是数组a在内存中的首地址,因此,可以用数组名a来代表数组元素a0的地址。,四、一维数组应用举例,例1:从键盘上输入10个实型数存入数组,然 后按输入顺序的逆序输出这10个数。,main() float a10; int i; for(i=0 ; i=0 ; i-) printf(“%10.2f”,ai); ,例7.2:用数组来处理求斐波纳契数列: 1,1,2,3,5,8的前20个数。,main() int f20=1,1; for(i=2 ; i20 ; i+) /*f2是数组第3个元素*/ fi=fi-2+fi-1; for(i=0 ; i20 ; i+) printf(“%10d”,fi); if(i%2=0) printf(“n”); /*每行打印2个数*/ ,数学表示:f(0)=f(1)=1, f(n)=f(n-2)+f(n-1),例7.3:用冒泡法对n=6个数排序(由小到大)。,冒泡法的思路是:将相邻两个数比较,将小的 调到前头。,9 8 8 8 8 8 8 9 5 5 5 5 5 5 9 4 4 4 4 4 4 9 2 2 2 2 2 2 9 0 0 0 0 0 0 9,第一轮排序,比较了5次 ,获得第一次结果。,轮数 剩数 比较次数 j= n-j+1 n-1 1n-1 1 6 5 2 5 4 3 4 3 4 3 2 5 2 1,main() int a7, i , j , t ; printf(“Input 6 numbers : n“); for(i=1 ; iai+1) t=ai; ai=ai+1; ai+1=t; for(i=1 ; i=6 ; i+) printf(“%d“,ai); ,main() int a6, i , j , t ; printf(“Input 6 numbers : n“); for(i=0 ; iai+1) t=ai; ai=ai+1; ai+1=t; for(i=0 ; i=5 ; i+) printf(“%d“,ai); ,7.2 二维数组的定义和引用,先看一个例子: 某校近三年招收各专业本科生人数如下:,计算机 电子 管理 数学 1999 90 40 80 30 2000 100 50 90 40 2001 95 45 100 50,要把这些数据组织起来,可以有两种选择:,按从左到右从上到下的顺序存入一个一维数 组中。(查询困难),每年用一个一维数组,把这些数据分别存入 三个数组中。 (增加一年数据困难),一、二维数组的定义,如: int a34;,说明:,二维数组除了维数比一维数组多一维外, 其它性质与一维数组是全部类似的。,看看下面写法是否正确?, int a03;,用于定义数组长度的常量表达式的值必须是大于0的正整数。, int i=3 , j=4 ; int aij ;,定义数组元素的个数必须使用常量表达式,而不能使用变量。,二、二维数组的初始化,这里主要介绍定义时初始化,其它方法初始化和一维数组类似。定义时初始化有两种方法:,分行初始化,例如:int a23=1 , 2 , 3 , 4 , 5 , 6 ;,省略掉内层的花括号 即按数组元素在内存中排列的顺序赋初值。,例如:int a23=1 , 2 , 3 , 4 , 5 , 6 ;,说明:, 对二维数组初始化时,可以只对部分数组元素初始化,未被初始化的数组元素将自动赋 0 。,对二维数组初始化时,如果对全部元素都赋初值,或分行赋初值(每行至少一个数据),则可以省略第一维数组长度。但是,第二维数组长度不允许省略。,int a10=1,0; float f2=1.1,2.2;,三、二维数组的引用,与引用一维数组元素一样,是用下标法引用二维数组元素的。,例如:若有 int a2*53*4, i=15; 则使用 a3*30, a1i-5都是合法的。,说明: (1)数组名a代表的是a在内存中的首地址,因此可以用数组名a来代表数组元 素a00的地址。,例如:若有 int a34, 设a的首地址为2000,则aij的地址为2000+i*3+j*4; a00的地址为2000,与a相同。 (2)二维乃至多维数组是若干个比其低一维的数组的集合。换句话说,二维乃至多维数组可以化成多个降低维数后的数组使用。 例如:若有 int a34,则等价于有了3个一维整型数组a0,a1,a2。,四、二维数组应用举例,例1:使用数组保存“九九乘法表”,然后输出。,main() int a991010, i, j ; for(i=1; i 10; i+) for(j=1; j=i; j+) a99ij=i*j; for(i=1; i10; i+) for(j=1;j=i; j+) printf(“%6d“,a99ij); printf(“n“); ,main() int a23=1,2,3,4,5,6; int b32, i,j; printf(“ array a:n“); for(i=0;i=1;i+) for(j=0;j=2;j+) printf(“%5d“,aij); bji=aij;, printf(“n“); printf(“n array b:n“); for(i=0;i3;i+) for(j=0;j2;j+) printf(“%6d“,bij); printf(“n“); ,例7.5:求3*4数组中的最大值及其下标。,main() int max,row,colum,i,j; int a4=1,2,3,4,9,8,7,6,-10,10,-5,2; max=a00; for(i=0;imax) max=aij; row=i; colum=j; printf(“max=%d,row=%d,colum=%d“,max,row,colum); ,7.3 字符数组和字符串 (Character Array and Strings),一、字符数组(Character Array ),当数组的元素类型为字符型时,被称为字符数组。,如:char c10; 则c为字符数组。,字符数组的定义、初始化和元素的引用与一般的数组相同。,如:main() char ch5=c, h , i , n , a; for(i=0; i5; i+) printf(“%c”,chi); ,说明:,定义字符数组的类型说明符一般为char, 如: char c10; 由于字符型与整型的互相通用性, 因此,上面定义也可改为:int c10;,初始化赋值的字符个数允许少于字符数组的长度,但不能多于字符数组的长度。当初始化赋值的字符数(至少要有一个)少于字符数组的长度时,未初始化部分将被编译系统自动用空字符0 赋值。,如:int c8=H,e,l,l,o; 则:c0=H, c1= e, c2= l, c3= l, c4= ,o c5=0, c6=0, c7=0,二、字符串与字符数组,字符串常量是用双引号括起来的一串字符,由系统自动加上一个字符串结束标志0。它占内存,但不记入字符串长度。,如:“china” 占内存6个字节,但字符串长度是5,在C语言中用字符数组来处理字符串,每个数组元素存放一个字符型数据。,字符型数组可用一般数组的初始化方式初始化外,还可以使用字符串常量初始化:,如:char message=“Hello”; 或 char message=“Hello”; ,(这时,字符数组长度是6,字符串长度是5。),注意:它与一般初始化方式: char message=H, e, l, l, o; 初始化的结果是不同的。,说明:字符数组本身并不要求它的最后一个元素一定是0,例如:char ch2=A, B;是合法的。当定义字符数组用字符串常量赋初值时,最后有一个元素其值为0。为了使处理方法一致,在字符数组中也常常人为地加上一个值为0的元素。,如:char message=H, e, l, l, o, 0;,例7.7 输出一个钻石图形 main() char diamond5 = , ,*, ,*, ,*, *, , , ,*, ,*, ,*, , ,*; int i,j; for(i=0;i5;i+) for(j=0;j5;j+) printf(“%c”,diamondij); printf(“n”); ,* * * * * * * *,三、字符数组的输入输出,字符数组的输入输出可以有以下两种方法:,逐个字符输入输出 用格式符“%c”输入或输出一个字符。,将整个字符串一次输入或输出 用格式符“%s”输入输出字符串。,例如:char c=“Hello” ; printf(“%s”, c) ;,注意:,输出字符不包括结束符0。,用“%s”格式符输出字符串时,printf函数的 输出项是字符数组名,而不是数组元素名。,main() char a5; int i=0; while(i=4) scanf(“%c”, ,输入数据: abc cdg,main() char a5; int i=0 scanf(“%s”,a); printf(“%s”,a); ,a0,a1,a2,a3,a4,a,b,c,0,0,a1,a2,a3,a4,a,b,c,c,a0,输出字符数组时,遇到第一个0 ,输出就结束。,用“%s”格式符输入字符串时,scanf函数的输出项 是字符数组名时,不要再加地址符&,因为C语言 中数组名代表该数组的起始地址。,如: char str10; scanf(“%s”,用“%s”格式符输入字符串时,scanf函数的输入项是 字符数组名时,从键盘输入的字符串应短于已定义 的字符数组的长度。系统自动在后面加 个0结束符。,利用scanf函数输入多个字符串时,是以空格、回车、跳格分隔。因此不要试图利用scanf函数从键盘输入How are you? 赋给一个字符串。 例如,如果要输入How are you? 给一个字符串,则必须: Char str15,str25,str35; Scanf(“%s%s%s”,str1,str2,str3);,H o w 0,a r e 0,y o u ? 0,四、字符串函数,、字符串输入输出函数,1.字符串输入gets()函数,功能:从终端输入一个字符串(直到回车键) 到字符数组中。,例如:char str20; gets(str); 若从键盘输入:Hello World! 则将字符串“Hello World!”送到字符数组str中。,2.字符串输出puts()函数,功能:将一个字符串输出到终端。在输出时,将字符串结束标志转换成n, 即输出 完字符串后换行。,例如:char str=“ChinanBeijing”; puts(str); 输出:China Beijing,注意:使用puts和gets函数前,要用预编译命令: #include “stdio.h”。,、字符串处理函数,1. 求字符串长度strlen()函数,功能:计算字符串长度,函数值是字符串中0 之前的字符个数(不包括0字符)。,例如:char str80=“abn012/” ; printf(“%d”,strlen(str) ;,输出:10,char str80=“abn0y012/” ; printf(“%d”,strlen(str) ;,输出:3,注意:使用这些函数前,要用#include “string.h”,2. 字符串比较strcmp()函数,其中,字符串可以是字符串常量或字符数组。,功能:比较两个字符串。,比较的原则:两个字符串从左至右逐个对应字 符按其 ASCII码值大小相比较, 直到出现不同的字符或遇到0为止。,例如:char str120, str210 ; (将str120和str210赋初值) if(strcmp(str1,str2)0) puts(str1);,注意:不能写成 if(str1str2),strcmp(“China”,”Korea”);,3.字符串连接strcat()函数,功能:连接两个字符串,把字符串2连接到字符 串1的后面,连接后的字符串放在字符 数组1中。,说明:字符数组1必须足够大以便能够容纳字符串2。 连接时只在新串最后保留一个0。,4. 字符串复制strcpy()函数,功能:将字符串2复制到字符数组1中 (其后自动加一个0)。,例如:char str120, str210 ; strcpy(str1,“hello world”); strcpy(str2,str1);,其中,字符串2可以是字符串常量或字符数组。,Strcpy使用举例:,#include #include main() char filewing20=“wing.txt”,filehori20=“fuselage.txt”,filefuse20=“tail.txt“; coutnumpart; switch(numpart) case 1: strcpy(filedes,filewing);cout“正在计算机翼, 请稍等”;break; case 2: strcpy(filedes,filehori);cout“正在计算机身, 请稍等“;break; case 3: strcpy(filedes,filefus1);cout“正在计算尾翼, 请稍等“;break; case 4: default; ifstream in(filedes,ios:in); if(!in)cout“cannot open Inputfile “n;exit(1); ,说明:,字符数组1必须足够大以便能够容纳被 复制的字符串。,不能用赋值语句将一个字符串常量或字符 数组直接赋值给一个字符数组。,例如:char str120, str220; str1=“hello”; str2=str1 ;,五、字符数组应用举例,例1:(例题7.8)统计字符串中的单词数。,#include main() char string81,c; int i,num=0,word=0; gets(string); for(i=0;stringi!=0;i+) if(stringi= ) word=0; else if(word= =0)word=1;num+; printf(“nThere are %d words.”, num); ,I am a boy,s0,word=0 (后面是单词),s= ,word=0,num+ word=1 (后面不是单词),Y,Y,N,Y,N,N,I am a boy,学习数组这一章要注意的几个问题: 1.在C语言中数组的下标是从0开始; 2.C语言不进行下标的越界检查,不论是在编译阶段还是 在运行阶段,这个问题交给程序员。这样就给初学者 带来一定的风险。 3.数组名是地址,这在字符串处理中已经看到,这个我 们要先强记,以后在讲指针时再详细讲。 4.字符数组在定义时必须考虑到串结束符的位置,因为 它要占一个字符的位置. 5.要注意数组初始化的方法与简单变量的区别,特别是 字符数组的初始化方法。 6.字符串的操作有许多专用函数,请注意掌握并运用。,本章作业:,1.复习本章内容,将书中例题看懂,会独立编写。,2.编写并上机调试下列习题:,1)用冒泡法对任意输入的n个数( n10 )排序(由大到小)。 2)矩阵的转置。,a=,1 2 3 4 6 7 8 9 10 11 1
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 肿瘤内科护士肝癌护理要点
- 大模型场景下智算平台的设计与优化实践
- 直肠肿瘤检查方法与诊断流程
- 研发部门新人培训
- 职业健康危害与职业病防治体系
- 培训机构校长转正述职报告
- 急慢性肠炎的护理
- 血友病病人健康指导
- 酒店培训大纲
- 组长培训总结
- 系统思维与系统决策系统动力学知到智慧树期末考试答案题库2025年中央财经大学
- 社工社会考试试题及答案
- 跨文化交际知识体系及其前沿动态
- 2025浙江中考:历史必背知识点
- 卫星遥感图像传输质量评估-全面剖析
- 2025-2030中国跨境支付行业市场发展现状及竞争格局与投资前景研究报告
- 2025年果品购销合同简易模板
- 胰岛素皮下注射团体标准解读 2
- 《眼科手术新技术》课件
- 《SLT631-2025水利水电工程单元工程施工质量验收标准》知识培训
- 西学中结业考核复习测试有答案
评论
0/150
提交评论