记录本人在Java面向对象程序设计课程中遇到的编程练习题,方便需要时查阅。
设计Cirlce类
【问题描述】设计如下Cirlce类
【输入形式】输入一个半径值(整数)
【输出形式】输出圆的周长和面积
【样例输入】1
【样例输出】
3.141592653589793
6.283185307179586
import java.util.Scanner;
//-----以下为需填片段-------
class Circle{
int r;
public Circle(){
}
public Circle(int r){
this.r=r;
}
public double area(){
return Math.PI*this.r*this.r;
}
public double perimeter(){
return Math.PI*this.r*2;
}
}
//--------------------------
public class CircleApp {
public static void main(String[] args) {
int r;
Scanner in=new Scanner(System.in);
r=in.nextInt();
Circle c1=new Circle(r);
System.out.println(c1.area());
System.out.println(c1.perimeter());
in.close();
}
}
设计Book类
【问题描述】根据下列类图,设计Book类:
【输入形式】1-4的整数
【输出形式】
输入1,输出Compile pass!
输入2,输出params constructor pass!
输入3,输出ligang,java,101.8
输入4,输出(default, noname, 50.0)
输入5,输出(c++, tanhaoqiang, 80.0)
import java.util.Scanner;
//-----begin------
class Book{
String title;
String author;
double price;
public Book() {
this("default","noname",50.0);
}
public Book(String title, String author, double price) {
this.title = title;
this.author = author;
this.price = price;
}
public void setTitle(String title) {
this.title = title;
}
public void setAuthor(String author) {
this.author = author;
}
public void setPrice(double price) {
this.price = price;
}
public String getTitle() {
return title;
}
public String getAuthor() {
return author;
}
public double getPrice() {
return price;
}
@Override
public String toString() {
return "("+title+", "+author+", "+price+")";
}
}
//-----end------
public class BookApp {
public static void main(String[] args) {
Book book;
Scanner scan=new Scanner(System.in);
int sel;
sel=scan.nextInt();
switch(sel){
case 1:
book=new Book();
book.setAuthor("ligang");
book.setTitle("java");
book.setPrice(101.8);
System.out.println("Compile pass!");
break;
case 2:
book=new Book("java", "lixinghua", 89.9);
System.out.println("params constructor pass!");
break;
case 3:
book=new Book();
book.setAuthor("ligang");
book.setTitle("java");
book.setPrice(101.8);
System.out.println(book.getAuthor()+","+book.getTitle()+","+book.getPrice());
break;
case 4:
book=new Book();
System.out.println(book);
break;
case 5:
book=new Book("c++", "tanhaoqiang", 80);
System.out.println(book);
}
scan.close();
}
}
设计Address类和Student类
【问题描述】根据输出要求,设计Address类和Student类。类图如下:
【输入形式】输入1或2或3或4或5
【输出形式】
当输入1时,输出结果为:HuBei,wuhan
当输入2时,输出结果为:HuNan,ChangSha
当输入3时,输出结果为:hubei,YiChang
当输入4时,输出结果为:zhangsan:Hubei,wuhan
当输入5时,输出结果为:zhangsan:hubei,wuhan
import java.util.Scanner;
//-----以下为需填片段-------
class Address{
String province;
String city;
public Address() {
this.setProvince("hubei");
this.setCity("wuhan");
}
public Address(String province, String city) {
this.setProvince(province);
this.setCity(city);
}
public String getProvince() {
return this.province;
}
public void setProvince(String province) {
this.province = province;
}
public String getCity() {
return this.city;
}
public void setCity(String city) {
this.city = city;
}
@Override
public String toString() {
return this.getProvince() + "," + this.getCity();
}
}
class Student{
String name;
Address address;
public Student() {
}
public Student(String name, Address address) {
this.setName(name);
this.setAddress(address);
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public Address getAddress() {
return this.address;
}
public void setAddress(Address address) {
this.address = address;
}
@Override
public String toString() {
return this.getName() + ":" + address.toString();
}
}
//--------------------------
public class Main {
public static void main(String[] args) {
int selected;
Scanner scan=new Scanner(System.in);
selected=scan.nextInt();
Address address=new Address();
Student student=new Student("zhangsan",address);
switch(selected){
case 1:
address.setProvince("HuBei");
System.out.println(address);
break;
case 2:
address=new Address("HuNan","ChangSha");
System.out.println(address);
break;
case 3:
address.setCity("YiChang");
System.out.println(address);
break;
case 4:
address.setProvince("HuBei");
System.out.println(student);
break;
case 5:
System.out.println(student);
}
scan.close();
}
}
设计复数类
【问题描述】根据下列类图和Main类中的main方法,设计复数类
【输入形式】1-10的整数
【输出形式】复数计算后的结果。针对不同实部和虚部,复数的输出格式为:0、2i、-2i、1+2i、1-2i
【样例输出】
输入1,输出0
输入2,输出1.0i
输入3,输出1.0-1.0i
输入4,输出1.0+1.0i
输入5,输出-2.0i
输入6,输出1.0i
输入7,输出-1.0i
输入8,输出no param constructor pass!
输入9,输出params constructor pass!
输入10,compile pass
import java.util.Scanner;
//-----begin------
class Complex{
private double realPart;
private double imagPart;
public Complex() {
}
public Complex(double realPart, double imagPart) {
this.realPart = realPart;
this.imagPart = imagPart;
}
public void setImagPart(double imagPart) {
this.imagPart = imagPart;
}
public double getImagPart() {
return imagPart;
}
public double getRealPart() {
return realPart;
}
public void setRealPart(double realPart) {
this.realPart = realPart;
}
Complex add(Complex c){
return new Complex(this.realPart+c.realPart,this.imagPart+c.imagPart);
}
Complex sub(Complex c){
return new Complex(this.realPart-c.realPart,this.imagPart-c.imagPart);
}
static Complex add(Complex c1,Complex c2){
return c1.add(c2);
}
static Complex sub(Complex c1,Complex c2){
return c1.sub(c2);
}
public String toString() {
if (realPart==0&imagPart==0) return 0+"";
if(realPart==0) return imagPart+"i";
if(imagPart==0) return realPart+"";
if(imagPart<0) return ""+realPart+imagPart+"i";
return realPart+"+"+imagPart+"i";
}
}
//-----end------
public class cmpApp {
public static void main(String[] args) {
Complex c1 ;
Complex c2;
int selected;
Scanner in = new Scanner(System.in);
selected = in.nextInt();
switch (selected) {
case 1:
c1 = new Complex();
System.out.println(c1);
break;
case 2:
c2 = new Complex(0, 1);
System.out.println(c2);
break;
case 3:
c1 = new Complex();
c1.setRealPart(1);
c1.setImagPart(-1);
System.out.println(c1);
break;
case 4:
c1 = new Complex();
c2 = new Complex(0, 1);
c1.setRealPart(1);
System.out.println(c1.add(c2));
break;
case 5:
c1 = new Complex();
c1.setImagPart(-1);
c2 = new Complex(0, 1);
System.out.println(c1.sub(c2));
break;
case 6:
c1 = new Complex();
c2 = new Complex(0, 1);
System.out.println(Complex.add(c1, c2));
break;
case 7:
c1 = new Complex();
c2 = new Complex(0, 1);
System.out.println(Complex.sub(c1, c2));
break;
case 8:
c1 = new Complex();
System.out.println("no param constructor pass!");
break;
case 9:
c2 = new Complex(0, 1);
System.out.println("params constructor pass!");
break;
case 10:
System.out.println("compile pass!");
}
in.close();
}
}
设计日期类
【问题描述】借助Calendar类,设计一个日期类MyDate,能根据多种输入数据创建日期对象,可对日期进行计算,并以不同的模式输出日期。类图如下:
【输入形式】1-8的整数
【输出形式】输入1,则输出2010-10-10
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Scanner;
//-----以下为需填片段-------
class MyDate {
Calendar c = Calendar.getInstance();
String pattern = "yyyy-MM-dd";
public MyDate() {
}
public MyDate(int y, int m, int d) {
c.set(y, m - 1, d);
}
public MyDate(String source) {
SimpleDateFormat sf = new SimpleDateFormat(pattern);
Date d = new Date();
try {
d = sf.parse(source);
c.setTime(d);
} catch (ParseException e) {
e.printStackTrace();
}
}
public MyDate(String source, String pattern) {
SimpleDateFormat sf = new SimpleDateFormat(pattern);
setPattern(pattern);
Date d = new Date();
try {
d = sf.parse(source);
c.setTime(d);
} catch (ParseException e) {
e.printStackTrace();
}
}
public MyDate after(int n) {
c.add(Calendar.DATE, n);
return new MyDate(c.get(Calendar.YEAR), c.get(Calendar.MONTH) + 1, c.get(Calendar.DATE));
}
public MyDate before(int n) {
c.add(Calendar.DATE, -n);
return new MyDate(c.get(Calendar.YEAR), c.get(Calendar.MONTH) + 1, c.get(Calendar.DATE));
}
public Date getDate() {
return c.getTime();
}
public Calendar getCalendar() {
return c;
}
public long getLong() {
return c.getTimeInMillis();
}
public void setPattern(String pattern) {
this.pattern = pattern;
}
public String toString() {
SimpleDateFormat sf = new SimpleDateFormat(pattern);
return sf.format(c.getTime());
}
}
//--------------------------
public class Main {
public static void main(String[] args) {
int selected;
Scanner in=new Scanner(System.in);
selected=in.nextInt();
MyDate md=new MyDate(2000,10,10);
switch(selected){
case 1:
System.out.println(md);
break;
case 2:
md=new MyDate("2010-10-10");
System.out.println(md);
break;
case 3:
md=new MyDate("2010/10/10","yyyy/MM/dd");
System.out.println(md);
break;
case 4:
System.out.println(md.after(8));
break;
case 5:
System.out.println(md.before(20));
break;
case 6:
System.out.println(md.getCalendar().get(Calendar.YEAR));
break;
case 7:
md.setPattern("yyyy/MM/dd");
System.out.println(md);
}
in.close();
}
}
设计接口求图形的周长和面积
【问题描述】设计接口图形Shape、及其实现类Circle和Rectangle、工具类Show中提供两个方法showArea和showPerimeter,分别用于显示图形的周长和面积。App类中main方法中给出测试代码。Circle类中无参构造方法将半径赋值为1,Rectangle类中无参构造方法中width和length都赋值为1。如下图:
【输入形式】1-10的整数,分别执行不同的代码块,得到不同结果。
【输出形式】
输入1,输出3.141592653589793
输入2,输出12.566370614359172
输入3,输出1.0
输入4,输出14.0
输入5,输出3.141592653589793
输入6,输出
12.566370614359172
12.566370614359172
输入7,输出
1.0
12.0
16.0
输入8,输出
12.0
16.0
输入9,输出
1.0
4.0
输入10,输出compile pass!
import java.util.Scanner;
//-----begin------
interface Shape{
double area();
double perimeter();
}
class Circle implements Shape{
int radius;
public Circle() {
radius=1;
}
public Circle(int radius) {
this.radius = radius;
}
@Override
public double area() {
return Math.PI*radius*radius;
}
@Override
public double perimeter() {
return 2*Math.PI*radius;
}
}
class Rectangle implements Shape{
int width;
int length;
public Rectangle() {
width=length=1;
}
public Rectangle(int width, int length) {
this.width = width;
this.length = length;
}
@Override
public double area() {
return width*length;
}
@Override
public double perimeter() {
return (width+length)*2;
}
}
//-----end------
class Show {
//-----begin------
static void showArea(Shape s){
System.out.println(s.area());
}
static void showPerimeter(Shape s){
System.out.println(s.perimeter());
}
//-----end------
}
public class App {
public static void main(String[] args) {
int n;
Scanner scan=new Scanner(System.in);
n=scan.nextInt();
Shape s;
switch(n){
case 1:
System.out.println(new Circle().area());
break;
case 2:
System.out.println(new Circle(2).perimeter());
break;
case 3:
System.out.println(new Rectangle().area());
break;
case 4:
System.out.println(new Rectangle(3,4).perimeter());
break;
case 5:
s=new Circle();
System.out.println(s.area());
break;
case 6:
s=new Circle(2);
Show.showArea(s);
Show.showPerimeter(s);
break;
case 7:
s=new Rectangle();
System.out.println(s.area());
case 8:
s=new Rectangle(2, 6);
Show.showArea(s);
Show.showPerimeter(s);
break;
case 9:
s=new Rectangle();
Show.showArea(s);
Show.showPerimeter(s);
break;
case 10:
System.out.println("compile pass!");
}
scan.close();
}
}
带异常处理的person类
【问题描述】定义一个Person类,属性包含姓名、年龄。方法:无参构造方法、有参构造方法、getter和setter方法、toString方法。其中:setter方法在设置年龄的时候,要求对年龄进行参数的正确性检测,年龄有效范围在1-100之间,否则抛出IllegalArgumentException异常
【输入形式】1-4的整数
【输出形式】
输入1,结果为(zhangsan,50),
输入:2,结果为:
IllegalArgumentException
null
输入3,结果为:
IllegalArgumentException
(zhangsan,0)
import java.util.Scanner;
//-----以下为需填片段-------
class Person {
String name;
int age;
public Person(){
}
public Person(String name){
this.name = name;
}
public Person(String name, int age) throws Exception{
this(name);
setAge(age);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age)throws Exception{
if(age>1 && age <100)
this.age = age;
else
throw new Exception();
}
@Override
public String toString() {
return '('+name+','+age+')';
}
}
//--------------------------
public class App {
public static void main(String[] args) {
int i;
Scanner in=new Scanner(System.in);
i=in.nextInt();
Person p=null;
switch(i){
case 1:
try{
p=new Person("zhangsan");
p.setAge(50);
}catch(Exception e){
System.out.println("IllegalArgumentException");
}
break;
case 2:
try{
p=new Person("zhangsan",101);
}catch(Exception e){
System.out.println("IllegalArgumentException");
}
break;
case 3:
try{
p=new Person("zhangsan");
p.setAge(-1);
}catch(Exception e){
System.out.println("IllegalArgumentException");
}
break;
default:
try{
p=new Person("zhangsan",20);
}catch(Exception e){
System.out.println("IllegalArgumentException");
}
}
in.close();
System.out.println(p);
}
}
多线程火车票问题
【问题描述】设计一个多线程程序:火车售票模拟程序。假如火车站有10张火车票要卖,现在有5个销售点同时售票,用5个线程模拟这5个售票点的售票情况。
【输出形式】
sale:10
sale:9
sale:8
sale:7
sale:6
sale:5
sale:4
sale:3
sale:2
sale:1
import java.util.Scanner;
//-----begin------
class SaleThread extends Thread{
int ticket;
public SaleThread(int ticket){
this.ticket=ticket;
}
public synchronized void run() {
while(ticket>0)
System.out.println("sale:"+ticket--);
}
}
//-----end------
public class thick {
public static void main(String[] args){
SaleThread st=new SaleThread(10);
Scanner in=new Scanner(System.in);
int selected=in.nextInt();
switch (selected){
case 2:
new Thread(st).start();
new Thread(st).start();
new Thread(st).start();
new Thread(st).start();
new Thread(st).start();
}
in.close();
}
}