题目集1~3的总结性Blog

(1)前言:总结三次题目集的知识点、题量、难度等情况   

 (字体大小:5(18pt))

题目集一: (字体大小:(16px))

首先第一题:计算两个数的和。

通过键盘为变量a和b赋值,然后计算变量a与b的和,并将和赋值给变量sum,最终输出变量sum的值;主要是对我们最基础Java编程要求,就是基本的输入输出,计算两个数之和,主要考查点是java的编程习惯,再就是如何从键盘输入并获得一个值,用到了Scanner input  =  new Scanner(System.in);进行运算,但在使用Scanner input  =  new Scanner(System.in);的时候,要导入import.java.Scanner;才能正确地使用Scanner input  =  new Scanner(System.in);在获取这个值的时候,需要用到input.nextInt();应该从键盘输入的是一个整型值,同样地,如果要获取一个双精度值,或者其他的,要变成input.nextDouble();以及其他,注意这些小细节。难度:极易。

第二题:编写一个程序,从键盘读入一个输入的字母,将其转换成所对应的数字。

在这题我用到的是if分支语句,在Java中,if语句与C语言基本相同。首先在解答这道题的时候先在大脑中构思,有多少种情况,然后每种情况对应一个if分支语句,比如

if((b>='A'&&b<='C')||b>='a'&&b<='c')
{
System.out.println("2");
}

这个表示如果输入的是ABC或者小写字母abc,那么就输出数字2,自然也就实现了转换。这里的知识点包括分支语句的使用,这里也当然可以使用switch语句,抑或是if—else if分支语句,选择其中一种类型即可。

难度:极易。

第三题:学校进行成绩分级管理,取消分数制,改为成绩分级评定。具体办法是:小于60分为E类;60分至70分(不含70分)为D类;70分至80分(不含)为C类;80分至90分(不含)为B类;90分以上为A类。设计一个程序,对输入的成绩进行等价划分。

这里考察的也是一个分支语句的使用。我依然用的是if分支语句。如果要我用switch语句,同样的解决方法。那么就是

switch (a){

case  (a>=90&&a<=100) : {System.out.println("A");break;}

case  a<90&&a>=80)  :{System.out.println("B");break;}

…………

default:…………

 

难度:极易。

第四题 :计算税率

这道题主要考察我们的思维,题目很长,理解也需要透彻,同样是考察我们分支语句的使用。只不过每条分支都很麻烦,处理起来比较麻烦。

难度:易。

第六题 : 本题目要求使用一维数组,存储5个整数,输出5个整数的平均值。

知识点主要是考察一维数组的使用,遍历数组,存入数据,再遍历数组读取数据进行操作,这里是读取数据进行一个加法运算,然后求平均值,最后打印出来即可,在Java中的语法也是和C语言的相同。注意Java写代码的时候的习惯。难度:极易。

第七题 :先从键盘输入一个整数n,n代表需要排序的整数数量,然后再从键盘输入n个整数,对这些数从小到大排序并输出。

我用的是冒泡排序,但是后来用冒泡排序写完之后,发现有一种方法可以直接将数组从小到放大排序那就是数组Array.sort()排序的方法

难度:极易。

第八题 :输入三角形三条边,判断该三角形为什么类型的三角形。

做题之前要有一个大致的思路,首先输入的三角形的三条边要合法,即任意两边之和要大于第三边,任意两边之差要小于第三边,所以在保证合法的情况下在进行下一步操作,那就可以进一步判断是哪一种三角形,先打草稿罗列出不同三角形判断所需要的要求,只要输入的三条边符合某一种情况,那就打印出对应的提示。

首先从键盘获取三角形的三条边,同样要用到分支语句,应题目要求三条边都应该在1-200之内

限制条件代码可以写成

if(a>200||a<1||b>200|b<1||c>200||c<1)
System.out.println("Wrong Format");
else if(a+b<=c||a+c<=b||b+c<a)
System.out.println("Not a triangle");

此外,这里如果要判断是否为直角三角形,就需要用到平方,所以经过查阅资料得知,需要用到

Math.pow(  ,  );,例如A边的平方可以表示为Math.pow(a,2.0);这里与C语言的表示方法不同,所以注意区分和应用。经简单讨论,在合法三角形的的情况下,总共有七种情况,所以写成相应代码就是:

if(a>200||a<1||b>200|b<1||c>200||c<1)
System.out.println("Wrong Format");
else if(a+b<=c||a+c<=b||b+c<a)
System.out.println("Not a triangle");
else if(a==b&&a==c&&b==c)
System.out.println("Equilateral triangle");
else if(a==b&&Math.pow(a,2.0)+Math.pow(b,2.0)==Math.pow(c,2.0)||b==c&&Math.pow(c,2.0)+Math.pow(b,2.0)==Math.pow(a,2.0)||a==c&&Math.pow(a,2.0)+Math.pow(c,2.0)==Math.pow(b,2.0))
System.out.println("Isosceles right-angled triangle");
else if(a==b||a==c||b==c)
System.out.println("Isosceles triangle");
else if(Math.pow(a,2.0)+Math.pow(b,2.0)==Math.pow(c,2.0)||Math.pow(c,2.0)+Math.pow(b,2.0)==Math.pow(a,2.0)||Math.pow(a,2.0)+Math.pow(c,2.0)==Math.pow(b,2.0))
System.out.println("Right-angled triangle");
else
System.out.println("General triangle");

这道题就是在考虑判断是什么三角形的时候要仔细想,以什么样的形式判定,并且要罗列详尽,把所有情况都列举出来。

但是有一个采分点我没有得到,我也不清楚是哪个地方没有考虑到。

难度 : 难

题目集二:

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

二进制是由2^n相加组成的,根据二进制数字的长度就可以开相应的次方,最后全部加起来就可以了,题目中说每个字节八位,那就将输入的32位字节分开,获取子字符串,再对每个子字符串进行转换。在题目中要求:必须为二进制数,即只能输入0或者1,长度必须是32位。所以在执行程序时,就首先应该判断是否符合二进制数,长度32位。如果不是就没必要进行下一步操作了,这时候就要输出提示:: Wrong Format  ;因为如果不符合要求的话,也无法进行正确的转化。

 

import java.util.Scanner;
public class Main{
public static void main(String[] args) {

Scanner input = new Scanner(System.in);

String a = input.nextLine();//获取一个32位二进制数
int f = 0 ;
if(a.length()==0)
{System.out.println("Wrong Format");return;}
for(int i=0;i<32;i++)
{

char s = a.charAt(i);
if(( s != '0' && s != '1')||(s==' ')||(a.length()!=32))//||(a.length()==0)
{
f=1;
System.out.println("Wrong Format");
break;
}
}
if(f==0)
{
String b = a.substring(0,8);
String c = a.substring(8,16);
String d = a.substring(16,24);
String e = a.substring(24,32);
int sum = 0;
int sum1 = 0;
int sum2 = 0;
int sum3 = 0;
int i;
for(i = 0;i < 8;i++)
{
char dh = b.charAt(i);
if(dh=='1')
{
sum += Math.pow(2,7-i);
}
}
System.out.print(sum + ".");

for(i = 0;i < 8;i++)
{
char dh = c.charAt(i);
if(dh=='1')
{
sum1 += Math.pow(2,7-i);
}
}
System.out.print(sum1 + "."); //第二个八位进制转换

for(i = 0;i < 8;i++)
{
char dh = d.charAt(i);
if(dh=='1')
{
sum2 += Math.pow(2,7-i);
}
}
System.out.print(sum2 + "."); //第三个八位进制转换

for(i = 0;i < 8;i++)
{
char dh = e.charAt(i);
if(dh=='1')
{
sum3 += Math.pow(2,7-i);
}
}
System.out.print(sum3); //第四个八位进制转换
}
}

}

难易:中

 

第二题 :合并两个有序数组为新的有序数组

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

首先输入第一个数组的数据个数后输入第一个数组按升序排序的数据,然后再输入第二个数组的数据个数,最后输入第二个数据按升序排序的数据。数据之间用一个或多个空格或回车符分隔。

输入两个数组的数组后,用循环再将两个数组放到一个数组中,这个新的数组内存空间正好是前两个数组空间之和,然后这个新数组就是合并之后的了,‘对这个新数组再进行排序,(题目中要求是从小到大排序)可以用到选择排序或者冒泡排序,但是后来我发现可以用现成的方法      Arrays.sort(Array);  这可以直接对数组进行从小到大排序,最后输出结果即可。考察的知识点是排序 ,选择排序,冒泡排序或者是我用的这个  Arrays.sort(Array);  

排序之后遍历打印…………

Arrays.sort(arr2);
int l;
for(l = 0;l < n2;l++)
{
//System.out.println(arr2[l] + " ");
System.out.print(arr2[l] + " ");
}
System.out.println();

难易:较易

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

题目中有要求相关方法:

public static void main(String[] args);//主方法;
public static boolean isLeapYear(int year) ;//判断year是否为闰年,返回boolean类型;
public static int numOfDays(int year,int month ,int day) ;//求出year-month-day到0001-1-1的距离天数,返回整型数;
public static String getWhatDay(int days) ; //根据天数返回星期几,其中参数days为天数,整型数,返回星期几的英文单词。
 
 


import java.util.Scanner;
public class Main {

static int days;
static int week;
static int[] allmonth = {0,31,28,31,30,31,30,31,31,30,31,30,31};
public static void main(String[] args) {

Scanner input = new Scanner(System.in); //输入 年/月/日
int year = input.nextInt();
int month = input.nextInt();
int day = input.nextInt();


boolean answer = checkInputValidity(year,month,day);
if(answer == false)
{System.out.print("Wrong Format");return; }
else
{

if(isLeapYear(year) == true )
{
allmonth[2] = 29 ;
System.out.println( year + " is a leap year.");
numOfDays( year, month, day) ;
//System.out.println( days);
getWhatDay( days );
switch(week)
{
case 0:System.out.println( year + "-" + month + "-" + day + " is Monday.");break;
case 1:System.out.println(year + "-" + month + "-" + day + " is Tuesday.");break;
case 2:System.out.println( year + "-" + month + "-" + day + " is Wednesday.");break;
case 3:System.out.println( year + "-" + month + "-" + day + " is Thursday.");break;
case 4:System.out.println( year + "-" + month + "-" + day + " is Friday.");break;
case 5:System.out.println( year + "-" + month + "-" + day + " is Saturday.");break;
case 6:System.out.println( year + "-" + month + "-" + day + " is Sunday.");break;
}
//System.out.println( "HERE");
}
else //Not a leap year
{
System.out.println( year + " is not a leap year.");
numOfDays( year, month, day) ; //计算
getWhatDay( days );
switch(week)
{
case 0:System.out.println( year + "-" + month + "-" + day + " is Monday.");break;
case 1:System.out.println(year + "-" + month + "-" + day + " is Tuesday.");break;
case 2:System.out.println( year + "-" + month + "-" + day + " is Wednesday.");break;
case 3:System.out.println( year + "-" + month + "-" + day + " is Thursday.");break;
case 4:System.out.println( year + "-" + month + "-" + day + " is Friday.");break;
case 5:System.out.println( year + "-" + month + "-" + day + " is Saturday.");break;
case 6:System.out.println( year + "-" + month + "-" + day + " is Sunday.");break;
}
}
}
}

public static boolean isLeapYear(int year) {
if((year % 4 ==0 && year % 100 != 0)||year %400 == 0)
return true;
else
return false;
}
public static int numOfDays(int year,int month,int day) { //返回总天数
int nian = (year / 4) * 366 + (year / 4) * 365 * 3 ; //计算年份总和
int sumyue = 0;
int i ;
for(i=1;i<=month;i++) //计算月份总和
{
sumyue = sumyue + allmonth[i] ;
}
days = nian + sumyue + day ;
return days;
}

public static int getWhatDay(int days)
{
week = days % 7;
//week = "days % 7";
return week;
}
public static boolean checkInputValidity(int year,int month,int day)
{
if(year > 2020 || year < 1820 || month >12 || month <1 || day >31 || day < 1)//
{return false;}
else if(isLeapYear(year)==true && (day >29 || day < 1)&&month==2)
{return false;}

else if(isLeapYear(year)==false && (day >28 || day < 1)&&month==2)
{return false;}
else
return true;
}
}

 

题目很有意思,虽然写的代码有很多行,但是写出来之后有如释重负的感觉。题目不难,关键是要有一个方法,有一个方向。

一道题包括了有关闰年实现的方法。

第四、五题 :输入年月日的值(均为整型数),输出该日期的下一天。 其中:年份的合法取值范围为[1820,2020] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31] 

输入年月日的值(均为整型数),同时输入一个取值范围在[-10,10] 之间的整型数n,输出该日期的前n天(当n > 0时)、该日期的后n天(当n<0时)。
其中年份取值范围为 [1820,2020] ,月份取值范围为[1,12] ,日期取值范围为[1,31] 。

 

这两道题实现方法与第四题相同,难度最大的是第五题,我是先写的第五题,再写的三四题,所以感觉再去写三四题就不那么迷茫了。

其实日期计算的主是用到除余和除法,因为从年份和月份都是循环轮回可知,就很容易想到这个。

难度 : 难

 

题目集三 :

第一题 : 创建账户类Account

这个就是要求我们掌握的知识点是类的设计,就是如何创建类。

其实这道题发布的时候,还没学习到这里,所以自学起来还是有点困难,还是很不熟悉,所以只有去查询资料,但是对于我来说,接受这个抽象的东西需要一段时间,一开始只是机械性的懂得类设计的基本理论解释,但是还不明白原因,但是到现在有所改善,所以要求我要多多打代码,加快理解速度。

这个类有时候为了安全性,对他进行封装,就是用private修饰符,使用者不用知道怎么实现的。因为封装之后只能通过getter()  和setter() 方法进行操作,么封装的时候,除了要加private的修饰符之外,还要构造方法

比如题目中要进行这样构造getter()  和setter()

public int getid() {
return id;
}
public double getbalance() {
return balance;
}
public double getannualInterestRate(){
return annualInterestRate;
}
public void setid(int id) {
this.id=id;
}
public void setbalance(double balance) {
this.balance= balance;
}

难度: 难

 

第二题 : 定义一个类Date,包含三个私有属性年(year)、月(month)、日(day),均为整型数,其中:年份的合法取值范围为[1900,2000] ,月份合法取值范围为[1,12] ,日期合法取值范围为[1,31] 。

这道题需要用到类的创建,也需要用到类的封装。我还不熟悉“ .  ”运算符的使用,就是在创建类和对象的时候。需要用到。

代码如下:


import java.util.Scanner;
public class Main {


private static int year;
private static int month;
private static int day;



public int getYear() {
return year;
}
public void setYear(int year) {
Main.year = year;
}
public int getMonth() {
return month;
}
public void setMonth(int month) {
Main.month = month;
}
public int getDay() {
return day;
}
public void setDay(int day) {
Main.day = day;
}

static int[] allmonth = {0,31,28,31,30,31,30,31,31,30,31,30,31};
public static void main(String[] args) {

int year1 , month1 , day1 ;
Scanner input = new Scanner(System.in);
year1 = input.nextInt();
month1 = input.nextInt();
day1 = input.nextInt();
Main Data = new Main();
Data.setYear( year1);
Data.setMonth( month1);
Data.setDay( day1);

if((isLeapYear(year))==true)
{ allmonth[2] = 29 ;}
boolean answer = checkInputValidity(year,month,day);
if(answer == false)
{System.out.print("Date Format is Wrong");}
else
{
nextDate(year,month,day);
}
}
public static boolean isLeapYear(int year) {
if((year % 4 ==0 && year % 100 != 0)||year %400 == 0)
return true;
else
return false;
}

public static boolean checkInputValidity(int year,int month,int day) {
if(year > 2000 || year < 1900 || month >12 || month <1 || day >31 || day < 1)//
{return false;}

else if(isLeapYear(year)==true && (day >29 || day < 1)&&month==2)
{return false;}

else if(isLeapYear(year)==false && (day >28 || day < 1)&&month==2)
{return false;}

else
return true;
}

public static void nextDate(int year,int month,int day) {
if(month != 12 &&(day + 1 > allmonth[month]) )
{
month++;
day = 1 ;
System.out.print("Next day is:" + year + "-" + month + "-" +day);
}
else if(month == 12&&(day + 1 > allmonth[month]) )
{
year++;
month = 1;
day = 1;
System.out.print("Next day is:" + year + "-" + month + "-" +day);
}
else
{
day++;
System.out.println("Next day is:" + year + "-" + month + "-" +day);

}

}

}

 

第三题 : 一元多项式求导(类设计)

要用到正则表达式,我虽然不会,但是通过查资料,看慕课以及看视频教学方法,我知道了怎么匹配正则表达式,但是还是不知道怎么使用吗,以及他里面包含的许多方法。再比如: Pattern  。我也不知道确切的怎么使用。

所以这道题得分很少,希望老师能够提前讲解,这样就能减轻我们的学习负担,也只有掌握了这方面的知识,才能去做练习,才需要通过练习去巩固。

 

 

 

 

总结:老师布置的作业总是比讲到的知识更早,所以很大程度需要我们去自学,希望老师能将的详细一点,同时布置的作业需要的知识进度不要太快,比如说最近的类的设计,可以多多布置类的设计这一专题的题目,多多练习,而不是只有一道题是类的设计。我也会尽可能通过自学和请教来跟上进度  。-其实我觉得老师让我们课堂上给出一定的时间做练习,然后讲解,觉得这样上课还是很充实的。

说实话,我真的觉得老师布置的PTA上的作业进度很快,我们只能自学来解决问腿,那有些人还是不能明白怎么写就只能复制粘贴了,或者没办法动手写题。

所以希望我们老师和学生一起努力,希望是我们上课听不懂再去查阅资料,进行巩固加强印象,而不是一上来就是自学,然后做题。感谢老师理解。

 

posted @ 2021-04-04 18:34  flemingonly  阅读(161)  评论(0)    收藏  举报