前言
前段时间有一个面试要考Java,在翻复习资料时,发现了三道题(谢谢张老师)基本上概括了一个语言的常用语法。特此记录,围绕这三道题用不同的语言编写,以便后续进行快速地复习。如果想要详细复习,请看C/C++要点复习
问题一
问题描述
请从控制台输入一个三角形的三条边长,并判断这三条边能不能构成一个三角形。
如能构成,请打印输出这个三角形的周长(要求输出宽度为8,保留两位小数),如不能构成,请打印输出具体提示。
考察点:输入 、输出 、if条件判断
Java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 public class TestTriangle { public static void main (String[] args) { double []a = new double [3 ]; Scanner scanner = new Scanner(System.in); for (int i = 0 ; i < 3 ; i++) { System.out.print("第" + (i+1 ) + "条边的边长:" ); a[i] = scanner.nextDouble(); } Arrays.sort(a); if (a[0 ] + a[1 ] > a[2 ]) { double c = a[0 ]+a[1 ]+a[2 ]; System.out.printf("三角形的周长为:%8.2f\n" , c); } else { System.out.println("无法构成三角形" ); } } }
C++
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 #include <iostream> #include <algorithm> using namespace std ;int main () { double a[3 ]; for (int i = 0 ; i < 3 ; i++) { cout << "第" << i + 1 << "条边的边长:" ; cin >> a[i]; } sort(a, a + 3 ); if (a[0 ] + a[1 ] > a[2 ]) { double c = a[0 ] + a[1 ] + a[2 ]; printf ("三角形的周长为: % 8.2f\n" , c); } else { printf ("无法构成三角形" ); } return 0 ; }
问题二
题目描述
编写一个ZPoint类,其中包括:
两个私有成员double型变量x、y
一个构造方法ZPoint(double x,double y)
两个访问器分别访问x和y
一个静态方法distance(ZPoint p,ZPoint q)计算两点p、q的距离
一个实例方法distance(double x,double y)计算形参定义的点与当前点对象之间的距离。
在此基础上再编写一个测试类Test,用ZPoint实例化两个点对象(11,9)和(100,21.5),然后打印输出这两个点对象之间的距离,此外打印输出点对象(11,9)与x=71,y=19所定义的点的距离。
考察点:类的定义与创建 、实例方法 、静态方法
Java
ZPoint.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 public class ZPoint { private double x; private double y; public ZPoint (double x, double y) { this .x = x; this .y = y; } public double getX () { return x; } public double getY () { return y; } public static double distance (ZPoint p, ZPoint q) { double disX = Math.abs(p.getX() - q.getX()); double disY = Math.abs(p.getY() - q.getY()); double dis = Math.sqrt(disX*disX + disY*disY); return dis; } public double distance (double x, double y) { double disX = Math.abs(this .x - x); double disY = Math.abs(this .y - y); double dis = Math.sqrt(disX*disX + disY*disY); return dis; } }
Test.java
1 2 3 4 5 6 7 8 9 10 public class Test { public static void main (String[] args) { ZPoint p1 = new ZPoint(11 , 9 ); ZPoint p2 = new ZPoint(100 , 21.5 ); System.out.println("两个点对象之间的距离为:" ); System.out.println(ZPoint.distance(p1, p2)); System.out.println("点对象(11,9)与x=71,y=19所定义的点的距离为:" ); System.out.println(p1.distance(71 ,19 )); } }
C++
当在类的外部定义静态成员时,不能重复static关键字
该关键字只能出现在类内部的声明语句
ZPoint.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #ifndef ZPOINT_H #define ZPOINT_H #include <iostream> using namespace std ;class ZPoint { public : ZPoint(double x, double y); double getX () ; double getY () ; double distance (double x, double y) ; static double distance (ZPoint& p, ZPoint& q) ; private : double x; double y; }; #endif
ZPoint.cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 #include "ZPoint.h" #include <cmath> ZPoint::ZPoint(double x, double y) { this ->x = x; this ->y = y; } double ZPoint::getX () { return this ->x; } double ZPoint::getY () { return this ->y; } double ZPoint::distance (double x, double y) { double disX = abs (this ->x - x); double disY = abs (this ->y - y); double dis = sqrt (disX * disX + disY * disY); return dis; } double ZPoint::distance (ZPoint& p, ZPoint& q) { double disX = abs (p.getX() - q.getX()); double disY = abs (p.getY() - q.getY()); double dis = sqrt (disX * disX + disY * disY); return dis; }
Test.cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 #include <iostream> #include "ZPoint.h" int main () { ZPoint p1 (11 , 9 ) ; ZPoint p2 (100 , 21.5 ) ; cout << "两个点对象之间的距离为:" << endl ; cout << ZPoint::distance(p1, p2) << endl ; cout << "点对象(11,9)与x=71,y=19所定义的点的距离为:" << endl ; cout << p1.distance(71 , 19 ) << endl ; return 0 ; }
问题三
问题描述
请运用面向对象程序设计思想编写完成几何对象的面积计算程序,具体要求为:GeometricObject(抽象类)、Circle、Cylinder和Rectangle之间的继承关系如下图所示,
请分按类图分别实现这四个类;
然后编写一测试类GeoAreaSum,在该类中编写一个方法求数组中所有几何对象的面积之和,其方法头为:sumArea(GeometricObject[ ] a)
再在GeoAreaSum的main方法中创建一个包括三个对象(一个半径为5的圆、一个半径为10、高为5的圆柱体和一个宽和高分别为6和8的矩形)的GeometricObject数组,使用sumArea方法计算出它们的总面积并在屏幕上打印输出。
(2) 另请思考如果将Cylinder与GeometricObject的继承关系改成与Cylinder与Circle的继承关系,同时将Cylinder中的私有变量r去掉,Cylinder又该如何编写?
考察点:继承 、多态 、接口 、抽象类 、虚函数 ,纯虚函数 、虚基类
C++
如果子类调用父类带参数的构造方法,只能使用列表生成式
GeometricObject.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 #ifndef GEOMETRIC_H #define GEOMETRIC_H #include <iostream> #include <cmath> #define PI acos(-1) using namespace std ;class GeometricObject { public : virtual double findArea () = 0 ; virtual double findPerimeter () = 0 ; virtual ~GeometricObject() { } }; class Circle : public GeometricObject{ public : Circle(); Circle(double r); double getR () ; double findArea () ; double findPerimeter () ; private : double r; }; class Rectangle : public GeometricObject{ public : Rectangle(); Rectangle(double w, double h); double findArea () ; double findPerimeter () ; private : double w; double h; }; class Cylinder : public Circle{ public : Cylinder(); Cylinder(double h, double r); double findArea () ; double findPerimeter () ; private : double h; }; double sumArea (GeometricObject *a[], int n) ;#endif
GeometricObject.cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 #include "GeometricObject.h" Circle::Circle() { this ->r = 0 ; } Circle::Circle(double r) { this ->r = r; } double Circle::getR () { return this ->r; } double Circle::findArea () { return PI * r * r; } double Circle::findPerimeter () { return 2 * PI * r; } Rectangle::Rectangle() { this ->w = 0 ; this ->h = 0 ; } Rectangle::Rectangle(double w, double h) { this ->w = w; this ->h = h; } double Rectangle::findArea () { return w * h; } double Rectangle::findPerimeter () { return 2 * (w + h); } Cylinder::Cylinder(): Circle(0 ) { this ->h = 0 ; } Cylinder::Cylinder(double h, double r) : Circle(r) { this ->h = h; } double Cylinder::findArea () { return 2 * PI * getR() * h + 2 * PI * getR() * getR(); } double Cylinder::findPerimeter () { return 2 * PI * getR() * 2 ; } double sumArea (GeometricObject* a[], int n) { double sum = 0 ; for (int i = 0 ; i < n; i++) { sum += a[i]->findArea(); } return sum; }
GeoAreaSum.cpp
1 2 3 4 5 6 7 8 9 10 11 12 #include <iostream> #include "GeometricObject.h" int main () { GeometricObject *objects[3 ]; objects[0 ] = new Circle(5 ); objects[1 ] = new Cylinder(5 , 10 ); objects[2 ] = new Rectangle(6 , 8 ); cout << "总面积为:" << sumArea(objects, 3 ) << endl ; return 0 ; }
Java
GeometricObject.java
1 2 3 4 public abstract class GeometricObject { abstract double findArea () ; abstract double findPerimeter () ; }
Circle.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 public class Circle extends GeometricObject { private double r; public Circle (double r) { this .r = r; } public double getR () { return r; } @Override double findArea () { return Math.PI*r*r; } @Override double findPerimeter () { return 2 *Math.PI*r; } }
Rectangle.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 public class Rectangle extends GeometricObject { private double w; private double h; public Rectangle (double w, double h) { this .w = w; this .h = h; } @Override double findArea () { return w*h; } @Override double findPerimeter () { return 2 *(w+h); } }
Cylinder.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 public class Cylinder extends Circle { private double h; public Cylinder (double h, double r) { super (r); this .h = h; } @Override double findArea () { return 2 *Math.PI*getR()*h+2 *Math.PI*getR()*getR(); } @Override double findPerimeter () { return 2 *Math.PI*getR()*2 ; } }
GeoAreaSum.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 public class GeoAreaSum { public static double sumArea (GeometricObject[] a) { double sum = 0 ; for (GeometricObject geometricObject : a) { sum += geometricObject.findArea(); } return sum; } public static void main (String[] args) { GeometricObject[] objects = new GeometricObject[3 ]; objects[0 ] = new Circle(5 ); objects[1 ] = new Cylinder(5 ,10 ); objects[2 ] = new Rectangle(6 ,8 ); System.out.println("总面积为:" + sumArea(objects)); } }
参考资料
C++子类继承父类时如何写构造函数