3.1(代数:解一元二次方程)可以使用下面的公式求一元二次方程ax2+bx+c=0
的两个根:
import java.util.Scanner ;
class Demo03_01{
public static void main (String[] args){
System.out.print("Enter a,b,c : ");//提示输入二元一次方程的两个系数和一个常数值。
Scanner input = new Scanner(System.in);
double a = input.nextDouble();
double b = input.nextDouble();
double c = input.nextDouble();
double D = b*b-4*a*c;//根的判别式
/*
利用公式计算方程可能产生的两个根
*/
double x1 = (-b + Math.pow(D,0.5))/2*a;
double x2 = (-b - Math.pow(D,0.5))/2*a;
//用if条件语句根据判断式,判断根的个数并输出。
if (D>0)
System.out.println("The equation has two roots"+x1+"and"+x2);
else if (D==0)
System.out.println("The equation has one root"+x1);
else
System.out.println("The equation has no real roots");
}
}
3.3(找到将来的日期)编写一个程序,提示用户输人代表今天日期的数字(周日为0,周一1,......,周六为6)。同时,提示用户输人一个今天之后的天数,作为代表将来某天的数字,然后显示这天是星期几。
import java.util.Scanner;
class Demo03_03{
public static void main(String[] args){
//1.输入今天是周几
Scanner scanner=new Scanner(System.in);
System.out.print("今天是周几:");
int today=scanner.nextInt();
//2.输入未来的几天
System.out.print("未来的几天:");
int future=scanner.nextInt();
//3.打印未来的几天是周几
int futureDay=(today+future)%7;//未来的周几=(今天的周几+未来的天数)%7
String todayStr="";//初始化表示今天和未来是周几的字符串为空
String futureDayStr="";
//if条件根据输入和计算出来的数字匹配今天和未来是周几的信息也可以用case语句实现
if(today==0){
todayStr="周日";
}else if(today==1){
todayStr="周一";
}else if(today==2){
todayStr="周二";
}else if(today==3){
todayStr="周三";
}else if(today==4){
todayStr="周四";
}else if(today==5){
todayStr="周五";
}else if(today==6){
todayStr="周六";
}
if(futureDay==0){
futureDayStr="周日";
}else if(futureDay==1){
futureDayStr="周一";
}else if(futureDay==2){
futureDayStr="周二";
}else if(futureDay==3){
futureDayStr="周三";
}else if(futureDay==4){
futureDayStr="周四";
}else if(futureDay==5){
futureDayStr="周五";
}else if(futureDay==6){
futureDayStr="周六";
}
System.out.println("今天是"+todayStr+",未来的日子是"+futureDayStr);
}
}
3.4(回文数字)编写一个程序,提示用户输人一个三位的整数,然后确定它是否回文数字。当从左到右,以及从右到左都是一样的话,这个数字称为回文数。
import java.util.Scanner;
class Demo03_04{
public static void main(String[] args){
//1.输入一个数字
Scanner scanner=new Scanner(System.in);
System.out.print("请输入一个数字:");
int num=scanner.nextInt();
int temp=num;
//2.拼接出该数字的反序
int sum=0;//sum存储反序后的数字
for(i=1;i<=3;i++){
sum=sum*10+num%10;
num/=10;
}
if(sum==temp){//若相等是回文数字
System.out.println("是回文");
}else{
System.out.println("不是回文");
}
}
}
3.6(游戏:剪刀、石头、布)编写可以玩流行的剪刀-石头-布游戏的程序。(剪刀可以剪布,石头可以硬剪刀,而布可以包石头。)程序提示用户随机产生一个数,这个数为0、1或者2,分别表示石头、剪刀和布。程序提示用户输人值0、1或者2,然后显示一条消息,表明用户和计算机
谁赢了游戏,谁输了游戏,或是打成平手。
import java.util.*;
class Demo03_06{
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
//1.提示用户输入一个数字
System.out.print("请输入 剪刀0 石头1 布2:");
int usr=scanner.nextInt();
//2.使用Random方法随机产生一个在[0,3)的数字
Random random=new Random();
int com=random.nextInt(3);
//初始化表示用户和电脑出的是什么的字符串
String usrStr="";
String comStr="";
switch(usr){//匹配用户输入的数字代表什么
case 0:
usrStr="剪刀";
break;
case 1:/
usrStr="石头";
break;
case 2:
usrStr="布";
break;
}
switch(com){
case 0:
comStr="剪刀";
break;
case 1:
comStr="石头";
break;
case 2:
comStr="布";
break;
}
//3.将两个数字进行对比,分输赢
if(usr==com){
System.out.printf("用户是%s,电脑是%s,平局",usrStr,comStr);
}else if(usr==0&&com==2 || usr==1&&com==0 || usr==2&&com==1){
System.out.printf("用户是%s,电脑是%s,用户赢",usrStr,comStr);
}else{
System.out.printf("用户是%s,电脑是%s,用户输",usrStr,comStr);
}
}
}
3.9(几何:点是否在三角形内?)假设一个直角三角形放在一个平面上,如下图所示。直角点在(0,0)处,其他两个点分别在(200,0)和(0,100)处。编写程序,提示用户输入一个点的x坐标和y坐标,然后判定这个点是否在该三角形内。
import java.util.*;
class Demo03_09{
public static void main (String[] args){
System.out.print("请输入该点的坐标:");//提示用户输入坐标不限范围
Scanner input = new Scanner(System.in);
double x = input.nextDouble();
double y = input.nextDouble();
while(x>=0&&y>=0){//如果在第一象限
if(y>(-1.0/2)*x+100)//判断该点是否在斜边直线的上方
System.out.print("点在三角形外");
else
System.out.print("点在三角形内");
}
if(x<0||y<0){//其他象限都在三角形外
System.out.print("点在三角形外");
}
}
}
3.10(几何:两个矩形)编写一个程序,提示用户输人两个矩形中点的x坐标和y坐标以及它们的宽度和高度,然后判定第二个矩形是在第一个矩形内,还是和第一个矩形重叠,如图3-9所示。
图形分析:
import java.util.Scanner;
class Demo03_10{
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
//1.先输入大矩形的中心坐标,宽和高
System.out.print("请输入第1个矩形的信息:");
double x1=scanner.nextDouble();
double y1=scanner.nextDouble();
double w1=scanner.nextDouble();
double h1=scanner.nextDouble();
//2.再输入小矩形的中心坐标,宽和高
System.out.print("请输入第2个矩形的信息:");
double x2=scanner.nextDouble();
double y2=scanner.nextDouble();
double w2=scanner.nextDouble();
double h2=scanner.nextDouble();
//判断小矩形在大矩形里面的条件
double inXMin=x1-(w1-w2)/2;
double inXMax=x1+(w1-w2)/2;
double inYMin=y1-(h1-h2)/2;
double inYMax=y1+(h1-h2)/2;
//判断小矩形在大矩形外面的条件
double outXMin=x1-(w1+w2)/2;
double outXMax=x1+(w1+w2)/2;
double outYMin=y1-(h1+h2)/2;
double outYMax=y1+(h1+h2)/2;
if(x2>=inXMin&&x2<=inXMax&&y2>=inYMin&&y2<=inYMax){
System.out.println("小矩形在大矩形里面!");
}else if(x2<=outXMin||x2>=outXMax||y2<=outYMin||y2>=outYMax){
System.out.println("小矩形在大矩形外面!");
}else{
System.out.println("小矩形和大矩形相交!");
}
}
}
3.16(打印金字塔形的数字)编写一个嵌套的for循环,打印下面的输出:
图形分析:
/*
对于打印一些对称性的三角形图案或者是类似的问题尽量向绝对值考虑
*/
class Demo03_16{
public static void main(String[] args){
for(int i=1;i<=8;i++){
for(int k=1;k<=(8-i);k++){
System.out.print(" ");//空格数从上到下依次减少,每行数字的空格数是递减的(8-行数)*4
}
for(int x=-(i-1);x<=i-1;x++){
System.out.printf("%4d",(int)Math.pow(2,i-1-Math.abs(x)));
}
System.out.println();
}
}
}
3.18(计算π)使用下面的数列可以近似计算π:
import java.util.Scanner;
class Demo03_18{
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
//提示用户输入一个数字,数字越大精度越高
System.out.print("请输入一个数字:");
int imax=scanner.nextInt();
double sum=0;
double flag=1;//达到+ - 之间的转换
for(int i=1;i<=imax;i++){
sum+=flag/(2*i-1);
flag=-flag;//循环一次变号
}
double pi=sum*4;
System.out.println(pi);
}
}
3.22(游戏:石头、剪刀、布)编程练习题3.17给出玩石头-剪刀-布游戏的程序。修改这个程序,让用户可以连续地玩这个游戏,直到用户或者计算机赢对手两次以上为止。
import java.util.*;
class Demo03_22{
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
Random random=new Random();
//定义一个记录用户或者计算机赢的次数,实现无论谁赢两次才会结束的功能
int usrWin=0;
int comWin=0;
while(true){//使用循环达到用户重复输入的目的
System.out.print("请输入剪刀0 石头1布2:");
int usr=scanner.nextInt();
int com=random.nextInt(3);
String usrStr = "";
String comStr = "";
switch(usr){
case 0:
usrStr = "scissor";
break;
case 1:
usrStr = "rock";
break;
case 2:
usrStr = "paper";
break;
}
switch(com){
case 0:
comStr = "scissor";
break;
case 1:
comStr = "rock";
break;
case 2:
comStr = "paper";
break;
}
//判断输赢
if(usr==com){
System.out.printf("The computer is %s.you are %s too.It is a draw\n",comStr,usrStr);
}else if(usr==0&&com==2 || usr==1&&com==0 || usr==2&&com==1){
System.out.printf("The computer is %s.you are %s.You won\n",comStr,usrStr);
usrWin++;
}else{
System.out.printf("The computer is %s.you are %s.You lost\n",comStr,usrStr);
comWin++;
}
//判断用户或者电脑是否赢了两次,是则跳出循环
if(usrWin==2||comWin==2){
break;
}
}
if(usrWin==2){//谁先赢两次谁赢
System.out.println("最终玩家赢!");
}else{
System.out.println("最终电脑赢!");
}
}
}
3.23(十进制到二进制)编写程序,提示用户输人一个十进制整数,然后显示对应的二进制值。在这个程序中不要使用Java的Interger.toBinaryString(int)方法。
/*
思路:用短除法取得除每一次二取余的余数并用字符串的形式连接起来
*/
import java.util.Scanner;
class Demo03_23{
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
//提示输入一个十进制数字
System.out.print("请输入一个数字:");
int num=scanner.nextInt();
String binStr="";//规定一个存放二进制的字符串
while(true){
binStr=num%2+binStr;/
num/=2;
if(num==0){//除尽后跳出循环
break;
}
}
System.out.println(binStr);
}
}
3.24(最大数的出现次数)编写程序读取整数,找出它们的最大数,然后计算该数的出现次数。假设输入是以0结束的。假定输入是3525550,程序找出最大数5,而5出现的次数是4。属示:维护max和count两个变量。max存储当前最大数,而count存储它的出现次数。初始状态时,将第一个数赋值给max而将count赋值为1。然后将接下来的每个数字逐个地和max进行比给。如果这个数大于max,就将它赋值给max,同时将count重置为1。如果这个数等于max,就给Count加。
import java.util.Scanner;
class Demo03_24{
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
int num=0;
int max=0;//规定最大的数字初始为零
int count=0;//记录最大的数字出现的次数
System.out.print("请输入数字:");
while(true){
num=scanner.nextInt();//输入若干个数字
if(num==0){//以零为结束标志(如果输入的是0则跳出循环)
break;
}else if(num>max){//如果当前输入的这个数字大于前面最大的数字
max=num;//重置最大的数字
count=1;//重置出现的次数为1
}else if(num==max){//如果当前最大的数字又出现了
count++;//记录次数+1
}
}
System.out.println("max="+max+",count="+count);
}
}