《C++程序设计原理与实践》读书笔记(一)

程序设计是这样一门艺术,它将问题求解方案描述成计算机可以执行的形式。程序设计中很多工作都花费在求解方案以及对其求精上。通常,只须在真正编写程序求解一个问题的过程中才会对问题本身理解透彻。
   为什么学习C++这门程序设计语言呢?学习程序设计不可能不借助一门程序设计语言,而C++直接支持现实世界中的软件所使用的那些关键概念和技术。C++是使用最为广泛的程序设计语言之一,其应用领域几乎没有局限。从大洋深处到火星表面,到处都能发现C++程序的身影。C++是由一个开放的国际标准组织全面考量、精心设计的。在任何一种计算机平台上都能找到高质量和免费的C++实现。而且,你用C++所学到的程序设计思想,大多数都可直接用于其他程序设计语言,如C、C#、Fortran以及Java。最后一个原因,我喜欢C++适合编写优美、高效的代码这一特点。

下面是经典的第一个程序的一个版本。它在你的屏幕上输出"Hello,World!":

#include <iostream>
using namespace std;
int main(void)
{
    cout << "Hello,World!\n";   //输出"Hello,World!"
    return 0;
}

有一个名为age的int类型的对象,其中保存的是整数42。通过使用一个字符变量,我们可以从输入中读取一个字符,然后将它打印出来,具体如下:

#include <iostream>
#include <string>
using namespace std;
int main(void)
{
   cout << "Please enter your first name (followed by ‘enter‘):\n"
   string first_name;
   cin >> first_name;
   cout << "Hello," << first_name << "!\n";
   return 0;
}

输入操作>>("get from")对是类型敏感的,它读取的值与变量的类型需要一致。例如:
//read name and age

int main(void)
{
    cout << "Please enter your first name and age\n";
    string first_name;
    int age;
    cin >> first_name;
    cin >> age;
    cout << "Hello," << first_name << "(age" << age << ")\n";
    return 0;
}

一个涉及浮点数的例子:

int main()
{
    cout << "Please enter a floating-point value:";
    double n;
    cin >> n;
    cout << "n == " << n
         << "\n n+1 == " << n+1
         << "\n three times n == " << 3*n
         <<\ntwice n == " << n+n;
         << "\nsquared of n == " << n*n
         << "\nhalf of n == "<< n/2
         << "\nsquare root of n == " << sqrt(n)
         << endl;
}

字符串+意味着连接,例如:

int main()
{
    cout << "Please enter your first and second names\n";
    string first;
    string second;
    cin >> first >> second;
    string name = first +‘ ‘ +second;
    cout >> "Hello, " << name << "\n";
}

字符串的比较操作特别有用:

int main()
{
    cout << "Please enter two name\n";
    string first;
    string second;
    cin >> fisrt >> second;
    if (first == second) cout << "that‘s the same name twice\n";
    if (first < second)
        cout << first << "is alphabetically before " << second << "\n";
    if (fist > second)
        cout << first << " is alphabetically after " << second << "\n";
}

删除重复单词:

int main()
{
    string previous = " ";
    string current;
    while (cin >> curren)
    {
        if (previous == curren)
            cout << "repeated word:" << current << ‘\n‘;
        previous = current;
    }
}

重复单词统计:

int main()
{
    int number_of_words = 0;   //我们将单词计数器置为0
    string previous = "";
    string current;
    while (cin >> current)
    {
        ++number_of_current;    //每次输入一个单词,就将计数器递增
        if (previous == current)
            cout << "word number " << number_of_words << "repeated: " << current << "\n";
        previous = current;
    }
}

if语句是最简单的选择语句,可以在两种可选分支中进行选择。例如,

int main()
{
    int a = 0;
    int b = 0;
    cout << "Please enter two integers\n";
    cin >> a >> b;
    
    if (a < b)
        cout << "max(" << a << "," << b << ") is " << b << "\n";
    else
         cout << "max(" << a << ", << b << ") is " << b << "\n";
}

switch语句,基于数值与多个常量的比较的选择。

int main()
{
    const double cm_per_inch = 2.54;
    double length = 1;
    char unit = ‘a‘;
    cout << "Please enter a length followed by a unit(c or i):\n";
    cin >> length >> unit;
    switch(unit)
    {
        case "i":
             cout << length << "in == " << cm_per_inch*length << "cm\n";
             break;
        case ‘c‘:
             cout << length << "cm == " << length/cm_per_inch << "in\n";
             break;
        default:
             cout << "Sorry, I don‘t know a unit called ‘" << unit << "‘\n";
             break;
    }
}

与if语句相比,switch语句更加清晰易懂,特别是与多个常量进行比较时。关键字switch后括号中的值与一组常量进行比较,每个常量用一个case语句标记。如果该值与某一常量相等,将选择执行该case语句,每个case语句都以break结束。如果该值与任何一个case后的常量都不相等,则选择执行default语句。虽然default语句不是必须的,但我们建议你加上,除非你能够完全确定给出的分支已经覆盖了所有的情况。

while语句

int main()
{
    int i = 0;
    while (i < 100) {
        cout << i << "\t" << square(i) << "\n";
        ++i;
    }
}

for语句

int main()
{
    for (int i = 0; i < 100; ++i)
    {
        cout << i << "\t" << square(i) << ‘\n‘;
    }
}

函数

int square(int x)
{
   return x*x;
}
int main()
{
    cout << square(2) << ‘\n‘;
    cout << square(10) << ‘\n‘;
}

显然,用C++语言描述比用自然语言(英语、汉语)描述更简洁。这一点在很多情况下都适用,比竟,程序语言的目的就是用一种更简洁、准确的方式来描述我们的思想。
函数定义(function definition)的法描述如下:

类型 函数名(参数表) 函数体

其中,类型是函数的返回值类型,函数名是函数的标记,括号内是参数表,函数体是实现函数功能的语句。参数表的每一个元素称为一个参数或形式参数,参数表可以为空。如果不需要函数返回任何结果,返回值类型可以设置为void。

使用函数的原因:当需要将一部分计算任务独立实现的时候,可以将其定义为一个函数,因为这样可以:
(1)实现计算逻辑的分离。
(2)使代码清晰(通过使用函数名)。
(3)利用函数,使得同样的代码在程序中可以多次使用。
(4)减少程序调试的工作量。

向量是一组可以通过索引来访问的顺序存储的数据元素。

vectof<int> v(6);
vector<string> philosopher(4);

异常

int main()
{
   try
   {
       vector<int> v;
       int x;
       while (cin >> x) v.push_back(x);
       for(int i = 0; i <= v.size(); ++i)
           cout << "v[" << i << "]==" << v[i] << endl;
   }catch(out_of_range)
   {
       cerr << "Oops! Range error\n";
       return 1;
   }
   catch(...)
   {
       cerr << "Exception: something went wrong\n";
       return 2;
   }
}
时间: 2024-10-13 08:52:23

《C++程序设计原理与实践》读书笔记(一)的相关文章

高性能javascript读书笔记(三.DOM 编程1)

第三章DOM Script DOM编程 读书笔记 访问和修改DOM元素 浏览器通常要求DOM实现和JavaScript保持相互独立. <!-- 例如IE中,被称为JScript的JavaScript实现位于库文件jscript.dll中,而DOM实现位于另一个库mshtml.dll(内 部代号Trident).这种分离技术允许其他技术和语言,如VBScript,受益于Trident所提供的DOM功能和渲染功能.Safari使用Webkit的WebCore处理DOM和渲染,具有一个分离的JavaS

数据访问---高性能JavaScript读书笔记(2)

对于任何一种编程语言来说,数据存储的位置关系到访问速度! 在JavaScript中的直接量包括字符串string.数字number.布尔值boolean.对象object.数组array.函数function.正则表达式regular expression.空值null.未定义数组undefined.而数组项则需要通过数组的数字索引来访问,对象通过字符串进行索引来访问其成员(这里顺便提一句因为数组项是通过数字进行索引.对象成员是通过字符串进行索引,所以这也就是为什么访问对象成员比访问数组项更慢的

加载和运行---高性能JavaScript读书笔记(1)

众所周知大多数浏览器是使用单进程处理UI更新和JavaScript运行等多个任务的,而同一时间只能有一个任务被执行,如此说来,JavaScript运行了多长时间就意味着用户得等待浏览器响应需要花多久时间. 从认知上来说,解析器解析一个界面的时候都是从上至下依次解析的,这就是说界面上出现多少个<script>标签(不管是内联还是外部文件),页面下载和解析必须停止等待脚本下载完成并运行完成(注意这里包括运行),这个过程当中,页面解析和用户交互是被完全阻塞的. Javascript第一条定律:将脚本

DOM访问---高性能JavaScript读书笔记(3)

在JavaScript高级程序设计第一章当中就把JavaScript分成三大部分 所以事实上DOM和BOM是两在独立的部分,它们之间的通信是通过相互之间的功能接口来实现的,这样说来两个独立的部分以功能接口必定会带来性能损耗.这也就是为什么大家一致都说尽量少去访问和修改DOM元素(注意我这里说的是访问和修改,为什么包括访问,请继续往下看  哈哈). 下面用一张图来说明它们各自的作用. 1.在修改DOM元素的时候,我们应该尽量使用innerHTML而不是CreateElement再AppendChi

高性能javascript读书笔记(三.DOM 编程2)

重绘和重排版 浏览器下载完所有的HTML标记,Javascript,CSS,图片之后,它解析文件并创建两个内部数据结构 DOM树 表示页面结构渲染树 表示DOM节点如何显示 渲染树中为每个需要显示的DOM树木=节点存放至少一个节点(隐藏DOM元素在选桉树中没有对应节点)渲染树上的节点称为"框"或者"盒",符合CSS模型的定义,将页面元素看作一个具有填充,边距,边框和位置的盒.一 旦DOM树和渲染树构造完毕,浏览器就可以显示(绘制)页面上的元素了. 当DOM改变影响到

Javascript读书笔记:函数定义和函数调用

定义函数 使用function关键字来定义函数,分为两种形式: 声明式函数定义: function add(m,n) { alert(m+n); } 这种方式等同于构造一个Function类的实例的方式: var add = new Function("m", "n", "alert(m+n);"); Function类构造方法的最后一个参数为函数体:"alert(m+n);",前面的都是函数的形参,参数必须是字符串形式的:&

Javascript读书笔记:字符串常用方法

concat() 连接多个字符串,返回合并后的字符串. 1 var s1="a"; 2 var s2="b"; 3 var s3="c"; 4 5 console.log(s1.concat(s2,s3));//abc 数组中的concat():将参数添加为数组的元素,返回新的数组. 1 var arr = [1, 2, 3]; 2 console.log(arr.concat(4, 5));//[1,2,3,4,5] indexOf() 查找子

高性能javascript学习笔记系列(1) -js的加载和执行

这篇笔记的内容主要涉及js的脚本位置,如何加载js脚本和脚本文件执行的问题,按照自己的理解结合高性能JavaScript整理出来的 javascript是解释性代码,解释性代码需要经历转化成计算机指令的过程,这个过程就会带来一定的性能损耗,所以在js中做性能的优化是必须的 javascript的阻塞特性:浏览器在执行js代码的时候,不能做其他的任何事情,因为浏览器使用单一的进程来处理用户界面的刷新和javascript的脚本执行,也就是说什么时候执行js脚本影响着用户对页面的使用体验(之所以js

高性能javascript学习笔记系列(6) -ajax

参考 高性能javascript javascript高级程序设计 ajax基础  ajax技术的核心是XMLHttpRequest对象(XHR),通过XHR我们就可以实现无需刷新页面就能从服务器端读取数据 var xhr = new XMLHttpRequest(); //只支持IE7以及更高的版本 xhr.onreadystatechange = function() { if(xhr.readyState == 4) { if( (xhr.status >= 200 && xh

高性能javascript学习笔记系列(5) -快速响应的用户界面

参考高性能javascript 理解浏览器UI线程  用于执行javascript和更新用户界面的进程通常被称为浏览器UI线程  UI线程的工作机制可以理解为一个简单的队列系统,队列中的任务按顺序执行 <button onclick="handleClick()">click</button> <script type="text/javascript"> function handleClick() { var div = do