Java程序设计:面对对象、类、接口基础编程题(PTA)

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.RectangleCircle类均继承自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() //获得父类型;

注意:处理输入的时候使用混合使用nextIntnextLine需注意行尾回车换行问题。

思考

  1. 你觉得sumAllArea和sumAllPerimeter方法放在哪个类中更合适?
  2. 是否应该声明为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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力敲代码呀~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值