1、无求,自然不争。不争,自然无嗔。无嗔,自然少怨。少怨,自然多福。2例如:例如:int a100;功能:一次定义了功能:一次定义了100个整型变量:个整型变量:a0,a1,a99 例如:例如:float x44;功能:一次定义了功能:一次定义了4416个个float型变量:型变量:x00,x01,x33n数组:数组是一组数组:数组是一组类型相同类型相同的的有序有序数据的集数据的集合合q用数组名和下标来唯一确定数组中的元素用数组名和下标来唯一确定数组中的元素第六章第六章 利用数组处理批量数据利用数组处理批量数据3说明:说明:1.类型说明符可以是类型说明符可以是int、char、float等等 2.
2、数组名可以是任意合法的标识符数组名可以是任意合法的标识符 3.数组大小由常量表达式确定数组大小由常量表达式确定 4.常量表达式不允许包含变量常量表达式不允许包含变量 5.数组元素的下标从数组元素的下标从0开始开始6.1 怎样定义和引用一维数组怎样定义和引用一维数组n一维数组的定义一维数组的定义 类型说明符类型说明符 数组名数组名 常量表达式常量表达式 例如:例如:int a10;功能:定义了长度为功能:定义了长度为10的整型数组的整型数组a:a0,a1,.,a8,a94n一维数组元素的引用一维数组元素的引用q数组必须先定义,然后再使用数组必须先定义,然后再使用n数组元素的表示形式:数组元素的表
3、示形式:数组名数组名下标下标q下标可以是整型变量或整型表达式下标可以是整型变量或整型表达式q不能一次引用整个数组,只能逐个引用数组元素不能一次引用整个数组,只能逐个引用数组元素n数组的使用(赋值和引用)需要与循环语句相结数组的使用(赋值和引用)需要与循环语句相结合合n数组的每一个元素相当于一个变量,且类型相同,数组的每一个元素相当于一个变量,且类型相同,相互独立相互独立5例例6.1 对对10个数组元素依次赋值为个数组元素依次赋值为09,然后逆序输出,然后逆序输出#includeint main()()int i,a10;/*定义数组定义数组*/for(i=0;i=0;i-)printf(“%d
4、 ”,ai);/*逆序输出逆序输出*/return 0;算法思想:算法思想:1.初始化:初始化:a00,a11,a99 2.逆序输出数组元素:逆序输出数组元素:a9,a8,a06n一维数组的初始化一维数组的初始化q定义数组时对数组元素赋初值定义数组时对数组元素赋初值(一般初始化一般初始化)例:例:int a3=0,1,2q只给数组中的部分元素赋初值只给数组中的部分元素赋初值 例:例:int a5=0,1,2q将数组元素统一赋初值将数组元素统一赋初值0 例:例:int a5=0q对全部数组元素赋初值时,可以不指定数组长度对全部数组元素赋初值时,可以不指定数组长度 例:例:int a=0,1,27
5、例例6.2 用数组来处理用数组来处理Fibonicci数列的前数列的前20项。项。#includeint main()int i;long int f20=1,1;/*部分赋初值部分赋初值*/for(i=2;i20;i+)fi=fi-1+fi-2;/*计算数组元素计算数组元素*/for(i=0;i20;i+)/*输出数组元素输出数组元素*/if(i%5=0)printf(“n”);printf(“%12ld”,fi);return 0;思想:思想:1.计算计算f 0=f1=1;f2=f1+f0;f19=f18+f172.输出数列元素输出数列元素8算法思想:算法思想:1.输入输入10个数到个数到
6、a0,a1,a9中中2.10个元素个元素,相邻两两比较相邻两两比较,将最大的存到将最大的存到a9中中3.9个元素个元素,相邻两两比较相邻两两比较,将最大的存到将最大的存到a8中中10.2个元素个元素,相邻两两比较相邻两两比较,将最大的存到将最大的存到a1中中11.顺序输出数组顺序输出数组a中的中的10个数个数a0,a1,a9例例6.3 用起泡法对用起泡法对10个数排序(由小到大)。个数排序(由小到大)。10个元素的起泡算法需要进行个元素的起泡算法需要进行9趟比较,每次将最大的趟比较,每次将最大的元素放到最后元素放到最后第第i趟比较需要进行趟比较需要进行n-i次两两比较次两两比较9#includ
7、eint main()int a10;int i,j,t;for(i=0;i10;i+)scanf(“%d”,&ai);/*输入输入10个数组元素个数组元素*/for(j=0;j9;j+)/*起泡排序起泡排序*/for(i=0;iai+1)/*相邻两数比较相邻两数比较,交换交换*/t=ai;ai=ai+1;ai+1=t;printf(“The sorted numbers:n”);for(i=0;i10;i+)printf(“%d ”,ai);/*输出输出*/printf(“n”);return 0;10 要习惯于改变自己,只有你变了,你的世界才会跟着变。鱼儿的世界在水中,鸟儿的世界在天空,你
8、的世界在你力所能及的地方。126.2 怎样定义和引用二维数组怎样定义和引用二维数组n二维数组的定义二维数组的定义类型说明符类型说明符 数组名数组名常量表达式常量表达式常量表达式常量表达式q二维数组可以看做是一维数组的推广二维数组可以看做是一维数组的推广例:例:float a34;b510;功能:功能:a为为3行行4列共列共12个个float型元素的数组;型元素的数组;b为为5行行10列列共共50个个float型元素的数组。型元素的数组。分析:二维数组分析:二维数组a可以看作是一个长度为可以看作是一个长度为3的特殊一维数组,的特殊一维数组,具有三个元素为具有三个元素为a0,a1,a2,而每个元素
9、又是,而每个元素又是4个元素的个元素的数组名,即:元素数组名,即:元素a0又有元素又有元素a00、a01、a02、a03;13float a34中定义的二维数组,相当于定义了中定义的二维数组,相当于定义了12个同种类型个同种类型的元素的元素(或变量或变量):a00、a01、a02、a03a10、a11、a12、a13a20、a21、a22、a23在内存中排列顺序为:按行存放。先存放第一行元素,再存在内存中排列顺序为:按行存放。先存放第一行元素,再存放第二行元素,放第二行元素,例:例:float a234;定义定义234的三维数组的三维数组a,有有24个元素个元素,分别为:分别为:a000、a0
10、01、a002、a003、a010、a011、a012、a013、a123、14例:例:float x1020,y456;n二维数组的引用二维数组的引用数组名数组名下标下标下标下标q每一个元素都是一个独立的变量每一个元素都是一个独立的变量q每一个下标都是从每一个下标都是从0开始开始,不能超出定义的数组大不能超出定义的数组大小小数组数组float x1020中无元素中无元素x1020引用元素引用元素 xij时,时,i值只能是值只能是0,9;j值只能是值只能是0,19引用元素引用元素 yijk时,时,i值只能是值只能是0,3;j值只能是值只能是0,4;k值只能是值只能是0,515例:例:int a
11、34=1,2,3,4,5,6,7,8,9,10,11,12;int b34=1,5,6,9;把第把第1个大括号内的数值赋给第个大括号内的数值赋给第1行元素行元素,把第把第2个内的数值赋给第个内的数值赋给第2行元素行元素没有初始化数值对应的元素自动初始化为没有初始化数值对应的元素自动初始化为0n二维数组的初始化二维数组的初始化q分行给二维数组赋初值分行给二维数组赋初值q可以将所有数据写在一个大括号内,按数组元可以将所有数据写在一个大括号内,按数组元素排列顺序对元素赋初值素排列顺序对元素赋初值16例:例:int a 4=1,7,8,9;等价于:等价于:int a34=1,7,8,9;q如果对全部元
12、素赋初值,则第一维的长度可以如果对全部元素赋初值,则第一维的长度可以不指定,但必须指定第二维的长度不指定,但必须指定第二维的长度例:例:int a34=1,2,3,4,5,6,7,8,9,10,11,12;等价于:等价于:int a 4=1,2,3,4,5,6,7,8,9,10,11,12;n分行赋初值时也可以省略第一维的长度分行赋初值时也可以省略第一维的长度问:问:int a243=1,2,3,4,5,6,7,8,9,10,11,12;中的哪一个元素的值初始化为中的哪一个元素的值初始化为9?哪一个元素?哪一个元素的值初始化为的值初始化为12?17#includeint main()int a
13、23=1,2,3,4,5,6,b32,i,j;for(i=0;i2;i+)for(j=0;j3;j+)bji=aij;for(i=0;i3;i+)printf(“n”);for(j=0;jmax,把,把aij作为新的临时最大值,并作为新的临时最大值,并记录它所在的记录它所在的行和列的下标行和列的下标;否则,继续比较;否则,继续比较当全部元素比较完后,当全部元素比较完后,max是整个矩阵全部元素的最大值是整个矩阵全部元素的最大值20算法:算法:1、maxa00;row=0;colum=0;2、对所有的、对所有的i=0,1,2和和j=0,1,2,3重复执行:重复执行:如果如果aijmax,则,则m
14、ax=aij,row=i,colum=j3、输出、输出max,row,colum,算法结束,算法结束12349876101052a21#includeint main()int a34=1,2,3,4,9,8,7,6,-10,10,-5,2;/*定义矩阵定义矩阵*/int i,j,row,colum,max;max=a00;row=colum=0;for(i=0;i=2;i+)/*比较元素比较元素*/for(j=0;j max)max=aij;row=i;colum=j;/*记录记录*/printf(“max=%d,row=%d,colum=%dn”,max,row,colum);/*按要求格
15、式输出按要求格式输出*/return 0;运行结果运行结果:max=10,row=2,colum=1 表示最大值是表示最大值是10,它所在元素的下标为,它所在元素的下标为2和和122练习练习 6.3 求一个求一个33矩阵对角线元素之和。矩阵对角线元素之和。#includeint main()int a33,sum=0;int i,j;printf(“enter data:n”);for(i=0;i3;i+)for(j=0;j3;j+)scanf(“%d”,&aij);for(i=0;i3;i+)sum=sum+aii;printf(“sum=%6dn”,sum);return 0;23练习练习
16、6.6 输出杨辉三角(要求输出输出杨辉三角(要求输出10行)。行)。#include#define N 11int main()int i,j,aNN;for(i=1;iN;i+)ai1=1;aii=1;for(i=3;iN;i+)for(j=2;j=i-1;j+)aij=ai-1j-1+ai-1j;for(i=1;iN;i+)for(j=1;j=i;j+)printf(“%6d”,aij);printf(“n”);printf(“n”);return 0;242526筛选法求素数的算法思想:筛选法求素数的算法思想:1.挖去挖去12.用下一个未被挖去的数用下一个未被挖去的数p去除去除p后面各数
17、,把后面各数,把p的的倍数挖掉倍数挖掉3.检查检查p是否小于是否小于n,如果是,则返回,如果是,则返回(2)继续执行,继续执行,否则算法结束否则算法结束4.剩下的数就是素数剩下的数就是素数练习练习6.1 用用筛选法筛选法求求100之内的素数。之内的素数。27算法思想:算法思想:1.输入输入10个数到个数到a0,a1,a9中;中;2.把把a0,a1,a9中最小的数交换到中最小的数交换到a0中;中;3.把把a1,a2,a9中最小的数交换到中最小的数交换到a1中;中;10.把把a8,a9中最小的数交换到中最小的数交换到a8中;中;11.顺序输出数组顺序输出数组a中的中的10个数个数a0,a1,a9。
18、以上的第以上的第210步可以归纳为:步可以归纳为:对于对于i0,1,8执行:执行:“把把ai,ai1,a9中最小的数交换到中最小的数交换到ai中中”练习练习6.2 用用选择法选择法对对10个数排序(由小到大)。个数排序(由小到大)。28#includeint main()/*选择法排序选择法排序*/int a10,t;int i,j;for(i=0;i10;i+)scanf(“%d”,&ai);/*输入输入*/for(i=0;i=8;i+)/*选择排序选择排序*/for(j=i+1;jaj)t=ai;ai=aj;aj=t;for(i=0;i10;i+)printf(“%d ”,ai);/*输出
19、输出*/return 0;29思考题思考题1.将数组将数组a10的每一个元素依次循环向后移动的每一个元素依次循环向后移动k位。位。如:如:1 5 6 7 循环向后移动循环向后移动1位得:位得:7 1 5 6如:如:1 5 6 7 循环向后移动循环向后移动2位得:位得:6 7 1 52.使用循环结构方法判断一个长整型数有几位数。使用循环结构方法判断一个长整型数有几位数。3.输入一个三位以内整数,求由它的各位数字组成的最大数。输入一个三位以内整数,求由它的各位数字组成的最大数。如:输入如:输入123,输出,输出321;输入;输入192,输出,输出92130思考:思考:如何计算两个矩阵之和?如何计算
20、两个矩阵之和?例如,输入例如,输入6个整数到个整数到23矩阵矩阵a;输入;输入6个整数到个整数到23矩阵矩阵b;计算;计算cab;输出矩阵;输出矩阵a、b、c。如何计算两个矩阵之积?如何计算两个矩阵之积?例如,输入例如,输入6个整数到个整数到32矩阵矩阵a;输入;输入6个整数到个整数到23矩阵矩阵b;计算;计算ab 得到得到33的矩阵的矩阵c;输出矩阵;输出矩阵a、b、c。3132例例1 char c10;c0=I;c1=;c2=a;c3=m;c4=;c5=h;c6=a;c7=p;c8=p;c9=y;数组数组状态状态c0 c1 c2 c3 c4 c5 c6 c7 c8 c9Iamhappyn字
21、符数组是用来存放字符数据的数组每个元素相字符数组是用来存放字符数据的数组每个元素相当于一个当于一个char型变量,存放一个字符数据,占用型变量,存放一个字符数据,占用一个字节的空间一个字节的空间n字符数组的定义字符数组的定义6.3 字符数组字符数组33例例 char c10=I,a,m,h,a,p,p,y;n字符数组的初始化字符数组的初始化q逐个元素初始化逐个元素初始化q数据少于数组长度,多余元素自动赋值数据少于数组长度,多余元素自动赋值0q指定初值时,未指定数组长度,则长度等于初指定初值时,未指定数组长度,则长度等于初值个数值个数c0 c1 c2 c3 c4 c5 c6 c7 c8 c9Ia
22、mhappy34例例 char c10=O,K;n字符数组的初始化字符数组的初始化q逐个元素初始化逐个元素初始化q数据少于数组长度,多余元素自动赋值数据少于数组长度,多余元素自动赋值0q指定初值时,未指定数组长度,则长度等于初指定初值时,未指定数组长度,则长度等于初值个数值个数c0 c1 c2 c3 c4 c5 c6 c7 c8 c9OK0000000035例例6.6 输出一个已知字符串。输出一个已知字符串。#includeint main()char c10=I,a,m,a,b,o,y;int i;printf(“n”);for(i=0;i10;i+)printf(“%c”,ci);retu
23、rn 0;n字符数组的引用字符数组的引用q可以引用一个元素,得到一个字符可以引用一个元素,得到一个字符输出结果:输出结果:I am a boy36例例 “Good”的存储形式为:的存储形式为:Good0例例 char c=“I am happy”;char c=“I am happy”;都可以表示如下都可以表示如下(数组长度为数组长度为11):c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 c10Iamhappy0n字符串和字符串结束标志字符串和字符串结束标志q在在C语言中,用字符数组来对字符串进行操作语言中,用字符数组来对字符串进行操作处理,即,把字符串看做一个个的字符进行处处理
24、,即,把字符串看做一个个的字符进行处理理n注意注意“字符串结束符字符串结束符”的位置的位置37 char c=“Good”;等价于:等价于:char c=G,o,o,d,0;0dooGc4c3c2c1c00c9000000dooGc10c8c7c6c5c4c3c2c1c0 char c10=“Good”;等价于:等价于:char c10=G,o,o,d,0;注意:注意:1、在有结束符、在有结束符0的情况下,只要知道数组名,的情况下,只要知道数组名,就可以计算出保存的字符串的长度;就可以计算出保存的字符串的长度;2、有时为了方便、统一起见,在使用字符数组、有时为了方便、统一起见,在使用字符数组时
25、一般常常人为增加字符结束符时一般常常人为增加字符结束符0。38例例6.8 输入一行字符,统计其中有多少个单词。输入一行字符,统计其中有多少个单词。单词之间用空格分隔开。单词之间用空格分隔开。字符数组应用举例字符数组应用举例基本算法基本算法:输入一行字符到字符数组;输入一行字符到字符数组;统计该字符串包含的统计该字符串包含的单词单词数数Count;输出单词数输出单词数Count。39例例6.8 输入一行字符,统计其中有多少个单词。单输入一行字符,统计其中有多少个单词。单词之间用空格分隔开。词之间用空格分隔开。开始字符开始字符满足条件:满足条件:本身是字符,不是空格;本身是字符,不是空格;它的前一
26、字符是空格或者它是串的第它的前一字符是空格或者它是串的第1个字符。个字符。考虑单词开始字符具有的特点是什么?考虑单词开始字符具有的特点是什么?扫描字符串的字符扫描字符串的字符,遇到开始字符就把遇到开始字符就把Count加加1如何统计字符串(以如何统计字符串(以0结束)中含有多少个单词?结束)中含有多少个单词?观察字符串:观察字符串:“you are a student ”40算法、程序如下:算法、程序如下:读入串到数组读入串到数组s中中k0;Count0;sk!=0如果如果sk是单词的是单词的开开始字符始字符,则,则Count。k输出输出Count01#includeint main()int
27、 k,Count;char s80;gets(s);for(Count=0,k=0;sk!=;k+)if(sk!=)if(k=0)|(sk1=)Count+;printf(“nCount=%d”,Count);return 0;41同样我们可以根据结束字符的特点来编程。同样我们可以根据结束字符的特点来编程。结束字符结束字符必须满足条件:必须满足条件:本身是字符,不是空格;本身是字符,不是空格;它的后一字符是空格或是串的结束符。它的后一字符是空格或是串的结束符。编程留作练习。编程留作练习。教材上的方法可以自己参考。教材上的方法可以自己参考。424344补充知识:补充知识:每一个变量都有内存地址,
28、每一个数组元每一个变量都有内存地址,每一个数组元素也有内存地址,可以编程看出数组的各个元素的地素也有内存地址,可以编程看出数组的各个元素的地址是连续的。址是连续的。#includevoid main()short int x,a3,y,b22;printf(n&x=%04u&y=%04u,&x,&y);printf(na3:%04u%04u%04u,&a0,&a1,&a2);printf(nb22:%04u%04u%04u%04u,&b00,&b01,&b10,&b11);运行结果运行结果:&x=65484&y=65492 a3:65486 65488 65490 b22:65494 65496 65498 6550045实验报告三:函数的应用实验内容一:设计一个菜单程序:输入13以进入相应选择项:1.由计算机随机出1道四则运算题,用户答题;2.用户出题:输入带括号的整数四则混合运算,计算机答题;(此问要求用递归算法实现)3.退出。