ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

题目集1_3的总结

2022-04-11 10:31:06  阅读:133  来源: 互联网

标签:总结 题目 charAt month && year String


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

(1)知识点:1、题目01-7-1 if else的使用;2、题目01-7-2 对于输出格式的控制;3、题目01-7-3  对于输入格式的控制;4、题目01-7-4 数据类型强制转换的使用; 5、题目01-7-5 多层if else 的使用;6、题 目01-7-6 对于函数String.charAt(0)的使用;7、题目01-7-7对于数据存在误差的控制;8、题目01-7-9 从字符串中提取内容;9、题目01-7-9从判断三角形中了解对于一些边界值的测定;10、题目 02-7- 1将字母转换为数字;11、题目02-7-2 从二进制数据流中提取有效数据;12、题目02-7-3 String的格式判断与内容提取;13、题目03-7-1 用类解决一元二次方程;14、题目03-7-2 设计设  置私有属性,编写方法;15、题目03-7-03设计聚合类;16题目03-7-4设计聚合类;

题量:题目集1:9题;题目集2:3题;题目集3:4;

难度:题目集1:容易;题目集2:容易;题目集3:中难;

(2)设计与分析

<1>强制转换只需要在数据前面所需要转换的方式例:a = (float )weight;

输出的方式与c语言不同,c中使用printf("        ");可以实现将空格插入的内容一同输出,在JAVA需要使用“+”,输出所需要的格式

bang=(float) (weight/0.45359237);
yingcun=(float) (high/0.0254);
System.out.println(bang+" "+yingcun);

<2>定义数组:存在与c语言不同的方式,在c中,使用 int a[10];JAVA中的定义方式存在区别

int num[] = new int [10];

<3>提取字符串中的单个字符

在JAVA中可以提取单独的字符,以下的例子中,定义了一个学生的学号,通过String.charAt(1),就可以提取出第二个字符

String StudentNumber ="18201123";
char a = StudentNumber.charAt(1);

<4>题目字母-数字转换

题目要求:实现输入一个由英文字母组成的字符串(大小写均可),将所有英文字母转换成它们在字母表中的序号,例如:“AbbcD”转换为“12234”

输入格式:由英文字母组成的字符串(大小写均可)。例如:“AbbcD”
     若包含非英文字母,视为非法输入。

输出格式:由英文字母组成的字符串(大小写均可)。例如:“AbbcD”
     若包含非英文字母,视为非法输入。

设计思路:拒绝复杂的思路,将一个个的赋值(使用if将A和a转变成需要的数字)转换成使用ASCII表,可以达到按顺序实现值的转换;使用a.length();函数可以测试出字符串的长度

踩坑心得:使用in.nextLine()好过于in.next(); in.next无法输入空格,所以对于非法输入的判断的测试点会无法通过

复制代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int a,i,j,num;
        num=0;
//        int num[]=new int[26];
        String s = new String();
        s = in.nextLine();
        a=s.length();
        for(i=0;i<a;i++) {
            if((s.charAt(i)>='a'&&s.charAt(i)<='z')||(s.charAt(i)>='A'&&s.charAt(i)<='Z')) {
                num++;
            }
            else {
                System.out.println("Wrong Format");
                break;
            }
        }
        if(i==a) {
            for(j=0;j<a;j++) {
                if(s.charAt(j)>='a'&&s.charAt(j)<='z') {
                    num=s.charAt(j)-96;
                    System.out.print(num);
                }
                if(s.charAt(j)>='A'&&s.charAt(j)<='Z') {
                    num=s.charAt(j)-64;
                    System.out.print(num);
                }
            }
        }
    }
}
复制代码

<5>题目-串口字符解析

题目要求:RS232是串口常用的通信协议,在异步通信模式下,串口可以一次发送5~8位数据,收发双方之间没有数据发送时线路维持高电平,相当于接收方持续收到数据“1”(称为空闲位),发送方有数据发送时,会在有效数据(5~8位,具体位数由通信双方提前设置)前加上1位起始位“0”,在有效数据之后加上1位可选的奇偶校验位和1位结束位“1”。请编写程序,模拟串口接收处理程序,注:假定有效数据是8位,奇偶校验位采用奇校验。

输入格式:由0、1组成的二进制数据流。例如:11110111010111111001001101111111011111111101111、

输出格式:所有英文字母转换成它们在字母表中的序号,例如:“12234”。
     非法输入输出"Wrong Format".

设计思路:1:控制字符数量,实现多个字符一组,排除一个一个容错复杂的判断,本题需要判断的数据可以设计成11位为一组

if(a<11)
    System.out.println("null data");
else if(a>=11) {//进行正确内容所需要的判断
}

       2:当字符串的长度超过11位时,采用循环的方式实现每个字符的判断,首先需要找到0,所在的位置

复制代码
for(i=0;i<a;i++) {
    if(s.charAt(i)=='0'&&a-i<11) {
        System.out.println("null data");
        break;
       }
    if(s.charAt(i)=='0'&&a-i>=11)
        break;
    if(s.charAt(i)!='0'&&i==a-1) {
        System.out.println("null data");
        break;
    }
}    
复制代码

    3:在0的后面分部查找:第一步:计算1的个数(以便最后进行奇偶校验);第二步:判断最后的一个是否为1(判断是否为有效数据);第三步:判断奇偶校验;第四步:对于前面最后一位和奇偶校                        验可以进行计数,这样在最后的一步进行判断内容是不是为有效数据的时候,存在巨大作用;

踩坑心得:判断结束符的时候,没有计数,导致最后判断不正确

if(s.charAt(j+1)!='1')//结束符号不是1//这里是错误代码,没有计数导致的错误
    System.out.println("validate error");
if((odd%2==0&&s.charAt(j)=='0'&&s.charAt(j+1)=='1')||odd%2!=0&&s.charAt(j)=='1'&&s.charAt(j+1)=='1'))
    System.out.println("parity check error"); 
复制代码
if(s.charAt(j+1)!='1')//结束符号不是1{//这里是正确代码
    pos++;
    System.out.println(pos+":validate error");
}
if((odd%2==0&&s.charAt(j)=='0'&&s.charAt(j+1)=='1')||(odd%2 !=0&&s.charAt(j)=='1'&&s.charAt(j+1)=='1'){
    pos++;
    System.out.println(pos+":parity check error");
}
复制代码

但是这并没有正确,这里出现了一个难以察觉的问题,对于,所用的开头没有重新赋值为0,导致长时间无法正确所以在结尾需要将odd变量重新赋值为0;以下是源代码,写的不好仅供浏览一下,刚开始还不会使用Debug,所以在里面用使用了以下输出一个 i 的值,这样就达到了当前值查看(新手使用),但是,推荐去上网查阅以下Debug的使用方法,Debug特别好用,可以一步一步的走,很快的判断出你的错误点

import java.util.Scanner;



public class Main {
public static void main(String[] args) {

        Scanner in = new Scanner(System.in);
        int a,i,pos=0,j,odd=0;
        String s = new String();
        s=in.nextLine();
        a=s.length();
        if(a<11)
            System.out.println("null data");
        if(a>=11) {
            for(i=0;i<a;i++) {
                if(s.charAt(i)=='0'&&a-i<11) {
                    System.out.println("null data");
                    break;
                }
                if(s.charAt(i)=='0'&&a-i>=11)
                    break;
                if(s.charAt(i)!='0'&&i==a-1) {
                    System.out.println("null data");
                    break;
                }
            }
            for(i=0;i<a;i++) {
                if(s.charAt(i)=='0'&&a-i>=11) 
                {
        //            System.out.print(i);
                        for(j=i+1;j<i+9;j++) {//寻找1的个数
                            if(s.charAt(j)=='1')
                                odd++;
                        }
            //            System.out.print(j);
                        
                        if((odd%2==0&&s.charAt(j)=='1'&&s.charAt(j+1)=='1')||(odd%2!=0&&s.charAt(j)=='0'&&s.charAt(j+1)=='1')) {//正确的情况
                            pos++;
                            System.out.print(pos+":");
                            for(i=i+1;i<j;i++)
                            System.out.print(s.charAt(i));
                            System.out.printf("\n");
                        }
                //        System.out.print(i);
                        i=j+1;
                        if(s.charAt(j+1)!='1')//结束符号不是1
                        {
                            pos++;
                            System.out.println(pos+":validate error");
                        }
                            
                        if((odd%2==0&&s.charAt(j)=='0'&&s.charAt(j+1)=='1')||(odd%2!=0&&s.charAt(j)=='1'&&s.charAt(j+1)=='1'))
                        {
                            pos++;
                            System.out.println(pos+":parity check error");
                        }
                    odd=0;
                }
            }        
        }
    }
}
View Code

<6>String的格式判断与内容提取

题目要求:学校学生学号格式定义如下:
2位年级号+2位学院号+2位班级号+2位序号,如19041103,
编写程序处理用全院学生学号连接起来的长字符串,学院编号为20,包括17、18、19、20四个年级,请从字符串中提取特定两个班级202017班、202061班同学的学号后四位输出,输出编号之间用空格分隔,不换行。
注意:需要排除非法输入。

输入格式院学生学号组成的长字符串(学号之间无分隔)
学号格式定义如下:
2位年级号+2位学院号+2位班级号+2位序号,如19041103

输出格式:

特定两个班级202017班、202061班同学的学号后四位
如:1701 6103 1704

设计思路:第一步:对于字符长度的判定,字符长度的界限是8;第二步:寻找需要的学号;以下是源代码:

import java.util.Scanner;



public class Main {
public static void main(String[] args) {

        Scanner in = new Scanner(System.in);
        int a,i,pos=0;
        String s = new String();
        s=in.nextLine();
        a=s.length();
        if(a%8!=0)
            System.out.println("Wrong Format");
        if(a%8==0) {
            for(i=0;i<a;i=i+8) {
                if(s.charAt(i)==' ')
                    System.out.println("Wrong Format");
                if(s.charAt(i)=='2'&&s.charAt(i+1)=='0'&&s.charAt(i+2)=='2'&s.charAt(i+3)=='0'&&s.charAt(i+4)=='6'&&s.charAt(i+5)=='1') {
                    pos++;
                    if(pos==1)
                        System.out.print("61"+s.charAt(i+6)+s.charAt(i+7));
                    else {
                        System.out.print(" ");
                        System.out.print("61"+s.charAt(i+6)+s.charAt(i+7));
                    }    
                }    
                if(s.charAt(i)=='2'&&s.charAt(i+1)=='0'&&s.charAt(i+2)=='2'&s.charAt(i+3)=='0'&&s.charAt(i+4)=='1'&&s.charAt(i+5)=='7') {
                    pos++;
                    if(pos==1)
                        System.out.print("17"+s.charAt(i+6)+s.charAt(i+7));
                    else {
                        System.out.print(" ");
                        System.out.print("17"+s.charAt(i+6)+s.charAt(i+7));
                    }    
            }            
        }    
    }
}
}
View Code

 

踩坑心得:刚开始没有对格式进行控制,结尾存在空格,需要删除,改进措施:如果是第一个就先输出数字,后面每一个都输出“ +数字”这样是一个控制输出格式的方法

if(pos==1)                            
    System.out.print("61"+s.charAt(i+6)+s.charAt(i+7));
else {
    System.out.print(" ");
    System.out.print("61"+s.charAt(i+6)+s.charAt(i+7)); 
}

开始的时候,认为循环时一组学号一组学号进行的,导致,自己误以为是i= i+8;导致存在一个错误:合法输入,且其中两个连续学号错位组合成一个合乎条件的学号。

,经过更改后,将原来的i = i+8;更改成i= i+1;就可以按照顺寻,一个一个的判断,实现错位连续学号的排除

<7>题目-7-1 用类解一元二次方程式 

题目要求:定义一个代表一元二次方程ax2+bx+c=0的类QuadraticEquation,其属性为三个系数a、b、c(均为私有属性),类中定义的方法参考main方法中的代码。main方法源码:

注意:须提交完整源码,包括Main类。

输入格式:在一行中输入a、b、c的值,可以用一个或多个空格或回车符分开。

输出格式:当输入非法时,输出“Wrong Format”

     当有一个实根时,输出(2行):

     a=值,b=值,c=值:

     The root is 值(保留两位小数)

     当有两个实根时,输出(2行):

     a=值,b=值,c=值:

     The roots are 值1 and 值2(均保留两位小数)

设计思路:使用get和set函数以及构造方法即可;再使用正常的求根公式即可;

踩坑心得:对于公式差不多,只有一些个别的数据没有改变的,复制粘贴的时候,很容造成符号的错误,导致隐藏的错误难以被发现,推荐,在使用相同的格式的时候注意对个别内容的修改。注意这里的root1和root2的式公相同,会导致错误,所以,需要将内容以下就可以得到正确结果

复制代码
public double getRoot1() {
        root1 = (-b+Math.pow(deita, 0.5))/2*a;
        return root1;
} public double getRoot2() { root2 = (-b+Math.pow(deita, 0.5))/2*a;//注意这里的root2和root1的内容相同,导致了错误 return root2; }
复制代码

以下是正确源代码:

import java.util.Scanner;



public class Main {
public static void main(String[] args) {

        Scanner in = new Scanner(System.in);
        int a,i,pos=0,j,odd=0;
        String s = new String();
        s=in.nextLine();
        a=s.length();
        if(a<11)
            System.out.println("null data");
        if(a>=11) {
            for(i=0;i<a;i++) {
                if(s.charAt(i)=='0'&&a-i<11) {
                    System.out.println("null data");
                    break;
                }
                if(s.charAt(i)=='0'&&a-i>=11)
                    break;
                if(s.charAt(i)!='0'&&i==a-1) {
                    System.out.println("null data");
                    break;
                }
            }
            for(i=0;i<a;i++) {
                if(s.charAt(i)=='0'&&a-i>=11) 
                {
        //            System.out.print(i);
                        for(j=i+1;j<i+9;j++) {//寻找1的个数
                            if(s.charAt(j)=='1')
                                odd++;
                        }
            //            System.out.print(j);
                        
                        if((odd%2==0&&s.charAt(j)=='1'&&s.charAt(j+1)=='1')||(odd%2!=0&&s.charAt(j)=='0'&&s.charAt(j+1)=='1')) {//正确的情况
                            pos++;
                            System.out.print(pos+":");
                            for(i=i+1;i<j;i++)
                            System.out.print(s.charAt(i));
                            System.out.printf("\n");
                        }
                //        System.out.print(i);
                        i=j+1;
                        if(s.charAt(j+1)!='1')//结束符号不是1
                        {
                            pos++;
                            System.out.println(pos+":validate error");
                        }
                            
                        if((odd%2==0&&s.charAt(j)=='0'&&s.charAt(j+1)=='1')||(odd%2!=0&&s.charAt(j)=='1'&&s.charAt(j+1)=='1'))
                        {
                            pos++;
                            System.out.println(pos+":parity check error");
                        }
                    odd=0;
                }
            }        
        }
    }
}
View Code

 

<8> 日期类设计 

题目要求:参考题目集二中和日期相关的程序,设计一个类DateUtil,该类有三个私有属性year、month、day(均为整型数),其中,year∈[1820,2020] ,month∈[1,12] ,day∈[1,31] , 除了创建该类的构造方法、属性的getter及setter方法外,需要编写如下方法:

public boolean checkInputValidity();//检测输入的年、月、日是否合法
public boolean isLeapYear(int year);//判断year是否为闰年
public DateUtil getNextNDays(int n);//取得year-month-day的下n天日期
public DateUtil getPreviousNDays(int n);//取得year-month-day的前n天日期
public boolean compareDates(DateUtil date);//比较当前日期与date的大小(先后)
public boolean equalTwoDates(DateUtil date);//判断两个日期是否相等
public int getDaysofDates(DateUtil date);//求当前日期与date之间相差的天数
public String showDate();//以“year-month-day”格式返回日期值

应用程序共测试三个功能:

求下n天

求前n天

求两个日期相差的天数 

设计思路:第一步:先判断年月日是否符合要求的范围,年里面有月,月里面有日,循环判断,对于闰年和平年,我们可以单独创建一个方法,以便在判断2月的天数的时候,通过判断是闰年还是平年的方法返回一个boolean类型的值,进行结合判断即可;第二步:上n天与下n天的计算方法类似(注意对于大数据的考虑,不能仅看一位数或者两位数的天数,要考虑很大的天数),所以我们通过以年为一组循环的方式,最后剩余的小于366天的时候,进行判断。第三步:设置换月时要设置的最大天数和最小天数,例如:5月1日的上一天时4月30日,6月1日的上一天时5月31日,对于不同的天数,需要进行设定特殊值需要优先考虑,例如闰年的2月和平年的2月是不一样的,还有存在跨年的现象,都需要考虑。第四步:设计相差的天数:可以采用引入第三点的方式来计算差值,这样设计会方便很多

踩坑心得:运行容易超时;当设计为按照每一天来进行判断当前运行时的天数时,如果数据很大,就会导致运行超时,需要修改算法;这个属于优化算法,非常有必要。对于是否剩余365天,还是366天,不用管,直接设置最大就可以实现,不用考虑太大

int i,count=0,max=0,newNum,max1=0;
        newNum=0;
        if(month==4||month==6||month==9||month==11)
            max=30;
        if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
            max=31;
        if(month==2&&isLeapYear(year)==false)
            max=28;
        if(month==2&&isLeapYear(year)==true)
            max=29;
        if(month==1||month==4||month==6||month==8||month==9||month==11||month==2)
            max1=31;
        if(month==5||month==7||month==10||month==12)
            max1=30;
        if(month==3&&isLeapYear(year)==false)
            max1=28;
        if(month==3&&isLeapYear(year)==true)
            max1=29;
            count=1;newNum=n;
            for(i=0;i<newNum;i++)
            {
                day=day+count;
                if(day>max)
                {    
                    if(month==4||month==6||month==9||month==11)
                        max=30;
                    if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
                        max=31;
                    if(month==2&&isLeapYear(year)==false)
                        max=28;
                    if(month==2&&isLeapYear(year)==true)
                        max=29;
                    if(month==1||month==4||month==6||month==8||month==9||month==11||month==2)
                        max1=31;
                    if(month==5||month==7||month==10||month==12)
                        max1=30;
                    if(month==3&&isLeapYear(year)==false)
                        max1=28;
                    if(month==3&&isLeapYear(year)==true)
                        max1=29;
                    day=1;month=month+1;
                    if(month==13)
                    {
                        month=1;year=year+1;
                    }        
                }
        }
日循环

这里运行一次需要4000ms,仅打开,就需要很长时间,所以算法就很复杂,进一步改进:可以提供两种思路1、直接通过月循环就比骄快,也可以通过年循环,但是年循环需要分别讨论再3月前,还是在3月后,这样的考虑情况会多一点,但是运行的速度就会快很多

for(;n>=366;) {
            if((isLeapYear(year)==true)&&(month!=2&&day!=29)&&(month<3)) {
                n = n-366;
                year = year+1;
            }
            else if((isLeapYear(year)==true)&&(month>=3)){
                n = n-365;
                year = year+1;
            }
            else if((isLeapYear(year)==true)&&(month==2&&day==29)) {
                n = n-366;
                year = year+1;
                month = 3;day = 1;
            }
            else if((isLeapYear(year)==false&&isLeapYear(year+1)==true)&&(month!=2&&day!=28)&&(month<3)) {
                n = n-365;
                year = year+1;
            }
            else if((isLeapYear(year)==false&&isLeapYear(year+1)==true)&&month>=3) {
                n = n-366;
                year = year+1;
            }
            else if(isLeapYear(year)==false&&isLeapYear(year+1)==false) {
                n = n-365;
                year = year +1;
            }
        }
        if(n<=366) {
            int i,count=0,max=0,newNum,max1=0;
            newNum=0;
                count=1;newNum=n;
                for(i=0;i<newNum;i++)
                {
                    if(month==4||month==6||month==9||month==11)
                        max=30;
                    if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
                        max=31;
                    if(month==2&&isLeapYear(year)==false)
                        max=28;
                    if(month==2&&isLeapYear(year)==true)
                        max=29;
                    day=day+count;
                    if(day>max)
                    {    
                        day=1;month=month+1;
                        if(month==13)
                        {
                            month=1;year=year+1;
                        }        
                    }
                }
        }
年循环

如果实现了下n天的循环,那么上n天的也可以采用同样的方法来实现,类推一下就可以。

在这里我们可以设计一个DateUtil的类,通过在这个类中,设计出多种方法,每种方法都存在不同的get 和set 的方法,就可以返回所需要的值。

<8>日期问题面向对象设计(聚合一)

参考题目7-2的要求,设计如下几个类:DateUtil、Year、Month、Day,其中年、月、日的取值范围依然为:year∈[1900,2050] ,month∈[1,12] ,day∈[1,31]、

设计思路:可以从末尾开始设计,先设计年的类,再从年开始到月再到日,返回到DateUtil 返回到main.每一个类中都设有value++ 和value -- ;这样产生的数据就不会鱼龙混杂,结果更加清晰

上一题中的DateUtil是包含了所有的方法,这次设计中,需要将判断年月日的方法,放在Year类中.判断日期是否合理的的方法也进行了更改,分别放在了不同的里面,每一个都单独进行判断,各司其职,思路清晰,这是一种面向对象的写法。

踩坑心得:对于刚接触Java来说,创建这个类的时候,很多东西还是不明确,在这里,创建了一个day的类,相当于存在了day中所有的东西,这样实现环环相扣,大胆去下手,不要出现重复的使用代码,直接构造函数实现,这样既不会导致公式错误,也容易检查出你犯的错误

改进建议:对于这个程序来说,其中的耦合度还是很高,他存在了每一环与另外一环相扣的设计,这是不好的,我们需要存在一个控制类将每一个类都控制住,这样就可以实现单一职责的原则,实现更加低的耦合度

总结:对于以上三次题集,让我收获很多,从一开始的对于JAVA的很多语法不熟悉,到现在已经掌握了不少,尤其是字符串的应用,学会了很多,基本的定义数组不同,输入输出不同,尤其是同时又printf和println让我头晕,对于字符串JAVA有很多特别大函数,比如String.charAt(i)可以实现字符串中单独字符的提取,Character.isDigit()可以判断输入字符串中单独的一个内容是不是数字,再比如还有Double.valueof函数可以实现将字符串中数字转换成double1类型的数字,substring函数可以将字符串中的一部分提取出来,他比charAt(i)强在可以提取多个内容。对于面向对象设计的内容,学习到了一些单一职责的原则,方法的设计与c语言中的函数很像,需要自己揣摩一下,以上便是我从中学到的内容。需要改进的方面,在这段时间的学习中,还有很多语法知识的空白,还需要从实践中找到,夺取磨练,对于面向对象的设计,现在自己做的还是非常不好,写的代码,还是和以前的c语言的写法相似,导致代码内容不清晰,很拖拉,没有实现单一职责的原则,需要很多的改进,还有一个很大问题就是代码书写的格式规范程度还是很差,总是乱七八糟的,驼峰命名法,现在有些注意,还有很多的规范书写没有写好,以后需要慢慢加油。对于这几次题集,虽然最后一次的习题很难,很难受,但是效果还是很好的,慢慢坚持下去,哪怕一开始做的不好,但是经过磨练,会好起来的,加油!

标签:总结,题目,charAt,month,&&,year,String
来源: https://www.cnblogs.com/en-em-em/p/16128855.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有