《c语言大学实用教程第6章数组-新.ppt》由会员分享,可在线阅读,更多相关《c语言大学实用教程第6章数组-新.ppt(95页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第第第6 6 6 6章章章章 数组数组数组数组12023/1/162 如何计算一个班级学生的平均分数?如何计算一个班级学生的平均分数?如何计算一个班级学生的平均分数?如何计算一个班级学生的平均分数?如何记录直线上的整数点?如何记录直线上的整数点?如何记录直线上的整数点?如何记录直线上的整数点?比如比如比如比如(0 0,0 0)、()、()、()、(1 1、1 1)、()、()、()、(2 2、2 2)、()、()、()、(3 3、3 3)、()、()、()、(4 4、4 4)、()、()、()、(5 5、5 5)。)。)。)。数组数组2023/1/163问题:问题:问题:问题:给一组数排序,
2、这组给一组数排序,这组给一组数排序,这组给一组数排序,这组 数该数该数该数该 如何存放呢如何存放呢如何存放呢如何存放呢?这些数据如何存放才便于排序82945637617188888888881111111111111118 8 88888888这便是本章所要解决的问题第第6 6章章 数组数组数组数组2023/1/164内容提要内容提要 数组类型;数组类型;数组类型;数组类型;向函数传递一维数组和二维数组;向函数传递一维数组和二维数组;向函数传递一维数组和二维数组;向函数传递一维数组和二维数组;常用算法:排序、查找、求最大最小值等;常用算法:排序、查找、求最大最小值等;常用算法:排序、查找、求最
3、大最小值等;常用算法:排序、查找、求最大最小值等;用字符数组存取字符串;用字符数组存取字符串;用字符数组存取字符串;用字符数组存取字符串;使用字符串处理函数处理字符串使用字符串处理函数处理字符串使用字符串处理函数处理字符串使用字符串处理函数处理字符串2023/1/165数组的用处数组的用处 保存大量同类型的相关数据保存大量同类型的相关数据保存大量同类型的相关数据保存大量同类型的相关数据如矩阵运算,表格数据等如矩阵运算,表格数据等如矩阵运算,表格数据等如矩阵运算,表格数据等 构造数据类型之一构造数据类型之一构造数据类型之一构造数据类型之一 数组数组数组数组:有序数据的集合有序数据的集合有序数据的
4、集合有序数据的集合,用数组名标识用数组名标识用数组名标识用数组名标识 元素元素元素元素:属同一数据类型属同一数据类型属同一数据类型属同一数据类型,用数组名和下标确定用数组名和下标确定用数组名和下标确定用数组名和下标确定2023/1/1666.1 一维数组一维数组的定义:数据类型 数组名常量或常量表达式;合法标识符表示元素个数下标从0开始例 inta6;编译时分配连续内存内存字节数=数组定义的元素个数*sizeof(元素数据类型)数组名表示内存首地址,是地址常量a014523a00145a1a2a3a4a523a2023/1/167一维数组的引用v数组必须先定义,后使用v只能逐个引用数组元素,不
5、能一次引用整个数组v数组元素表示形式:数组名下标其中:下标可以是整型常量或整型表达式以0开始,到n-1结束例inta10;printf(“%d”,a);()必须for(j=0;j10;j+)printf(“%dt”,aj);()例intdata5;data5=10;/C语言对数组不作越界检查,使用时要注意下标越界是大忌!使用大于最大下标的下标,将访问数组以外的空间。那里的数据是未知的,可能带来严重后果2023/1/168数组的定义与初始化数组的定义与初始化 数组定义后的初值仍然是随机数,一般需要我们来初数组定义后的初值仍然是随机数,一般需要我们来初数组定义后的初值仍然是随机数,一般需要我们来初
6、数组定义后的初值仍然是随机数,一般需要我们来初始化始化始化始化 intint a5=12,34,56,78,9;a5=12,34,56,78,9;intint a5=0;a5=0;intint a=11,22,33,44,55;a=11,22,33,44,55;数组大小最好用宏来定义,以适应未来可能的变化数组大小最好用宏来定义,以适应未来可能的变化数组大小最好用宏来定义,以适应未来可能的变化数组大小最好用宏来定义,以适应未来可能的变化#define#define SIZE 10 SIZE 10intint aSIZE;aSIZE;数组大小定义好后,将永远不变数组大小定义好后,将永远不变数组大小
7、定义好后,将永远不变数组大小定义好后,将永远不变2023/1/169一维数组的初始化v初始化方式在定义数组时,为数组元素赋初值(在编译阶段使之得到初值)inta5=1,2,3,4,5;等价于:a0=1;a1=2;a2=3;a3=4;a4=5;v说明:l数组不初始化,其元素值为随机数l对static数组元素不赋初值,系统会自动赋以0值l当全部数组元素赋初值时,可不指定数组长度如inta5=6,2,3;等价于:a0=6;a1=2;a2=3;a3=0;a4=0;如inta3=6,2,3,5,1;()staticinta5;等价于:a0=0;a1=0;a2=0;a3=0;a4=0;l只给部分数组元素赋
8、初值inta=1,2,3,4,5,6;编译系统根据初值个数确定数组元素个数2023/1/1610 float a0;float a0;float a0;float a0;/*/*/*/*数组大小为数组大小为数组大小为数组大小为0 0 0 0没有意义没有意义没有意义没有意义*/int b(2)(3);int b(2)(3);int b(2)(3);int b(2)(3);/*/*/*/*不能使用圆括号不能使用圆括号不能使用圆括号不能使用圆括号*/int k,ak;int k,ak;int k,ak;int k,ak;/*/*/*/*不能用变量说明数组大小不能用变量说明数组大小不能用变量说明数组大
9、小不能用变量说明数组大小*/数组说明中其他常见的错误数组说明中其他常见的错误数组说明中其他常见的错误数组说明中其他常见的错误2023/1/1611数组的特点数组的特点 快速地随机访问快速地随机访问快速地随机访问快速地随机访问 一旦定义,不能改变大小一旦定义,不能改变大小一旦定义,不能改变大小一旦定义,不能改变大小2023/1/1612只能逐个对数组元素进行操作(字符数组例外)只能逐个对数组元素进行操作(字符数组例外)输入方法:输入方法:输入方法:输入方法:int a10,i;输入第输入第输入第输入第i i个数组元素:个数组元素:个数组元素:个数组元素:scanf(%d,&ai);输入整个数组元
10、素输入整个数组元素输入整个数组元素输入整个数组元素:for(i=0;i10;i+)scanf(%d,&ai);输出方法:输出方法:输出方法:输出方法:输出第输出第输出第输出第i i个数组元素:个数组元素:个数组元素:个数组元素:printf(%d,ai);输出整个数组元素:输出整个数组元素:输出整个数组元素:输出整个数组元素:for(i=0;i10;i+)printf(%d,ai);一维数组的输入和输出一维数组的输入和输出2023/1/1613程序举例例将10个整数存入数组,并打印输出。#include#defineSIZE10main()intxSIZE=0,1,2,3,4,5,6,7,8,
11、9;inti;for(i=0;iSIZE;i+)printf(%d,xi);#include#defineSIZE10main()intxSIZE,i;printf(Enter10integers:n);for(i=0;iSIZE;i+)scanf(%d,&xi);for(i=1;iSIZE;i+)printf(%d,xi);2023/1/1614程序举例例读10个整数存入数组,找出其中最大值和最小值步骤:1.输入:for循环输入10个整数2.处理:(a)先令max=min=x0(b)依次用xi和max,min比较(循环)若maxxi,令min=xi3.输出:max和min#include#d
12、efineSIZE10main()intxSIZE,i,max,min;printf(Enter10integers:n);for(i=0;iSIZE;i+)scanf(%d,&xi);max=min=x0;for(i=1;iSIZE;i+)if(maxxi)min=xi;printf(Maximumvalueis%dn,max);printf(Minimumvalueis%dn,min);2023/1/1621例例6.1 兔子繁殖问题兔子繁殖问题兔子繁殖问题兔子繁殖问题 打印每个月和年底时的总的兔子对数打印每个月和年底时的总的兔子对数打印每个月和年底时的总的兔子对数打印每个月和年底时的总的兔
13、子对数 FibonacciFibonacci数列数列数列数列 1 1 2 2 3 3 5 5 8 8 1313 2121 3434 5555 8989 144144 233233,2023/1/1622例例6.1#includeinclude#definedefine YEAR_MONTH 12 YEAR_MONTH 12mainmain()()intint fYEAR_MONTH+1=0,1,2;fYEAR_MONTH+1=0,1,2;intint month;month;forfor(month=3;month=YEAR_MONTH;month+)(month=3;month=YEAR_M
14、ONTH;month+)fmonth=fmonth-1+fmonth-2;fmonth=fmonth-1+fmonth-2;forfor(month=1;month=YEAR_MONTH;month+)(month=1;month=YEAR_MONTH;month+)printfprintf(%dt,fmonth);(%dt,fmonth);printfprintf(nsum=%dn,fYEAR_MONTH);(nsum=%dn,fYEAR_MONTH);2023/1/1623例例6.2 打印出最高分及其学生序号打印出最高分及其学生序号 从键盘输入信管从键盘输入信管从键盘输入信管从键盘输入信管
15、1 1班学生高数成绩(每班最多班学生高数成绩(每班最多班学生高数成绩(每班最多班学生高数成绩(每班最多不超过不超过不超过不超过4545人,具体人数由键盘输入人,具体人数由键盘输入人,具体人数由键盘输入人,具体人数由键盘输入),),试编程输试编程输试编程输试编程输出最高分及其学生序号。出最高分及其学生序号。出最高分及其学生序号。出最高分及其学生序号。2023/1/1624max(i=0)max(i=2)max(i=3)计算最大值算法计算最大值算法计算最大值算法计算最大值算法2023/1/1625 Step1 Step1 从键盘输入学生人数从键盘输入学生人数从键盘输入学生人数从键盘输入学生人数n
16、n;Step2 Step2 从键盘输入所有学生的学号和成绩分别存入数组从键盘输入所有学生的学号和成绩分别存入数组从键盘输入所有学生的学号和成绩分别存入数组从键盘输入所有学生的学号和成绩分别存入数组numnum和和和和scorescore Step3 Step3 假设其中的一个学生成绩为最高,同时记录其学号,即令假设其中的一个学生成绩为最高,同时记录其学号,即令假设其中的一个学生成绩为最高,同时记录其学号,即令假设其中的一个学生成绩为最高,同时记录其学号,即令maxScore=score0maxScore=score0maxNum=num0maxNum=num0;Step4 Step4 对所有学
17、生成绩进行比较,即对所有学生成绩进行比较,即对所有学生成绩进行比较,即对所有学生成绩进行比较,即 for(i=0;in;i+)for(i=0;i maxScorescorei maxScore,则修改则修改则修改则修改maxScoremaxScore值为值为值为值为scoreiscorei,并记录其学号并记录其学号并记录其学号并记录其学号maxNum=numimaxNum=numi;Step5 Step5 打印最高分打印最高分打印最高分打印最高分maxScoremaxScore及其学号及其学号及其学号及其学号maxNummaxNum。例例例例6.2 6.2 算法算法算法算法 2023/1/16
18、26.main()main().forfor(i=0;in;i+)(i=0;in;i+)scanf(%ld%f,&numi,&scorei);scanf(%ld%f,&numi,&scorei);maxScoremaxScore =score0;=score0;forfor(i=1;in;i+)(i=1;i maxScore)(scorei maxScore)maxScoremaxScore =scorei;=scorei;printf(maxScore=%.0fn,maxScore);printf(maxScore=%.0fn,maxScore);例例例例6.2 6.2 打印最高分打印最高分
19、打印最高分打印最高分2023/1/1627.main()main().forfor(i=0;in;i+)(i=0;in;i+)scanf(%ld%f,&numi,&scorei);scanf(%ld%f,&numi,&scorei);maxScore=score0;maxScore=score0;maxNum=num0;maxNum=num0;forfor(i=1;in;i+)(i=1;i maxScore)(scorei maxScore)maxScore=scorei;maxScore=scorei;maxNum=numi;maxNum=numi;printf(maxScore=%.0fp
20、rintf(maxScore=%.0f,maxNum=,maxNum=%ld%ldn,maxScore,n,maxScore,maxNummaxNum););例例例例6.2 6.2 打印最高分及其打印最高分及其打印最高分及其打印最高分及其学生序号学生序号学生序号学生序号 用函数实现?用函数实现?用函数实现?用函数实现?同时输出最高分和最低分及其同时输出最高分和最低分及其同时输出最高分和最低分及其同时输出最高分和最低分及其学生序号,该如何改写程序呢学生序号,该如何改写程序呢学生序号,该如何改写程序呢学生序号,该如何改写程序呢?2023/1/1628#includeinclude#definede
21、fine ARR_SIZE 40 ARR_SIZE 40float FindMax(float arr,int n);float FindMax(float arr,int n);mainmain()()floatfloat scoreARR_SIZE,maxScore;scoreARR_SIZE,maxScore;intint n,i;n,i;printf(Please enter total number:);printf(Please enter total number:);scanf(%d,&n);scanf(%d,&n);printf(Please enter the score:
22、n);printf(Please enter the score:n);forfor(i=0;in;i+)(i=0;in;i+)scanf(%f,&scorei);scanf(%f,&scorei);maxScore=FindMax(score,n);maxScore=FindMax(score,n);printf(maxScore=%.0fn,maxScore);printf(maxScore=%.0fn,maxScore);float float FindMax(float arr,int n)FindMax(float arr,int n)floatfloat max;max;intin
23、t i;i;max=arr0;max=arr0;forfor(i=1;in;i+)(i=1;i max)(arri max)max=arri;max=arri;return max;return max;现场编程现场编程现场编程现场编程用函数实现打印最高分用函数实现打印最高分用函数实现打印最高分用函数实现打印最高分2023/1/1629数组名作函数参数数组名作函数参数数组名作函数参数数组名作函数参数 P174-6.3P174-6.3 传递整个数组到另一个函数内,传递整个数组到另一个函数内,传递整个数组到另一个函数内,传递整个数组到另一个函数内,可以将数组的可以将数组的可以将数组的可以将数组的首
24、地址首地址首地址首地址作为参数作为参数作为参数作为参数传过去传过去传过去传过去用数组名作为函数参数用数组名作为函数参数用数组名作为函数参数用数组名作为函数参数只拷贝一个地址自然比拷贝全部只拷贝一个地址自然比拷贝全部只拷贝一个地址自然比拷贝全部只拷贝一个地址自然比拷贝全部数据效率高数据效率高数据效率高数据效率高由于首地址相同,故实参数组与由于首地址相同,故实参数组与由于首地址相同,故实参数组与由于首地址相同,故实参数组与形参数组占用同一段内存形参数组占用同一段内存形参数组占用同一段内存形参数组占用同一段内存在该函数内,不仅可以读这个数在该函数内,不仅可以读这个数在该函数内,不仅可以读这个数在该函
25、数内,不仅可以读这个数组的元素,还可以修改它们组的元素,还可以修改它们组的元素,还可以修改它们组的元素,还可以修改它们2023/1/1630 简单变量和数组作函数参数简单变量和数组作函数参数的区别的区别2023/1/1631 用数组名作函数参数时,此时形参应当用数组名或用指针变量。例例-L函数地址传递函数地址传递.c有一个一维数组有一个一维数组score,内放,内放3个学个学生成绩,求平均成绩。生成绩,求平均成绩。2023/1/1632#include float average(float array3);/*函数声明函数声明*/void main()float score3,aver;in
26、t i;printf(input 3 scores:n);for(i=0;i3;i+)scanf(%f,&scorei);printf(n);aver=average(score);printf(average score is%5.2fn,aver);2023/1/1633float average(float array3)int i;float aver,sum=0;for(i=0;i3;i+)sum=sum+arrayi;aver=sum/3.0;return aver;运行情况如下:运行情况如下:长度可以不声明吗?长度可以不声明吗?P174-175P174-1752023/1/163
27、4作业作业 P198P198 6.46.42023/1/1635现场演示排序算法现场演示排序算法 交换法排序交换法排序交换法排序交换法排序 选择法排序选择法排序选择法排序选择法排序2023/1/1636交换法排序交换法排序交换法排序交换法排序第一轮后第一轮后2023/1/1637交换法排序交换法排序交换法排序交换法排序第二轮后第二轮后第三轮后第三轮后2023/1/1638交换法排序交换法排序交换法排序交换法排序交换法排序交换法排序 forfor(i=0;in-1;i+)(i=0;in-1;i+)forfor(j=(j=i+1i+1;jn;j+);j scorei)(scorej scorei)
28、交换交换交换交换成绩成绩成绩成绩scorejscorej和和和和scoreiscorei,交换交换交换交换学号学号学号学号numjnumj和和和和numinumi;2023/1/1639选择法排序选择法排序选择法排序选择法排序k=1k=2k=0k=12023/1/1640选择法排序选择法排序选择法排序选择法排序k=3k=4k=3k=42023/1/1641选择法排序选择法排序选择法排序选择法排序选择法排序选择法排序 forfor(i=0;in-1;i+)(i=0;in-1;i+)k=i;k=i;forfor(j=i+1j=i+1;jn;j+);j scorek)(scorej scorek)记
29、录此轮比较中最高分的元素下标记录此轮比较中最高分的元素下标记录此轮比较中最高分的元素下标记录此轮比较中最高分的元素下标 k=j;k=j;若若若若k k中记录的最大数不在位置中记录的最大数不在位置中记录的最大数不在位置中记录的最大数不在位置i i,则,则,则,则 交换交换交换交换成绩成绩成绩成绩scorekscorek和和和和scoreiscorei,交换交换交换交换学号学号学号学号numknumk和和和和numinumi;2023/1/1642现场演示查找算法现场演示查找算法 顺序查找顺序查找顺序查找顺序查找 折半查找折半查找折半查找折半查找2023/1/1643顺序查找顺序查找intint
30、Search(Search(longlong a,a,intint n,n,longlong x)x)intint i;i;forfor(i=0;in;i+)(i=0;iamid,low=mid+1第二次循环:第二次循环:99011 99013 99015 99017 99019 low=mid high x=amid,找到,找到哈,找到了!2023/1/1645折半查找折半查找数组下标数组下标 0 1 2 3 4 5 6第一次循环:第一次循环:99011 99013 99015 99017 99019 查找值查找值x=99016 low mid high xamid,low=mid+1第二次
31、循环:第二次循环:99011 99013 99015 99017 99019 low=mid high xamid,high=mid-1第三次循环:第三次循环:99011 99013 99015 99017 99019 high low 不满足不满足low=high,循环结束循环结束,未找到未找到 唉,没找到!2023/1/1646intint BinSearch(BinSearch(longlong a,a,intint n,n,longlong x)x)intint low,high,mid;low,high,mid;low=0;low=0;high=n-1;high=n-1;whilew
32、hile(low=high)(low amid)(x amid)low=mid+1;low=mid+1;elseelse ifif(x amid)(x amid)high=mid-1;high=mid-1;elseelse returnreturn(mid);(mid);returnreturn(-1);(-1);2023/1/1647排序排序&查找作业查找作业 作业:作业:作业:作业:1.1.请请将从将从将从将从键盘输键盘输入的入的入的入的5 5个整数,从大到小排列个整数,从大到小排列个整数,从大到小排列个整数,从大到小排列后后后后输输出到屏幕。出到屏幕。出到屏幕。出到屏幕。2.2.从从从从
33、键盘键盘随便随便随便随便输输入的入的入的入的5 5个整数存个整数存个整数存个整数存储储到数到数到数到数组组a a中,中,中,中,将将将将这这5 5个数中最大数的下个数中最大数的下个数中最大数的下个数中最大数的下标输标输出到屏幕。出到屏幕。出到屏幕。出到屏幕。2023/1/1648二维数组的定义和引用二维数组的定义和引用 二维数组定义的一般形式为二维数组定义的一般形式为类型说明符类型说明符 数组名数组名常量表达式常量表达式常量表达式常量表达式;例如:例如:定义定义a a为为34(334(3行行4 4列列)的数组,的数组,b b为为510(5510(5行行1010列列)的数组。如下:的数组。如下:
34、float afloat a3 34 4,b b5 51010;不能写成不能写成 float afloat a3 3,4 4,b b5 5,1010;2023/1/1649注意注意我们可以把二维数组看作是一种特殊的一维数组:它我们可以把二维数组看作是一种特殊的一维数组:它的元素又是一个一维数组。的元素又是一个一维数组。例如,可以把例如,可以把a看作是一个一维数组,它有看作是一个一维数组,它有3个元素:个元素:a0、a1、a2,每个元素又是一个包含,每个元素又是一个包含4个元素的一维数组。个元素的一维数组。2023/1/1650二维数组的定义二维数组的定义 二维数组中的元素在内存中的排列顺序是:
35、按行存放,即先顺序存放第一行的元素,再存放第二行的元素一维数组在内存中的存放一维数组在内存中的存放一维数组在内存中的存放一维数组在内存中的存放下图表示对下图表示对下图表示对下图表示对a a3 34 4数组存放的顺序数组存放的顺序数组存放的顺序数组存放的顺序 2023/1/1651地址地址地址地址 值值值值 数组元素数组元素数组元素数组元素b b0000b b0101b b0202b b1010b b1111b b1212b b2020b b2121b b22223003000 0H H3003002 2H H3003004 4H H3003006 6H H3003008 8H H300300A
36、 AH H300300C CH H300300E EH H30301010H H例如:整型数组例如:整型数组 b33=1,2,3,4,5,6,7,8,9;1234567891 1 1 12 2 2 23 3 3 34 4 4 45 5 5 56 6 6 67 7 7 78 8 8 89 9 9 92023/1/1652二维数组元素的表示形式为:二维数组元素的表示形式为:数组名下标下标数组名下标下标 例如:例如:a a2 23 3下标可以是整型表达式,下标可以是整型表达式,如如 a a2-12-12*2-12*2-1数组元素可以出现在表达式中,也可以被赋值,例如:数组元素可以出现在表达式中,也可
37、以被赋值,例如:b b1 12 2=a=a2 23 3/2/2注意注意不要写成不要写成 a a2 2,3 3,a a2-12-1,2*2-12*2-1形式形式二维数组的引用二维数组的引用2023/1/1653常出现的错误有:常出现的错误有:int a34;/*/*定义定义a a为为3434的数组的数组*/a34=3;在使用数组元素时,应该注意下标值应在已定义在使用数组元素时,应该注意下标值应在已定义的数组大小的范围内。的数组大小的范围内。2023/1/1654可以用下面可以用下面4 4种方法对二维数组初始化种方法对二维数组初始化数据类型数据类型 数组名数组名 常量表达式常量表达式1 1常量表达
38、式常量表达式2 2 初始化数据初始化数据;(1)(1)分行给二维数组赋初值。分行给二维数组赋初值。如:如:int a34=1,2,3,4,5,6,7,8,9,10,11,12;(2)(2)可以将所有数据写在一个花括弧内,按数组排列可以将所有数据写在一个花括弧内,按数组排列的顺序对各元素赋初值。的顺序对各元素赋初值。如:如:int aint a3 34 4=1=1,2 2,3 3,4 4,5 5,6 6,7 7,8 8,9 9,1010,1111,12;12;二维数组的引用二维数组的引用2023/1/1655(3)(3)可以对部分元素赋初值。可以对部分元素赋初值。如如 int a34=1,5,9
39、;1 0 0 01 0 0 05 0 0 0 5 0 0 0 9 0 0 0也可以对各行中的某一元素赋初值,如int a34=1,0,6,0,0,0,0,11;1 0 0 01 0 0 00 6 0 00 6 0 00 0 0 0 110 0 11 1 0 0 01 0 0 05 6 0 0 5 6 0 0 0 0 0 0也可以只对某几行元素赋初值。如:也可以只对某几行元素赋初值。如:int a34=1,5,6;2023/1/1656(4)(4)如果对全部元素都赋初值,则定义数组时对第一维如果对全部元素都赋初值,则定义数组时对第一维的长度可以不指定,但第二维的长度不能省。的长度可以不指定,但第
40、二维的长度不能省。如:如:int aint a3 34 4=1=1,2 2,3 3,4 4,5 5,6 6,7 7,8 8,9 9,1010,1111,12;12;它等价于:它等价于:int aint a4 4=1=1,2 2,3 3,4 4,5 5,6 6,7 7,8 8,9 9,1010,1111,12;12;在定义时也可以只对部分元素赋初值而省略第一维的在定义时也可以只对部分元素赋初值而省略第一维的长度,但应分行赋初值。如:长度,但应分行赋初值。如:int aint a4 4=0=0,0 0,33,00,10;10;0030000001000二维数组的引用二维数组的引用2023/1/16
41、57二维数组的输入和输出二维数组的输入和输出数组的输入和输出只能逐个对数组元素进行操作数组的输入和输出只能逐个对数组元素进行操作(字符数组例外)(字符数组例外)int b23,i,j;输入方法:输入方法:输入方法:输入方法:输入第输入第i行第行第j列元素:列元素:scanf(“%d”,&aij);输入整个数组元素:输入整个数组元素:for(i=0;i2;i+)for(j=0;j3;j+)scanf(“%d”,&aij);输出方法:输出方法:输出方法:输出方法:输出第输出第i行第行第j列元素:列元素:printf(“%d”,aij);输出整个数组元素:输出整个数组元素:for(i=0;i2;i+
42、)for(j=0;j3;j+)printf(“%d”,aij);2023/1/1658二维数组程序举例二维数组程序举例 例例kw1 kw1 将一个二维数组行和列元素互换,存到另一个将一个二维数组行和列元素互换,存到另一个 二维数组中。二维数组中。#includevoidmain()inta23=1,2,3,4,5,6;intb32,i,j;printf(arraya:n);for(i=0;i=1;i+)for(j=0;j=2;j+)printf(%5d,aij);/*打印输出矩阵a的元素,先行后列*/bji=aij;/*给矩阵b赋值*/printf(n);/*下一行输出前,先换行*/例如:a=
43、1 2 3 1 4 4 5 6 b=2 5 3 62023/1/1659printf(arrayb:n);for(i=0;i=2;i+)for(j=0;j=1;j+)printf(%5d,bij);/*打印输出矩阵b的元素,先行后列*/printf(n);/*程序结束*/运行结果如下:array a:1 2 3 4 5 6array b:1 4 2 536 2023/1/1660例例kw2:kw2:有一个有一个34的矩阵,要求编程序求出其中值最大的的矩阵,要求编程序求出其中值最大的那个元素的值,以及其所在的行号和列号。那个元素的值,以及其所在的行号和列号。先用先用N-S流程图表示算法流程图表示
44、算法,如下:如下:二维数组程序举例二维数组程序举例 +1+1+1+12023/1/1661#includevoidmain()inti,j,row=0,colum=0,max;inta34=1,2,3,4,9,8,7,6,-10,10,-5,2;max=a00;for(i=0;i=2;i+)for(j=0;jmax)max=aij;/*最大值为当前值*/row=i+1;/*记录行、列号*/colum=j+1;printf(max=%d,row=%d,colum=%dn,max,row,colum);/*程序结束*/2023/1/16626.4 向函数传递二维数组向函数传递二维数组 实际传送的是
45、指向数组第一个元素的实际传送的是指向数组第一个元素的实际传送的是指向数组第一个元素的实际传送的是指向数组第一个元素的地址地址地址地址 在声明二维数组形参时,不能省略数在声明二维数组形参时,不能省略数在声明二维数组形参时,不能省略数在声明二维数组形参时,不能省略数组第二维的长度,为什么?组第二维的长度,为什么?组第二维的长度,为什么?组第二维的长度,为什么?a00a01a02a10a11a12a00a01a02a10a11a122023/1/1663例例6.8 计算每门课程的总分和平均分计算每门课程的总分和平均分voidvoid Total(Total(intint scoreCOURSE,sc
46、oreCOURSE,intint sum,sum,floatfloat aver,aver,intint n)n)intint i,j;i,j;forfor(j=0;jCOURSE;j+)(j=0;jCOURSE;j+)sumj=0;sumj=0;forfor(i=0;in;i+)(i=0;in;i+)sumj=sumj+scoreij;sumj=sumj+scoreij;averj=(float)sumj/n;averj=(float)sumj/n;可以省略数组第一维的长度可以省略数组第一维的长度可以省略数组第一维的长度可以省略数组第一维的长度不能省略数组第二维的长度不能省略数组第二维的长度
47、不能省略数组第二维的长度不能省略数组第二维的长度2023/1/16646.5 字符数组字符数组 字符字符字符字符 charchar 字符串字符串字符串字符串2023/1/1665字符串字符串(String)与字符数组与字符数组 字符串字符串字符串字符串一串以一串以一串以一串以00结尾的字符在结尾的字符在结尾的字符在结尾的字符在C C语言中被看作字符串语言中被看作字符串语言中被看作字符串语言中被看作字符串用双引号括起的一串字符是字符串常量,用双引号括起的一串字符是字符串常量,用双引号括起的一串字符是字符串常量,用双引号括起的一串字符是字符串常量,C C语言自动为其语言自动为其语言自动为其语言自动
48、为其添加添加添加添加00终结符终结符终结符终结符C C语言并没有为字符串提供任何专门的表示法,完全使用语言并没有为字符串提供任何专门的表示法,完全使用语言并没有为字符串提供任何专门的表示法,完全使用语言并没有为字符串提供任何专门的表示法,完全使用字符数组字符数组字符数组字符数组和和和和字符指针字符指针字符指针字符指针来处理来处理来处理来处理 字符数组字符数组字符数组字符数组每个元素都是字符类型的数组每个元素都是字符类型的数组每个元素都是字符类型的数组每个元素都是字符类型的数组 charchar string80;string80;2023/1/1666字符数组的初始化字符数组的初始化 P188
49、 用字符型数据对数组进行初始化用字符型数据对数组进行初始化用字符型数据对数组进行初始化用字符型数据对数组进行初始化 charchar str6=C,h,i,n,a,0;str6=C,h,i,n,a,0;字符数组长度为字符数组长度为字符数组长度为字符数组长度为6 6,但字符串实际长度为,但字符串实际长度为,但字符串实际长度为,但字符串实际长度为5 5 char char str6=C,h,i,n,a;str6=C,h,i,n,a;用字符串常量直接对数组初始化用字符串常量直接对数组初始化用字符串常量直接对数组初始化用字符串常量直接对数组初始化 charchar str6=China;str6=Ch
50、ina;charchar str6=China;str6=China;charchar str=China;str=China;charchar str=China;str=China;charchar str5=China;str5=China;长度不够,无法按照字符串来处理长度不够,无法按照字符串来处理长度不够,无法按照字符串来处理长度不够,无法按照字符串来处理结尾不是结尾不是结尾不是结尾不是00不是字符串!不是字符串!不是字符串!不是字符串!2023/1/16670作为字符串结束符的天生作为字符串结束符的天生缺陷缺陷 假若交给这些字符串处理函数的字符串没有假若交给这些字符串处理函数的字符