版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C语言程序设计智能工程学院“现场课程”
目
录目录CONTENTS
一维数组6.1
二维数组6.2在C语言中,一维数组是存储相同数据类型元素的线性集合,需遵循“先定义、后使用”的原则,其核心操作包括定义、引用、初始化及实际应用。一维数组的定义方式为:类型说明符数组名[常量表达式];类型说明符:指定数组元素的数据类型,可使用int(整型)、float(单精度浮点型)、char(字符型)等基本数据类型,或结构体、枚举等构造数据类型。例如floatscore[5]中,float表明数组score的元素均为单精度浮点数。数组名:用户自定义的标识符,需遵循C语言变量命名规则(由字母、数字、下划线组成,且首字符不能为数字),且不能与其他变量名重复。例如若已定义inta;,则floata[10];是错误的,会导致命名冲突。常量表达式:用于指定数组元素的个数(即数组长度),必须是常量或符号常量,不能是变量。例如:合法定义:#defineLEN5intarr[LEN+3];(符号常量与常量表达式结合);非法定义:intn=4;intarr[n];(变量n不能用于指定数组长度)。
6.1一维数组6.1.1一维数组的定义
6.1一维数组6.1.1一维数组的定义
提示数组元素类型统一性:同一数组的所有元素数据类型必须相同,例如intnum[6]的6个元素均为整型,无法存储字符或浮点数。下标起始规则:数组下标从0开始,而非1。例如inta[5]包含的元素是a[0]、a[1]、a[2]、a[3]、a[4],共5个元素,不存在a[5]。内存分配特性:数组在内存中占据连续存储空间,数组名代表存储区的首地址(即数组名==&数组名[0]),且数组名是地址常量,不能被赋值或参与运算。例如inta[15]在VisualC++环境中,每个整型元素占4字节,数组总内存大小为4*15=60字节,元素地址依次为1000(a[0])、1004(a[1])……1060(a[14])。要数组引用即访问数组中的单个元素,通过“数组名+下标”实现,是数组操作的基础。一维数组的引用格式:数组名[下标]
提示(1)下标可以是常量或常量表达式,如a[3],a[3+2]。(2)下标也可以是变量或变量表达式,如a[i],a[i+j],a[i++]。(3)引用时,下标值若不是整型,C系统会自动取整,如a[5.3]相当于a[5]。(4)下标值从0开始,而不是从1开始。(5)下标不能越限,即引用时的下标不能超过或等于定义时的下标值,如“inta[10];a[10]=4;”是错误的。
6.1一维数组6.1.2一维数组的引用【例6-1】输入10个不同整数并求最小值。【问题分析】这里我们需要10个变量用来存储这10个整数,因此,可定义一个整型数组,包含10个数组元素。定义一个变量min用来存储最小值,先将a[0]赋给min,然后将a[1]~a[9]逐个与min进行比较,如小于min,则将值赋给min,最后输出min的值即为最小值。
6.1一维数组6.1.2一维数组的引用【参考代码】#include<stdio.h>intmain(){inta[10];//定义存储10个整数的数组inti,min;//输入10个整数for(i=0;i<=9;i++){scanf("%d",&a[i]);//逐个引用数组元素赋值}//输出10个整数for(i=0;i<=9;i++){printf("%4d",a[i]);//逐个引用数组元素输出}//求最小值min=a[0];//初始化为第一个元素for(i=1;i<=9;i++){if(min>a[i]){min=a[i];//引用元素比较并更新最小值}}printf("\n最小值为%d\n",min);return0;}
6.1一维数组6.1.2一维数组的引用【运行结果】程序运行结果如图所示。【程序说明】由于不能对数组整体进行(读取)操作,只能对数组的元素进行操作,因此,如果要输入或输出a[0]到a[9]的所有数据,需要用到循环语句,让循环变量从0到9循环,从而输入或输出数组中的每个数。
6.1一维数组6.1.2一维数组的引用数组初始化是在定义数组时直接为元素赋初值,可减少程序运行时的赋值操作,提升效率,初始化在编译阶段完成。初始化格式:类型说明符
数组名[常量表达式]={数值1,数值2,...,数值n};初始化规则:(1)部分元素初始化:若{}中数值个数少于数组长度,未赋值元素自动为0(整型数组)、0.0(浮点型数组)或'\0'(字符数组)。例如inta[5]={1,2,3};,则a[0]=1、a[1]=2、a[2]=3、a[3]=0、a[4]=0。(2)禁止整体赋值:不能直接给数组整体赋单一值,需逐个指定元素值。例如inta[5]=1;是错误的,正确写法为inta[5]={1,1,1,1,1};。(3)省略长度初始化:若{}中包含全部元素的初值,可省略数组长度,系统会根据数值个数自动确定长度。例如inta[]={1,2,3,4};,数组a的长度为4。(4)如果花括号{}中数值的个数多于数组元素的个数,编译时将提示语法错误。数值个数限制:{}中数值个数不能超过数组长度,否则编译报错。例如inta[3]={1,2,3,4};是非法的。
6.1一维数组6.1.3一维数组的初始化【例6-2】生成斐波那契数列前10项。【问题分析】根据题意,以f[n]表示第n项,其规律为f[n]=f[n-2]+f[n-1],如此构成的数列为:f[0]=1,f[1]=1,f[2]=2,f[3]=3,…,f[n]=f[n-2]+f[n-1]。
6.1一维数组6.1.4一维数组应用举例【参考代码】#include<stdio.h>intmain(){intf[10],i;f[0]=1;f[1]=1;//初始化前两项for(i=2;i<10;i++){f[i]=f[i-1]+f[i-2];//计算后续项}//输出(每5项换行)for(i=0;i<10;i++){if(i%5==0)printf("\n");printf("%6d",f[i]);}return0;}
6.1一维数组6.1.4一维数组应用举例【运行结果】程序运行结果如图所示。【程序说明】很多数列问题都可以用类似于上述计算斐波纳契数列的方法,用数组来进行存储和计算。
6.1一维数组6.1.4一维数组应用举例【例6-3】给定任意n个整数,按由小到大次序对其进行排序,并输出结果。【问题分析】排序方法有很多,如交换排序法、冒泡排序法、选择排序法、插入排序法等,本例将采用常用的冒泡法来实现。
6.1一维数组6.1.4一维数组应用举例冒泡排序(BubbleSort)是一种简单的交换排序算法,核心思想是通过相邻元素两两比较,将较大的元素逐步“冒泡”到数组末尾,每完成一轮循环,就确定一个最大元素的最终位置。经过n-1轮循环(n为元素个数),即可实现数组的升序排序。以数组arr[5]={8,3,1,5,2}(n=5)为例,升序排序的具体过程如下:第1轮循环(确定最大元素8的位置):比较arr[0]与arr[1](8和3):8>3,交换
→
数组变为{3,8,1,5,2}比较arr[1]与arr[2](8和1):8>1,交换
→
数组变为{3,1,8,5,2}比较arr[2]与arr[3](8和5):8>5,交换
→
数组变为{3,1,5,8,2}比较arr[3]与arr[4](8和2):8>2,交换
→
数组变为{3,1,5,2,8}结果:最大元素8移动到末尾(arr[4]),后续循环无需再处理arr[4]。
6.1一维数组6.1.4一维数组应用举例第2轮循环(确定次大元素5的位置):比较arr[0]与arr[1](3和1):3>1,交换
→{1,3,5,2,8}比较arr[1]与arr[2](3和5):3<5,不交换比较arr[2]与arr[3](5和2):5>2,交换
→{1,3,2,5,8}结果:次大元素5移动到arr[3],后续循环无需处理arr[3]。第3轮循环(确定第三大元素3的位置):比较arr[0]与arr[1](1和3):1<3,不交换比较arr[1]与arr[2](3和2):3>2,交换
→{1,2,3,5,8}结果:第三大元素3移动到arr[2],后续循环无需处理arr[2]。第4轮循环(确定第四大元素2的位置):比较arr[0]与arr[1](1和2):1<2,不交换结果:第四大元素2位置确定(arr[1]),剩余arr[0]自然是最小元素。
6.1一维数组6.1.4一维数组应用举例#include<stdio.h>intmain(){intn;//存储整数的个数inti,j,temp;//i:控制循环轮数;j:控制每轮比较次数;temp:交换元素的临时变量//1.输入整数的个数n(需确保n≥1,否则无排序意义)printf("请输入整数的个数n:");scanf("%d",&n);if(n<=0){printf("输入的个数无效,请输入正整数!\n");return1;//异常退出,返回非0值表示程序出错}//2.定义数组并输入n个整数intarr[n];printf("请输入%d个整数(用空格分隔):\n",n);for(i=0;i<n;i++){scanf("%d",&arr[i]);//逐个输入整数到数组}
【参考代码】
6.1一维数组6.1.4一维数组应用举例//3.冒泡排序核心逻辑(升序)for(i=0;i<n-1;i++){//外层循环:控制总轮数(n-1轮)//内层循环:控制每轮比较次数(第i轮比较n-1-i次,末尾i个元素已排好序)for(j=0;j<n-1-i;j++){if(arr[j]>arr[j+1]){//若前一个元素>后一个元素,交换两者temp=arr[j];arr[j]=arr[j+1];arr[j+1]=temp;}}}//4.输出排序后的结果printf("按从小到大排序后的结果:\n");for(i=0;i<n;i++){printf("%d",arr[i]);//逐个输出排序后的数组元素}printf("\n");return0;}
6.1一维数组6.1.4一维数组应用举例【运行结果】程序运行结果如图所示。【程序说明】输入或者输出数组中的元素需要用循环语句逐个输入或输出。
6.1一维数组6.1.4一维数组应用举例二维数组可理解为“数组的数组”,元素按“行优先”连续存储,适用于存储表格、矩阵等二维数据(如学生多门课程成绩、矩阵运算)。二维数组的定义与一维数组相似,其一般形式为:类型说明符数组名[常量表达式1][常量表达式2];常量表达式1:表示“行数”,常量表达式2:表示“列数”,总元素个数=行数
×
列数。示例:intmat[2][3]表示2行3列的整型矩阵,共2×3=6个元素,分别是:mat[0][0]、mat[0][1]、mat[0][2](第1行),mat[1][0]、mat[1][1]、mat[1][2](第2行)。内存存储规则:二维数组在内存中按“行优先”线性存储(先存完第1行,再存第2行)。例如intmat[2][3]的存储顺序:mat[0][0]→mat[0][1]→mat[0][2]→mat[1][0]→mat[1][1]→mat[1][2]
6.2二维数组6.2.1二维数组的定义同一维数组一样,二维数组也要先定义后引用。其引用的格式为:数组名[下标1][下标2]需同时指定行和列下标,且均不能越界。示例:mat[1][2]表示访问第2行第3列的元素(行/列下标均从0开始),若mat[2][3]中引用mat[2][1],则行下标越界(合法行下标0~1)。
6.2二维数组6.2.2二维数组的引用二维数组初始化有“整体赋值”和“按行赋值”两种方式,推荐按行赋值(结构清晰,不易出错),二维数组的初始化有两种方法:(1)整体赋值:类型说明符
数组名[行数][列数]={值1,值2,...,值n};(按行优先顺序赋值),例如:intx[2][3]={1,2,3,4,5,6};初始化结果是:x[0][0]=1,x[0][1]=2,x[0][2]=3,x[1][0]=4,x[1][1]=5,x[1][2]=6。(2)按行赋值:类型说明符
数组名[行数][列数]={{行1值1,行1值2},{行2值1,行2值2},...};(每行初值用{}包裹)。例如:定义了二维数组x[2][3],可以把数组x看成是具有两个元素的一维数组,其元素是x[0]和x[1];而每个元素x[0]和x[1]又都是具有三个元素的一维数组;如图所示。因此,二维数组的初始化也可以分解成多个一维数组的初始化,例如:intx[2][3]={{1,2,3},{4,5,6}};
6.2二维数组6.2.3二维数组的的初始化
名师点睛对于二维数组的初始化赋值还有以下几点说明:(1)可以只对部分元素赋初值,未赋初值的元素自动取0值。例如:intx[2][2]={{1},{2}};表示对每一行的第一列元素赋值,未赋值的元素取0值。赋值后各元素的值为:x[0][0]=1,x[0][1]=0,x[1][0]=2,x[1][1]=0。(2)如果对全部元素赋初值,第一维长度可以不给出。例如,二维数组x[2][3]的初始化过程可写成:intx[][3]={1,2,3,4,5,6};系统会根据数据总个数和第二维的长度计算出第一维的长度。数组总共有6个元素,每行3列,显然可以确定行数为2。
6.2二维数组6.2.3二维数组的的初始化【例6-4】求一个3*3矩阵的两条对角线元素之和(注意:两条对角线交叉点处的元素只计算一次)。【问题分析】利用双重for循环控制输入二维数组,将两个下标一致的元素(即其中一条对角线上的元素)累加到result1;将两个下标不一致、但它们的和等于2的元素(即另一条对角线上并不在交叉点处的元素)累加到result2,最后将result1、result2相加得到最后的结果并输出。
6.2二维数组6.2.4二维数组应用举例【参考代码】#include<stdio.h>intmain(){ inta[3][3]; /*定义3*3矩阵*/ inti,j,sum,result1=0,result2=0; /*定义变量*/ for(i=0;i<3;i++) /*外循环*/ { printf("输入一行:"); /*输出提示信息*/ for(j=0;j<3;j++) /*内循环*/ { scanf("%d",&a[i][j]); /*逐行输入矩阵*/ if(i==j) /*如下标相同,则累加到result1*/ result1+=a[i][j]; if(i+j==2&&i!=j) /*如下标不同且和为2,则累加到result2*/ result2+=a[i][j]; } } sum=result1+result2; /*将result1和result2相加*/ printf("sum=%d\n",sum); /*输出结果*/}
6.2二维数组6.2.4二维数组应用举例【运行结果】程序运行结果如图所示。
6.2二维数组6.2.4二维数组应用举例【例6-5】一个学习小组有6个人,每个人有3门课(数学、语文和英语)的考试成绩,如表所示。求每门课的平均分和每个人的平均分。课程王笑李鹏吴欣张平赵明张晓娜数学859384859586语文7995958010098英语809193759790【问题分析】可设一个二维数组a[3][6]存放6个人3门课的成绩。再设一个一维数组v[3]存放每门课的平均分,设一
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年厦门市海沧区洪塘学校顶岗教师招聘备考题库及1套完整答案详解
- 2026年四川长虹国际酒店有限责任公司关于员工长期公开招聘备考题库及1套完整答案详解
- 2026年东莞仲裁委员会新疆生产建设兵团第三师分会招聘备考题库及完整答案详解一套
- 2026年中国新兴厦门进出口有限责任公司招聘备考题库附答案详解
- 2026年中粮集团有限公司公开招聘备考题库及参考答案详解
- 2026年三亚市公安局公开选聘下属事业单位工作人员备考题库(第1号)有答案详解
- 2026年广西期刊传媒集团有限公司招聘工作人员若干人备考题库及完整答案详解一套
- 2026年中国检验认证集团新疆有限公司阿拉山口分公司招聘备考题库及一套答案详解
- 2026年台江县民族中医院第四次公开招聘备案制专业技术人员7人实施备考题库有答案详解
- 2026年宁县第二人民医院公开招聘专业技术人员备考题库附答案详解
- 2025公需课《人工智能赋能制造业高质量发展》试题及答案
- 升降柱的施工方案
- 天津市和平区天津益中学校2021-2022学年七年级上学期期末数学试题【带答案】
- 华泰财险人类辅助生殖医疗费用保险条款
- TCALC 003-2023 手术室患者人文关怀管理规范
- 关键对话-如何高效能沟通
- 村级组织工作制度
- 排水管网清淤疏通方案(技术方案)
- 安全文明施工措施费用支付计划三篇
- 人教版九年级化学导学案全册
- 国开电大商业银行经营管理形考作业3参考答案
评论
0/150
提交评论