|
|
OO第一次作业总结
在第一次的总体作业的当中主要就是对于Java基础的只是进行学习总结,对于刚接触Java语言的基础训练题目,锻炼我们的编程能力
主要只是点有:练习类的构造方法、方法的调用、参数传递、对象的构造与使用、练习循环结构、控制结构、练习数据的输入与输出;学习编写结构清晰、逻辑正确、功能完善的java代码、对于java当中的基础语法知识点进行错误探查,从而达到掌握好知识的水平
本次作业分为以下部分,三次作业实现介绍(包括调度方法), 总结作业。
三次作业的实现
|
三次作业的实现第一次作业:(主要是对书本 的基础知识进行使用) 1、 计算两个数之和【太过于简单,省略】 知识点:学习使用输出语句:System.out,println(); 学习使用输入语句:int a = s.nextInt();à 是java.util.Scanner包当中的对象,在使用前要引用对象java.util.Scanner s = java.util.Scanner(System.in) 2、 电话键盘字母转换【太过于简单,省略】 -知识点:对于for 、 while、switch、if else语句的使用,加强对于这些既基础又时非常重要的知识点的掌握巩固 3、 成绩分级管理 -知识点:对于if else语句嵌套的使用,加强对于这些既基础又时非常重要的知识点的掌握巩固,以及普通逻辑的判断 4、 计算税率 -知识点:对于for 、 while、switch、if else语句的使用,加强对于这些既基础又时非常重要的知识点的掌握巩固,还有对于普通的计算,对于在不同的值域求解,分区分块的计算求解。重点:就是对于计算是的数据类型问题,对于强制类型转换和自动类型转换的理解与运用,在不同的数据类型计算时一定需要书注意到数据类型是否兼容计算是否需要进行强制类型转换,在不进行转换的情况下,可能时不会导致答案错误,但也有可能时会导致损失精度。 5、 计算钱币 -知识点:对于基本运算符的使用 “% /”获取最后一位数,使用%求模运算符的更还的判定 6、 使用一维数组求取平均值 -知识点:对于一维数组的理解使用,掌握,改怎么创建数据,怎么给数组初始化:有静态初始化和动态初始化 以及使用下表访问相应的元素,对于数据信息存储的方式进行理解,数组是一个对象是需要引用的,与C语言不同 7、 对多个整数进行排序 -知识点:对于for循环的使用以及对于冒泡排序,快速排序,插入排序的巩固使用 代码:public class Main{ public static void main(String[] args){ int n=0,i=0,j=0; int[] arr = new int[100]; java.util.Scanner s = new java.util.Scanner(System.in); n = s.nextInt(); for(i=0;i<n;i++){ arr[i] = s.nextInt(); } int max = arr[0],temp=0; for(i=0;i<n-1;i++){ for(j=0;j<n-i-1;j++){ if(arr[j] > arr[j+1]){ temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } } System.out.print("The sorted numbers are:"); for(i=0 ; i < n ; i++){ //if(i==0) //System.out.print(arr[i]); //else System.out.print(arr[i] + " "); } } } 8、 判断三角形类型
-知识点:对于逻辑的运算,if else语句的使用。 代码:public class Main{ public static void main(String[] args){ double a=0,b=0,c=0; java.util.Scanner s = new java.util.Scanner(System.in); int i=0; a = s.nextDouble(); b = s.nextDouble(); c = s.nextDouble();
if(a<1||a>200 || b<1||b>200 || c<1||c>200){ System.out.println("Wrong Format"); }else if(a+b<=c || a+c<=b || b+c<=a){ System.out.println("Not a triangle"); }else{//到了这里就说明了是个三角形 if(Math.abs(a-b)<0.1 && Math.abs(a-c)<0.1){// a==b a==c b==c System.out.println("Equilateral triangle"); }else if(Math.abs(a-b)<0.1&&Math.abs((a*a+b*b)-(c*c))<0.1 || Math.abs(a-c)<0.1&&Math.abs((a*a+c*c)-(b*b))<0.1 || Math.abs(b-c)<0.1&&Math.abs((b*b+c*c)-(a*a))<0.1){ System.out.println("Isosceles right-angled triangle"); }else if(Math.abs(a-b)<0.1 || Math.abs(a-c)<0.1 || Math.abs(b-c)<0.1){ System.out.println("Isosceles triangle"); }else if(Math.abs((a*a+b*b)-(c*c))<0.1 || Math.abs((a*a+c*c)-(b*b))<0.1 || Math.abs((b*b+c*c)-(a*a))<0.1){ System.out.println("Right-angled triangle"); }else{ System.out.println("General triangle"); }
}
} } |
第二次作业: 1、 IP地址的转换
知识点:对于字符串的遍历读取内容,以及而二进制的计算。理解二进制的存储数据的方式,以二进制码的理解 题目分析:该题目首先需要我们输入一个以二进制码的字符串、然后分块字符串,分成四个组成部分,最后分别对四段二进制码进行运算计算成十进制的答案,紧接就是输出相应的答案。 总结:对于读取字符串当中特定的部分内容可以使用java当中提供和哭方法直接进行读取运算。。不适用Java方法的时候就要使用for循环来进行对每一个数字进行遍历读取,保存到新的数组当中·. 2、 合并两个有序序列的数组为一个新的有序数组 知识点:对于for循环的使用,会使用到嵌套的循环方式,更好的访问相应的数据,可以加快程序进行的效率、 题目分析:利用for循环遍历每一个数据保存到新的数组当中,可以在进行在遍历数组的同时就可以进行排序判断数据的大小关系。在讲两个数组李连杰后就可以进行排序方法进行相应的排序,成功后即可以遍历数组访问数组查数组是否有序- 3、 判断日期为星期几
知识点:对于方法的定义、调用、传参等等的使用、for循环的使用、if else语句的判定、switch语句的使用、对于数组的访问动态改变数据的办法、以及如何计算该天是星期几的办法算法。 题目分析:用户输入当前日期、条用方法计算相据天数,利用以知道的方法进行定点判定,在条用方法计算相聚天数时还需要进行调用方法判断是否为闰年,方法结束时对于方法返还的结果的决定,在计算出星期几后使用switch语句进行判定打印输出答案。
4、 求下一天的日期、
知识点:对于方法的定义、调用、传参等等的使用、for循环的使用、if else语句的判定、switch语句的使用、对于数组的访问动态改变数据的办法、以及如何计算判定下一天是啥时候。 题目分析:用户输入当前日期、使用ifelse语句判定相关天数的情况是啥样子的,对于不腰痛的日期下一天是不直接在day天数上进行加上一天,调调用方法计算时还需要进行调用方法判断是否为闰年,对于不用年份每一个月的日期尽可能是不一样的。。
踩坑心得:在这道题目中,刚开始我自己是定义了两个数组,分别储存了闰年、平年的·每月天数,。这样我在调用和方法判断闰年的时候根据返回的值就可以判定使用哪一个数组进行判定下一天的方法;。这样对于代码的长度以及后台运行都是一个不好的点。在判定日期的情况用了太多的if else语句来判定情况这样就会闸弄成对于代码的可读性不是很高,对于代码的理解也是相当的困难,由于·逻辑判定情况套太多
改进建议:在看到网友们的方法,是只创建一个数组来保存天数信息,然后在调用判断闰年方法的时候根据返回值来改变二月的天数,因为:闰年和平年的区别就是二月的天数不一样而已。这样既节省了空间的浪费,也是代码变得更加整洁干净有条有理。在修改判定日期的条件中,讲多中情况集合在一个条件语句判定当中,这样就节省了if else语句的嵌套对于代码理解起来就不是很麻烦了,修改原因:讲就是对于条件的观察总结可以看出相应的规律,就可以对于田间判定的总结归纳。 总结:这里就说明了在对于编写条件判定的时候一定需要很强大观察能力总结相同情况的概念下。对于代码的简洁化 5、 求前N天的日期【此题与上一题基本一致】 知识点:对于方法的定义、调用、传参等等的使用、for循环的使用、if else语句的判定、switch语句的使用、对于数组的访问动态改变数据的办法、以及如何计算判定前N天是啥时候。 题目分析:用户输入当前日期、以及前几天【N】使用If else语句判定相关天数的情况是啥样子的,对于不同的日期下一天是不直接在day天数上进行加N天或者减去N天因为:当前日期的限定,在不同时期可能会变月份、年份,调调用方法计算时还需要进行调用方法判断是否为闰年,对于不用年份每一个月的日期尽可能是不一样的。。
踩坑心得:在这道题目中,刚开始我自己是定义了两个数组,分别储存了闰年、平年的·每月天数,。这样我在调用和方法判断闰年的时候根据返回的值就可以判定使用哪一个数组进行判定下一天的方法;。这样对于代码的长度以及后台运行都是一个不好的点。在判定日期的情况用了太多的if else语句来判定情况这样就会闸弄成对于代码的可读性不是很高,对于代码的理解也是相当的困难,由于·逻辑判定情况套太多
改进建议:在看到网友们的方法,是只创建一个数组来保存天数信息,然后在调用判断闰年方法的时候根据返回值来改变二月的天数,因为:闰年和平年的区别就是二月的天数不一样而已。这样既节省了空间的浪费,也是代码变得更加整洁干净有条有理。在修改判定日期的条件中,讲多中情况集合在一个条件语句判定当中,这样就节省了if else语句的嵌套对于代码理解起来就不是很麻烦了,修改原因:讲就是对于条件的观察总结可以看出相应的规律,就可以对于田间判定的总结归纳。 总结:这里就说明了在对于编写条件判定的时候一定需要很强大观察能力总结相同情况的概念下。对于代码的简洁化 第三次作业: 7-2:定义日期类 知识点:对于方法的定义、调用、传参等等的使用、for循环的使用、if else语句的判定、switch语句的使用、对于数组的访问动态改变数据的办法、对象【类】的创建,对象当中和属性的私有化,建立构造方法setter和getter方法,来对相应的属性信息进行改变访问的作用。对象的创建是同,如何调用对象中的方法,设计使用后【引用 . 】方式。 -à 特点:本题与上一次的日期题目很相近,知识添加了新的知识·点定义类,而在判定下一天的方法和模式是一模一样的·
踩坑心得:刚接触使用封装的方法来定义类,对于属性的私有化,之后定义set和get方法了访问信息那真的是又带你不太明白,之后明白这一样做的意义是更好的保护了信息的而作用。对于访问属性的时候并没有使用get和set方法来访问就会导致访问失败,因为属性私有化了就只能在奔雷当中给才能进行访问,在别的类下访问就必须听通过set和get方法来进行访问。
代码:
class Date{ private int year; private int month; private int day; int[] month_day = new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31}; public int getYear() { return year; } public void setYear(int year) { this.year = year; } public int getMonth() { return month; } public void setMonth(int month) { this.month = month; } public int getDay() { return day; } public void setDay(int day) { this.day = day; }
public Date() { super(); } public Date(int year, int month, int day) { this.year = year; this.month = month; this.day = day; }
public boolean isLeapYear(int year) { if( year%4 == 0 && year%100 !=0 || year%400 == 0 ){ return true; }else{ return false; } } public boolean checkInputValidity(int year,int month,int day) { if(this.isLeapYear(year)) month_day[2] = 29; if(year < 1900 || year > 2000 || month <=0 || month > 12 || day <= 0|| day > month_day[month]){ System.out.println("Date Format is Wrong"); return false; }else { return true; } }
public void getNextDay(int year,int month,int day) { if(this.isLeapYear(year)) month_day[2] = 29; if(month == 12){ //最后一个月就可能需要改变年份 if(day == month_day[month]){ year = year + 1; month = 1; day = 1; }else{ day++;} }else{ //不是最后一个月就不需要改变年份 if(day == month_day[month]){ month++; day = 1; }else{ day++;} }
System.out.println("Next day is:" +year+ "-" +month+ "-"+day); }
}
public class Main { public static void main(String[] args) { java.util.Scanner s = new java.util.Scanner(System.in); int year = s.nextInt(); int month = s.nextInt(); int day = s.nextInt(); //先判断输入是否合法 Date date = new Date(); if(date.checkInputValidity(year, month, day) == false) { return; } //然后吧数据传到对象当中 date.setYear(year); date.setMonth(month); date.setDay(day); //开始计算下一天 date.getNextDay(year, month, day);
} } |
7-3:一元多项式求导(类设计)
知识点:对于方法的定义、调用、传参等等的使用、for循环的使用、if else语句的判定、switch语句的使用、对于数组的访问动态改变数据的办法、对象【类】的创建,对象当中和属性的私有化,建立构造方法setter和getter方法,来对相应的属性信息进行改变访问的作用。对象的创建是同,如何调用对象中的方法,设计使用后【引用 . 】方式。 对与字符串的使用,以及java库对方中众多的方法进行使用,以及大数据类型定义的初步使用、超级多的if else嵌套循环的使用,以及初步使用正则表达式来读取相似的字符串当中特定数据,这是一个非常好用的表达式,并且工序哦效率非常之高。各种逻辑判断。
题目分析:这道题目主要是讲多项式当中的指数、系数的读取、对于读取到的指数系数储存到对应的数组当中,而且必须要一一对应,那么如何对指数和系数进行读取呢!这里就用到了最重要的知识就是正则表达式,对每一处表达式进行读取,使用while循环读取,知道没有对应的表达式得时候就停止读取,没读取一段信息表达式就根据逻辑判断来读取相应位置得的指数、系数保存到对应的指数数组、系数数组当中、由于判断条件过于if else语句嵌套是过于复杂,情况太多,分别需要判定多项式当中和是否系数为1、指数是否为1,指数不为1的情况下还有判断系数为不为1、需要对于指数读取来判断,但是由于系数为1的情况下系数式缺省的式没有输入的,而缺省的情况下第一个字符式是x那么就可以确定系数是为1的,那么就需要判断第一个字符是为什么,如果只要判断出第一个字符是啥情况就可以确定系数,同意也是需要判断不为1的情况,指数不为1的话那么就有次方号 ^ 那么就要判断字符串当中是否有次方好。这样就是指数系数的大概情况了。
踩坑心得:这道题目是目前为止最难的一道题目了,对于逻辑判断要求特别高,各种格言样的逻辑判断非常的容易错误,以及判断的条件非常多,在不同的多项式当中是由不同的条件就又非常多的情况,就需要大量的测试,总结来判断不同的条件来编写条件语句。那么就离就需要很好对条件的判断以及if else语句的使用,将情况分清楚 代码: import java.math.BigInteger; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Main { public static void main(String args[]) { java.util.Scanner s = new java.util.Scanner(System.in); String str = s.nextLine(); str = str.replaceAll("\\s",""); int flag1 = 0; for(int i = 0; i <str.length() ; i++) { char ch = str.charAt(i); if(ch == '+' || ch == '-' || ch == '*' || ch == '^' || ch == 'x') { flag1++; } } if(flag1 == 0) { System.out.println("0"); return; } //其实第一是检查输入的是否正确 //String pattern = "([+-]?\\d*)?[xX](\\^([+-]?\\d*))?"; //【表达一】 //String pattern = "\\+?(-?[1-9]?[0-9]*)[xX]\\^\\+?(-?[1-9]?[0-9]*)";//【表达二】 String pattern = "((\\+|\\-)?\\d*)?(\\*)?[xX](\\^([+-]?\\d*))?"; Pattern r = Pattern.compile(pattern); Matcher m = r.matcher(str); int i = 0,cnt = 0; BigInteger[] arr = new BigInteger[1024]; BigInteger[] brr = new BigInteger[1024]; while(m.find()){ String re = m.group();//分段的每一个表达式 char ch = re.charAt(0); if(ch == 'x' || ch == '+' || ch == '-') {//这里已经考虑了第二个表达式【不管有没有系数】 if(ch == 'x') {//第一个表达式没有系数 arr[i] = new BigInteger("1"); if(re.length() == 1) { brr[i] = new BigInteger("0");//brr[i] = 0 i++; cnt++; continue; } ch = re.charAt(1); if(ch != '^') { brr[i] = new BigInteger("1"); }else { if(ch == '+' || ch == '-') {//第一个表达是既没有系数也没有指数-->所以直接到达第二个表达式 brr[i] = new BigInteger("1"); }else {//第一个表达是没有系数 但是有指数 int strStartIndex = re.indexOf("^") + 1; String b = re.substring(strStartIndex);//读取到指数 brr[i] = new BigInteger(b);//储存指数 if(brr[i].compareTo(new BigInteger("0")) == 0) {//非法输入提示退出程序 System.out.println("Wrong Format"); return; } } } }else{//第一个表达式有系数 还有第二个表达是的处理【可能有系数可能没有系数】 char ch001 = re.charAt(1); if(ch001 == 'x') { //系数为1的情况,但是有正负之分 if(ch == '-') { arr[i] = new BigInteger("-1"); if(re.length() == 2) { brr[i] = new BigInteger("1"); }else { ch001 = re.charAt(2); if(ch001 != '^') { brr[i] = new BigInteger("1"); }else { int strStartIndex = re.indexOf("^") + 1; String b = re.substring(strStartIndex);//读取到指数 brr[i] = new BigInteger(b);//储存指数 if(brr[i].compareTo(new BigInteger("0")) == 0) {//非法输入提示退出 System.out.print("Wrong Format"); return; } } } }else { if(ch == '+') { arr[i] = new BigInteger("1"); if(re.length() == 2) { brr[i] = new BigInteger("1"); }else { ch001 = re.charAt(2); if(ch001 != '^') { brr[i] = new BigInteger("1"); }else { int strStartIndex = re.indexOf("^") + 1; String b = re.substring(strStartIndex);//读取到指数 brr[i] = new BigInteger(b);//储存指数 if(brr[i].compareTo(new BigInteger("0")) == 0) {//非法输入提示退出程序 System.out.print("Wrong Format"); return; } } } } } /*ch = re.charAt(1); if(ch == 'x') {//第二个表达是没有系数 arr[i] = new BigInteger("1"); ch = re.charAt(2); if(ch != '^') { brr[i] = new BigInteger("1"); }else { int strStartIndex = re.indexOf("^") + 1; String b = re.substring(strStartIndex);//读取到指数 brr[i] = new BigInteger(b);//储存指数 if(brr[i].compareTo(new BigInteger("0")) == 0) {//非法输入提示退出程序 System.out.println("Wrong Format"); return; }*/ }else {//第二个表达有系数 int strEndIndex = re.indexOf("*");//系数读取结束段 String a = re.substring(0,strEndIndex);//读取到系数 arr[i] = new BigInteger(a);//储存系数 if(arr[i].compareTo(new BigInteger("0")) == 0) {//非法输入提示退出程序 System.out.println("Wrong Format"); return; } int cnt1 = 0; for(int j = 0; j < re.length() ; j++) { char ch2 = re.charAt(j); //System.out.println("每一个数为:" +ch2);//这个没有问题 if(ch2 == '^') { String b = re.substring(j+1);//读取到指数 brr[i] = new BigInteger(b);//储存指数 if(brr[i].compareTo(new BigInteger("0")) == 0) {//非法输入提示退出程 System.out.println("Wrong Format"); return; } cnt1++; } } if(cnt1 == 0) {//说明了第二个表达式的指数也是1 brr[i] = new BigInteger("1"); } } } }else {//第一个表达式肯定有系数\ int cnt1 = 0; int strEndIndex = re.indexOf("*");//系数读取结束段 String a = re.substring(0,strEndIndex);//读取到系数 arr[i] = new BigInteger(a);//储存系数 if(arr[i].compareTo(new BigInteger("0")) == 0) {//非法输入提示退出程序 System.out.println("Wrong Format"); return; } for(int j = 0; j < re.length() ; j++) { char ch2 = re.charAt(j); if(ch2 == '^') {// 有指数 String b = re.substring(j+1);//读取到指数 brr[i] = new BigInteger(b);//储存指数 if(brr[i].compareTo(new BigInteger("0")) == 0) {//非法输入提示退出程序 System.out.println("Wrong Format"); return; } cnt1++; } } if(cnt1 == 0) {//说明了第二个表达式的指数也是1 brr[i] = new BigInteger("1"); } } i++;cnt++; }//找到后就后开始求导 //这里开始求导了 for(i = 0 ; i < cnt ; i++) { if(arr[i].compareTo(new BigInteger("1")) == 0 && brr[i].compareTo(new BigInteger("0")) == 0) { System.out.print(arr[i]); continue; }else { arr[i] = arr[i].multiply(brr[i]);// 新的系数 = 旧的系数 * 旧的指数 } //System.out.println("新的系数为:"+arr[i]);// 测试系数是否正确 brr[i] = brr[i].add(new BigInteger("-1")); if(brr[i].compareTo(new BigInteger("0")) != 0) {// if(arr[i].compareTo(new BigInteger("0")) > 0) { if(i == 0) { System.out.print("" +arr[i]); }else { System.out.print("+" +arr[i]); } }else { System.out.print("" +arr[i]); } } if(brr[i].compareTo(new BigInteger("0")) == 0) {//输出一次x求导后的常数 if(arr[i].compareTo(new BigInteger("0")) > 0) { if(i == 0) { System.out.print(arr[i]); }else{ System.out.print("+" +arr[i]); } }else { System.out.print("" +arr[i]); }
}else { if(brr[i].compareTo(new BigInteger("1")) == 0) System.out.print("*x"); else System.out.print("*x^" +brr[i]); } }
} }
改进建议:在读取每一段字符串时一定是要精准的写出正则表达式来对一元多项式进行读取。对于读取后的每一段子表达式就一定要分好情况在指数系数的情况下使用嵌套循环if else语句分好情况,需要很好的逻辑关系来判断,将情况意义累出,需要在什么情况下里面情况下嵌套if else语句来读取指数系数、 运行结果:
|
|