第5章信息学院计算机基础组数组1.一维数组2.二维数组3.字符数组4.字符串处理函数5.用文件处理数据本章主要内容:5.1引例例5-1从键盘输入十个整数,计算其和值。方法一程序代码如下:#includestdio.hvoidmain(){inta,sum,i;sum=0;/*计算前将和sum设为0*/printf(Pleaseinput10integers:\n);for(i=0;i10;i++)/*输入10个整数,依次相加*/{scanf(%d,&a);sum+=a;}printf(Thesumis%d.,sum);/*输出和值*/}5.1引例#includestdio.hvoidmain(){inti,sum;inta[10];/*定义一个数组a,它包含10个整型元素*/printf(“请输入10个整数:\n”);for(i=0;i10;i++)/*输入10个整型数据*/scanf(“%d”,&a[i]);sum=0;for(i=0;i10;i++)sum+=a[i];/*十个整数求和*/printf(“Thesumofthe10intergersis%d”,sum);}方法二程序代码如下:5.2一维数组定义:数组是指具有相同数据类型的数据的有序集合,数组中的一个数据项称为一个数组元素。5.2.1数组的概念数组的要素数组名:数组在内存中的起始地址。下标:指出了某一数组元素在数组中所处的位置。5.2一维数组5.2.2一维数组的定义例如:floata[10];一维数组定义的一般形式为:类型名数组名[常量表达式];a[0]a[1]a[2]…a[9]一维数组存储顺序示意图关于数组定义的几点说明类型名:用来指定数组中每一个数组元素的类型,可以是基本类型int,char,float,double,也可以是构造类型如结构体,枚举类型,或者是使用typedef定义的类型。数组名:必须是一个合法的标识符。常量表达式:可以是常量,符号常量或者常量表达式。注意:不能使用变量动态定义数组的大小。下面定义数组的方法是错误的。例如:intn;scanf(“%d”,&n);charname[n];5.2一维数组5.2.3一维数组的引用引用的形式为:数组名[下标]下标可以是整型常量,整型表达式,也可以是整型变量。无论下标是常量或变量,它的合理的取值范围为0~数组的长度-1一个数组元素的地位相当于一个普通变量程序代码如下:#includestdio.hvoidmain(){intmax,max_loc,a[10],i;/*定义一个数组a,它包含10个整型元素*/printf(Enter10integers:\n);for(i=0;i10;i++)scanf(%d,&a[i]);/*输入10个整数,赋给a数组的10个元素a[0]~a[9]*/max_loc=0;max=a[0];/*假设第一个数即为最大值*/例5-2从键盘输入十个整数,找出其中的最大值及其位置。for(i=1;i10;i++)/*通过循环遍历数组中所有数据*/{if(a[i]max)/*当前值大于最大值*/{max=a[i];/*用当前值替换最大值*/max_loc=i;/*记录最大值位置*/}}printf(Themaxdatais%d\nThepositionis%d,max,max_loc);/*输出最大值及其所在位置*/}练习练习5-1:从键盘输入十个整数,找出其中的最小值及其位置。练习5-2:从键盘输入十个整数,找出其中的最小值并将其和第一个整数对换。5.2一维数组5.2.4一维数组的初始化1.定义数组时给数组元素赋值,称为数组的初始化。其一般形式为:类型说明符数组名[整型常量表达式]={初始化列表};2.对数组元素的初始化可以用以下方式来实现:(1)对数组的所有元素赋初值,此时可以省略数组长度。例如:inta[10]={0,1,2,3,4,5,6,7,8,9};2.对数组元素的初始化可以用以下方式来实现:例如:inta[]={0,1,2,3,4,5,6,7,8,9};(1)对数组的所有元素赋初值,此时可以省略数组长度。(2)对数组部分元素赋初值。例如:inta[10]={1,2,3,4,5};则元素a[0]~a[4]的值分别为1,2,3,4,5,数组中的其余元素a[6]~a[9]的值是0。5.2一维数组5.2.5一维数组的应用例5-3利用数组求Fibonacci数列前20个数,并按每行打印5个数的格式输出。分析:定义数组f[20],其值为Fibonacci数列的值,同使用循环处理Fibonacci数列相比,使用数组可以保存Fibonacci数列的值,并且处理变得简单,容易理解。程序代码如下:#includestdio.hvoidmain(){inti;intf[20]={1,1};/*定义Fibonacci数组f,前2个元素赋初值1*/for(i=2;i20;i++)f[i]=f[i-1]+f[i-2];/*按照Fibonacci数列的规则,给后续元素赋值*/for(i=0;i20;i++){if(i%5==0)printf(\n);printf(%14d,f[i]);}/*按照输出要求,输出Fibonacci数列的前20项*/}例5-3利用数组求Fibonacci数列前20个数,并按每行打印5个数的格式输出。5.2一维数组5.2.5一维数组的应用例5-4用“冒泡法”将从键盘输入的10个数据由小到大排序。N个数冒泡法排序思路如下:1.将N个数,从前向后,将相邻的两个数进行比较(共比较N-1次),每次比较,将小数交换到前面,大数交换到后面,N-1次后,最大的数将被移至数据最后。2.取前面N-1个数,继续过程1,将N-1个数中的最大值移至最后(位于N个数最大值的前面)。3.取前面N-2个数,继续过程1比较…直到最后两个数比较完成。5.2一维数组5.2.5一维数组的应用88666666666666226688888877772266999977778222777777779222288888882222299999999999原始数据第一趟比较4次第二趟比较3次第三趟比较2次第四趟比较1次排序后的数据程序代码如下:#includestdio.hvoidmain(){inti,j,temp;inta[10];printf(input10numbers\n);for(i=0;i10;i++)scanf(%d,&a[i]);printf(\n);5.2一维数组5.2.5一维数组的应用for(i=0;i9;i++)/*进行9次循环,实现9轮比较*/{for(j=0;j9-i;j++)/*在每一轮比较中,进行9-i次比较*/{if(a[j]a[j+1])/*相邻两个数比较*/{temp=a[j];a[j]=a[j+1];a[j+1]=temp;}}}printf(Thesortednumber:);for(i=0;i10;i++)printf(%8d,a[i]);}5.2一维数组5.2.5一维数组的应用例5-5从键盘输入10个相异的整数,将其存入数组a中,再输入一个随机值k,然后在数组中查找k,如果找到,输出相应的下标,否则输出NotFound。程序代码如下:#includestdio.hvoidmain(){inti,flag,k;inta[10];printf(Enter10integers\n);for(i=0;i10;i++)scanf(%d,&a[i]);printf(\n);printf(Enterrandomk:);scanf(%d,&k);flag=0;/*flag作为是否找到的标志*/5.2一维数组for(i=0;i10;i++){if(a[i]==k)/*找到*/{printf(Found:%dpositionis%d,k,i);flag=1;break;}}if(flag==0)/*未找到*/printf(Notfound%d,k);}5.2.5一维数组的应用练习练习5-3:从键盘输入10个整数,将其存入数组a中,再输入一个随机值k,然后在数组中查找k在数组a中出现的次数。练习5-4:从键盘输入10个整数,分别统计其中正数、负数和0的个数。1、以下程序给数组所有的元素输入数据,空处应填入()main(){inta[10],i=0;while(i10)scanf(“%d”,____________);}A)&a[i]B)a[i++]C)&a[i++]D)&a[++i]2、下面程序的功能是输入5个整数,找出最大数和最小数所在的位置,并把二者对调,然后输出调整后的5个数。请填空。main(){inta[5],max,min,i,j,k;for(i=0;i5;i++)scanf(“%d”,&a[i]);min=a[0];for(i=1;i5;i++)if(a[i]min){min=a[i];___________________;}max=a[0];for(i=1;i5;i++)if(a[i]max){max=a[i];__________________;}__________________________;printf(“\nthepositionofminis:%3d\n”,k);printf(“thepositionofmaxis:%3d\n”,j);for(i=0;i5;i++)printf(“%5d”,a[i]);}3、程序填空:以下程序的功能是求出数组a中各相邻两个元素的和,并将这些和存放在数组b中,按每行三个元素的形式输出。填空完善程序。main(){inta[10],b[10],i;for(i=0;i10;i++)scanf(“%d”,&a[i]);for((1);i10;i++)(2);for(i=1;i10;i++){printf(“%3d”,b[i]);if((3)==0)printf(“\n”);}}答案:(1)i=1(2)b[i]=a[i]+a[i-1](3)(i%3)4、在有10个数的一维数组中,删除由键盘任意输入的数。例:……for(i=0;i10;i++)if(x==a[i]){k=i;break;}if(k10)for(i=k;i10;i++)a[i]=a[i+1];elseprintf(“无此数!”);5.3二维数组5.3.1二维数组的定义二维数组定义的一般形式为:类型名数组名[常量表达式1][常量表达式2];类型名,数组名和常量表达式的形式均和一维数组相同。常量表达式1指出了二维数组行长度,常量表达式2指出了二维数组的列长度。5.3二维数组5.3.1二维数组的定义例如:inta[2][2];a[0][0]a[0][1]a[1][0]a[1][1]二维数组存储顺序示意图5.3二维数组5.3.2二维数组的引用和初始化其引用的一般形式为:数组名[行下标][列下标]注意:行下标和列下标的范围!行下标的范围为0~行长度-1,列下标的范围是0~列长度-1。二维数组也不能越界引用。例如:定义了二维数组a[3][3],在引用数组元素时,a[2][3]、a[3][0]等都是越界元素,不能引用。引用5.3二维数组5.3.2二维数组的引用和初始化分行初始化初始化的一般形式为:类型名数组名[常量表达式1][常量表达式2]={{第0行元素初值表},{第1行元素初值表}…};例如:inta[2][2]={{1,2},{3,4}};初始化按数组元素排列的顺序给各数组元素初始化初始化的一般形式为:类型名数组名[常量表达式1][常量表达式2]={初值表};例如:inta[2][2]={1,2,3,4};对部分数组元素初始化例如:inta[3][3]={{1,2},{3},{4,5}};该初始化方法中,没有给初值的元素的值自动为0。5.3二维数组初始化时省略第一维长度(1)二维数组初始化时,如果对全部元素赋了初值。此时可以省略第1维长度,但不能