C语言程序设计第3版何钦铭 颜 晖 第7章 数组范本模板.docx
- 文档编号:23425470
- 上传时间:2023-05-17
- 格式:DOCX
- 页数:27
- 大小:22.63KB
C语言程序设计第3版何钦铭 颜 晖 第7章 数组范本模板.docx
《C语言程序设计第3版何钦铭 颜 晖 第7章 数组范本模板.docx》由会员分享,可在线阅读,更多相关《C语言程序设计第3版何钦铭 颜 晖 第7章 数组范本模板.docx(27页珍藏版)》请在冰豆网上搜索。
C语言程序设计第3版何钦铭颜晖第7章数组范本模板
第7章数组
【练习7-1】将例7—3程序中的break语句去掉,输出结果有变化吗?
假设输入数据不变,输出什么?
解答:
当去掉break语句后,一旦找到数据将不跳出循环,而是继续往下找值为x的元素,因
此程序输出会有变化。
当输入数据仍为29819时,输出将是indexis1indexis4.
【练习7—2】将数组中的数逆序存放。
输入一个正整数n(1〈n〈=10),再输入n个整数,存入数组a中,输出最大值及其对应的最小下标,下标从0开始。
试编写相应程序。
解答:
#include〈stdio。
h>
intmain(void)
{
inti,n,temp;
inta[10];
printf(”Inputn:
");
scanf(”%d”,&n);
printf("Input%dinteger:
",n);
for(i=0;i〈n;i++)
scanf("%d”,&a[i]);
printf("Afterreversed:
”);
for(i=0;i temp=a[i]; a[i]=a[n—1-i]; a[n—1—i]=temp; } for(i=0;i〈n;i++) printf(”%d”,a[i]); return0; } 【练习7-3】求最大值及其下标。 输入一个正整数n(1 解答: #include〈stdio.h〉 intmain(void) { inti,index,n; inta[10]; printf("Entern: ”); scanf(”%d”,&n); printf(”Enter%dintegrs: ”,n); for(i=0;i scanf("%d",&a[i]); for(i=n-1;i〉=0;i++) printf(”%d”,a[i]); return0; } 【练习7-4】找出不是两个数组共有的元素.输入一个正整数n(1<n≤10),再输入n个整数,存入第1个数组中;然后输入一个正整数m(1〈m<=10),再输入m个整数,存入第2个数组,找出所有不是这两个数组共有的元素。 试编写相应程序。 解答: #include h> intmain(void) { inti,j,k,m,n,flag,equal; inta[25],b[25],c[25]; printf(”Enterm: "); scanf(”%d”,&m); printf("Enter%dintegers: ”,m); for(i=0;i〈m;i++) scanf(”%d",&a[i]); printf("Entern: ”); scanf(”%d”,&n); printf(”Enter%dintegers: ",n); for(j=0;j〈n;j++) scanf(”%d”,&b[j]); k=0; for(i=0;i flag=0; for(j=0;j if(a[i]==a[j]) flag=1;//判断一个数组中是否有相重的元素,有的话不执行 if(! flag){ equal=0; for(j=0;j〈n;j++) if(a[i]==b[j]){ equal=1; break; } if(! equal) c[k++]=a[i]; } } for(i=0;i flag=0; for(j=0;j if(b[i]==b[j]) flag=1; if(! flag){ equal=0; for(j=0;j〈m;j++) if(b[i]==a[j]){ equal=1; break; } if(! equal) c[k++]=b[i]; } } printf(”%d”,c[0]); for(i=1;i printf(”%d",c[i]); printf("\n”); return0; } 【练习7-5】给二维数组赋值时,如果把列下标作为外循环的循环变量,行下标作为内循环的循环变量,输入的数据在二维数组中如何存放? 用下列for语句替换例7—7中的对应语句,将输入的6个数存入二维数组中,假设输入数据不变,输出什么? 与例7-7中的输出结果一样吗? 为什么? for(j=0;j〈2;j++) for(i=0;i<3;i++) scanf(“%d”,&a[i][j]); 解答: 当把列下标作为外循环的循环变量,行下标作为内循环的循环变量时,输入的数据将 以列优先的方式存放。 当用上述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〈i;j++){ temp=a[i][j]; a[i][j]=a[j][i]; a[j][i]=temp; } 若修改为遍历整个程序,方法如下,则运行结果仍将输出原矩阵,无法达到转置要求, 原因是矩阵中每个元素相应被交换了2次。 for(i=0;i for(j=0;j〈n;j++){ temp=a[i][j]; a[i][j]=a[j][i]; a[j][i]=temp;////先是下三角进行交换,后是上三角进行交换 } 【练习7-7】矩阵运算: 读入1个正整数n(1≤n≤6),再读入n阶方阵a,计算该矩阵除副对角线、最后一列和最后一行以外的所有元素之和。 副对角线为从矩阵的右上角至左下角的连线。 试编写相应程序. 解答: #include〈stdio。 h> intmain(void) { inti,j,n,sum; inta[6][6]; printf(”Inputn: "); scanf("%d”,&n); printf(”Inputarray: \n"); for(i=0;i〈n;i++) for(j=0;j scanf(”%d",&a[i][j]); sum=0; for(i=0;i〈n;i++) for(j=0;j〈n;j++) if(i! =n—1&&j! =n—1&&i+j! =n—1)sum+=a[i][j]; printf(”sum=%d\n”,sum); return0; } 【练习7-8】方阵循环右移。 读入2个正整数m和n(1<=n<6),在读入n阶方阵a,将该方阵中的每个元素循环向右移m个位置,即将第0、1、…、n—1列变换为第n—m、n-m+1、…、 n-1、0、1、…、n-m-1列,移动后的方阵可以存到另一个二维数组中。 试编写相应程序。 解答: #include〈stdio.h> intmain(void) { intm,n,i,j,count; inta[6][6],b[6][6]; printf(”Enterm: ”); scanf("%d”,&m); printf("Entern: "); scanf("%d”,&n); printf(”Inputarray: \n"); for(i=0;i for(j=0;j scanf(”%d",&a[i][j]); for(i=0;i〈n;i++){ count=0; for(j=0;j if(j b[i][j+m]=a[i][j]; else b[i][count++]=a[i][j]; } for(i=0;i〈n;i++){ for(j=0;j printf(”%d",b[i][j]); printf(”\n”); } return0; } 【练习7—9】计算天数: 输入日期(年、月、日),输出它是该年的第几天。 要求调用例7—10中定义的函数day_of_year(year,month,day)。 试编写相应程序。 解答: #include intday_of_year(intyear,intmonth,intday); intmain(void) { intyear,month,day,day_year; printf("Inputyear,month,day: "); scanf(”%d%d%d",&year,&month,&day); day_year=day_of_year(year,month,day); printf("Daysofyear: %d\n”,day_year); return0; } intday_of_year(intyear,intmonth,intday) { intk,leap; 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=(year%4==0&&year%100! =0||year%400==0); for(k=1;k〈month;k++) day=day+tab[leap][k]; returnday; } 【练习7-10】查找指定字符。 输入一个字符,再输入一个以回车符结束的字符串(少于80个字符).如果找到,则输出该字符在字符串中所对应的最大下标,下标从0开始;否则输出”NotFound”。 试编写相应程序。 解答: #include〈stdio。 h〉 intmain(void) { inti,max,flag; chara[80],op; printf("Enterax: ”); op=getchar(); fflush(stdin);//或setbuf(stdin,NULL); printf("Enterastring: "); i=0; while((a[i]=getchar())! ='\n') i++; a[i]=’\0’; max=0; flag=0; for(i=0;a[i]! =’\0’;i++) if(a[i]==op){ max=i; flag=1; } if(flag==1) printf(”Max=%d",max); else printf(”NotFound! ”); return0; } 【练习7-11】字符串逆序: 输入一个以回车符结束的字符串(少于80个字符),将该字符串逆序存放,输出逆序后的字符串。 试编写相应程序。 解答: #include h〉 intmain(void) { inti; charstr[80],a[80]; printf(”Enterastring: "); i=0; while((str[i]=getchar())! ='\n') i++; str[i]=’\0'; for(;i〉=0;i--) putchar(str[i]); return0; } 习题7 一.选择题 1.假定int类型变量占用两个字节,其有定义: intx[10]={0,2,4};则数组x在内存中所占字节数是D。 A.3B.6C.10D.20 2.以下能正确定义数组并正确赋初值的语句是D。 A.intN=5,b[N][N]; B.inta[1][2]={{1},{3}}; C.intc[2][]={{1,2},{3,4}}; D.intd[3][2]={{1,2},{34}}; 3.若有定义: inta[2][3];以下选项中对数组元素正确引用的是D。 A.a[2][0]B.a[2][3]C.a[0][3]D.a[1〉2][1] 4.设有数组定义: chararray[]=”China";则数组array所占的空间为C. A.4个字节B.5个字节C.6个字节D.7个字节 5.下述对C语言字符数组的描述中错误的是D。 A.字符数组可以存放字符串 B.字符数组中的字符串可以整体输入、输出 C.可以在赋值语句中通过赋值运算符"=”对字符数组整体赋值 D.不可以用关系运算符对字符数组中的字符串进行比较 6.有以下定义: charx[]=”abcdefg”;chary[]={’a’,'b',’c’,’d’,’e’,’f’,’g'};则正确的叙述为C。 A.数组x和数组y等价B。 数组x和数组y的长度相同 C.数组x的长度大于数组y的长度D.数组x的长度小于数组y的长度 7.以下程序的输出结果是C。 intmain(void) {intm[][3]={1,4,7,2,5,8,3,6,9}; inti,j,k=2; for(i=0;i<3;i++) printf(”%d”,m[k][i]); } A.456B.258C.369D.789 8.以下程序的输出结果是B。 intmain(void) {intaa[4][4]={{1,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][1]; printf(”%d\n”,s); } A.11B.19C.13D.20 二.填空题 1.设有定义语句: inta[][3]={{0},{1},{2}};则数组元素a[1][2]的值是0。 2.下列程序的功能是: 求出数组x中各相邻两个元素的和依次存放到a数组中,然后输出。 请填空。 intmain(void) {intx[10],a[9],i; for(i=0;i<10;i++) scanf(”%d",&x[i]); for(_i=1_;i〈10;i++) a[i—1]=x[i]+_x[i-1]_; for(i=0;i<9;i++) printf("%d”,a[i]); printf("\n"); } 3.写出下列程序的运行结果是—12. intmain(void) {inta[10]={10,1,-20,—203,—21,2,-2,-2,11,—21}; intj,s=0; for(j=0;j〈10;j++) if(a[j]%2==0) s+=a[j]; printf("s=%d\n",s); } 4.写出下面程序的运行结果. #include〈stdio.h> intmain(void) {floats[6]={1,3,5,7,9}; floatx; inti; scanf(“%f”,&x); for(i=4;i>=0;i--) if(s[i]>x) s[i+1]=s[i]; else break; printf(”%d\n”,i+1); return0; } (1)如果输入4,则输出2。 (2)如果输入5,则输出3。 5.下列程序的功能是输出如下形式的方阵,请填空。 13141516 9101112 5678 1234 intmain(void) {inti,j,x; for(j=4;_j>=1_;j——) {for(i=1;i〈=4;i++) {x=(j-1)*4+_i_; printf(”%4d",x); } printf("\n"); } } 6.以下程序的功能是用来检查二维数组是否对称(即对所有的i,j都有a[i][j]=a[j][i])。 请填空. intmain(void) {inta[4][4]={1,2,3,4,2,2,5,6,3,7,8,6,7,4}; inti,j,found=0; for(j=0;j<4;j++) {for(i=0;i<4;i++) if(_a[j][i]! =a[i][j]_){ _found=1;_ break; } if(_found==1_)break; } if(found! =0)printf("该二维数组不对称\n"); elseprintf(”该二维数组对称\n”); return0; } 三.程序设计题 1。 选择法排序。 输入一个正整数n(1 试编写相应程序。 解答: #include〈stdio。 h〉 intmain(void) { inti,n,index,k,temp; inta[10]; printf("Entern: "); scanf(”%d”,&n); printf("Input%dintegers: ”,n);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C语言程序设计第3版何钦铭 第7章 数组范本模板 语言程序设计 数组 范本 模板