C语言程序设计何钦铭颜晖第7章数组.docx
《C语言程序设计何钦铭颜晖第7章数组.docx》由会员分享,可在线阅读,更多相关《C语言程序设计何钦铭颜晖第7章数组.docx(22页珍藏版)》请在冰豆网上搜索。
C语言程序设计何钦铭颜晖第7章数组
第7章数组
【练习7・1】将例7-3程序中的break语句去掉,输出结果有变化吗?
假设输入数据不变,输出什么?
解答:
当去掉break语句后,一旦找到数据将不跳出循环,而是继续往下找值为x的元素,因此程序输出会有变化。
当输入数据仍为29819时,输出将是indexis1indexis4O
【练习7-2】将数组中的数逆序存放。
输入一个正整数n(Kn<=10),再输入n个整数,存入数组a中,输出最大值及其对应的最小下标,下标从0开始。
试编写相应程序。
解答:
#includeintmain(void)
inti,n,temp;
inta[10];
printf("lnputn:
M);
scant(期d:
&n);printf(”lnput%dinteger:
'\n);for(i=0;iscanf「%d:
&a[i]);printfC'Afterreversed:
");for(i=0;itemp=a[i];a[i]=a[n-l-i];a[n-l-i]=temp:
}
for(i=0;ia[i]);
return0;
【练习7・3】求最大值及其下标。
输入一个正整数n(l试编写相应程序。
解答:
#includeintmain(void)
inti,index,n;inta[10];
printf("Entern:
M);scanff%d:
&n);
printf「Enter%dintegrs:
",n);for(i=0;i&a[i]);
for(i=n-l;i>=0;i++)printf('%d:
return0;
【练习7-4]找出不是两个数组共有的元素。
输入一个正整数n(l试编写相应程序。
解答:
#includeintmain(void)
intijXm,n,flag,equal;
inta[25],b[25],c[25];
printf("Enterm:
n);scanff'%d:
&n);printf(,,Enter%dintegers:
",m);
for(i=0;iprintf("Entern:
M);
scanff场d:
&n);printf(MEnter嵋dintegers:
",n);
for(j=0;jscanf(n%dH,&b[j]);
k二0;
for(i=0;iflag=O;
for(j二O;j
if(a[i]==aOJ)
flag^l;//判断一个数组中是否有相重的元素,有的话不执行
equal=0;
for(j=0;jif(!
equal)
c[k++]=a[i];
}
}
for(i=0;iflag=O;
forG=0;j
if(bD]==bffl)
flag=l;
if(!
flagX
equal=0;
for(j二0;j二二a[j]){
equal=1;
break;
}
if(!
equal)
c[k++]二b[i];
}
}
printf(,,%d,,,c[0]);
for(i二2;iprintf(”%d",c[i]);
printf(M\nM);
return0;
}
【练习7-5]给二维数组賦值时,如果把列下标作为外循环的循环变量,行下标作为内循环的循环变量,输入的数据在二维数组中如何存放?
用下列for语句替换例7-7中的对应语句,将输入的6个数存入二维数组中,假设输入数据不变,输出什么?
与例7-7中的输岀结果一样吗?
为什么?
for(j=0;j<2;j++)
for(i=0;i<3;i++)
解答:
当把列下标作为外循环的循环变量,行下标作为内循环的循环变量时,输入的数据将以列优先的方式存放。
当用上述for循环方式时,输出结果为:
max=a[2][0]=10,与原例7-7不一样,因为当用上述方式输入是,二维数组中存放值如下:
3-9
26
10-1
【练习7-6]在例7-9的程序中,如果将遍历上三角矩阵改为遍历下三角矩阵,需要怎样修改程序?
运行结果有变化吗?
如果改为遍历整个矩阵,需要怎样修改程序?
输出是什么?
为什么?
解答:
只需按要求修改矩阵的输出部分,方法如下,其运行结果不变。
for(i=0;ifor(j二0;j
temp二a[i][j];
aBD]=aOJD];
aQ][i]=temp;
}
若修改为遍历整个程序,方法如下,则运行结果仍将输出原矩阵,无法达到转置要求,原因是矩阵中每个元素相应被交换了2次。
for(i=0;ifor(j=0;jtemp=a[i]Q];
a丽]=aDlH;
aO]H二temp;////先是下三角进行交换,后是上三角进行交换
}
【练习7-7]矩阵运算:
读入1个正整数n(lWnW6),再读入n阶方阵a,计算该矩阵除副对角线、最后一列和最后一行以外的所有元素之和。
副对角线为从矩阵的右上角至左下角的连线。
试编写相应程序。
解答:
#inelude
intmain(void)
{
inti,j,n,sum;
inta⑹[6];
printf(,,lnputn:
M);
scanfC^d'&n);
printf(MlnputarrayAnM);
for(i=0;ifor(j=0;jscant(期d:
&a[i][j]);
sum=0;
for(i=0;ifor(j=0;jif(i!
=n-l&&j!
二rvl&&+j!
=n-l)sum+=a[i][j];
printf(,,sum二汕n:
sum);
return0;
}
【练习7-8]方阵循环右移。
读入2个正整数m和n(l<=n<6),在读入ri阶方阵a,将该方阵中的每个元素循环向右移m个位置,即将第0、1、…、n-1列变换为第n-m、n-m+l、…、n-K0、1、…、n-m-1列,移动后的方阵可以存到另一个二维数组中。
试编写相应程序.:
:
解答:
#include
intmain(void)
{
intm,nJj.count;
inta⑹[6],b[6]⑹;
printf("Enterm:
M);
scanff'%d:
&n);
printf("Entern:
M);
scant(期d:
&n);
printf(Mlnputarray:
\n,B);
for(i=0;ifor(j=0;jscant(期d:
&a[i][j]);
for(i=0;icount=0;
for(j=0;j计Gb[i]G+m]=a[i]0];
else
b0[count++]=a|j]O];
}
for(i=0;ifor(j=0;jprintf("%d",b[i][j]);
printfCV);
}
return0;
}
【练习7-9]计算天数:
输入日期(年、月、日),输出它是该年的第几天。
要求调用例7-10中定义的函数day_of_year(year,month,day)o试编写相应程序:
解答:
#include
intday_of_year(intyear,intmonth,intday);
intmain(void)
{
intyear.month,day,dayj(ear;
printf(Mlnputyear,month,day:
M);
scanff'%d%d%d:
&yeai;&month.&day);
day_year=day_of^ear(year,month,day);
printf("Daysofyear:
%d\n,\day_year);
return0;
}
intday_of_year(intyear.intmonthjntday)
{
intkleap;
inttab[2][13]={
{0,31,28,31,30,31,30,31,31,30,31,30,31},{0,31,29,31,30,31,30,31,31,30,31,30,31}
};
leap二(yearW4二二0&&year%100!
=0||yearW400二二0);
for(k=l;kday=day+tab[leap][k];
returnday;
}
【练习7-10]查找指定字符。
输入一个字符,再输入一个以回车符结束的字符串(少于80个字符)。
如果找到,则输出该字符在字符串中所对应的最大下标,下标从0开始;否则输出wNotFounds试编写相应程序。
解答:
#include
intmain(void)
{
inti,max,flag;
chara[80],op;
printf(MEnterax:
M);
op=getchar();
fflush(stdin);//或setbuf(stdin,NULL);
printf("Enterastring:
u);
i二0;
while((a[i]=getcharO)!
=i\n')
i++;
a[i]二、0:
max二0;
flag=0;
for(i=0;a[i]!
=,\0,;i++)
if(a[i]==op){
max二i;
flag=l;
}
if(flag==l)
printfC'Max=%d:
max);
else
print^'NotFound!
*1);
return0;
}
【练习7-11]字符串逆序:
输入一个以回车符结束的字符串(少于80个字符),将该字符串逆序存放,输出逆序后的字符串。
试编写相应程序。
解答:
#include
intmain(void)
{
inti;
charstr[80]?
a[80];
printf("Enterastring:
");
i二0;
while((str[i]二getchar())!
二、rf)
i++;
for(;i>=0;i--)
putchar(str[i]);
return0;
}
习题7
—•选择题
1-假定int类型变量占用两个字节,其有定义:
intx[10]二{0,2,4};则数组x在内存中所占字节数是Do
A・3B・6C・10D・20
2.以下能正确定义数组并正确赋初值的语句是D。
A•intN=5,b[N][N];
B.inta[l][2]={{l},{3}};
C.intc[2]0={{1.2},{3,4}};
D.intd⑶[2]={{1,2},{34}};
3・若有定义:
inta⑵[3];以下选项中对数组元素正确引用的是D。
C.a[0][3]
4.设有数组定义:
chararray[]=,,ChinaM;则数组array所占的空间为C。
A・4个字节B・5个字节C・6个字节D・7个字节
5.下述对C语言字符数组的描述中错误的是Do
A.字符数组可以存放字符串
B.宇符数组中的字符串可以整体输入、输出
C.可以在赋值语句中通过赋值运算符”二"对宇符数组整体賦值
D.不可以用关系运算符对字符数组中的字符串进行比较
6•有以下定义:
charx[]=“abcdefg“;chary[则正确的叙述为
Co
A•数组x和数组y等价B.数组x和数组y的长度相同
C•数组X的长度大于数组y的长度D•数组x的长度小于数组y的长度
7.以下程序的输出结果是C。
intmain(void)
{intm[]⑶={1,47,2,5,8,3,6.9};
intijk二2;
for(i=0;i<3;i++)
printffHd■\m[k][i]);
}
A.456B・258C・369D・789
8.以下程序的输出结果是B。
intmain(void)
{intaa[4][4]={{l,2,3,4},{5,6,7,8},{3,9,10,2}.{4,2.9,6}};
inti,s=0:
for(i=0;i<4;i++)
s+二aa[i][l];
printf(,,Wd\n,,ls);
}
A・B・19C・13D・20
二.填空题
1•设有定义语句:
inta[][3]={{0},{l},{2}};则数组元素a[l][2]的值是0。
2.下列程序的功能是:
求出数组x中各相邻两个元素的和依次存放到a数组中,然后输出。
请填空。
intmain(void)
{intx[10],a[9].i;
for(i=0;i<10;i++)scanf「%d:
&x[i]);
for(」=1_;i<10;i++)a[i-l]=x0+_x[l-l]_;
for(i二0;i<9;i++)printff'^dM,a[i]);printf(M\nM);
}
3•写出下列程序的运行结果是-12o
intmain(void)
{inta[10]={10,1,-20,-203,-21,2,-2,-2,11,-21};intj,s=O;
for(j=0;j<10;j++)
if(a[j]%2==0)s+二a[j];printf(,,s=Wd\n,,,s);
}
4•写出下面程序的运行结果。
#inelude
intmain(void)
{floats⑹二{1,3,5,7,9};
floatx;
inti;
scanf(%:
&x);
for(i=4;i>=0;i--)唯B>x)s[i+*s[j];
elsebreakprintfC^d\n",i+l);
return0;
}
(1)如果输入4,则输岀2o
⑵如果输入5,则输岀3。
5・
下列程序的功能是输岀如下形式的方阵,请填空。
13
14
15
16
9
10
11
12
5
6
7
8
1
2
3
4
intmain(void)
{intij.x;
for(j=4;j>=l_;j--)
{for(i=l;i<=4;i++)
{x=G-l)*4+J_;
printf(,M4dMlx);
}
pnntfC,\nM);
}
}
6.以下程序的功能是用来检查二维数组是否对称(即对所有的i,j都有aD]G]=aD]B)o请填空。
intmain(void)
{inta[4][4]二{1,2,34,225,637,867,4};
inti,j,found=0;
for(j=0;j<4;j++)
{for(i=0;i<4;i++)
CafflD]'=aD]DU{
_found=l;-
break;
}
if(_found二二reak;
}
计(found!
二O)printf「该二维数组不对称\rf);
elseprintff该二维数组对称\n“);
return0;
}
三・程序设计题
1.选择法排序。
输入一个正整数nd试编写相应程序。
解答:
#include
intmain(void)
{
inti,n,index,k,temp;
inta[10];
printf("Entern:
M);
scant(期d:
&n);
printf(,,lnput%dintegers:
",n);
for(i=0;iscanf(H%d,,1&a[i]);
for(k=0;kindex=k;
for(i=k+l;iif(a[index]temp=a[index];
a[index]=a[k];a[k]=temp;
}
printfC'AftersortedJ;
for(i=0;iprintff'%d:
a[i]);
printf("\nM);
return0;
}
2.求一批整数中出现最多的数字。
输入一个正整数nClWnWIOOO),再输入n个整数,分析每个整数的每一位数宇,求出现次数最多的数宇。
例如输入3个整数1234.2345、3456,其中岀现次数最多的数宇是3和4,均出现了3次。
试编写相应程序。
解答:
#include
intmain(void)
{
intij,kg,n,max;
inta[1000],b[1000],count[1000];
printf("Entern:
M);
scant(期d:
&n);
printf("EnterWdintegers:
",n);
for(i=0;iscanf(MHd,,,&ap]);
for(i=0;i<=9;i++)
count[i]=0;
for(i二0;i<二9;i++)
for(j=0;jfor(k=0;kb[k]=a[k];
while(aO]!
=OX
if(a[j]%10==i)
count[i]++;
a[j]=aD]/10;
}
for(k=0;ka[k]=b[k];
}
max=count[0];
for(i二0;i<二9;i++)
if(maxmax=count[i];
prints出现最多次数的数字和次数是:
");
for(i二0;i<二9;i++)if(max==count[i])
printf('1%2d-%d,,1ilcount[i]);
return0;
}
3.判断上三角矩阵。
输入一个正整数n(lWnW6)和n阶方阵a中的元素,如果a是上三角矩阵,输出“YES:
否则,输出“NO"。
上三角矩阵,即主对角线以下的元素都为0的矩阵,主对角线为从矩阵的左上角至右下角的连线。
试编写相应程序。
解答:
#inelude
intmain(void)
{
inti,j,n,flag;
inta⑹[6];
printf(Mlnputn:
M);
scanff'%d:
&n);
printf(MlnputarrayAn*');
for(i=0;ifor(j=0;jscanff耶d:
&a[i][j]);
for(j=l;jfag二0;
for(i=l;iif(a[i]D]==O)
flag=l;
}
if(flag)
printffYES!
'");
else
printfC,NO!
\nM);
return0;
}
4•求矩阵各行元素之和。
输入2个正整数m和n1WnW6),然后输入该m行
n列矩阵a中的元素,分别求岀各行元素之和,并输岀。
试编写相应程序。
解答:
#include
intmain(void)
inti,j,m,n,sum:
inta⑹[6];printf("lnputm:
M);scanff场d:
&n);printfC'Inputn:
M);scanff'%d:
&n);printf(Mlnputarray:
\nM);for(i=0;i&a[i][j]);for(i=0;ifor(j=0;jreturn0;
}
5.找鞍点。
输入一个正整数n(2WnW6)和n阶方阵a中的元素,假设方降a最多育1个尊点,如果找到a的鞍点,就输出它的下标;否则,输出"NO%鞍点的元素值在该行上最大,,
■
在该列上最小。
试编写相应程序。
解答:
#include
intmain(void)
intflag,i,j,k,row,col,n;
inta⑹[6];
printf(Mlnputn:
M);
scant(期d:
&n);printf(MlnputarrayAnM);for(i=0;ifor(j=0;j&a[i][j]);
for(i=0;iflag=l;
col二0;
for(j=0;jif(aD][col]>a[k][col]X
flag=0;break;
}
WlagX
row二i;break;
}
}
if(flag)
printf「a[%d]pfd]二圳d\n:
row,col,a[row][col]);else
printf「NO\rT);
return0;
}
7•字符串替换。
输入一个以回车结束的字符串(少于80个字符),将其中的大写字母用下面列出的对应大写宇母替换,其余字符不变,输出替换后的字符串。
试编写相应程序。
原字母
A
B
C
D
对应字母
Z
Y
X
W
X->C
Y—B
ZA
解答:
#inelude
intmain(void)
{
inti;
charch,str[80];
printf("lnputastring:
M);
i二0;
w