NOIP学习小站
西安交通大学附属中学航天学校

cin输入数据

编写程序解决问题时,往往需要输入数据。计算的数据由使用者输入,可以大大增强程序的实用性。

一、输入数据

编写程序解决问题时,往往需要输入数据。例如前面示例程序计算圆的周长和面积,计算的是半径为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.输入数据

  1. 使用cin语句输入数据,数据存储到变量中;
  1. cin与变量名间用 >> 隔开,格式为:cin>>变量名;
int a,b,c;
cin>>a;
cin>>b;
cin>>c;
  1. cin输入可以一次性输入多个数据依次存储到多个变量中,cin与变量名之间,变量名与变量名间用 >> 隔开,格式为:cin>>变量名1>>变量名2>>变量名3...;
int a,b,c;
cin>>a>>b>>c;
  1. 运行程序时,输入完数据后按回车,才能将数据真正输入到程序处理;多个数据间可以用空格或者回车隔开。

2.输出信息

  1. 使用cout语句输出信息,输出的信息可以是一句话(必须用英文引号括起来)、数字(整数、小数/浮点数)、变量、或者计算表达式:
cout<<"Hello World";
cout<<12345;
cout<<3.14159;
cout<<a;
cout<<2*3.14159*r;
cout<<a*(b+c);
  1. 可以只输出一项信息,也可以一次性输出多项信息。cout与输出内容之间,各内容间用 << 隔开:
cout<<1<<"+"<<2<<"="<<1+2;
cout<<a<<"+"<<b<<"="<<a+b;
  1. 输出一个特殊的内容:endl 可以实现换行效果:
cout<<a<<"+"<<b<<"="<<a+b<<endl;