编写一个计算各种形状的面积和周长的程序。
要求
父类Shape2D为一个抽象类,其中包含计算周长和计算面积两个抽象方法。其他形状圆(Circle),三角形(Triangle)和长方形(Rectangle)类均继承自Shape2D类。而正方形Square类继承自Rectangle类。编写计算这些形状的面积和周长的各类的程序。
abstract public double getArea();//计算面积的方法
abstract public double getL();//计算周长的方法
如果三角形的边不满足要求,这两方法都返回-1
PI=3.14159
各类的构造函数如下:
public Circle(double r);r为圆的半径
public Triangle(double a,double b,double c);a,b,c为三边的长
public Rectangle(double a,double b);a,b为长宽
public Square(double a);a为边长
####提示: 不同的形状包含的属性应该不同,构造函数应该不同,计算周长和面积的方法也应该不同。
Circle类:
package step1;
//在这完成Circle类的编写
public class Circle extends Shape2D{
private double r;
public Circle(double r) {
this.r=r;
}
@Override
public double getArea() {
// TODO Auto-generated method stub
return Math.PI*r*r;
}
@Override
public double getL() {
// TODO Auto-generated method stub
return Math.PI*2*r;
}
}
Shape2D类:
public abstract class Shape2D{
//在这完成Shape2D类的程序的编写
public abstract double getArea();
public abstract double getL();
}
Triangle类:
//在这完成Triangle类的编写
public class Triangle extends Shape2D {
private double a;
private double b;
private double c;
public Triangle(double a,double b,double c){
this.a=a;
this.b=b;
this.c=c;
}
@Override
public double getArea() {
// TODO Auto-generated method stub
if(a+b<=c||a-b>=c) {
return -1;
}else {
double p=(a+b+c)/2;
return Math.sqrt(p*(p-a)*(p-b)*(p-c));
}
}
@Override
public double getL() {
// TODO Auto-generated method stub
if(a+b<=c||a-b>=c) {
return -1;
}else {
return a+b+c;
}
}
}
Rectangle类:
//在这完成Rectangle类的编写
public class Rectangle extends Shape2D {
public static double a;
public static double b;
public Rectangle(double a,double b) {
this.a=a;
this.b=b;
}
@Override
public double getArea() {
// TODO Auto-generated method stub
return a*b;
}
@Override
public double getL() {
// TODO Auto-generated method stub
return 2*(a+b);
}
}
Square类:
public class Square extends Rectangle {
private double a;
public Square (double a) {
super(a,b);
this.a=a;
}
@Override
public double getArea() {
// TODO Auto-generated method stub
return a*a;
}
@Override
public double getL() {
// TODO Auto-generated method stub
return 4*a;
}
}
知识点总结:
Java类的继承:
在Java中通过extends 关键字可以申明一个类是从另外一个类继承而来的,一般形式如下:
class 父类 {
}
class 子类 extends 父类 {
}
继承的特点:
-
子类拥有父类非 private 的属性、方法。
-
子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
-
子类可以用自己的方式实现父类的方法。
-
Java 的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类,多重继承就是,例如 A 类继承 B 类,B 类继承 C 类,所以按照关系就是 C 类是 B 类的父类,B 类是 A 类的父类,这是 Java 继承区别于 C++ 继承的一个特性。
-
提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系越紧密,代码独立性越差)。
继承关键字:
1.继承可以使用 extends 和 implements 这两个关键字来实现继承,而且所有的类都是继承于 java.lang.Object,当一个类没有继承的两个关键字,则默认继承object(这个在 java.lang 包中,所以不需要 import)祖先类。java类继承属于单一继承,extends只能继承一个类,而 implements 关键字可以变相的使java具有多继承的特性,使用范围为类继承接口的情况,可以同时继承多个接口(接口跟接口之间采用逗号分隔)。
2.super关键字:super关键字来实现对父类成员的访问,用来引用当前对象的父类。
3.this关键字:指向自己的引用。
4.final 关键字声明类可以把类定义为不能继承的,即最终类;或者用于修饰方法,该方法不能被子类重写。实例变量也可以被定义为 final,被定义为 final 的变量不能被修改。被声明为 final 类的方法自动地声明为 final,但是实例变量并不是 final。
附带C语言算法题:
具体要求是:给定一个单词,请你输出它在给定的文章中出现的次数和第一次出现的位置。注意:匹配单词时,不区分大小写,但要求完全匹配,即给定单词必须与文章中的某一独立单词在不区分大小写的情况下完全相同(参见样例1),如果给定单词仅是文章中某一单词的一部分则不算匹配(参见样例2)。
输入
输入共2行。
第1行为一个字符串,其中只含字母,表示给定单词;
第2行为一个字符串,其中只可能包含字母和空格,表示给定的文章。
1≤单词长度≤10。
1≤文章长度≤1,000,000。
输出
输出占一行,如果在文章中找到给定单词则输出两个整数,两个整数之间用一个空格隔开,分别是单词在文章中出现的次数和第一次出现的位置(即在文章中第一次出现时,单词首字母在文章中的位置,位置从0开始);如果单词在文章中没有出现,则直接输出一个整数−1。
#include <cstdio>
#include <iostream>
#include<cstring>
#include <algorithm>
using namespace std;
char m[11],n[1000001];
int a,b,flag=0,sum=0,pos=0;
int main(){
fgets(m,11,stdin);
fgets(n,1000001,stdin);
a=strlen(m)-1;
b=strlen(n)-1;
for(int i=0;i<a;i++){
if(m[i]<=90&&m[i]>=65){
m[i]+=32;//将第一行所有字母均转化为小写
}
}
for(int i=0;i<b;i++){
if(n[i]<=90&&n[i]>=65){
n[i]+=32;// 将第二行所有字母均转化为小写
}
}
for(int i=0;i<b;i++){
flag=0;
if(n[i]==' ') continue;
for(int j=0;j<a;j++){
if(n[i+j]!=m[j]){
flag=1;
break;
}
}if(flag==0&&(i==0||n[i-1]==' ')&&n[i+a]==' '){
if(sum==0) pos=i;
sum++;
}
}
if(sum==0){
printf("-1");
}
else{
printf("%d %d",sum,pos);
}
return 0;
}