已阅读5页,还剩50页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第6章 数 组,C 语言程序设计,2019/5/26,2,第6章 数组,本章重点介绍 : 6.1 一维数组 6.2 二维数组 6.3 字符数组与字符串,2019/5/26,3,第6章 数组,一个人N门课的成绩怎样存储和处理? 一个班N门课的成绩怎样存储和处理?,这些数据的特点:具有相同的数据类型。 为了方便地使用这些数据,C语言提供了一种构造数据类型:数组。 例如:存储学生成绩用实型数组 score5 其中:score是数组名。该数组可以存放5个成绩,分别用下标变量表示:score0,score1,score4。 下标变量也称为数组元素。,2019/5/26,4,6.1 一维数组,例如: int a10; float score5; “数据类型”: 是数组元素的数据类型。 “数组名”: 遵循C语言标识符规则。 “常量表达式”:表示数组中有多少个元素,即数组的长度。它可以是整型常量、整型常量表达式或符号常量。,6.1.1 一维数组的定义,数据类型 数组名常量表达式;,2019/5/26,5,以下数组定义是正确的: #define N 10 float score1N, score2N; int num10+N; char c26;,以下数组定义是不正确的: int array(10); int n; float scoren; double ba d; char str ;,6.1.1 一维数组的定义(续),2019/5/26,6,数组在内存的存放,数组下标从0开始。 一维数组的数组元素在内存里按顺序存放。 数组名代表数组的首地址,即score的值与score0 的地址值相同。,score数组,2019/5/26,7,6.1.2 数组元素的引用,格式:,例如:输入学生成绩 for(i=0;i5;i+) scanf(“%f“,例如:fibn=fibn-1+fibn-2;,下标表达式的值必须是整型表达式。,数组名下标表达式,2019/5/26,8,6.1.2 数组元素的引用(续),说明: 下标从0开始(下界为0),数组的最大下标(上界)是数组长度减1。 例如: int a10; scanf (“%d“, /* 下标越界 */,C编译系统不做越界检查,如果引用的数组元素 超出数组范围会破坏其他变量的值。,2019/5/26,9,6.1.2 数组元素的引用(续), 是下标运算符,引用数组元素时,根据数组的首地址和下标数,计算出该元素的实际地址,取出该地址的内容进行操作。,如引用 score2: (1)计算 2000+2*4=2008 (2)取出2008的内容,2019/5/26,10,6.1.3 一维数组的初始化,初始化:在定义数组时给数组元素赋初值。,1在定义数组时,对全部数组元素赋初值 例如:int a5=0,1,2,3,4; 此时可以省略数组长度,例如:int a =0,1,2,3,4; 2在定义数组时,对部分数组元素赋初值 例如:int a5=1,2,3;系统为其余元素赋 0 。 3当初值的个数多于数组元素的个数时,编译出错 例如: int a5=0,1,2,3,4,5;,2019/5/26,11,6.1.4 一维数组应用举例,【例】将10个人的成绩输入计算机后按逆序显示。 #define N 10 main( ) int i;float scoreN; for (i=0; i=0; i-) printf(“%6.1f“,scorei); ,运行情况如下: 67 74 89 92 34 67 83 95 73 78 78.0 73.0 95.0 83.0 67.0 34.0 92.0 89.0 74.0 67.0,2019/5/26,12,【例】输入5个整数,找出最大数和最小数所在位置,并把二者对调,然后输出。,思路: 求最大/小值采用打擂台的方法。 定义一维数组a存放被比较的数。 定义变量max:最大值, min:最小值, k:最大值下标 , j:最小值下标 。 各数依次与擂主进行比较, 若aimax 则: max=ai; k=i; 否则判断: 若aimin 则: min=ai; j=i; 当所有的数都比较完之后,将aj=max; k=min; 输出a数组。,2019/5/26,13,main( ) int a5,max,min,i,j,k; for(i=0; imax) max=ai; k=i ; aj=max; ak=min; for (i=0; i5; i+) printf(“%5d“,ai); printf(“n“); ,程序运行情况如下: 5 7 2 3 1 5 1 2 3 7,2019/5/26,14,【例】冒泡法排序(从小到大)。,以6个数:3、7、5、6、8、0为例。,第一趟排序情况如下: 3 7 5 6 8 0 第一次 3和7比较,不交换 3 7 5 6 8 0 第二次 7和5比较,交换 3 5 7 6 8 0 第三次 7和6比较,交换 3 5 6 7 8 0 第四次 7和8比较,不交换 3 5 6 7 8 0 第五次 8和0比较,交换 3 5 6 7 0 8 在第一趟排序中,6个数比较了5次,把6个数中的最大数8排在最后。,2019/5/26,15,冒泡法排序 (续),第二趟排序情况如下: 3 5 6 7 0 8 第一次 3和5比较,不交换 3 5 6 7 0 8 第二次 5和6比较,不交换 3 5 6 7 0 8 第三次 6和7比较,不交换 3 5 6 7 0 8 第四次 7和0比较,交换 3 5 6 0 7 8 在第二趟排序中,最大数8不用参加比较,其余的5个数比较了4次,把其中的最大数7排在最后,排出7 8。 以此类推: 第三趟比较3次,排出 6 7 8 第四趟比较2次,排出 5 6 7 8 第五趟比较1次,排出 3 5 6 7 8 最后还剩下1个数0,不需再比较,得到排序结果: 0 3 5 6 7 8,2019/5/26,16,冒泡法排序 (续),从上述过程可以看到:n个数要比较n-1趟,而在第j趟比较中,要进行n-j次两两比较。,2019/5/26,17,#define N 6 main( ) int aN; int i,j,t; for (i=0; iai+1) t=ai;ai=ai+1;ai+1=t; printf(“The sorted numbers: n“); ,程序运行情况如下: 3 7 5 6 8 0 0 3 5 6 7 8,2019/5/26,18,以6个数:3、7、5、6、8、0为例。 思路: 第一趟:将第一个数依次和后面的数比较,如果后面的某数小于第一个数,则两个数交换,比较结束后,第一个数则是最小的数。 第二趟:将第二个数依次和后面的数比较,如果后面的某数小于第二个数,则两个数交换,比较结束后,第二个数则是次小的数; 。,【例】选择法排序(从小到大)。,2019/5/26,19,#define N 5 main( ) int aN; int i,j,k,t; for (i=0; iN; i+) scanf(“%d“, ,程序运行情况如下: 96 78 65 86 40 The sorted numbers: 40 65 78 86 96,2019/5/26,20,6.2 二维数组,多维数组的空间想象,一维数组: 一列长表或一个向量,多维数组: 多维空间的一个数据列阵,三维数组: 三维空间的一个方阵,2019/5/26,21,6.2 二维数组,数据类型 数组名常量表达式1常量表达式2;,例如: float x23;,6.2.1 二维数组的定义,int a3,4,b(3,4),c ,d(3)(4);,2019/5/26,22,地址 值 数组元素,二维数组元素在内存中的排列顺序:按行存放,2019/5/26,23,x0是数组名,是元素x00的地址,x1是数组名, 是元素x10的地址,二维数组可看作是一种特殊的一维数组,x0- x00, x01, x02,x1- x10, x11, x12,例如,可以把x数组看作是包含二个元素的一维数组,每个元素又是一个含有三个元素一维数组。,2019/5/26,24,a34=3; /* 下标越界 */ a1, 2=1; /* 应写成 a12=1; */,6.2.2 二维数组元素的引用,例:int a34; a00=3; a01=a00+10;,数组名行下标表达式列下标表达式,数组元素的表示形式 :,2019/5/26,25,6.2.3 二维数组的初始化,例:int a23=1, 2, 3, 4, 5, 6;,1按行赋初值,例:int a23=1, 2, 3, 4, 5, 6; 初始化后结果: 1 2 3 4 5 6,2按数组元素在内存中排列的顺序对各元素赋初值,3给部分元素赋初值,例:int a23=1, 4; 初始化后结果: 1 0 0 4 0 0,2019/5/26,26,6.2.3 二维数组的初始化(续),4数组初始化时,行长度可省,列长度不能省 例如:int a3=1,2,3,4,5,6,7; int b4=1,4,5; 初始化结果:,a 结果: a0: 1 2 3 a1: 4 5 6 a2: 7 0 0,b 结果: b0: 1 0 0 0 b1: 4 5 0 0,2019/5/26,27,下面对二维数组的定义都是错误的:,6.2.3 二维数组的初始化(续),float x3 =1.0, 2.0, 3.0, 4.0, 5.0, 6.0;,int a , b 2, c3 ;,int m24=1, 2, 3, 4, 5, 6, 7, 8, 9; /* 编译出错,初值个数多于数组元素的个数 */,2019/5/26,28,6.2.4 二维数组应用举例,【例】给一个4行3列的二维数组输入/出数据。 main( ) int a43,i,j,k; for (i=0; i4; i+) for (j=0; j3; j+) scanf(“%d“, ,程序运行情况如下: 1 2 3 4 5 6 7 8 9 10 11 12 1 2 3 4 5 6 7 8 9 10 11 12,2019/5/26,29,6.2.4 二维数组应用举例(续),【例】有一个NM矩阵,编程序求出其中绝对值最大的那个元素的值及其所在的行、列位置。,2019/5/26,30,#include “math.h“ #define N 4 #define M 5 main( ) int i,j,row,colum,max,aNM; /* 输入数据 */ max=a00; row=colum=0; for (i=0; imax) max=abs(aij); row=i; colum=j; /* 输出数据 */ ,程序运行情况如下: 34 56 12 67 23 12 67 43 98 54 65 45 66 16 24 37 83 25 64 19 max=98,row=1,colum=3,2019/5/26,31,6.3 字符数组与字符串,字符数组: 可以存放若干个字符,也可以存放字符串。,6.3.1 基本概念,字符串: 字符串的末尾必须有0字符,它的ASCII码值为0。,不是字符串,是字符串,2019/5/26,32,再例如: char a35; a数组是一个二维的字符数组,可以存放15个字符或3个长度不大于4的字符串。,6.3.2 字符数组的定义,例如: char s10; s数组是一维字符数组,它可以存放10个字符或一个长度不大于9的字符串。,注意:字符串只能存放在字符数组中。,2019/5/26,33,6.3.3 字符数组的初始化,1用字符常量赋初值 例如:char c5=C,h, i, n, a ;,再例如: char c6=C,h, i, n, a , 0;,是字符串,不是字符串,2019/5/26,34,6.3.3 字符数组的初始化(续),再例如: char a310=“basic“,“pascal“,“c“;,2用字符串常量赋初值,例如: char str10= “a string“; 或char str10= “a string“;,是字符串吗?,2019/5/26,35,6.3.3 字符数组的初始化(续),例如:char s37= s, t, r, i, n, g;,3初始化时长度的省略,例如:char s1 = “Good morning!“;,s10,s113,例如:char s2 = s, t, r, i, n, g;,思考:哪个数组存放的是字符串,?,2019/5/26,36,6.3.4 字符数组的引用,【例】对字符数组c1赋 09,对字符数组c2赋 AZ,然后输出c1和c2数组中的数据。,1对字符数组元素的引用,可以为数组元素赋值,也可以输入/输出元素的值。,2019/5/26,37,程序如下:,main( ) char c110,c226; int i; for (i=0; i10; i+) c1i=i+48; for (i=0; i26; i+) c2i=i+A; for (i=0; i10; i+) printf(“%c “,c1i); printf(“n“); for (i=0; i26; i+) printf(“%c “,c2i); printf(“n“); ,2019/5/26,38,2对字符数组的整体引用, 输出字符串 例如: char c = “China“; printf(“%s“,c); 输出结果为: China,C是数组首地址,输出时遇 0 为止,再例如: char c =“pascal0basic“; printf(“%s“,c); 输出结果为: pascal,2019/5/26,39,2对字符数组的整体引用(续), 输入字符串 例如: char c10; scanf(“%s“,c); 输入: beijing,三个字符串用空格隔开,分别赋给str1、str2、str3三个数组。,再例如: char str110, str210, str310; scanf( “%s%s%s“, str1, str2, str3); 输入: pascal basic c,注意:不可以为数组整体赋值,例如: char c10; c=“beijing“ ; 因为c是数组首地址,是常量!,注意:“%s” 遇空格、Tab和回车结束输入。,2019/5/26,40,6.3.5 字符串处理函数,说明: 程序中如果调用下面介绍的8个字符串处理函数,在程序的开始应该写: #include “stdio.h“ 或 #include “string.h“ 预处理命令,否则在VC+6.0中编译会出现警告信息。 在字符串处理函数中,凡是用数组名或字符串首地址作参数的地方,都可以用指针变量作参数。指针变量的概念在第8章介绍。,2019/5/26,41,1字符串输出函数puts( ),调用格式:puts(str) 功能:输出一个字符串,输出后自动换行。 说明:str可以是字符数组名或字符串常量。,例如: char str1 = “China“; char str2 = “Beijing“; puts(str1); puts(str2); 输出结果: China Beijing,2019/5/26,42,2字符串输入函数gets( ),调用格式:gets(str) 功能:从键盘读入一个字符串存入str数组中,并且得到一个函数值,该函数值是str数组的首地址。 说明:str是数组名。,程序运行情况如下: How are you? Fine thank you. How are you? Fine thank you.,例如: main( ) char c120,c220; gets(c1); gets(c2); puts(c1); puts(c2); ,2019/5/26,43,3字符串连接函数 strcat( ),调用格式:strcat(str1,str2) 功能:把str2中的字符串连接到str1字符串的后面,结果放在str1数组中,函数值是str1的值。,必须 足够大,输出结果: beijing and shanghai,例如: char str121=“beijing and “; char str2 =“shanghai“; printf(“%s“,strcat(str1,str2);,2019/5/26,44,4字符串复制函数 strcpy( ),调用格式:strcpy(str1,str2) 功能:将str2中的字符串复制到str1数组中。,s1必须 足够大,思考:这样赋值 s1=“Beijing“ ;或 s1=s2;可以吗?为什么?,s1的结果,例如: char s110,s2 = “Beijing“; strcpy(s1,s2); 或:strcpy(s1,“Beijing“);,2019/5/26,45,5字符串比较函数 strcmp( ),调用格式:strcmp(str1,str2),str1,str2,str1,str2,str1,str2,strcmp(str1,str2)=0,strcmp(str1,str2)0,strcmp(str1,str2)0,2019/5/26,46,例如:比较两个字符串的大小。,main( ) char s1 = “aBC“,s2 = “abc“; if (strcmp(s1,s2)=0) printf(“s1=s2“); else if (strcmp(s1,s2)0) printf(“s1s2“); else printf(“s1s2“); ,程序输出结果: s1s2,思考:若有语句 if (s1= =s2) printf(“s1=s2“);比较的是什么?,2019/5/26,47,6求字符串长度函数 strlen( ),调用格式:strlen(str) 功能:测试字符串长度。函数值就是str中字符的个数。,思考: 字符串“China“和str数组在内存中各占几个字节?,输出结果: 5,例如: char str10= “China“; printf(“%d“,strlen(str); 或 printf(“%d“,strlen(“China“);,2019/5/26,48,6.3.6 字符数组应用举例,【例】从标准输入设备上输入一个字符串,分别统计其中每个数字、空格、字母及其他字符出现的次数。,思路:用gets( )函数读字符串,然后判断每一个字符是否是数字、空格、大小写字母或其他字符,用循环实现。 注意:此题要求分别统计每个数字出现的次数,而不是统计数字出现的总次数。 用一个一维整型数组存放每个数字出现的次数。,2019/5/26,49, char s80; int i,sp=0,oth=0,lett=0; int dig10=0; gets(s); for (i=0; si!=0; i+) if (si=0 ,程序运行情况如下: China 1949.10.12004.10.1 0:4个 1:5个 2:2个 3:0个 4:1个 5:0个 6:0个 7:0个 8:0个 9:2个 space:1 letter:5 other:5,2019/5/26,50,6.3.6 字符数组应用举例(续),【例】输入某月份的整数值112,输出该月份的英文名称。,思路:将12个英文月份以字符串的形式存放到month1315中,一行存放一个字符串。,2019/5/26,51,main( ) char month 15=“Illegal month.“, “January“, “February“, “March“, “April“, “May“, “June“, “July“, “August“, “September“, “October“,“Novenber“,“Decenmber“; int m; printf(“nInput month:“); scanf(“%d“, ,程序运行情况如下: Input month:10 10: October,2019/5/26,52,6.3.6 字符数组应用举例(续),【例】将N个国家名按字母顺序排序后输出。 思路:从键盘输入N个国家名称存放到一个二维字符数组中,然后用选择法对这N个字符串排序。,程序如下: #define N 5 #define M 10 #include “stdio.h“ main( ) char sNM,strM; int i,j;,2019/5/26,53,6.3.6 字符数组应用举例(续),for(i=0; i0 ) strcpy(str,si); strcpy(si,sj); strcpy(sj,str); for( i
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 智慧教育平台搭建及运营管理手册
- 网络直播主播工作成果绩效衡量表
- 人力资源行业招聘专员人才选拔与工作效率绩效考评表
- 商业办公楼电子设备故障紧急处理手册
- 财务专员审计配合度绩效评定表
- 金融分析师业绩评估与绩效考核表
- 生产计划变更与沟通函5篇范本
- 建筑项目施工现场管理绩效评定表
- 制造业生产主管产量与质量绩效考评表
- 园艺种植花卉种植技巧手册四季养护指南
- 2026年甘肃省民航机场集团安全检查员招聘笔试题库附答案详解
- 2026水发集团有限公司招聘(207人)笔试参考题库及答案详解
- 2026年完整版三级安全教育考试试题及答案
- D-二聚体升高诊治与管理专家共识2026
- 《多花黄精林下生态栽培技术标准综合体 第3部分:生态栽培》
- 中国特应性皮炎诊疗指南(2025版)
- 防洪防汛安全教案
- 2026浙江宁波能源集团股份有限公司第二批人员招聘5人备考题库完整答案详解
- 2026年留疆战士考试题库及答案含解析
- GA 1800.3-2021电力系统治安反恐防范要求第3部分:水力发电企业
- 高中英语词汇3500词(带音标)
评论
0/150
提交评论