• 1. 1.2 面向对象程序设计基础 软件设计有两种思想. 面向过程的设计:在设计过程中存在局部变量或者全局变量. 面向过程设计是以函数为中心;1
  • 2. 1.2 (继续 )OOP 是以对象为中心. 一个对象包含着相关信息以及处理信息的方法. 2
  • 3. 1.3 cout 对象 用于显示信息到屏幕. cout 对象被称为标准输出对象. 例: cout << "Programming is great fun!"; <<:流插入操作符. 3
  • 4. 1.3 cout 对象 (续)endl 和 ‘\n’. 例: cout << "Programming is great fun!"<
  • 5. 1.4 标识符尽量选择有含义的英文单词. 例: int x; int itemsOrdered; int items_ordered; 关键字. 表 1-1. 5
  • 6. 1.5 布尔类型 布尔型变量用于表示“真”或“假”. 例:#include void main(void) { bool boolValue; boolValue = true; cout << boolValue << endl; boolValue = false; cout << boolValue << endl; } 6
  • 7. 1.6 注释 良好的注释习惯是一个优秀程序员所必备的素质. C语言的注释方式: /* */ C++ 的注释方式: // 例如一个好的注释风格:7
  • 8. /* PROGRAM: PAYROLL. CPP This program calculates company payroll Last modification: 3/30/03 */ #include void main(void) { float payRate; // payRate holds hourly pay rate float hours; // hours holds hours worked int empNum; // empNum holds employee number // The remainder of this program is left out. } 8
  • 9. 9
  • 10. 1.6 注释 (续)注释主要用于提示或备忘,不需长篇累牍,应简明扼要. 反例:#include // Need the iostream.h file // because the program uses cout. void main(void) // This is the start of function main. { float payRate; // payRate is a float variable. // It holds the hourly pay rate. …… }10
  • 11. 1.7 编程风格编程风格指的是程序员使用标识符、空格、TAB键、空行、标点、缩进、注释等的方式,是体现一个程序员水平的重要方面. 例. 不好的风格:11
  • 12. #include void main(void){ float shares=220.0; float avgPrice=10.67f; cout <<"There were "<
  • 13. 1.8 cin 对象 cin 对象从键盘获取信息. cout: 标准输入输出对象 cin: 标准输入对象 注: 需包含iostream.h 13
  • 14. #include void main(void) { int length, width, area; cout << "What is the length of the rectangle? "; cin >> length; cout << "What is the width of the rectangle? "; cin >> width; area = length * width; cout << "The area is" << area << ".\n"; } 14
  • 15. 1.8 cin 对象(续)cin 可以读取不同类型的多个变量. 例:int whole; float fractional; char letter;   cin >> whole >> fractional >> letter; 注意:容易出错15
  • 16. 1.8 cin 对象(续)读取字符串: char name [21];  cin >> name; 警告: 数组溢出!!!16
  • 17. 1.9 格式化输出 The cout 对象提供带格式的数据输出. 流操作符 setw 用于指定输出数据项的域宽. int intValue = 3928; float floatValue = 91.5;  cout << "(" << setw(5) << intValue << ")\n"; cout << "(" << setw(8) << floatValue << ")\n";17
  • 18. 1.9格式化输出 (续)注: 使用setw需要包含头文件: iomanip.h Precision: 默认的有效位数是6位.float x=1.2345f; cout<
  • 19. 采用函数成员实现格式化输出 域宽和精度都可以通过cout的成员函数来修改. 例如: float x=12.345f; cout.width(5); cout.precision(3); cout<
  • 20. 1.10 格式化输入 cin对象可以用来控制字符或字符串的输入 cin 遇到空字符时将停止读入. char world[10]; cin.width(10); // 最多读取9个字符 cin>>world; // cin>>setw(10)>>world;20
  • 21. 1.10 格式化输入 (续)读取一行: getline #include void main(void) { char sentence [81]; cout << “请输入一个句子: "; cin.getline(sentence, 81); cout << “您输入的句子: " << sentence << endl; }21
  • 22. 1.10格式化输入 (续)读取一个字符: #include void main(void) { char ch; cout << “输入一个字符并回车: "; cin >> ch; cout << “你输入的是: " << ch << endl; }跳过空白字符 22
  • 23. 1.10格式化输入 (续)使用 cin.get: 可以读取包含空字符在内的任意字符. #include void main(void) { char ch; cout << “按回车键继续."; cin. get(ch); cout << “谢谢!" <
  • 24. 1.10格式化输入 (续)混合使用 cin >> 和 cin.get : 容易导致难以发现的问题. cout << “输入一个数字: "; cin >> number; cout << “输入一个字符: "; cin.get (ch);24
  • 25. 1.10格式化输入 (续)使用 cin.ignore: 能够使cin对象跳过键盘缓冲区字符. cin.ignore(20, '\n'); // cin 跳过后面20个字符, // or 或者直至开始一个新行. cin.ignore( ); // 跳过下一个字符(常用)25
  • 26. 1.13 函数的缺省参数 缺省参数: 例void showArea(int length = 20, int width = 10); …… void showArea(int length, int width) { cout << "Area="<
  • 27. 缺省形参值的说明次序缺省形参值必须从右向左顺序声明,并且在缺省形参值的右面不能有非缺省形参值的参数。因为调用时实参取代形参是从左向右的顺序。 例: int add(int x,int y=5,int z=6); //正确 int add(int x=1,int y=5,int z); //错误 int add(int x=1,int y,int z=6); //错误27
  • 28. 1.13 缺省参数 (续)如果函数调用时没有给出实参,则缺省的参数值将传给形参. 通常缺省的参数值都出现在函数原型中. 例如:Program 1-2928
  • 29. void displayStars(int = 10, int = 1); // 原型 void main(void) { displayStars( ); displayStars(5); displayStars(7, 3); } void displayStars(int cols, int rows) { for (int down = 0; down < rows; down++) { for (int across = 0; across < cols; across++) cout << "*"; cout << endl; } cout << endl; }29
  • 30. 1.14 引用作函数参数 引用是另一个变量的别名. 使用引用作参数可以使得函数访问、修改该引用对应的变量值. 30
  • 31. 函数的参数传递 ——用引用做形参引用(&)是标识符的别名,例如: int i,j; int &ri=i; //建立一个int型的引用ri,并将其 //初始化为变量i的一个别名 j=10; ri=j;//相当于 i=j; 声明一个引用时,必须同时对它进行初始化,使它指向一个已存在的对象。 一旦一个引用被初始化后,就不能改为指向其它对象。 引用可以作为形参 void swap(int& a, int& b) {...}31
  • 32. 例 输入两个整数交换后输出#include void Swap(int& a, int& b); int main() { int x(5), y(10); cout<<"x="<33. void Swap(int& a, int& b) { int t; t=a; a=b; b=t; } 运行结果: x=5 y=10 x=10 y=533
  • 34. void doubleNum(int &); // 原型 void main(void) { int value = 4; cout << "value= " << value << endl; doubleNum(value); cout << "value= " << value << endl; } void doubleNum(int &refVar) { refVar *= 2; }34
  • 35. 1.14引用作函数参数 (续)多个引用作参数:void add (int &,int &,int &, int &); void add (int &sum, int &n1, int &n2, int &n3) { … }警告! 不要过多地将引用作函数参数,否则会产生潜在的隐患. 35
  • 36. 1.15 函数重载 就是定义多个函数,名字相同,但参数类型或参数个数不全相同.36
  • 37. 重载函数的声明C++允许功能相近的函数在相同的作用域内以相同函数名声明,从而形成重载。方便使用,便于记忆。 例:形参类型不同int add(int x, int y); float add(float x, float y);形参个数不同int add(int x, int y); int add(int x, int y, int z);37
  • 38. 注意事项不要将不同功能的函数声明为重载函数,以免出现调用结果的误解、混淆。这样不好:int add(int x,int y); int add(int a,int b); 编译器不以形参名来区分int add(int x,int y); void add(int x,int y); 编译器不以返回值来区分int add(int x,int y) { return x+y; }float add(float x,float y) { return x-y; }重载函数的形参必须不同: 个数不同或类型不同。 编译程序将根据实参和形参的类型及个数的最佳匹配来选择调用哪一个函数。38
  • 39. int square(int); // 原型 float square(float); // 原型 void main(void) { int i_a; float f_b; cin >> i_a >> f_b; cout << square(i_a ) <<" and" << square(f_b); } int square(int number) { return number * number; } float square(float number) { return number * number; }39
  • 40. 1.17 内存的动态分配 程序运行中变量可以创建或释放. new 操作符 : int *iptr; iptr = new int; *iptr = 25; cout << *iptr; cin >> *iptr; total += *iptr;40
  • 41. 1.17内存的动态分配 (续)使用new操作符动态创建数组. int *iptr; iptr = new int[100]; if (iptr == NULL) { cout << "Error allocating memory! \n"; exit(0); } for (int count = 0; count < 100; count++) iptr[count] = 1;41
  • 42. 1.17内存的动态分配 (续)delete 操作符  new 操作符.int *iptr; iptr = new int(100); …… delete iptr; int *iptr; iptr = new int[100]; …… delete [ ] iptr; 42
  • 43. 1.18 C++ string 类C++ 在处理字符串方面提供两种方法. 一种方法是C语言中的字符数组处理. 另一种方法是按string类型的对象处理.43
  • 44. 1.18 C++ string 类(续)使用 string 类 第一步 : #include 注意 : 没有 ".h“. 第二步 : using namespace std; 44
  • 45. #include #include using namespace std; void main(void) { string movieTitle; movieTitle = “长江七号"; cout << movieTitle << endl; cin >> movieTitle ; cout << movieTitle << endl; cin.ignore(); getline(cin,movieTitle); cout << movieTitle << endl; }特别的语句45
  • 46. 1.18 C++ string 类(续)比较 string 对象 : 使用 <, >, <=, >=, ==, and != 等关系操作符. 例如:string set1 = "ABC"; string set2 = "XYZ"; if ( set1 < set2 ) cout << "set1 is less than set2.\n";46
  • 47. 1.18 C++ string 类(续)另外的声明string对象的方式: 1. string address; 定义一个名为address的空对象 2. string name("Zhang San"); 定义一个名为name对象,并用“Zhang San“初始化 3. string personl(person2); person2 : 一个 string 对象或者字符数组. 其余见中文教材P39页表1-547
  • 48. 1.18 C++ string 类(续)string 类支持以下几个操作符:= 、+=、+ 等 关系操作符: <,>,>=,<=, == ,!= 例如:Program 1-46 48
  • 49. #include #include using namespace std; void main(void) { string strl="ABC", str2="DEF", str3; str3 = strl + str2; for (int x = 0; x < str3.size( ); x++) cout << str3[x]; cout << endl; if (strl < str2) cout << “strl 小于 str2\n"; else cout << “strl 不小于 str2\n"; }49
  • 50. 1.18 C++ string 类(续)表 1-9 列出很多成员函数: 1. S1.append(str); 2. S1.assign(str); 3. S1.at(x); 4. S1.clear( ); 5. S1.compare(str); // like strcmp(S1, str)50
  • 51. 1.18 C++ string 类(续)6. S1.data( ); // returns a character array. 7. S1.empty( ); 8. S1.length( ); 9. S1.size( ); 10. S1.substr(x, n); 11. S1.swap(str); // Swaps the contents of S1 with str.51
  • 52. 上机作业:P72 2、4、5、9、11 中文教材P58页的第10题,用string类实现52
  • 53. 53