首页 > 编程语言 > 详细

JAVA第二次习题集-设计与分析

时间:2021-04-03 23:10:34      阅读:47      评论:0      收藏:0      [点我收藏+]
  • 7-1 IP地址转换 

题目分析:

一个IP地址是用四个字节(每个字节8位)的二进制码组成。请将32位二进制码表示的IP地址转换为十进制格式表示的IP地址输出。

输入数据要求:

  • 必须为二进制数,即只能输入0或者1
  • 长度必须是32位

违背以上规则程序直接输出Wrong Format

我提交的源码:

 1 import java.util.Scanner;
 2 import java.math.*;
 3 public class Main {
 4     public static void main(String[] args) {
 5     Scanner input =new Scanner(System.in);
 6     String s = input.nextLine();
 7     int k=s.length();
 8      if(k!=32) {
 9          System.out.println("Wrong Format");
10      }
11         else{
12     for(int i = 0;i < k;i++) {
13         if(s.charAt(i)!=‘1‘&s.charAt(i)!=‘0‘)
14             System.out.println("Wrong Format");
15     }
16     int a = 0,b = 0,c = 0,d = 0;
17     char num[] = new char[32];//只有char接受char的型
18     for(int i = 0;i<=7;i++) {
19           num[i] = s.charAt(i);
20          if(num[i]==‘1‘) {
21 //              System.out.println(num[i]);
22            a=a+(int)Math.pow(2, 7-i);
23        }
24     }
25        for(int i = 8,j=0;i<=15;i++,j++) {
26         num[i] = s.charAt(i);
27        if(num[i]==‘1‘) {
28 //            System.out.println(num[i]);
29          b=b+(int)Math.pow(2, 7-j);
30       }
31     }
32        for(int i = 16,j = 0;i<=23;i++,j++) {
33         num[i] = s.charAt(i);
34        if(num[i]==‘1‘) {
35 //            System.out.println(num[i]);
36          c=c+(int)Math.pow(2, 7-j);
37       }
38     }
39        for(int i = 24,j = 0;i<=31;i++,j++) {
40         num[i] = s.charAt(i);
41        if(num[i]==‘1‘) {
42            
43 //            System.out.println(num[i]);
44          d=d+(int)Math.pow(2, 7-j);
45          
46       }
47     }
48     System.out.println(a+"."+b+"."+c+"."+d);}
49     }
50 }

收获与心得:

这个题目考察了我们对于字符串的处理,怎样定义一个字符串以及怎样提取出字符串的某一波分进行单独处理。这些都是这个题目考察的亮点也是难点,解这道题我们首先要去定义一个字符串,而且在解这道题目的同时我们也要明白二进制转化的方式,其次就是用

charAt(i);

将字符串中的元素进行遍历,然后再看看是1还是0进行数字的运算,计算出IP地址域名四部分的数,然后在进行格式化输出,在这些运算之前,我们首先要判断这串字符是不是合法,运用到

1 String.length();

函数,这个函数可以直接得出字符串的长度,返回一个整形数值,当字符串不等于32是输出"wrong format".

  • 7-2 合并两个有序数组为新的有序数组 

题目分析:

合并两个升序排序的整型数组为一个新的升序整型数组并输出。

我提交的源码:

 1 import java.util.Arrays;
 2 import java.util.Scanner;
 3 
 4 public class Main {
 5 
 6     public static void main(String[] args) {
 7     Scanner input =new Scanner(System.in);
 8     int a = 0 ,b = 0;
 9     int [] num1 = new int[50];
10     int [] num2 = new int[50];
11     int [] num3 = new int[50];
12     a = input.nextInt();
13     for(int i = 0 ;i < a;i++) {
14         num1[i] = input.nextInt();
15         num3[i] = num1[i];
16     }
17     b = input.nextInt();
18     for(int i = 0 ;i < b;i++) {
19         num2[i] = input.nextInt();
20     }
21     int k = a;
22     for(int j = 0;j < b;j++) {
23         num3[k] = num2[j];
24         k++;
25     }
26     
27     int m=0,n=0,temp=0;
28     for(m=0;m<a+b-1;m++)
29     {
30         for(n=m+1;n<a+b;n++)
31         {
32             if(num3[m]>num3[n])
33             {
34                 temp=num3[m];
35                 num3[m]=num3[n];
36                 num3[n]=temp;
37                 
38             }
39         }
40     }
41     for(int l = 0;l<a+b;l++) {
42         System.out.printf(num3[l]+" ");
43         }
44     
45     }
47 }

收获与心得:

这个题我采用的方法是用一个数组分别读取输入的两个数组中的元素,将两个数组合并为一个新的数组,然后再将合并后的数组进行排序后输出,考察了对于数组的定义,以及选择排序的用法,于题目集一考察较为相似,在注意一下输出时的格式,即可通过这个题的全部测试点。

  • 7-3 判断闰年及星期几 

题目分析:

输入年月日的值(均为整型数),输出该年份是否为闰年,同时输出该日期为星期几。 其中:年份的合法取值范围为[1820,2020] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31] ; 判断星期几的算法如下:假定公元0001年1月1日为星期一,因此只要计算出当前输入日期离0001年1月1日所差的天数,然后拿这个天数除以7求余数,当余数为0时,为星期日,当余数为1时,为星期一,以此类推,当余数为6时,为星期六。

要求:Main类中必须含有如下方法,签名如下:

我提交的源码:

  1 import java.util.Scanner;
  2 import java.math.*;
  3 public class Main {
  4 
  5     public static void main(String[] args) {
  6     Scanner input =new Scanner(System.in);
  7     int year = input.nextInt();
  8     int month = input.nextInt();
  9     int day = input.nextInt();
 10     int panduan=0;
 11     int[] month1=new int[]{0,31,29,31,30,31,30,31,31,30,31,30,31};
 12     int[] month2=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
 13     
 14  
 15            if(month>0&&month<=12){
 16                
 17           if(isLeapYear(year))
 18           {
 19             if(day<=month1[month]&&day>0)
 20             panduan=1;
 21           }
 22           else
 23           {
 24             if(day<=month2[month]&&day>0)
 25             panduan=1;
 26           }
 27            }
 28     
 29     if(year<1820||year>2020||month<1||month>12||day<1||day>31||panduan==0) {
 30         System.out.println("Wrong Format");
 31     }
 32     
 33     
 34     else {
 35     if(isLeapYear(year)==true) {
 36            System.out.println(year+" is a leap year.");
 37        }
 38     else {
 39         System.out.println(year+" is not a leap year.");
 40     }
 41     int k = numOfDays( year, month , day);
 42     
 43     System.out.println(year+"-"+month+"-"+day+" is "+getWhatDay(k)+".");
 44     }
 45     
 46     }
 47     public static int numOfDays(int year,int month ,int day) {
 48         int num = 0;
 49         int s = 0;
 50         for(int i =1;i<year;i++) {
 51             if((isLeapYear(i)==true)) {
 52                 num +=366;
 53             }
 54             else {
 55                 num +=365;
 56             }
 57             
 58         }
 59          
 60         switch(month) {
 61         case 1:s = day; break;
 62         case 2:{
 63             s = 31 + day ;
 64             break;
 65         }
 66         case 3:{
 67             if(isLeapYear(year)==true) {
 68                    s = 31 + 29 + day;
 69                }
 70             else 
 71                 s = 31 +28 +day;
 72             break;
 73         }
 74         case 4:  {
 75             if(isLeapYear(year)==true) {
 76                    s = 31 + 29+31 + day;
 77                }
 78             else 
 79                 s = 31 +28 +31+day;
 80             break;
 81             
 82         }
 83         case 5:  {
 84             if(isLeapYear(year)==true) {
 85                    s = 31 + 29+31+30 + day;
 86                }
 87             else 
 88                 s = 31 +28+30 +31+day;
 89             break;
 90         
 91         }
 92         case 6:  {
 93             if(isLeapYear(year)==true) {
 94                    s = 31 + 29+31+30+31 + day;
 95                }
 96             else 
 97                 s = 31 +28+30 +31+31+day;
 98             break;
 99         
100         }
101         case 7:  {
102             if(isLeapYear(year)==true) {
103                    s = 31 + 29+31+30+31+30 + day;
104                }
105             else 
106                 s = 31 +28+30 +31+31+30+day;
107             break;
108         
109         }
110         case 8:  {
111             if(isLeapYear(year)==true) {
112                    s = 31 + 29+31+30+31+30+31 + day;
113                }
114             else 
115                 s = 31 +28+30 +31+31+30+31+day;
116             break;
117         
118         }
119         case 9:  {
120             if(isLeapYear(year)==true) {
121                    s = 31 + 29+31+30+31+30+31 +31 +day;
122                }
123             else 
124                 s = 31 +28+30 +31+31+30+31+31+day;
125             break;
126         
127         }
128         case 10:  {
129             if(isLeapYear(year)==true) {
130                    s = 31 + 29+31+30+31+30+31 +31+30 +day;
131                }
132             else 
133                 s = 31 +28+30 +31+31+30+31+31+30+day;
134             break;
135         
136         }
137         case 11:  {
138             if(isLeapYear(year)==true) {
139                    s = 31 + 29+31+30+31+30+31 +31+30+31 +day;
140                }
141             else 
142             s = 31 +28+30 +31+31+30+31+31+30+day+31;
143             break;
144         
145         }
146         case 12:  {
147             if(isLeapYear(year)==true) {
148                    s = 31 + 29+31+30+31+30+31 +31+30+31+30 +day;
149                }
150             else 
151                 s = 31 +28+30 +31+31+30+31+31+30+day+31+30;
152             break;
153         
154         }
155         }
156         return num+s;
157     }
158     
159     public static boolean isLeapYear(int year){
160         if((year%4==0&&year%100!=0)||year%400==0)
161         return true;
162         else
163         return false;
164         }
165     public static String getWhatDay(int days) {
166     
167       int k =(days)%7;
168         if(k==0) {
169             return "Sunday";
170         }
171         else if(k==1) {
172             return "Monday";
173         }
174         else if(k==2) {
175             return "Tuesday";
176         }
177         else if(k==3) {
178             return "Wednesday";
179         }
180         else if(k==4) {
181             return "Thursday";
182         }
183         else if(k==5) {
184             return "Friday";
185         }
186         else 
187             return "Saturday";
188         
189     }
190     
191 }

技术分享图片

收获与心得:

  这个题我设置了三个类:

1 public class getWhatDay 

这个类是用来判断星期几,内置的方法

public static String getWhatDay(int days)

这个方法是用来判断该天是星期几并返回相对应的星期几对应的英文。

2 public class isLeapYear

这个类是用来判断是不是闰年,是闰年返回Boolean值 true 否则则返回false。

 

3 public class numOfdays

 

这个类是用来判断输入的那一天,那一年距离0001年的具体的天数,然后传入 getWhatday.看看今天对应的是星期几,然后进行输出

这一题强化了我们对于类的概念,更多的让我们理解了Java 中的类是与C语言中的函数是有所不同的,Java中的类讲究封装性,一个类对应实现一个功能,功能单一性,这些是我有所掌握的,但是在这个题中我在判断距今还有多少天的时候是一个月一个月的年份进行相加,算法过于复杂,也很长,这是需要有所改进的地方。希望能够精简一下关于在计算天数时的算法设计,这是在下一次,习题作答时的追求。

  • 7-4 求下一天 (30 分)

题目分析:

输入年月日的值(均为整型数),输出该日期的下一天。 其中:年份的合法取值范围为[1820,2020] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31] 。 注意:不允许使用Java中和日期相关的类和方法。

要求:Main类中必须含有如下方法,签名如下:

我提交的源码:

 1 import java.util.Scanner;
 2 import java.math.*;
 3 public class Main {
 4 
 5     public static void main(String[] args) {
 6     Scanner input =new Scanner(System.in);
 7     int year = input.nextInt();
 8     int month = input.nextInt();
 9     int day = input.nextInt();
10     if(checkInputValidity( year, month, day)==false) {
11         System.out.println("Wrong Format");
12     }
13     
14     
15     else {
16      nextDate( year, month, day);
17     }
21     }
22     public static void nextDate(int year,int month,int day) {
23         int[] yuefen1=new int[]{0,31,29,31,30,31,30,31,31,30,31,30,31};
24         int[] yuefen2=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
25         int a=0,b=0,c=0;
26         a = year;
27         c=day+1;
28         b = month;
29         if(isLeapYear( year)==true) {
30             if(c>yuefen1[month]) {
31                 b++;
32                 c=c-yuefen1[month];
33             }
34             
35         }
36         else {
37             if(c>yuefen2[month]) {
38                 b++;
39                 
40                 c=c-yuefen2[month];
41             }
42         }
43         if(b>12) {
44             a++;
45             b=b-12;
46         }
47         System.out.println("Next date is:"+a+"-"+b+"-"+c);
48     }
49     
50     
51     public static boolean isLeapYear(int year){
52         if((year%4==0&&year%100!=0)||year%400==0)
53         return true;
54         else
55         return false;
56         }
57     public static boolean checkInputValidity(int year,int month,int day) {
58         
59         int panduan=0;
60     int[] runnian=new int[]{0,31,29,31,30,31,30,31,31,30,31,30,31};
61     int[] pingnian=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
62         
63         if(month>0&&month<=12){
64           if(isLeapYear(year))
65           {
66             if(day<=runnian[month]&&day>0)
67             panduan=1;
68           }
69           else
70           {
71             if(day<=pingnian[month]&&day>0)
72             panduan=1;
73           }
74         }
75     if(year<1820||year>2020||month<1||month>12||day<1||day>31||panduan==0) {
76         return false;
77         
78     }
79     else {
80         return true;
81     }
82 }
83 }

技术分享图片

设计收获与心得:

这个题我一共设计了两个类,

1 public class checkInputValidity

 

这个类是用来检测输入的天数是不是合法的,然后返回同一个Boolean 值,若不合法则输出 rong format。

第二个类

2 public class nextDate

这个类是用来求下一天的

这个题进一步强化了我对于类的理解,不同的类有不同的功能,将功能封装在类里,主函数的代码能很好的简化。这个题和上一个题基本相似,唯一不同的是求下一天,先进行输入的天份和年份是不是合法,然后进行日期加一,若加满了这个月的天数,则月数加一,天数减去这个月的天数,若月数加满12,则年数加一,月数再减12,作为下一年的月数。

  • 7-5 求前N天 

题目分析:

输入年月日的值(均为整型数),同时输入一个取值范围在[-10,10] 之间的整型数n,输出该日期的前n天(当n > 0时)、该日期的后n天(当n<0时)。
其中年份取值范围为 [1820,2020] ,月份取值范围为[1,12] ,日期取值范围为[1,31] 。
注意:不允许使用Java中任何与日期有关的类或方法。

 我提交的源码:

 

  1 import java.util.Scanner;
  2 import java.math.*;
  3 public class Main {
  4 
  5     public static void main(String[] args) {
  6     Scanner input =new Scanner(System.in);
  7     int year = input.nextInt();
  8     int month = input.nextInt();
  9     int day = input.nextInt();
 10     int n = input.nextInt();
 11     if(checkInputValidity( year, month, day)==false||n>10||n<-10) {
 12         System.out.println("Wrong Format");
 13     }
 14     
 15     
 16     else {
 17      nextDate( year, month, day,n);
 18     }
 19     }
 20     public static void nextDate(int year,int month,int day,int n ) {
 21         int[] yuefen1=new int[]{0,31,29,31,30,31,30,31,31,30,31,30,31};
 22         int[] yuefen2=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
 23         int a=0,b=0,c=0;
 24         a = year;
 25         b = month;
 26         c = day;
 27         
 28         if(isLeapYear( year)==true) {
 29         if(n>0) {
 30             c=c-n;
 31             if(c<0) {
 32                 b--;
 33                 if(b<=0) {
 34                     b = b+12;
 35                     a--;
 36                 }
 37             
 38                 c=yuefen1[b]-n+day;
 39             }
 40         }
 41         else {
 42              c=c+(-n);
 43              if(c>yuefen1[month]) {
 44                  b++;
 45             c=c-yuefen1[month];     
 46              
 47              }
 48                  if(b>12) {
 49                      a++;
 50                      b = b-12;
 51                  }
 52                  
 53              }
 54         }
 55         
 56         else { if(n>0) {
 57             c=c-n;
 58             if(c<0) {
 59                 b--;
 60                 if(b<=0) {
 61                     b = b+12;
 62                     a--;
 63                 
 64                 }
 65                 
 66                     c=yuefen2[b]-n+day;
 67             }
 68         }
 69         else {
 70              c=c+(-n);
 71              if(c>yuefen2[month]) {
 72                  b++;
 73             c=c-yuefen2[month];     
 74              
 75              }
 76                  if(b>12) {
 77                      a++;
 78                      b = b-12;
 79                  }
 80                  
 81              }
 82             
 83         }    
 84         System.out.println(n+" days ago is:"+a+"-"+b+"-"+c);
 85     }
 86     
 87     
 88     public static boolean isLeapYear(int year){
 89         if((year%4==0&&year%100!=0)||year%400==0)
 90         return true;
 91         else
 92         return false;
 93         }
 94     public static boolean checkInputValidity(int year,int month,int day) {
 95         
 96         int panduan=0;
 97     int[] runnian=new int[]{0,31,29,31,30,31,30,31,31,30,31,30,31};
 98     int[] pingnian=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
 99         if(month>0&&month<=12){
100           if(isLeapYear(year))
101           {
102             if(day<=runnian[month]&&day>0)
103             panduan=1;
104           }
105           else
106           {
107             if(day<=pingnian[month]&&day>0)
108             panduan=1;
109           }
110         }
111     if(year<1820||year>2020||month<1||month>12||day<1||day>31||panduan==0) {
112         return false;
113         
114     }
115     else {
116         return true;
117     }
118 }
119 }

 

技术分享图片

 

设计分析与心得:

这个题设计了两个类,一个类用来判断输入的年份,天数是不是合法,求下一次天数的时候,需要导入四个参数,年份,月份,天数,需要加减的天数,在加入的天数超过这个月所在的天数时,月份需要加一,当月份加入超过12时,需要进行年份加一,这个题需要注意的是年份的操作,闰年的二月月份和平年的月份是不同的,下面展示这个圈复杂度:

技术分享图片这个题的圈复杂度较高,所用的if else 判断也较多,应该用较少的圈复杂度,老师说我们的是垃圾代码,就是因为圈复杂度较高,我们要做的是减少圈复杂度,这样代码才能更加的简洁和高效.这也是这个题之后要进行精进的地方。

JAVA第二次习题集-设计与分析

原文:https://www.cnblogs.com/lyhzml/p/14613811.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!