第一个问题
数据输入问题:
(1)简单输入两个整数相加
如输入:
1 2
4 5
输出:
3
9
C语言:
while(scanf("%d%d",&a,&b)!=EOF)
printf("%d",a+b);
解释:
如果被a,b成功读入两个整数则scanf返回2,如果只成功读入一个则返回1,如果都没有成功读入则返回0,如果到达文件尾部则返回EOF.
C++:
while(cin>>a>>b)
解释:
cin读入成功则返回一个输入类的对像,否则返回NULL。
(2)从文件中读入数据
#include<iostream>
#include<fstream>
using namespace std;
//从文本中读单个单词直到文件尾部
void readWord()
{
string s;
ifstream infile;
infile.open("test.txt");
//或者
//ifstream infile("test.txt");
if(!infile)//检查是否打开成功
{
cerr<<"Error"<<endl;
}
while(infile>>s)
cout<<s<<endl;
}
//从文本中读按行读取字符串
void readLine()
{
string s;
ifstream infile;
infile.open("test.txt");
//或者
//ifstream infile("test.txt");
if(!infile)//检查是否打开成功
{
cerr<<"Error"<<endl;
}
while(getline(infile,s))
cout<<s<<endl;
}
(2)C++中string类和vector容器
string类的对象可以存储长度任意的字符串。可用下标对字符串中的每个字符进行操作,下标的类型不是int 而是string::size_type,有与int相同的操作方式。string类提示了多个操作函数,如s.size()返回字符串的长度,返回值为string::size_type型,如s.empty()确定一个string对象中否为空。另string类还提供了+,==,!=等操作这些操作具体原来操作功能。string类还提供了针对字符串的单个字符的操作如:isupper(c)判定c是否是大字字母。
vector容器,不是一个数据类型而是一个模板,存放若干个同一种数据类型的数据。其最大的特点是可以动态的增加长度。并在声明时就需要提供是存放哪种数据类型的容量。如vector<int>是存放int的容器。几个重要的函数:v.push_back(t)向容量v中增加元素t,v.empty()确定是否为空, v.size()返回容器的长度,返回值类型为vector<*>::size_type。*为某一数据类型。
注:在使用size_type的时候要注意,由于size_type是一个无符号数,只有正数没有负数。如有for(string::size_type i=s.size();i>=0;i--)这样的表达中就是错误的,由于i是一个正数,当其自减为负数时,又变成正数,则上面的那个循环就不会停止,则无限循环。 一个改进的方法为把string::size_type强制成int,即static_cast<int>(s.size())。
(3)iterator迭代器类
C++中的标准容器都定义了自己的迭代器类,迭代器有二个层面的意思:1:指的是具体的迭代器类。2:指的是一种操作的意思只要能遍历容器的类都可以认为是迭代器类。对迭代的赋值如:vector::iterator iter=v.begin()或v.end()。这里返回的是迭代器的,而不是和v.size()一样返回的是一个vector::size_type类的值。迭代器能进行的操作有自加操作和加减操作,其都是向容器前进几个单元,而不是其值加一。还有一个自解操作即:*iter就是对于iter里面的值进行的操作。另还有const_iterator,如有vector::const_iterator iter是指iter里的元素不能进行操作,而不是iter自身的值有变化。注:如果容器进行了插入操作,即其长度有所改变,则迭代器就不能再有效的进行操作了。