1.计算机系统基本概念
1.1
**计算机由软件、硬件和指令系统组成。其中硬件包括输入输出设备,外存储器,内存储器,CPU等,软件是一系列按照特定顺序组织的计算机数据和指令的集合。一般来讲软件被划分为系统软件(win,Linux)、应用软件(QQ,微信,DNF)和介于这两者之间的中间件;软件包括程序和文档。计算机指令系统是机器硬件能够识别的语言(机器语言)的集合;它是软件和硬件的主要界面。
1.2
计算机解决问题是程序控制的,程序就是操作步骤,程序要使用语言来表达。计算机能直接识别的是机器语言。计算机程序包括指令的序列以及描述解决问题的方法和数据。
2.计算机语言和程序设计方法的发展
2.1
机器语言-汇编语言-高级语言
面向过程:机器语言、汇编语言、高级语言都支持;最初的目的:用于数学计算;主要工作:设计求解问题的过程。大型复杂的软件难以用面向过程的方式编写。
面向对象:由面向对象的高级语言支持;一个系统由对象构成;对象之间通过消息进行通信。
面向对象的程序设计方法的主要优势在于能够开发大型系统。
3.面向对象的基本概念
3.1
对象:一般意义上的对象:现实世界中实际存在的事物。面向对象方法中的对象:程序中用来描述客观事物的实体,具有标识唯一性,分类性,多态性,继承性等特点。
抽象与分类:分类依据的原则——抽象;抽象出同一类对象的共同属性和行为形成类;类与对象是类型与实例的关系。
封装:隐蔽对象的内部细节;对外形成一个边界;只保留有限的对外接口;使用方便、安全性好。
继承:改造、扩展已有类形成新的类,意义在于软件复用。
多态:同样的消息作用在不同对象上,可以引起不同的行为。
4.程序的开发过程
4.1 程序:源程序:用源语言写的,有待翻译的程序;目标程序:源程序通过翻译程序加工以后生成的机器语言程序;可执行程序:连接目标程序以及库中的某些文件,生成的一个可执行文件,例如windows系统平台上的.EXE文件。
4.2 三种不同类型的翻译程序:汇编程序:将汇编语言源程序翻译成目标程序;编译程序:将高级语言源程序翻译成目标程序;解释程序:将高级语言源程序翻译成机器指令,边翻译边执行。如C++用的是编译,Java是半编译半解释的,因此可以跨平台。
4.3 C++程序的开发过程:算法与数据结构设计-源程序编辑-编译(会检查源程序的语法正确)-连接-测试-调试。
5.计算机中的信息和存储单位
5.1:
计算机的基本功能:是算术运算与逻辑运算。
计算机中信息:控制信息——指挥计算机操作;数据信息——计算机程序加工的对象。
信息的存储单位
位(bit,b):数据的最小单位,表示一位二进制信息;
字节(byte,B):八位二进制数字组成(1 byte = 8 bit);
千字节 1 KB = 1024 B;
兆字节 1 MB = 1024 K;
吉字节 1 GB = 1024 M。
6.计算机的数字系统
6.1
计算机数字系统是二进制系统,基本符号是0,1.
程序中常用的数制:
6.2 进制转换
R进制转十进制
各位数字与它的权相乘,其积相加,例如:二进制1010.11=8+0+2+0+0.5+0.25=10.25
十进制整数转换为R进制整数
十进制小数→ R 进制小数
二、八、十六进制的相互转换
1位八进制数相当于3位二进制数;1位十六进制数相当于4位二进制数。
7.数据的编码表示
7.1 二进制的编码表示
原码:"符号──绝对值"表示的编码
原码的缺点:零的表示不惟一,进行四则运算时,符号位须单独处理,运算规则复杂。
补码:符号位可作为数值参加运算;减法运算可转换为加法运算; 0的表示唯一。
补码的原理:
模数:n位二进制整数的模数为2的n次幂;n位二进制小数的模数为2。
补数:一个数减去另一个数(加一个负数),等于第一个数加第二个数的补数,例(时钟指针): 8+(-2)=8+10 ( mod 12 )=6;
一个二进制负数可用其模数与真值做加法 (模减去该数的绝对值) 求得其补码,例(时钟指针):-2+12=10。
补码的计算:借助于“反码”作为中间码;负数的反码与原码有如下关系:
符号位不变(仍用1表示),其余各位取反(0变1,1变0),例如:
X=-1100110 [X]原 =1 1100110 [X]反 =1 0011001
正数的反码与原码表示相同,正数的补码与原码相同;反码只是求补码时的中间码;负数的补码由该数反码的末位加 1 求得。对补码再求补即得到原码。
补码的优点:0的表示唯一;符号位可作为数值参加运算;补码运算的结果仍为补码。
7.2 实数的浮点表示
计算机中通常采用浮点方式表示小数;实数 N 用浮点形式可表示为: N=M×2的E次幂,其中:
E:2的幂,N:阶码;M:N的尾数
7.3 字符在计算机中的表示
字符在计算机中是通过编码表示的;例如:
ASCII码是一种常用的西文字符编码:用7位二进制数表示一个字符,最多可以表示128个字符;
《GB 18030-2005 信息技术 中文编码字符集》是中国国家标准。
8.C++概述
8.1C++的产生和发展
从C语言发展演变而来,最初被称为"带类的C";
1983年正式取名为C++;
1998年11月被国际标准化组织(ISO)批准为国际标准;
2003年10月15日发布第2版C++标准ISO/IEC 14882:2003;
2011年8月12日ISO公布了第三版C++标准C++11,包含核心语言的新机能、扩展C++标准程序库。
2014年8月18日ISO公布了C++14,其正式名称为"International Standard ISO/IEC 14882:2014(E) Programming Language C++"。
C++14作为C++11的一个小扩展,主要提供漏洞修复和小的改进。
8.2 C++的特点
兼容C,支持面向过程的程序设计;支持面向对象的方法;支持泛型程序设计方法。
8.3 命名空间
避免命名冲突,std是C++标准库的命名空间(namespace)名,using namespace std表示打开std命名空间
8.4 C++的字符集和词法记号
字符集
大小写的英文字母:A~Z,a~z
数字字符:0~9
特殊字符:
! # % ^ & * _ + = - ~ < > / \ ‘ “ ; . , : ? ( ) [ ] { } |
词法记号
关键字: C++预定义的单词
标识符: 程序员声明的单词,它命名程序正文中的一些实体
文字: 在程序中直接使用符号表示的数据
分隔符: () {} , : ; 用于分隔各个词法记号或程序正文
运算符(操作符): 用于实现各种运算的符号
空白符:空格、制表符(TAB键产生的字符)、垂直制表符、换行符、回车符和注释的总称
标识符的构成规则
以大写字母、小写字母或下划线(_)开始。
可以由字母,下划线或数字0~9组成。
大写字母和小写字母代表不同的标识符。
不能是C++关键字或操作符。
9.基本的数据类型、常量、变量
9.1 C++能处理的基本类型:整数类型;浮点数类型;字符类型;布尔类型。
9.2 程序中的数据
常量:在源程序中直接写明的数据;其值在整个程序运行期间不可改变。
变量:在程序运行过程中允许改变的数据。
9.3
整数类型
基本的整数类型:int
按符号分:有符号的(signed),无符号的(unsigned)
按照数据范围分:短整数(short)长整数(long)长长整数( long long )
ISO C++标准并没有明确规定每种数据类型的字节数和取值范围,它只是规定它们之间的字节数大小顺序满足:
(signed/unsigned)signed char ≤(unsigned) short int ≤(unsigned) int ≤(unsigned) long int ≤ long long int
字符类型(char)
容纳单个字符的编码;实质上存储的也是整数。
浮点数类型
单精度(float),双精度(double),扩展精度(long double)
字符串类型
采用字符数组存储字符串(C风格的字符串),标准C++类库中的String类(C++风格的字符串)。
布尔类型(bool)
只有两个值:true(真) 、false(假);常用来表示关系比较、相等比较或逻辑运算的结果
9.4 各基本类型的取值范围(会随编译环境改变)
9.5 常量
在程序运行的整个过程中其值始终不可改变的量;直接使用符号(文字)表示的值;例如:12,3.5,'A'都是常量。
整数常量
以文字形式出现的整数;十进制:若干个0-9的数字,但数字部分不能以0开头,正数前边的正号可以省略。八进制:前导0+若干个0-7的数字。十六进制:前导0x+若干个0-9的数字及A-F的字母(大小写均可)。
后缀:后缀L(或l)表示类型至少是long,后缀LL(或ll)表示类型是long long,后缀U(或u)表示unsigned类型。
浮点数常量
以文字形式出现的实数;一般形式:例如,12.5,-12.5等。指数形式:例如,0.345E+2,-34.4E-3,整数部分和小数部分可以省略其一。浮点常量默认为double型,如果后缀F(或f)可以使其成为float型,例如:12.3f。
字符常量
单引号括起来的一个字符,如:'a'、'D'、'?'、'$';
C++转义字符列表(用于在程序中表示不可显示字符)
符串常量
一对双引号括起来的字符序列;在内存中按串中字符的排列次序顺序存放,每个字符占一个字节;在末尾添加 ‘\0’ 作为结尾标记。
通过添加前缀可以改变字符常量或者字符串常量的类型,前缀及其含义如下表所示
9.6 变量
在程序的运行过程中,其值可变的量
变量定义
数据类型 变量名1, 变量名2, ..., 变量名n;
初始化
C++语言中提供了多种初始化方式;
例如:
int a = 0;
int a(0);
int a = {0};
int a{0};
其中使用大括号的初始化方式称为列表初始化,列表初始化时不允许信息的丢失。例如用double值初始化int变量,就会造成数据丢失。
9.7 符号常量
常量定义语句的形式为:
const 数据类型说明符 常量名=常量值;
或:
数据类型说明符 const 常量名=常量值;
const float PI = 3.1415926;
符号常量在定义时一定要初始化,在程序中间不能改变其值。
10.运算符与表达式
10.1 算术运算与赋值运算
算术运算
基本算术运算符
+- * /(若整数相除,结果取整)
%(取余,操作数为整数)
优先级与结合性
先乘除,后加减,同级自左至右
++, --(自增、自减)
赋值运算
将值赋给变量,赋值运算符“=”。
赋值表达式:用赋值运算符连接的表达式
例:
n=5
n = n + 5
n 表达式的值
赋值运算符左边对象被赋值后的值
n 表达式的类型
赋值运算符左边对象的类型(注意是左边)
复合的赋值运算符
+=,-=,=,/=,%=,<<=,>>=,&=,^=,|=
*例如:
a += 3 等价于 a = a + 3
x *= y + 8 等价于 x = x * (y + 8)
10.2 逗号运算、关系运算、逻辑运算和条件运算
逗号运算和逗号表达式
表达式1,表达式2
求解顺序及结果:先求解表达式1,再求解表达式2最终结果为表达式2的值.
例:a = 3 * 5 , a * 4,最终结果为60
关系运算与关系表达式
关系运算是比较简单的一种逻辑运算,其结果类型为 bool,值只能为 true 或false。优先次序为:
例如:a > b,c <= a + b,x + y == 3
逻辑运算与逻辑表达式
逻辑运算符
!(非) &&(与) ||(或)
优先次序: 高 → 低
逻辑运算结果类型:bool,值只能为 true 或false
逻辑表达式
例如:(a > b) && (x > y)
注意:&&与||都具有短路特性
条件运算符与条件表达式
一般形式:表达式1?表达式2:表达式3,其中表达式1必须是bool 类型
执行顺序
先求解表达式1,若表达式1的值为true,则求解表达式2,表达式2的值为最终结果,若表达式1的值为false,则求解表达式3,表达式3的值为最终结果。
条件运算符优先级高于赋值运算符,低于逻辑运算符
先1后2.
10.3 sizeof运算,位运算
sizeof运算
语法形式:sizeof (类型名)或 sizeof 表达式
结果值:“类型名”所指定的类型,或“表达式”的结果类型所占的字节数。
例:sizeof(short) sizeof x
位运算——按位与(&)
用途:将某一位置0,其他位不变。
例如:将char型变量a的最低位置0: a = a & 0xfe; ;(0xfe:1111 1110)
取指定位。
例如:有char c; int a; 取出a的低字节,置于c中:c=a & 0xff; (0xff:1111 1111)
位运算——按位或(|)
用途:将某些位置1,其他位不变。
例如:将 int 型变量 a 的低字节置 1 :a = a | 0xff;
位运算——按位异或(^)
用途举例:使特定位翻转(与0异或保持原值,与1异或取反)
位运算——取反(~)
单目运算符,对一个二进制数按位取反。
位运算——移位(<<、>>)
左移运算(<<):左移后,低位补0,高位舍弃。
右移运算(>>):右移后,低位:舍弃,高位:无符号数:补0,有符号数:补“符号位”
10.4 运算优先级,类型转换
运算符优先级
混合运算时数据类型的转换
一些二元运算符(算术运算符、关系运算符、逻辑运算符、位运算符和赋值运算符)要求两个操作数的类型一致。
在算术运算和关系运算中如果参与运算的操作数类型不一致,编译系统会自动对数据进行转换(即隐含转换),基本原则是将低类型数据转换为高类型数据
将一个非布尔类型的算术值赋给布尔类型时,算术值为0则结果为false,否则结果为true。
将一个布尔值赋给非布尔类型时,布尔值为false则结果为0,布尔值为true则结果为1
将一个浮点数赋给整数类型时,结果值将只保留浮点数中的整数部分,小数部分将丢失。
将一个整数值赋给浮点类型时,小数部分记为0。如果整数所占的空间超过了浮点类型的容量,精度可能有损失
混合运算时数据类型的转换——显式转换
显式类型转换的作用是将表达式的结果类型转换为类型说明符所指定的类型。
语法形式
1.类型说明符(表达式)
2.(类型说明符)表达式
3.类型转换操作符<类型说明符>(表达式)
类型转换操作符可以是:
const_cast、dynamic_cast、reinterpret_cast、static_cast
例:int(z), (int)z, static_cast<int>(z)三种完全等价</int>
11.数据的输入和输出
I/O流
在C++中,将数据从一个对象到另一个对象的流动抽象为“流”。流在使用前要被建立,使用后要被删除。
数据的输入与输出是通过I/O流来实现的,cin和cout是预定义的流类对象。cin用来处理标准输入,即键盘输入。cout用来处理标准输出,即屏幕输出。
从流中获取数据的操作称为提取操作,向流中添加数据的操作称为插入操作。
预定义的插入符和提取符
“<<”是预定义的插入符,作用在流类对象cout上便可以实现项标准输出设备输出。
cout << 表达式 << 表达式...
标准输入是将提取符作用在流类对象cin上。
cin >> 表达式 >> 表达式...
提取符可以连续写多个,每个后面跟一个表达式,该表达式通常是用于存放输入值的变量。例如:
int a, b;cin >> a >> b
常用的I/O流类库操纵符
例:cout << setw(5) << setprecision(3) << 3.1415;
12.选择结构
12.1 if语句
If语句的语法形式
if (表达式) 语句,例:if (x > y) cout << x;
if (表达式) 语句1 else 语句2,例:if (x > y) cout << x;else cout << y;
if (表达式1) 语句1
else if (表达式2) 语句2
else if (表达式3) 语句3
…
else 语句 n
例:输入一个年份,判断是否闰年
#include <iostream> using namespace std; int main() { int year; bool isLeapYear; cout << "Enter the year: "; cin >> year; isLeapYear = ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)); if (isLeapYear) cout << year << " is a leap year" << endl; else cout << year << " is not a leap year" << endl; return 0; }
嵌套的if结构
例:输入两个整数,比较两个数的大小
#include<iostream> using namespace std; int main() { int x, y; cout << "Enter x and y:"; cin >> x >> y; if (x != y) if (x > y) cout << "x > y" << endl; else cout << "x < y" << endl; else cout << "x = y" << endl; return 0; }
12.2 switch语句
语法形式
执行顺序
以case中的常量表达式值为入口标号,由此开始顺序执行。因此,每个case分支最后应该加break语句。
注意
case分支可包含多个语句,且不用{ }。
表达式、判断值都是int型或char型。
如果若干分支执行内容相同可共用一组语句
例:
#include <iostream> using namespace std; int main() { int day; cin >> day; switch (day) { case 0: cout << "Sunday" << endl; break; case 1: cout << "Monday" << endl; break; case 2: cout << "Tuesday" << endl; break; case 3: cout << "Wednesday" << endl; break; case 4: cout << "Thursday" << endl; break; case 5: cout << "Friday" << endl; break; case 6: cout << "Saturday" << endl; break; default: cout<<"Day out of range Sunday .. Saturday"<< endl; break; } return 0; }
注意:不加break会执行第一个执行语句后面的所有语句!
13.循环结构
13.1 while语句
语法形式
执行顺序
先判断表达式的值,若为 true 时,执行语句
例:求自然数1~10之和
#include <iostream> using namespace std; int main() { int i = 1, sum = 0; while (i <= 10) { sum += i; //相当于sum = sum + i; i++; } cout << "sum = " << sum << endl; return 0; }
13.2 do-while语句
语法形式
do 语句 // 可以是复合语句,其中必须含有改变条件表达式值的语句。
while (表达式)
执行顺序
先执行循环体语句,后判断条件。
表达式为 true 时,继续执行循环体。
例:输入一个数,将各位数字翻转后输出。
#include <iostream> using namespace std; int main() { int n, right_digit, newnum = 0; cout << "Enter the number: "; cin >> n; cout << "The number in reverse order is "; do { right_digit = n % 10; cout << right_digit; n /= 10; /*相当于n=n/10*/ } while (n != 0); cout << endl; return 0; }
13.3 for语句
语法形式
for语句的另一种形式:(多同于容器)范围for语句:
for (声明:表达式)
语句
例:输入一个整数,求出它的所有因子
#include <iostream> using namespace std; int main() { int n; cout << "Enter a positive integer: "; cin >> n; cout << "Number " << n << " Factors "; for (int k = 1; k <= n; k++) if (n % k == 0) cout << k << " "; cout << endl; return 0; }
13.4 嵌套的控制结构、其他控制语句
例:输入一系列整数,统计出正整数个数i和负整数个数j,读入0则结束。
#include <iostream> using namespace std; int main() { int i = 0, j = 0, n; cout <<"Enter some integers please (enter 0 to quit):" << endl; cin >> n; while (n != 0) { if (n > 0) i += 1; if (n < 0) j += 1; cin >> n; } cout << "Count of positive integers: " << i << endl; cout << "Count of negative integers: " << j << endl; return 0; }
其他控制语句
break语句
使程序从循环体和switch语句内跳出,继续执行逻辑上的下一条语句。不宜用在别处。
continue 语句
结束本次循环,接着判断是否执行下一次循环。
goto 语句
使程序的执行流程跳转到语句标号所指定的语句。不提倡使用
14. 自定义类型
类型别名:为已有类型另外命名
typedef 已有类型名 新类型名表
例:
typedef double Area, Volume;
typedef int Natural;
Natural i1,i2;
Area a;
Volume v;
using 新类型名 = 已有类型名;
例:
using Area = double;
using Volume = double;
枚举类型
定义方式:将全部可取值一一列举出来。
语法形式:
enum 枚举类型名 {变量值列表};
例:enum Weekday {SUN, MON, TUE, WED, THU, FRI, SAT};
默认情况下:SUN=0,MON=1,TUE=2,......,SAT=6
C++包含两种枚举类型:
不限定作用域枚举类型:
enum 枚举类型名 {变量值列表};
限定作用域的enum类将在后续介绍。
不限定作用域枚举类型说明:
枚举元素是常量,不能对它们赋值
例如有如下定义
enum Weekday {SUN, MON, TUE, WED, THU, FRI, SAT};
不能写赋值表达式:SUN = 0
枚举元素具有默认值,它们依次为: 0,1,2,......。
也可以在声明时另行指定枚举元素的值,如:
enum Weekday{SUN=7,MON=1,TUE,WED, THU,FRI,SAT};//后面没有的话就自增一
也可以在声明时另行指定枚举元素的值;
注意:
枚举值可以进行关系运算。
整数值不能直接赋给枚举变量,如需要将整数赋值给枚举变量,应进行强制类型转换。
枚举值可以赋给整型变量。
例:设某次体育比赛的结果有四种可能:胜(WIN)、负(LOSE)、平局(TIE)、比赛取消(CANCEL),编写程序顺序输出这四种情况。
#include <iostream> using namespace std; enum GameResult {WIN, LOSE, TIE, CANCEL}; int main() { GameResult result; enum GameResult omit = CANCEL; for (int count = WIN; count <= CANCEL; count++) { result = GameResult(count); if (result == omit) cout << "The game was cancelled" << endl; else { cout << "The game was played "; if (result == WIN) cout << "and we won!"; if (result == LOSE) cout << "and we lost."; cout << endl; } } return 0; }
auto类型与decltype类型
auto:编译器通过初始值自动推断变量的类型
例如:auto val = val1 + val2;
如果val1+val2是int类型,则val是int类型;
如果val1+val2是double类型,则val是double类型。
decltype:定义一个变量与某一表达式的类型相同,但并不用该表达式初始化变量
例如:decltype(i) j = 2;