C程序设计教程与实训(第二版)第5章 数组-g

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第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维长度,但不能

1 / 72
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功