当前位置: 代码迷 >> C语言 >> 偷C++的题
  详细解决方案

偷C++的题

热度:309   发布时间:2004-10-02 00:35:00.0
偷C++的题

刚才到C++版,看了看,KAI版主出了两道题,C++没人做(不知道是不会还是不愿),

转来大家试试:

一,函数篇 (比较简单,仅提两个问题而已)

问题一: 编写一个程序判定一个字符在一个字符串中出现的次数,如果该字符不出现则返回值 0。

问题二: 编写一个程序判定一个子串在一个字符串中出现的次数,如果该子串不出现则返回值0。

我加上两条件:

1。第一个问题,写成子函数形式:int fun(char *string,char c)

2。第二个问题,写成子函数形式且要能处理汉字:int fun(char *string,char * str)

关于第二个问题的测试数据(如有新的,我会加上,大家也可以跟贴加上):

补充一点汉字编码的知识

GB2313-80标准

1。汉字有两个字节组成:

2。第一个字节等于该汉字的区码加0xa0;第二个字节等于该汉字的位码加0xa0;

1。 char *string="中华人民共和国"; char *str="凸"; 2。 char *string="安句是什么意思?";

char *str='d'; or *str="匆";

三天后我贴上我的代码。

[此贴子已经被作者于2004-10-08 20:10:28编辑过]

搜索更多相关的解决方案: 字符  fun  int  char  

----------------解决方案--------------------------------------------------------

第一题:

#include<string.h>

int fun(char *string,char c) {int i,n=0; for(i=0;i<strlen(string);i++) if(*(string+i)==c) n++; return n; }


----------------解决方案--------------------------------------------------------

第二题:

#include<string.h>

int fun(char *string,char *str) {int i,j,k,n=0; for(i=0;i<strlen(string);i++) {k=i; for(j=0;j<strlen(str);j++) if(*(string+k)==*(str+j)) {k++;continue;} else break; if(j>=strlen(str)) n++; } return n; }


----------------解决方案--------------------------------------------------------

不知道第一题的函数这样写可以吗?

#include <stdio.h> int fun(char *string,char c) { int i,n=0; for(i=0;i<strlen(string);i++,string++) { if(*string==c) n++; else ; } return n; }


----------------解决方案--------------------------------------------------------

补充:谁帮我改一下,好久没写C了MAIN函数运行的效果很差!

那里写错了?

#include <stdio.h> #include <string.h> int fun(char *string,char c) { int i,n=0; for(i=0;i<strlen(string);i++,string++) { if(*string==c) n++; else ; } return n; } main() { char c; char *string; printf("input string:"); gets(string); printf("input c:"); scanf("%c ",&c); printf("%d ",fun(*string,c)); getch(); }


----------------解决方案--------------------------------------------------------

没问题了

谢谢

找到了


----------------解决方案--------------------------------------------------------

程序的效率永远是第一位!

for(i=0;i<strlen(string);i++)在for()中使用strlen作为条件判定是错误的用法,这意味着你的程序将调用strlen(string)模块 i 次。

下面的程序能充分说明这一点:

#include<string.h> #include <stdio.h> #include <dos.h> #include <time.h> /*int fun(char *string,char c) { int i,n=0; for(i=0;i<strlen(string);i++) if(*(string+i)==c) n++; return n; } */ /*int fun(char *string,char c) { int n=0; while(*string)if(*string++==c)n++; return n; } */

/*更换不同fun,看看效率*/ int fun(char *string,char c) { int i,n=0,j; j= strlen(string); for(i=0;i<j;i++) if(*(string+i)==c) n++; return n; }

void main() { char *str="werweqhfjklsdfhdskljghsdlf;ghjeiurtyhiusfdkjghdskghfdgdsg",c='h'; int i,j; time_t first, second;

first = time(NULL);

for(j=0;j<10;j++)for(i=0;i<10000;i++)fun(str,c);

second = time(NULL);

printf("The difference is: %f seconds\n",difftime(second,first)); }

还有,空前的第二个程序不能正确处理汉字,并且还应考虑汉字与ASCII混合使用的情况。


----------------解决方案--------------------------------------------------------
以下是引用knocker在2004-10-02 09:09:02的发言:

程序的效率永远是第一位!

for(i=0;i<strlen(string);i++)在for()中使用strlen作为条件判定是错误的用法,这意味着你的程序将调用strlen(string)模块 i 次。

下面的程序能充分说明这一点:

#include<string.h> #include <stdio.h> #include <dos.h> #include <time.h> /*int fun(char *string,char c) { int i,n=0; for(i=0;i<strlen(string);i++) if(*(string+i)==c) n++; return n; } */ /*int fun(char *string,char c) { int n=0; while(*string)if(*string++==c)n++; return n; } */

/*更换不同fun,看看效率*/ int fun(char *string,char c) { int i,n=0,j; j= strlen(string); for(i=0;i<j;i++) if(*(string+i)==c) n++; return n; }

void main() { char *str="werweqhfjklsdfhdskljghsdlf;ghjeiurtyhiusfdkjghdskghfdgdsg",c='h'; int i,j; time_t first, second;

first = time(NULL);

for(j=0;j<10;j++)for(i=0;i<10000;i++)fun(str,c);

second = time(NULL);

printf("The difference is: %f seconds\n",difftime(second,first)); }

还有,空前的第二个程序不能正确处理汉字,并且还应考虑汉字与ASCII混合使用的情况。

你的意思是在多数情况下FOR语句的参数条件中,尽量少的出现函数?

可以这样理解?


----------------解决方案--------------------------------------------------------

更正一下,是调用 strlen(string)+1 次

for(i=0;i<strlen(string);i++)你可能以为这里的strlen(string)只调用了一次,但实际上是调用了strlen(string)+1次,对于一个小程式可能是没多大影响,但如果在大的程序中多次调用fun或者你有多个类似的for(;;)影响就大了.而可能会造成错误(当string指针在for()被移动,就会有错误的结果)。

[此贴子已经被作者于2004-10-02 09:55:53编辑过]


----------------解决方案--------------------------------------------------------

对第二题的改动:

#include<stdio.h> #include<string.h> int fun(char *string,char *str) { int i,j,k,n=0; int x=strlen(string); int y=strlen(str); for(i=0;i<x-y+1;i++) { k=i; for(j=0;j<y;j++) if(*(string+k)==*(str+j)) {k++;continue;} else break; if(j>=y) n++; } return n; } main() { char *string; char *str; time_t first, second; printf("input string:"); gets(string); printf("input str:"); gets(str); printf("%d ",fun(string,str)); getch(); }


----------------解决方案--------------------------------------------------------
  相关解决方案