内容正文:
总复习方案·第六章数组
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
总复习方案参考答案