编辑: 旋风 2019-07-16

k ) s[i--][j] = a++;

i++;

j++;

} for( i = 0;

i <

N;

i++ ) { for( j = 0;

j <

N;

j++ ) cout next;

} tail->

next = head->

next;

printf( 第%4d个出局的人是:%4d号\n , i, head->

index);

free(head);

head = tail->

next;

} i = head->

index;

free(head);

return i;

} int main() { int n, m;

scanf( %d%d , &

n, &

m);

printf( 最后胜利的是%d号!\n , Josephu(n, m));

system( pause );

return 0;

} 已知strcpy函数的原型是: char * strcpy(char * strDest,const char * strSrc);

1.不调用库函数,实现strcpy函数. 2.解释为什么要返回char *. 解说: 1.strcpy的实现代码 char * strcpy(char * strDest,const char * strSrc) { if ((strDest==NULL)||(strSrc==NULL)) file://[/1] throw Invalid argument(s) ;

//[2] char * strDestCopy=strDest;

file://[/3] while ((*strDest++=*strSrc++)!='

\0'

);

file://[/4] return strDestCopy;

} 错误的做法: [1] (A)不检查指针的有效性,说明答题者不注重代码的健壮性. (B)检查指针的有效性时使用((!strDest)||(!strSrc))或(!(strDest&

&

strSrc)),说明答 题者对C语言中类型的隐式转换没有深刻认识.在本例中char *转换为bool即是类型隐式转 换,这种功能虽然灵活,但更多的是导致出错概率增大和维护成本升高.所以C++专门增加 了bool、true、false三个关键字以提供更安全的条件表达式. (C)检查指针的有效性时使用((strDest==0)||(strSrc==0)),说明答题者不知道使用常量 的好处.直接使用字面常量(如本例中的0)会减少程序的可维护性.0虽然简单,但程序 中可能出现很多处对指针的检查,万一出现笔误,编译器不能发现,生成的程序内含逻辑 错误,很难排除.而使用NULL代替0,如果出现拼写错误,编译器就会检查出来. [2] (A)return new string( Invalid argument(s) );

,说明答题者根本不知道返回值的用途 ,并且他对内存泄漏也没有警惕心.从函数中返回函数体内分配的内存是十分危险的做法 ,他把释放内存的义务抛给不知情的调用者,绝大多数情况下,调用者不会释放内存,这 导致内存泄漏. (B)return 0;

,说明答题者没有掌握异常机制.调用者有可能忘记检查返回值,调用者还 可能无法检查返回值(见后面的链式表达式).妄想让返回值肩负返回正确值和异常值的 双重功能,其结果往往是两种功能都失效.应该以抛出异常来代替返回值,这样可以减轻 调用者的负担、使错误不会被忽略、增强程序的可维护性. [3] (A)忘记保存原始的strDest值,说明答题者逻辑思维不严密. [4] (A)循环写成while (*strDest++=*strSrc++);

,同[1](B). (B)循环写成while (*strSrc!='

\0'

) *strDest++=*strSrc++;

,说明答题者对边界条件的 检查不力.循环体结束后,strDest字符串的末尾没有正确地加上'

\0'

. ........

下载(注:源文件不在本站服务器,都将跳转到源网站下载)
备用下载
发帖评论
相关话题
发布一个新话题