Archief - [PROG][JAVA] Probleem met oefening

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

6sic6

Legacy Member
Hello,

Had volgende oef als onderdeel van mn herexamen, heb deze nu is hermaakt, maar geraak er niet uit:
Hier komt ie:

Maak de klasse GroteGetallen aan, zodanig dat onderstaande main methode correct werkt. De ingegeven getallen zijn zeer groot (100en cijfers). De getallen worden in een array geplaats waarbij elk element van de array plaats geeft aan 1 cijfer (vb rij[1] = 5).

Code:
public class Test
{
	public static void main (String [] args)
	{
		Input inp = new Input();
		System.out.print("Geef de waarde in:");
		String s = inp.readLine();
		GroteGetallen gg1 = new GroteGetallen(s);
		//input is een getal van 100en cijfers groot
		GroteGetallen gg2 = new GroteGetallen(100,true);
		// Eerste parameter: aantal getallen
		// Tweede parameter: true  > random getallen gegenereert
		//                   false > alle getallen zijn nul
		if(gg1.gelijk(gg2))
		System.out.println("De getallen zijn gelijk!");
		GroteGetallen gg3 = GroteGetallen.som(gg1,gg2);
		System.out.println(gg3);
	}
}

Volgende code heb ik al:

Code:
import java.util.Random;

class GroteGetallen
{
	private int [] rij;
	public GroteGetallen(String str)
	{
		rij = new int [str.length()];
		for (int i = 0; i < rij.length; i++)
		{
			rij[i] = Integer.parseInt(str.substring(i,(i+1)));//nen int maken van een karakter van de string namelijk de string
			//op plaats i en i+1 ( we maken ne substring)
		}
	}
	public GroteGetallen(int a, boolean c)
	{
		rij = new int[a];
		Random rand = new Random();
		int i = 0;
		if(c)   // wat dus betekent, if (c == true)
		{
			while(i<a)
			{
				rij[i] = rand.nextInt(9);
				i++;
			}
			
		}
		else
		{
			while(i<a)
			{
				rij[i]=0;
				i++;
			}
		}
	}
	public int [] getGroteGetallen()
	{
		return rij;
	}
	public static GroteGetallen som(GroteGetallen gg1, GroteGetallen gg2)
	{
		int [] rij1 = gg1.getGroteGetallen();
		int [] rij2 = gg2.getGroteGetallen();
		String hulp = new String();
		String eind = new String();
		for(int i = (rij1.length-1); i>=0; i--)
		{
			int test = rij1[i]+rij2[i];
			if(test>=10)
			{
				rij1[i-1] = rij1[i-1] +1;
				hulp.concat(String.valueOf(test-10));
			}
			else
			hulp.concat(String.valueOf(test));
		}
		for(int i = hulp.length(); i > 0; i--)
		{
			eind.concat(hulp.substring((i-1),i));
		}
		GroteGetallen test = new GroteGetallen(eind);
		return test;
	}
	public boolean gelijk(GroteGetallen gg2)
	{
		boolean gelijk = true;
		int i=0;
		int [] rij2 = gg2.getGroteGetallen();
		while(i< rij.length && gelijk)
		{
			if(rij[i] != rij2[i])
			gelijk = false;
			i++;	
		}
		return gelijk;
	}
}

Wat er nu niet werkt:
  1. De vergelijking verloopt niet goed, want hij zegt altijd dat het gelijk is. Volgens mij zit ik ergens met een verkeerde redenering ivm het van ints naar strings en van strings naar ints schrijven.
  2. Uitschrijven werkt niet ('t is een object dat moet uitgeschreven worden). Ik weet dat er een methode bestaat die opgeroepen wordt als je System.out.println(gg3); doet, maar kan me niet meer herinneren welke. Eens ik die methodenaam weet kan ik zelf mn methode om uit te schrijven wel maken natuurlijk ...

Iemand een idee ? Er zijn er nog een paar die binnenkort herexamen hebben, en die zouden het wel apprecieren mocht ik hen de correcte oplossing door kunnen sturen!!

Kn0t

Legacy Member
System.out.println(gg3); zal de methode "public String toString()" van je GroteGetallen klasse oproepen.

Voor je vergelijking: makkelijkste is gewoon de Arrays klasse van de standaard java library gebruiken.

Dit gaat zo: return Arrays.equals(rij, gg2.getGroteGetallen());

Het kan natuurlijk zijn dat jullie deze in de cursus niet gezien hebben en deze methode niet mogen gebruiken?

Ik zie verder niet onmiddelijk wat er verkeerd is aan je gelijk() methode, behalve dan dat ze altijd true zal teruggeven wanneer je rij[] array geen elementen bevat. Je zal dan namelijk nooit in je while lus komen, omdat rij.length dan 0 is.

Rajiv

Legacy Member
Aan die gelijk zie ik ook niets fout. Wat misschien korter kan, en iets performanter (zo spring ik altijd uit men loops :) ):
Code:
	public boolean gelijk(GroteGetallen gg2)
	{ 
                int i = 0;
		int [] rij2 = gg2.getGroteGetallen();
		while(i< rij.length)
		{
			if(rij[i] != rij2[i])
			return false;
			i++;	
		}
		return true;
	}

Controleer de string eens die je ingeeft. Kan misschien daarom zijn dat die rij.length() op 0 staat zoals reply hierboven

killgore

Legacy Member
ter info

je moet deze code niet doen:
int [] rij2 = gg2.getGroteGetallen();
Aangezien gg2 van hetzelfde type is als het type waarbinnen je werkt kan je gewoonweg gg2.rij doen ;).
Hetzelfde geldt afaik in die static functies.

uw while is ook onduidelijk -> maak daar een for van, een pak editors (oa eclipse) hebben auto-aanvulling voor array-looping.


kheb uw constructor en gelijk herschreven, ge gebruikt enorm onduidelijke code immers!

constructor:

Code:
	public GroteGetallen(int n, boolean random)
	{
		rij = new int[n];
		Random rand = new Random();
		if(random)   // wat dus betekent, if (c == true)
		{
                        for(int i = 0; i < rij.length; i++)
			{
				rij[i] = rand.nextInt(9);
			}
			
		}
		else
		{
                        for(int i = 0; i < rij.length; i++)
			{
				rij[i]=0;
			}
		}
	}

gelijk:

Code:
	public boolean gelijk(GroteGetallen gg2)
	{
                if(gg2.rij.length != rij.length) return false;
		for(int i = 0; i < rij.length; i++)
		{
			if(rij[i] != gg2.rij[i]) return false;
		}
		return true;
	}

kunnen wel enkele kleine foutjes inzitten aangezien ik al enkele maanden geen java meer heb gedaan.

edit: het is dus de bedoeling dat je gelijkaardige aanpassingen brengt in je andere functies eh ;). Ik heb trouwens hier effe test gedaan met mijn functies en alles werkt perfect :p.

ik zou ook bij die getGroteGetallen niet de referentie teruggeven maar een nieuwe rij aanmaken en deze teruggeven.

edit2: opmerking over "huiswerk" verwijdert, excuses :).

Welke richting doe je overigens?

6sic6

Legacy Member
Kn0t zei:
System.out.println(gg3); zal de methode "public String toString()" van je GroteGetallen klasse oproepen.

Voor je vergelijking: makkelijkste is gewoon de Arrays klasse van de standaard java library gebruiken.

Dit gaat zo: return Arrays.equals(rij, gg2.getGroteGetallen());

Het kan natuurlijk zijn dat jullie deze in de cursus niet gezien hebben en deze methode niet mogen gebruiken?

Ik zie verder niet onmiddelijk wat er verkeerd is aan je gelijk() methode, behalve dan dat ze altijd true zal teruggeven wanneer je rij[] array geen elementen bevat. Je zal dan namelijk nooit in je while lus komen, omdat rij.length dan 0 is.

Arrays.equals wel gezien, maar op examen mochten we die nooit gebruiken, zelfde met arraycopy ... Zal deze eens gebruiken, eens zien wat dat zegt.

6sic6

Legacy Member
killgore zei:
ter info

je moet deze code niet doen:
int [] rij2 = gg2.getGroteGetallen();
Aangezien gg2 van hetzelfde type is als het type waarbinnen je werkt kan je gewoonweg gg2.rij doen ;).
Hetzelfde geldt afaik in die static functies.

uw while is ook onduidelijk -> maak daar een for van, een pak editors (oa eclipse) hebben auto-aanvulling voor array-looping.

kheb uw constructor en gelijk herschreven, ge gebruikt enorm onduidelijke code immers!
Nja, excuses. Meeste is eigelijk niet door mezelf geschreven, ben sinds maandag klaar met exames en heb er geen zin meer in. Heb het ier gewoon neergepoot :-). Dat van die gg2.rij wist ik niet, merci daarvoor :niceone:

killgore

Legacy Member
6sic6 zei:
Nja, excuses. Meeste is eigelijk niet door mezelf geschreven, ben sinds maandag klaar met exames en heb er geen zin meer in. Heb het ier gewoon neergepoot :-). Dat van die gg2.rij wist ik niet, merci daarvoor :niceone:
Niets te excuseren :), ik geef gewoon opmerkingen om u te helpen (ok, ze kunnen nogal bruut overkomen).

Wat ik wel heb toegevoegd waar je vrij sterk moet opletten:

if(gg2.rij.length != rij.length) return false;
Met jouw originele code ging je vrij gegarandeerd een bufferoverflow krijgen als je gg2.gelijk(gg1) deed ipv het omgekeerde.

Doet me trouwens denke aan men eigen examen java :).

6sic6

Legacy Member
killgore zei:
Niets te excuseren :), ik geef gewoon opmerkingen om u te helpen (ok, ze kunnen nogal bruut overkomen).

Wat ik wel heb toegevoegd waar je vrij sterk moet opletten:

if(gg2.rij.length != rij.length) return false;
Met jouw originele code ging je vrij gegarandeerd een bufferoverflow krijgen als je gg2.gelijk(gg1) deed ipv het omgekeerde.

Doet me trouwens denke aan men eigen examen java :).

Bah, was klote-examen. Was nog voor ict als het algemene vak (dus nog niet als optie). Had het grootste deel wel van de oefening, maja, we moeten zo'n dingen dus op papier neerschrijven met als gevolg dat je dus niet kan debuggen of nix ... kak

killgore

Legacy Member
Ach, uw eigen int mbv residutalstelsel of iets dergelijk implementeren vind ek toch leuker om te leren.

@hydra: daar heeft java nu eens op-overloading nodig ze :p.

[BAT] Hydra

Legacy Member
killgore zei:
Ach, uw eigen int mbv residutalstelsel of iets dergelijk implementeren vind ek toch leuker om te leren.

2nd

killgore zei:
@hydra: daar heeft java nu eens op-overloading nodig ze :p.

Zou inderdaad handig zijn, maar als ge bewerkingen met methodes doet gaat ge minder verwarring creëeren imo. Zo ziet ge duidelijk of ge met primitieve types of met klassen bezig zijt.

BUFU By Us F* U

Legacy Member
Ik ben dus de geweldige ontwerper van dit programma. Ben niet zo'n fan van al dat java gedoe.

System.out.println(gg3); zal de methode "public String toString()" van je GroteGetallen klasse oproepen. Wat moet ik dan in die methode schrijven?
In tegenstelling tot 6sic6 weet ik dus niet wat daar moet staan :oink:

Mercikes :bow:

killgore

Legacy Member
BUFU By Us F* U zei:
Ik ben dus de geweldige ontwerper van dit programma. Ben niet zo'n fan van al dat java gedoe.

System.out.println(gg3); zal de methode "public String toString()" van je GroteGetallen klasse oproepen. Wat moet ik dan in die methode schrijven?
In tegenstelling tot 6sic6 weet ik dus niet wat daar moet staan :oink:

Mercikes :bow:
Wel

je hebt je klasse GroteGetallen, hierin moet jij een methode toString() schrijven die een textuele representatie van je klasse teruggeeft, waarschijnlijk zal dit het getal zijn, maar dan in een string gegoten.

Ander vb dat ik onlangs gecode heb:
vector2D -> geeft "(x,y)" terug (met x en y dan de juiste waarden)

uw toString ziet er bv. zo uit:

String toString()
{
return new String();
}

BUFU By Us F* U

Legacy Member
public static GroteGetallen som(....)

Daar moet ook nog ergens een fout inzitten.
Iemand enig idee? Oefening werkt bij mij nog steeds totaal niet, geeft wel geen fouten meer (ook niet tijdens runnen).

killgore

Legacy Member
uw logica voor som is dan ook niet al te goed:

Code:
import java.util.*;

class GroteGetallen
{
	private int [] rij;
	public GroteGetallen(String str)
	{
		rij = new int [str.length()];
		for (int i = rij.length-1, j =0 ; i >=0; i--,j++)
		{
			rij[i] = Integer.parseInt(str.substring(j,(j+1)));
		}
	}
	public GroteGetallen(int n, boolean random)
	{
		rij = new int[n];
		Random rand = new Random();
		if(random)   // wat dus betekent, if (c == true)
		{
            for(int i = 0; i < rij.length; i++)
			{
				rij[i] = rand.nextInt(9);
			}
			
		}
		else
		{
            for(int i = 0; i < rij.length; i++)
			{
				rij[i]=0;
			}
		}
	}
	private GroteGetallen(int [] rij)
	{
		this.rij = rij;
	}
	public int [] getGroteGetallen()
	{
		return rij;
	}
	public static GroteGetallen som(GroteGetallen gg1, GroteGetallen gg2)
	{
		int commonLength = Math.min(gg1.rij.length,gg2.rij.length);
		int [] nieuweRij = new int[Math.max(gg1.rij.length,gg2.rij.length)+1];
		boolean addOne = false;
		for(int i = 0; i< commonLength; i++)
		{
			int temp = gg1.rij[i]+gg2.rij[i] + (addOne ? 1 : 0);
			if(temp/10 >0) addOne = true;
			else addOne = false;
			nieuweRij[i] = temp%10;
		}
		if(gg1.rij.length > commonLength)
		{
			for(int i = commonLength; i< gg1.rij.length; i++)
			{
				int temp = gg1.rij[i] + (addOne ? 1 : 0);
				if(temp/10 >0) addOne = true;
				else addOne = false;
				nieuweRij[i] = temp%10;
			}
			nieuweRij[gg1.rij.length] = addOne ? 1 : 0;
		}
		else if(gg2.rij.length > commonLength)
		{
			for(int i = commonLength; i< gg2.rij.length; i++)
			{
				int temp = gg2.rij[i] + (addOne ? 1 : 0);
				if(temp/10 >0) addOne = true;
				else addOne = false;
				nieuweRij[i] = temp%10;
			}
			nieuweRij[gg2.rij.length] = addOne ? 1 : 0;
		}
		else //Even lang
		{
			nieuweRij[gg1.rij.length] = addOne ? 1 : 0;
		}
		return new GroteGetallen(nieuweRij);
	}
	public boolean gelijk(GroteGetallen gg2)
	{
        if(gg2.rij.length != rij.length) return false;
		for(int i = 0; i < rij.length; i++)
		{
			if(rij[i] != gg2.rij[i]) return false;
		}
		return true;
	}
	public String toString()
	{
		boolean voorloopnul = true;
		StringBuffer temp = new StringBuffer();
		for (int i = rij.length-1; i >=0; i--) {
			if(rij[i] != 0) voorloopnul = false;
			if(voorloopnul) continue;
			temp.append(rij[i]);
		}
		if(voorloopnul) temp.append(0); // We hebben gewoon 0 :p
		return temp.toString();
	}
}

class Test
{
	public static void main (String [] args)
	{		
		GroteGetallen gg1 = new GroteGetallen(1,true);
		//input is een getal van 100en cijfers groot
		GroteGetallen gg2 = new GroteGetallen("997");
		// Eerste parameter: aantal getallen
		// Tweede parameter: true  > random getallen gegenereert
		//                   false > alle getallen zijn nul
		if(gg1.gelijk(gg2))
			System.out.println("De getallen zijn gelijk!");
		else
			System.out.println("De getallen zijn niet gelijk!");
		System.out.println(gg1);
		System.out.println(gg2);
		System.out.println(GroteGetallen.som(gg1,gg2));
	}
}
edit: wacht effe, zit nog fout in men addone logica

edit2: alles zou moeten kloppen nu ;).

jodeman

Legacy Member
6sic6 zei:
Hello,

Had volgende oef als onderdeel van mn herexamen, heb deze nu is hermaakt, maar geraak er niet uit:
Hier komt ie:

Maak de klasse GroteGetallen aan, zodanig dat onderstaande main methode correct werkt. De ingegeven getallen zijn zeer groot (100en cijfers). De getallen worden in een array geplaats waarbij elk element van de array plaats geeft aan 1 cijfer (vb rij[1] = 5).

Code:
public class Test
{
	public static void main (String [] args)
	{
		Input inp = new Input();
		System.out.print("Geef de waarde in:");
		String s = inp.readLine();
		GroteGetallen gg1 = new GroteGetallen(s);
		//input is een getal van 100en cijfers groot
		GroteGetallen gg2 = new GroteGetallen(100,true);
		// Eerste parameter: aantal getallen
		// Tweede parameter: true  > random getallen gegenereert
		//                   false > alle getallen zijn nul
		if(gg1.gelijk(gg2))
		System.out.println("De getallen zijn gelijk!");
		GroteGetallen gg3 = GroteGetallen.som(gg1,gg2);
		System.out.println(gg3);
	}
}

Volgende code heb ik al:

Code:
import java.util.Random;

class GroteGetallen
{
	private int [] rij;
	public GroteGetallen(String str)
	{
		rij = new int [str.length()];
		for (int i = 0; i < rij.length; i++)
		{
			rij[i] = Integer.parseInt(str.substring(i,(i+1)));//nen int maken van een karakter van de string namelijk de string
			//op plaats i en i+1 ( we maken ne substring)
		}
	}
	public GroteGetallen(int a, boolean c)
	{
		rij = new int[a];
		Random rand = new Random();
		int i = 0;
		if(c)   // wat dus betekent, if (c == true)
		{
			while(i<a)
			{
				rij[i] = rand.nextInt(9);
				i++;
			}
			
		}
		else
		{
			while(i<a)
			{
				rij[i]=0;
				i++;
			}
		}
	}
	public int [] getGroteGetallen()
	{
		return rij;
	}
	public static GroteGetallen som(GroteGetallen gg1, GroteGetallen gg2)
	{
		int [] rij1 = gg1.getGroteGetallen();
		int [] rij2 = gg2.getGroteGetallen();
		String hulp = new String();
		String eind = new String();
		for(int i = (rij1.length-1); i>=0; i--)
		{
			int test = rij1[i]+rij2[i];
			if(test>=10)
			{
				rij1[i-1] = rij1[i-1] +1;
				hulp.concat(String.valueOf(test-10));
			}
			else
			hulp.concat(String.valueOf(test));
		}
		for(int i = hulp.length(); i > 0; i--)
		{
			eind.concat(hulp.substring((i-1),i));
		}
		GroteGetallen test = new GroteGetallen(eind);
		return test;
	}
	public boolean gelijk(GroteGetallen gg2)
	{
		boolean gelijk = true;
		int i=0;
		int [] rij2 = gg2.getGroteGetallen();
		while(i< rij.length && gelijk)
		{
			if(rij[i] != rij2[i])
			gelijk = false;
			i++;	
		}
		return gelijk;
	}
}

Wat er nu niet werkt:
  1. De vergelijking verloopt niet goed, want hij zegt altijd dat het gelijk is. Volgens mij zit ik ergens met een verkeerde redenering ivm het van ints naar strings en van strings naar ints schrijven.
  2. Uitschrijven werkt niet ('t is een object dat moet uitgeschreven worden). Ik weet dat er een methode bestaat die opgeroepen wordt als je System.out.println(gg3); doet, maar kan me niet meer herinneren welke. Eens ik die methodenaam weet kan ik zelf mn methode om uit te schrijven wel maken natuurlijk ...

Iemand een idee ? Er zijn er nog een paar die binnenkort herexamen hebben, en die zouden het wel apprecieren mocht ik hen de correcte oplossing door kunnen sturen!!

werkt die code echt? Heb die bij mij eens laten runnen en die geeft toch niet dat de grotegetallen gelijk zijn, had eerst ne array out of bounds en daarna gewoon het adres van uw object in het geheugen opt einde (met andere getallen).

killgore

Legacy Member
jodeman zei:
werkt die code echt? Heb die bij mij eens laten runnen en die geeft toch niet dat de grotegetallen gelijk zijn, had eerst ne array out of bounds en daarna gewoon het adres van uw object in het geheugen opt einde (met andere getallen).
die code is vrij fout (array-length checking als voornaamste fout).

Mijn verbeterde code is vrij correct denk ik.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan