java第五次上机课修改

1、使用选择结构实现如下数学分段函数的功能。要求:(1)设x为整数,其值由用户通过小窗口的形式进行输入;(2)根据所输入的x值,打印输出其分段函数中对应y的值。【可以选用if…else多层嵌套的结果,也可以使用switch多分支选择结构】

class zwb102401{
public static void main(String[] args) {
divideFun test=new divideFun();	
test.executive();
}	
}
class divideFun{
void executive(){
String str=javax.swing.JOptionPane.showInputDialog("请输入一个数:");
int x=Integer.parseInt(str);
if(x>=0&&x<10)
System.out.println("y="+x); 
else if(x>=10&&x<30)
System.out.println("y="+(x+10));
else if(x>=30&&x<40)
System.out.println("y="+(-x));
else if(x>-40)
System.out.println("y="+(-x-10));
else System.out.println("y=0");
}

}

:在使用switch语句时,遇到问题1:类型问题,当定义成整形时,直接取整,直接把余数去除了,在后面的加10或减10时会出现错误;当定义成double型时,switch(表达式)无法比较;

switch语句来实现:

String str=javax.swing.JOptionPane.showInputDialog("请输入一个数:");
int x=Integer.parseInt(str);
int y;
if(x<0)
System.out.println("y=0");
else {switch(x/10){
case 0:
y=x;
break;
case 1:
case 2:
y=(x+10);
break;
case 3:
y=(-x);
break;
default:
y=(-x-10);
}
System.out.println("y的值:"+y);

switch(语句起到判断作用,并不影响输出的函数值)

2、使用循环结构计算1到10这10个整数的阶乘和

class zwb102402{
public static void main(String[]args){	
Mul test=new Mul();
test.univerMul();
}	
}
class Mul{
int start=5;
int mul=1;
int sum;
int add;
void univerMul(){
for(int i=start;i>=2;i--){
mul*=i;	
}
sum+=mul;
System.out.println("阶乘和为"+sum);
}
}



--------------------实现阶乘的和的for嵌套循环-----------------
class Mul{
int start=5;
int mul=1;
int sum;
int add;
void univerMul(){
for(int start=1;start<11;start++){	
for(int i=start;i>=2;i--){
mul*=i;	
}
sum+=mul;
}
System.out.println("1-10的阶乘和为"+sum);

问题:for循环的嵌套出现错误,结果出错,1-10的阶乘的和应为:4037913;

思路错误:错误思路是把阶乘从大往小的乘,该方法嵌套未找到正确的选项,但应该可以嵌套吧?

修改后的阶乘的和:

int start=1;
int end=11;
int mul=1;
int sum;
void univerMul(){
for(int i=start;i<end;i++){
mul*=i;
sum+=mul;
System.out.println(i+"的阶乘:"+mul);	
}
System.out.println(start+"到"+end+"的阶乘和:"+sum);	

从低到高算阶层;

3、定义一个Number类,包含两个整型的成员变量n1和n2,编写构造函数初始化n1、n2的值;再定义四个实现加、减、乘、除运算功能的成员函数,分别对n1和n2执行加、减、乘、除(分别输出商和余数)的运算。要求在主函数中创建一个Number类的对象,调用各函数,并打印输出计算结果。

class zwb102403{
public static void main(String[] args) {
Number test=new Number(3,2);
test.add();
test.subtract();
test.mul();
test.divide();
}	
}
class Number{
int n1,n2;
int sum=0;
Number(int n1,int n2){
this.n1=n1;
this.n2=n2;
}
void add(){
sum=n1+n2;	
System.out.println("n1+n2="+sum);
}
void subtract(){
sum=n1-n2;
System.out.println("n1-n2="+sum);
}
void mul(){
sum=n1*n2;
System.out.println("n1*n2="+sum);
}
void divide(){
int sum01;
sum=n1/n2;
sum01=n1%n2;
System.out.println("n1/n2的商是:"+sum+"余数是:"+sum01);
}
}

可以不使用构造函数来实现初始化,代码待优化;

优化:不用构造函数,来减少代码量,并且计算多种数字;

class zwb102403{
public static void main(String[] args) {
Number test=new Number();
test.add(3,2);
test.subtract(6,3);
test.mul(4,6);
test.divide(6,2);
}	
}
class Number{
int n1,n2;
int sum=0;
/*Number(int n1,int n2){
this.n1=n1;
this.n2=n2;
}*/
void add(int n1,int n2){
sum=n1+n2;	
System.out.println("n1+n2="+sum);
}
void subtract(int n1,int n2){
sum=n1-n2;
System.out.println("n1-n2="+sum);
}
void mul(int n1,int n2){
sum=n1*n2;
System.out.println("n1*n2="+sum);
}
void divide(int n1,int n2){
int sum01;
sum=n1/n2;
sum01=n1%n2;
System.out.println("n1/n2的商是:"+sum+"余数是:"+sum01);
}
}

4、定义一个类,为该类定义三个构造函数,分别执行以下操作:

(1)传递一个char型的字符并输出其Unicode编码值;

(2)传递两个float型的数并输出其中较小的数;

(3)传递三个int型的数并输出它们的乘积;

class zwb102403{
public static void main(String[] args) {
compute test01=new compute(2.4f,6.8f);
compute test02=new compute(3,6,9);
compute test03=new compute('博');
System.out.println("这两个数较大的是"+test01.compare());
test02.mul();
test03.transform();
}
}
class compute{	
float a,b;
int c,d,e;
char f;
compute(float a,float b){
this.a=a;
this.b=b;
}
compute(int c,int d,int e){
this.c=c;
this.d=d;
this.e=e;
}
compute(char f){
this.f=f;
}
float compare(){
return (a>b)?a:b;	
}
void mul(){
int sum;
sum=c*d*e;
System.out.println("三个数的乘积为"+sum);	
}
void transform(){
int g;
g=f
System.out.println(g);	
}
}

问题:字符转换城unicode编码未实现,可能会有实现的方法,只是未找到而已;

只是将字符型汉字转换成了整形;

注:字符转换成unicode编码即是将字符转化为整形?

优化:构造函数可以被重载,即利用函数重载来减少对象的实例化次数,并且替换了构造函数这一方式去减少代码量;

class zwb102403{
public static void main(String[] args) {
float a=2.4f;
float b=6.8f;
int c=3;
int d=6;
int e=9;
char f='A';	
compute test=new compute();
System.out.println("两个数中较大的是:"+test.cal(2.4f,6.8f));
test.cal(3,6,9);
test.cal('A');
}
}
class compute{	
float a,b;
int c,d,e;
char f;
/*compute(float a,float b){
this.a=a;
this.b=b;
}
compute(int c,int d,int e){
this.c=c;
this.d=d;
this.e=e;
}
compute(char f){
this.f=f;
}*/
float cal(float a,float b){
return (a>b)?a:b;	
}
void cal(int c,int d,int e){
int sum;
sum=c*d*e;
System.out.println("三个数的乘积:"+sum);	
}
void cal(char f){
int g;
g=f;	
System.out.println(g);	
}
}

5、在time包中定义一个Time类,包含时、分、秒3个成员变量,包含以下成员函数:

(1)通过构造函数初始化时、分、秒,但要保证符合相应的范围;

(2)用时:分:秒的形式打印输出时间;

(3)计算该时间和另一时间之间相差的秒数;

class zwb102405{
public static void main(String[] args) {
Time test=new Time(21,36,36);
test.print();
test.setTime(21,46,36);
}
}
class Time{
private int hour,minute,second;
Time(int hour,int minute,int second){
if(hour>0&&hour<25)
this.hour=hour;
else System.out.println("你的时长输入错误");
if(minute>0&&minute<61)
this.minute=minute;
else System.out.println("你的分钟输入错误");
if(second>0&&second<61)
this.second=second;
else System.out.println("你的秒数输入错误");
}
void print(){
if(hour!=0&&minute!=0&&second!=0)
System.out.println("你输入的时间是"+hour+"点"+minute+"分"+second+"秒");	
}
void setTime(int h,int m,int s){
if(hour==h&&minute==m&&second!=s){
second-=s;
if(second>0)
System.out.println("这两个时间段相差了"+second+"秒");
else System.out.println("这两个时间段相差了"+(-second)+"秒");
}else if(hour==h&&minute==m&&second==s)System.out.println("这两个时间都相同");

else if(hour==h&&minute!=m&&second==s){
minute-=m;
if(minute>0){
minute*=60;
second=minute;
System.out.println("这两个时间段相差了"+second+"秒");
}else minute*=-60;
second=minute;
System.out.println("这两个时间段相差了"+second+"秒");
}else if(hour==h&&minute!=m&&second!=s){
minute-=m;
if(minute>0)
minute*=60;	
second
}

//代码时间的比较未完成,	
}
}

问题:时间的比较逻辑太冗杂,未找到简单的逻辑方法去比较时、分、秒三者之间的逻辑关系

if-else可以来实现三者的逻辑关系但是太麻烦;或者可以考虑去寻找其他的方法或者与其他的相结合;

优化:思路错误,比较时间时不需要比较时、分、秒去确定相差了多少秒,可以采用数学的思考方式去计算总秒数,并且两者相减,去得到秒的差值;

public class Ti {
public static void main(){
Time test=new Time(1,15,30);
        test.print();
        test.setTime(2,15,30);
}
}
class Time{
    private int hour, minute, second;
    Time(int hour, int minute, int second) {
        if (hour > 0 && hour < 25)
            this.hour = hour;
        else System.out.println("你的时长输入错误");
        if (minute > 0 && minute < 61)
            this.minute = minute;
        else System.out.println("你的分钟输入错误");
        if (second > 0 && second < 61)
            this.second = second;
        else System.out.println("你的秒数输入错误");
    }

    void print() {
        if (hour != 0 && minute != 0 && second != 0)
         if(hour<10)
            System.out.println("你输入的时间是0" + hour + ":" + minute + ":" + second);
    }

    void setTime(int h, int m, int s) {
        second=(hour*3600)+(minute*60)+second;
        s=h*3600+m*60+s;
        second-=s;
        if(second>0){
            System.out.println("这两个时间段相差了"+second+"秒");
        }
        else System.out.println("这两个时间断相差了"+(second*-1)+"秒");
    }
}

注:当逻辑实现太麻烦时,即思路可能出现错误,上述秒数的比较中使用if-else非常费劲且容易出错;代码实现很难时,考虑一下数学上的思考方法去解决实际问题;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值