1. ALGORITHM INTRODUCTION /算法简介
- 单词解释:Algorithm(法语algorithme)通常意义上被翻译成“算法”或“演算法”。 “算法”一词源自波斯数学家
全名:Muhammad ibn Musa al-Khwarizmi 穆罕默德·伊本·穆萨·花拉子密 (大约780年—850年),波斯-阿拉伯著名的数学家和天文学家。代数学的创始人,现代数学的重要奠基人。曾任“巴格达智慧之家”大学士,翻译,钻研,总结如阿基米德,欧几里德等希腊数学家的著作后发表著名的《代数论》。至此开辟了现代数学两大门类之一的代数学(Algebra,即阿拉伯语的‘平衡’之意)。
花拉子密被认为被第十代哈里发——穆塔瓦基勒(在位847——861)即位后推行强硬伊斯兰教法后遭到迫害,普遍认为他死于公元850年。事实上瓦基勒早在穆阿台绥姆末期就掌握大权并推行伊斯兰教法造成大量学者出走或被迫流亡,被视为欧洲文艺复兴的原因之一,同时终结了阿拔斯王朝的黄金时代。
- 1.1 Algorithm definition/算法的定义
算法(Algorithm)是指一组有限的、可行的步骤,用于解决特定类型的问题。一个算法应满足以下特性:
- 通用性:能够解决某一类问题,而非单一问题。
- 有限性:算法必须在有限的步骤内结束。
- 明确性:每一步操作必须清晰、无歧义。
- 可执行性:每一步操作都能够被执行,最终得到结果。
- 1.2 Algorithm properties /算法的属性:可读性,通用性,精确性,简洁性,结构性。
- 算法的五大属性:
- 可读性:算法的逻辑应当清晰易懂,即使是非专业人士也能通过简单解释理解其核心思想。
- 通用性:算法应具有抽象性,能够适用于不同的编程语言和环境。
- 精确性:每一步都必须明确且无歧义,能够被精确执行。
- 简洁性:应尽量精炼,避免复杂的冗余步骤。如果算法过于复杂,可以分解为多个子算法。
- 结构性:算法应具有清晰的模块化设计,便于理解和实现。
- 1.3 Algorithm method/算法方法论
算法方法论可以总结为三大步骤(注意:这三步并非独立存在,彼此相关联):
- 输入(INPUT):确定问题的性质与范围,描述其基本要素。通常包括整数、实数、字符串、数组等数据类型。
- 输出(OUTPUT):明确问题的目标,即希望得到的结果。例如求和、求余、排序、嵌套等。
- 方法(PROCESS):通过一系列的逻辑步骤,从输入得出输出。常用的方法包括条件判断(if-else)、循环(for/while)、递归等。
- 1.4 ALGORITHM VS PROGRAMMING LANGUAGE
ALGORITHM(算法):
- 一系列明确的、有限的指令,用于解决某类问题。
- 用抽象的语言描述,按逻辑顺序执行。
- 与具体编程语言无关,但可以被任何编程语言实现。
PROGRAMMING LANGUAGE(编程语言):
- 人与机器的桥梁,用于将算法翻译为机器可以理解的指令。
- 提供语法和语义,用于编写过程、函数或模块以执行算法。
- 不同语言适用于不同的应用场景,例如 C 适用于系统编程,Python 适用于快速开发。例如【平均数】
- ALGORITHM(实例演示为伪代码) & PROGRAMMING LANGUAGE(以C++示例):
2.THE INSTRUCTION, THE SEQUENCE OF ALGORITHIC/算法的指令与序列
- 2.1 指令/THE INSTRUCTION:
- 程序中的一个步骤
- 指示计算机在执行下一条指令之前需要执行的操作
- 基本操作
- 由处理器理解和执行
- 2.2 序列/THE SEQUENCE:
- 一系列按顺序执行的指令,在所有处理情况下都按它们的书写顺序执行
- 由开始和结束(即bloc)界定
- 开始
- 指令1
- 指令2
- …
- 指令N
- 结束
3.C与C++相关
- 3.1C与C++的历史:
C语言诞生于1972年由 丹尼斯·麦卡利斯泰尔·里奇(英语:Dennis MacAlistair Ritchie,1941年9月9日—2011年10月12日) 和 肯尼斯·蓝·汤普逊(英语:Kenneth Lane Thompson,1943年2月4日—) 为了移植,开发UNIX,于贝尔实验室,基于B语言开发。
丹尼斯·麦卡利斯泰尔·里奇
肯尼斯·蓝·汤普逊,于1983年测试著名象棋程序“贝尔”
而C++是1983年基于C语言,由丹麦数学家,计算机科学家比雅尼·斯特劳斯特鲁普 ( Bjarne Stroustrup 1950年12月30日— )开发而来。
比雅尼·斯特劳斯特鲁普于2013,与此同时,他也是《C++程序语言与设计》一书的作者
值得一提的是,大量的C语言的Unix使用者,也包括C语言之父汤普逊并不喜欢C++,认为它繁琐。更令人难以忍受的是,C++还将程序的本身分为了“函数Fonction”与“过程 Procedure”两类(这是一个很重要的概念,但今天与我们的主题无关暂且不表)。巧的是,不仅是他们这么认为,用C++的人和设计C++的人也是这么认为的。
使用C的程序员在Windows环境下编程后正在评价Windows
尽管如此,C++ 的广泛应用不可否认。它被称为“一用就骂,骂完就用”的工业编程语言,承载着现代工业软件开发的许多任务。
- 3.2 C与C++的异同,以求a+b的平均值为例
C语言中的平均值计算,使用scanf 和printf实现输入与输出
C++计算平均值,使用cin和cout实现输入与输出,接下来我们要着重介绍C++的代码含义
在 C 语言中,平均值的计算通常使用 scanf 和 printf 实现输入和输出。它们基于格式化字符串,虽然语法简单直接,但需要手动管理输入输出的格式,不够灵活。
在 C++ 中,则使用 cin 和 cout 进行输入输出。cin 和 cout 是基于流的输入输出机制,提供了更现代化的接口,且更加面向对象。但它们的语法略显冗长,例如需要通过 ‘<< ’ 和‘ >>’ 操作符分隔输入输出。
在 C++ 中,#include 是一个预处理指令,表示在编译之前将指定的头文件内容包含到程序中。<iostream> 是一个标准库头文件,它提供了输入输出流(input/output stream)的功能。通过它,我们可以使用 cin 和 cout 进行输入输出操作。
值得注意的是,iostream 是由 io(input/output)和 stream(流)两个部分组成的,而不是 ios-tream,和苹果无关。
随后的:
using namespace std;翻译为:使用/using 命名空间/namespace 标准/std, (stand)的简写。std 是 C++ 标准库的命名空间,包含了常用的标准库功能,比如 cin、cout 和 vector 等。
什么是命名空间?举个例子:
一觉醒来的老白终于穿越到了他梦想的国度——苏联。还成了一名光荣的苏联红军战士。老白高兴地走在路上,迎面也走来一名军人。
军人:你哪个部队的?
老白:我是一营二连二排三班的!
对面的军人Bia一枪就把老白给毙了说:“我就是我就是一营二连二排的排长,我没见过你!你一看就是契丹人派来的间谍!”
苏联解体之后终于真相大白,源濑老白(不是错别字)是另一个团一营二连二排三班的。团就是命名空间的一种。
顺便科普一个军事常识,绝大多数情况下当有人问某个人是“哪个部队的”,在全世界绝大多数情况下这个“部队”都是指“团或及其以下。(即番号)”
类似地,命名空间也是用来区分不同“团”的机制。例如:
可见19行,和21行,特殊的命名空间需要调用‘::’来做作用域解析而无法像std那样直接使用cout<<输出流
命名空间的作用是为了区分不同模块中的同名对象,避免命名冲突。类似于“部队编号”系统,能够确保每个代码模块都有唯一的标识。
程序执行过程的内存分布代码解释
main函数
float a, b; // 声明局部变量 (栈区)
cin >> a >> b; // 从输入缓冲区获取数据
cout << (a + b) / 2 << endl; // 输出平均值
return 0; // 栈区释放
- 单词:stack/栈
一看中文,你就懵逼了。但在英语种stack的含义十分清晰而且直观。就是堆叠的意思。例如
stack on,指飞机降落,尤其是体型庞大的客机或运输机。
更有意思的是,编程中拥有一个原则,后进先出(LIFO),也和它的直观感受一样符合程序运行原理。
如上图,最下面的是Ice-bear,他是最先进入‘栈’的,其次是胖达(Panda),Grizz灰熊是最后一个入栈,入栈被称为push。而它们要下来(出栈)的话则是相反,Grizz先下,胖达随后,Ice-bear最后,这个被叫做“出栈”,英语即pop,这就是程序中所谓的“后进先出”(LIFO Last In First Out )原则。
举个例子:你在写文章,修图片的时候不小心误操作下意识地按下CTRL+Z,这就是栈的经典的应用,回溯上一步操作的行为叫做pop/出栈,记录上一步操作叫做push/入栈。
每次你的操作都会进入内存,简称入栈(push)就像你输入HELLO的时候
此时,栈底 [H, E, L, L, O] 栈顶
CTRL+Z,即将O弹出(pop),称为出栈,从而回到
HELL
总结
- Push(入栈): 将数据放到栈的顶部。
- Pop(出栈): 从栈的顶部取出数据。
Chat GPT生成的内存区域的起止点示意图(中文)
当用户输入a=5, b=7时,图示化内存布局
注意:具体的地址分配会因操作系统和编译器而异
完
今天没有作业,因为快超字数了。下一课我们来讲算法和C++的布尔运算,变量,常量类型,书写规范以及语法。
推荐读物,可以帮你了解pseudocode的书写规范:
伪代码(加拿大滑铁卢大学)
Pseudocode: An Introduction (伪代码,介绍),西密歇根大学,英语