课后作业答案第6章指针_第1页
课后作业答案第6章指针_第2页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、PAGE 1PAGE 5第6章 指针和字符串班级 姓名 学号 1、如果i是int型变量,p和q是指向i的指针,下列哪个赋值是合法的?(1) p = i; (2) p = &q;(3) p = *q;(4) *p + &i;(5) *p = q;(6) &p = q;(7) p = q; (8) *p = *q;(7)(8)合法2、下列函数有错误,请改正。void avg_sum( float a, int n, float *avg, float *sum )sum = 0;for( int i=0; in; +i )sum += ai;avg = sum / n;void avg_sum(

2、float a, int n, float *avg, float *sum )*sum = 0;for( int i=0; in; +i )*sum += ai;*avg = *sum / n;说明:本题从代码内容看,显然是要在函数内同时计算数组的平均值和总和,因此形参avg和sum都是输出参数,应该是指针类型。需要修改的是函数体内对指针参数的使用。更简单的,将2个输出参数改为引用参数。void avg_sum( float a, int n, float &avg, float &sum )sum = 0;for( int i=0; in; +i )sum += ai;avg = sum

3、/ n;这里题目说明了引用类型参数的优点。3、假设有如下声明:int a = 5, 15, 34, 54, 14, 2, 52, 72;int *p = &a1;int *q = &a5;(1)*(p+3)的值是多少?(2)*(q-3)的值是多少?(3)p-q的值是多少?(4)pq是否为真?(5)*p*q是否为真?(1)14 (2)34 (3)-4 (4)true (5)flase4、写出下列语句执行后,数组a的内容。int a = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10;int n = sizeof(a) / sizeof(a0);int *p = &a0;int *q

4、= &an-1;while( p =s; p- )-*p;puts(s);return 0;s中每个字母减1。Grinch7、假设str是字符数组,下列语句哪条与其它语句不等价?(1)*str = 0(2)str0 = 0;(3)strcpy(str, “”)(4)strcat(str, “”)(4)不同8、执行下列语句后,字符串str的值是什么?strcpy( str, tire-bouchon );strcpy( &str4, d-or-wi );strcat( str, red? );tired-or-wired?9、下面函数创建字符串的相同副本,指出这个函数中的错误并修改。char *

5、strdup( const char *s )char *q;strcpy( q, s );return q;指针q没有对应的内存空间。修改:给q动态分配内存空间。char *strdup( const char *s )char *q = new char strlen(s)+1 ;strcpy( q, s );return q;10、以下代码错在哪里?char string_var = Hello;strcat( string_var, and Good_bye. );cout string_var endl;string_var只有6个字节的空间,不够存放“Hello and Good_

6、bye.”这么多内容。改正:char string_var50 = Hello;11、编写一个自己的strcat()函数,函数原型为:char *my_strcat( char *dest, const char *src );char *my_strcat(char *dest, const char *src)if( dest=NULL | src=NULL )return NULL;if( dest = src )return dest;/go to end of destination stringchar *p = dest;while( *p ) +p;while( *p+ = *

7、src+ );return dest;注意写法上的差异:char *p = dest;while( *p+ ); -p;如果指针的自增运算在循环判断表达式中,则p会向后多移动一个位置,出了循环必须回退一个位置。常见错误:不少同学用 int n = sizeof(dest)/sizeof(dest0);的代码试图获取字符串的长度,是不对的。这种写法获得的是数组的分配空间长度,而不是实际存放的字符个数的长度,获取字符串的实际长度应使用strlen()函数,例如:char *my_strcat(char *dest, const char *src)if( dest=NULL | src=NULL

8、)return NULL;if( dest = src )return dest;int n = strlen(dest);int m = strlen(src);for(int i=0; i=m; +i)destn+i = srci;return dest;12、编写一个自己的strcmp()函数,函数原型为:int my_strcmp( const char *s1, const char *s2 );int my_strcmp(const char *s1, const char *s2)if( s1=0 | s2=0 )return 0;if( s1 = s2 )return 0;/版

9、本1:循环体内执行不等判断,循环判断表达式用或条件for( ; *s1 | *s2; +s1,+s2 )if( *s1 != *s2 )return *s1 - *s2;return 0;int my_strcmp(const char *s1, const char *s2)if( s1=0 | s2=0 )return 0;if( s1 = s2 )return 0;/版本2:执行相等判断,循环判断表达式用与条件for( ; *s1 & *s2 & *s1 = *s2; +s1,+s2 );return *s1 - *s2;也可以使用while循环:int my_strcmp(const

10、char *s1, const char *s2)if( s1=0 | s2=0 )return 0;if( s1 = s2 )return 0;while( (*s1 | *s2) & *s1+ = *s2+ );return *-s1 - *-s2;这样写虽然紧凑,但可读性不好。因为指针的自增运算在循环判断表达式中,所以指针向后多移动了一个位置,计算字符的ASCII码值之差时必须先回退一个位置,所以是*-s1 - *-s2。这样的坏处是(*s1 | *s2)必须用或条件,如果用与条件,由于短路特性,*s1和*s2之中任意一个为0就退出循环,而这时s1和s2都没有自增,*-s1 - *-s2

11、就错误地计算了前一个字符的差。而采用或条件,只有*s1和*s2都为0时才会退出循环,s1和s2没有自增,*-s1 - *-s2仍然计算的是前一个字符的差,但此时已经可以断定2个字符串一定相等,必然返回0,即使计算的是前一个字符的差,计算结果仍是0。因此,这个题建议采用for循环的写法,代码简单,干净,清楚。附:测试主函数int main()char s = string;char s1 = stringA;char s2 = stringa;cout my_strcmp(s, s) endl;cout my_strcmp(s, s1) endl;cout my_strcmp(s1, s2) endl;如果循环体内执行不等判断,但循环判断表达式使用了与条件,string和stringA就会被判断为相等,不正确。注意:1)内容判断不要漏掉取内容运算符。2)为避免出现!运算符,非0判断干脆什么也不写,为0判断明确写=0。空指针在C+中建议直接写0,而在C中建议写NULL(但国内有些人坚持在C+中也

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论