计算概论 A 课程程序设计部分 C++ 语言基本成分 数据成分 李戈 北京大学信息科学技术学院软件研究所 lige@sei.pku.edu.cn
再谈, 我们的进度安排 我们的学习过程 感性理性函数指针等 数据成分运算成分控制成分数组字符串 结构化的程序递归 传统学习过程 数据类型与表达式 输入输出 关系运算 控制语句 函数数组指针结构体 作业练习 感性认识作业练习 ( 以抄程序为主 ) 正常作业练习 ( 要求独立写程序 )
程序设计语言的构成 语言的种类千差万别, 但是, 一般说来, 基本成分不外四种 : 数据成分, 用以描述程序中所涉及的数据 ; 运算成分, 用以描述程序中所包含的运算 ; 控制成分, 用以表达程序中的控制构造 ; 传输成分, 用以表达程序中数据的传输 ; 计算机科学技术百科全书
C 程序设计语言的基本构成 数据成分
0x0012FF70 0x0012FF71 0x0012FF72 0x0012FF73 0x0012FF74 0x0012FF75 0x0012FF76 0x0012FF77 0x0012FF78 0x0012FF79 0x0012FF7A 0x0012FF7B 0x0012FF7C 0x0012FF7D 0x0012FF7E 地址 请这样来想象内存 存储空间单位 2 10 =1024 1B (Byte) = 8 b (bit) 1KB = 1024Byte 1MB = 1024KB 1GB= 1024MB 1TB = 1024GB 1PB = 1024TB
#include<iostream> using namespace std; int main() { int number[45] = {78, 56, 69, 31, 36, 67, 31, 47, 69, 34, 45, 74, 61, 82, 43, 41, 76, 79, 81, 66, 54, 50, 76, 51, 53, 28, 74, 39, 45, 61, 52, 41, 43, 75, 78, 84, 72, 51, 43, 64, 75, 81, 69, 55, 74 }; int max = 0; int i = 0; for (i = 0; i < 45; i++) { if (number[i] > max) max = number[i]; } cout << "The Maximal Number is:" << max; return 0; }
变量 : 先定义再使用 值可以变化的量 变量的定义格式 ( 变量类型 )( 变量标识符 ); int Max; int Max = 0; char character; char character = A ; double Result = 12.345 ;
请这样来想象内存 0x0012FF70 0x0012FF71 0x0012FF72 0x0012FF73 0x0012FF74 0x0012FF75 0x0012FF76 0x0012FF77 0x0012FF78 0x0012FF79 0x0012FF7A 0x0012FF7B 0x0012FF7C 0x0012FF7D 0x0012FF7E 地址
C/C++ 程序中的数据类型
C/C++ 程序中的数据类型
整型数据的分类 整型 基本型 int 短整型 长整型 short short int long long int
整型数据的分类 整型 内存空间 基本型 int 32bit 短整型 short short int 16bit 长整型 long long int 32bit 注 C 标准没有具体规定以上各类数据所占内存字节数, 只要求 long 型数据长度不短于 int 型,short 型不长于 int 型
如何知道某种类型的数占多少字节? sizeof 运算符 用于计算某种类型的对象在内存中所占的字节数 #include <iostream> using namespace std; int main() { cout << "sizeof(short int)=" << sizeof(short int) << endl; cout << "sizeof(int)=" << sizeof(int) << endl; cout << "sizeof(long int)=" << sizeof(long int) << endl; return 0; }
整型数据的分类 基本型 短整型 长整型 int signed int 有符号 short short int signed short signed short int long long int signed long signed long int 无符号 unsigned int unsigned short unsigned short int unsigned long unsigned long int
整型数据的分类 基本型 短整型 长整型 int signed int 有符号 short short int signed short signed short int long long int signed long signed long int 无符号 unsigned int unsigned short unsigned short int unsigned long unsigned long int
unsigned int i = 123; signed vs. unsigned 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 1 1 signed int i = -123; 32bit 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 1 0 1 32bit
unsigned int i = 123; signed vs. unsigned 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 1 1 32bit 原码 取反 +1 补码 signed int i = -123; 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 1 0 1 32bit
signed int i = -123; 打印一个数的十六进制表示 F F F F F F 8 5 #include <iostream> using namespace std; int main() { int a = -123; cout << hex << a << endl; return 0; }
signed int i = -123; 打印一个数的八进制 3 7 7 7 7 7 7 7 6 0 5 #include <iostream> using namespace std; int main() { int a = -123; cout << oct << a << endl; return 0; }
以不同的方式输出整数 #include <iostream> using namespace std; int main() { int a = -123; cout << hex << a << endl; cout << oct << a << endl; cout << dec << a << endl; return 0; }
把一个十六进制数输入程序 32bit 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 1 0 1 7 F F F F F 8 5 #include <iostream> using namespace std; int main() { int a = 0x7FFFFF85; cout << dec << a << endl; cout << oct << a << endl; return 0; }
把一个八进制数输入程序 signed int i = -123; 32bit 3 7 7 7 7 7 7 7 6 0 5 #include <iostream> using namespace std; int main() { int a = 037777777605; cout << dec << a << endl; cout << hex << a << endl; return 0; }
unsigned int i = Max; Max & Min 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 signed int i = Max; 32bit 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 32bit
unsigned int i = Max; Max & Min 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 signed int i = -123; 32bit #include <iostream> using namespace std; int main() { 32bit unsigned int a = 0xFFFFFFFF; cout << dec << a << endl; return 0; } 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 1 0 1
Max & Min signed int i = Max; 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 32bit #include <iostream> using namespace std; int main() { signed int a = 0x7FFFFFFF; cout << dec << a << endl; return 0; }
Max & Min signed int i = Min; 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 Right? No! #include <iostream> using namespace std; int main() { signed int a = 0x7FFFFFFF; a = a + 1; cout << dec << a << endl; return 0; }
Max & Min signed int i = Max; 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 32bit 2147483648 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 32bit 1 当最高位是 1 其他位为 0(-0) 时, 最高位既表示负号, 也表示整数最高位 1. = -2147483648
整型数据的范围 VC 中每种类型所占内存空间和表示的范围 : 总结 : 其实, 就用 int 就行了!
使用须知 #include <iostream> using namespace std; int main() { int a; cout<<a<<endl; return 0; } 养成习惯吧, 直到不再需要定变量的那一天!
C/C++ 程序中的数据类型
浮点型 浮点型 = 实型 浮点型长度有效位范围 float 32bit 7 位 -3.4*10 38 ~3.4*10 38 double 64bit 15 位 -1.7*10 308 ~1.7*10 308 long double 64bit 15 位 -1.7*10 308 ~1.7*10 308
#include <iostream> using namespace std; int main() { float a = 3.141592653589793238462643383279502884197169399375 1058209749445923078164062862089986280348253421170679; 感受浮点型 double b=3.141592653589793238462643383279502884197169399375 1058209749445923078164062862089986280348253421170679; } long double c =3.14159265358979323846264338327950288419716939 93751058209749445923078164062862089986280348253421170679; cout << a << endl; cout << b << endl; cout << c << endl; return 0;
#include <iostream> #include <iomanip> 感受浮点型 using namespace std; int main() { float a = 3.141592653589793238462643383279502884197169399375 1058209749445923078164062862089986280348253421170679; double b=3.141592653589793238462643383279502884197169399375 1058209749445923078164062862089986280348253421170679; long double c =3.14159265358979323846264338327950288419716939 93751058209749445923078164062862089986280348253421170679; cout << setprecision(100) << a << endl; cout << b << endl; cout << c << endl; return 0; }
浮点数的表示 1 位符号位 8 位指数位 ( 含 1 位符号位 ) log 10 (2 127 ) 38. 23 23 位二进制小数位 ( 默认为 1.XXXX) log 10 (2 24 ) 7. 225
浮点数的表示 1 位符号位 8 位指数位 ( 含 1 位符号位 ) log 10 (2 127 ) 38. 23 23 位二进制小数位 ( 默认为 1.XXXX) log 10 (2 24 ) 7. 225 IEEE Standard for Floating-Point Arithmetic (IEEE 754) http://grouper.ieee.org/groups/754/ ISO/IEC/IEEE 60559:2011 - Information technology - Microprocessor Systems - Floating-Point arithmetic http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=57469
使用须知 #include <iostream> #include <iomanip> using namespace std; int main() { float a, b; a = 123456.789e5; b = a + 20; cout << setprecision(20) << b << endl; return 0; } 避免将一个很大的数与一个很小的数直接相加或相减, 否则就会 丢失 小的数
C/C++ 程序中的数据类型
字符型数据 一个字符型占一个字节 ; 0 1 0 0 0 0 0 0 其值可以是任何 可以出现 在 C/C++ 语言中的字符 ; 最多可以表示 个字符 例如 char a = @ ; @ 64 01000000
使用须知 #include <iostream> #include <iomanip> 由于存储类型和整型相同 using namespace std; 可以与整型数据相互赋值 int main() { 可以和整数一样进行运算 char a = 64; int b = Z'; int c = b - a; char d = 6 + 256; cout << a << " " << b << " " << c << " " << d << endl; return 0; }
使用须知 #include <iostream> using namespace std; int main() { cout << "This is the first line! \n"; cout << '\a' << '\\' << '\n'; return 0; }
C/C++ 程序中的数据类型
0 0 0 0 0 0 0 1 布尔型 用于存储 真 和 假 的变量 占一个字节 其值只能为 1 或 0 1 代表 True 0 代表 False 赋给布尔型变量的值 可以赋任何值给它, 但 赋 0 存 0, 表示 False 赋非零存 1, 表示 True
布尔型 #include <iostream> using namespace std; int main() { bool b1 = true, b2 = false; cout << "b1 = true 时,b1 = " << b1 << endl; cout << "b2 = false 时,b2 = " << b2 << endl; b1 = 7 > 3; b2 = -100; cout << "b1 = 7 > 3 时,b1 = " << b1 << endl; cout << "b2 = -100 时,b2 =" << b2 << endl; return 0; }
C/C++ 基本数据类型
所有 数 都是有类型的 常量也一样!
C/C++ 中的常量 常量 : 在程序运行过程中, 其值保持不变的量 字面常量 -1,0,123,4.6, -1.23; 符号常量 用一个标识符代表一个常量的, 称为符号常量 #include <iostream> using namespace std; int main() { const float PI = 3.14159f; float r, area; cin >> r; area = r * r * PI; } cout << "Area = " << area; return 0;
整型常量的后缀 常量有类型吗? n = 10000L; // 长整型常量 m = -0x88abL; // 长整型十六进制常量 k = 10000U; // 无符号整型常量 i = 07777LU; // 无符号长整型八进制常量 浮点型常量的后缀 x = 3.1415F // 单精度浮点型常量 y = 3.1415L // 长双精度浮点型常量 说明 : 浮点型常量默认为 double 型 ; U, L, F 均可以小写 ;
变量定义 须知
什么是标识符 关于 C/C++ 程序的标识符 用来标识符号常量名 变量名 函数名 数组名 类型名 文件名的有效字符序列称为标识符 (identifier) C++ 语言规定 : 标识符只能由字母 数字和下划线三种字符组成, 且第一个字符必须为字母或下划线, 且不可与保留字 ( 关键字 ) 相同 合法的标识符 : sum,average, -total, class, day, month, student-name,tan,lotus-1-2-3,basic, li-ling 不合法的标识符 : M.D.John, 123,#33,3D64,a>b
C++ 语言的保留字 C++ 环境下的 63 个保留字 : asm do if return typedef auto double inline short typeid bool dynamic_cast int signed typename break else long sizeof union case enum mutable static unsigned catch explicit namespace static_cast using char export new struct virtual class extern operator switch void const false private template volatile const_cast float protected this wchar_t continue for public throw while default friend register true delete goto reinterpret_cast try
匈牙利命名法 关于变量的命名 由 Microsoft 著名开发人员 Excel 主要设计者 Charles Simonyi 在其博士论文中提出 1. 以一个或者多个小写字母开头, 来指定数据类型 2. 其后是一个或者多个第一个字母大写的单词, 指出变量的用途 如 :chgrade; nlength; bonoff; strstudentname;
关于变量的命名 驼峰命名法 ( 骆驼式命名法 ) 由一个或多个单字连结在一起 ; 第一个单词以小写字母开始 ; 第二个单词的首字母大写或每一个单词的首字母都采用大写字母 ; myfirstname, mylastname, nextstudentname, intcount, printemployeepaychecks()