主要内容 C++ 语言概述 C++ 的发展 C++ 源程序结构与书写规范 C++ 编译器和集成开发环境 C++ 编程基础 数据的简单输入输出 2 C++ 语言概述 C++ 语言概述 C++ 的发展 - C++ 是从 C 语言发展演变而来, 可以看成是 C 的超集 - 1980 年由 Bjarne Stroustrup 开发创建 - 1983 年正式取名为 C++,1989 年开始 C++ 的标准化工作 - 1994 年制定了 ANSI C++ 标准草案 - 1998 年由 ISO 批准为国际标准, 通称 C++98 - 目前的 C++ 最新标准是 C++14(2014 年 8 月通过 ) ( 注 :C++17 基本上已经完成, 并开始 C++20 的制定工作 ) ANSI - American National Standards Institute / 美国国家标准协会 ISO - International Organization for Standardization / 国际标准化组织 3 http://isocpp.org/std/status 关于 C 和 C++ 的更多介绍见课程主页的相关链接 4 一个简单的 C++ 程序 int main() C++ 源程序结构 : { cout << "Hello!" << 一个 endl; C++ 源程序由一个或多个源文件组成 cout << "Welcome to 每个源文件可由一个或多个函数组成 C++! " << endl; 一个源程序有且只能有一个 main 函数, 即主函数 程序执行从 main 开始, 在 main 中结束 源程序中可以有预处理命令, 通常应放在源文件或源程序的最前面 一行可以写多个语句, 一个语句可以分几行书写 注 : 所有标点符号必须在英文状态下输入 5 C++ 程序书写规范 每个说明和每条语句都必须以分号 ; 结尾, ( 预处理命令, 函数头和花括号 之后除外 ) 标识符, 关键字之间必须至少加一个空格表示间隔, 若已有明显的间隔符, 也可不再加空格来间隔 习惯用小写字母, 区分大小写书写漂亮的程序 : 注释 :// 和 /* */ 为注释符 { 要对齐 常用锯齿形书写格式 一行写一个语句 一个语句写一行 所有标点符号必须在英文状态下输入 使用 TAB 缩进 有合适的空行 有足够的注释 6 程序分析 C++ 编译器 // 预处理指令, 载入头文件 // 使用标准的命名空间 int main() 主函数 { cout : 标准输出, 通常指屏幕 cout << "Hello!" << endl; cout << "Welcome to C++! " << endl; << : 插入 endl : 换行并刷新流 7 编译器 编译器就是将 高级语言 翻译为 机器语言 的程序 一个现代编译器的主要工作流程 : 源代码编译目标代码链接可执行程序 常见的 C++ 编译器 Visual C++ Windows 平台上最流行的编译器, 集成在 Visual Studio 中 GNU C++ 开源免费,Linux/Unix 平台上的首选, 非常优秀的编译器 Intel C++ Intel 的编译器, 对自家硬件的支持很好,Win/Linux 都有相应版本 8
IDE IDE ( 集成开发环境 ) Integrated Development Environment 用于程序开发的应用程序 / 软件, 一般包括代码编辑器 编译器 调试器和图形用户界面工具等 常见的 C++ 集成开发环境 - Visual Studio :Windows 平台上最流行的商业 C++ 集成开发环境 - Dev C++ : 小巧, 免费,win 下的 gcc, 非常适合学习 C++ - Code::Blocks : 开放源码的全功能跨平台集成开发环境, 免费 C++ 字符集 : 标识符, 关键字 C++ 数据类型与类型转换 变量 常量 符号常量 运算符 运算优先级 语句与表达式 9 10 字符集 C++ 字符集 字母 ( 大写和小写, 共 52 个 ) 数字 (0 到 9 共 10 个 ) 空白符 ( 空格符 制表符 换行符 ) 标点和特殊字符! # % ^ & * () [] { _ + = ~ < > / \ ' " ;., 注 : 这里的标点符号都是指在英文状态下的标点 11 词法记号 / 词汇 标识符 : 用来标识变量名 函数名 对象名等的字符序列 - 由字母 数字 下划线组成, 第一个字符必须是字母或下划线 - 区分大小写, 不能用关键字 - C++ 不限制标识符长度, 实际长度与编译器有关, 通常不要超过 32 个 - 命名原则 : 见名知意 不宜混淆 关键字 : 具有特定意义的字符串, 通常也称为保留字 - 类型说明符 语句定义符 ( 控制命令 ) 预处理命令等 运算符 ( 详见后面介绍 ) 分隔符 : 逗号 冒号 分号 空格 ( ) { 注释符 : 以 /* 开头并以 */ 结尾 ; 或 // 开头 文字 : 直接用字符表示的数据, 即常量, 如数字 字符串等 12 C++ 数据类型 C++ 数据类型 基本类型 整型 实型 自定义数据类型或扩展数据类型或派生数据类型或导出数据类型 字符型 (char) 布尔型 (bool) 整型 (int) 短整型 (short) 长整型 (long) 单精度 (float) 双精度 (double) 数组型 指针型 枚举型 类 无符号 (unsigned) 有符号 13 基本数据类型 类型 关键字 所占字节数 表示范围 整型 short 2-2 15 ~ 2 15-1 int 2 / 4-2 15 ~ 2 15-1 / -2 31 ~ 2 31-1 long 4 / 8-2 31 ~ 2 31-1 / -2 63 ~ 2 63-1 unsigned int 2 0 ~ 2 16-1 unsigned short 2 0 ~ 2 16-1 unsigned long 4 0 ~ 2 32-1 实型 float 4 (6-7) 10-38 ~ 10 38 double 8 (15-16) 10-308 ~ 10 308 long double 16 (18-19) 10-4932 ~ 10 4932 ex02_sizeof.cpp 布尔型 bool 1 true, false 字符型 char 1 C++ 标准没有规定每种数据类型的字节数和表示范围, 只规定大小顺序, 具体 长度由处理器和编译器决定 更长的整型 :long long / unsigned long long 14 数据类型的转换 数据类型的转换 自动转换 / 隐式转换 不同类型的数据进行运算, 需先转换成同一类型 转换按数据长度增加的方向进行, 以保证精度不降低 所有的浮点运算都是以双精度进行的 char 型和 short 型参与运算时, 必须先转换成 int 型 赋值号两边的数据类型不同时, 右边的类型将转换为左边的 char short int unsigned long unsigned long float double int i=2; double x=3.2, y; y=i+x; ex02_datetype_01.cpp 强制转换 / 显示转换类型说明符 ( 表达式 ) // C++ 风格 ( 类型说明符 ) 表达式 // C 风格 将表达式的值转换成指定的数据类型 int i=2, a=3; double y, z; y=double(i)/a; // y=static_cast<double>(i)/a z=double(i/a); 注 : 类型转换不会改变变量的数据类型! 15 16
数据类型的转换 转换规则 浮点型转整型 : 直接丢掉小数部分 字符型转整型 : 为字符的 ASCII 码 整型转字符型 :ASCII 码对应的字符 int i; char a; i=3.6; cout << "i=" << i << endl; i= 3.6; cout << "i=" << i << endl; i='m'; cout << "i=" << i << endl; a=90; cout << "a=" << a << endl; 变量 用于存储数据, 值可以改变 变量名 : 要求与标识符相同 变量类型 : 整型 实型 字符型 布尔型 变量必须先声明, 后使用 变量的声明 数据类型变量名列表 ; 变量的初始化 : 有两种方式 ( 赋值号和小括号 ) int i, j, k=0; double x(3.1415); char c; 17 18 常量 ( 常数 ) 在程序运行中值不能改变的量 整型常量 : 整数, 后面加 l 或 L 表示长整型, 后面加 u 或 U 表示无符号整型 实型常量 : 缺省为双精度实数, 后面加 f 或 F 表示单精度, 加 l 或 L 表示 long double 字符型常量 : 用单引号括起来的单个字符和转义字符 字符串常量 : 用双引号括起来的字符序列 布尔常量 :true 和 false 符号常量 符号常量 : 用标识符代表常量 const 数据类型标识符 = 常量值 ; const float PI=3.1415926; 符号常量在声明时必须初始化 符号常量的值在程序中不能被修改 ( 不能重新赋值 ) 123, 456, 123L, 456U; 1.2, 1.2F, 1.2L, 1.2e8, 1.2e8F, 1.2e 8L 'M', 'A', 'T', 'H', '?', '$' "MATH@ECNU" 19 20 typedef typedef: 为一个已有的数据类型另外命名 ( 取别名 ) typedef 已有类型名新类型名表 ; 可以同时取多个别名 typedef double area, volume; typedef int natural; natural i, j; area s; volume v; 21 运算符 算术运算符 :+ * / % ++ ( 自增 ) ( 自减 ) 赋值运算符 : = += = *= /= %= &= = ^= >>= <<= 逗号运算符 :, ( 把若干表达式组合成一个表达式 ) 求字节数运算符 :sizeof ( 计算数据类型所占的字节数 ) 关系运算符 : 用于比较运算,> < == >= <=!= 逻辑运算符 : 用于逻辑运算,&&! 条件运算符 : 是一个三目运算符, 用于条件求值 (? : ) 指针运算符 :* ( 取内容 ) & ( 取地址 ) 位运算符 : 按二进制位进行运算 & ^ ( 异或 ) ~ ( 取反 ) << ( 左移 ) >> ( 右移 ) 22 赋值运算 赋值与逗号运算 标准赋值语句 : 变量 = 表达式 自增自减 ( 前置和后置 ) ++ -- x++; ++x; y=x++*x; y=++x*x; x = x+1; x = x+1; 前置 : 先自增自减, 然后使用后置 : 先使用, 然后自增自减 x = 3; y=x*x; x=x+1; x=x+1; y=x*x; x = y = 3; y = 3; x = y; 注 : 这种方式不能用于变量初始化! int i=10, j, k; j = i++; k = ++i; ex02_datatype_02.cpp 不要在同一语句中包含一个变量的多个 ++ 或, 因为它们的解释在 C/C++ 标准中没有规定, 完全取决于编译器的个人行为 23 其他常见赋值运算符 += -= *= /= %= x += 3; x /= 3; 逗号运算符 : 表达式 1, 表达式 2 x = x+3; x = x/3; - 先计算表达式 1 的值, 再计算表达式 2 的值, 并将表达式 2 的值作为整个表达式的结果 int a, b, c, d, e; a = 5; b = a + 3; a = a + (c=6); d = e = f = a; e *= d; f /= c 2; ex02_datatype_03.cpp int a=2, b; 注意运算的优先级! a = 3*5, a+10; b = (3*5, a+10); ex02_datatype_04.cpp 24
位运算 位运算符 : 按二进制位进行运算 & ^ ( 异或 ) ~ ( 取反 ) << ( 左移 ) >> ( 右移 ) short a=5, b=14; a : 00000000 00000101 short c1,c2,c3,c4,c5,c6; b : 00000000 00001110 c1 = a & b; c2 = a b; C3 = ~ a; C4 = a ^ b; C5 = a << 3; C6 = a >> 2; a&b a b ~ a a ^ b a<<3 : 00000000 00000100 : 00000000 00001111 : 11111111 11111010 : 00000000 00001011 : 00000000 00101000 a>>2 : 00000000 00000001 ex02_datatype_05.cpp / 补码 运算优先级 详见教材或课程主页 () ++( 后置 ) ( 后置 ) 强制类型转换! ++( 前置 ) ( 前置 ) +( 正号 ) ( 负号 ) * / % + < <= > >= ==!= && 赋值 (= += = *= /= 等 ) 逗号运算 (, ) 其他运算符将会再后面的讲义中陆续介绍 25 26 常用数学函数 需加入 cmath 头文件 : #include <cmath> abs(x) exp(x) log(x) log10(x) sqrt(x) pow(x,y) x e x ln x lg x x x y min(x,y) max(x,y) 取整函数 :ceil, floor, round, trunc 最小值最大值 ex02_math.cpp 三角函数 :sin, cos, tan, asin, acos, atan 双曲三角函数 :sinh,cosh,tanh,asinh,acosh,atanh 语句 程序由语句构成,C++ 的语句包括 : 空语句 ( 只有分号 ) 声明语句 表达式语句 ( 赋值表达式 ) 复合语句 ( 将多个语句用 { 括起来组成的一个语句 ) 选择语句 循环语句 跳转语句...... 27 28 表达式语句 表达式与表达式语句 表达式 : 运算符连接常量 变量 函数所组成的式子 表达式语句 : 表达式 ; a+b*c a+b*c; 表达式中的运算符含赋值运算符 a+(b=3)*c 表达式可以包含在其它表达式中, 但表达式语句不行! a+(b=3;)*c 赋值表达式的值是赋值号左边变量的值 sizeof 求字节数运算符 : sizeof( 数据类型 ) 返回数据类型对应的变量所占的字节数 sizeof( 表达式 ) 返回表达式结果的数据类型对应的变量所占的字节数 int a, b, c; a = sizeof(int); b = sizeof(3 + 5); c = sizeof(3.0l + 5); ex02_datatype_06.cpp 29 30 简单的输入输出 输出到标准输出设备 ( 显示器 ):cout x = 3.14159; 输出 :cout 输入 :cin 操作符 : 控制输出的格式 几个常用转义字符 () \a 响铃 \r 回车 \\ 反斜杠 \b 退后一格 \t 水平制表符 \' 单引号 \n 换行 \v 垂直制表符 \" 双引号 cout << "The double quotation mark is \" \n"; 31 x = 3.14159; ex02_io_01.cpp y = 2.71828; cout << "x=" << x << "\t y=" << y << "\n"; 32
简单的输入输出 从标准输入设备 ( 键盘 ) 中输入 :cin cin >> x ; 在输入语句前通常需要输出一些提示信息 cout << "Please input x: "; cin >> x ; ex02_io_02.cpp 需加入头文件 iomanip 含义 endl 插入换行符, 并刷新流 setw(n) 设置域宽 setfill( 字符 ) 设置填充 fixed 使用定点方式输出 scientific 使用指数形式 setprecision(n) 设置输出的有效数字个数 ; 若在 fixed 或 scientific 后使用, 则设置小数位数 left 左对齐 right 右对齐 ( 缺省方式 ) 33 34 的作用范围 : setw : 只对紧随其后的输出起作用 其它 : 直至下一个同类型命令为止 详细使用方法参见第七讲 举 贷款问题 银行贷款问题已知贷款总额, 贷款年利率和贷款年限, 计算每月需偿还的金额和偿还总额 double x=3.14159, y=12.3456789; cout << setprecision(5); cout << "y=" << y << endl; cout << fixed; cout << setprecision(5); cout << "y=" << y << endl; ex02_io_03.cpp cout <<left; cout << "x=" << setw(20) << x << "MATH" <<endl; cout << setw(20) << "x=" << x << "MATH" <<endl; 35 等额本息方式 : L : 贷款总额 r m : 月利率 y: 还贷年限 等额本金方式 R : 已偿还的本金总额 每月需偿还的金额 : L r (1 r ) 12 y m m 12 y (1 rm ) 1 每月需偿还的金额 : L ( L R) r 12 y m 36 举 贷款问题 ( 等额本息 ) ex02_loan.cpp #include <cmath> // 数学函数 int main() { double Loan, rate_year, rate_month, year; double payment_month, payment_total; cout << "input loan amount: " ; cin >> Loan; cout << "input yearly interest rate: "; cin >> rate_year; rate_month = rate_year/1200; cout << "input number of years: "; cin >> year; double vtmp = pow(1+rate_month,12*year); // 计算每月还款金额 payment_month=load*rate_month*vtmp/(vtmp 1); payment_total=payment_month*year*12; cout << "Monthly payment: " << payment_month << ", "; cout << "Total payment: " << payment_total; 37 举 显示时间 显示系统当前时间头文件 ctime 中函数 time(0) 或 time(null) 返回当前时间与 1970 年 1 月 1 日零时的时间差 ( 格林威治时间, 以秒为单位 ) 北京时间 : 格林威治时间 + 8 小时 #include <ctime> int main() { long Second, Minute, Hour; Second = time(null); Minute = Second / 60; Hour = Minute / 60; cout << " 当前北京时间是 "; cout << (Hour+8) % 24 << ":" << Minute % 60 << ":" << Second % 60 << endl ; ex02_showtime.cpp 38 课后练习 课后练习 ( 自己练习 ) 见课程主页 上机作业 1 编写程序, 从键盘读入圆柱体的半径和高度, 计算其表面积和体积, 并将结果在屏幕上输出, 取 3.14159265 ( 程序取名 hw02_01.cpp) 2 银行提供两种 5 年定期存款方式 : 一年期方式 : 年利率 10%, 每年到期后, 自动将本年度的利息加入本金中 ; 五年期方式 : 年利率 11%, 五年后本金和利息一起归还储户 编写程序, 分别以两种方式存入 100 万元, 输出五年后各得多少? ( 程序取名 hw02_02.cpp) 3 修改程序 ex02_showtime.cpp, 使得输出的时 分 秒都占两个位置, 如 :14 点 25 分 10 秒显示为 14:25:10,9 点 8 分 5 秒显示为 09:08:05 ( 程序取名 hw02_03.cpp) 39 40