Форум

Data.BG Форуми: Задача за ООП - Data.BG Форуми

Прехвърляне към съдържание

Страница 1 от 1
  • Вие не можете да започнете нова тема
  • Вие не може да отговаряте на тази тема

Задача за ООП

#1
Потребителят е неактивен   zoiqa 

  • Група: Потребители
  • Мнения: 5
  • Регистриран: 26-May 06
  • Репутация: 0
Здравейте. От скоро се занимавам с Java. Трябва да реша следната задача, но ми трябва помощ (Извинявам се за дългото условие и код,но реших да постна цялата задача,а не отделни части,за да е по-прегледно):
Създайте три класа Patient, Address, Database.

Класът Address трябва да съдържа:
- street: String
- number: int
- city: String
- zipcode: int
+ Address(streetNumber: String, zipcodeAndCity: String)
+ setStreet(street: String): void
+ getStreet(): String
+ setNumber(number: int): void
+ getNumber(): int
+ setStreetAndNumber(streetAndNumber: String): void
+ setCity(city: String): void
+ getCity(): String
+ setZipcode(zipcode: int): void
+ getZipcode(): int
+ getFormattedZipcode(): String
+ setZipcodeAndCity(zipcodeAndCity: String): void
+ toString(): String
Където методът setNumber придава на променливата number стойността на параметъра само когато числото е положително . setZipcode задава пощенския код и при този метод важат същите правила както при setNumber. Методът getFormattedZipcode завава пощенскя код,но при необходимост запълва кода с нули. Например 403 - "00403"; 91052 - "91052". Методът setStreetAndNumber задава едновремменно улицата и номера, разделени от едно или повече празни места, по-точно от последното празно място. Пример"AUM-ST am LME 7" трябва да се раздели на "AUM-ST am LME" и 7. Подобна е функцията и на setZipcodeAndCity. Пример "91058 New York" трябва да се раздели на 91058 и "New York". Методът toString трябва да предава съдържанието в следния формат:
Markstreet 3
91058 New York

Класът Patient трябва да съдържа
- counter: int = 0
- id: int = -1
- forename: String
- surename: String
- address: Address
- age: int = -1
+ Patient(name: String, age: int, address: Address)
+ getId(): int
+ setAge(age: int): void
+ getAge(): int
+ setName(name: String): void
+ getForename(): String
+ getSurename(): String
+ getName(): String
+ getAddress(): Address
+ setAddress(address: Address): void
+ toString(): String
Където setName задава пълното име на пациента. Методът setAge да придава на променливата age стойността на параметъра когато той е по-голям от 0 иначе да е равно на -1. Методът getId трябва да връща валидно число. toString да създава текст във вида
[0] Mark Fischer (*** AGE UNKNOWN ***)
*** ADDRESS UNKNOWN ***
[1] John Spaceman (32)
Markstreet 3
91052 New York

Класът Database трябва да съдържа
- patients: Patient[]
- counter: int = 0
+ Database()
+ add(patient: Patient): boolean
+ _ndById(id: int): Patient
+ removeById(id: int): boolean
+ size(): int
+ toString(): String
Управлението на пациентите се извършва от масив с 10 елемента. Методът add добавя нови пациенти. Той първо проверява дали съществува пациент със същото id и съответно връща false. В противен случай добавя пациента. Ако няма свободно поле удвоява размера на полето. Методът findById търси пациент по номер. Ако търсенето е неуспешно се връща null.Методът removeById изтрива пациент. Между данните не може да има дупка или null, тоест елементите от масива трябва да се преместят. Size връща броя на пациентите. To String генерира следната информация
[0] Mark Fischer (*** AGE UNKNOWN ***)
*** ADDRESS UNKNOWN ***
[1] John Spaceman (32)
Markstreet 3
91052 New York
[2] Will-Dylan Tshaka (*** AGE UNKNOWN ***)
Newstreet 10
00130 Los Angeles


Първата задача (Address) я написах цялата и функционира. Но имам проблеми с другите две.

public class Patient {

	private static int counter=0;
	private int id=-1;
	private String forename;
	private String surname;
	private Address address;                                  
	private int age=-1;
	
	
	public void setName(String name){	         // Не съм сигурна тук дали трябва да използвам concat или друг метод
		String fullname="forename".concat("surname");
		
	}
	
	public Patient (String name, int age, Address address){  

	}
	
	public int getId () {                          //Предполагам,че валидно id би означавало неотрицателно число
		return id;
	}
	
		public void setAge(int age){
			if (age < 0) {
				age = -1;
			}			
			this.age=age;
		}
		
		public int getAge(){
			return age;
		}
		

		
		public String getForename(){
			return forename;
		}
		
		public String getSurname(){
			return surname;
		}
		
		public String getName(){
			return fullname;
		}
		
		public Address getAddress(){      // Адресът съм го създала в отделен клас и не знам как се процедира в този случай
			return address;
		}
		
		public void setAddress(Address address){               
			this.address=address;
		}
	 
		public String toString(){
			return counter+id+forename+surname+address+age;			
		}
	




По третата задача изобщо не съм сигурна как точно да направя половината методи. Ето това е недовършения (грешен) код

public class Database {

	Patient patients[]=new Patient[10];
	int counter=0;
	
	private Database(){
		
	}
	public boolean add(Patient patient){                                        
		for(int i=0;i<this.patients.length;i++){
			if (patient.getId()==this.patients[i].getId()){
				return false;
			}else{
				
			}
		}
	}
	
	public Patient findById(int id){
		for(int i=0;i<this.patients.length;i++){
			if(id==this.patients[i].getId()){
				return this.patients[i];
			}
		}
		return null;
	}
	
	public boolean removeById(int id){
		for(int i=0;i<this.patients.length;i++){
			if(id==this.patients[i].getId()){
				if(i==patients.length-1){
					this.patients=null;
					this.patients.length--;
					return true;
				}else{
					this.patients[i]=this.patients[this.patients.length-
1];
					this.patients[(this.patients.length-1)]=null;
					this.patients.length--;
					return true;
				}
			}
		}
		return false;
	}
	
	public int size(){
		
	}
	
	public String toString(){
		
	}
	
	public static void main(String[] args) {
		Database A=new Database();

	}

}



Много бих се радвала,ако някой се отзове и ми помогне. Благодаря предварително.
0

#2
Потребителят е неактивен   debelin 

  • Група: Потребители
  • Мнения: 2951
  • Регистриран: 28-July 06
  • Репутация: 16
  • Град:В сърцето на всяка филия
fullname ти е локална за метод setName(String name).
Кода не би трябвало въобще да се компилира, защото fullname не е видима за getName();
http://filoproject.eu/ - top level protection for your Blackberry device!
0

#3
Потребителят е неактивен   brigadier 

  • Група: Потребители
  • Мнения: 1101
  • Регистриран: 25-December 05
  • Репутация: 247
От пръв поглед по пациента:

- щом в конструктора се подава пълно име, първото и второто се екстрахират от него с разделител празното място. Горе при полетата трябва да се добави и стринг name.
- първото преинициализиране трябва да е вътре в конструктора с подадените му параметри
- не е много ясно за чий броячът трябва да е статичен
0

#4
Потребителят е неактивен   unfragable 

  • Bo0om Headshot!!!
  • Група: Потребители
  • Мнения: 13315
  • Регистриран: 02-October 05
  • Репутация: 2282
  • Пол:Мъж
  • Град:Пловдив
До колкото разбрах SetName получава "Bob Marley" и задава forename = "Bob" и surname = "Marley".

public void setName(String name){ 
     String[] splitStr = name.split("\\s+");
     forename = splitStr[0];
     surname = splitStr[1];
}

Мнението беше редактирано от unfragable: 19.11.14 - 22:14

0

#5
Потребителят е неактивен   zoiqa 

  • Група: Потребители
  • Мнения: 5
  • Регистриран: 26-May 06
  • Репутация: 0
Добре след като вече имам setName какво трябва да направя в getName? Броячът е статичен по условие (впрочем къде да го използвам?) Конструктора трябва да изглежда така или бъркам
	public Patient (String name, int age, Address address){  		
	setName(name);
	setAge(age);
	setAddress(address);
	}


После в main-метода създавам обект, който да има име,възраст и адрес, но как задавам адреса (възниква грешка в eclipse)?
	public static void main(String[] args) {
		Patient xy=new Patient ("Klaus", 40, address );
		System.out.println(xy.toString());
	}


Някакви идея по третата задача? Извинявам се ако въпросите ми ви се сторят елементарни, но както казах съм начинаеща и би било по-лесно за мен ако видя как се правят нещата на практика.

Мнението беше редактирано от zoiqa: 20.11.14 - 10:21

0

#6
Потребителят е неактивен   unfragable 

  • Bo0om Headshot!!!
  • Група: Потребители
  • Мнения: 13315
  • Регистриран: 02-October 05
  • Репутация: 2282
  • Пол:Мъж
  • Град:Пловдив
public String getName(){
      return forename + " " + surname;
}


toString() и той ще налепя по същия начин.

Това this.patients.length--; няма как да се случи. Размера не можеш да го променяш. this.patients.length може само да ти върне размера на patients.

Запиши си проекта в един zip в сегашното му състояние и дай линк да видим какво се случва.

Мнението беше редактирано от unfragable: 20.11.14 - 13:34

0

#7
Потребителят е неактивен   brigadier 

  • Група: Потребители
  • Мнения: 1101
  • Регистриран: 25-December 05
  • Репутация: 247

Преглед на мнениеzoiqa, на 20.11.14 - 10:04, каза:

Добре след като вече имам setName какво трябва да направя в getName? Броячът е статичен по условие (впрочем къде да го използвам?) Конструктора трябва да изглежда така или бъркам
	public Patient (String name, int age, Address address){  		
	setName(name);
	setAge(age);
	setAddress(address);
	}


После в main-метода създавам обект, който да има име,възраст и адрес, но как задавам адреса (възниква грешка в eclipse)?
	public static void main(String[] args) {
		Patient xy=new Patient ("Klaus", 40, address );
		System.out.println(xy.toString());
	}


Някакви идея по третата задача? Извинявам се ако въпросите ми ви се сторят елементарни, но както казах съм начинаеща и би било по-лесно за мен ако видя как се правят нещата на практика.


То поначало в условието малко се губи логиката. Ако в конструктора подаваш двете имена накуп, после трябва да разделяш на име и фамилия, както беше предложено, или пиши в търсачката "java how to split string into words" Обаче след това първо и второ име никъде не се ползват поотделно.
Подозирам, че имената се въвеждат в отделни полета и после се сглобява пълното име.

При първия вариант имаме:

private static int counter=0;
private int id=-1;
private String name;
private String forename;
private String surname;
private Address address;
private int age=-1;



public Patient (String name, int age, Address address){
this.name = name;
this.age = age;
this.address = address;
вадиш първо и второ име и заместваш и тях
}
// getters & setters

За разпечатването виж как се пренаписва toString метода - може да потърсиш "java how to print object content" , иначе ще ти излизат само адресите


При втория вариант имаме:

private static int counter=0;
private int id=-1;
private String name;
private String forename;
private String surname;
private Address address;
private int age=-1;



public Patient (String forename, String surname, int age, Address address){
this.forename = forename;
this.surname = surname;
name = forename + " " + surname;
this.age = age;
this.address = address;}

//getters & setters
0

#8
Потребителят е неактивен   zoiqa 

  • Група: Потребители
  • Мнения: 5
  • Регистриран: 26-May 06
  • Репутация: 0
Ето това съм направила засега Прикачен файл  src.zip (2.23К)
Брой изтегляния: 9
0

#9
Потребителят е неактивен   unfragable 

  • Bo0om Headshot!!!
  • Група: Потребители
  • Мнения: 13315
  • Регистриран: 02-October 05
  • Репутация: 2282
  • Пол:Мъж
  • Град:Пловдив
...обърках го... :D

public String toString() {		
   for (int i =0; i<this.patients.length; i++){
      return counter + patients[i].getName() + patients[i].getAge() + patients[i].getAddress() +patients[i].getAddress().getFormattedZipcode() + patients[i].getAddress().getCity();		
   }
   return "";
}


Не може всичките return-и да ти са някъде във for или в if. Трябва да имаш поне един return извън тях.

Мнението беше редактирано от unfragable: 20.11.14 - 22:08

0

#10
Потребителят е неактивен   zoiqa 

  • Група: Потребители
  • Мнения: 5
  • Регистриран: 26-May 06
  • Репутация: 0
Да де то това toString() е моя код или аз нещо съм пропуснала. При това ми изписва Dead code относно i++ в for-цикъла. Другите методи от Database наред ли са? А при Patient мисля,че го понакрепих, само че ***AGE UNKNOWN*** и ***ADDRESS UNKNOWN*** не функционират.
0

#11
Потребителят е неактивен   unfragable 

  • Bo0om Headshot!!!
  • Група: Потребители
  • Мнения: 13315
  • Регистриран: 02-October 05
  • Репутация: 2282
  • Пол:Мъж
  • Град:Пловдив
Леко е променен.
add не е както трябва. Там също си вкарала всички return във for и if и също така затварящите скоби не са ти наред.
0

#12
Потребителят е неактивен   zoiqa 

  • Група: Потребители
  • Мнения: 5
  • Регистриран: 26-May 06
  • Репутация: 0
Малко се обърках. Дали ще е възможно да ми кажете точно къде бъркам и как точно да го поправя :)
0

#13
Потребителят е неактивен   brigadier 

  • Група: Потребители
  • Мнения: 1101
  • Регистриран: 25-December 05
  • Репутация: 247

Преглед на мнениеzoiqa, на 20.11.14 - 23:33, каза:

само че ***AGE UNKNOWN*** и ***ADDRESS UNKNOWN*** не функционират.


Е то това е най - елементарното. Слагаш един if (age = -1 || age = 0) print "***AGE UNKNOWN***" , а за адреса - ако е null.
0

Споделете тази тема чрез:


Страница 1 от 1
  • Вие не можете да започнете нова тема
  • Вие не може да отговаряте на тази тема

1 потребители четат тази тема
0 регистрирани потребители, 1 гости и 0 анонимни потребители


Data.BG e форум за дискусии. Data.BG не носи отговорност за съдържанието и достоверността на публикуваните в дискусиите материали.

Никаква част от съдържанието на тази страница не може да бъде репродуцирана, записвана или предавана под каквато и да е форма или по какъвто и да е повод без писменото съгласие на Data.BG.

Close  Member Login