zoukankan      html  css  js  c++  java
  • c++学习笔记---03---从一个小程序说起2

    从一个小程序说起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 }
  • 相关阅读:
    权限控制
    包(package)
    this和super关键字
    成员变量的隐藏和方法重写(覆盖)
    转--htaccess语法教程 apache服务器伪静态规则教程
    转---高并发Web服务的演变——节约系统内存和CPU
    MYSQL 分表实践
    MySql主从配置实践及其优势浅谈
    一位IT牛人的十年经验之谈
    最近对Memcache的一些学习
  • 原文地址:https://www.cnblogs.com/alimjan/p/7614632.html
Copyright © 2011-2022 走看看