标题:偷C++的题
只看楼主
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
结帖率:92.86%
 问题点数:0 回复次数:26 
偷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 
2004-10-02 00:35
空前
Rank: 1
等 级:新手上路
帖 子:1146
专家分:0
注 册:2004-5-11
得分:0 

第一题:

#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; }


2004-10-02 00:41
空前
Rank: 1
等 级:新手上路
帖 子:1146
专家分:0
注 册:2004-5-11
得分:0 

第二题:

#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; }


2004-10-02 00:50
bcomer
Rank: 1
等 级:新手上路
帖 子:113
专家分:0
注 册:2004-9-13
得分:0 

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

#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; }

2004-10-02 08:35
bcomer
Rank: 1
等 级:新手上路
帖 子:113
专家分:0
注 册:2004-9-13
得分:0 

补充:谁帮我改一下,好久没写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(); }

2004-10-02 08:38
bcomer
Rank: 1
等 级:新手上路
帖 子:113
专家分:0
注 册:2004-9-13
得分:0 

没问题了

谢谢

找到了

2004-10-02 08:49
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
得分:0 

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

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混合使用的情况。


九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。     -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。   -毛泽东
2004-10-02 09:09
bcomer
Rank: 1
等 级:新手上路
帖 子:113
专家分:0
注 册:2004-9-13
得分:0 
以下是引用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语句的参数条件中,尽量少的出现函数?

可以这样理解?

2004-10-02 09:34
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
得分:0 

更正一下,是调用 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编辑过]


九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。     -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。   -毛泽东
2004-10-02 09:51
bcomer
Rank: 1
等 级:新手上路
帖 子:113
专家分:0
注 册:2004-9-13
得分:0 

对第二题的改动:

#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(); }

2004-10-02 11:18



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-5946-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.308366 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved