C语言程序设计 (何钦铭 颜晖 著)课后习题答案 浙江科学技术出版社

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

4. 定义函数 search(int list[], int n, int x), 在长度为 n 的数组 list 中查找元素 x, 并返回 x 在 list 中的下标。 如果 x 在 list 中不存在,则返回-1. 解法 1:使用 break 语句 int search( int list[], int n, int x) { int i, index=-1; //index: x 在 list 中的下标,目前尚未找到,因此初始化为-1 for ( i=0; i<n; i++) //逐个对比 list[i]与 x, 相等则跳出循环,否则继续往下比较,直到整个数组比完 if( list[i]== x ) { index=i; break; } return index; //返回 x 在 list 中的下标 } 解法 2:使用 return 语句—当程序执行到 return 语句,将提前结束循环,并结束函数 search(),返回主函数 main() int search( int list[], int n, int x) { int i ; for ( i=0; i<n; i++) //逐个对比 list[i]与 x, 相等则跳出循环,否则继续往下查找,直到找遍整个数组 if( list[i]== x ) return i; return -1; //当 for 循环正常结束,说明找遍整个数组都找不到 x, 返回-1 }
wenku.baidu.com
void delchar( char *s, char c); void main() { char s[80], c; printf(" Input string s :\n"); gets( s); printf(" Input char c :\n"); c=getchar(); delchar(s,c); printf(" After delete:\n" ); puts( s); } #include<string.h> void delchar( char s[], char c) { int i; for( i=0; s[i]!=’\0’; i++){ if( s[i]==c) strcpy( s+i, s+i+1); } } 8. /*分别用字符数组和字符指针实现自定义函数 strcpy(s,t,m). 将字符串 t 中从第 m(m>=0)个字符开始的子串复制 给字符串 s。*/ 实例:s=”welcome” t=”friend”, m=3, 调用自定义函数 strcpy(s,t,m)后,s=”end”, t 保持不变,仍为”friend” 注意:不能使用 10.2 节中介绍的 C 语言提供的字符串处理函数,而是从底层做起,自己编写这个函数。 该函数不要求返回任何值,因此函数类型是 void; 形参有三个,分别是两个字符串 s 和 t, 一个整型参数 m. 解法 1(字符数组) void strcpy( char s[], char t[], int m ) { int i,j; //i:s 的下标;j:t 的下标 for( i=0,j=m; t[ j]!=’\0’; i++, j++) s[i] = t[j]; } 解法 2(字符指针) void strcpy( char *s, char *t, int m ) { char *p= t+m; //p 指向 t 的第 m 个字符 for( ; *p!=’\0’; s++, p++) *s = *p; }
(2) udent 注:s+2=&s[2], 当作为 printf()中对应“%s”的输出参数时,表示从 s[2]开始输出,直到字符串结束) (3) HappyNewYear 注: 1. for(s=pa, n=0; *s!='\0'; ++s, ++n); //求字符串 pa 的有效长度 n, 相当于: n=0; for( s=pa; *s!=’\0’; ++s) ++n; // n=12 2. for(s=pa, i=0; i<n; putchar(*s++), ++i); // 逐个输出指针 s 所指向字符串 pa 的各字符,相当于 s=pa; for( i=0; i<n; i++) { putchar( *s ); s++; //指针后移一位 } (4) our 注: char *st[]={"one", "two", "three","four"}; 定义了长度为 4 的字符指针数组,如下: s[][0] st[0] st[1] st[2] st[3] st[][1] st[][2] st[][3] st[][4] s[][5]
5. 定义函数 void sort(int a[], int n), 用选择法对 a 排序(升序)。 自定义主函数 main(). void sort( int a[], int n) //a 数组名,n 数组长度 { int i, j, index, t; for ( i=0; i<n-1; i++){ index=i; for( j=i+1; j<n; j++) if( a[index] > a[ j] ) index=j; t=a[i]; a[i]=a[index]; a[index]=t; }
o t t f
n w h o
e o r u
\0 \0 e r
e \0
\0
st[3]+1
表达式:*(st+3)+1= st[3]+1, 这是一个地址值,即指向 st[3]字符串”four”的第 1 号字符’o’ 由于输出格式是字符串‘%s’, 所以输出的字符串是从 st[3]+1 这个地址开始,到遇见’\0’为止 (5)<略,不做要求> 3. /*填空题*/ (1) for (i=0; s[i]!=’\0’; i++) (2) void f( char *s 或 char s[] ) { int i=0; while(s[i]) i++; //令 i 指向字符串的最后一个有效字符, 即 while( s[i]!=’\0’) i++; for( ; i>=0; i- -) printf("%c", s[i]); //逆序输出 }
#include<stdio.h> void main() { int a[10], i; printf(“Input 10 integers:”); for( i=0; i<10; i++) scanf(“%d”, &a[i]); sort(a,10); printf(“After sorted:”); for(i=0; i<10; i++) printf(“%d “, a[i]); putchar(‘\n’); } 6. 编写程序:输入 5 个字符,输出其中最长的字符串 void sort( int a[], int n) //a 数组名,n 数组长度 #include<stdio.h> #include<string.h> void main() { int i, len, max_len; char s[80], max_s[80]; printf(“Input 5 strings:”); gets( max_s); //输入第 1 个字符串,暂作最长字符串 max_len= strlen(max_s); for( i=1; i<5; i++) { //输入剩余的 4 个字符串,并与当前的最长字符串做比较 gets( s ); len= strlen( s); if ( len > max_len ){ strcpy( max_s, s); //注意:不能写成 max_s =s; max_len= len; } } printf(“The max_s is:”); puts( max_s ); } 7. /*编写函数 delchar(s,c). 删除字符串 s 中出现的所有 c 字符。请同时编写主函数*/ 实例:s=”welcome!” c=’e’ s 初始值 w w i 删 1 次后 删 2 次后 w w e e l l l l c c c c o o o o m i m ! i \0 m m e e e ! ! ! \0 \0 \0
习题参考答案 习题一
1. /*在 C 语言中,下列标识符中哪些是合法的,哪些不合法?”*/ 合法:total, _debug, Counter1, begin_ 不合法:Large&Tall
2. /*写出流程图,求 1~100 中能被 6 整除的所有整数之和*/
3. /*写出源程序,求 1~100 中能被 6 整除的所有整数之和” 。*/ #include<stdio.h> void main() { int sum=0, i; for(i=1; i<=100; i++) if( i%6==0) sum =sum+i; printf(“sum=%d”, sum); }
当 s[i]==c, 它后面的字符从’l’开始到’\0’为止,各前进一位
i 继续前进,直到遇见下一个 c, 将后面的字符各前进 1 位 i 继续前进,直到遇见结束字符’\0’ ,结束整个循环
分析: 1.循环条件是 s[i]!=’\0’ 2.如何将 i 后面若干字符各前进一位?--利用字符串复制函数和 字符子串 s 代表完整的字符串,而 s+i 代表从 s[i]开始、到’\0’结束的子串。 将子串 s+i+1 复制给子串 s+i, 即 实现 i 后各字符前进一位 strcpy( s+i, s+i+1) #include<stdio.h>
while ( *p!=’\0’ ){ *s++= *p++; }
while ( *p ){ *s++= *p++; }
9. /*分别用字符数组和字符指针实现自定义函数 strcat(s,t). 将字符串 t 连接到 s 之后,要求返回字符串 s 的首地址*/ 实例: s=”welcome” t=”friend”, m=3, 调用自定义函数 strcpy(s,t,m)后, s=”welcomefriend”, t 保持不变, 仍为”friend” 该函数要求返回 s 的首地址,即首字符的地址,因此函数返回值的类型是字符指针(详见 10.4 节) ,因此函数类型是 char *; 形参有 2 个,分别是两个字符串 s 和 t.
4. /*画流程图,判别整数 n 是否是素数*/
习题参考答案 习题十
1. 选择题 (1) A (2) C( 由于 p 指向 x, 等式 p≡&x, *p≡x 成立. 故&*p≡&x≡p) (3) B(int c[]={1, 7, 12}; c[0]=1, c[1]=7, c[2]=12. 而 k=c, 即 k 指向数组 c 的首元素 c[0]。 printf(“…”, *++k); 输 出参数*(++k)的值是*(k+1), 即 c[1] ) (4) D (对字符数组只能在定义的同时赋初值,但不能在定义之后再用‘=’赋值 ) (5) D (*p[3]是由 3 个整型指针组成的数组,p 是数组名,代表该数组的基地址,是地址常量,不能对 p 赋值,故 A,C 错。*p 代表 p[0]这个指针,a[0]是普通整型变量,两者不应互相赋值,故 B 错。p[0]=&a[0]或 p[0]=a,都是正确 的,作用是令 p[0]这个指针指向数组 a 的首元素 a[0]) (6) D ( 指 针 数 组 元 素 p[3] 是 一 个 指 针 , 指 向 a[3*3]=a[9], 即 *p[3]==a[9] 而 二 维 数 组 元 素 p[3][2]= *(p[3]+2)=*(&a[9]+2)=*(&a[11])=a[11]) 2. /*写输出结果*/ (1) 3,2,5 # 3,3,4 # 注: z 是全局变量,它 在 p()中有效,但在 main()中另有与它同名的局部变量,所以在 main()中无效。 main()和 p()中分 别定义了各自的局部变量 x,y。在 void p( int *x, int y)中 x 是指针形式,表示按地址传递,则 p 中的 *x 就是 main()中的 x;另一形参 y 是普通变量形式,p 对 y 的修改不影响 main()中的 y 的值。 变量 x y z 在函数 p()中的取值 23 (++*x) 32(y--) 45 (z=*x+y=3+2) 在 main()中的取值 3(受 p()影响) 3 (不受 p()影响) 4(不受 p()影响)
相关文档
最新文档