我如何写个非常简单的程序?
2012-04-23 11:32
176 查看
特别是在一个学期的开始,我常常收到许多关于编写一个非常简单的程序的询问。这个问题
有一个很具代表性的解决方法,那就是(在你的程序中)读入几个数字,对它们做一些处理,
再把结果输出。下面是一个这样做的例子:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
vector<double> v;
double d;
while(cin>>d) v.push_back(d); // 读入元素
if (!cin.eof()) { // 检查输入是否出错
cerr << "format error\n";
return 1; // 返回一个错误
}
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; // 成功返回
}
对这段程序的观察:
这是一段标准的 ISO C++程序,使用了标准库(standard library)。标准库工具在命
名空间std中声明,封装在没有.h 后缀的头文件中。
如果你要在 Windows 下编译它,你需要将它编译成一个“控制台程序”(console
application)。记得将源文件加上.cpp 后缀,否则编译器可能会以为它是一段 C 代码
而不是 C++。
是的,main()函数返回一个 int值。
读到一个标准的向量(vector)中,可以避免在随意确定大小的缓冲中溢出的错误。读到一
个数组(array)中,而不产生“简单错误”(silly error),这已经超出了一个新手的能
力——如果你做到了,那你已经不是一个新手了。如果你对此表示怀疑,我建议你阅读我的
文章“将标准 C++作为一种新的语言来学习”("Learning Standard C++ as a New
Language"),你可以在本人著作列表(my publications list)中下载到它。
!cin.eof()是对流的格式的检查。事实上,它检查循环是否终结于发现一个
end-of-file(如果不是这样,那么意味着输入没有按照给定的格式)。
见你的C++教科书中的“流状态”(stream state)部分。
vector知道它自己的大小,因此我不需要计算元素的数量。
这段程序没有包含显式的内存管理。Vector维护一个内存中的栈,以存放它的元素。当一
个 vector 需要更多的内存时,它会分配一些;当它不再生存时,它会释放内存。于是,
使用者不需要再关心 vector中元素的内存分配和释放问题。
程序在遇到输入一个“end-of-file”时结束。如果你在 UNIX 平台下运行它,
“end-of-file”等于键盘上的 Ctrl+D。如果你在 Windows平台下,那么由于一个BUG
它无法辨别“end-of-file”字符,你可能倾向于使用下面这个稍稍复杂些的版本,它使
用一个词“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); // 读入一个元素
if (!cin.eof()) { // 检查输入是否失败
cin.clear(); // 清除错误状态
string s;
cin >> s; // 查找结束字符
if (s != "end") {
cerr << "format error\n";
return 1; // 返回错误
}
}
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; // 成功返回
}
有一个很具代表性的解决方法,那就是(在你的程序中)读入几个数字,对它们做一些处理,
再把结果输出。下面是一个这样做的例子:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
vector<double> v;
double d;
while(cin>>d) v.push_back(d); // 读入元素
if (!cin.eof()) { // 检查输入是否出错
cerr << "format error\n";
return 1; // 返回一个错误
}
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; // 成功返回
}
对这段程序的观察:
这是一段标准的 ISO C++程序,使用了标准库(standard library)。标准库工具在命
名空间std中声明,封装在没有.h 后缀的头文件中。
如果你要在 Windows 下编译它,你需要将它编译成一个“控制台程序”(console
application)。记得将源文件加上.cpp 后缀,否则编译器可能会以为它是一段 C 代码
而不是 C++。
是的,main()函数返回一个 int值。
读到一个标准的向量(vector)中,可以避免在随意确定大小的缓冲中溢出的错误。读到一
个数组(array)中,而不产生“简单错误”(silly error),这已经超出了一个新手的能
力——如果你做到了,那你已经不是一个新手了。如果你对此表示怀疑,我建议你阅读我的
文章“将标准 C++作为一种新的语言来学习”("Learning Standard C++ as a New
Language"),你可以在本人著作列表(my publications list)中下载到它。
!cin.eof()是对流的格式的检查。事实上,它检查循环是否终结于发现一个
end-of-file(如果不是这样,那么意味着输入没有按照给定的格式)。
见你的C++教科书中的“流状态”(stream state)部分。
vector知道它自己的大小,因此我不需要计算元素的数量。
这段程序没有包含显式的内存管理。Vector维护一个内存中的栈,以存放它的元素。当一
个 vector 需要更多的内存时,它会分配一些;当它不再生存时,它会释放内存。于是,
使用者不需要再关心 vector中元素的内存分配和释放问题。
程序在遇到输入一个“end-of-file”时结束。如果你在 UNIX 平台下运行它,
“end-of-file”等于键盘上的 Ctrl+D。如果你在 Windows平台下,那么由于一个BUG
它无法辨别“end-of-file”字符,你可能倾向于使用下面这个稍稍复杂些的版本,它使
用一个词“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); // 读入一个元素
if (!cin.eof()) { // 检查输入是否失败
cin.clear(); // 清除错误状态
string s;
cin >> s; // 查找结束字符
if (s != "end") {
cerr << "format error\n";
return 1; // 返回错误
}
}
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; // 成功返回
}
相关文章推荐
- c++程序中如何简单调用批处理文件
- (作业1)将一个简单的C程序编译成汇编代码,讨论计算机是如何工作的进行
- AjaxPanel自定义控件实现页面无刷新数据交互(做了个示例程序, 效果确实比较Cool, 用法非常简单! )(示例代码下载)
- 简单的hello word程序在计算机系统中是如何运行的
- 如何创建简单的OOP程序(分开主程序和头文件)
- 通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的--20135334赵阳林
- 通过一个简单的例子学习编译器是如何执行程序的
- 在Linux下如何使用GCC编译程序、简单生成静态库及动态库
- 如何在linux下创建一个简单的JNI程序HelloWorld
- AjaxPanel自定义控件实现页面无刷新数据交互(做了个示例程序, 效果确实比较Cool, 用法非常简单! )(示例代码下载)
- 在Linux下如何使用GCC编译程序、简单生成 静态库及动态库。
- 如何写一个简单的病毒程序
- 在Linux下如何使用GCC编译程序、简单生成静态库及动态库。
- 通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
- 一个有意思的笔试题:如何破解一个简单密码登陆程序
- SQLITE3命令行简单入门指令||真机测试程序如何进入data文件夹
- 如何编写最简单的MapReduce之WordCount程序
- x86平台 通过反汇编简单的从程序,分析理解计算机是如何工作的。
- 通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
- 通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的