C语言程序设计何钦铭颜晖第7章数组.docx

上传人:b****7 文档编号:25414210 上传时间:2023-06-08 格式:DOCX 页数:22 大小:24.76KB
下载 相关 举报
C语言程序设计何钦铭颜晖第7章数组.docx_第1页
第1页 / 共22页
C语言程序设计何钦铭颜晖第7章数组.docx_第2页
第2页 / 共22页
C语言程序设计何钦铭颜晖第7章数组.docx_第3页
第3页 / 共22页
C语言程序设计何钦铭颜晖第7章数组.docx_第4页
第4页 / 共22页
C语言程序设计何钦铭颜晖第7章数组.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

C语言程序设计何钦铭颜晖第7章数组.docx

《C语言程序设计何钦铭颜晖第7章数组.docx》由会员分享,可在线阅读,更多相关《C语言程序设计何钦铭颜晖第7章数组.docx(22页珍藏版)》请在冰豆网上搜索。

C语言程序设计何钦铭颜晖第7章数组.docx

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;i

scanf「%d:

&a[i]);printfC'Afterreversed:

");for(i=0;i

temp=a[i];a[i]=a[n-l-i];a[n-l-i]=temp:

}

for(i=0;i

a[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;i

printf("Entern:

M);

scanff场d:

&n);printf(MEnter嵋dintegers:

",n);

for(j=0;j

scanf(n%dH,&b[j]);

k二0;

for(i=0;i

flag=O;

for(j二O;j

if(a[i]==aOJ)

flag^l;//判断一个数组中是否有相重的元素,有的话不执行

equal=0;

for(j=0;j

if(!

equal)

c[k++]=a[i];

}

}

for(i=0;i

flag=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;i

printf(”%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;i

for(j二0;j

temp二a[i][j];

aBD]=aOJD];

aQ][i]=temp;

}

若修改为遍历整个程序,方法如下,则运行结果仍将输出原矩阵,无法达到转置要求,原因是矩阵中每个元素相应被交换了2次。

for(i=0;i

for(j=0;j

temp=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;i

for(j=0;j

scant(期d:

&a[i][j]);

sum=0;

for(i=0;i

for(j=0;j

if(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;i

for(j=0;j

scant(期d:

&a[i][j]);

for(i=0;i

count=0;

for(j=0;j

计G

b[i]G+m]=a[i]0];

else

b0[count++]=a|j]O];

}

for(i=0;i

for(j=0;j

printf("%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;k

day=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;i

scanf(H%d,,1&a[i]);

for(k=0;k

index=k;

for(i=k+l;i

if(a[index]

temp=a[index];

a[index]=a[k];a[k]=temp;

}

printfC'AftersortedJ;

for(i=0;i

printff'%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;i

scanf(MHd,,,&ap]);

for(i=0;i<=9;i++)

count[i]=0;

for(i二0;i<二9;i++)

for(j=0;j

for(k=0;k

b[k]=a[k];

while(aO]!

=OX

if(a[j]%10==i)

count[i]++;

a[j]=aD]/10;

}

for(k=0;k

a[k]=b[k];

}

max=count[0];

for(i二0;i<二9;i++)

if(max

max=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;i

for(j=0;j

scanff耶d:

&a[i][j]);

for(j=l;j

fag二0;

for(i=l;i

if(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;i

for(j=0;j

return0;

}

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;i

for(j=0;j

&a[i][j]);

for(i=0;i

flag=l;

col二0;

for(j=0;j

if(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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1