| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2683 人关注过本帖
标题:All about C++
取消只看楼主 加入收藏
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
结帖率:100%
收藏
 问题点数:0 回复次数:14 
All about C++

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

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

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

搜索更多相关主题的帖子: All 字符 返回值 
2004-09-30 06:17
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 

如果没人写答案,那我明天公布答案。


自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2004-10-02 00:45
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 

//答案如下:

// 题一:

#include <iostream> #include <string> #include <cstdlib> using namespace std;

int char_count(string s, char letter) { int count = 0; int length = s.length(); int i = 0; while(i<length) { char temp = s.at(i); if(temp == letter) count++; i++; } return count; }

int main() { string str; char c; cout<<"Enter a string."; getline(cin, str); cout<<"Enter a character."; cin.get(c); cout<<"This characater appears "<<char_count(str, c)<<" times"<<endl; system("pause"); return 0; }

// 注意,这个程序如果通过VC编译会有问题,这是VC的BUG。建议大家用DEV 编译。

// Dev 下载网址:

http://prdownloads.sourceforge.net/dev-cpp/devcpp4990setup.exe


自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2004-10-02 06:06
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 

// 题2:

#include <iostream> #include <cstdio> //#include <string> #include <cstdlib> using namespace std;

int str_count(char *substr, char *str) { char * substring, * string; int count = 0; while(*str) { for(string = str++, substring = substr; *string == *substring; string++, substring++) { if(!*(substring+1)) { ++count; } } } return count; }

int main() { char str[100], substr[20]; cout<<"Enter a string:"; cin.getline(str, 100); cout<<"Enter a substring:"; cin.getline(substr, 20); cout<<"This substring appears "<<str_count(substr, str)<<" times"<<endl; system("pause"); return 0; }


自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2004-10-02 06:30
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 

// 用 string 取代 C string, 同样希望用 Dev , 用VC编译在输入上会出问题, 这是VC的一个 Bug

#include <iostream> #include <string> #include <cstdlib> using namespace std;

int str_count(string substr, string str) { int substr_length = substr.length(); int count = 0; string temp = str; int loc = 0; if(substr_length == 0 || str.length() == 0) return 0; else { do { loc = temp.find(substr); if(loc != string::npos) { count++; temp = temp.assign(temp, loc+substr_length, temp.length()); } else break; }while(1); } return count; }

int main() { string str, substr; cout<<"Enter a string:"; getline(cin, str); cout<<"Enter a substring:"; getline(cin, substr); cout<<"This substring appears "<<str_count(substr, str)<<" times"<<endl; system("pause"); return 0; }


自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2004-10-02 07:53
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 

自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2004-10-12 01:28
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 
记得以前写过最小公倍数和最大公约数的程序,其中最大公约数曾经贴在这里过,现在找不着了,如果朋友们有兴趣,可以写写。

自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2004-11-08 06:46
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 

以下是这两个函数

#include <iostream> #include <cstdlib> using namespace std;

long zui_da_gong_yue_shu(long a, long b) { for( ;(a = a%b) && (b = b%a); ) ; return (a|b); } long zui_xiao_gong_bei_shu(long a, long b) { return a*b/zui_da_gong_yue_shu(a, b); }

int main() { int a = 15; // 作为测试取了两个值,你也可以取别的数值 int b = 25; int result = zui_da_gong_yue_shu(a, b); // 只是传值运算, a, b 本身并未得到改变 cout<<result<<endl; // 输出运算结果来测试正确与否 cout<<a<<" "<<b<<endl; // 输出 a, b 确定其未得到改变 //////////////////////////////////////// 以下同样,只是测试最小公倍数的运行 result = zui_xiao_gong_bei_shu(a, b); cout<<result<<endl; cout<<a<<" "<<b<<endl; system("pause"); return 0; }


自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2004-11-08 18:40
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 
BlueDreame, 我想你用的一定是VC6.0。这应该是VC6.0 的一个Bug , 据说VC7.0 已经作了改进。不过我没有VC7.0 无法替你验证。不过从语言角度来讲,敲两次回车实现输入,这是不对的。如果你改用Dev 来测试你的程序,你会发现敲一次回车就可以了。

自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2005-01-07 22:28
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 
Namespaces  (Part 1)



下面来看一个及其简单的例程



#include &lt;iostream&gt;

#include &lt;cstdlib&gt; // when you use Dev, you can find it under

                  
// C:\Dev-Cpp\include\c++\3.3.1

                  
// you can see it using WordPad

using namespace std;



int main()

{

    cout&lt;&lt;"Hello World!\n";   

    system("pause");        // to see the output in the screen

    return 0;

}



这样的头文件形式,我们已经看到很多了,有些朋友是在不知觉的应用这样的书写形式。

其实上面的书写形式是与下面的书写形式等价的:

#include &lt;iostream&gt;

#include &lt;cstdlib&gt; // when you use Dev, you can find it under

                  
// C:\Dev-Cpp\include\c++\3.3.1

                  
// you can see it using WordPad

//using namespace std;



int main()

{

    std::cout&lt;&lt;"Hello World!\n";   

    std::system("pause");        // to see the output in the screen

    return 0;

}



大家可以发现 using namespace std; 被隐去了,取而代之是在程序中相关的语句前添加std::

这里我们就用到了 namespace ,中文或许可以翻译为 名字空间。 初次接触C++ 的朋友一定会对namespace
这个概念觉得比较别扭,理解起来不爽。 那么我们先从另外一个概念谈起,这对于学习C, C++的朋友都不会陌生。这个概念便是变量的作用域问题。

当你申明或定义一个变量后,这个变量便有其有效的作用域,比如当你申明一个全局变量,那么这个全局变量将在其申明的文件中有效。如果你申明一个变量于某个
函数中,那么其作用空间只能在那个函数快中。如果你在那个函数中,再申明一个相同名字的变量,编译器会给你一个错误报告信息,我想大家对这一点都应该非常
清楚。比如来看下面这段代码:

#include &lt;iostream&gt;

#include &lt;cstdlib&gt;



int main()

{

    using namespace std;

    int a = 3;

    char a = 't';    // error, we can not have 2 variable with the same name.

    cout&lt;&lt;a&lt;&lt;endl;   // which a will be showed???

    system("pause");        

    return 0;

}



大家看到,上面这段代码是错误的,错误之处显而易见的,程序试图定义两个相同名字的变量,这显然不合理。

但是当两个变量处于不同的作用域时,其可以采用相同的名字,哪怕类型相同也可以,下面来看一段例程。

#include &lt;iostream&gt;

#include &lt;cstdlib&gt;



int main()

{

    using namespace std;

    int a = 8;  // 他的作用区域为:从这里到 return 0: 执行完毕

    {

        int a = 3;    // 仅仅在这个花括号内有效

        cout&lt;&lt;a&lt;&lt;endl;  // 所以输出 3 ,没有任何名字冲突

    }

    {

        int a = 5;

        cout&lt;&lt;a&lt;&lt;endl;

    }

    {

        char a = 't';

        cout&lt;&lt;a&lt;&lt;endl;

    }            

    cout&lt;&lt;a&lt;&lt;endl;

    system("pause");        

    return 0;

}

那么现在问题来了,如果上面那个程序中我一定要在花括号内调用第一个integer a, 该怎么做呢?

我们可以通过作用域操作符来实现在局部函数中调用全局变量。下面是相关代码:

#include &lt;iostream&gt;

#include &lt;cstdlib&gt;



int a = 8;

int main()

{

    using namespace std;

   

    int a = 3;

    cout&lt;&lt;a&lt;&lt;endl;

    cout&lt;&lt;::a&lt;&lt;endl;

   

    system("pause");        

    return 0;

}



通过上面的简单介绍,我们可以看到,变量名可能在程序中有冲突。对于上面这么短小的程序大家一看便知,但是如果程序大了呢?
我们知道,我们写程序往往不会只有一个 cpp
程序,我们往往会有一些头文件。如果头文件源于不同的供应商,而恰恰在其库函数中对某个函数取了相同的函数名,那么当你在包含了这两个头文件时,如果你调
用这个具有相同函数名的函数时,编译器将无法明确到底调用哪个函数,这样就产生了名字冲突。为解决名字冲突问题,C++ 采用了namespace
这个技术术语,使得名字冲突得以避免。



下面来看一下 namespace 的具体使用。

// Part2 to be continued





 

自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2005-01-08 17:04
快速回复:All about C++
数据加载中...
 
   



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

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