荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: Dreamer (我与萤火虫), 信区: SoftDev
标  题: 【C++】[FAQ]这个简单的程序……我如何把它搞定?
发信站: 荔园晨风BBS站 (Mon Jun  7 19:47:57 2004), 站内信件

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是知道它自己的大小的,所以不必自己清点输入了多少元素。
这个程序不含任何显式内存管理代码,也不会产生内存泄漏。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 》第三版中关于标准库的章节里有更多更详细
例子,你可以通过它们学会如何使用标准库来“轻松搞定简单任务”。




--
如果你真的爱萤火虫,你就不应该将她困在瓶子里;
如果你真的爱萤火虫,你应该放开她,让她在天空中自由自在地飞!
虽然你会不舍得她,但是最终你就会明白这样你才真正拥有了她!

※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.0.223]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店