收藏 分销(赏)

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

上传人:精*** 文档编号:10081714 上传时间:2025-04-21 格式:DOCX 页数:16 大小:33.90KB 下载积分:8 金币
下载 相关 举报
C语言程序设计何钦铭颜晖第7章数组.docx_第1页
第1页 / 共16页
C语言程序设计何钦铭颜晖第7章数组.docx_第2页
第2页 / 共16页


点击查看更多>>
资源描述
第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;
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服