Skip to content

L1-01 如何与计算机交流

计算机的历史

冯·诺依曼奠定了现代计算机的基础,被世人尊为“计算机之父”,但在谈到他的理论与构思时,他谦虚地说,这些理论与构思的基础来自于英国数学家图灵和布尔的思想。

阿兰·图灵( Alan Mathison TuringAlan Mathison Turing )“人工智能之父”,被冯·诺依曼认为的“计算机之父”是一位天才人物, 22 岁就被选为英皇家学院研究员, 1936 年在论文《论可计算数及在密码上的应用》中,严格地描述了计算机的逻辑结构,首次提出了计算机的通用模型——“图灵机”,并从理论上证明了这种抽象计算机的可能性。

二战期间,图灵在英国外交部工作,设计了密码破译机( BOMBE ),这实际上就是一台以继电器为器件的专用数字电子计算机,该机一次次地破译了敌军的密码,为反法西斯战争的胜利做出了贡献,这段历史后来被拍成了电影《模拟游戏》。

1945 年,图灵在英国国家物理研究所开始设计自动计算机,阐述了用子程序实现某些运算而程序员不必知道机器运行细节的思想,为计算机高级语言的诞生奠定了基础。 1950 年,图灵制成了一台体现他设计思想的计算机模型机 PIOLOT ACE。同年 10 月,图灵发表了《计算机器与智能》的论文,设计了著名的图灵测验,通过问答来测试计算机是否具有同人相等的智力,这一思考至今仍是计算机学术界探讨的核心问题之一。该论文引起了计算机学术界的极大震撼,奠定了人工智能理论的基础。

为纪念图灵对计算机科学的巨大贡献,美国计算机协会设立了“图灵奖”每年授予在计算机科学方面做出重大贡献的科学家,堪称计算机界的“诺贝尔奖”。

单选题

计算机应用的最早领域是(  )。

A. 数值计算

B. 人工智能

C. 机器人

D. 过程控制

  • 题解

    选A, 第一台计算机主要用于弹道的计算也就是数值的计算

关于编程

计算机的计算能力叫做算力,我们常见的算力单位是 TOPS , 1 个 TOPS 代表处理器每秒钟可进行一万亿次( 1012 )操作。

美国最早的通用计算机 ENIAC 用了 18000 个电子管,占地 170 平方米,重达 30 吨,耗电功率约 150 千瓦,每秒钟可进行 5000 次运算。

而我们平时使用的家庭电脑,单线程每秒钟可以处理 107 次运算,考虑到多核并行,经常每秒可以处理 109 以上的运算。

位居世界前几名的超算太湖之光。安装了 40960 个中国自主研发的神威 26010 众核处理器,峰值性能 3,168 万亿次每秒。

芯片性能的提升,解决了计算速度的问题,让计算机可以为人类服务,那计算机如何听懂我们的话呢?

当然是通过“语言”,但这种语言很特殊,是人类与计算机沟通的“专用暗号”。

这种语言叫做:编程语言

注:计算机语言 (Computer Language):指用于人与计算机之间通讯的语言。计算机语言是人与计算机之间传递信息的媒介。

用计算机实现我们想出来的方法的过程,就是编程。

编程语言简史

世界上第一种计算机高级语言是诞生于 1954 年的 FORTRAN 语言。之后出现了多种计算机高级语言。 1970 年, AT&T 的 Bell 实验室的 D.Ritchie 和 K.Thompson 共同发明了 C 语言。研制 C 语言的初衷是用它编写 UNIX 系统程序,因此,它实际上是 UNIX 的副产品。它充分结合了汇编语言和高级语言的优点,高效而灵活,又容易移植。

1971 年,瑞士联邦技术学院 N.Wirth 教授发明了 Pascal 语言。 Pascal 语言语法严谨,层次分明,程序易写,具有很强的可读性,是第一个结构化的编程语言。

20 世纪 70 年代中期, Bjarne Stroustrup 在剑桥大学计算机中心工作。他使用过 Simula 和 ALGOL ,接触过 C 。他对 Simula 的类体系感受颇深,对 ALGOL 的结构也很有研究,深知运行效率的意义。既要编程简单、正确可靠,又要运行高效、可移植,是 Bjarne Stroustrup 的初衷。以 C 为背景,以 Simula 思想为基础,正好符合他的设想。 1979 年, Bjame Sgoustrup 到了 Bell 实验室,开始从事将 C 改良为带类的 C ( C with classes)的工作。 1983 年该语言被正式命名为 C++。

语言类型运行效率
汇编低级语言,直接对机器编码最高
C面向过程,不支持面向对象,无需运行环境极高
C++静态语言,面向对象,无需运行环境极高
Java,C#静态语言,面向对象,需要运行环境中等
Python,Javascript动态语言,面向对象极低

编程语言占比排行

编程语言占比变化趋势。

关于C++

C++ 是一种静态类型的、编译式的、通用的、大小写敏感的、不规则的编程语言,支持过程化编程、面向对象编程和泛型编程。

C++ 被认为是一种中级语言,它综合了高级语言和低级语言的特点 。

C++ 是由 Bjarne Stroustrup 于 1979 年在新泽西州美利山贝尔实验室开始设计开发的。 C++ 进一步扩充和完善了 C 语言,最初命名为带类的 C ,后来在 1983 年更名为 C++ 。因此 C++ 是 C 语言的超集,也就是说 C++ 的编译器可以直接编译 C 语言写的程序,同时 C++ 还支持面向对象编程。

当然我们要明确:语言只是媒介,我们的目标是用语言实现我们脑子里想出来的“点子”也就是算法。

算法就是解决问题的方法和步骤。

按照先贤们的说法:程序 = 数据结构 + 算法。

单选题

在下列关于计算机语言的说法中,正确的有( )。

A. 高级语言比汇编语言更高级,是因为它的程序的运行效率更高

B. 随着Pascal、C等高级语言的出现,机器语言和汇编语言已经退出了历史舞台

C. 高级语言程序比汇编语言程序更容易从一种计算机移植到另一种计算机上

D. C是一种面向对象的高级计算机语言

  • 题解

    选C C语言并不是面对对象的高级计算机语音,而是一门面对过程的高级计算机语言。因此排除B、D两个选项。

    而且汇编语言是高级计算机语言的基础,因此排除A选项。

C++代码示例

下面我将给大家展示一小段代码示例

c++
#include<bits/stdc++.h>           //  调用输入输出函数库            
using namespace std;              //  使用标准库       
int main()                        //  定义主函数            
{
    cout << "Hello, World!"; //输出Hello World
    return 0;
}

这段代码的目的就是让计算机帮我们输出了你的第一段代码文字“ Hello World!”,同理我们还能让计算机做更多的类似的事情,比如输出一些汉字,甚至输出一篇文章。

那么聪明的你知道该替换那部分内容,改变计算机输出的内容吗?

程序书写标准

c++
头文件: #include<bits/stdc++.h>
命名空间:  using namespace std;
主函数:  int main()
{
定义变量       int a;
输入           cin>>a;
运算           a=a+1;
输出           cout<<a;
结束返回       return 0;
}

以上是一段标准的 C++ 程序。

编程实验

动手实验

c++
#include<bits/stdc++.h>
using namespace std;
int main()
{
    cout << "Hello World!";
    return 0;
}

输出结果:

c++
Hello World!

代码填空

c++
#include<     >
using namespace std;
int main
{
    cout << "Hello,My name is Sue!"; //输出Hello,My name is Sue!
    return 0;
}

自己动手

根据以上两题,上机编写一个程序,输出 "HELLO, MY TEACHER!"

  • 参考答案:
    c++
    #include<bits/stdc++.h>
    using namespace std;
    int main()
    {
        cout << "HELLO,MY TEACHER!";
        return 0;
    }

头脑风暴

猜数游戏

有两个玩家 A,B ,你可以假设 B 玩家就是你。首先 A 在心里想好一个 [1,128] 之间的数字(整数),你的目标就是以最快的速度猜到 A 心里的这个数字。当然越快越好可不能乱猜,每次你猜一个答案 x , A 都会告诉你是偏大还是偏小,你有什么好的策略去猜 A 心里的数字吗?

思考:我们每猜一次,唯一的信息量就来自于 A 所给的“偏大”或“偏小”的提示。很显然,这一提示我们应用的越“到位”,我们的策略就越好,我们应该怎么做呢?

遇到这类问题,我们要思考的是,如何在最坏的情况下也能很快猜出答案,这里我们采用每次猜中间数的策略。开始,我们先猜 64 ,如果大了,问题转为猜一个 [1,63] 之间的数。如果小了,问题转为猜 [65,128] 之间的数。对于这两种不同情况,我们仍然延续这个策略,分别猜 32 和 96 。这样,最坏情况下 7 次也能够猜到答案,这是因为 27>=128

其中涉及到的算法思想,叫做二分查找。

代码练习

课堂练习:启蒙练习-加法

输入一个数n,请你输出n+2的值。

输入格式

输入一个数n。

输出格式

输出一个数,表示n+2的值。

输入样例

6

输出样例

8

数据范围

对于100%的数据,0<n≤50000。

  • 参考答案
    c++
    #include<bits/stdc++.h>
    using namespace std;
    int main(){
        int n; //定义变量
        cin >> n; //读入数字
        cout << n + 2; //输出+2的结果
        return 0;
    }