版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、7.1 一维数组的定义和使用一维数组的定义和使用 7.2 二维数组的定义和使用二维数组的定义和使用 7.3 字符数组字符数组 1一维数组的定义和使用 数据类型数据类型 基本数据类基本数据类 型型 构造类型构造类型 整型整型 int 2字节字节 字符型字符型 char 1字节字节 实型(浮点型)实型(浮点型) 枚举型枚举型 enum 单精度型单精度型 float 4字节字节 双精度型双精度型 double 8字节字节 长双精度型长双精度型 long double 10字节字节 数组数组 type 结构体结构体 struct 共用体共用体 union 指针指针 type * 空类型空类型 void
2、 数据类型数据类型 l构造类型数据由基本类型数据按照一定规则 组成的,又叫“导出类型”。 l数组有序数据的集合 l下标 数组 数组名 7.1 一维数组定义和使用一维数组定义和使用 一、一维数组定义 二、一维数组元素的引用 三、三、一维数组初始化 四、四、一维数组程序举例 返回 4一维数组的定义和使用 7.1.1一维数组定义一维数组定义 1 1、定义形式:、定义形式: 类型说明符类型说明符 数组名数组名常量表达式常量表达式 如:int a10; 10 是数组的长度,表示该数组有是数组的长度,表示该数组有10个元素,个元素, a0, a1, a2, a3, a4, a5, a6, a7, a8,
3、a9 l每个元素都是一个整型变量,使用上也和普通的每个元素都是一个整型变量,使用上也和普通的 整型变量一样。整型变量一样。 1) 0,1,2,9称为数组下标称为数组下标 5一维数组的定义和使用 2 2、注意:、注意: 、数组名要符合标识符的命名规则,和变 量名相同。 、元素个数为常量表达式而不能是变量表 达式。 、数组的下标从0开始。 、和其他变量一样,数组也必须先定义后 使用。 在内存中的排列为: 数组a a0 a1 a2 长度为长度为n的数组,下标范围为的数组,下标范围为0 (n-1)。)。 7.1.2 一维数组元素的引用一维数组元素的引用 数组必须先定义,后使用 只能逐个引用数组元素,不
4、能一次引用整个 数组。 引用方式:数组名下标 其中,下标是整型常量或整型表达式 例如(P123例7.1):将09逆序输出。 voidmain() inti,a10; for(i=0;i=0;i-)/输出数组值 printf(%dt,ai); 运行结果:9876543210 7.1.3一维数组的初始化 初始化:预先给定一个值。 用以下方法实现初始化: (1)在定义时初始化 例如例如:inta10=1,2,3,4,5,6,7,8,9,10; (3)若使一个数组中全部元素为0,可写成: (2)可只给一部分元素赋值 例如例如: inta10=1,2,3;/正确。a0=1a1=2a3=3 inta10=
5、1,2,4;/error:不能用逗号省略 例如例如:inta3=0,0,0; (4)在对全部数组元素赋初值时,可不指定 数组的长度。(个个赋初值) 例如例如:inta5=1,2,3,4,5; 等价于inta=1,2,3,4,5; 7.1.4 一维数组程序举例一维数组程序举例 P124例7.2求Fibonacci数列(20个)1,1,2,3,5,8, ai=ai-1+ai-2, voidmain() inti; inta20=1,1; for(i=2;i20;i+)/为数组赋值 ai=ai-1+ai-2; for(i=0;i20;i+)/数组元素的输出 if(i%5=0)printf(n);/每
6、输出5个数就换行 printf(%12d,ai); P124例7.3用冒泡法对10个数排序(自学) 思路:将最大的数调到最后(依次进行两两比较,将较小的 置前,较大的置后) 见P124图7.1图7.2 11111 23171766 172361717 786232323 638383838 3878787878 main() int i,j,temp; int a6; for (i=0;i=(6-1);i+) scanf(“%d”, /输入输入6个数给数组个数给数组 for (i=0;i(6-1);i+) / 对数组进行排序对数组进行排序 for(j=0;jaj+1) temp=aj; aj=
7、aj+1; aj+1=temp; for(i=0;i=(6-1);i+) / 输出数组输出数组 printf(%dt,ai); 7.2.1 二维数组元素的定义二维数组元素的定义 1形式:类型说明符数组名下标下标下标下标 例如:floata34,b510; /*a为3行4列,b为5行10列 */ 2把二维数组看成是一种特殊的一维数组,它的 元素又是一个一维数组。 整型常量整型常量 7 72 二维数组的定义和作用二维数组的定义和作用 数组a a02 a00 a01 a03 a10 a11 a12 a13 a20 a21 a22 a23 3存放顺序:按行存放(先存放第一行,再存 放第二行) (a34
8、在内存中的表示) 4允许使用多维数 组。(无论几维数组 都是按行存放) 如:chara324; 1形式:数组名下标下标 2注:(1)数组元素可出现在表达式中,也可被 赋值 例如:例如:b12=a23/2 (2)数组下标值应在已定义的数组大小范 围内 例如:例如:inta34; a34=3;/错误,最大只到 a23 可以是整型表达式,可以是整型表达式, 如如a3-12*2+1 7.2.2 二维数组的引用二维数组的引用 7.2.3二维数组初始化二维数组初始化 1分行给数组赋初值 如:inta34=1,2,3,4,5,6,7,8,9,10,11,12 2可将所有数据写在一个花括号内,按排列顺序赋初值
9、 例如:inta34=1,2,3,4,5,6,7,8,9,10,11,12 例如:inta34=1,5,6,9 inta34=1,2,0,6,7,9,0,11 也可不对某行赋值: inta34=1,2, ,9,0,11 可对部分元素赋初值 又如: 例如: 1000 5600 9000 1200 0670 90110 1200 0000 90110 4对全部元素赋初值时,可对第一维长度不予指定 ,但必须指定第二维长度。 例如:inta34=1,2,3,10,11,12 等价于:inta 4=1,2,3,4,5,6,7,8,9,10,11,12 也可对部分元素赋初值,同时省略第一维长度, 但应分行
10、赋值。 例如:inta4=1,2,0,10 7.2.4 二维数组程序举例(要用到二重循环)二维数组程序举例(要用到二重循环) 例7.4将一个矩阵转置。 例如: a= 123 456 b= 14 25 36 voidmain() inti,j,a23,b32;/数组a存放输入的矩阵,b存 放转置矩阵 for(i=0;i2;i+)/输入的矩阵 for(j=0;j3;j+) scanf(%d, for(i=0;i2;i+)/得到矩阵a的转置矩阵,并存入b中 for(j=0;j3;j+) bji=aij; printf(nNewarray:n); for(i=0;i3;i+)/输出的矩阵b for(j
11、=0;j2;j+) printf(%dt,bij); printf(n); 运行结果: 123/输入数据 456 Newarray:/输出数据 14 25 36 P129例7.5求一个3*4矩阵中最大的那个元素,并 指明所在行号和列号 开始开始 a00max, row=0,col=0 0i i=2 jmax aijmax i+1row;j+1col; j+1j i+1i 输出输出max,row,col 结束结束 N Y N N Y Y main( ) int a34=50,2,110,45,10,92,3,33 ,19,912,38,53; int max,row=0,col=0; int i
12、,j; max=a00; for(i=0;i3;i+) for(j=0;jmax) /一旦找到比当前值大一旦找到比当前值大 的元素,立即记录的元素,立即记录 max=aij; row=i+1; col=j+1; printf(max=%d,row=%d,col=%dn,max,row,col); 7 73 字符数组字符数组 字符数组用来存放字符数据的数组,一个元素 存放一个字符。 7.3.1 字符数组的定义字符数组的定义 例如例如:char a10;或inta10; /因为字符型和整型是通用的 a0=I;a1=;a2=m;a3=;a4=h; Imhappy. 7.3.2 字符数组的初始化字符数
13、组的初始化 逐个字符进行赋值。 u当字符个数大于数组长度时,按错误处理; u当字符个数小于数组长度时,随后补空字符0 。 例如例如: chara5=c,p,r,o;/小于 charb5=c,p,r,o,m;/等于,可省略 数组长度charc=c,p,r,o,m charc5=c,p;/小于 c0=cc1=pc2=0c3=0c4=0 7.3.3 字符数组的引用字符数组的引用 可引用字符数组中的一个元素,得到一个字符。 P131例7.6输出一个字符串 voidmain() charc10=I,a,m,a,b,o,y; inti; for(i=0;i10;i+)/通过循环输出字符串 中的每个字符 p
14、rintf(%c,ci); P131例7.7输出一个钻石图形 main() char c5=,*,*,*,*,*,*,*,*; inti,j; for(i=0;i5;i+) for(j=0;j字符串实际长度,也只输出到遇到 0结束。 (d)若一个字符数组中包含一个以上0,则遇到 第一个0时输出结束。 (e)scanf中输入项是字符数组名数组名。 例如:scanf(%s,c); (f)若用scanf函数输入多个字符串,则以空格空格分隔。 例如:charstr10=”your”,str5=”bag”; scanf(%s%s,str1,str2); 输入数据:yourbag (g)scanf函数中的
15、输入项是数组名,且不加不加地址符地址符 puts(str); 运行结果:运行结果:China Beijing 2gets(字符数组) 从终端输入一个字符串到字符数组,并且返回 一个函数值值。 注:用puts和gets函数只能I/O一个一个字符串。 例如:puts(str1,str2)gets(str1,str2)/error 该值是字符数组的“起始地址 ” * * 用用gets()gets()和和puts()puts()实现字符串的输入输出。实现字符串的输入输出。 如果用如果用scanf()进行字符串输入时,字符串中间不能夹带空进行字符串输入时,字符串中间不能夹带空 格,此时可用格,此时可用g
16、ets( )来进行输入。比较以下两个小程序:来进行输入。比较以下两个小程序: main() char ch20; printf(“enter a strings:”); scanf(“%s”,ch); printf(“strings=%s”,ch); main() char ch20; printf(“enter a strings:”); gets(ch); printf(“strings =%s”,ch); 39一维数组的定义和使用 3strcat(字符数组1,字符数组2)字符串连接函 数(stringcatenate) 连接两个字符数组中的字符串,把串2接到串1 后面,结果放在字符数组字
17、符数组1中 函数调用后得到一个函数值字符数组1的 地址地址 注:字符数组1必须足够大大,以容纳连接后的 新串 4strcpy(字符数组1,字符串2) 将串2复制到字符数组1中去。 说明: (1)数组1必须足够大,不应小于串2的长度 (2)数组1必须写成“数组名数组名”形式,串2可以是“ 数组 名”,也可以是“字符串常量” (3)复制时,连同串后的0一起复制到数组1中 (4)不能用赋值语句将一个“字符串常量/字符数组 ” 直接给一个“字符数组”,而只能用strcpy处理 。 用赋值语句,只能将一个“字符字符”直接给一个“字字 符常量符常量/字符数组元素字符数组元素”, (5)用strcpy函数将
18、串2前面若干字符复制到字符数 组1中去 例如:strcpy(str1,str2,2)将串2前2个字符复制到str1 中去,再加个0。 5strcmp(字符串1,字符串2) l字符串比较 l对两个字符串自左至右逐个字符比较(按 ASCII码值大小比较),直到出现不同的 字符或遇到0为止。 以第一个不相同的字符的比较结果为准。 如 : ” A ” ” B ” “ D O G ” ” c a t ” “abc”串2返回值为一正正整数 (3)串1串2返回值为一负负整数 6strlen(字符数组) 求字符串长度 函数返回值为字符串中的实际长度,不包括不包括0在内。 7strlwr(字符串) 将字符串中大
19、写字母转换成小写字母。 8strupr(字符串) 将字符串中小写字母转换成大写字母。 库函数:是人们编写的公共函数,不是C语言本身 的组成部分,不同的系统,其库函数名,数量,功能等 都有所不同,使用时需要注意。 7.3.7 字符数组应用举例字符数组应用举例 P140例例7.9有3个字符串,找出其中最大者。 main( ) char str320;/输入的三个字符串分别存 于str0,str1,str2 char temp_str20;/暂存最大的字符串 int i; for(i=0;i0) strcpy(temp_str,str0); else 从三个字串中选出最大 的字符串 strcpy(t
20、emp_str,str1); / if(strcmp(str2,temp_str)0) strcpy(temp_str,str2); printf(the largest string is:%sn,temp_str);/输出最大的字串 此题还可以设3个一维数组处理(自编) 续:续: 例例7.8输入一行字符,统计其中有多少个单 词,单词之间用空格分开。 for (i = 0; (c=stringi) != 0; i+) if ( c= ) word = 0;/0表示空表示空 else if (word = 0) word = 1;/1表示字符表示字符 num+; printf(“There a
21、re %d words in the line.n”, num); #include main() char string81; int i, num=0, word=0; char c; gets(string); * 常见错误常见错误 1、数组下标越界: 如:int a10,i; for(i=0;i=10;i+) scanf(“%d”, 由于a定义有10个元素,下标为0-9,当i为10 时实际上scanf()形式为scanf(“%d”,a10);而数组a 中根本就没有a10这个元素,所以这次接受输入是 错误的。C语言中对这种错误不做检查,故没有语 法错误,但会把错误带到程序中的其他地方。
22、49一维数组的定义和使用 2、数组整体赋值 如: int a10,b10; . . . b=a; 这是错误的,C语言不允许对数组进行整体的操 作,如果想把a的值赋给b,需要用循环来实现 ,如: for(i=0;i10;i+) bi=ai; 50一维数组的定义和使用 3、对非静态、非外部的数组进行初始化 如: main() float a5=1.2,2.4,3.6,4.8,5.0; . . . C语言规定只有静态数组和外部数组才能初始 化,所以,定义及初始化应写成 Static float a5=1.2,2.4,3.6,4.8,5.0; 51一维数组的定义和使用 4、接受字符串时用了取地址运算符
23、,如: char str20; scanf(“%s”, 由于数组名本身就代表地址,所以不应再加 5、向一个字符数组赋字符串: char str10= ”hello”; str=”hello”; 这种错误和第二中错误为一种错误,即不支持 对数组的整体操作。 52一维数组的定义和使用 6、构造字符串忘记在末尾应加0,如: i=0; while (c=getchar()!=n) linei+=c; printf(“%sn”,line); 由于构造的字符串没有加结束标志,当 printf输出 line时,从line的起始地址开始 一个个的输出后,输出完读入的字符后,没 有遇到0,继续一直输出,这时的内
24、容已 不再是字符串中的字符,因此,在自己构造 一个字符串时,一定不要忘记在末尾加上不要忘记在末尾加上 00. 53一维数组的定义和使用 习题:习题:7.1用筛选法求用筛选法求100内的所有素数内的所有素数 基本思想:基本思想: 把100内的正整数按从小到大的顺序排序。 宣布1不是素数,把它筛掉。 然后从剩下的数中选择最小的,宣布它为素数, 并去掉它的倍数。 再从剩余的数中选最小的,宣布为素数,并去掉 这个数的倍数,依此类推,直到100。 剩下的就都为素数。 54一维数组的定义和使用 for(i=2 ; isqrt(100) ; i+;) for(j=i+1 ; j末尾元素?F Numberfo
25、r(i=0;inumberF number插在ai处 将原第i个元素之后的 所有元素下标依次增1 输出结果 end=a9; if (numberend) a10=number; /插在数组尾插在数组尾 else for(i=0;inumber) temp1=ai;ai=number; /插入第插入第i个位置个位置 for(j=i+1;j11;j+) /第第i+1个数依次向后移个数依次向后移, 借助两个变量借助两个变量 temp2=aj;aj=temp1;temp1=temp2; break; 7.5 数组中值逆序排放数组中值逆序排放8 6 5 4 11 4 5 6 8 for(i=0; iN/
26、2 ;i+) temp=ai;ai=aN-i-1 ; aN-i-1 =temp; 7.8 求二维数组中鞍点,既行中最大,列中最小的点。求二维数组中鞍点,既行中最大,列中最小的点。 flag2=0; / no have dian for(i=0 ; in ; i+) /行中找最大数行中找最大数 max=ai0; for(j=0 ;jmax;) max=aij; maxj=j; for(k=0,flag1=1;kakmaxj flag1=0; / no dian if(flag1) printf(“%d,%d,%d”, i, maxj , max); flag2=1; if(!flag2) printf(“NO an diann”;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 47112-2026移动式矿山机械设备智能化分级
- 技术转移创新路径-洞察与解读
- 技术创新与增长-洞察与解读
- 交通政策区域适配-洞察与解读
- 玩具购买动机分析-洞察与解读
- 【7历期末】安徽省蚌埠市第九中学2025-2026学年七年级上学期期末试卷历史试题
- 2026年云南财经职业学院单招职业适应性测试题库附答案详解ab卷
- 2026年上海第二工业大学单招职业适应性考试题库附参考答案详解(完整版)
- 2026年云南财经职业学院单招职业倾向性考试题库含答案详解(综合卷)
- 2026年云南省西双版纳傣族自治州单招职业倾向性测试题库附参考答案详解(突破训练)
- 收心归位聚合力 实干奋进创未来总经理在2026年春节复工全体员工大会上的致辞
- 2025-2026学年北京市通州区高三(上)期末语文试卷
- 焦化厂电工培训课件教学
- 涉密文件销毁设备选型与管理
- 拆除电气施工方案
- (零模)苏州市2026届高三年级期初阳光调研试卷 生物试卷(含答案)
- 房屋市政工程生产安全重大事故隐患判定标准试题及答案
- 2019抽水蓄能电站工程施工工艺标准手册:土建分册
- 四年级下册道德与法治教学设计 第一单元 3.当冲突发生-部编版
- 数控课程思政说课
- 高中英语新课标3000词汇表(新高考)
评论
0/150
提交评论