资源描述
第7章数组
【练习7 1】将例7-3程序中的break语句去掉,输出结果有变化吗?假设输入数据不变,输出什么?解答:当去掉break语句后,一旦找到数据将不跳出循环,而是继续往下找值为x的元素,因此程序输出会有变化。当输入数据仍为2 981 9时,输出将是index is 1 index佃4
【练习7-2】将数组中的数逆序存放。输入一个正整数n (Kn<=10),再输入n个整数,存 入数组a中,输出最大值及其对应的最小下标,下标从0开始。试编写相应程序。
解答:
#in clude<stdio.h> int main(void)
int i,n,temp;
int a[10];
printf("lnputi )n:
scant(期 d: &n); printf(”lnput %d in\ger:fOr(i=0;i<n;i + +)
scanf「%d: &a[i]); printfC'After rever;sedf"r(i=0;i<n/2;i + +X
temp=a[i^a[i]=a[n-l-i]; a[n-l-i]=temp:
}
for(i=0;i<n;i + +)
printf(*%d : a ;i])
return 0;
【练习7 3】求最大值及其下标。输入一个正整数n (l<n<=10)再输入n个整数、存入数组a中将先数组a中的这n个数逆序存放,在按顺序输出数组e中的n各元素。试编写相应程序。解答:
#include<stdio.h> int main(void)
int i,index,n; int a[10];
printf("EnterM n;:scanff%d: &n);
printf Enter %d integrs:",n); for(i=0;i<n;i + +) scaAaOld;
for(i=n-l;i>=0;i + +) printf('%d :
return 0;
【练习7-4]找出不是两个数组共有的元素。输入一个正整数n(l< nW10),再输入n个 整数.存入第1个数组中;然后输入一个正整数m (l<m<=10),再输入山个整数,存入 第2个数组,找所有不是这两个数组共有的元素。试编写相应程序。
解答:
#in clude<stdio.h> int main(void)
int ijXm,n,flag,equal;
int a[25],b[25],c[25];
printf("Enter nj); scanff'%d &n); printEnter %d integers:",m);
for(i=0;i<m;i + +) sGa4df'(&a[i]);
printf("EnterM )n:
scanff场 d: &n); prinMiEhter 嵋 d integers:",n);
for(j=0;j<n;j++)
scanf n%d h, &b[j]);
k 二 0;
for(i=0;i<m;i++)(
flag=O;
for(二 O;j<i;j++)
if(a[i] ==aOJ)
flagW判断一个数组中是否有相重的元素,有的话不执行
equal =0;
for(j=0;j<n;j++aH==bD]X equal =1; break;
if(!equal)
c[k++]=a[i];
}
}
for(i=0;i<n;i + +)(
flag=O;
forG=0;j<i;j++)
if(bD]==bffl)
flag=l;
if(!flagX
equal =0;
for(二 0;j<m;j + +)
二二 a[j])(
equal =1;
break;
}
if(!equal)
c[k++]二 b[i];
}
}
printf(d ,,c[0]);
for(二 2;i<ki + +)
printF % d", c[i]);
printf \m);
return 0;
}
【练习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
2 6
10- 1
【练习7-6]在例7-9的程序中,如果将遍历上三角矩阵改为遍历下三角矩阵,需要怎 样修改程序?运行结果有变化吗?如果改为遍历整个矩阵,需要怎样修改程序?输出是什么?为什么?解答:
只需按要求修改矩阵的输出部分,方法如下,其运行结果不变。
for(i = 0; i < n; i + +)
for(二 0;j<i;j + +) (
temp 二 a[i][j];
aBD] = aOJD];
aQ][i] = temp;
}
若修改为遍历整个程序,方法如下,则运行结果仍将输出原矩阵,无法达到转置要求,原因是矩阵中每个元素相应被交换了 2次。
for(i = 0; i < n; i + +)
for(j = 0;j < n; j++)(
temp = a[i]Q;]
a 丽]=aDlH ;
aO]H 二 temp;//先是下三角进行交换,后是上三角进行交换
}
【练习7-7]矩阵运算:读入1个正整数n(lWnW6),再读入n阶方阵a,计算该矩阵除副对角线、最后一列和最后一行以外的所有元素之和。副对角线为从矩阵的右上角至左下角的连 线。试编写相应程序。
解答:
#inelude <stdio.h>
int main(void)(
int i,j,n,sum;
i nt ⑹)[6];
printf,(nput n:);
scanfCAd'&n);
printfInput arrayAirn);
for(i=0;i<n;i++)
for(j=0;j<n;j + +)scant(期 d:&a[i][j]);
sum=0;
for(i=0;i<n;i + +)for(j=0;j<n;j + +)
if(i!=n-l&二j !rvl&& +j!=n-l) sum +=a[i][j];
print f,(um 二汕 n: sum);
return 0;
}
【练习7-8]方阵循环右移。读入2个正整数m和n (l<=n<6)在读入3阶方阵a,将该方阵中的每个元素循环向右移m个位置,即将第0、1、...'n-l列变换为第n-m、n-m+l、...、n-K 0、1、…、n-m-1列,移动后的方阵可以存到另一个二维数组中。试编写相应程序.::解答:#in clude<stdio.h>int main(void)(
int m,nJj.count;
int ⑹)[6],b[6]);
printf("Enter Mr):;
scanff'%d: &n);
printf("EnterM n;:
scant(期 d: &n);
printf lnput array:,*h;
for(i=0;i<n;i++)for(j=0;j<n;j + +)
scant(期 d: &a[i][j]);
for(i=0;i<n;i++)(
count=0;
for(j=0;j<n;j + +)
计 G<n-m)
b[i]Gm]=a[i]0]
else
b0[count++]=a|j]0]
}
for(i=0;i<n;i + +)(
for(j=0;j<n;j++)
printf("%d ",b[i][j]);
printfCV);
}
return 0;
}
【练习7-9]计算天数:输入日期(年、月、日),输出它是该年的第几天。要求调用例7-10中定义的函数day_of_year(year, month, day)试编写相应程序:解答:#in clude<stdio.h>
int day_of_year(int year, int month, int day);
int main(void)
(
int year.m on th,day,d(ayejar;
printf lnput year,month,day:);
scanff'%d%d%d : &yeai; &m onth.&day);
day_year=day_ofAear(year,month,day);
printf("Days of year: %\day_year);
return 0;
}
int day_of_year(int year.int monthjnt day)
(
int kleap;
int tab [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%1!=0||yearW4 二二 0);
for(k=l;k<month;k++)
day=day+tab[leap][k];
return day;
}
【练习7-10]查找指定字符。输入一个字符,再输入一个以回车符结束的字符串(少于80个字符)。如果找到,则输出该字符在字符串中所对应的最大下标,下标从0开始;否则输出wNot Founds试编写相应程序。
解答:
#in clude<stdio.h>
int main(void)
(
int i,max,flag;
char a[80],op;
printf Enter a x:);
op=getchar();
fflush(stdin感/Setbuf(stdin,NULL);
printf("Enter a string:i二 0;
whi le((a[i]=g etchar=}\n'!)
i ++;
a[i二、0:
max 二 0;
flag=0;
for(i=0;a[i,\Q=i + +)
if(a[i] = =op)(max 二 i;flag=l;
}
if(flag==l)
printfC 'M ax=%d : m ax);
else
printA'Not Found!)驾
return 0;
}
【练习7-11]字符串逆序:输入一个以回车符结束的字符串(少于80个字符),将该字符串逆序存放,输出逆序后的字符串。试编写相应程序。
解答:
#in clude<stdio.h>
int main(void)
(
int i;
char str[80a [80];
printf("Enter a string:");
i二 0;
while((str二_]getchar())二、rf)
i ++;
for(;i>=0;i--)
putchar(str[i]);
return 0;
}
习题7
—选择题
1假定int类型变量占用两个字节,其有定义:int x[1二{0,2,4测数组x在内存中所占字节数是
D o
A 3 B 6 C 10
D 20
2. 以下能正确定义数组并正确赋初值的语句
是D。
A int N=5,b[N][N];
B. inta[l][2] = {{l},{3}};
C. intc[2]0={{1.2},{3;4}}
D. intd(3) [ 2] = {{1,2},{34}};
3若有定义:int⑵)[3 ]以下选项中对数组元素正确引用的是D 。
A a[2][0]
B a[2][3]
C . a [0][3]
4 .设有数组定义:char array [,]ChinaM ;则数组array所占的空间为C。
A 4个字节B 5个字节C 6个字节D 7个字节
5 .下述对C语言字符数组的描述中错误的是Do
A. 字符数组可以存放字符串
B. 宇符数组中的字符串可以整体输入、输出
C .可以在赋值语句中通过赋值运算符”二"对宇符数组整体 值
D.不可以用关系运算符对字符数组中的字符串进行比较
6有以下定义:char x[ ]="abcdefg“; char y[则正确的叙述为
C o
A数组x和数组y等价B.数组x和数组y的长度相同
C数组X的长度大于数组y的长度D数组x的长度小于数组y的长度
7. 以下程序的输出结果是C。
int main(void)
( int』⑶={1,47,2,5,8,3,6.9};
int ij二<2;
for (i=0;i<3;i++)
printffHd\・[k][i]);
}
A.456 B 2 58 C 369 D 789
8. 以下程序的输出结果是B。
int main(void)
{ int aa[4][4] = {{l,2,3,4},{5,6,7,8},{3,9,10,2}.{4,2.9,6}};
int i, s=0:
for(i=0;i<4;i++)
s+二 aa[i] ;l]
printfWd\n 冲);
}
A B 19 C 13 D 20
二.填空题
1设有定义语句:int a[][3] = {{0},{l则数}组元素a[l][2^值是0
2 .下列程序的功能是:求出数组x中各相邻两个元素的和依次存放到a数组中,然后输出。请填空。
int main(void)
(intx[10],a[9].i;
for(i=0; i<10; i + +) 「c%df &x[i]);
for」=1_; i<10; i + + ) a[i-l]=x0+_x[l-l]_;
3写出下列程序的运行结果是-12 o
3写出下列程序的运行结果是-12 o
for(二 0; i<9; i+ +) printffa 3]) printf(M);
4写出下面程序的运行结果
4写出下面程序的运行结果
int main(void)
( int a[10] = {10,1,-20,-203,-21,2,-2,-2,11,-21}; int j,s=O;for(j=0;j<10;j + +)
if(a [j]%2==0) 二+ a[j]; prinst=Wd\n ,,s);
如果输入4,则输
如果输入5,则输
如果输入4,则输
如果输入5,则输
(1)
⑵
#inelude <stdio.h>int main(void)
{float⑹二{1, 3, 5, 7, 9};
float x;
int i;
scanf(%:&x);
for (i=4 ; i>=0;唯-B>x) s[i+*s[j];
else break printfC八d \n",i+l);
return 0;
5下、列程序的功能是输如下形式的方阵,请填空。
13141516
9101112
5678
1234
int main(void)
{ intij.x;
for(j=4;j>=l_;j--)
{ for(i = l;i<=4;i + +)
{ x=G-l)*4+J_;
printjM4d m q);
}
pnntfC,\rM);
}
6 .以下程序的功能是用来检查二维数组是否对称(即对所有的i,都有aD] G]=aD] B)o请 填空。int main(void)
( int a[4]二411,2,34,225,637,867,4};
int i,j,found=0;
for(j=0;j<4;j + +)
( for(i=0;i<4;i + +)
CafflD]'=aD]DU{
_found=l;
break;
}
if(_fou n二二 reak;
}
计(found 二 O)printf该二维数组不对称\rf);
else printff 二维数组对称\1E)
return 0;
}
三程序设计题
1. 选择法排序。输入一个正整数nd<nW10),再输入n个整数,将它们从大到小排序后输出。试编写相应程序。
解答:
#in clude<stdio.h>
int main(void)
{
int i,n,index,k,temp;
int a[10];
printf("EnterM n:
scant(期 d: &n);
printf,(nput%d integers:",n);
for(i=0;i<n;i + +)
scanf H%d ,1&a[i]);
for(k=0;k<n-l;k+ +){
in dex=k;
for(i=k+l;i<n;i++)
if(a[index]<a[i]) index=i;
temp=a[index];
a[index] = a[k]; a[k]=temp;
}
printfC'After sorted J;
for(i=0;i<n;i++)
printff'%d a[i]);
printf('M\)n
return 0;
}
2. 求一批整数中出现最多的数字。输入一个正整数n ClWnWIOOO),再输入n个整数,分 析每个整数的每一位数宇,求出现次数最多的数宇。例如输入3个整数1234. 2345、3456,其中 现次数最多的数宇是3和4,均出现了 3次。试编写相应程序。
解答:
#in clude<stdio.h>
int main(void)
(
int ij,kg,n,max;
int a[10],b[10],count[10];
printf("EnterM )n:
scant(期 d: &n);
printf("Enter Wd integers:",n);
for(i=0;i<n;i + +)
scanf MHd ,,&ap]);
for(i=0;i<=9;i++)
count[i]=0;
for(二 0"<二 9;i + +)
for(j=0;j<n;j + +X
for(k=0;k<n;k++)
b [k]=a[k];
while(aO]!=OX
if(a[j]%10==i)
count[i] ++;
a[j]=aD]/10;
}
for(k=0;k<n;k++)
a[k]=b[k];
}
max=count[0];
for(二 0"<二 9;i + +)
if(max<count[i])
max=count[i];
prints出现最多次数的数字和次数是:");
for(二 0"<二 9;i + +) if(max==count[i])
printf1%2d-%d ,1ilcount[i]);
return 0;
}
3. 判断上三角矩阵。输入一个正整数n (lWnW6)和n阶方阵a中的元素,如果a是上三角 矩阵,输出“YES:否则,输出“NO"。上三角矩阵,即主对角线以下的元素都为0的矩阵,主对角线为从矩阵的左上角至右下角的连线。试编写相应程序。
解答:
#inelude <stdio.h>int main(void)
(
int i,j,n,flag;
int⑹)⑹;
printf lnput im);
scanff/%d: &n);
printfInput arrayAn*')
for(i=0;i<n;i + +)
for(j=0;j<n;j++)
scanff 耶 d: &a[i][j]);
for(j=l;j<n;j++X
fag 二 0;
for(i=l;i <j;i++)
if(a[i]D] ==O)
flag=l;
}
if (flag)
printffYES!/");
else
printfCNO!\nM);
return 0;
}
4 求矩阵各行元素之和。输入2个正整数m和n1W n W6),然后输入该m行
n列矩阵a中的元素,分别求 各行元素之和,并输。试编写相应程序。
解答:
#include<stdio.h>
int main(void)
int i,j,m,n,sum: i6^[6d; printf("lnpu) ;m:scanf场 d: &n); printfC'InpuM )1: scanff'%d
&n); printiflnput array: \I; for(i=0;i<m;i++) for(j=0;j<n;j++) sca&af[f%d[j]); for(i=0;i<m;i ++)( sum=O;
for(j=0;j<n;j++) sum=sum+a[i][j]; prumtf( row %d is Wd\n",i,sum); }
return 0;
}
5 .找鞍点。输入一个正整数n(2WnW6)和n阶方阵a中的元素,假设方降a最多育1个尊点,如
果找到a的鞍点,就输出它的下标;否则,输出"NO%鞍点的元素值在该行上最大,,
在该列上最小。试编写相应程序。
解答:
#in clude<stdio.h>
int main(void)
int flag,i,j,k,row,col,n;
int ⑹)[6];
printf Input n:);
scant(期 d: &n); prinMflhput arrayAm ); for(i=0;i<n;i + +)
for(j=0;j<n;j + +) sOahtd: &a[i][j]);
for(i=0;i<n;i + +){
flag=l;
col 二 0;
for(j=0;j<n;j++) if(a[i][col]<aD]D]) col=j; for(k=0;k<n;k++)
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);
return 0;
}
7 字符串替换。输入一个以回车结束的字符串(少于80个字符),将其中的大写字母用下面列出的对应大写宇母替换,其余字符不变,输出替换后的字符串。试编写相应程序。
原字母对应字母
AZ
BY
X
W
X->C
Y-B
ZA
解答:
#inelude <stdio.h>
int main(void)
(
int i;
char ch,str[80];
printf("lnput a string:
i 二 0;
while 仗 h=getchar())!='\n*){ str二 +c+]
}
strD]=\O,;
for(二 O;str[iW、0: i ++) if(str[i]v
二 N &&str[i]-二 A) str 二]A+N
str[i];
printfAfter replaced:");
for(二 O;str[i二!、0: i + +) putchar(str[i]);
putcharCXn*);
return 0;
}
8 .字符串转换成十进制整数。输入一个以字符学结束的字符串滤去所有的非十六进制字符(不分大小写),组成一个新的表示十六进制数宇的字符串,然后将其转换为十进制数后输出。如果过滤后字符串的首字符为”:代表该数是负数。试编写相应程序。
解答:
#in clude<stdio.h>
int main(void)
(
int i,j,k
char hexad[80],str[80];
long number;
printf("Enter a stM)ng:
i二 0;
while((str二_]getchar())! =#)
i ++;
str[i\O,;
k 二 0;
for(二 O;str[二!、0: i + +)
jf(str[i],-==str[i]O>=&&str[i]<,=, ||str[i]a>,=&str[i]<,f ||str[i]^>,= &&str[i]二 F) hexad[k++]=str[i];
hexad[k]='\O*;
j二 1;
if(hexad[O] =,-')(
for(k=l;hexad[k],\=;k++)
if (hexad[k] ! = "-')
hexad[j + +]=hexad[k];
}
else(
j二 0;
for(k=0;hexad[k] =\0,;k++)
if (hexad[k] !=*-')
hexad[j + +]=hexad[k];J
printf("New string):;
for(i=0;hexad[i]\!0=i + +)
putchar(hexad[i]);
printf \m);
n umber=0;
for(二 0;hexad[i二、0: i ++)(
if(hexad[i] >= &&hexad[i]<=9,)
n umber 二 num be rr6+hexad[i] O;
else if(hexad[i二〉A&&hexad[i]< 二 F)
n umber=nu mb er*16+hexad[i] - 'A*+10;
else if(hexad[i]a>,=&hexad[i]<=,f) n umber=nu mb erU 6+hexad[i] 0+10;
}
if(hexad[0],=*)
printfNumber=%ld\n 门-nu mber); elseprintfC'Num ber二% ld\n numb er);
return 0;
展开阅读全文