1、习题六 解答习题六一 选择题1 C 2 B 3 A 4 D 5 D 6 B 7 都正确 8 A 9 D 10 A11 A 12 B 13 D 14 A 15 B二 填空题1 按行排序 2 2,4 3 字符数组 4 数组第一个元素地址 5 0 6 1 5 9 2 6 10 3 7 114 8 12 7 * * * * * 8 * * * * *9 1 2 1 3 3 14 6 4 110 abcde11 i=1 xi-1 12 int flag, i scanf(”%s”,str1) stri!=str1i 13 i=10-j aiai+1 t=ai ai+1=t三 编程题1 #include
2、void main() int i,n=0; int a10; /* 定义一个数组,用来存放10个数 */ float avg=0; /* 定义一个变量,用来存放这10个数的平均值*/ int max,min; printf(请输入10个数:n); /* 提示输入10个数 */ /* 读入10个数,并求这些数的和 */ for(i=0;i10;i+) scanf(%d,&ai); max=min=a0; for (i=1;imax) max=ai; if (aimin) min=ai; avg+=ai; avg/=10; printf(最大值为:%d,最小值为: %d 平均值为: %f,max
3、,min,avg);2#include void main() int i,temp,n=0,k=0; int a10; /* 定义一个数组,用来存放10个数 */ int min; printf(请输入10个数:n); /* 提示输入10个数 */ /* 读入10个数,并求这些数的和 */ for(i=0;i10;i+) scanf(%d,&ai); min=a0; for (i=1;i10;i+) if (aimin) min=ai; k=i; if (k!=0) temp=a0; a0=ak; ak=temp; printf(“最终的数组为:n”);for(i=0;i10;i+) pri
4、ntf(“%d ”,ai); printf(n最小值为: %d ,下标为:%d,min,k);3# include # define N 6main ( ) int aNN=0, i=0, j=0; for (i=0; iN; i+) ai0=aii=1; /* 给第一列和对角线上的元素赋1 */ for (i=2; iN; i+) for (j=1; ji; j+) /*对角线上的元素已被赋值,所以就ji */ aij=ai-1j-1+ai-1j; /* 给其他元素赋值 */ for (i=0; iN; i+) for (j=0; j=i; j+) printf (“%5d”, aij);p
5、rintf (“n”);4【解】 程序如下:# include main ( ) float a46=0, sum=0; int i=0, j=0; for (i=0; i4; i+) for (j=0; j5; j+) aij=i*j+1; /* 给数组a的前五列赋值 */ for (i=0; i4; i+) /* 计算各行平均值,并存放在ai5上 */ sum=0;for (j=0; j5; j+) sum=sum+aij;ai5=sum/5; for (i=0; i4; i+) for (j=0; j6; j+) printf (“%5.1f”, aij);printf (“n”);运行
6、结果:1.0 1.0 1.0 1.0 1.0 1.01.0 2.0 3.0 4.0 5.0 3.01.0 3.0 5.0 7.0 9.0 5.01.0 4.0 7.0 10.0 13.0 7.05【解】 程序如下:# include main ( ) int i=0, j=0, k=0, p=0 a35=3,1,10,4,7, 22,32,5,15,6, 11,21,8,9,16; printf (“Before:n”); for (i=0; i3; i+) /* 找最大值所在元素的下标 */ for (j=0; j5; j+) printf (“%5d”, aij);printf (“n”)
7、; for (i=0; i3; i+) for (j=0; j5; j+) if (akpaij) k=i; p=j;i=akp; akp=a00; a00=i; /* 对调 */printf (“After:n”); for (i=0; i3; i+) for (j=0; j5; j+) printf (“%5d”, aij);printf (“n”);运行结果:Before: 3 1 10 4 722 32 5 15 611 21 8 9 16After:32 1 10 4 722 3 5 15 611 21 8 9 166【解】 编程点拨:用count统计单词数。统计单词的个数可按一下步
8、骤进行:(1)在字符串中找出第一个非空格字符。(2)如果第一个非空格字符为有效字符(即不等于”0”),count增1,即处理第一个单词。(3)在字符串中,只要一个空格和一个非空格字符(不能为”0”)连续存在,说明找到了新的单词,因此count增1。程序如下:# include main ( ) char a80=”; int i=0; count=0; gets (a); while (ai = = ) i+; /* 找第一个非空格字符 */ if (ai!=0) count+; /* 非空格字符为有效字符时 */ while (ai!=0) if (ai = =& ai+1!=& ai+1!
9、=0)count +; /*一个空格和一个非空格字符连续存在时 */i+;printf (“%s: %d Wordsn”,a,count);运行结果:|_| |_| I |_| am |_| OK|_| |_| I |_| am |_| OK: 3 Words7【解】 编程点拨:找鞍点的操作可以通过嵌套的for循环来实现。外层for循环用来控制二维数组的行数。在外层循环体中需要处理三件事情:(1)找每行中最大值所在的列下标;(2)判断该元素在本列上是否为最小;(3)判断是否找到了鞍点,若找到,输出后退出循环。程序如下:# include # define N 3# define M 4main
10、 ( ) int aNM=0, i=0, j=0, k=0, flag=0; printf (“Input %d data:”, N*M); for (i=0; iN; i+) /* 输入、输出二维数组 */ for (j=0; jM; j+) scanf (“%d”,&aij); printf (“%4d”, aij); printf (“n”); for (i=0; iN; i+) k=0; for (j=0; jM; j+) if (aikaij) k=j;flag=1; /* 不是鞍点时用0做标记 */for (j=0; jajk) flag=0;if (flag = =1) /* 若
11、是鞍点,则输出后提前退出循环 */ printf (“i=%d, k=%d, saddle point: %dn”,i,k,aik);break;if (i = =N) printf (“Not exist saddle point.n”); /* 如果正常退出循环,说明无鞍点 */第1次运行结果:Input 12 data: 1 2 3 4 5 6 7 8 9 10 11 121 2 3 45 6 7 89 10 11 12i=0,k=3,saddle point: 4第2次运行结果:Input 12 data: 1 2 30 4 5 6 7 8 9 10 11 121 2 30 45 6
12、7 89 10 11 12Not exist saddle point.8#include #define M 5#define N 3void main() int sum; int max,i,j,sMN; /* 用数组s存学生的每门课程的成绩 */ double avgM=0,meanN=0; /*avg每个学生的平均分,mean每门课程的平均分*/ /* 获取每个学生的每门课程的成绩,并计算学生平均成绩 */ for(i=0;iM;i+) printf(No.%d ,i+1); for(sum=0,j=0;jN;j+) scanf(%d,&sij); sum+=sij; avgi=1.
13、0*sum/N; max=s00; /* 计算每门课程的平均分 */ for(j=0;jN;j+) for(i=0;iM;i+) meanj+=sij; meanj=meanj/M; for (i=0;iM;i+) for (j=0;jN;j+) if (maxsij) max=sij; /* 输出考试情况 */ printf(学生 ); for(i=0;iN;i+) printf(课程%d ,i+1); printf(平均分n); for(i=0;iM;i+) printf(No.%d ,i+1); for(j=0;jN;j+) printf(%5d ,sij); printf(%6.1fn
14、,avgi); for (i=0;iN;i+) printf(平均: %5.1fn,meani); printf(最高分为: %dn,max);9#include #include void main() char str80; char c; printf(请输入字符串:n); gets(str); printf(请输入要删除的开始字符: ); scanf(%c,&c); int i,j=0; for(i=0;stri!=0;i+) if(stri=c) stri=0; break; printf(%sn,str);10【分析】字符串存入字符数组中,要逆序存放,就要将下标为0的字符串与下标最
15、大的字符交换,下标为1的字符与下标次最大的字符交换.,最大下标应为字符串长度-1.#include #include void main()char str20,t;int i,j;gets(str);j=strlen(str)-1;for(i=0;i=A & stri=a & stri=0 & stri=9) a2+; else a3+; for(i=0;i4;i+)printf(%s: %dn,namei,ai);运行结果:输入一个字符串:ahjYTBJ%655#21Upper:4;Lower:3;Digit:5;Other:4;12【分析】本题有两个关键:一是要找到插入的位置,二是要将插
16、入的位置及以后的元素向后平移一个元素,最后才能在插入的位置插入概述,程序如下。void main() int a11=3,5,8,11,15,19,23,26,33,i,j,x; /*定义数组预留一个插入位置*/ printf(输入一个数:); scanf(%d,&x); for(i=0;ix)break; for(j=9;j=i;j-)aj+1=aj; ai=x; for(i=0;i11,i+) printf(%3d,ai); printf(n);运行结果:输入一个数:18 3 5 8 11 15 16 18 19 23 26 3313【分析】两个矩阵的乘积必须满足条件:第一个矩阵的列数要等
17、于第二个矩阵的行数,乘积矩阵元计算公式为 ,程序如下。#include #define m 3;#define n 4;#define p 5;void main()int amn=1,2,3,4,5,6,7,8,9,10,11,12;int bnp=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20;int cmp,i,j,k;printf(C=n);for(i=0;im;i+) for(j=0;jp;j+) cij=0; for(k=0;kn;k+) cij+=aik*bkj; printf(%-7d,cij); printf(n);运行结
18、果:C=110 120 130 140 150 246 272 298 324 350382 424 466 508 55014#includevoid main() char str120,str220; int i=0; printf(输入第二个字符串:n); gets(str2); while(str1i=str2i)!=0) i+; printf(第一个字符串是:n); puts(str1);运行结果:输入第二个字符串:ABCDEFG第一个字符串是:ABCDEFG15源程序:/*计算字符串的有效长度*/#include int main(void) int i=0,len; char str80=Happy; /用字符串常量个初始化字符数组 /*计算字符串的有效长度*/ for(i=0;stri!=0;i+) /循环条件:stri!=0 ; / for的循环体语句为空 len=i; printf(len=%dn,len); for(i=0;stri!=0;i+) putchar(stri); return 0;运行结果: Len=5 Happy
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1