Java编程作业

1、编程题

设计一个用户类User,类中的变量有用户名、密码和记录用户数量的变量,定义3个构造方法:无参的、为用户名赋值的、为用户名和密码赋值的,还有获取和设置密码的方法和返回类信息的方法。

package com.sdbi.suhang;

public class User {
	// 编程题:设计一个用户类User,类中的变量有用户名、密码和记录用户数量的变量,
	// 定义3个构造方法:无参的、为用户名赋值的、为用户名和密码赋值的,还有获取和设置密码的方法和返回类信息的方法。
	private String Username;
	// 定义一个私有化的字符串类型的对象Username(用户名)。

	private String password;
	// 定义一个私有化字符串类型的对象password(密码)。

	private static int num = 0;
	// 定义一个私有化静态的int类型的对象num,并且赋初始值为零。

	{// 定义构造一个代码块。用来统计用户创建对象的数量
		// 因为构造代码块是在创建对象的时候被调用,构造代码块在构造方法之前调用,也就是只要有对象实例化就可以执行。
		num++;
		System.out.println("第" + num + "对象");

	}

	public User() {
		// 无参的方法。

	}

	public User(String Username) {
		// 为用户名赋值的方法。
		this.Username = Username;
	}

	public User(String Username, String password) {
		// 为用户名和密码赋值的方法。
		this.Username = Username;
		this.password = password;

	}

	public String getkey(String password) {
		// 获取密码的方法。
		return password;
		// System.out.println(password);

	}

	public void setkey(String password) {
		// 设置密码的方法。
		this.password = password;

	}

	public String calss() {
		// 返回类信息的方法。
		return "类信息为:" + this.Username + "\n" + this.password;

	}

	public void say() {//打印信息的方法
		System.out.println("用户名为:" + Username +"\n"+ "用户密码为:" + password);

	}

}
package com.sdbi.suhang;

public class UserData {
	public static void main(String[] args) {
		User u1 = new User();
		u1.say();// 调用不带有任何参数的无参数方法。

		User u2 = new User("张三");
		u2.say();// 调用带有用户名的方法。

		User u3 = new User("哈哈哈", "123456");
		u3.say();// 调用带有用户名和密码的方法。
		
		

	}

}

 

 运行之后我们就可以看到

2、编程题

设计一副牌Poker的外部类和一张牌Card的内部类。

(1)Poker类中定义私有成员花色数组、点数数组以及一副牌的数组属性,提供构造方法(创建并初始化一副牌的数组)、随机洗牌方法shuffle(Math.random()获取[0,1)的随机数;获取[n,m)的随机数公式为Math.random()*(m-n)+n)和发牌方法deal。

(2)Card类中定义花色和点数属性,提供打印信息方法。

(3)定义测试类并在main()方法中创建一副牌Poker对象,并调用shufle()进行洗牌,调用deal()进行发牌。

呜谢:再次特别感谢 李鹏程 同学对我原先代码的纠正 和 李华伟 老师的关键点拨!!!

package com.sdbi.suhang;

import java.util.Arrays;
import java.util.Iterator;

import javax.sql.rowset.CachedRowSet;

public class Poker {
//	设计一副牌Poker的外部类和一张牌Card的内部类。
// (1)Poker类中定义私有成员花色数组、点数数组以及一副牌的数组属性,提供构造方法(创建并初始化一副牌的数组),
//	随机洗牌方法shuffle(Math.random()获取[0,1)的随机数;
//  获取[n,m)的随机数公式为Math.random()*(m-n)+n)和发牌方法deal。
// (2)Card类中定义花色和点数属性,提供打印信息方法。
// (3)定义测试类并在main()方法中创建一副牌Poker对象,并调用shufle()进行洗牌,调用deal()进行发牌。

	public class Card {
		// 定义一个新的Card类。(内部类)

		private String Suite;// 定义一个私有化的字符串类型的花色变量。

		private String Face;// 定义一个私有化的字符串类型的点数变量。

		public Card(String Suite, String Face) {
			// 定义一个公共的含有参数的Card方法。
			this.Suite = Suite;
			this.Face = Face;

		}

		public String toString() {
			// 定义一个可以返回扑克牌花色和点数的方法。
			return Suite + Face;
			// 之后我们会用到这个方法用来进行发牌。

		}

	}

	private static String[] Suites = { "♠", "♦", "♣", "♥" };// 定义一个私有化的花色的字符串数组

	private static String[] facesa = { "" };// 定义一个私有化的空花色的字符串数组

	private static String[] Suitess = { "🃏", "🃏" };// 定义一个新数组用来存储大小王

	private static String[] Faces = { "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A" };// 定义一个私有化的牌面的字符串数组

	public static Card[] Cards;
	// 定义一个公共的Card数组,名称叫Cards。

	public void poker() {
		// 定义一个扑克牌的构造方法。
		Cards = new Card[54];// 创建一个Cards数组,并且规定Cards数组的长度为52.

		for (int i = 0; i < Suites.length; i++) {
			// 定义一个外部for循环,用来排列扑克牌的花色。
			for (int j = 0; j < Faces.length; j++) {
				// 定义一个内部for循环,用来排列扑克牌的牌面点数。

				// 定义一个新的变量,用来表示卡牌的序数。
				Cards[i * 13 + j] = new Card(Suites[i], Faces[j]);
				// 这里的打印功能是用来检验是否可以创建出所有的扑克牌

			}

		} // 既然所有带花色的扑克牌都定义完了,那我们该定义大小王了。
		Cards[52] = new Card(Suitess[0], facesa[0]);// 这就是我们定义的大小王,由于大小王没有点数区别,我们就把它们归类到花色里面
		Cards[53] = new Card(Suitess[1], facesa[0]);
		// 到这里,我们就完整的定义完了一副扑克牌了哦!!!
		// 并且我们已将新的一副拍装到了原先定义好的Cards数列里面哦!

	}

	public void say() {
		for (int i = 0; i < 54; i++) {
			System.out.print(Cards[i]);

		}
		System.out.println();
	}

	public void shuffle() {// 我们这里就开始创建一个洗牌的方法
		int q = Cards.length;// 首先我们创建一个int常量q,来记录我们需要循环的次数。
		for (int i = 0; i < q; i++) {// 之后我们创建一个for循环,用来将每一个元素进行随机
			int num = (int) (Math.random() * q);
			// Math.random()的方法就是用java虚拟机随机创建一个介于0.0和1.0之间的double类型的伪随机数。
			// 我们用这个伪随机数乘以我们数列的长度,这样就可以找到我们随机的一个位置,进行元素互换。
			// 由于我们的伪随机数是double类型,乘以q后还是double类型,所以我们需要将这个数强制转换为int类型。
			Card temp = Cards[num]; // 我们定义一个temp,用来存放随机出来的位置的元素。
			Cards[num] = Cards[i];// 我们将随机出来的位置的元素替换为我们原始元素。
			Cards[i] = temp;// 最后我们将我们存放的元素填充会原始元素的位置。
			// 至此,我们经过n轮的循环,就可以达到我们想要的洗牌效果。

		}
	}

	public void deal(Card[] Cards) {// 最后,我们来创建一个发牌的方法,其实就是一个打印的方法。
		System.out.println(Arrays.toString(Cards));
		// 发牌的情况是不是就是打印一遍我们已经存放好的数组呢?对滴!!!
		// 由于我们定义好的扑克牌是数组,所以为了打印出我们存放好的数组,我们就可以运用已经封装好的toString方法打印数组。
		// 但是,toString方法虽然可以打印数组,但是打印的数组都是内存地址,这样可不行。
		// 为了打印出我们需要的东西,我们就需要在前面加上Arrays.来修饰,这样就可以打印出我们想要的扑克牌了。

	}

	public static void jeiqu() {// 一个截取数组前n个的方法。
		Card arr[] = java.util.Arrays.copyOf(Cards, 18);//我们定义一个新的数组,用来存放截取的数组(此处设置截取前18个元素)
		System.out.println(Arrays.toString(arr));//我们延续上面的方法,打印整个数组。

	}

	public static String[] arr;

	public static void main(String[] args) {
		Poker p = new Poker();
		System.out.println("洗牌前:");
		p.poker();
		p.deal(p.Cards);
		System.out.println("洗牌后");
		p.shuffle();
		p.deal(p.Cards);
		p.jeiqu();

	}

}

附上运行结果:

最后我再附上源代码图:

posted @ 2022-03-26 17:47  HeartCloud  阅读(440)  评论(2编辑  收藏  举报
-->