刚才到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编辑过]
----------------解决方案--------------------------------------------------------
第一题:
#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混合使用的情况。
----------------解决方案--------------------------------------------------------
程序的效率永远是第一位!
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(); }
----------------解决方案--------------------------------------------------------