第二节 数组的极值、统计、求和、逆置-【单招零距离】计算机专业综合(下)

2025-04-23
| 2份
| 14页
| 62人阅读
| 0人下载

内容正文:

总复习方案·第六章数组 3.程序设计题:在一个二维数组(inta[5][5]:)中形成并按下列形式输出矩阵各元素的值 (不得用scanf函数输入数据) 10000 21000 32100 43210 54321 #include <stdio.h> int main() {inta[5][5]; /*关米米米米关关**并BEGIN黄米米光关关米***米 第二节 数组的极值、统计、求和、逆置 知识体系 Y⊙ 极值:是指求出数组元素中的最大值、最小值等值 统计:是指按指定元素的值的统计元素的个数 数组的基本算法 求和:是指按指定的要求求和及平均值 逆置:是指数组元素的数据首尾对调 知识梳理 ⊙Y 一、数组元素中的最大值和最小值 最大值和最小值的求解方法:采用穷举法,用第一个元素与数组中(一维数组或二维数组) 的各元素进行逐一比较,找出满足条件的元素即可。 二、数组元素的统计 数组元素的统计,是指按指定的要求来统计元素的个数。通常使用a[x]=a[x]+1;或写 成a[x]十+;语句。其中x一定要与统计的数有一定的联系。 三、数组元素求和、求平均值 数组元素的求和:是指按指定的要求求出元素的和及平均值。注意:求和的初值应为0。 ·131· 单招零距离·计算机专业综合·下册 四、数组元素的逆置 数组元素的逆置是指将数组元素的进行首尾对调(也可以部分对调)。要注意与移动算法 相区别。通常用while语句和for语句来实现。 典例精析 ⊙Y⊙ 【例1】下列程序是求出:十个整数中的最小值和次小值。请填空: #include <stdio.h> #define n 10 int main() int minl,min2,i; inta[10]={12,90,45,68,78,90,67,23,77,88}; minl=min2=32767; for(i=0;i<n;i+) printf("%d\t",ai]); if(ali]<minl) { ;minl=a[i];} else if( min2=ali]; printf(" minl=%d,min2=%d ",minl,min2); 【分析】本题是求最小数和次小数。要注意算法:当最小数改变时,次小数一定改变;当 最小数不变时,次小数也可能改变。 【答案】min2=minl a[i]<min2 【例2】阅读程序写结果: #include <stdio.h> #include <ctype.h #define n 80 int main() { inti,t,k; char a[n]="abcefghijklmn"; ints[6]={0}; i=0; while(a[i]) t=toupper(a[i])-65; t=t/5+1; s[t]+=t; ·132· 总复习方案·第六章数组 i++; } for(i=0;i<6;i++) if(s[i门)printf("%d\t",s[i门); printf(" "); 【分析】本题是一道统计题。是对26个英文字母进行统计。每五个字母为一组,第一组 的值为1,第二组的值为2,依次类推。最后输出的是对有统计的字母的值进行输出。 【答案】程序运行结果为:41012 【例3】阅读程序写结果: #include <stdio.h> #define n 10 int main() inti,t,k; int a[n]; for(i=0;i<n;i+) a[i]=i+n; for(k=n-1;k>n/2;k--) t=a[k],a[k]=a[n-1-k],a[n-1-k]=t; for(i=0;i<n;i+) printf("%d\t",ai]); } 【分析】第一个for循环是对数组元素赋值.第二个for循环是对数组元素逆置(注意: 只要求执行5次)。第三个for循环是打印输出。 【答案】程序运行结果为:19181716141513121110 【例4】随机抛硬币1000次,统计正反面出现的次数。 【分析】用srand()和rand()%2产生0、l两个随机数,分别代表正面反面,巧用数组实 现正反面现出次的统计。 【答案】 #include "stdio.h" #include "stdlib.h" #include "time.h" int main() (inta[2]={0},i,x; srand((unsigned)time(NULL)); for(i=0;i<1000;i++) x=rand()%2; a[x]++; ·133· 单招零距离·计算机专业综合·下册 printf("正面出现的次数=%d,反面出现的次数=%d小n",a[l],a[o]); } 【例5】编写程序实现功能:随机产生36个两位正整数存入数组int mat[6][6]中,找出 二维数组mat中的极点和鞍点。 【分析】若某元素在所在行相邻两点中与所在列相邻两点中均为最大或最小,则该点为 极点。 若某元素在所在行(或列)相邻两点中为最大,同时该元素在所在列(或行)相邻两点中为 最小,则该点为鞍点。 【答案】 #include <stdio.h> #include <stdlib.h #include <time.h> int main() int mat[6][6],i,j; int h,1; srand((unsigned)time(NULL)); for(i=0;i<6;i++) { for(j=0;j<6;j++) mat[i]]=rand()%90+10; printf("%4d",mat[i]); } printf(" "); for(i=1;i<5;i++) for(j=1;j<5;j++) if(mat[i]]mat[i]-1]8.&mat[i]]mat[i]+]) /*比左右还大¥/ h=3; else if(mat[i]]<mat[i]-1]8.&.mat[i]]<mat[i]1]) /*比左右都小*/ h=1; else /*一大一小*/ h=0; if(mat[i]mat[i-1]8.&.mat[imat[i+) /*比上下都大*/ 1=3; else if(mati]]<mat[i-1]&&mat[i]<mat[i]]) /*比上下都小/ 1=1; else /米一大一小¥/ 1=0; switch(h+1) { case6:printf("极大值点=-%d,row=%d,col=%dn",mat[i][j],i,j); break; ·134· 总复习方案·第六章数组 case2:printf("极小值点=%d,row=%d,col=%d小n",mat[i][j],i,j); break; case 4:printf("=%d,row=%d,col=%d ",mat[i],i,j) break; 巩固练习 ⊙Y⊙ 1.阅读程序写结果: #include <stdio.h #define n 10 int main() { inta[n]={12,34,21,56,8,99,77,45,33,67}; int s,i,k; for(s=i=k=0;i<n;i+) if(a[i]>40) {s=s+a[i],k十+; printf("%d\t",a]); printf(" average=%d ",s/k); } 2.阅读程序写结果: #include <stdio.h #define n 10 int main() { inta[n]={12,34,21,56,8,99,77,45,33,97}; int max,min,i; max=a[0];min=a[n/2]; for(i=0;i<n/2;i++) { if(max<a[i])max=a[i] if(min>a[n/2+i])min=a[n/2+i]; } printf("max=%3d,min=%3d ",max,min); 3.运行下面程序时,若输入: 172386554796123452210<CR> ·135· 单招零距离·计算机专业综合·下册 则运行结果为 #include <stdio.h int main() { intb[30],x,i,j=0,n=1; scanf("%d",&.x); while(x) b[n++]=x: scanf("%d",&x); } for(i=1;i<=n;i++) if(b[i]%2==0) b[++j]=b[i]; for(i=1;i<=j;i++) printf("p=%-6d",b[i]) printf(" "); 4.下面程序的运行结果是 #include <stdio.h> int main() { inta[3][3]={0,2},i,j: for(i=0;i<3;i++) { for(j=0;j<3;j++) { if(i==3)》 a[i]Gj]=a[i-1][a[i-1]G]+1; else a[]=j; printf("%5d",aLiI[jD); printf(" "); } 5.程序设计题:随机投骰子1000次,统计各面[1,6]出现的次数。 #include <stdio.h #include <stdlib.h #include <time.h ·136· 总复习方案·第六章数组 int main() { 拓展练习 1.阅读程序写结果: include <stdio.h define n 12 int main() { inta[n]={1,2,3,4,5,6,7,8,9,10,11,12}; inti,t; for(i=0;i<n/4;i++) {t=a[i门;a[i]=a[n-1-i门;a[n-1-i]=t;} for(i=0;i<n/2;i++) {t-ai];a[i]=a[n-l-i];a[n-1-i]-t;》 for(i=0;i<n;i+) printf("%3d",ai); } 2.阅读程序写结果: #include <stdio.h int main() {inta[3][4]={21,4,13,15,11,17,12,16,8,19,8,18}; int max,i,j,pi,pj; max=-1; for(i=0;i<3;i++) for(j=0;j<3;j++) if(a[i]]a[i]+1]>max) max=a[i]]+a[i]j+1];pi=i;pj=j;) printf("%d %d ",a[pi]pj],a[pi]pj+1]); 3.下列程序的功能是:打印输出3行4列的矩阵,其中的元素的值为一100到100之间的 随机整数,然后找出每行中的最大数及其所在的位置。请填空: ·137· 单招零距离·计算机专业综合·下册 #include<stdio.h #include <stdlib.h #include <time.h int main() { int i,j,max,il,jl; inta[3][4]; srand((unsigned)time(NULL)); for(i=0;i<3;i++) {for(Gj=0;j<4;j++) {a[i]0j]= printf("%d\t",ali); } printf(" "); for(i=0;i<3;i++) { ;j1=0;il=i; for(j=0;j<4;j+) {if(a[i门Gj]>max) max=a[i]]; printf("max=%d,il=%d,jl=%d ",max,il,jl); 4.利用随机函数产生20个在10到99之间的各不相同的正负交替整数,并将这20个数 首尾相连,找出每相邻四个数之和最大的四个数,并按下面的格式打印出来:SUM=N1十N2 +N3十N4。试根据题意进行程序填空: #include "stdio.h" #include "stdlib.h" int main() int a[20],i,j,k=1,max,p,sum; randomize(); for(i=0;i<20;i++) {a[i]= (1) for(j=0;j<i;j++) if(a[i]==aj]) (2) ; k=一k; ·138· 总复习方案·第六章数组 } for(i=0;i<20;i++) printf("%3d",ai]); max=a[0];p=0; for(i=0;i<20;i++) sum=0; for(j=i;j<=i+3;j++) sum= (3) if(sum>max) { (4) } printf(" %d=",sum); for(i=p;i<=p+3;i++) if(i==p+3) (5) ; else (6); 5.程序设计题:从键盘输入一串字符,统计其中26个英文字母每个字母(不区分大小写) 出现的次数。 #include <stdio.h #include <ctype.h int main() {inti,a[26]={0}; char str[80]; /关¥米兴米*米****米米米米米BEGIN米米装关米菜米并米¥米米米著***/ 技能实践 1.程序填空题:实现对字符串数组a逆序输出。 #include <stdio.h #include<string.h ·139· 单招零距离·计算机专业综合·下册 #include<conio.h int main() { char a[]="123456abcd"; int len ,j; char c; printf("%s ",a); len= ①; for(Gj=len-1;②;j—) { c=a[j]; a[j]=aClen-1-j]; a[len-1-j]=c; } printf("%os ",a); } 2.程序填空题:已知数组b中存放N个人的年龄,编写程序,统计各年龄段的人数并存入 数组d。要求把0至9岁年龄段的人数放在d[0]中,把10至19岁年龄段的人数放在d[1]中, 把20至29岁年龄段的人数放在d[2]中,其余依此类推,把100岁(含100)以上年龄的人数都 放在d[10]中。 #include <stdio.h #define M 11 #define N 20 int main() {intb[N]={32,45,15,12,86,49,97,3,44,52,17,95,63,14,76,88,54,65,99,102}; int d[M],i; for(i=0;i<M;i++) ① for(i=0;i<N;i++) if(b[i]>=100) d[10]++; else d[ ② ]++; for(i=0;i<M-1;i++) printf("%4d--%4d %4d ",3 ,di]): printf("over 100 %4d ",d10]); 3.程序填空题:将一维数组x中大于平均值的数据移至数组的前部,小于等于平均值的 数据移至数组的后部。 #include <stdio.h ·140·第六章 数  组 第一节  数组的定义、初始化和引用 【知识梳理】 一、数组定义 2.a  b 3.x 字符型  二 二、数组元素的引用 1.0 19 20 2.2 4 3.0 按行存放 一维 三、数组初始化 1.0 4 1-5 0 5 2.可以不指定 不能省略 3.1 2 3 0 4.3 【巩固练习】  1.9 7 5 3 1  2.1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1  3.1 2 1 3 2 1 4 3 2 1  4.(1)stdlib.h  (2)time.h  (3)srand((unsigned)time(NULL))  (4)rand()%100  5.for(i=0;i<10;i++)   a[i]=i; for(i=9;i>=0;i--)   printf("%d",a[i]);  或 for(i=0;i<10;i++)   a[i]=i; for(i=0;i<10;i++)   printf("%d",a[9-i]); 【拓展练习】  1.18  2.19  3.3  4.x=x+f[i-1]  5.for(i=0;i<10;)   a[i++]=2∗i+1; for(i=0;i<=9;i++)   printf("%d",a[9-i]); 【技能实践】  1.inta[16] a[i-1]+a[i-2]  2.sum 改为sum=0 scanf("%d,",a[i][j])改为scanf("%d,",&a [i][j]); sum+=a[i][3-i];改为sum+=a[i][i]  3.inti,j,t=0; for(i=0;i<5;i++)   for(j=0;j<5;j++) if(i>=j)a[i][j]=i-j+1; elsea[i][j]=0; for(i=0;i<5;i++) { for(j=0;j<5;j++)   printf("%d\t",a[i][j]); printf(" "); } 第二节 数组的极值、统计、求和、逆置 【巩固练习】  1.56 99 77 45 67 average=68  2.max=56min=33  注意:是求半个数组的最大值,求后半个数组的最 小值.  3.p=172p=38p=54  4.012 012 012  5.inta[7]=0,i,x; srand((unsigned)time(NULL)); for(i=1;i<=1000;i++) { x=rand()%6+1; a[x]++; } for(i=1;i<=6;i++)   printf(“%d面出现的次数为%d ”,i,a [i]); 􀅰22􀅰 单招零距离􀅰计算机专业综合􀅰下册 【拓展练习】  1.1 2 3 9 8 7 6 5 4 10 11 12  2.1712  3.(1)rand()%201-100 (2)max=a[i][0]  (3)j1=j  4.(1)(rand()%90+10)∗k  (2)i--,k=-k  (3)sum+a[j%20]  (4)p=i  (5)printf(“%d ”,a[i%20])  (6)printf(“%d+”,a[i%20])  5.gets(str); for(i=0;str[i];i++)  if(isalpha(str[i])   A[toupper(str[i])-65]++; for(i=0;i<26;i++)  printf(“次数[%c(%c)]=%d\t”,65+i,97+ i,a[i]); 【技能实践】  1.(1)strlen(a)  (2)j>len/2  2.(1)d[i]=0  (2)b[i]/10  (3)i∗10,i∗10+9  3.(1)&x[i]  (2)av+x[i]  (3)x[i]=-1  (4)y[j++]=x[i]  4.i<10改为i<2  m=0改为 m=i  a[k]<a[m]改为(a[k]>a[m]  5.for(i=0;i<N;i++)  x[i]=rand()%90+10; printf(“SOURCEDATA: ”); for(i=0;i<N;i++)  printf(“%4d”,x[i]); max=min=x[0]; pmax=pmin=0; for(i=0;i<N;i++) { if(x[i]>max)max=x[i],pmax=i; if(x[i]<min)min=x[i],pmin=i; } t=x[0];x[0]=x[pmax];x[pmax]=t; if(pmin==0)pmin=pmax; t=x[N-1];x=x[N-1]=x[pmin];x[pmin]=t; printf(“ LASTDATA: ”); for(i=0;i<N;i++)  printf(“%4d”,x[i]); 第三节 数组的排序 【知识梳理】  2.i j  3.n-1-i a[j]>a[j+1] n-i a[j]<a[j-1] flag==1  4.(2)i-1 p>=0&&x<a[p] 【巩固练习】  1.5 12 24 26 29 30 37 48  2.13 32 34 44 78 120  3.(1)j+=2  (2)a[i]>a[j]  4.(1)s[k]  (2)j++  (3)i=strlen(a);i>=j;i-- (4)a[i+1]=a[i]  5.for(i=0;i<10;i++)   a[i]=rand()%90+10; for(i=0;i<9;i++)   for(j=i+1;j<10;j++)   { x=a[i]%10;m=a[i]/10; y=a[j]%10;n=a[j]/10; if(m<n) { k=a[i];a[i]=a[j];a[j]=k;} if(m==n&&x>y) { k=a[i];a[i]=a[j];a[j]=k;}   } for(i=0;i<10;i++)   printf("%d,",a[i]); 【拓展练习】  1.7 5 3 1 0 2 4 6  2.(1)p=i (2)i>=p (3)i<N+1或i<=N  3.(1)j=i-1 (2)&&x<a[j]  (3)j-- (4)a[j+1]=x  4.inta[10],i,j,m,n,t; srand((unsigned)time(NULL)); for(i=0;i<10;i++) { a[i]=rand()%90+10; for(j=0;j<i;j++)   if(a[i]==a[j])   {i--;break;} } printf(“SORTEDBEFORE: ”); for(i=0;i<10;i++)   printf("%4d",a[i]); printf(“请输入整数 m 和n(m<n):”); 􀅰32􀅰 总复习方案􀅰参考答案

资源预览图

第二节 数组的极值、统计、求和、逆置-【单招零距离】计算机专业综合(下)
1
第二节 数组的极值、统计、求和、逆置-【单招零距离】计算机专业综合(下)
2
第二节 数组的极值、统计、求和、逆置-【单招零距离】计算机专业综合(下)
3
第二节 数组的极值、统计、求和、逆置-【单招零距离】计算机专业综合(下)
4
所属专辑
由于学科网是一个信息分享及获取的平台,不确保部分用户上传资料的 来源及知识产权归属。如您发现相关资料侵犯您的合法权益,请联系学科网,我们核实后将及时进行处理。