面向对象程序设计实验(Java)-实验4.问题 B: 提取身份证信息

题目描述

身份证号码中各数位的意义为:
 

1-2位:省、自治区、直辖市代码;
 

3-4位:地级市、盟、自治州代码;
 

5-6位:县、县级市、区代码;
 

7-14位:出生年月日,比如19670401代表1967年4月1日;
 

15-17位:为顺序号,其中17位男为单数,女为双数;
 

18位:为校验码,0-9和X。作为尾号的校验码,是由号码编制单位按统一的公式计算出来的,如果某人的尾号是0-9,都不会出现X,但如果尾号是10,那么就得用X来代替,因为如果用10做尾号,那么此人的身份证就变成了19位。X是罗马数字的10,用X来代替10 。有的地方也出现使用小写从x。
 

身份证校验码的计算方法
 

1、将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。
 

2、将这17位数字和系数相乘的结果相加。
 

3、用加出来和除以11,看余数是多少?
 

4、余数只可能有0-1-2-3-4-5-6-7-8-9-10这11个数字。其分别对应的最后一位身份证的号码为1-0-X-9-8-7-6-5-4-3-2。其中,小写x也认为正确。
 

5、通过上面得知如果余数是3,就会在身份证的第18位数字上出现的是9。如果对应的数字是2,身份证的最后一位号码就是罗马数字X。
 

请你编写程序,验证所输入身份证号的合法性,如果合法,则输出其年龄(周岁,根据出生日期判断年龄)。
 

输入

当前日期,n及个模拟身份证号,n组

输出

合法性(true,false),年龄(整数)

样例输入 Copy
2022 6 14
3
330903198509060219
340101200010113224
330329200504255448
样例输出 Copy
true:36
false:-1
true:17
提示

以下程序框架和相关方法的调用情况,供参考。可依据程序框架添加、完善相关方法代码。
import java.util.Scanner;
public class IDCard {
       public static void main(String[] args) {
              Scanner reader=new Scanner(System.in);
              int y,m,d,n,i;
              y=;
              m=;
              d=;
              n=;
              IdentityCard card;
              for(i=0;i<n;i++) {
                     card=new IdentityCard();
                     card.setID(reader.next());
                     if(card.check()==true)
                            System.out.println("true:"+card.getAge(y,m,d));
                     else
                            System.out.println("false:-1");
              }
       }
}
class IdentityCard{
       //定义成员变量,getter,setter方法
      
       public boolean check() {        
              if(!ID.matches("[1-9][0-9]{5}(19|20)[0-9]{9}[0-9Xx]")) {//一个简易的正则表达式,判断身份证号前17位是否为数字,第一位不能是0,第7/8位是19或20,最后一位是数字或X、x,本语句可以直接使用。
                     return false;
              }
              year=Integer.parseInt(ID.substring(6, 10)); //获取身份证号码中的出生年份
              month=Integer.parseInt(ID.substring(10, 12)); //获取身份证号码中的出生月份
              day=Integer.parseInt(ID.substring(12, 14)); //获取身份证号码中的出生日
              if(!dateLegal()) {//判断出生日期是否合法,主要是月、日的合法性
                     return false;
              }
              char ch[]=ID.toCharArray();//将字符串转换成字符数组
//根据定义,计算加权总和sum
              yu=sum%11;
              //根据余数对应关系,判断身份证号最后一位是否正确
       }
       boolean dateLegal(){ //判断出生日期是否合法
 
       }
       public int getAge(int y,int m,int d) {
       //根据当前日期和生日,计算年龄
       }
}

正确代码
package project4;

import java.util.Scanner;
public class IDCard {
       public static void main(String[] args) {
              Scanner reader=new Scanner(System.in);
              int y,m,d,n,i;
              y=reader.nextInt();//年
              m=reader.nextInt();//月
              d=reader.nextInt();//日
              n=reader.nextInt();//n组
              IdentityCard card;
              
              for(i=0;i<n;i++) {
                     card=new IdentityCard();
                     card.setID(reader.next());
                     if(card.check()==true)
                            System.out.println("true:"+card.getAge(y,m,d));
                     else
                            System.out.println("false:-1");
              }
       }
}



class IdentityCard{
       //定义成员变量,getter,setter方法
       private String ID;
       int year,month,day;     
      
       int sum=0;
       int yu;
     
	    
	             
       public boolean check() {  
    	 
          year=Integer.parseInt(ID.substring(6, 10)); //获取身份证号码中的出生年份
	      month=Integer.parseInt(ID.substring(10, 12)); //获取身份证号码中的出生月份
	      day=Integer.parseInt(ID.substring(12, 14)); //获取身份证号码中的出生日
                   
    	   if(!getID().matches("[1-9][0-9]{5}(19|20)[0-9]{9}[0-9Xx]")) {//一个简易的正则表达式,判断身份证号前17位是否为数字,第一位不能是0,第7/8位是19或20,最后一位是数字或X、x,本语句可以直接使用。
                     return false;
              }
    	         
    	  if(!dateLegal()) {//判断出生日期是否合法,主要是月、日的合法性
                 return false;
          }
    	  
    	  char ch[]=getID().toCharArray();//将字符串转换成字符数组//这是用来干什么的
 		  sum=(ch[0]-'0')*7+(ch[1]-'0')*9+(ch[2]-'0')*10
 				  +(ch[3]-'0')*5+(ch[4]-'0')*8
 				  +(ch[5]-'0')*4+(ch[6]-'0')*2
 				  +(ch[7]-'0')*1+(ch[8]-'0')*6
 		          +(ch[9]-'0')*3+(ch[10]-'0')*7
 				  +(ch[11]-'0')*9+(ch[12]-'0')*10
 				  +(ch[13]-'0')*5+(ch[14]-'0')*8
 				  +(ch[15]-'0')*4+(ch[16]-'0')*2;
 		  
 		  char yan=getID().charAt(17);
 		  yu=sum%11;//根据余数对应关系,判断身份证号最后一位是否正确
 		  
 		  if(yu==0&&yan=='1' ||yu==1&&yan=='0'||yu==2&&(yan=='x'||yan=='X')||yu==3&&yan=='9'||
 			 yu==4&&yan=='8' ||yu==5&&yan=='7'||yu==6&&yan=='6'||yu==7&&yan=='5'||
 			 yu==8&&yan=='4' ||yu==9&&yan=='3'||yu==10&&yan=='2' ) return true;
 		  else return false;		   
    	   
    	          
       }
       
       
       public String getID() {
			return ID;
		}	
		public void setID(String iD) {
			ID = iD;
		} 
       
   
	   boolean dateLegal(){ //判断出生日期是否合法//是判断输入的(ID中的)year,month,day是否正确
		if((month==1||month==3||month==5||month==7||month==8||month==10||month==12)
				&&(day>=1&&day<=31)) return true;
		else if((month==4||month==6||month==9||month==11)&&(day>=1&&day<=30)) return true;
		else if((month==2)&&(day>=0&&day<=29)&&!(year%400==0||(year%4==0&&year%100!=0))) return true;
		else if((month==2)&&(day>=0&&day<=28)&&(year%400==0||(year%4==0&&year%100!=0))) return true;	
		else  return false;
       }
             
       public int getAge(int y,int m,int d) {
       //根据当前日期和生日,计算年龄
    	  int age=y-year;
    	  if(m<month)  age--;
    	  if(m==month&&d<day) age--;
    	  return age;  
    	   
       }

	
}
错误和知识点

1.知识点

1)

 .将字符串转化为浮点数/整数
        int x =Integer.parseInt("9");
        double c = Double.parseDouble("5");
        int b = Integer.parseInt("444",16);//16是进制数,“9,5,444”是字符串

              结果

9
5.0
1092

 2).matches() 方法用于检测字符串是否匹配给定的正则表达式。str.matches(regex) ,返回true、false

3)str.toCharArray()将字符串转换成字符数组

4)将字符转化为数字的方法

5)单引号和双引号的区别

   'a'表示字符字面量,在内存中占1个字节,'a'+1表示'a'的ASCII码加1,结果为'b'

  "a"表示字符串字面量,在内存中占2个字节,"a"+1表示指针运算,结果指向"a"结束符'\0'

6)substring():截取字符串中介于两个指定下标之间的字符。
用法:两个参数:

字符串.substring(参数1,参数2);(str.substring(2,9)//获取第3个到第八个字符,从0开始的)
参数1:字符串截取的起始下标,非负的整数
如果此参数是0,则是从字符串的第一个字符开始截取
参数2:截取结束位置的索引下标

注意:截取的结果,不包括结束位置的字符

所以也可以用.substring获取单个字符(str.substring(0,1) //获取第0个字符)

7)charAt() 方法用于返回指定索引处的字符。索引范围为从 0 到 length() - 1。

str.charAt(0) //获取第0个字符

2.错误

1)我又把操作直接写到类里了

2)而且有的问题明明我可以做对,但是因为他很长所以我就不愿意去想,比如月份问题和生日计算,

还是不要凭感觉去写,更重要的的是有思路,我总是思路混乱

3)而且我打字超慢的,好烦

4)还有一个return的问题,不知道为当有两个lf-return就错误,但是再在外面加一个return就好了,或者是加一个if-return和else-return。

谁能够帮帮我啊!!!!!!!!!!!


                
  • 11
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 好的,我来回答关于 Java 面向对象程序设计实验问题。 1. 实验背景 在 Java 编程语言中,面向对象编程是一种非常重要的编程范式。面向对象编程的核心是类和对象,类是一种抽象的数据类型,对象是类的一个实例。面向对象编程通过封装、继承和多态等机制,提高了程序的可重用性、可维护性和可扩展性。本次实验旨在通过编写一个简单的 Java 程序,加深对面向对象编程的理解,掌握 Java 编程语言的基本语法和面向对象编程的基本思想。 2. 实验要求 本次实验要求学生设计一个简单的 Java 程序,实现如下功能: - 设计一个汽车类 Car,包含汽车的品牌、型号、颜色、价格等属性; - 在 Car 类中定义构造方法、访问器和修改器,以及其他必要的方法; - 在主类 Main 中,创建多个汽车对象,并对其进行操作,比如修改汽车的价格、输出汽车的信息等; - 在程序中使用继承和多态机制,实现一些简单的功能,比如计算多个汽车的总价格、输出所有汽车的品牌和型号等。 3. 实验流程 (1) 定义 Car 类 在设计 Car 类时,需要考虑汽车的属性和方法,以及它们的访问权限。比如,汽车的品牌、型号、颜色和价格等属性应该是私有的,只能通过访问器和修改器来进行访问和修改。另外,Car 类还可以定义一些公共的方法,比如输出汽车信息的方法和计算汽车价格的方法等。 下面是 Car 类的一个示例实现: ```java public class Car { private String brand; private String model; private String color; private double price; public Car(String brand, String model, String color, double price) { this.brand = brand; this.model = model; this.color = color; this.price = price; } public String getBrand() { return brand; } public String getModel() { return model; } public String getColor() { return color; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } public void printInfo() { System.out.println("Brand: " + brand); System.out.println("Model: " + model); System.out.println("Color: " + color); System.out.println("Price: " + price); } public double calculatePrice() { return price; } } ``` (2) 定义子类 在 Car 类的基础上,可以定义一些子类,以实现一些特殊的功能。比如,可以定义一个 ElectricCar 类,表示电动汽车,它有一个电池容量属性Java面向对象程序设计实验指导答案是什么? 非常抱歉,我无法提供Java面向对象程序设计实验指导答案,因为我无法确定您正在参考哪个实验和指导手册。请提供更具体的信息和上下文,我将尽力为您提供帮助。 ### 回答2: Java是一种面向对象编程语言,因此在Java面向对象程序设计中,程序员必须掌握面向对象编程思想,即封装、继承和多态性。Java面向对象程序设计实验指导答案可以帮助学生了解Java面向对象编程的基本概念和技能,提高其编程能力和应用水平。 Java面向对象程序设计实验的指导答案通常包括以下内容: 1. Java编程环境的搭建。这些环节包括Java编译器、Java虚拟机和开发工具,例如Eclipse、NetBeans等。在实验指导答案中,需要详细介绍如何安装Java编译器和Java虚拟机,以及如何配置开发工具。 2. Java面向对象的基本概念。这些基本概念包括类、对象、成员变量、成员函数和构造函数等。在Java面向对象编程中,类是一种蓝图,对象是基于这个蓝图创建的实例。成员变量指的是类中定义的变量,成员函数指的是类中定义的函数,构造函数指的是对象创建时自动执行的函数。实验指导答案需要提供充分的代码示例,帮助学生理解这些基本概念。 3. Java面向对象编程的主要特征。Java面向对象编程的主要特征包括封装、继承和多态性。封装是指将对象的属性和函数封装在一起,从而保护对象的实现细节。继承是指通过创建一个类来继承另一个类中的属性和方法。多态性是指通过继承和实现接口来实现不同对象的不同行为。实验指导答案应该提供实际的代码实现示例,帮助学生更好地理解这些特性。 4. Java接口和抽象类。 Java中的接口和抽象类是非常重要的概念。在Java面向对象编程中,接口定义某个类的行为,而抽象类则提供了一种在类中定义抽象方法的方式。实验指导答案应该提供详细的代码示例,并解释实现接口和抽象类的好处。 5. Java异常处理。在Java程序中,异常是指程序执行过程中遇到的错误或异常情况。Java异常处理机制使得程序可以更容易地确定并解决这些异常情况。实验指导答案应该提供详细的代码示例,帮助学生了解在Java程序中处理异常的过程。 总之,Java面向对象程序设计实验指导答案对于理解和掌握Java面向对象编程非常重要。使用优质的指导答案,学生成长成为高水平的Java程序员。 ### 回答3: Java面向对象程序设计是计算机科学和软件工程领域中非常重要的一门课程,涵盖了许多基本的编程概念和技术。在实验中,学生将学习如何使用Java编写面向对象的程序,并掌握重要的程序设计原则和实践。 以下是Java面向对象程序设计实验指导答案的一些重要内容: 1. 类和对象:实验将让学生学习如何定义和使用Java类和对象。学生需要理解类的属性、方法和构造函数的概念,并能够编写基本的类和对象。 2. 封装和继承:实验教授封装和继承原则。学生将掌握如何使用访问修饰符和继承实现代码重用和组合,以及如何保护类的私有属性和方法。 3. 多态和抽象类:实验将向学生介绍多态和抽象类的概念。通过实验,学生将了解多态的运作原理,学习如何定义抽象类和抽象方法,并掌握如何实现多态和抽象类的应用。 4. 设计模式:实验将介绍一些基本的设计模式。学生将学习如何使用工厂方法、单例、观察者等模式来解决实际问题。 5. 异常处理:实验将教授异常处理的概念和实践。学生将学习如何使用try-catch语句来捕获和处理异常,以及如何定义自己的异常类。 6. Java API:实验将向学生介绍Java API。学生将学习如何使用Java API来开发Java应用程序,如何使用Java类库中的数据结构、网络和IO包等。 在实验中,学生将通过编写自己的Java程序来应用这些概念和技术。实验包括多个问题,其中包括以下几个主题: 1. 类和对象:编写一个Java类来保存一个学生的信息。该类包括学生的姓名、年龄、性别和学号等属性。还需要为学生类实现访问器和修改器方法。 2. 封装和继承:编写一个Java类来表示一个动物。该类应该包括动物的属性,例如年龄,类型和体重,并提供访问器和修改器方法。 3. 多态和抽象类:编写一个Java程序来从一个经理、一个工人和一个销售员类中推导出一个Employee类。该类应该包括如何计算每个员工的工资的方法。 4. 设计模式:使用工厂方法模式编写一个Java程序来创建不同类型的汽车。该程序应该定义一个抽象汽车工厂类,以及各种具体工厂类,例如轿车和卡车工厂。 5. 异常处理:在一个Java程序中模拟算术异常。该程序应该包括一个方法来接受两个整数,以及一个方法来计算它们的商。如果第二个数为零,则应抛出一个异常。 6. Java API:编写一个Java程序,从一个URL地址读取HTML页面,并将结果写入文本文件。 总之,在Java面向对象程序设计实验中,学生将掌握Java面向对象编程的基本概念和技术,如类和对象、封装和继承、多态和抽象类、设计模式、异常处理和Java API。通过实验,学生将学会如何应用这些概念和技术来开发Java应用程序。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值