




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第六章数组数组:方便数据的管理和使用便于完成大量数据的处理,简化程序设计4本章主要内容123一维数组数组做函数参数一维数组应用举例二维数组6.1一维数组
输入3个整数,按从小到大的顺序输出。程序6-1#include<stdio.h>intmain(){inta,b,c,t;scanf("%d%d%d",&a,&b,&c);if(a>b)t=a,a=b,b=t;if(a>c)t=a,a=c,c=t;if(b>c)t=b,b=c,c=t;printf("%d,%d,%d",a,b,c);return0;}若要对4个数排序输出呢?5个数,100个数呢?6.1.1一维数组的定义和引用for(i=0;i<n;i++)
printf("%d",a[i]);i从0变到9,输出a[0]~a[9]由数组名和下标唯一地确定每个数组元素;每个元素都属于同一类型;表述简洁,可读性高;便于使用循环结构。0129
a[0]a[1]a[9]a-101235782289一批相同类型的变量使用同一个数组变量名,用下标来相互区分。6.1.1一维数组的定义和引用1、定义类型名数组名[数组长度]类型名:数组元素的类型数组名:数组(变量)的名称,标识符数组长度:常量表达式,给定数组的大小inta[10];
定义一个含有10个整型元素的数组acharc[200];定义一个含有200个字符元素的数组cdoublearr[5];定义一个含有5个实型元素的数组arr2、引用先定义,后使用只能引用单个的数组元素,不能一次引用整个数组数组名[下标]下标:整型表达式取值范围:[0,数组长度-1]inta[10];10个元素:a[0]、a[1]、……a[9]下标不要越界,不能使用a[10]数组元素的使用方法与同类型的变量相同scanf(“%d”,&a[i]);//从键盘读入一个整数,存入a[i]//下标为index的元素与下标为k的元素互换内容temp=a[index];a[index]=a[k];a[k]=temp;printf(“%d”,a[i]);//输出a[i]的值定义数组类型名数组名[数组长度]inta[10];区分数组的定义和数组元素的引用下标:[0,数组长度-1],不要越界定义数组时,数组长度必须为常量引用数组元素数组名[下标]a[0]=a[9]=0;a[k]=temp;使用循环批量处理数组元素。数组下标作为循环变量,通过循环,逐个处理数组元素
数组和循环0129
a[0]a[1]a[9]a-101235782289i从0变到9,读入10个数,存入a[0]~a[9]for(i=0;i<10;i++)
printf("%d",a[i]);for(i=0;i<10;i++)scanf("%d",&a[i]);i从0变到9,输出a[0]~a[9]例6-1:逆序输出n个整数的逆序输出。输入n(n≤10)和n个整数,逆序输出这n个整数。思路分析:(1)读入n;(2)循环进行n次,依次将n个整数存入a[0]、a[1]、…a[n-1](3)循环进行n次,依次输出a[n-1]、a[n-2]、…a[0]程序6-1:逆序输出#include<stdio.h>intmain(){inta[100];intn,i;scanf("%d",&n);for(i=0;i<n;i++)scanf("%d",&a[i]);for(i=n-1;i>=0;i--)printf("%d",a[i]);printf("\n");return0;}读入n个整数依次存入a[0]、a[1]、…a[n-1]依次输出a[n-1]、a[n-2]、…a[0]6.1.2一维数组初始化可以定义数组时,对数组元素赋初值类型名数组名[数组长度]={初值表};例如:inta[10]={1,2,3,4,5,6,7,8,9,10};定义数组a有10个int类型的元素,并为这些元素赋初值:a[0]=1,a[1]=2,...…a[9]=10部分元素初始化一般数组如果没有初始化,所有元素为随机值;但如果对部分元素初始化,没有初始值的元素自动赋0intfib[20]={0,1};fib[0]=0,fib[1]=1,其余元素为0如果对全部元素都赋初值,可以省略数组长度inta[10]={0,1,2,3,4,5,6,7,8,9}建议不要省略数组长度可写成inta[]={0,1,2,3,4,5,6,7,8,9};问题2:fibonacci数列的前n项问题2:输入一个正整数n(1<n≤50),输出fibonacci数列的前n项。并按每行打印5个数的格式输出。11235……思路分析:将前n项依次存入a[0],a[1],……a[n-1]。(1)将a[0]和a[1]赋值为1;(2)对i=2,3……n-1,计算
a[i]=a[i-1]+a[i-2];(3)输出a[0],a[1],……a[n-1];inta[N]={1,1};for(i=2;i<n;i++)a[i]=a[i-1]+a[i-2];
for(i=0;i<n;i++)printf("%d",a[i]);程序6-2:fibonacci数列#include<stdio.h>#defineN50intmain(){intn,i,a[N]={1,1};
scanf("%d",&n);
for(i=2;i<n;i++) a[i]=a[i-1]+a[i-2];for(i=0;i<n;i++)printf("%d",a[i]);
printf("\n");return0;}6.1.3数组元素的查找例6-3:已知数组a中有如下元素:1,45,18,7,22,11,33,15,27,19输入1个数x,然后在数组中查找x,如果找到,输出相应的下标,否则,输出“NotFound”。解题思路:顺序查找(1)对i=0,1,……n-1,做如果a[i]==x,则提前结束循环(2)若i<n,则查找成功,输出下标i若i==n,则查找失败,输出“NotFound”。for(i=0;i<N;i++){if(a[i]==x)break;
}if(i<N)printf(“Indexis%d\n",i);elseprintf("NotFound\n");#include<stdio.h>#defineN10intmain(void){inti,n,x;inta[N]={1,45,18,7,22,11,33,15,27,19};scanf("%d",&x);for(i=0;i<N;i++){if(a[i]==x)//若找到,提前循环break;
}
if(i<N)//若循环提前结束,说明找到x,输出下标i
printf(“Indexis%d\n",i);elseprintf("NotFound\n");return0;}程序6-3顺序查找6.1.4在有序序列里插入新元素问题4:已知如下有序序列,有9个元素:1,2,4,7,8,11,16,21,35
输入一个数,将该数插入到数组中的适当位置,使得数组仍保持升序排列,输出插入新元素之后的数组。
24810X=666.1.4在有序序列里插入新元素24810X=66思路分析:从后向前寻找新元素的插入位置,将所有比x大的元素依次后移一位
(1)对i=n-1,n-2,……0,做如果a[i]>x,a[i]的内容后移一位否则,break结束循环(2)将新元素存入a[i+1]for(i=N-1;i>0;i--){if(a[i]>x)a[i+1]=a[i];else break;}a[i+1]=x;程序6-4:在有序序列里插入新元素#include<stdio.h>#defineN9intmain(){inti,index,x;inta[N+1]={1,2,4,7,8, 11,16,21,35};scanf("%d",&x);
for(i=N-1;i>0;i--){if(a[i]>x)a[i+1]=a[i];else break;}a[i+1]=x;for(i=0;i<=N;i++)printf("%d",a[i]);printf("\n"]);return0;}6.1.5交换最小值例6-5输入n(n≤10),再输入n个数(1)求最小值(2)求最小值和它所对应的下标(3)将最小值与第一个数交换,输出交换后的n个数min=a[0];//a[0]做临时最小值for(i=1;i<n;i++)if(a[i]<min)min=a[i];问题5-(1)求最小值选最小值,采用擂台赛的思想:先用第一个元素初始化临时最小值min(擂主),然后逐个元素与min比较,如果比min小,则用其值更新min/*程序6-5*/#include<stdio.h>intmain(void){
inti,min,n;inta[10];
printf(“Entern:");scanf("%d",&n);printf(“Enter%dintegers:",n);for(i=0;i<n;i++)scanf("%d",&a[i]);
min=a[0];//a[0]做临时最小值for(i=1;i<n;i++)if(a[i]<min)min=a[i];printf("minis%d\n",min);return0;}程序6-5:求最小值输入n(n<10),再输入n个数,输出最小值和它所对应的下标。问题5-(2)求最小值及其下标min=a[0];index=0;for(i=1;i<n;i++){if(a[i]<min){min=a[i];
index=i;}}用min记录最小值,用index记录对应的下标用index记录最小值对应的下标a[index]就是最小值求最小值及其下标可以只用一个变量indexindex=0;for(i=1;i<n;i++){if(a[i]<a[index]){index=i;}}输入n(n<10),再输入n个数,将最小值与第一个数交换,输出交换后的n个数。用index记录最小值对应的下标a[index]就是最小值最小值a[index]与第a[0]交换内容a[index]<==>a[0]问题5-(3)交换最小值6.1.6:排序输入n(n<10),再输入n个数,将它们从小到大排序后输出。方法1:比较交换排序比较交换排序的基本思想是:将a[i](i=0,1,...n-2)依次与其后的元素比较,若遇到比其小的元素,则互换。从第一个元素a[0]开始,使其与a[1]、a[2]、...、a[n-1]比较,若遇到比a[0]小的元素,则与a[0]互换,第一轮比较交换结束,a[0]中存储的就是所有元素的最小值。然后进行第二轮比较交换,对a[1]进行同样的处理,使a[1]中存储a[1]、a[2]、...、a[n-1]的最小值。依次处理a[2]、a[3]、......,经过n-1轮比较交换后完成排序。比较交换排序假设数组a有6个元素{9,8,5,4,6,0}第1轮:a[0]分别与a[1]、a[2]、...、a[n-1]比较,若遇到比a[0]小的元素a[j],则使a[0]与a[j]互换。第1轮排序的结果:将最小值交换到a[0]的位置上比较交换排序实现for(i=0;i<n-1;i++){
/*a[i]与其后所有元素比较,若a[j]小于a[i],则交换*/
for(j=i+1;j<n;j++)
if(a[i]>a[j])
{ t=a[i];a[i]=a[j];a[j]=t;}}
例5-1程序解析#include<stdio.h>intmain(){inti,j,t,k,n;inta[10];/*定义1个数组a,它有10个整型元素*/scanf("%d”,&n);for(i=0;i<n;i++)scanf("%d",&a[i]);
for(i=0;i<n-1;i++){/*a[i]与其后所有元素比较,若a[j]小于a[i],则交换*/
for(j=i+1;j<n;j++)
if(a[i]>a[j])
{ t=a[i];a[i]=a[j];a[j]=t; }}
printf("Aftersorted:");
for(i=0;i<n;i++)
/*输出n个数组元素的值*/
printf("%d",a[i]);
return0;}103528122890-17Aftersorted:-1012357822896.2数组作为函数参数6.2.1数组做函数参数6.2.2通过形参数组修改数组元素6.2.3数组排序6.2.1数组做函数参数若数组a的定义为:inta[10];若要将数组a作为实参传递给被调用函数SumArr(),则调用语句可写为:SumArr(a,10);数组名代表数组首元素的地址。因此数组名做参数就可以将数组的起始地址传递给形参。另外需要将数组元素的大小也传递给被调用函数。函数SumArr()的函数原型如下:
intSumArr(intb[],intn)表示函数SumArr()期望用形参b来接收一个整型数组,用形参n来接收数组元素个数。程序6-6:调用函数SumArr()计算累加和#include<stdio.h>
intSumArr(intarray[],intn);
intmain(void){inta[5]={1,4,5,7,9};
//求数组b中前5个数的和printf(“%d\n”,SumArr(a,5));return0;}
//求数组arrar中前n个数的和
intSumArr(intarray[],intn){inti,s=0;
for(i=0;i<n;i++)s+=array[i];
returns;}形参数组和实参数组为同一数组因为数组名代表该数组的首地址,用数组名作实参时,是把实参数组的首地址赋给形参;实际上形参数组和实参数组为同一数组,共同拥有一段内存空间。a
a[0]a[4]arrayarray[0]array[4]……形参数组和实参数组为同一数组,共同拥有一段内存空间参数声明(1)在声明形参数组时,数组元素的个数不需要写在方括号中,如
intSumArr(intarray[],intn){……}
即便方括号中出现数字,编译器也将忽略该数字。在编译器看来,形参array不是一个真正的数组,只是一个可以存放地址的指针变量。第8章将介绍数组与指针的紧密联系(2)向函数传递数组的时候,同时通过参数传递数组的元素个数,有利于提高函数的通用性。SumArr(a,5)可以计算数组a的前5个元素之和SumArr(a,3)可以计算数组a的前3个元素之和6.2.2通过形参数组修改数组元素一般变量作参数:传递的是数值,形参的值的改变不影响实参。
数组做参数:传递的是数组的首地址,形参数组和实参数组实质上是同一块内存区域,形参数组发生改变,实参数组也随之发生改变。程序6-7,就是通过调用函数ModifyArr(),将main()函数中数组a的每个元素变为原来的10倍。#include<stdio.h>voidModifyArr(intarray[],intn);
intmain(void){inti,n=5;inta[]={1,4,5,7,9};printf("数组a的内容:\n");
for(i=0;i<n;i++)printf("%d",a[i]);
printf("\n\n");
ModifyArr(a,5);
printf(“数组a被修改后:\n");
for(i=0;i<n;i++)printf("%d",a[i]);
printf(“\n”);return0;}改变形参数组,就是改变实参数组voidModifyArr(intb[],intn){inti,s=0;
for(i=0;i<n;i++)b[i]*=10;}
传递数组时形参要声明为数组(指针),并且数组长度要和实参相等,或缺省长度传递数组时实参用数组名程序6-7a:通过函数修改数组元素#include<stdio.h>voidModifyArr(intb[],intn);voidPrintArr(intb[],intn);
intmain(void){inti,n=5;inta[]={1,4,5,7,9};
printf("数组a的内容:\n");
PrintArr(a,n);
ModifyArr(a,n);
printf(“数组a被修改后:\n");
PrintArr(a,n);return0;}程序6-7b:把输出数组元素功能也包装成函数voidPrintArr(intb[],intn){inti;for(i=0;i<n;i++)printf("%d",b[i]);
printf("\n\n");}voidModifyArr(intb[],intn){inti,s=0;
for(i=0;i<n;i++)b[i]*=10;}6.2.3数组排序改写程序6-5,分别用函数InputArr()、SortArr()和DispArr()实现数组的输入、排序和输出。//程序6-8#include<stdio.h>#defineN10
voidInputArr(intarr[],intn);voidSortArr(intarr[],intn);voidPrintArr(intarr[],intn);intmain(void){inta[N],n;printf("请输入元素个数\n");scanf("%d",&n);/*输入n个元素*/InputArr(a,n);/*将数组升序排序*/SortArr(a,n);
/*输出数组a的n个元素*/
PrintArr(a,n);return0;}数组输入函数InputArr()/*读入n个整数存入数组arr*/voidInputArr(intarr[],intn){inti;
printf("请输入%d个整数:",n);
for(i=0;i<n;i++)scanf("%d",&arr[i]);}数组输出函数DispArr()
voidPrintArr(intb[],intn){inti;for(i=0;i<n;i++)printf("%d",b[i]);
printf("\n\n");}将数组arr的n个元素升序排序SortArr()voidSortArr(intarr[],intn){ inti,j,temp; for(i=0;i<n-1;i++) {
//arr[i]与其后所有元素比较for(j=i+1;j<n;j++)if(arr[i]>arr[j]) { temp=arr[i];arr[i]=arr[j];arr[j]=temp; }}}课堂练习把6.1.5中“交换最小值”的程序函数化,main()调用以下函数实现相应的功能。(1)intMinIndex(inta[],intn);函数返回最小元素的下标(2)voidswap(inta[],inti,intj);函数将a[i]与a[j]的内容互换(3)voidInputArr(inta[],intn);函数将读入n个整数存入a[0]、a[1]…..(4)voidDispArr(inta[],intn);函数输出整型数组a的前n个元素6.3一维数组应用举例6.3.1
最佳校友奖6.3.2字母使用频率统计6.3.3集合的合并——利用有序关系简化问题北京校友会每年举办两次,所有校友都有校友编号,每次到会的校友都在签到簿上写下自己的编号和姓名,在校友会成立5周年的聚会上将颁发“最佳校友奖”,该奖项颁发给到会次数最多的校友,若有多个校友并列第一,则均可获奖。现在请你编写程序,找出这个奖项的得主。输入数据为5年来签到簿上所有签下的编号(假设校友的编号为0~99的整数),以一个负数作为数组结束的标志。输出出现次数最多的编号。6.3.1找出最佳校友输入样例:303210403-1输出样例:最佳校友:03最佳校友——解题思路因为校友的编号为0~99的整数,可以声明一个长度为100的数组a,将0~99之间的每一个数字i的出现次数存入数组元素a[i]。每次读入一个编号num,将a[num]增加1。
输入结束后,查找数组a中的最大值,数组a中最大值的下标即为出现次数最多的数,最大值即为该数出现的次数。0123456789…0000000000…1输入303210403-112112331最佳校友编号为:03最佳校友——实现过程(1)读入所有校友签到,并统计,a[i]存储编号i的出席次数。(2)寻找数组a中的最大值,存入max;(3)再扫描一遍数组,输出所有最大值的下标,即出席次数最多的校友编号。
InputAndCount(a);max=ArrMax(a,N);PrintWinner(a,N,max);#include<stdio.h>#defineN100voidInputAndCount(inta[],intn);intArrMax(inta[],intn);voidPrintWinner(inta[],intn,intmax);intmain(void){inta[N],max;
InputAndCount(a,N);//录入所有签到记录,并统计
max=ArrMax(a,N);//计算数组元素最大值
PrintWinner(a,N,max);//输出所有次数为max的校友
return0;}程序6-9的main()函数/*录入签到记录,a[i]统计每个编号的出现次数*/voidInputAndCount(inta[],intn){inti,num;
(1)把数组a所有元素初始化为0;(2)提示:printf("输入所有编号,以负数表示结束:\n");
(3)当读入的编号num不是-1{
将a[num]增加1}}程序6-9的InputAndCount()函数for(i=0;i<n;i++)a[i]=0;while(scanf("%d",&num),num>=0) a[num]++;/*
函数返回数组a中前n个元素的最大值*/intArrMax(inta[],intn){inti,max=a[0];
for(i=1;i<n;i++){if(a[i]>max)max=a[i];}
returnmax;}程序6-9的ArrMax()函数/*输出所有元素值为max的下标i*/voidPrintWinner(inta[],intn,intmax){inti;printf("最佳校友:\n");for(i=0;i<n;i++){if(a[i]==max)//若i的出现次数a[i]等于maxprintf(“%d”,i);//输出编号i}printf("\n");}程序6-9的PrintWinner()函数输入一个字符串,以回车结束。按如下格式输出每个字母的出现次数。6.3.2字母使用次数统计
统计字符串中每个英文字母出现的次数。输入:Loveispatient,loveiskind,andisnotjealous输出:countofais3countofbis0countofcis0countofdis2……用26个变量分别记录26个英文字母的出现次数?使用数组,用count[0]、count[1]….count[25]分别记录26个英文字母的出现次数。(相当于26个变量,只是这些变量有同样的名字,用下标相互区分)可以先将大写字母转换为小写字母统一处理。字符’a’出现次数存入count[0],字符’b’出现次数存入count[1],……,字符ch出现的次数存入count[ch-’a’]。
abcdefghIJK0000000000…1输入dadcbaead12112331解题思路#include<stdio.h>#include<ctype.h>intmain(void){inti,count[26]={0}; charch; printf("输入一行,以回车结束:\n");while((ch=getchar())!='\n'){ch=tolower(ch);/*若ch是大写字母则转换为小写字母*/if(islower(ch))/*若ch小写字母*/count[ch-'a']++;/*字符ch的次数count[ch-‘a’]增1*/}
for(i=0;i<26;i++)printf("countof%cis%d\n",i+'a',count[i]);return0;}下标i对应字符i+’a’程序6-106.3.3集合的合并
——利用有序关系简化问题解决问题:将两个整数集合A和B合并为集合C。并将集合C中元素按升序输出。你应该知道,集合中不允许有重复元素。思路分析:因为集合元素不允许重复,并且最后的输出结果要求升序输出。可以先将两个序列进行排序预处理,然后利用两个序列的有序性,总是在两个序列的待合并元素中选择较小的元素合并入新序列,如果两个元素相同,则只加入一个有序序列合并过程模拟1357891234abci12jkjijkjk3ijk4jk当一个序列结束,将另一个序列中的剩余元素逐个加入新序列5789实现过程(1)调用排序函数对a,b两个数组进行升序排序(2)同时按从小到大顺序扫描a、b数组中的元素,a[i]、b[j]分别为两数组中待合并的最小元素,选择较小者合并到c中(3)输出c中的所有元素
sort(a,m);sort(b,n);merge(a,m,b,n,c);PrintArr(c,k);程序6-11的main函数#include<stdio.h>#defineN100intmain(void){intm,n,k,a[N],b[N],c[N*2];scanf("%d%d",&m,&n);InputArr(a,m);//读入a的m个元素InputArr(b,n);//读入b的n个元素sort(a,m);//排序sort(b,n);//排序
k=merge(a,m,b,n,c);//合并两个数组PrintArr(c,k);//输出数组c中k个元素return0;}voidInputArr(inta[],intn);voidsort(inta[],intn);intmerge(inta[],intm,intb[],intn,intc[]);voidPrintArr(intc[],intn)程序6-11的排序函数sort()voidsort(inta[],intn){inti,j,temp;
for(i=0;i<n-1;i++)/*比较交换排序*/ for(j=i+1;j<n;j++) if(a[j]<a[i1]) {temp=a[i]; a[i]=a[j]; a[j]=temp; }}合并过程实现:merge()(2)同时扫描a、b数组中的元素,a[i]、b[j]分别为两数组中待合并的最小元素,选择较小者合并到c中i=0,j=0,k=0;while(i<m&&j<n){
如果a[i]<b[j],则将a[i]合并入新序列,i++
如果a[i]>b[j],则将b[j]合并入新序列,j++
如果a[i]==b[j],则将a[i]合并入新序列,i++,j++}(3)如果数组a中还剩有元素,合并到c中
如果数组b中还剩有元素,合并到c中
程序6-11的合并函数merge()/*将集合a、b的数据合并到c中,返回集合c中元素个数*/intmerge(inta[],intm,intb[],intn,intc[]){inti=0,j=0,k=0;while(i<m&&j<n){if(a[i]<b[j])/*如果a[i]<b[j],则存入a[i]*/c[k++]=a[i++];elseif(a[i]>b[j])/*如果a[i]>b[j],则存入b[j]*/c[k++]=b[j++];else/*如果a[i]==b[j],则存入a[i],舍去b[j]*/{c[k++]=a[i];i++;j++;}}程序6-11的合并函数merge()/*如果数组a中还剩有元素,合并到c中*/while(i<m)c[k++]=a[i++];
/*如果数组b中还剩有元素,合并到c中*/while(j<n)c[k++]=b[j++];
returnk;//返回集合C中元素个数}6.3.4二分搜索在一个有序序列中(这里元素呈升序排列)。搜索给定值x,若找到,返回x所在位置,否则返回查找失败标志-1。二分搜索法充分利用了序列的有序性,它的基本思想是:将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比较:如果x=a[n/2]则找到x,算法终止;如果x<a[n/2],则我们只要在数组a的左半部继续搜索x;如果x>a[n/2],则我们只要在数组a的右半部继续搜索x。
145789101215222327323512152223273235midmid121522搜索成功!22因A[mid]<22,丢弃A[mid]及其左边所有元素midmid二分搜索过程二分搜索非常高效,在一百万个记录中查找一个记录是否存在,最多只需要20次比较!递归实现二分搜索是分治法的一个经典示例,可以利用递归的思想来实现。实现过程
若待搜区间为空,返回-1;否则mid=(low+high)/2;若x等于a[mid],
搜索成功,返回mid若x小于a[mid],在左半区间搜索若x大于a[mid],在右半区间搜索程序6-12二分搜索intBSearch(inta[],intx,intlow,inthigh){if(low>high)return-1;//待搜区间为空
else{intmid=(low+high)/2;if(x==a[mid])returnmid;//搜索成功
if(x<a[mid])//在左半区间搜索
returnBSearch(a,x,low,mid-1);else//在右半区间搜索returnBSearch(a,x,mid+1,high);}}二维数组:一个表格或一个平面矩阵一维数组:一列长表或一个向量多维数组:多维空间的一个数据列阵三维数组:一本书或三维空间的一个方阵多维数组的空间想象6.4二维数组6.4.1二维数组的定义和引用1、定义类型名数组名[行数][列数]inta[3][2];定义二维数组a,3行2列,6个元素intb[5][10];定义二维数组b,5行10列,50个元素2、引用:先定义,后使用数组元素的引用:数组名[行下标][列下标]行下标和列下标:整型表达式行下标的取值范围是[0,行数-1]列下标的取值范围是[0,列数-1]inta[3][2];3行2列,6个元素a[0][0]a[0][1]a[1][0]a[1][1]a[2][0]a[2][1]下标不要越界二维数组在内存中的存放方式inta[3][2];3行2列,6个元素表示1个3行2列的矩阵a[0][0]a[0][1]a[1][0]a[1][1]a[2][0]a[2][1]二维数组的元素在内存中按行/列方式存放a[0][0]a[0][1]a[1][0]a[1][1]a[2][0]a[2][1]6.4.2二维数组的初始化1、分行赋初值inta[3][3]={{1,2,3},{4,5,6},{7,8,9}};staticintb[4][3]={{1,2,3},{4},{5,6}};数组a123456789数组b1234005600002、顺序赋初值
inta[3][3]={1,2,3,4,5,6,7,8,9}; staticintb[4][3]={1,2,3,0,0,0,4,5};二维数组初始化时可以不给出行数inta[][3]={1,2,3,4,5,6,7,8,9};数组a123456789编译器会根据初值的个数和数组的列数计算出数组的行数,但建议不要省略行下标和列下标分别做为循环变量,通过二重循环,遍历二维数组通常将行下标做为外循环的循环变量
列下标内循环for(i=0;i<m;i++)//i从0变到m-1,处理m行{for(j=0;j<n;j++)//处理第i行的n列{}}用二重循环处理二维数组二维数组的输入inta[3][2];for(i=0;i<3;i++){for(j=0;j<2;j++)scanf("%d",&a[i][j]);}Enter6integers:3210-96-13210-96-1a[0][0]a[0][1]a[1][0]a[1][1]a[2][0]a[2][1]二维数组的输出inta[3][2];for(i=0;i<3;i++){for(j=0;j<2;j++)printf("%d",a[i][j]);
printf("\n",);}3210-96-1a[0][0]a[0][1]a[1][0]a[1][1]a[2][0]a[2][1]3210-96-16.5.1各门课的平均分6.5.2随机矩阵的最大值6.5.3日期计算6.5二维数组应用举例期末考试结束,班主任拿到了本班学生的成绩汇总表,由n行3列组成,每行是一个同学的成绩,包括英语、数学、C语言三门课,请编写程序,计算并输出每门课的平均分,结果保留2位小数。6.5.1各门课的平均分英语
数学 C语言80 65 7099 38 5930 78 8190 43 1365 87 79解题思路intmain(){(1)读入学生人数n;(2)读入m个学生3门课的成绩存入二维数组a(第i个学生第j门课成绩,存入元素a[i][j]);(3)计算每一列元素的平均值存入一维数组avg;(4)输出数组avg的元素InputArr(a,n);ArrAvg(a,n,avg);PrintAvg(avg,n);程序6-13平均分#include<stdio.h>#defineN100voidInputArr(inta[][3],intn);voidArrAvg(inta[][3],intn,doubleavg[]);voidPrintAvg(doubleavg[],intn);intmain(void){inta[N][3],avg[3],n;InputArr(a,n); //录入n个学生3门课的成绩
ArrAvg(a,n,avg); //计算每门课平均成绩数组avgPrintAVG(avg,n); //输出每门课的平均成绩
return0;}读入n个学生的成绩存入数组a//读入一个n行3列的二维数组voidInputArr(inta[][3],intn){对i=0、1、2、……n-1做:{读入第i个学生的三门课成绩,存入第i行}}for(j=0;j<3;j++)//读入第i个学生的第j门成绩scanf("%d",&a[i][j]);
计算每一列的平均值存入数组avgvoidArrAvg(inta[][3],intn,doubleavg[]){对j=0、1、2做:{求第j列元素的平均值并输出
}}806570993859307881904313658779sum=0.0;//将sum赋为0for(i=0;i<n;i++)//将第j列的所有元素累加{sum+=a[i][j];}avg[j]=(double)sum/n;//该列的平均分输出平均成绩voidPrintAvg(doubleavg[],intn);{对i=0、1、2做:{
printf("第%d门课的平均分为:%.2f\n",i,avg[i]);}}6.5.2随机矩阵的最大值随机生成1个m行n列的矩阵,将其存入二维数组中。生成的随机数要求是0~100之间的整数,m、n是不大于10的正整数。输出矩阵,并找出最大值及其行下标和列下标。解题思路:(1)读入m和n(2)生成m行n列的随机矩阵并输出(3)输出该数组的最大值及其行下标和列下标GetRandArr(a,m,n);DispMax(a,m,n);#include<stdio.h>#include<stdlib.h>
#defineN10
voidGetRandArr(intarr[][N],intm,intn);voidDispMax(intarr[][N],intm,intn);
intmain(void){intm,n,a[N][N];
printf(“请输入矩阵的行数和列数:\n”);scanf("%d%d",&m,&n);
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 汽车构造 课件 16手动变速器
- 开家长会发言稿中班
- 家长班会发言稿
- 04-第七课易错疑难集训
- 2025年超声多普勒胎儿监护仪合作协议书
- 交旅融合对城市交通与旅游发展的推动作用
- 2025年手持云台项目发展计划
- 2025年GPS电子探空仪项目合作计划书
- 厂家回收设备合同范本
- 品牌商授权合同范本
- 常州大学《微电子工艺原理与技术》2023-2024学年期末试卷
- 晶体缺陷获奖课件
- 燃气用聚乙烯管道焊接工艺评定DB41-T 1825-2019
- (人教PEP2024版)英语一年级上册Unit 2 教学课件(新教材)
- 经销商转户证明范文
- 新解读《CJJ 92-2016城镇供水管网漏损控制及评定标准(2018年版) 》
- DB23T 3761-2024 建设工程对水文监测影响评价报告编制规程
- GB/T 16311-2024道路交通标线质量要求和检测方法
- GB/T 44464-2024汽车数据通用要求
- 2024年上半年教师资格证《初中英语》真题及答案
- MES系统实施管理办法
评论
0/150
提交评论