回首页 回首页 ◎ 设为首页  
◎ 收藏本站  
◎ 给我留言  
  
  首 页  C/C++教程  C++之父的FAQ  C/C++动向  C/C++源代码  C/C++误区  Unix/Linux  下载中心  乱七八糟  蚂蚁的Blog  
  当前位置:首 页 >> C++之父的FAQ >> C++ 风格与技术 FAQ >> [转] 这个简单的程序……我如何把它搞定?
最 近 更 新
[转] 我该把const写在类..
[翻译] 我应该使用按值..
[翻译] 你如何命名变量..
[转] 何种代码布局风格..
[转] “int* p;”和“in..
[翻译] “cout”怎么念?
[转] 宏有什么不好吗?推荐
[翻译] static_cast 有..推荐
[翻译]为何C++里有些东..推荐
[翻译] i++ + i++ 的值..推荐
最 新 推 荐
[转] 宏有什么不好吗?推荐
[翻译] static_cast 有..推荐
[翻译]为何C++里有些东..推荐
[翻译] i++ + i++ 的值..推荐
[翻译] 数组有何不好之..推荐
[转] 为何delete操作不..推荐
[转] 有placement delet..推荐
[翻译] “new”和“mall..推荐
[转] C和C++风格的内存..推荐
[翻译] 为何标准容器效..推荐
热 门 排 行
[转] 我可以写“void ma..
[翻译] 什么是纯虚函数?
[转] 我该把const写在类..
[转] 这个简单的程序…..推荐
[翻译] i++ + i++ 的值..推荐
[转] 我如何从标准输入..
[转] 我怎样才能把整数..
[翻译] static_cast 有..推荐
[转] 宏有什么不好吗?推荐
[转] 我应该怎样处理内..推荐
站 内 搜 索

Web stdcpp.cn
关键词

搜索方式

搜索范围

精确匹配
广 告

[转] 这个简单的程序……我如何把它搞定?


来源:C++ Style and Technique FAQ 作者:Bjarne Stroustrup 翻译:紫云英 等级:强烈推荐
发布于2006-11-21 20:32 被读1242次 【字体:

原文地址:http://www.research.att.com/~bs/bs_faq2.html#simple-program

Q: 这个简单的程序……我如何把它搞定?

A: 常常有人问我一些简单的程序该如何写,这在学期之初时尤甚。一个典型的问题是:如何读入一些数字,做些处理(比如数学运算),然后输出……好吧好吧,这里我给出一个“通用示范程序”:
	#include<iostream>
	#include<vector>
	#include<algorithm>
	using namespace std;

	int main()
	{
		vector<double> v;

		double d;
		while(cin>>d) v.push_back(d);  // read elements
		if (!cin.eof()) {		// check if input failed
			cerr << "format error\n";
			return 1;	// error return
		}

		cout << "read " << v.size() << " elements\n";

		reverse(v.begin(),v.end());
		cout << "elements in reverse order:\n";
		for (int i = 0; i<v.size(); ++i) cout << v[i] << '\n';

		return 0; // success return
	}
 
程序很简单,是吧。这里是对它的一些“观察报告”:
  • 这是一个用标准C++写的程序,使用了标准库[译注:标准库主要是将原来的C运行支持库(Standard C Library)、iostream库、STL(Standard Template Library,标准模板库)等标准化而得的] 。标准库提供的功能都位于namespace std之中,使用标准库所需包含的头文件是不含.h扩展名的。[译注:有些编译器厂商为了兼容性也提供了含.h扩展名的头文件。]
  • 如果你在Windows下编译,你需要把编译选项设为“console application”。记住,你的源代码文件的扩展名必须为.cpp,否则编译器可能会把它当作C代码来处理。
  • 主函数main()要返回一个整数[译注:有些编译器也支持void main()的定义,但这是非标准做法]
  • 将输入读入标准库提供的vector容器可以保证你不会犯“缓冲区溢出”之类错误——对于初学者来说,硬是要求“把输入读到一个数组之中,不许犯任何‘愚蠢的错误’”似乎有点过份了——如果你真能达到这样的要求,那你也不能算完全的初学者了。如果你不相信我的这个论断,那么请看看我写的《Learning Standard C++ as a New Language》一文。 [译注:CSDN文档区有该文中译。]
  • 代码中“ !cin.eof() ”是用来测试输入流的格式的。具体而言,它测试读输入流的循环是否因遇到EOF而终止。如果不是,那说明输入格式不对(不全是数字)。还有细节地方不清楚,可以参看你使用的教材中关于“流状态”的章节。
  • Vector是知道它自己的大小的,所以不必自己清点输入了多少元素。
  • 是的,我知道我应该声明 i 为 vector<dobule>::size_type 类型,而非普通的 int 类型,这样那些极其多疑的编译器就会保持缄默了。但是,就本例来说,我觉得这样做太“孔乙己”了,而且有喧宾夺主之嫌。
  • 这个程序不含任何显式内存管理代码,也不会产生内存泄漏。Vector会自动配置内存,所以用户不必为此烦心。
  • 关于如何读入字符串,请参阅后面的我如何从标准输入中读取string条目。
  • 这个程序以EOF为输入终止的标志。如果你在UNIX上运行这个程序,可以用Ctrl-D输入EOF。但你用的Windows版本可能会含有一个bug(http://support.microsoft.com/support/kb/articles/Q156/2/58.asp?LN=EN-US&SD=gn&FR=0&qry=End of File&rnk=11&src=DHCS_MSPSS_gn_SRCH&SPR=NTW40),导致系统无法识别EOF字符。如果是这样,那么也许下面这个有稍许改动的程序更适合你:这个程序以单词“end”作为输入终结的标志。
    	#include<iostream>
    	#include<vector>
    	#include<algorithm>
    	#include<string>
    	using namespace std;
    
    	int main()
    	{
    		vector<double> v;
    
    		double d;
    		while(cin>>d) v.push_back(d);  // read elements
    		if (!cin.eof()) {		// check if input failed
    			cin.clear();	// clear error state
    			string s;
    			cin >> s;		// look for terminator string
    			if (s != "end") {
    				cerr << "format error\n";
    				return 1;	// error return
    			}
    		}
    
    		cout << "read " << v.size() << " elements\n";
    
    		reverse(v.begin(),v.end());
    		cout << "elements in reverse order:\n";
    		for (int i = 0; i<v.size(); ++i) cout << v[i] << '\n';
    
    		return 0; // success return
    	}
    
《The C++ Programming Language 》第三版中关于标准库的章节里有更多更详细例子,你可以通过它们学会如何使用标准库来“轻松搞定简单任务”。

本文乃网上搜集得来,其版权归原作者和原出处所有。如有侵犯版权之处请与我联系,我将马上进行处理。



相关专题:C++ 之父的言论
[转] 我该把const写在类型前面还是后面?
[翻译] 我应该使用按值传递还是按引用传递?

上一篇:[转] 我想从void *转换,为什么必须使用换型符?
下一篇:[转] 我可以写“void main()”吗?

共有评论 0 条 网友评分 1分 查看全部评论

查看全部评论

【发表评论】 评分:1分 2分 3分 4分 5分


验证码:

Powered By Www.Xydw.COM Ver1.14 管理
Copyright © 2005-2006 蚂蚁的 C/C++ 标准编程 All Right Reserved. XCMS
粤ICP备06014124号   站长:Antigloss