6-1 设计一个矩形类Rectangle
设计一个名为Rectangle的类表示矩形。这个类包括:
两个名为width和height的double型数据域,它们分别表示矩形的宽和高。width和height的默认值都为1.
一个无参构造方法。
一个为width和height指定值的矩形构造方法。
一个名为getArea()的方法返回这个矩形的面积。
一个名为getPerimeter()的方法返回这个矩形的周长。
类名为:
Rectangle
裁判测试程序样例:
import java.util.Scanner;
/* 你的代码将被嵌入到这里 */
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
double w = input.nextDouble();
double h = input.nextDouble();
Rectangle myRectangle = new Rectangle(w, h);
System.out.println(myRectangle.getArea());
System.out.println(myRectangle.getPerimeter());
input.close();
}
}
输入样例:
3.14 2.78
输出样例:
8.7292
11.84
实验代码:
class Rectangle{
double width = 1;
double height = 1;
public Rectangle(){}
public Rectangle(double width, double height){
this.width = width;
this.height = height;
}
public double getArea(){
double area = width*height;
return area;
}
public double getPerimeter(){
double perimeter = 2*(width+height);
return perimeter;
}
}
7-1 类的定义与对象使用
请定义一个学生类(Student),包含学号、姓名、年龄(7-60岁)三个私有成员。从键盘输入学生的成员值后生成对象,并按要求输出相应的结果。
输入格式:
第一行一个整数k,代表后面要生成的学生人数。
从第二行开始的连续k行,每行3个数据,分别表示一个学生的学号、姓名和年龄。
输出格式:
输出每个学生的基本情况。如果数据不符合要求则输出"bad"
输入样例:
3
20174042001 zhangsan 20
20174042030 lisi 2
20174042050 wangwu 17
输出样例:
zhangsan 20174042001 20
bad
wangwu 20174042050 17
实验代码:
import java.util.Scanner;
class Student{
private String s_num;
private String s_name;
private int s_age;
public Student(String s_num, String s_name, int s_age){
this.s_num = s_num;
this.s_name = s_name;
this.s_age = s_age;
}
public void out(){
if(s_age<=60 && s_age>=7){
System.out.println(s_name + " " + s_num + " " +s_age);
}else {
System.out.println("bad");
}
}
}
public class Main {
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
int num = scanner.nextInt();
for(int i=0; i < num; i++){
String s_num = scanner.next();
String s_name = scanner.next();
int s_age = scanner.nextInt();
Student student = new Student(s_num, s_name, s_age);
student.out();
}
}
}
7-2 好玩的图形
给定图形接口定义如下:
interface Shape{
float getArea();//求面积
float getPerimeter();//求周长
}
请实现以上接口,定义圆形类(用数字1表示)、矩形类(用数字2表示)。
从键盘输入图形类别(1代表圆,2代表矩形)和相应的参数,计算并输出相应图形的面积和周长,结果保留小数点后2位数据。
输入格式:
输入数据包含多行,第一行一个整数n,表示接下来共有n个图形对象需要生成。
每个图形数据占2行,第一行为数字1或2,表示图形类别,第二行为生成图形的参数。
输出格式:
每个图形对应的面积和周长。
输入样例:
2
1
1.0
2
1.0 2.0
输出样例:
3.14 6.28
2.00 6.00
实验代码:
import java.util.Scanner;
interface Shape{
float getArea();//求面积
float getPerimeter();//求周长
}
abstract class Sy implements Shape{
private float r;
public Sy(float r){
this.r = r;
}
public float getArea(){
float area = 3.1415926f * r * r;
return area;
}
public float getPerimeter(){
float perimeter = 2*3.1415926f*r;
return perimeter;
}
}
abstract class Sj implements Shape{
private float x;
private float y;
public Sj(float x, float y){
this.x = x;
this.y = y;
}
public float getArea(){
float area = x*y;
return area;
}
public float getPerimeter(){
float perimeter = 2*(x+y);
return perimeter;
}
}
public class Main {
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
int i = scanner.nextInt();
for(int j=0; j<i; j++){
int num = scanner.nextInt();
if(num == 1) {
float r = scanner.nextFloat();
Sy sy = new Sy(r){};
float area = sy.getArea();
float perimeter = sy.getPerimeter();
System.out.println(String.format("%.2f",area)+" "+String.format("%.2f",perimeter));
}else if(num == 2){
float x = scanner.nextFloat();
float y = scanner.nextFloat();
Sj sj = new Sj(x, y){};
float area = sj.getArea();
float perimeter = sj.getPerimeter();
System.out.println(String.format("%.2f",area)+" "+String.format("%.2f",perimeter));
}
}
}
}
7-3 声明图书类,记录图书总册数,利用静态变量赋值
声明一个图书类,其数据成员为书名、编号(利用静态变量实现自动编号)、书价,并拥有静态数据成员册数,记录图书的总册数;在构造方法中,利用静态变量为对象的编号赋值,在主方法中定义对象数组,并求出总册数。
输出格式:
请输出每本图书对应的书名,书号,书价以及总图书数。
输出样例:
书名:Java程序设计, 书号:1, 书价:34.5
书名:数据结构, 书号:2, 书价:44.8
书名:C++程序设计, 书号:3, 书价:35.0
图书总册数为:3
实验代码:
import java.util.Scanner;
class Book{
public static int sum = 0;
public int num;
public String name;
public String price;
public Book(String name, String price){
this.name = name;
this.price = price;
sum++;
num = sum;
}
public void out(){
System.out.println("书名:" + name + ", 书号:" + num + ", 书价:" + price);
}
}
public class Main {
public static void main(String[] args){
String name1 = "Java程序设计";
String name2 = "数据结构";
String name3 = "C++程序设计";
String price1 = "34.5";
String price2 = "44.8";
String price3 = "35.0";
Book books[] = new Book[3];
books[0] = new Book(name1, price1);
books[1] = new Book(name2, price2);
books[2] = new Book(name3, price3);
for(int i=0; i<3; i++){
books[i].out();
}
System.out.print("图书总册数为:"+Book.sum);
}
}
7-4 jmu-Java-03面向对象基础-04-形状-继承
前言
前面题目形状中我们看到,为了输出所有形状的周长与面积,需要建立多个数组进行多次循环。这次试验使用继承与多态来改进我们的设计。
本题描述
1.定义抽象类Shape
属性:不可变静态常量double PI
,值为3.14
,
抽象方法:public double getPerimeter()
,public double getArea()
2.Rectangle与Circle类均继承自Shape类。
Rectangle类(属性:int width,length)、Circle类(属性:int radius)。
带参构造方法为Rectangle(int width,int length)
,Circle(int radius)
。toString
方法(Eclipse自动生成)
3.编写double sumAllArea
方法计算并返回传入的形状数组中所有对象的面积和与double sumAllPerimeter
方法计算并返回传入的形状数组中所有对象的周长和。
4.main方法
4.1 输入整型值n,然后建立n个不同的形状。如果输入rect,则依次输入宽、长。如果输入cir,则输入半径。
4.2 然后输出所有的形状的周长之和,面积之和。并将所有的形状信息以样例的格式输出。 提示:使用Arrays.toString
。
4.3 最后输出每个形状的类型与父类型.使用类似shape.getClass()
//获得类型, shape.getClass().getSuperclass()
//获得父类型;
注意:处理输入的时候使用混合使用nextInt
与nextLine
需注意行尾回车换行问题。
思考
- 你觉得sumAllArea和sumAllPerimeter方法放在哪个类中更合适?
- 是否应该声明为static?
输入样例:
4
rect
3 1
rect
1 5
cir
1
cir
2
输出样例:
38.84
23.700000000000003
[Rectangle [width=3, length=1], Rectangle [width=1, length=5], Circle [radius=1], Circle [radius=2]]
class Rectangle,class Shape
class Rectangle,class Shape
class Circle,class Shape
class Circle,class Shape
实验代码:
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main (String [] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
Shape [] shapes = new Shape[n];
for (int i = 0; i < n; i++) {
String str = scanner.next();
if ("rect".equals(str)) {
Rectangle rectangle = new Rectangle(scanner.nextInt(), scanner.nextInt());
shapes[i] = rectangle;
Shape.sumAllArea(rectangle);
Shape.sumAllPerimeter(rectangle);
} else if ("cir".equals(str)) {
Circle circle = new Circle(scanner.nextInt());
shapes[i] = circle;
Shape.sumAllArea(circle);
Shape.sumAllPerimeter(circle);
}
}
scanner.close();
System.out.println(Shape.sumAllPerimeter());
System.out.println(Shape.sumAllArea());
System.out.println(Arrays.toString(shapes));
for (int i = 0; i < n; i++) {
System.out.print(shapes[i].getClass() + ",");
System.out.println(shapes[i].getClass().getSuperclass());
}
}
}
abstract class Shape {
final static double PI = 3.14;
private static double area = 0.0;
private static double perimeter = 0.0;
public abstract double getPerimeter();
public abstract double getArea();
@Override
public abstract String toString();
static double sumAllArea() {
return area;
}
static void sumAllArea(Rectangle rect) {
area += rect.getArea();
}
static void sumAllArea(Circle cir) {
area += cir.getArea();
}
static double sumAllPerimeter() {
return perimeter;
}
static void sumAllPerimeter(Rectangle rect) {
perimeter += rect.getPerimeter();
}
static void sumAllPerimeter(Circle cir) {
perimeter += cir.getPerimeter();
}
}
class Rectangle extends Shape {
private int width;
private int length;
Rectangle(int width, int length) {
this.width = width;
this.length = length;
}
@Override
public double getPerimeter() {
return 2 * (width + length);
}
@Override
public double getArea() {
return width * length;
}
@Override
public String toString() {
return "Rectangle [width=" + width + ", length=" + length + "]";
}
}
class Circle extends Shape {
private int radius;
Circle (int radius) {
this.radius = radius;
}
@Override
public double getPerimeter() {
return 2 * PI * radius;
}
@Override
public double getArea() {
return PI * radius * radius;
}
@Override
public String toString() {
return "Circle [radius=" + radius + "]";
}
}
7-5 学生类-构造函数
定义一个有关学生的Student类,内含类成员变量:
String name、String sex、int age,所有的变量必须为私有(private)。
1.编写有参构造函数:
能对name,sex,age赋值。
2.覆盖toString函数:
按照格式:类名 [name=, sex=, age=]输出。使用idea自动生成,然后在修改成该输出格式
3.对每个属性生成setter/getter方法
4.main方法中
•输入1行name age sex , 调用上面的有参构造函数新建对象。
输入样例:
tom 15 male
输出样例:
Student [name='tom', sex='male', age=15]
实验代码:
import java.util.Scanner;
public class Main {
public static void main (String [] args) {
String name;
String sex;
int age;
Scanner scanner = new Scanner(System.in);
name = scanner.next();
age = scanner.nextInt();
sex = scanner.next();
Student student = new Student(name, sex, age);
System.out.println(student.toString());
}
}
class Student{
private String name;
private String sex;
private int age;
public Student(String name, String sex, int age){
this.name = name;
this.sex = sex;
this.age = age;
}
public void setAge(int age) {
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public String getName() {
return name;
}
public String getSex() {
return sex;
}
@Override
public String toString() {
return "Student [" +
"name='" + name + "\'" +
", sex='" + sex + "\'" +
", age=" + age +
']';
}
}
7-6 计算年龄
定义一个Birthday类,其成员变量有3个整形变量(出生的年月日):year,month,day;提供构造方法对这3个成员变量进行初始化;提供成员变量的get、set方法;成员函数有getAge(),功能是实现计算到2017年12月25日时该Birthday对象的年龄。编写程序测试这个类。
输入格式:
输入出生的年、月、日(注:输入的年月日以换行隔开)
输出格式:
计算得到年龄
输入样例:
在这里给出一组输入。例如:
1995
12
23
输出样例:
在这里给出相应的输出。例如:
age=22
实现代码:
import java.util.Scanner;
public class Main {
public static void main (String [] args) {
Scanner scanner = new Scanner(System.in);
int y = scanner.nextInt();
int m = scanner.nextInt();
int d = scanner.nextInt();
Birthday birthday = new Birthday(y,m,d);
int age = birthday.getAge();
System.out.println("age="+age);
}
}
class Birthday{
private int year,month,day;
public Birthday(int year, int month, int day){
this.year = year;
this.month = month;
this.day = day;
}
public void setDay(int day) {
this.day = day;
}
public void setMonth(int month) {
this.month = month;
}
public void setYear(int year) {
this.year = year;
}
public int getDay() {
return day;
}
public int getMonth() {
return month;
}
public int getYear() {
return year;
}
public int getAge(){
int y = 2017;
int m = 12;
int d = 25;
int age = 0;
age = y-year;
return age;
}
}