版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第6章数组6.1一维数组6.2二维数组6.3字符数组和字符串本章主要内容6.1一维数组36.1.1一维数组的定义1.一维数组的定义形式类型名数组名[整型表达式];例如:inta[10];/*定义整型数组a,有10个元素*/floatb[20];/*定义实型数组b,有20个元素*/2.一维数组元素的引用一维数组元素的引用形式:数组名[下标]46.1.2一维数组的使用1.一维数组的初始化类型名数组名[元素个数]={初始值列表};(1)对全部元素赋初值。例如: inta[10]={0,1,2,3,4,5,6,7,8,9};
各数组元素的初始值依次为:a[0]=0、a[1]=1、a[2]=2、a[3]=3、a[4]=4、a[5]=5、a[6]=6、a[7]=7、a[8]=8、a[9]=9。为了方便编程,这时也可以不指定数组的长度。例如:inta[]={0,1,2,3,4,5,6,7,8,9};系统会根据元素初值的个数自动计算数组长度为10。5(2)对部分元素初始化。当“{}”中值的个数少于元素个数时,只给最前面的几个元素赋值,其余元素系统根据其类型赋默认值,对于整型,默认值为0。例如:inta[10]={0,1,2,3,4};各元素的初始值为:a[0]=0、a[1]=1、a[2]=2、a[3]=3、a[4]=4、a[5]~a[9]均为0。注意:由于数组长度与提供的初值的个数不相同,这时的数组长度不能省略。66.1.2一维数组的使用2.一维数组的输入(1)通过赋值语句给数组元素赋值。例如: inta[5]; a[0]=1,a[1]=23,a[2]=16,a[3]=6,a[4]=10;这种方法适用于赋值的数据没有规律,且编程时数据已知。7(2)通过输入语句给数组元素赋值。如果编程时,不知道给数组元素的具体值,可以通过循环控制输入语句来实现。循环控制变量的取值为数组元素下标的取值范围。例如:给一个数组赋值任意5个整数。inta[5];for(i=0;i<=4;i++)scanf("%d",&a[i]);83.一维数组的输出(1)如果要输出一维数组某些元素的值,可以使用printf()语句通过其下标直接输出。例如:inta[10]={0,1,2,3,4,5,6,7,8,9};printf("%d,%d",a[3],a[5]);/*输出a数组第4和第6个元素的值*/9(2)如果要输出整个数组的值,可以通过循环控制输出语句来实现。循环控制变量的取值为数组元素下标的取值范围。例如:inta[5]={1,2,3,4,5};printf("5个整数:");for(i=0;i<=4;i++)printf("%4d",a[i]);/*通过域宽4调节输出数据之间的间隔*/程序运行结果:5个整数:12345每个数据输出域宽为4,右对齐。为了实现输出数组元素的数据间有一定的间隔,一般通过设置域宽实现。10(3)如果程序段改为如下形式,可以提示输出每一个元素的值。inta[5]={21,32,13,54,25};for(i=0;i<=4;i++)printf("第%d个整数:%d\n",i+1,a[i]);程序运行结果:第1个整数:21第2个整数:32第3个整数:13第4个整数:54第5个整数:25116.1.3一维数组程序设计示例【例6-1】选票统计。某次选举有三名候选人,编号分别是1、2、3,每张选票只选一人。现收到10张有效选票,请统计每个候选人的得票数。分析:设数组a统计三个候选人的得票数,即a[1]统计1号候选人的得票数,a[2]统计2号候选人的得票数,a[3]统计3号候选人的得票数。x接收选票,i控制循环次数,其类型均为int。程序如下:12#include<stdio.h>intmain(){inta[4]={0},i,x;/*x接收选票;i控制选票数*/for(i=1;i<=10;i++){printf("请输入第%d张选票中候选人的编号(1-3):",i);scanf("%d",&x);a[x]++;}for(i=1;i<=3;i++)printf("%d号候选人的得票数为:%d\n",i,a[i]);return0;}13请输入第1张选票中候选人的编号(1-3):1↙请输入第2张选票中候选人的编号(1-3):1↙请输入第3张选票中候选人的编号(1-3):2↙请输入第4张选票中候选人的编号(1-3):1↙请输入第5张选票中候选人的编号(1-3):2↙请输入第6张选票中候选人的编号(1-3):3↙请输入第7张选票中候选人的编号(1-3):3↙请输入第8张选票中候选人的编号(1-3):1↙请输入第9张选票中候选人的编号(1-3):2↙请输入第10张选票中候选人的编号(1-3):1↙1号候选人的得票数为:52号候选人的得票数为:33号候选人的得票数为:2程序运行结果14思考:如果候选人是6人,每张选票可以选3人,统计100张有效选票中每个人的得票数,如何修改程序?15【例6-2】选择法排序:10个人的考试成绩(整数)降序输出。分析:定义数组a存储10个整数,i,j控制下标,其类型均为int。循环输入10个整数,存放到数组a中。选择法排序的思想是:每次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到全部待排序的数据元素排完。本题实现过程不再单独定义数组存放排序后的数据,每轮比较结束后将当前轮找到的最大数据交换到相应的位置。16程序如下:#include<stdio.h>intmain(){inta[10],i,j,t;/*数组a存放成绩,i,j控制循环,t为交换变量*/printf("请输入10个人的成绩(0-100):");for(i=0;i<=9;i++)scanf("%d",&a[i]);for(i=0;i<=8;i++)/*选择法排序*/{for(j=i+1;j<=9;j++){if(a[i]<a[j]){t=a[i];a[i]=a[j];a[j]=t; }17程序运行结果:请输入10个人的成绩(0-100):65897891736682859879↙这10个人成绩的降序是:98918985827978736665}}printf("这10个人成绩的降序是:");for(i=0;i<=9;i++)printf("%3d",a[i]);printf("\n");return0;}18【例6-3】冒泡法排序:10个人的考试成绩(整数)降序输出。分析:与选择法排序类似,定义数组a存储10个整数,i,j控制下标。冒泡法排序的思想是:每次遍历时,都从前向后依次比较相邻两个数的大小,如果前者比后者大,则交换它们的位置。这样,一次遍历之后,最大的元素就在数列的末尾,采用相同的方法再次遍历时,第二大的元素就被排列在最大元素之前。重复此操作,直到整个数列都有序为止。本题为降序排序,每轮遍历找到当前剩余数据中最小的放在相应位置。循环控制输出数组a,输出时注意数据的域宽。19程序如下:#include<stdio.h>intmain(){inta[10],i,j,t;/*数组a存放成绩,i,j控制循环,t为交换变量*/printf("请输入10个人的成绩(0-100):");for(i=0;i<=9;i++)scanf("%d",&a[i]);for(i=1;i<=9;i++)/*冒泡法排序*/{for(j=0;j<=9-i;j++){if(a[j]<a[j+1]){t=a[j];a[j]=a[j+1];a[j+1]=t;}}}20程序运行结果:请输入10个人的成绩(0-100):65897891736682859879↙这10个人成绩的降序是:98918985827978736665printf("这10个人成绩的降序是:");for(i=0;i<=9;i++)printf("%3d",a[i]);printf("\n");return0;}21【例6-4】某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置;数轴上的每个整数点,即0,1,2,……,L,都种有一棵树。由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。22输入描述:输入的第一行有两个整数L(1<=L<=10000)和M(1<=M<=100),L代表马路的长度,M代表区域的数目,L和M之间用一个空格隔开。接下来的M行每行包含两个不同的整数,用一个空格隔开,表示一个区域的起始点和终止点的坐标。输出要求:输出包括一行,这一行只包含一个整数,表示马路上剩余的树的数目。23程序如下:#include<stdio.h>#include<math.h>intmain(){intl,m,a[10001],x,y;/*l,m设置为输入值,a注意为树木的数量,是一个数组*/intsum=0;scanf("%d%d",&l,&m);for(inti=0;i<=l;i++)a[i]=0;/*假设每一个位置都有树,初始化为0,在下面运行中,如果没有树了,置为1*/for(inti=0;i<m;i++){24scanf("%d%d",&x,&y);for(intp=x;p<=y;p++)/*这里就是从小的值出发,到大的值*/{if(a[p]==0)a[p]=1;}}for(inti=0;i<=l;i++)/*把所有为0的值输出*/{if(a[i]==0)sum++;}printf("%d",sum);return0;}25程序运行结果:输入样例:5003150300100200470471↙输出样例:2986.2二维数组266.2.1二维数组的定义1.二维数组的定义形式二维数组定义的一般形式为:类型说明符数组名[整数表达式1][整数表达式2];272.二维数组元素的引用二维数组元素的表示形式为:数组名[行下标][列下标]例如:a[2][3],表示第3行第4列的元素。说明:(1)下标可以是整型表达式,如a[3-2][2*2-1]。(2)数组元素可以出现在表达式中,也可以被赋值。例如:a[2][3]=a[1][2]/2;283.二维数组的存储形式在C语言中,我们可以把二维数组看作是一种特殊的一维数组:它的元素又是一维数组。例如,inta[3][4];可以把a看作是一个一维数组,它有3个元素:a[0]、a[1]、a[2],每个元素又是一个包含4个元素的一维数组,如图6-2所示。图6-2二维数组的表示296.2.2二维数组的使用1.二维数组的初始化(1)按行给二维数组赋初值。例如:inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};(2)按数组元素的排列顺序赋初值。二维数组的赋值和一维数组一样,除了初始化可以整体复制外,其他只能给数组元素单独赋值,例如:inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};30(3)对部分元素赋初值,其余元素系统根据类型赋默认值。例如:inta[3][4]={{1},{5,6},{9}};(4)第一维长度可以省略,但第二维长度不能省略。在给全部元素赋初值时,可以省略第一维长度,例如:inta[][4]={1,2,3,4,5,6,7,8,9,10,11,12};312.二维数组的赋值可以通过二维数组的行列下标赋值,例如:inta[3][4];a[0][0]=1;a[0][1]=2;scanf("%d%d",&a[1][0],&a[1][1]);其中a[0][0]、a[0][1]由赋值语句赋初值,a[1][0]、a[1][1]由键盘输入初值。也可以利用双重循环给元素赋值,例如:for(i=0;i<3;i++){for(j=0;j<4;j++)scanf("%d",&a[i][j]);}323.二维数组的输出【例6-5】二维数组元素的输出示例。分析:将二维数组按行来输出,即输出完第1行,输出第2行,……,依此类推,需要有两层循环,分别控制其行、列下标。程序如下:#include<stdio.h>intmain(){inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};inti,j;for(i=0;i<3;i++){for(j=0;j<4;j++)printf("%3d",a[i][j]);printf("\n");}return0;}程序运行结果:
12345678910111233【例6-6】3行3列整型数组的输入与输出。分析:定义3行3列的二维数组a,i和j控制下标,其类型均为int。双循环控制输出二维数组a,在输出完一行后注意换行。程序如下:#include<stdio.h>intmain(){inta[3][3],i,j;/*二维数组a存放3行3列数据,i,j控制下标*/printf("请输入3行3列整数:");for(i=0;i<=2;i++){for(j=0;j<=2;j++)scanf("%d",&a[i][j]);}printf("你输入的3行3列整数是:\n");for(i=0;i<=2;i++){for(j=0;j<=2;j++)printf("%3d",a[i][j]);printf("\n");}return0;}程序运行结果:请输入3行3列整数:123456789↙你输入的3行3列整数是:
123456789346.2.3二维数组程序设计示例【例6-7】打印下列8行的杨辉三角(直角杨辉三角)。11112113311464115101051161520156117213535217135分析:设用一个8行8列的二维数组a来存放杨辉三角,i,j控制下标。输出时从第1列输出,即为直角杨辉三角。程序如下:#include<stdio.h>intmain(){inta[8][8],i,j;/*二维数组a存放杨辉三角,i,j控制下标*/for(i=0;i<=7;i++)/*产生杨辉三角*/{for(j=0;j<=i;j++){if(j==0||i==j)a[i][j]=1;elsea[i][j]=a[i-1][j]+a[i-1][j-1];}}printf("8行直角杨辉三角是:\n");/*打印杨辉三角*/for(i=0;i<=7;i++){for(j=0;j<=i;j++)printf("%4d",a[i][j]);printf("\n");}return0;}36【例6-8】学生成绩统计。一个班50个人4门课,统计①每个人的总分与平均分;②每门课的平均分。学生信息包括学号、语文、数学、英语、计算机、总分、平均分。分析:定义数组a存储50个人的所有信息,i,j控制下标,其类型均为int。先输入50个人的信息,学号使用递增整数代替,只需要输入每个人的4门课成绩;然后计算每个人的总分(放到a[i][5]中)和平均分(放到a[i][6]中),再求每门课的平均分(放到a[50][j]中),最后输出成绩表。程序如下:37#include<stdio.h>intmain(){inta[51][7]={0},i,j;/*数组a存储50个人的信息,i,j控制下标*/printf("请输入50人四门课的成绩:\n");for(i=0;i<=49;i++) /*输入50个人的成绩*/{a[i][0]=i+1; /*自动获取学号*/printf("请输入学号为%d的四门课成绩:",i+1);for(j=1;j<=4;j++)scanf("%d",&a[i][j]);}for(i=0;i<=49;i++){for(j=1;j<=4;j++) /*计算每个人的总分*/a[i][5]+=a[i][j];a[i][6]=a[i][5]/4; /*计算每个人的平均分*/}38for(j=1;j<=4;j++){for(i=0;i<=49;i++) /*计算每门课的总分*/a[50][j]+=a[i][j];a[50][j]=a[50][j]/50; /*计算每门课的平均分*/}printf("\n\n学生成绩表\n\n");printf("学号语文数学英语计算机总分平均分\n");for(i=0;i<=49;i++) /*打印50个人的成绩*/{for(j=1;j<=6;j++)printf("%6d",a[i][j]);printf("\n");}printf("平均分:");for(j=1;j<=4;j++) /*输出每门课的平均分*/printf("%6d",a[50][j]);printf("\n");return0;}6.3字符数组和字符串396.3.1字符数组的定义1.字符数组的定义形式字符数组定义的一般形式为:char数组名[数组长度];402.字符数组的初始化(1)字符数组允许在类型说明时做初始化赋值。例如:charc[10]={'C','','p','r','o','g','r','a','m','!'};(2)当对全体元素赋初值时也可以省略长度说明,系统会根据初值个数确定数组长度。例如:charc[]={'C','','p','r','o','g','r','a','m','!'};416.3.2字符串的初始化在C语言中没有专门的字符串变量,通常用一维字符数组来存放一个字符串,用二维字符数组存放多个字符串。在前面的章节中介绍字符串常量时,已说明字符串总是以'\0'作为字符串的结束标记。因此当把一个字符串存入一个数组时,也要把结束符'\0'存入数组,并以此作为该字符串是否结束的标志。有了'\0'标志后,就不必再用字符数组的长度来判断字符串的长度了。426.3.3字符串的输入和输出在采用字符串方式后,字符数组的输入输出将变得简单方便。除了上述用字符串赋初值的方法外,还可用printf()函数和scanf()函数一次性输出和输入一个字符数组中的字符串,而不必使用循环语句逐个输入或输出每个字符。436.3.4字符串函数的使用1.字符串处理函数C语言提供了丰富的字符串处理函数,大致可分为字符串的输入、输出、合并、修改、比较、转换、复制、搜索等几类。使用这些函数可大大减轻编程的负担。2.字符数组的输入输出(1)一个字符串的输入输出44【例6-9】用字符数组a存储字符串,输入输出该字符串。用scanf()和printf()函数实现一个字符串的输入输出的源程序:#include<stdio.h>intmain(){chara[10];/*数组a存放字符串*/printf("请输入一个字符串:");scanf("%s",a);printf("你输入的字符串是:");printf("%s\n",a);return0;}45用gets()和puts()函数实现一个字符串的输入输出的源程序:#include<stdio.h>#include<string.h>intmain(){chara[10];/*数组a存放字符串*/printf("请输入一个字符串:");gets(a);printf("你输入的字符串是:");puts(a);return0;}46(2)多个字符串的输入输出【例6-10】用字符数组a存储多个字符串,如5个人名,输入输出这些字符串。分析:定义一个二维字符数组a存储5个人的名字。如果输入的姓名为中文,一个中文占两个字节,定义第2维大小为11,假设姓名不超过5个汉字。程序如下:47#include<stdio.h>#include<string.h>intmain(){chara[5][11];/*二维字符数组a可以存放多个字符串*/for(i=0;i<5;i++){printf("请输入第%d个人的姓名:",i+1);gets(a[i]);}printf("你输入5个人的姓名是:");for(i=0;i<5;i++){printf("%s",a[i]);}printf("\n");return0;}486.3.5字符数组程序设计示例【例6-11】多个字符串的排序:如10个国家名字按字典顺序输出。分析:定义数组a存放国家名字,数组t用来交换,i,j做循环控制。先循环输入10个国家名,再对10个国家名排序,最后输出排序后的国家名。字符串的输入用gets()函数,输出用puts()函数,比较用strcmp()函数,字符串的赋值用strcpy()函数。如果输入中文的国家名,长度限定不超过10,第2维的大小定义为21。程序如下:49#include<stdio.h>#include<string.h>intmain(){chara[10][15],t[15]; /*数组a存放国家名字,数组t用来交换*/inti,j; /*i,j做循环控制*/for(i=0;i<=9;i++) /*输入10个国家的名字*/{printf("请输入第%d个国家的名字:",i+1);gets(a[i]);}for(i=0;i<=8;i++)/*选择法排序*/{for(j=0;j<=9;j++){50
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年处方审核规范培训课件
- DB32/T 4920-202412345政务服务便民热线服务数据采集规范
- 2026年医院职工控烟知识培训考试及答案
- 2026年烟草局考试题库及答案
- T/AIMC 006-2023农用地膜追溯信息管理要求
- 特色冷知识题目和答案大公开
- 项目四 饭店主要业务部门管理
- 世纪商务英语外贸函电(第六版)课件4 Offer
- 小金属摄像设备项目可行性研究报告
- 外贸基础及函电 9
- 【直接打印】人教版(2024新版)八年级上册物理默写小纸条
- DL∕T 1779-2017 高压电气设备电晕放电检测用紫外成像仪技术条件
- 农业技术员培训培训课件
- 监理工程师继续教育考试及答案
- GB/T 28784.4-2017机械振动船舶振动测量第4部分:船舶推进装置振动的测量和评价
- GB/T 1356-2001通用机械和重型机械用圆柱齿轮标准基本齿条齿廓
- 应征入伍服兵役高等学校学生国家教育资助申请表
- FZ/T 63033-2016编织圆绳
- 有机波谱分析课件
- 水库安全鉴定报告书
- 水利工程竣工结算书
评论
0/150
提交评论