案例一:水仙花数问题
练习描述:
计算1000以内的所有水仙花数。用户输入0到1000以内的某个数,系统输出这个范围内的所有 水仙花数,水仙花数是指一个 n 位数 ( n≥3 ),它的每个位上的数字的 n 次幂之和等于它本身。例 如:1^3 + 5^3 + 3^3 = 153)。
系统交互情况如图所示:
方案:
系统使用双层for循环判断某个数是否为水仙花数,外层循环确保每个用户输入的范围内的数都 判断到,里层循环判断某个数是否为水仙花数,m%10取到个位数,例如:int m=153,经过int v=m%10计算后v=3;m /= 10去除各位数,例如:int m=153,经过m /= 10计算后m=15。代码 如下所示:
如果n和sum相等,那么说明n是水仙花数。代码如下所示:
实现:
系统代码实现如下:
package basic01;
import java.util.Scanner;
public class Daffodils {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入查找水仙花的范围:0~");
int max = scanner.nextInt();
scanner.close();
for (int n = 3; n <= max; n++) {
int sum = 0;
for(int m=n;m>0;m/=10) {
int v = m%10;
sum += v*v*v;
}
if(n==sum) {
System.out.println(n);
}
}
}
}
扩展:
计算“百钱买百鸡”的问题。 百钱买百鸡:公鸡5文钱一只,母鸡3文钱一只,小鸡1文钱3只,如何用百文钱买百只鸡?
系统交互情况如图所示:
package basic01;
/**
* 百钱买百鸡问题:公鸡5文钱一只,母鸡3文钱一只,小鸡1文钱3只,如何用百文钱买百只鸡?
* @author Administrator
*
*/
public class DaffodilsExt {
public static void main(String[] args) {
int cock,hen ,chick;
System.out.println("百钱买百鸡的方案如下:");
for(cock=0;cock<=20;cock++) {
for (hen=0;hen<=33;hen++) {
chick = 100 - cock-hen;
if(chick%3==0) {
int total = cock*5+hen*3+chick/3;
if(total==100) {
System.out.println("公鸡:"+cock+",母鸡:"+hen+",小鸡:"+chick);
}
}
}
}
}
}
案例二:猜字母游戏
问题描述:
猜字母游戏。系统随机产生5个按照一定顺序排列的字符,然后由用户输入一个5个字符的字符 串,由程序判断这五个字符和系统所产生的5个字符是否相同(字母和位置均相同)。如果相同, 则程序结束,并计算得分;如果不相同,则输出比较结果以提示用户继续游戏。系统交互情况如图所示:
方案:
定义一个 5 个长度的字符数组用于存储系统所产生的5个字符,并定义变量记载用户所猜测的 次数。代码如下:
定义一个数组letters存放所有字符,定义一个boolean类型的数组大小和letters数组大小相 同,用来标识letters数组中的元素是否被选中,代码如下:
根据所需要产生的字符个数(5个)随机产生字符数组,且字符不能重复。代码如下:
然后,提示用户录入5个字符后,并转换为字符数组,代码如下:
判断用户的录入的正确性(需要同时判断字符和位置的正确性),代码如下:
判断完毕后,需要输出提示信息到界面,并需要计算分数。如果5个字符的位置均正确,则表 示游戏结束,计算并输出用户的得分;否则,将猜测的次数累加1 ,并提示用户所猜对的字符个数 以及位置个数,游戏继续。代码如下:
代码实现:
package day04;
import java.util.Scanner;
public class GuesseGame {
public static void main(String[] args) {
System.out.println("欢迎来到猜字符游戏!");
char []chs=generate();
System.out.print(chs);
System.out.println();
int count=0;
System.out.println("猜字符游戏现在开始?????:");
while(true){
Scanner scan=new Scanner(System.in);
String s=scan.next().toLowerCase();
if(s.equals("exit")) {
System.out.println("谢谢你的使用!");
break;
}
char []inputchar=s.toCharArray();//此方法用于将用户输入的字符串转换为字符数组
int result[]=check(chs,inputchar);
if(result[1]==chs.length) {
int score=100*chs.length-100*count;
System.out.println("恭喜你,猜对了!");
System.out.println("你的总共得分是:"+score);
break;
}else {
count++;
System.out.println("你的字母对了"+result[0]+"个"+"你输入的位置对了"+result[1]+"个");
}
}
}
//将用户输入的字符和系统随机产生的数进行比较
public static int[] check(char []chs,char[]inputchar) {
//result[0]表示字母正确
//result[1]表示位置正确
int []result=new int[2];
for (int i = 0; i < chs.length; i++) {
for (int j = 0; j < inputchar.length; j++) {
if(chs[i]==inputchar[j]) {
result[0]++;
if(i==j) {
result[1]++;
}
break;
}
}
}
return result;
}
//随机生成字符的方法
public static char[] generate() {
char []letter= {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
boolean []flags=new boolean[letter.length];
char []chs=new char[5];
int index;
for (int i = 0; i < chs.length; i++) {
do {
index=(int)(Math.random()*(letter.length));
}while(flags[index]==true);
chs[i]=letter[index];
flags[index]=true;
}
return chs;
}
}
案例三:随机加法运算器
问题描述:
随机加法运算器。系统提示用户输入“Y”或是“Q”,输入Y表示开始测试,输入Q表示退出 系统;系统随机出题,最多10道题,题目为两个100以内的随机数的和,用户输入这两个数的和, 系统根据用户输入的和值,系统判断用户计算的是否正确,正确输出“Correct!”,错误系统输 出“Error”,最后计算用户做题的得分输出到控制台。系统交互情况如图所示:
方案:
系统使用while(true)使程序一直循环,当遇到break程序规程循环,代码如下:
系统使用String类的trim()方法,去除用户输入字符串两端的空白,使用String类的 equalsIgnoreCase()方法,比较两个字符串内容是否相等,忽略大小写。代码如下所示:
系统使用Random的nextInt()方法生成100以内的随机数,代码如下所示:
系统使用for循环产生10道题目,代码如下所示:
代码实现:
package day04;
import java.util.Scanner;
import java.util.Random;
public class AdditionTest{
public static void main(String[]args){
Scanner scanner=new Scanner(System.in);
while(true){
System.out.print("输入Y开始测验,输入Q退出:");
String c=scanner.next();
if("Q".equalsIgnoreCase(c.trim())){
break;
}
if(!"Y".equalsIgnoreCase(c.trim())){
continue;
}
int score=0;
int numOfQuestion=10;
Random ran=new Random();
int a,b,answer,key;
for(int i=1;i<=numOfQuestion;i++){
a=ran.nextInt(100);
b=ran.nextInt(100);
key=a+b;
System.out.print("("+i+")."+a+"+"+b+"=?");
answer=scanner.nextInt();
if(answer==key){
score+=100/numOfQuestion;
System.out.println("Correct!");
}else{
System.out.println("Error");
}
}
System.out.println("此次测验结束,你的分数是:"+score);
}
scanner.close();
}
}