c++学习笔记---03---从一个小程序说起2
分类:
IT文章
•
2024-04-12 20:01:48
从一个小程序说起2
要求:编写一个程序,要求用户输入一串整数和任意数目的空格,这些整数必须位于同一行中,但允许出现在该行中的任何位置。当用户按下键盘上的“Enter”键时,数据输入结束。程序自动对所有的整数进行求和并打印出结果。
C语言版本:
1 #include <stdio.h>
2 #include <stdlib.h>
3
4 void main()
5 {
6 int i;
7 int sum = 0;
8 char ch;
9
10 printf("请输入一串整数和任意数目的空格: ");
11
12 while( scanf("%d", &i) == 1 )
13 {
14 sum += i;
15
16 while( (ch=getchar()) == ' ' ) // 屏蔽空格
17 ;
18
19 if( ch == '
' )
20 {
21 break;
22 }
23
24 ungetc( ch, stdin ); // 将变量ch 中存放的字符退回给stdin输入流。
25 }
26
27 printf("结果是: %d", sum);
28 printf("
");
29 system("pause");
30 }
View Code
C++语言版本:
1 #include <iostream>
2
3 using namespace std;
4
5 int main()
6 {
7 int sum = 0;
8 int i;
9
10 cout << "请输入一串整数和任意数目的空格:";
11
12
13 while( cin >> i )
14 {
15 sum += i;
16 while( cin.peek() == ' ' )
17 {
18 cin.get();
19 }
20 if( cin.peek() == '
' )
21 {
22 break;
23 }
24 }
25
26 cout << "½á¹ûÊÇ: " << sum << endl;
27
28 return 0;
29 }
View Code
C++版本分析
这个程序使用了流对象 cin。这个对象的类型是istream,它知道如何从用户终端读取数据。
cin >> i;
cin 输入操作符又称为提取操作符,它一次从输入流对象cin 提取一个整数。
当用户进行键盘输入时,对应的字符将输入到操作系统的键盘缓冲区中。
这样,当用户点击键盘上的“Enter”键时,操作系统把键盘缓冲区的内容传输到cin 流的内部缓冲区,“>>”操作符随后从这个缓冲区提取需要的信息。
我们还发觉,如果用户不进行键盘的输入,程序将会阻塞。这是阻塞性(blocking)IO的例子。
“>>”最初定义为右移操作符,它在C++ 中进行了重载,当它按照这里所示的方式使用时,它就用于从输入流对象提取信息。
另外,这个操作符对所有内建的数据类型都进行了重载,所以它可以从输入流对象提取出int, float, double 型数据,也可以提取字符串等数据。
在while( cin >> i ) 中,表达式 cin >> i 返回输入流对象本身,也就是cin。但是,如果到达了文件尾或者提取操作符遇到一个非法值,这个返回值将是 false。
我们小举一个例子:如果我们试图把一个浮点数读取到一个 int 型变量中,当提取操作符遇到小数点时,它将使输入流对象置于一个错误的状态中,导致 cin 的值为 false。
注意,在while( cin >> i ) 中,当用户在键盘上点击“enter”键的时候,在这一句并不会结束。
另外,观察两个程序,我们发现:C 和 C++事实上在声明变量的事实上有点不同,C++允许我们在程序的任意位置声明变量。
这大大的提高了大型C++ 程序的可读性,因为这样子我们就可以在实际需要使用变量的时候才来声明他们。
cin、cout对象的多个方法
前边我们讲过,cin 是 istream类的对象,那么cin 同样具有一些方法,这些方法可以增强对于输入操作的控制,下边我们将通过简单的例子介绍 cin 的一些方法!
例子一:cin.ignore()和cin.getline()
1 #include <iostream>
2
3 using namespace std;
4
5 int main()
6 {
7 char buf[20];
8
9 cin.ignore(7);
10 cin.getline( buf, 10 );
11
12 cout << buf << endl;
13
14 return 0;
15 }
例子二:cin.get()和cin.peek()
1 #include <iostream>
2
3 using namespace std;
4
5 int main()
6 {
7 char p;
8 cout << "请输入一段文本:
";
9
10 while( cin.peek() != '
' )
11 {
12 p = cin.get();
13 cout << p;
14 }
15 cout << endl;
16
17 return 0;
18 }
例子三:cin.gcount()和cin.read()
1 #include <iostream>
2
3 using namespace std;
4
5 int main()
6 {
7 const int SIZE = 50;
8 char buf[SIZE];
9
10 cout << "请输入一段文本: ";
11 cin.read( buf, 20 );
12
13 cout << "字符串收集到的字符数为: "
14 << cin.gcount() << endl;
15
16 cout << "输入的文本信息是: ";
17 cout.write( buf, 20 );
18 cout << endl;
19
20 return 0;
21 }
前边我们已经介绍了几种常用的 cin 对象的方法,下边再介绍几种关于 cout 对象的方法。同样我们通过实例在让大家快速认识!
实例一:cout.precision()
1 #include <iostream>
2 #include <math.h>
3
4 using namespace std;
5
6 int main()
7 {
8 double result = sqrt(3.0);
9
10 cout << "对 3 开方保留小数点后0 ~ 9 位,结果如下:
" << endl;
11
12 for( int i=0; i <= 9; i++ )
13 {
14 cout.precision(i);
15 cout << result << endl;
16 }
17
18 cout << "当前的输出精度为: " << cout.precision() << endl;
19
20 return 0;
21 }
实例二:cout.width()
1 #include <iostream>
2
3 using namespace std;
4
5 int main()
6 {
7 int width = 4;
8 char str[20];
9
10 cout << "请输入一段文本:
";
11 cin.width(5);
12
13 while( cin >> str )
14 {
15 cout.width(width++);
16 cout << str << endl;
17 cin.width(5);
18 }
19
20 return 0;
21 }