编写程序解决问题时,往往需要输入数据。计算的数据由使用者输入,可以大大增强程序的实用性。
一、输入数据
编写程序解决问题时,往往需要输入数据。例如前面示例程序计算圆的周长和面积,计算的是半径为12.56的圆,如果要计算其他半径的圆,需要修改源程序并再次编译运行,这样很不方便并且实用价值低。如果设计程序时,由使用者输入圆的半径,程序根据输入的半径计算圆的周长和面积,那么程序的实用性大大增强。
首先来看一个简单的,计算输入的整数的立方。这里通过cin语句将运行时输入的数据存储到变量中。
#include<iostream> using namespace std; int main() { int n; //使用cin语句输入一个整数存储到变量n中,cin和变量间用两个右尖括号(>>)隔开 cin>>n; cout<<n*n*n; return 0; }
运行后会发现命令行窗口没有出现任何结果,只是光标一直在不停的闪烁:
这个时候需要我们输入数据,本程序只需要输入一个整数,然后按下回车键,就能看到程序输出结果:
初学者还容易犯的一个错误就是将cin和cout后面的尖括号写错。cin后面是 >>
,cout后面是 <<
,不要弄混了。可以这样来帮助记忆:
- cin是输入,将cin“想象成输入的数据”(其实就是输入流),两个右尖括号
>>
就像右箭头一样指示了左边输入的数据存储到右边变量中; - cout是输出,将cout“想象输出到的位置”(其实就是输出流),两个左尖括号
<<
就像左箭头一样指示了是将右边的计算表达式结果输出到左边“要输出的位置”。
再来测试一个简单的程序,计算输入的两个整数的和:
#include<iostream> using namespace std; int main() { int a,b; cin>>a>>b; //使用cin语句连续输入2个整数依次存储到变量a、b中 cout<<a+b<<endl; cout<<a<<"+"<<b<<"="<<a+b; return 0; }
注意体会cin语句输入多个数据以及cout语句输出多项信息的使用方法。cin语句输入多个数据存储到多个变量,输入的多个数据按照cin语句中变量出现的顺序依次存储。
运行本程序,同样会发现光标一直在不停地闪烁,在等待输入数据。本程序需要输入两个整数,输入时可以先输入一个整数并回车,然后再输入另外一个整数并回车;也可以一次性输入两个整数,不过这两个整数间用空格隔开,最后回车。
再测试下面的程序,体会和上一段程序的不同:
#include<iostream> using namespace std; int main() { int a,b,c; cin>>a>>b; //使用cin语句连续输入2个整数存储到变量a、b中 c = a+b; //计算a+b的值,保存到变量c中 cout<<c<<endl; cout<<a<<"+"<<b<<"="<<c; return 0; }
再来看一个经典问题:输入两个整数a和b,计算并输出 \(a ÷ b\) 的结果:
#include<iostream> using namespace std; int main() { int a,b; cin>>a>>b; cout<<a/b<<endl; return 0; }
不少初学者不经意就会写出类似左边的代码,测试一下,输入5和2,发现输出结果是2,并不是预期的2.5!
原因在哪里呢?a/b!a、b都是int整数,结果也是int整数!好在我们可以通过测试运行发现程序存在的问题,并及时修改!
#include<iostream> using namespace std; int main() { int a,b; cin>>a>>b; double c = a/b; cout<<c<<endl; return 0; }
再看看左边的代码,感觉没有什么问题,测试一下,输入5和2,发现输出结果是2,也不是预期的2.5!
原因在哪里呢?double c = a/b;
仍然先计算a/b!a、b都是int整数,结果也是int整数2,赋值给double类型变量c,c的值是2(小数部分为0)!
#include<iostream> using namespace std; int main() { int a,b; cin>>a>>b; cout<<1.0 * a / b<<endl; return 0; }
上面的程序能够很好地解决问题。1.0 * a / b
,先计算1.0 * a
,浮点数乘以整数,通过前面一小节数据类型自动转换的内容可知,结果是浮点数;再除以整数b,结果仍然是浮点数。
#include<iostream> using namespace std; int main() { int a,b; cin>>a>>b; cout<<a / b * 1.0<<endl; return 0; }
上面的代码仍然有问题!a / b * 1.0
,先计算a / b
,整数除以整数,结果是整数,即使再乘以1.0,输出的结果肯定是整数形式(小数部分为0输出时是整数形式)!
#include<iostream> using namespace std; int main() { double a,b; cin>>a>>b; cout<<a/b<<endl; return 0; }
左边的程序也能能够很好地解决问题,但不建议这样做!虽然题目里指出输入的是两个整数,但是整数其实是特殊的浮点数,所以可以用两个double类型的变量来存储输入的整数。
由于浮点数只能保证在一定位数的有效数字范围内是可靠的,不能保证是精确值,所以编程时,能够不用浮点数尽量不用。
最后来看计算圆的周长和面积,圆的半径用cin输入:
#include<iostream> using namespace std; int main() { const double PI = 3.14159; double r; //为了增强程序的实用性,应该使用double类型来存储输入的半径 cin>>r; cout<<2 * PI * r<<endl; cout<<PI * r * r<<endl; return 0; }
最后试一试下面的程序,并和前一段程序比较:
#include<iostream> using namespace std; int main() { const double PI = 3.14159; double r,C,S; //声明三个double类型(小数/浮点数)的变量r、C、S cin>>r; C = 2 * PI * r; //计算圆的周长并存储到变量C中 S = PI * r * r; //计算圆的面积并存储到变量S中 cout<<C<<endl<<S<<endl; return 0; }
后一段程序是典型的“输入数据——计算结果——输出结果”的结构。
二、输入输出数据小结
1.输入数据
- 使用cin语句输入数据,数据存储到变量中;
- cin与变量名间用
>>
隔开,格式为:cin>>变量名;
int a,b,c; cin>>a; cin>>b; cin>>c;
- cin输入可以一次性输入多个数据依次存储到多个变量中,cin与变量名之间,变量名与变量名间用
>>
隔开,格式为:cin>>变量名1>>变量名2>>变量名3...;
int a,b,c; cin>>a>>b>>c;
- 运行程序时,输入完数据后按回车,才能将数据真正输入到程序处理;多个数据间可以用空格或者回车隔开。
2.输出信息
- 使用cout语句输出信息,输出的信息可以是一句话(必须用英文引号括起来)、数字(整数、小数/浮点数)、变量、或者计算表达式:
cout<<"Hello World"; cout<<12345; cout<<3.14159; cout<<a; cout<<2*3.14159*r; cout<<a*(b+c);
- 可以只输出一项信息,也可以一次性输出多项信息。cout与输出内容之间,各内容间用
<<
隔开:
cout<<1<<"+"<<2<<"="<<1+2; cout<<a<<"+"<<b<<"="<<a+b;
- 输出一个特殊的内容:
endl
可以实现换行效果:
cout<<a<<"+"<<b<<"="<<a+b<<endl;