第一章 A 第一个C++程序 程序填空。输出"Hello C++" 。 #include using namespace std; int main() { printf("Hello C++"); return 0; } B 使用名字空间 使用名字空间。计算一个整数的平方值。 #include #include using namespace std; //定义名字空间 x,y,定义变量a和函数power(..) namespace x { int a; } namespace y { int power(int x) { return x*x; } } int main() { cin >> x::a; cout << y::power(x::a) << endl; return 0; } C 格式化输出1 输入一个整数,输出其8进制值、10进制值、16进制值。 8进制值加前缀0 16进制值加前缀0x #include #include using namespace std; int main() { int a; cin>>a; cout<< showbase; cout< #include using namespace std; int main() { double a; cin >> a; cout << fixed << setprecision(2); cout << setw(10) << left << a << "|" << setw(10) << internal << a << "|" << setw(10) << right << a <> a; cout << fixed << setprecision(2); cout << setw(10) << left << a << "|" << setw(10) << internal << a << "|" << setw(10) << right << a <> a; cout << fixed << setprecision(2); cout << setw(10) << left << a << "|" << setw(10) << internal << a << "|" << setw(10) << right << a <> a; cout << fixed << setprecision(2); cout << setw(10) << left << a << "|" << setw(10) << internal << a << "|" << setw(10) << right << a <> a; cout << fixed << setprecision(2); cout << setw(10) << left << a << "|" << setw(10) << internal << a << "|" << setw(10) << right << a < #include using namespace std; int add( int x=1001, int y=102, int z=13) { return x+y+z; } int main() { cout << add() << endl; cout << add(1) << endl; cout << add(1, 2) << endl; cout << add(1, 2, 3) << endl; } F 函数重载1 程序填空,使用函数重载,使得输出为 1 7 55.55 99.994 #include #include using namespace std; bool add( bool a, bool b) { return a+b; } double add( double a, double b) { return a+b; } int add( int a, int b) { return a+b; } double add( double a, double b, double c) { return a+b+c; } int main() { cout << add( true , true ) << endl; cout << add(3, 4) << endl; cout << add(22.22, 33.33) << endl; cout << add(22.22, 33.33, 44.444) << endl; return 0; } G 函数重载2 补充代码,使得输出为: 7 -1 12 #include #include using namespace std; void swap1( int x, int y) { int t; t=x; x=y; y=t; } void swap2( int &x, int &y) { int t; t=x; x=y; y=t; } int main() { int a, b; cin >> a >> b; swap1(a, b); cout << a << "," << b << endl; swap2(a, b); cout << a << "," << b << endl; return 0; } H 引用的使用1 按输入输出要求补充程序。 #include #include using namespace std; void swap1( int x, int y) { int t; t=x; x=y; y=t; } void swap2( int &x, int &y) { int t; t=x; x=y; y=t; } int main() { int a, b; cin >> a >> b; swap1(a, b); cout << a << "," << b << endl; swap2(a, b); cout << a << "," << b << endl; return 0; } I 引用的使用2(较难) 程序填空,按输入输出要求,实现数值交换。 #include #include using namespace std; void swap( int *&p, int *&q ) { int * t; t = p; p = q; q = t; } int main() { int a; int b; int * p1; int * p2; p1 = &a; p2 = &b; cin >> a >> b; swap(p1, p2); cout << a << "," << b << endl; cout << *p1 << "," << *p2 << endl; return 0; } J string的使用1 使用string类,对英文人名的字符串处理。 若一个人的姓名有 4 个单词,输入 4,以及这 4 个单词。 输出3行: 第一行:4 个单词,全部字母大写,单词用空格隔开。 第二行:字符总数。 第三行:姓名缩写,取每个单词的首字母大写。 #include #include using namespace std; int main() { int n; string s[1000]; cin >> n; for ( int i=0;i> s[i]; } int len = 0; string sn = "" ; for ( int i=0;i #include using namespace std; int main() { int n; string a[100],t; cin >> n; for ( int i=0;i> a[i]; } for ( int i=0;i using namespace std; int main() { int n; double * p; cin >> n; p = new double [n]; for ( double * t = p; t> *t; } for ( double * t = p+n-1; t>=p; t--) { cout << *t << endl; } delete [] p; return 0; } M 面向过程编程 - 计算面积和周长 补充程序,定义若干个函数。 输入三角形的 3 边长和矩形的 2 边长,计算并输出他们的面积和周长。 #include #include #include using namespace std; struct TRIANGLE { double a; double b; double c; }; struct RECTANGLE { double w; double h; }; double getTriangleArea(TRIANGLE *t) { double p=(t->a+t->b+t->c)/2; return sqrt ((p-t->a)*(p-t->b)*(p-t->c)*p); } double getTrianglePerimeter(TRIANGLE *p) { return p->a+p->b+p->c; } double getRectangleArea(RECTANGLE *p) { return ((p->w)*(p->h)); } double getRectanglePerimeter(RECTANGLE *p) { return (2*(p->w)+(p->h)*2); } int main() { TRIANGLE t1; RECTANGLE r1; cin >> t1.a >> t1.b >> t1.c; cin >> r1.w >> r1.h; cout << fixed << setprecision(2); cout << getTriangleArea(&t1) << endl; cout << getTrianglePerimeter(&t1) << endl; cout << getRectangleArea(&r1) << endl; cout << getRectanglePerimeter(&r1) << endl; } 第二章 A1.2 面向过程编程 - 计算面积和周长 补充程序,定义若干个函数。 输入三角形的 3 边长和矩形的 2 边长,计算并输出他们的面积和周长。 #include #include #include using namespace std; struct TRIANGLE { double a; double b; double c; }; struct RECTANGLE { double w; double h; }; double getTrianglePerimeter(TRIANGLE * p) { return p->a+p->b+p->c; } double getTriangleArea(TRIANGLE * t) { double p=(t->a+t->b+t->c)/2; return sqrt ((p-t->a)*(p-t->b)*(p-t->c)*p); } double getRectangleArea(RECTANGLE *p) { return (p->w)*(p->h); } double getRectanglePerimeter(RECTANGLE * p) { return 2*((p->w)+(p->h)); } int main() { TRIANGLE t1; RECTANGLE r1; cin >> t1.a >> t1.b >> t1.c; cin >> r1.w >> r1.h; cout << fixed << setprecision(2); cout << getTriangleArea(&t1) << endl; cout << getTrianglePerimeter(&t1) << endl; cout << getRectangleArea(&r1) << endl; cout << getRectanglePerimeter(&r1) << endl; } B2 面向对象编程 - 计算面积和周长 补充程序,定义一个类。 输入三角形的3边长,计算并输出他的面积和周长。 #include #include #include using namespace std; class Triangle { public : double a; double b; double c; double getArea() { double l=(a+b+c)/2; return sqrt ((l-a)*(l-b)*(l-c)*l); } double getPerimeter() { return a+b+c; } }; int main() { Triangle t1; cin >> t1.a >> t1.b >> t1.c; cout << fixed << setprecision(2); cout << t1.getArea() << endl; cout << t1.getPerimeter() << endl; } C3 自定义默认构造函数 补充程序,自定义默认构造函数,要求: 三角形的三边长默认为:3、4、5。 #include #include #include using namespace std; class Triangle { public : double a; double b; double c; public : double getPerimeter() { return a + b + c; } double getArea() { double l = (a + b + c) / 2; return sqrt ((l - a) * (l - b) * (l - c) * l); } Triangle() { a=3;b=4;c=5; } }; int main() { Triangle t1; cout << fixed << setprecision(2); cout << t1.getArea() << endl; cout << t1.getPerimeter() << endl; } D4 带参数的构造函数 补充构造函数。 要求: 三角形的三边长可以在定义对象的同时指定。 #include #include #include using namespace std; class Triangle { public : double a; double b; double c; public : double getPerimeter() { return a + b + c; } double getArea() { double l = (a + b + c) / 2; return sqrt ((l - a) * (l - b) * (l - c) * l); } Triangle( double x, double y, double z) :a(x),b(y),c(z) { } }; int main() { double x, y, z; cin >> x >> y >> z; Triangle t1(x, y, z); cout << fixed << setprecision(2); cout << t1.getArea() << endl; cout << t1.getPerimeter() << endl; } E5 重载构造函数 补充构造函数。 要求: 一个参数时,构造等边三角形。 二个参数时,构造等腰三角形。第一个参数为底长,第二个参数为腰长。 三个参数时,构造普通三角形。 #include #include #include using namespace std; class Triangle { public : double a; double b; double c; public : double getPerimeter() { return a + b + c; } double getArea() { double l = (a + b + c) / 2; return sqrt ((l - a) * (l - b) * (l - c) * l); } Triangle( double x) :a(x),b(x),c(x) { } Triangle( double x, double y) :a(x),b(y),c(y) { } Triangle( double x, double y, double z) :a(x),b(y),c(z) { } }; int main() { double x, y, z; cin >> x >> y >> z; Triangle t1(x); Triangle t2(x, y); Triangle t3(x, y, z); cout << fixed << setprecision(2); cout << t1.getArea() << " " << t1.getPerimeter() << endl; cout << t2.getArea() << " " << t2.getPerimeter() << endl; cout << t3.getArea() << " " << t3.getPerimeter() << endl; } F6 复合类的构造函数 - 复合类(对象)中子对象的初始化 补充程序,实现复合类(对象)中子对象的初始化。 #include #include #include using namespace std; class Date { public : int y, m, d; Date( int y, int m, int d) :y(y), m(m), d(d) {} void Show() { cout << setfill( '0' ); cout << setw(4) << y << "-" << setw(2) << m << "-" << setw(2) << d << endl; } }; class Student { public : string name; Date birthday; void Show() { cout << name << "'s birtday is " ; birthday.Show(); } Student(string a, int b, int c, int d) :name(a),birthday(b,c,d) { } }; int main() { string n; int y, m, d; cin >> n >> y >> m >> d; Student s1(n, y, m, d); s1.Show(); return 0; } G7 析构函数 补充程序,创建对象,并销毁对象,输出对象的创建和销毁过程。 每个对象依据创建过程编号,从编号1开始。 #include #include using namespace std; int ID_CNT = 0; class A { public : int id; A() { id= ++ID_CNT; cout << "Create Object A " <>n; A a1; A* p = new A[n]; delete [] p; A* q = new A(); delete q; } H8 拷贝构造函数 请定义一个有趣的拷贝构造函数。 当我们用一个三角形对象 t1 去初始化另一个三角形对象 t2 时,他的边长会自动放大一倍。 #include #include using namespace std; class Triangle { public : double a, b, c; public : Triangle() :a(3), b(4), c(5) { } Triangle( double x, double y, double z) :a(x), b(y), c(z) { } void Show() { cout << "Tri(" << a << "," << b << "," << c << ")" << endl; } Triangle( const Triangle& p) { a=p.a*2; b=p.b*2; c=p.c*2; } }; int main() { double x, y, z; cin >> x >> y >> z; Triangle t1(x, y, z); Triangle t2(t1); Triangle t3 = Triangle(t2); t1.Show(); t2.Show(); t3.Show(); } I9 拷贝构造函数2 补充程序,使得符合输出要求。 #define _CRT_SECURE_NO_WARNINGS #include #include #include using namespace std; class Student { public : char * name; int age; Student( const char * n = "Liu You Ji" , int a = 18) :age(a) { name = new char [50]; strcpy (name, n); } ~Student() { //delete [] name; } void Show() { cout << name << ", " << age << " years old.\n" ; } Student( const Student& p) { int len = strlen (p.name) * 1; name = new char [len]; strcpy (name,p.name); age = p.age + 1; } }; Student f(Student s) { return s; } int main() { Student s1; Student s2(s1); strcpy (s2.name, "Tom" ); Student s3 = s2; strcpy (s3.name, "Jerry" ); Student s4 = f(s3); strcpy (s4.name, "Mike" ); s1.Show(); s2.Show(); s3.Show(); s4.Show(); } J10 常成员变量、常成员函数和常对象 补充程序,使得能够按格式要求输出学生的信息。 #include #include #include using namespace std; class Student { public : const string name; int age; Student(string n, int a) :name(n), age(a) { } void Show() { cout << "StudInfo: " << name << " " << age << ", by void Show()." << endl; } void Show() const { cout << "StudInfo: " << name << " " << age << ", by void Show()" << " const." << endl; } }; int main() { string n; int a; cin>>n>>a; Student s1(n, a); const Student& s2 = s1; s1.Show(); cout << "--" << endl; s2.Show(); cout << "--" << endl; static_cast < const Student>(s1).Show(); } K11 静态成员变量与静态成员函数 统计曾经创建的对象的个数。 #include #include using namespace std; class A { public : static int cnt; static int GetCreatedCnt() { return cnt; } A() { cnt++; } }; int A::cnt = 0; int main() { int n; cin >> n; cout << A::cnt << endl; A a1; cout << A::cnt << endl; cout << A::GetCreatedCnt() << endl; A list[20]; cout << A::cnt << endl; cout << A::GetCreatedCnt() << endl; A *p = new A[n]; cout << A::cnt << endl; cout << A::GetCreatedCnt() << endl; delete [] p; return 0; } L12 友元函数 平面几何。 计算两点间的距离。 #include #include #include using namespace std; class Point { private : int x, y; public : Point( int a, int b) :x(a), y(b) { } void Show() { cout << "P(" << x << "," << y << ")" ; } friend double Distance(Point& p1, Point& p2); }; double Distance(Point& p1, Point& p2) { return sqrt ((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y)); } int main() { int a, b, c, d; cin >> a >> b >> c >> d; Point p1(a, b), p2(c, d); p1.Show(); cout << " - " ; p2.Show(); cout << " = " ; cout << fixed << setprecision(4) << Distance(p1, p2) << endl; return 0; } M13 友元类 平面几何。 平面上三角形的平移。 Point 表示平面上的点。 Triangle 表示平面上的三角形。由三个点 Point 确定。 类的部分代码如下: #include #include #include using namespace std; class Point { private : int x, y; public : Point( int a, int b) :x(a), y(b) { } void Show() { cout << "P(" << x << "," << y << ")" ; } friend class Triangle; }; class Triangle { public : Point A, B, C; Triangle( int a, int b, int c, int d, int e, int f) :A(a, b), B(c, d), C(e, f) { } void Show() { cout << "Triangle[" ; A.Show(); cout << "," ; B.Show(); cout << "," ; C.Show(); cout << "]" << endl; } void Offset( int dx, int dy) { A.x += dx; A.y += dy; B.x += dx; B.y += dy; C.x += dx; C.y += dy; } }; int main() { int a, b, c, d, e, f; int dx, dy; cin >> a >> b >> c >> d >> e >> f; cin >> dx >> dy; Triangle t1(a, b, c, d, e, f); t1.Show(); t1.Offset(dx, dy); t1.Show(); return 0; } 第三章 A1.3 复数的加减,全局函数实现 补充代码,实现复数的加减运算。 #include #include #include using namespace std; class Complex { public : double r; // real double i; // image public : Complex() :r(0), i(0) {} Complex( double a, double b) :r(a), i(b) {} void Show() const { cout << "(" << noshowpos << r << showpos << i << noshowpos << "i)" << endl; } }; Complex operator +(Complex c1, Complex c2) { Complex t; t.r = c1.r + c2.r; t.i = c1.i + c2.i; return t; } Complex operator -(Complex c1, Complex c2) { Complex t; t.r = c1.r - c2.r; t.i = c1.i - c2.i; return t; } int main() { double a, b, c, d; cin >> a >> b >> c >> d; Complex c1(a, b), c2(c, d); Complex c3, c4; c3 = c1 + c2; c4 = c1 - c2; c3.Show(); c4.Show(); return 0; } B1.3 复数的加减,成员函数实现 补充代码,实现复数的加减运算。 #include #include #include using namespace std; class Complex { public : double r; // real double i; // image public : Complex() :r(0), i(0) {} Complex( double a, double b) :r(a), i(b) {} void Show() const { cout << "(" << noshowpos << r << showpos << i << noshowpos << "i)" << endl; } Complex operator+(Complex c2) { Complex t; t.r = this ->r + c2.r; t.i = this ->i + c2.i; return t; } Complex operator-(Complex c2) { Complex t; t.r = this ->r - c2.r; t.i = this ->i - c2.i; return t; } }; int main() { double a, b, c, d; cin >> a >> b >> c >> d; Complex c1(a, b), c2(c, d); Complex c3, c4; c3 = c1 + c2; c4 = c1 - c2; c3.Show(); c4.Show(); return 0; } C 复数的自增,前缀和后缀实现 补充程序,实现复数的自增,前缀和后缀实现。 #include #include #include using namespace std; class Complex { public : double r; // real double i; // image public : Complex() :r(0), i(0) {} Complex( double a, double b) :r(a), i(b) {} void Show() const { cout << "(" << noshowpos << r << showpos << i << noshowpos << "i)" << endl; } Complex operator ++( int ) { Complex t; t.r = this ->r++; t.i = this ->i++; return t; } Complex operator ++() { Complex t; t.r = ++ this ->r; t.i = ++ this ->i; return t; } }; int main() { double a, b, c, d; cin >> a >> b >> c >> d; Complex c1(a, b), c2(c, d); Complex c3, c4; c3 = ++c1; c4 = c2++; c1.Show(); c2.Show(); c3.Show(); c4.Show(); return 0; } D 提取与插入运算的重载(输出输出) 补充代码,实现重载提取与插入运算(输出输出)。 #include #include #include using namespace std; class Complex { public : double r; // real double i; // image public : Complex() :r(0), i(0) {} Complex( double a, double b) :r(a), i(b) {} void Show() const { cout << "(" << noshowpos << r << showpos << i << noshowpos << "i)" << endl; } }; istream& operator >> (istream& is, Complex& c1) { is >> c1.r >> c1.i; return is; } ostream& operator << (ostream& os, const Complex& c1) { if (c1.i < 0) os << "(" << c1.r << c1.i << "i)" ; else os << "(" << c1.r << "+" << c1.i << "i)" ; return os; } int main() { Complex c1, c2; cin >> c1 >> c2; cout << c1 << endl << c2 << endl; return 0; } E 关系运算的重载 补充代码,重载关系运算。 注意: 本题中,double a,b 相等的标准为 |a-b| < 1e-6 ; == : 复数的实部和虚部同时相等; != : 复数的实部和虚部至少有一个不相等。 #include #include #include #include using namespace std; class Complex { public : double r; // real double i; // image public : Complex() :r(0), i(0) {} Complex( double a, double b) :r(a), i(b) {} void Show() const { cout << "(" << noshowpos << r << showpos << i << noshowpos << "i)" << endl; } bool operator ==(Complex &c2) { return ( fabs ( this ->r - c2.r) < 1e-6 && fabs ( this ->i - c2.i) < 1e-6); } bool operator !=(Complex &c2) { return (!( fabs ( this ->r - c2.r) < 1e-6) || !( fabs ( this ->i - c2.i) < 1e-6)); } }; int main() { double a, b, c, d; cin >> a >> b >> c >> d; Complex c1(a, b), c2(c, d); cout << boolalpha; cout << "(c1 == c2) = " << (c1 == c2) << endl; cout << "(c1 != c2) = " << (c1 != c2) << endl; return 0; } F 奇怪的拷贝和赋值运算 奇怪的拷贝和赋值运算。(本题的设计是错误的设计,仅用于演示错误的原因,请勿用于实际项目) 实现拷贝构造函数和赋值运算。 * 拷贝构造:新复数放大2倍。 * 赋值运算:操作数1放大3倍。 (返回类型是 Complex 还是 Complex & ,正确的实现是返回 Complex &) 使得符合样例输出的格式和数值要求。 #include #include #include using namespace std; class Complex { public : double r; // real double i; // image public : Complex() :r(0), i(0) {} Complex( double a, double b) :r(a), i(b) {} void Show() const { cout << "(" << noshowpos << r << showpos << i << noshowpos << "i)" << endl; } Complex ( const Complex &c) { r = c.r * 2; i = c.i * 2; } Complex operator =( const Complex &c) { r = c.r * 3; i = c.i * 3; return * this ; } }; int main() { double a, b; cin >> a >> b; Complex c1(a, b); Complex c3 = c1; Complex c4, c5; c5 = c4 = c1; const Complex& c6 = c4 = c1; c1.Show(); c3.Show(); c4.Show(); c5.Show(); c6.Show(); return 0; } G 深的拷贝和赋值运算 数组也可以赋值啦! 补充代码。自定义类Arr,处理int数组。 支持拷贝、赋值。 #include #include using namespace std; class Arr { public : int cnt; int * pData; public : Arr( int cnt = 5) :cnt(cnt) { pData = new int [cnt]; } ~Arr() { if (pData) { delete [] pData; pData = 0; cnt = 0; } } void Show() const { for ( int i = 0; i < cnt; i++) cout << pData[i] << ((i == cnt - 1) ? "\n" : " " ); } Arr( const Arr&a) { cnt=a.cnt; pData= new int [cnt]; for ( int i=0;i> a1.pData[i]; Arr a2(a1); Arr a3; a3 = a2; a2.pData[2] = 22; a3.pData[3] = 333; a1.Show(); a2.Show(); a3.Show(); return 0; } H 下标运算 自定义类Arr,管理int数组。 允许通过对象下标访问元素。 注意:下标越界时,访问最近的有效下标对应的元素。 #include #include using namespace std; class Arr { public : int * pData; int cnt; public : Arr( int cnt = 5) :cnt(cnt) { pData = new int [cnt]; } ~Arr() { if (pData) { delete [] pData; pData = 0; cnt = 0; } } void Show() const { for ( int i = 0; i < cnt; i++) cout << pData[i] << ((i == cnt - 1) ? "\n" : " " ); } int & operator[]( int n) { if (n<0)n=0; if (n>cnt-1)n=cnt-1; return pData[n]; } }; int main() { Arr a1(5); for ( int i = 0; i < 5; i++) cin >> a1[i]; a1.Show(); a1[3] = a1[2] * 10; a1[-1] = -1; a1[6] = 6; a1.Show(); return 0; } I 类型转换 有复数类 Complex。 补充程序,支持 Complex 转换为 double,支持 double 转换为 Complex。 Complex 转换为 double:值为复数的模。 double 转换为 Complex:实部为 double 的值,虚部为0。 #include #include #include #include using namespace std; class Complex { public : double r; // real double i; // image public : Complex() :r(0), i(0) {} Complex( double a, double b) :r(a), i(b) {} void Show() const { cout << "(" << noshowpos << r << showpos << i << noshowpos << "i)" << endl; } operator double () const { return sqrt (r*r+i*i); } Complex( const double & v) { r=v; i=0; } }; int main() { double a, b; cin >> a >> b; Complex c1(a, b); double tmp; Complex c2; tmp = c1; c2 = tmp; c1.Show(); cout << tmp << endl; c2.Show(); return 0; } J 仿函数 二次多项式(Quadratic polynomial)计算。 如:f(x) = ax2 + bx + c 已知:a、b、c;以及 x1、x2、x3、x4、…、xn 求:f(x1) = ?、f(x2) = ? 定义 Quad 类。实现二次多项式的值的计算。 #include #include #include using namespace std; class Quad { public : double a; double b; double c; Quad( double a, double b, double c):a(a), b(b), c(c) { } double operator()( double x) { return (a * x * x + b * x + c); } }; int main() { double a, b, c, x1, x2; cin >> a >> b >> c >> x1 >> x2; Quad q1(a, b, c); cout << q1(x1) << endl; cout << q1(x2) << endl; return 0; } K 仿函数2 可变排序。 输入排序方式 asc,元素个数 n (n<=100),以及 n 个元素,输出对 n 个元素按指定方式排序的结果。 asc 为 1 表示升序,为 0 表示降序。 #include #include using namespace std; class SortRule { public : bool asc; SortRule( bool x):asc(x) { } bool operator()( const int &a, const int &b ) const { if (!asc) return a > b; else return a < b; } }; void showArray( int x[], int n) // 输出数组的元素 { for ( int i = 0; i < n; i++) { cout << x[i] << ((i != n - 1) ? " " : "\n" ); } } void xSort( int x[], int n, SortRule rule) // 排序 { int p; int t; for ( int i = 0; i < n - 1; i++) { p = i; for ( int j = i + 1; j < n; j++) { if (rule(x[j], x[p])) p = j; } t = x[p]; x[p] = x[i]; x[i] = t; } } int main() { bool asc; int n; int a[100]; while (cin >> asc) { cin >> n; for ( int i = 0; i < n; i++) cin >> a[i]; SortRule rule1(asc); xSort(a, n, rule1); showArray(a, n); } return 0; } L 复数的加减乘除、正、负、提取与插入运算 定义 Complex 类型(复数)。 对于 c1、c2(Complex c1, c2;),支持以下运算: cin>>c1>>c2; cout< #include #include using namespace std; class Complex { public : double r; double i; }; istream& operator >>(istream &is, Complex& a) { is >> a.r >> a.i; return is; } ostream& operator <<(ostream &os, const Complex& a) { //os << a.r << a.i; os << "(" << noshowpos << a.r << showpos << a.i << noshowpos << "i)" ; return os; } Complex operator+( const Complex& a1, const Complex& a2) { Complex a; a.r = a1.r + a2.r; a.i = a1.i + a2.i; return a; } Complex operator-( const Complex& a1, const Complex& a2) { Complex a; a.r = a1.r - a2.r; a.i = a1.i - a2.i; return a; } Complex operator*( const Complex& a1, const Complex& a2) { Complex a; a.r = a1.r * a2.r - a1.i * a2.i; a.i = a1.r * a2.i + a1.i * a2.r; return a; } Complex operator/( const Complex& a1, const Complex& a2) { Complex a; a.r = (a1.r * a2.r + a1.i * a2.i) / (a2.r * a2.r + a2.i * a2.i); a.i = (a1.i * a2.r - a1.r * a2.i) / (a2.r * a2.r + a2.i * a2.i); return a; } Complex operator+( const Complex& a1) { Complex a; a.r = +a1.r; a.i = +a1.i; return a; } Complex operator-( const Complex& a1) { Complex a; a.r = -a1.r; a.i = -a1.i; return a; } int main() { Complex c1, c2; Complex c3, c4; cin >> c1 >> c2; cout << "c1 = " << c1 << endl; cout << "c2 = " << c2 << endl; cout << c1 << " + " << c2 << " = " << c1 + c2 << endl; cout << c1 << " - " << c2 << " = " << c1 - c2 << endl; cout << c1 << " * " << c2 << " = " << c1 * c2 << endl; cout << c1 << " / " << c2 << " = " << c1 / c2 << endl; cout << "+" << c1 << " = " << +c1 << endl; cout << "-" << c1 << " = " << -c1 << endl; return 0; } M 比较完美的赋值运算 数组也可以赋值啦! 输入一个变长的数组,通过拷贝和赋值产生三个独立的数组。并且按指定格式输出。 比较完美的赋值运算,应当做到: 1、深赋值 2、无内存泄漏 (注:因编译器无法检测内存泄漏,故:修改了部分代码,尝试通过内存限制间接检查内存泄漏) 3、支持自身赋值 (如 a1 = a1) 4、高效率 #include #include using namespace std; class Arr { public : int cnt; int * pData; public : Arr( int cnt = 5) :cnt(cnt) { pData = new int [cnt]; } ~Arr() { if (pData) { delete [] pData; pData = 0; cnt = 0; } } void Show() const { for ( int i = 0; i < cnt; i++) cout << pData[i] << ((i == cnt - 1) ? "\n" : " " ); } Arr( const Arr& a) { cnt = a.cnt; pData = new int [cnt]; for ( int i = 0; i < cnt; i++) pData[i]=a.pData[i]; } Arr& operator=( const Arr & a) { if ( this ==&a) return * this ; if (cnt !=a.cnt) { delete []pData; cnt=a.cnt; pData = new int [cnt]; } for ( int i = 0;i> n; Arr a1(n); for ( int i = 0; i < a1.cnt; i++) cin >> a1.pData[i]; Arr a2(a1); Arr a3; a3 = a2; a3 = a3; if (n > 2) a2.pData[2] = 0; if (n > 3) a3.pData[3] = 0; a1.Show(); a2.Show(); a3.Show(); // 以下代码用于间接检测内存泄漏和自赋值,不产生输出,可以忽略 Arr bigarr(1000000); const int N = 20; Arr arrs[N]; for ( int i = 0; i < N; i++) arrs[i] = bigarr; for ( int i = 0; i < N; i++) arrs[i] = arrs[0]; return 0; } N 类型转换2 温度的知识: 华氏温标 - 1724 年,德国人华伦海特(Fahrenheit)制定了华氏温标,最早,他把一定浓度的盐水凝固时的温度定为 0 ℉,将他妻子的体温设为 100 ℉,后来为了严谨,又把纯水的冰点温度定为 32 ℉,把标准大气压下水的沸点温度定为 212 ℉,中间分为 180 等份,每一等份代表 1 度,这就是华氏温标。 摄氏温标 - 1742 年,瑞典天文学家安德斯·摄尔修斯 (Anders Celsius,1701-1744) 将一大气压下冰水混合物的温度规定为 0 ℃,水的沸点定为 100 ℃,两者间均分成 100 个刻度。1954 年的第十届国际度量衡大会特别将此温标命名为“摄氏温标”,以表彰摄氏的贡献。 开氏温标 - 热力学温标是由威廉·汤姆森(第一代开尔文男爵 Lord Kelvin)于 1848 年利用热力学第二定律的推论卡诺定理引入的。它是一个纯理论上的温标,因为它与测温物质的属性无关。符号 T,单位 K(开尔文,简称开)。国际单位制(SI)的 7 个基本量之一。根据热力学原理得出,测量热力学温度,采用国际实用温标。热力学温度旧称绝对温度(absolute temperature)。单位是“开尔文”,英文是“Kelvin”简称“开”,国际代号“K”,但不加“°”来表示温度。以绝对零度(0K)为最低温度,规定水的三相点的温度为 273.16K,开定义为水三相点热力学温度的 1 / 273.16。 请根据规律,定义 2 个类,实现华氏温标和摄氏温标的自动换算。 做完后,同学们可以尝试实现 3 种温标的相互换算。 #include #include using namespace std; // 华氏温标 class Ftemp { public : double v; Ftemp( double v = 32) :v(v) { } }; // 摄氏温标 class Ctemp { public : double v; Ctemp( double v = 0) :v(v) { } operator Ftemp() { Ftemp f; f.v = v * 1.8 + 32; return f; } Ctemp( const Ftemp& f) { v = (f.v - 32) / 1.8; } }; istream& operator>> (istream& is, Ftemp& x) { return is >> x.v; } istream& operator>> (istream& is, Ctemp& x) { return is >> x.v; } ostream& operator<< (ostream& os, const Ftemp& x) { return os << x.v << "℉" ; } ostream& operator<< (ostream& os, const Ctemp& x) { return os << x.v << "℃" ; } int main() { Ftemp f1, f2; Ctemp c1, c2; while (cin >> f1 >> c1) { cout << "----------" << endl; cout << fixed << setprecision(1); cout << "f1 = " << f1 << endl << "c1 = " << c1 << endl; c2 = f1; f2 = c1; c2 = (Ctemp)f1; f2 = (Ftemp)c1; cout << "f1 = " << f1 << " = " << c2 << endl << "c1 = " << c1 << " = " << f2 << endl; } } 第四章 A1.4 简单的继承 补充程序,使得输出符合规定的要求。 #include #include using namespace std; class A { public: void f1() { cout << "Call function 1." << endl; } void f2() { cout << "Call function 2." << endl; } }; class B :public A { }; int main() { B b1; b1.f1(); b1.f2(); return 0; } B 继承与扩展 补充程序,使得输出符合规定的要求。 #include #include using namespace std; class A { public: void f1() { cout << "Call function 1." << endl; } }; class B : public A { public: void fx() { cout<<"Call function x."< #include #include using namespace std; class Animal { public: string name; int age; Animal(string s = "Sam", int a = 2) :name(s), age(a) {} }; class Cat :public Animal { public: Cat(string s = "Tom", int a = 2) :Animal(s, a) {} }; void Show(Animal a) { cout<> s1 >> n1 >> s2 >> n2; Animal a1(s1, n1); Cat c2(s2, n2); Show(a1); Show(c2); return 0; } D 基类、子对象、派生类的构造与析构 补充程序,使得输出符合规定的要求。 #include #include #include using namespace std; class A { public: int x; A(int a) :x(a) { cout << "Create A" << endl; } ~A() { cout << "Destory A" << endl; } }; class B { public: int y; B(int b) :y(b) { cout << "Create B" << endl; } ~B() { cout << "Destory B" << endl; } }; class C :public A { public: int y,z; B b1; C(int x,int y,int z):A(x),b1(y),z(z) { cout<<"Create C"<> a >> b >> c; C c1(a, b, c); cout << c1.x << endl << c1.b1.y << endl << c1.z << endl; return 0; } E 隐藏基类函数 补充程序,使得输出符合规定的要求。 #include using namespace std; class Vehicle { public: void Run() { cout << "Call Vehicle::Run()" << endl; } }; class Car:public Vehicle { public: void Run() { cout<<"Call Car::Run()"<Run(); return 0; } F 多继承之V形多继承 补充程序,使得输出符合规定的要求。 #include #include #include using namespace std; class A { public: int x; }; class B { public: int y; }; class C:public A,public B { public: int z; }; int main() { C c1; cin >> c1.x >> c1.y >> c1.z; cout << c1.A::x << endl << c1.B::y << endl << c1.z << endl; cout << "sizeof(C) = " << sizeof(C) << endl; return 0; } G 多继承之菱形多继承 补充程序,使得输出符合规定的要求。 #include #include #include using namespace std; class A { public: int x; }; class B : public A { public: int y; }; class C : public A { public: int z; }; class D : public B,public C { public: int w; }; int main() { D d1; cin >> d1.B::x >> d1.C::x >> d1.y >> d1.z >> d1.w; cout << d1.B::x << endl << d1.C::x << endl << d1.y << endl << d1.z << endl << d1.w << endl; cout << "sizeof(D) = " << sizeof(D) << endl; return 0; } J 继承之猫和老鼠 补充代码,使得程序按要求输出。 #include #include #include using namespace std; class Animal { public: Animal(string n, int a) :name(n), age(a) {} void Say() { cout << "Hello, I'm an animal. Named " << name << ", " << age << " years old.\n"; } protected: string name; int age; }; class Cat:virtual public Animal { public: Cat(string n, int a) : Animal(n,a){} void Say() { cout << "Miao miao miao, I'm a cat. Named " << Animal::name << ", " <Say(); } return 0; } I 多继承之虚继承2 虚基类的初始化。 补充程序,使得输出符合规定的要求。 #include #include #include using namespace std; class A { public: int x; A(int a):x(a) {} }; class B : virtual public A { public: int y; B(int a, int b):A(a),y(b) {} }; class C : virtual public A { public: int z; C(int a, int c):A(a),z(c) {} }; class D : virtual public B,virtual public C { public: int w; D(int a,int b,int c,int d,int e,int f):A(f),B(a,b),C(a,d),w(e) {} }; int main() { int a,b,c,d,e,f; cin >> a >> b >> c >> d >> e >> f; D d1(a,b,c,d,e,f); cout << d1.A::x << endl << d1.B::x << endl << d1.C::x << endl << d1.x << endl << d1.y << endl << d1.z << endl << d1.w << endl; return 0; } H 多继承之虚继承 补充程序,使得输出符合规定的要求。 #include #include #include using namespace std; class A { public: int x; }; class B : virtual public A { public: int y; }; class C : virtual public A { public: int z; }; class D : virtual public B,virtual public C { public: int w; }; int main() { D d1; cin >> d1.A::x >> d1.B::x >> d1.C::x >> d1.y >> d1.z >> d1.w; cout << d1.A::x << endl << d1.B::x << endl << d1.C::x << endl << d1.y << endl << d1.z << endl << d1.w << endl; return 0; } 第五章 A 1.5 多态之猫和老鼠 补充代码,使得程序按要求输出。 #include #include #include using namespace std; class Animal { protected: string name; int age; public: Animal(string a,int b):name(a),age(b) { } virtual void Say() { cout<<"Hello, I'm an animal. Named " <Say(); } return 0; } B 多态之虚析构 补充代码,完成类 A、B、C、D 的定义,使得符合输出要求。 要求:每一个类的构造、析构都要有内容输出。 #include #include #include using namespace std; class A { public: A() { cout<<"Create A"< #include #include #include using namespace std; typedef double D; class Point { public: D x, y; Point(D x = 0, D y = 0) :x(x), y(y) {} D Distance(const Point& p) const { return sqrt((x - p.x) * (x - p.x) + (y - p.y) * (y - p.y)); } }; class Shape { public: virtual D Area() = 0; virtual D Perimeter() = 0; virtual string Name() = 0; }; class Triangle :public Shape { public: Point A, B, C; Triangle(D a, D b, D c, D d, D e, D f) :A(a, b), B(c, d), C(e, f) {} D Area() { D l1 = A.Distance(B); D l2 = B.Distance(C); D l3 = C.Distance(A); D l = (l1 + l2 + l3) / 2; return sqrt((l - l1) * (l - l2) * (l - l3) * l); } D Perimeter() { D l1 = A.Distance(B); D l2 = B.Distance(C); D l3 = C.Distance(A); return l1 + l2 + l3; } string Name() { return "Triangle"; } }; class Rectangle :public Shape { public: Point A, B; Rectangle(D a, D b, D c, D d) :A(a, b), B(c, d) { } D Area() { D l1 = fabs(A.x - B.x); D l2 = fabs(A.y - B.y); return l1 * l2; } D Perimeter() { D l1 = fabs(A.x - B.x); D l2 = fabs(A.y - B.y); return (l1 + l2) * 2; } string Name() { return "Rectangle"; } }; int main() { D a, b, c, d, e, f; D m, n, x, y; cin >> a >> b >> c >> d >> e >> f; cin >> m >> n >> x >> y; Shape* shps[2] = { new Triangle(a, b, c, d, e, f), new Rectangle(m, n, x, y) }; for (int i = 0; i < 2; i++) { cout << shps[i]->Name() << " Area: " << shps[i]->Area() << endl; cout << shps[i]->Name() << " Perimeter: " << shps[i]->Perimeter() << endl; } return 0; } D 多态之虚析构2 补充代码,完成类 A、B、C、D 的定义,使得符合输出要求。 #include #include #include using namespace std; class A { public: A() { cout << "Create A" << endl; } ~A() { cout << "Destory A" << endl; } }; class C { public: C() { cout << "Create C" << endl; } virtual ~C() { cout << "Destory C" << endl; } }; class B : public A { public: B() { cout << "Create B" << endl; } ~B() { cout << "Destory B" << endl; } }; class D : public C { public: D() { cout << "Create D" << endl; } ~D() { cout << "Destory D" << endl; } }; const string SPLIT1 = "================"; const string SPLIT2 = "-"; int main() { { cout << SPLIT1 << endl; B* p1 = new B(); cout << SPLIT2 << endl; delete p1; } { cout << SPLIT1 << endl; A* p1 = new B(); cout << SPLIT2 << endl; delete p1; } { cout << SPLIT1 << endl; D* p1 = new D(); cout << SPLIT2 << endl; delete p1; } { cout << SPLIT1 << endl; C* p1 = new D(); cout << SPLIT2 << endl; delete p1; } return 0; } 第六章 A 1.6 函数模板之加法 补充程序,使得输出符合规定的要求。 #include #include #include using namespace std; template T add(T a , T b) { return a+b; } int main() { int a, b; double c, d; string e, f; cin >> a >> b >> c >> d >> e >> f; cout << "int a + b = " << add(a, b) << endl; cout << "int a + b = " << add(a, b) << endl; cout << "double c + d = " << add(c, d) << endl; cout << "string e + f = " << add(e, f) << endl; return 0; } B 函数模板之排序1 补充程序,使得输出符合规定的要求。 #include #include #include using namespace std; template void Sort(T a[],int n) { T t; for(int i=0;i void Input(T a[], int n) { for (int i = 0; i < n; i++) cin >> a[i]; } template void Show(T a[], int n) { for (int i = 0; i < n; i++) cout << a[i] << ((i < n - 1) ? " " : "\n"); } int main() { const int N = 6; { long a[N]; Input(a, N); Show(a, N); Sort(a, N); Show(a, N); } cout << "-" << endl; { double a[N]; Input(a, N); Show(a, N); Sort(a, N); Show(a, N); } return 0; } C 函数模板之排序2 补充程序,使得输出符合规定的要求。 定义学生类Student(包含成员变量:姓名name、成绩score),以及相关的函数。 排序依旧只使用一个函数模板。 #include #include #include using namespace std; class Student { public: string name; double score; bool operator<(const Student& s) const { return score>(istream&is,Student& s) { return is>>s.name>>s.score; } ostream& operator<<(ostream&os,const Student& s) { return os<<"("< void Sort(T a[],int n) { T t; for(int i=0;i void Input(T a[], int n) { for (int i = 0; i < n; i++) cin >> a[i]; } template void Show(T a[], int n) { for (int i = 0; i < n; i++) cout << a[i] << ((i < n - 1) ? " " : "\n"); } int main() { const int N = 6; { long a[N]; Input(a, N); Show(a, N); Sort(a, N); Show(a, N); } cout << "-" << endl; { Student a[N]; Input(a, N); Show(a, N); Sort(a, N); Show(a, N); } return 0; } D 函数模板之特殊化以及重载(Sepcialization&Overload) 补充程序,使得输出符合规定的要求。 提示:模板 add(T,T) 特殊化 add(int,int) ,并重载 add(int,int) 分别返回:a+b+2 or a+b+1 or a+b #include #include #include using namespace std; template T add(T a,T b) { return a+b; } template<> int add(int a,int b) { return a+b+a; } int add(int a,int b) { return a+b+b; } int main() { double x, y; cin >> x >> y; cout << "add(x, y) = " << add(x, y) << endl; cout << "add('A', '\\2') = " << add('A', '\2') << endl; cout << "add(1.0, 2.0) = " << add(1.0, 2.0) << endl; cout << "add(1L, 2L) = " << add(1L, 2L) << endl; cout << "add(1, 2) = " << add(1, 2) << endl; cout << "add(1, 2) = " << add(1, 2) << endl; return 0; } E 类模板之简单数组 实现一个Array类模板,支持输入、输出、下标访问。 输入:Input() 输出:Show() 下标访问:operator[] #include #include using namespace std; template class Array { int cut; T *p; public: Array(int c):cut(c){ p = new T[cut]; } ~Array(){ delete [] p; } void Input(){ for(int i=0;i>p[i]; } void Show(){ for(int i=0;i a1(5); a1.Input(); a1.Show(); a1[1] = 7; a1.Show(); } cout << "-" << endl; { Array a1(5); a1.Input(); a1.Show(); a1[1] = 'X'; a1.Show(); } return 0; } G 类模板之继承 根据main函数的代码,参考如下的类图,完成相关类的定义。 #include #include #include using namespace std; class A {}; template class B{}; class C :public A {}; template class D :public A {}; class E :public B {}; template class F :public B{}; int main() { A a1; B b1; B b2; C c1; A* c2 = &c1; D d1; D d2; A* d3 = &d1; E e1; B* e2 = &e1; F f1; B* f2 = new F(); B* f3 = new F(); int x; cin >> x; cout << x << endl; return 0; } I 模板之模板类型参数 补充程序,使得输入输出匹配。 注: 1、 sizeof(X) 的值依赖于具体的编译器。 2、 typeid(X).name() 的值依赖于具体的编译器。 #include #include using namespace std; template class A { public: T x; A() :x(0) {} }; template class A > class B { public: Aa[N]; }; int main() { B b1; cin >> b1.a[3].x; cout << "sizeof(b1) = " << sizeof(b1) << endl; cout << "typeid(b1.a).name() = " << typeid(b1.a).name() << endl; for (int i = 0; i < 5; i++) cout << "b1.a[" << i << "].x = " << b1.a[i].x << endl; return 0; } H 类模板之半特化、全特化 特化类模板A,使得程序符合输出要求。 #include #include #include using namespace std; template class A { public: void f() { cout << "call A<*,*>::f();" << endl; }; }; template class A { public: void f() { cout << "call A::f();"<< endl;}; }; template<> class A { public: void f() { cout << "call A::f();" < a1; A a2; A a3; A a4; cout << "--" << endl; a1.f(); a2.f(); a3.f(); a4.f(); cout << "--" << endl; return 0; } 问题 F: 类模板之高级数组 #include templateclass Array{ public: T* arr; int size; Array(int n) :size(n) { arr = new T[size]; } ~Array() { delete arr; } void Input() { for (int i = 0; i < size; i++)cin >> arr[i]; } void Show() { for (int i = 0; i < size; i++)cout << arr[i] << " "; cout << endl; } T& operator[](int idx) { return arr[idx]; } friend istream& operator>>(istream& input,Array& obj) { for (int i = 0; i < obj.size; i++) input >> obj.arr[i]; return input; } friend ostream& operator<<(ostream& output, Array& obj) { for (int i = 0; i < obj.size; i++) output << obj.arr[i] << " "; output << endl; return output; } void Sort() { sort(arr, arr + size); } }; 第七章 A 1.7 STL向量基础 STL向量基础,补充代码,使得程序按要求输出。 #include #include #include #include using namespace std; int main() { int a, b, c, d; cin >> a >> b >> c >> d; vector v1(a, b); v1.insert(v1.end(), c, d); for (unsigned int i = 0; i < v1.size(); i++) cout << (i == 0 ? "" : ", ") << v1[i]; cout << endl; return 0; } B STL算法基础1 整数升序排序。 #include #include #include #include #include using namespace std; #define N 10 int main() { int a[N] = { 5,6,7,8,9,1,2,3,0,4 }; stable_sort( a,a+N ); for (int i = 0; i < N; i++) cout << (i == 0 ? "" : ", ") << a[i]; cout << endl; return 0; } C STL算法基础2 整数升序排序。 #include #include #include #include #include #include using namespace std; #define N 10 int main() { vector a = { 5,6,7,8,9,1,2,3,0,4 }; stable_sort( a.begin(),a.end() ); for (int i = 0; i < N; i++) cout << (i == 0 ? "" : ", ") << a[i]; cout << endl; return 0; } D STL向量高级 程序功能: 1、输入n、以及n个整数,接着输入a、b、c、d、e、f, 2、删除第a个整数,(注意:此题中最前面的一个称为第0个,a、b、d的值保证能够删除或插入) 3、删除第b个整数开始的c个整数, 4、在d位置插入e个f, 5、依次输出余下的整数; 6、升序输出; 7、降序输出。 #include #include #include using namespace std; int main() { int n; cin >> n; vector v1(100); vector v2(6); for (int i = 0; i < n; i++) cin >> v1[i]; for (int j = 0; j < 6; j++) cin >> v2[j]; v1.erase(v1.begin() + v2[0]); v1.erase(v1.begin() + v2[1], v1.begin() + v2[1] + v2[2]); v1.insert(v1.begin() + v2[3], v2[4], v2[5]); n = n - 1 - v2[2] + v2[4]; for (int i = 0; i < n; i++) cout << v1[i] << (i != n - 1 ? ", " : "\n"); stable_sort(v1.begin(), v1.begin() + n); for (int i = 0; i < n; i++) cout << v1[i] << (i != n - 1 ? ", " : "\n"); stable_sort(v1.begin(), v1.begin() + n, greater()); for (int i = 0; i < n; i++) cout << v1[i] << (i != n - 1 ? ", " : "\n"); return 0; } E STL算法基础3 整数降序排序。 #include #include #include #include #include using namespace std; #define N 10 int main() { int a[N] = { 5,6,7,8,9,1,2,3,0,4 }; stable_sort( a,a+N,greater() ); for (int i = 0; i < N; i++) cout << (i == 0 ? "" : ", ") << a[i]; cout << endl; return 0; } F STL排序去重 输入n,以及n个整数, 去掉重复的整数,并升序输出。 #include #include #include #include #include #include using namespace std; int main(){ int n; int a[n]; cin>>n; for(int i=0;i>a[i]; set s(a,a+n); set::iterator its; for(its = s.begin();its!=s.end();its++) cout<<(its == s.begin()? "" :", ")<<*its; cout< #include #include #include using namespace std; int main() { int n; double score; string name; cin >> n; mapmap; while (n--) { cin >> name; cin >> score; map[name] = score; } while (1) { cin >> name; if (name == "end") break; if (map[name] != 0) cout << setw(8) << name << ": ", printf("%.2lf\n", map[name]); else cout << setw(8) << name << ": " << "NONE" << endl; } } H 容器的遍历 遍历输出 vector 中的所有元素。 #include #include #include #include #include using namespace std; void Show(const int& x) { cout << x << ", "; } int main() { vector v{ 5,6,7,8,9,0,1,2,3,4 }; for_each( v.begin(),v.end(),Show ); } I 积累连续运算 累加和累积。 #include #include #include #include #include #include using namespace std; template class A { public: T operator()(const T& a, const T& b) { return a + b; } }; template class B { public: T operator()(const T& a, const T& b) { return a * b; } }; int main() { int n; long a[100]; cin >> n; for (int i = 0; i < n; i++) cin >> a[i]; cout << "和 = " << accumulate(a, a + n, 0, A()) << endl; cout << "积 = " << accumulate(a, a + n, 1, B()) << endl; return 0; } J 仿函数 计算 2 个整数的和差积商余以及 6 种关系运算(< <= == != > >=)的结果。 #include #include #include #include #include using namespace std; typedef long T; int main() { T a, b; function funcs[] = { plus(), minus(), multiplies(), divides(), modulus(), less(), less_equal(), equal_to(), not_equal_to(), greater(), greater_equal(), }; cin >> a >> b; for (auto& f : funcs) { cout << f(a, b) << endl; } cout << "--" << endl; for (auto i = 0; i < sizeof(funcs) / sizeof(funcs[0]); i++) { cout << funcs[i](a, b) << endl; } } K STL之巅峰一战 三行代码,实现: 任意个整数的输入、排序、输出。 注:本地调试时,输入数据后,按回车,再按 CTRL + Z 结束输入。 #include #include #include #include using namespace std; int main() { vector v; copy( istream_iterator(cin), istream_iterator(), back_inserter< vector >(v) ); sort(v.begin(), v.end()); copy(v.begin(), v.end(), ostream_iterator(cout, " ")); } L C++:泛型编程stack(括号匹配) 假设表达式中包含一种括号:圆括号,其嵌套顺序随意,即 (()()) 或 (()) 等为正确的格式,)( 或 ((()) 或 ()) 均为不正确的格式。 检验括号是否匹配可以用堆栈来实现: 当遇到 ( 时进栈, 遇到 ) 时出栈,并进行匹配检验,如果出现不匹配的情况立即结束,否则继续取下一个字符。如果没有遇到不匹配的情况,最后判断栈是否为空,栈为空,括号匹配,否则不匹配。 #include #include #include using namespace std; int main() { string str; while (cin >> str) { bool ok = true; stack s; for (int i=0; i < str.length(); i++) { if (str[i] == '(') {s.push(1); } else { if (s.empty()) { ok = false; break; } else s.pop(); } } if (!s.empty()) ok = false; cout << (ok ? "Yes" : "No") << endl; } return 0; } 第八章 A 1.8 格式化输出3 格式化输出:学生姓名和成绩。 姓名 10 字符,左对齐;成绩 6 字符,右对齐。 #include #include #include using namespace std; #define N 5 class Student { public: string name; double score[3]; }; istream& operator>>(istream& is,Student& s) { is>>s.name>>s.score[0]>>s.score[1]>>s.score[2]; return is; } ostream& operator<<(ostream& os,const Student& s) { os<> s[i]; } for (int i = 0; i < N; i++) { cout << s[i] << endl; } return 0; } B 格式化输入和输出1 输入若干组数据。 每组 1 行,为 3 整数 a、b、c,分别使用 8 进制、10 进制、16 进制输入。 输出: 每组 3 行,分别输出 a、b、c的 8 进制、10 进制、16 进制形式,各占 15、12、12 字符宽度。 #include #include using namespace std; int main() { int a,b,c; while(cin>>oct>>a>>dec>>b>>hex>>c) { cout< #include #include #include using namespace std; int main() { char a[100],b[100]; int x,y; cin.getline(a,100,'\n'); cin.getline(b,100,'x'); x=strlen(a); y=strlen(b); cout<<"line 1: length = "< #include #include #include using namespace std; int main() { string name; double height, weight; char str[100]; cin.get(str, 100); stringstream ss; ss<>name>>height>>weight; cout<<" name: "<=len,终止程序。 #include #include #include #include #include using namespace std; int main() { char str[100]; char ch; int len, p; cin >> str; stringstream ss; ss << str; len = strlen(str); memset(str, 0, 100); while (cin >> p) { if (abs(p) >= len) break; if(p<0) { string s=ss.str(); cout<<"idx "< 95: A 等 y >= 80: B 等 y >= 60: C 等 y >= 45: D 等 y >= 0: E 等 (2)对于其他分制: 先变为 100 分制,再处理。如 f2(100, 80): 表示 100 分制得 80 分,应返回 B。 f2(120, 80): 表示 120 分制得 80 分,应返回 C。 (3)参数无效,则抛出异常: if (x < 5) 抛出 x; if (y < 0) 抛出 y; if (y > x) 抛出 "溢出"; // char* const 函数 f1(x,y):调用 f2(),并进行异常处理,只处理 int 异常,输出错误信息,并返回 'X'。 函数 main():调用 f1(),并进行异常处理,处理所有异常。 #include #include #include using namespace std; char f2(int, double); char f1(int, double); // 在这里输入你的代码 char f2(int x,double y) { if(x<5)throw x; if(y<0)throw y; if(y>x)throw "溢出"; y=y/x*100; if(y<95)return 'A'; else if(y>=80)return 'B'; else if(y>=60)return 'C'; else if(y>=45)return 'D'; else return 'E'; } char f1(int a,double b) { try{ return f2(a,b); } catch(int& ex) { cout<<"f1()处理分母级错误, "<> m >> n) { try { auto v = f1(m, n); cout << "f(" << m << ", " << n << ") = " << v << endl; } catch (double& c) { cout << "main() 处理分子过小错误, " << c << endl; } catch (const char* const& c) { cout << "main() 处理分子过大错误, " << c << endl; } catch (...) { cout << "未知异常." << endl; } } return 0; } char f2(int x, double y) { if (x < 5) throw x; if (y < 0) throw y; if (y > x) throw "溢出"; y = y / x * 100; if (y > 95) return 'A'; else if (y >= 80) return 'B'; else if (y >= 60) return 'C'; else if (y >= 45) return 'D'; else return 'E'; } char f1(int a, double b) { try { return f2(a, b); } catch (int& ex) { cout << "f1() 处理分母错误, "<< ex << endl; return 'X'; } } B 使用自定义异常类型 编程实现 100 分制( x 分制)到 5 分制的转换。 函数 f2(x,y):实现 100 分制(或其他分制 x )的 y 分值到 5 分制的转换,返回 5 分制的等级。 (1)对于100分制: y > 95: A 等 y >= 80: B 等 y >= 60: C 等 y >= 45: D 等 y >= 0: E 等 (2)对于其他分制: 先变为 100 分制,再处理。如 f2(100,80): 表示 100 分制得 80 分,应返回 B。 f2(120,80): 表示 120 分制得 80 分,应返回 C。 (3)参数无效,则抛出异常: if (x < 5) 抛出 ErrA 对象; if (y < 0) 抛出 ErrB 对象; if (y > x) 抛出 ErrC 对象; 函数 main():调用 f2(),并进行异常处理,处理所有异常。 #include #include #include using namespace std; class ErrA { public: virtual const char* what() { return "分母过小"; } }; class ErrB :public ErrA { public: const char* what() { return "分子过小"; } }; class ErrC :public ErrB { public: const char* what() { return "分子过大"; } }; char f2(int, double); char f2(int x,double y) { ErrA a; ErrB b; ErrC c; if(x<5) throw a; if(y<0) throw b; if(y>x) throw c; y=y/x*100; if(y>95) return 'A'; else if(y>=80) return 'B'; else if(y>=60) return 'C'; else if(y>=45) return 'D'; else return 'E'; } int main() { int n; double m; while(cin>>n>>m) { try{ auto v=f2(n,m); cout<< "f(" << n << ", " << m << ") = " < 95: A 等 y >= 80: B 等 y >= 60: C 等 y >= 45: D 等 y >= 0: E 等 (2)对于其他分制: 先变为 100 分制,再处理。如 f2(100,80): 表示 100 分制得 80 分,应返回 B。 f2(120,80): 表示 120 分制得 80 分,应返回 C。 (3)参数无效,则抛出异常: if (x < 5) 抛出 runtime_error 对象; if (y < 0) 抛出 range_error 对象; if (y > x) 抛出 out_of_range 对象; 函数 main():调用 f2(),并进行异常处理,处理所有异常。 #include #include #include #include #include using namespace std; char f2(int, double); // 在这里输入你的代码 char f2(int x,double y) { runtime_error a("分母过小"); range_error b("分子过小"); out_of_range c("分子过大"); if(x<5)throw a; if(y<0)throw b; if(y>x)throw c; y=y/x*100; if(y>95)return 'A';//返回字符时,需用单引号,否则报错, else if(y>=80)return 'B'; else if(y>=60)return 'C'; else if(y>=45)return 'D'; else return 'E'; } int main() { int n; double m; while(cin>>n>>m) try{ auto v=f2(n,m); cout<<"f("< #include #include #include using namespace std; int main() { vector v = { 27,24,33,39,21,50,94,63,19,83 }; for ( auto x:v ) { cout << " " << x; } cout << endl; return 0; } F lambda 函数 补充程序,实现特定排序。要求: 1、输入 n 个整数 ti(10<=ti<=99)。 2、按个位数降序排序,若个位数一致,则按值降序排序。 #include #include #include #include #include using namespace std; int main() { vector v; int n, t; cin >> n; while (n--) { cin >> t; v.push_back(t); } sort(v.begin(), v.end(), [](int a,int b){return ((a%10!=b%10)?(a%10>b%10):(a>b));} ); for (auto x : v) { cout << x << endl; } return 0; } 北大作业题 问题B.难一点的swap: int *&a,int*&b 问题 F: 奇怪的类复制: Sample(int n = 0) : v(n == 5 ? 9 : (n == 20 ? 22 : n)) {} Sample(const Sample& other) : v(other.v) {} Sample& operator=(const Sample& other) { if (this != &other) { v = (other.v == 9) ? 5 : other.v; } return *this; } 问题 T: 编程填空:统计动物数量: class Animal { public: static int number; Animal() { ++number; } virtual ~Animal() { --number; } }; int Animal::number = 0; class Dog : public Animal { public: static int number; Dog() { ++number; } ~Dog() override { --number; } }; int Dog::number = 0; class Cat : public Animal { public: static int number; Cat() { ++number; } ~Cat() override { --number; } }; int Cat::number = 0;