webForumDet fria alternativet

Personnummer klass..

5 svar · 2 600 visningar · startad av Broms

BromsMedlem sedan sep. 2002188 inlägg
#1

tjänare!

tänkte kika in ett program som hanterar personnummer..
Det läser in ett personnummer på formen ÅÅMMDD-XXXX, och skapar ett klassobjekt för detta.
I klassen skall det finnas en metod för att kontrollera om personnumret är giltigt, dvs rätt form på årtal, månad, dag, samt att personnumret är giltigt, alltså med multiplicering av siffrorna med omvartannat 2 och 1, samt talsumman skall vara jämnt delbar med 10.. metod för att returnera könet med hjälp av kontrollsiffran (näst sista X'et) skall även finnas.. Någon som sett liknande program eller har en liten bra idé på hur jag plockar ut siffrorna ich behandlar dem enligt 2*siffra, 1*siffra[1] omvartannat, samt viktigast av allt, när jag multiplicerat fram värdena, beräknar talsumman.. dvs om jag får tal som 16,12,10,8,3,2... blir det 1+6+1+2+1+0+8+3+2..

Dvs kortfattat:

· Kontrollera om ett personnummer är korrekt eller ej.
· Ta reda på om personen är man eller kvinna. (Den näst sista siffran i personnumret är udda för män och jämn för kvinnor).
· Returnera personens födelsedag som ett datum på formen ååmmdd.
· Givet ett datum, returnera personens ålder.

Felaktiga personnummer karakteriseras av:
· Ett icke existerande datum.
· Ej 10 siffror.
· Felaktigt kontrolltal.

Koden jag har totat ihop så här långt är följande:

Personnummer.java

import extra.*;

public class Personnummer{
	
	// Instansvariabler
	//private int ar,manad,dag;
	private String pnr;
	private long temp2;
		
	// Konstruktor
	public Personnummer(String jaha){
		pnr = jaha;
	}
	
	// Metoder
/*
	public boolean korrektPersonnummer(){
		//long hejsan = temp2;
		//kontroll som ger true om personnumret stämmer
		//hur nu all kontroll ska komma att se ut *funderar*
	}
*/	
	public long returneraPersonnummer(){
		return temp2;
	}
	
	public long konverteraPersonnummer(String checkpnr){	
	
		String temp = "";
		String find = "-";
		String replace = "";
	
		temp = checkpnr.replaceAll(find, replace);
		temp2 = Long.parseLong(temp);

		return temp2;
	}
}

Personnummertest.java

import extra.*;

public class Personnummertest{

	public static void main (String[] arg) {

	String foo;
	long a;

	Std.out.print("Ange ett personnummer på formen ÅÅMMDD-XXXX: ");
	foo = Std.in.readWord();

	Personnummer p1 = new Personnummer(foo);
	
	Std.out.print("Personnumret på formen ÅÅMMDDXXXX: ");
	
	a = p1.konverteraPersonnummer(foo);
	Std.out.println(a);

	} // main
	
} // class

Feel free att ändra och pilla i denna kod så mkt som helst, glad för alla tips och idéer. och gärna något kodexempel, eller givande adresser till liknande program i java..

tack på förhand.
/joph

Peter SMedlem sedan dec. 20025 483 inlägg
#2

Jojoxx har skrivit någonting liknande i JavaScript: http://www.webforum.nu/showthread.php?s=&threadid=42712&forumid=149

:)

BromsMedlem sedan sep. 2002188 inlägg
#3

har totat vidare på problemet, pillade lite i en annan kod jag hittade, har kommit fram till detta nu:

Datum.java

// < --**¤¤## START ##¤¤**-- > \\

import extra.*;

public class Datum {
	
	public int ar, manad, dag;
	private int m00, check1=0;
	private String datum;
	public String manad_text=null,bt=null, del1, del2, del3;
	
	// Skapa ett datum
	public Datum(String datum_new){
		datum = datum_new;
	}
	
	// Skapa år, månad, dag'intar från String datumet..
	public void styckaDatum(){
		del1=datum.substring(0,1);
		del2=datum.substring(2,3);
		del3=datum.substring(4,5);
		ar = Integer.parseInt(del1);
		manad = Integer.parseInt(del2);
		dag = Integer.parseInt(del3);
	}

		// Kontrollera giltigheten på datumet
		public boolean korrektDatum(){
			
		int a_ar = ar;
		int a_manad = manad;
		int a_dag = dag;
		
		styckaDatum();
		
		if (a_ar > 0 && (a_manad == 1 || manad == 3 || manad == 5 || manad == 7 || manad == 8 || manad == 10 || manad == 12) && a_dag > 0 && a_dag <= 31){
			m00=1;
			return true;							
		}
		else if (a_ar > 0 && (manad == 4 || manad == 6 || manad == 9 || manad == 11) && a_dag > 0 && a_dag <= 30){
			m00=1;
			return true;
		}
		else if (a_ar > 0 && a_manad == 2 && a_dag > 0 && a_dag <= 28){
			m00=1;
			return true;
		}
		else{
			m00=0;
			return false;
		}
	}
	
	// Månaderna 1,2... som Januari, Februari..
	public void datumText(){
  	 		  		
  		if (manad == 1){
  			manad_text = "Januari";
  		}
  		else if (manad == 2){
  			manad_text = "Februari";
  		} 
    		else if (manad == 3){
  			manad_text = "Mars";
  		} 
   		else if (manad == 4){
  			manad_text = "April";
  		} 
   		else if (manad == 5){
  			manad_text = "Maj";
  		} 
    		else if (manad == 6){
  			manad_text = "Juni";
  		}   		
  		else if (manad == 7){
  			manad_text = "Juli";
  		}   		
  		else if (manad == 8){
  			manad_text = "Augusti";
  		}   		
  		else if (manad == 9){
  			manad_text = "September";
  		}   		
  		else if (manad == 10){
  			manad_text = "Oktober";
  		}   		
  		else if (manad == 11){
  			manad_text = "November";
  		}   		
  		else if (manad == 12){
  			manad_text = "December";
  		}
  		
  		// dagarnas ändelser(a,e): 1a,2a,3e..
  		if (dag == 1 || dag == 2 || dag == 21 || dag == 22 || dag == 31) bt = "a";
  		else bt = "e";
	}
} // class

// < --**¤¤## END ##¤¤**-- > \\

Personnummer.java

// < --**¤¤## START ##¤¤**-- > \\

import extra.*;

public class Personnummer extends Datum{
	private String nr=null;
	public int ok;

	private int toInt(String str, int i) {
  		if (Character.isDigit(str.charAt(i)))
    		return Integer.parseInt(str.substring(i, i+1));
  		else
    		throw new IllegalArgumentException();
	}
  
	public Personnummer(String s) {
    	// Kontrollera att numret är korrekt
    	int k = s.indexOf('-');
    	if (k != 6 || s.length() != 11) 
    		throw new IllegalArgumentException();
    	String t = s.substring(0,6) + s.substring(7);   // ta bort tecknet '-'
    	// beräkna kontrollsumman
    	int sum = 0; 
    	for (int i=0; i<9; i++) {
    		int tal = toInt(t, i);
    		int j = tal * (2-i%2);   // multiplicera med 2 eller 1    
    		sum += j/10 + j%10;      // addera siffrorna i resultatet till summan
    	}
    	sum %= 10;
    	if ((toInt(t,9) + sum) % 10 != 0)
    		throw new IllegalArgumentException();
    	// Korrekt!
    	nr = s;
    	ok=1;
 	} 
 	
 	public String gePnr(){
 		return nr;
 	}

  	public String toString() {
		return nr + "\n";
  	}

	//
	public boolean ok(){
  		if (nr != null) return true;
  		else return false;
  	}
	
	// test för kön kvinna
  	public boolean ärKvinna() {
    	return toInt(nr, 9) % 2 == 0;
 	}

	// test för kön man, dvs != resultatet av ärKvinna()
  	public boolean ärMan() {
    	return !ärKvinna();
  	}
  	
  	public String födelseDag() {
  		String s2 = "Personen har födelsedag den " + super.del1 + super.bt + " " + super.manad_text;
  		return s2;
  	}
}

// < --**¤¤## END ##¤¤**-- > \\

Testprogrammet - Main.java

// < --**¤¤## START ##¤¤**-- > \\

import extra.*;

public class Main {

// < --**¤¤## MAIN ##¤¤**-- > \\
	public static void main (String[] arg) {

		String foo, sex;
		int datum;

		Std.out.print("Ange ett personnummer på formen ÅÅMMDD-XXXX: ");
		foo = Std.in.readWord();

		Personnummer p1 = new Personnummer(foo);
	
		Std.out.print("Personnumret på formen ÅÅMMDDXXXX: ");
		Std.out.print(p1.toString());

		if(p1.ok()) {
	
			sex = "Personen är en ";

			if (p1.ärKvinna() == true) {
				sex += "-Kvinna-";
			}
			else if (p1.ärMan() == true) {
				sex += "-Man-";
			}
			Std.out.println(sex);

			Std.out.print("Ange ett datum på formen ÅÅMMDD: ");	
			String hejsan = Std.in.readWord();
				
			Datum d1 = new Datum(hejsan);
		
			if (d1.korrektDatum() == true) {
				// anropa metod för att ta fram åldern..
				// genom (personnumrets ÅÅMMDD)-(datumets ÅÅMMDD)
				Std.out.println("Korrekt datum inmatat, åldern blir <bla>");
			}
			// Utskrift av födelsedagsmetoden i Personnummer.java
			Std.out.println(p1.födelseDag());
		}
	} // main
} // class

// < --**¤¤## END ##¤¤**-- > \\

-----------------------------

Det som strular sig är Personnummer.java, den genererar felet "cannot resolve symbol constructor Datum() på rad 16", rad 16 är:

public Personnummer(String s) {

Eftersom Main.java skapar ett Personnummer-objekt så går den filen ej heller att kompilera pga ovan nämnda fel..

-----------------------------

1. Någon idé på vad felet beror på?

2. Borde jag stycka ner programmer till fler klassfiler istället & hur skulle en sådan lösning i sådana fall kunna se ut?

3 . Gör jag rätt angående anropen av superklasserna, när jag använder extends Datum, i Personnummer.java

4 . Funktionen för att "Givet ett datum, returnera personens ålder." förstår jag mig inte på hur det skall gå till, någon som kan hjälpa till med tankegången och tipsa om vilka steg man lättast löser det på?

BromsMedlem sedan sep. 2002188 inlägg
#4

Ingen som har en idé? får det inte att fungera :(

sgtpepperMedlem sedan apr. 20007 588 inlägg
#5

Jag har bara kikat igenom din kod lite snabbt men här är några kommentarer:

* Pakethantering, du har inte specificerat några paket för dina klasser. Som det är nu så kommer de att hamna i det så kallade default-paketet. Det är bättre att lägga klasserna i ett paket:

package com.foo.personnummer;

eller liknande.

* Arv. Personnummer ärver Datum, men varför? Visst, ett personnummer kan sägas vara en form av datum, men i så fall så måste du i Personnummer explicit anropa superkonstruktorn med en datumsträng som argument eftersom Datum inte har någon tom konstruktor, det är därför du får ett fel. Alltså du måste lägga till detta i din Personnummer-konstruktor:

public Personnummer(String s) {
  super(s)
  ......
}

* Namngivningskonventioner, svenska metodnamn har en tendens att se väldigt konstiga ut. Men det är ju valfritt. Hade du dock levererat kod med svenska metodnamn i ett projekt som jag basat över hade du fått skriva om alla metodnamn :).

BromsMedlem sedan sep. 2002188 inlägg
#6

hehe sgtpepper, jag skrev från början jättetydlig kod, med instansvariabler som t.ex String stringNamn, int intPnr ovs, för att inte göra fel någonstans, samt alltid a,a & o istället för å,ä,ö.. men har slutat med det då programmen jag hittills har gjort säkerligen aldrig kommer köras igen efter att de är klara :D

men tack så mycket för svaren, programmet rullar på fint nu :D

137 ms totalt · 3 externa anrop · v20260731065814-full.3ab8d573
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
134 ms — hämta tråd, inlägg och bilagor (db)