Archief - [PROG][JAVA] Galgje.java

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.

$torm

Legacy Member
Yo

kzit met een probleem in mijn java programma; doel is dus om een programma 'Galgje' te schrijven ma kzit met een probleem om de letter in mijn string te plaatsen:

Code:
public void verwerkBeurt() {
		controle = teRadenWoord.indexOf(ingaveNieuwKarakter);
		if (controle == -1) {
			tekenGalg();
		}

		else {
			for (j = 0; j < teRadenWoord.length(); j++) {
				if (teRadenWoord.charAt(j) == ingaveNieuwKarakter) {
					puntjesWoord.replace(puntjesWoord.charAt(j), ingaveNieuwKarakter);
				}
			}
			System.out.println("Te raden woord: " + puntjesWoord);
		}

als de ingegeven letter een 'e' is, dan print ie nie ...e..e...e bv maar terug gewoon ...........

ziet iemand mijn fout aub? :bow:

Fraggie

Legacy Member
Ik ben geen expert maar is ingaveNieuwKarakter van het type char?
Indien ze van een string is, kan je ze dan vergelijken met een char?

Of, moet je geen strings vergelijken met equals()? Omdat je anders de pointer vergelijkt (en die is natuurlijk anders) ipv de inhoud?

killgore

Legacy Member
Fraggie zei:
Ik ben geen expert maar is ingaveNieuwKarakter van het type char?
Indien ze van een string is, kan je ze dan vergelijken met een char?

Of, moet je geen strings vergelijken met equals()? Omdat je anders de pointer vergelijkt (en die is natuurlijk anders) ipv de inhoud?

chars zijn primitive types, geen referentie-variabelen :). De == klopt wel.

Fout:

puntjesWoord.replace(puntjesWoord.charAt(j), ingaveNieuwKarakter);

vervangt alle tekens puntjesWoord.charAt(j). Normaal zal dit een puntje zijn, nu zou je eigenlijk bij de eerste letter die je invoert alle puntjes door die letter moeten vervangen :), en niet enkel het puntje op plaats j ;).
Werken zal het dus sowieso niet doen, ik snap echter niet wrom het ........ blijft :x.

edit: on a sidenote: je kan j laten vallen en position als counter gebruiken in die for lus, die staat toch al op de eerste goede plaats :).

Hier kan het mssch veel handiger te zijn met een chararray te werken.

MilM

Legacy Member
Zet eens een System.out.println in die tweede if lus om te zien of hij wel in die lus springt.

De replace functie die jij wilt gebruiken kan je terugvinden in de klasse Stringbuffer.

Daddallo

Legacy Member
Je moet
puntjesWoord = puntjesWoord.replace(puntjesWoord.charAt(j), ingaveNieuwKarakter);
zetten.

replace vervangt de waarden niet in de string, maar returnt een aangepaste string.

killgore

Legacy Member
Daddallo zei:
Je moet
puntjesWoord = puntjesWoord.replace(puntjesWoord.charAt(j), ingaveNieuwKarakter);
zetten.

replace vervangt de waarden niet in de string, maar returnt een aangepaste string.

ahja, sjust :doh:.

Maar mijn opmerking blijft ook nog gelden, die code die jij zegt gaat afaik ook niet werken.

MilM

Legacy Member
Om een voorbeeld te geven bij mijn eerdere opmerking

Voor de for lus:
StringBuffer temp = new StringBuffer(puntjeswoord);

En dan binnen de tweede if lus:
temp.replace(j,j+1, ingaveNieuwKarakter);


En dan na de for lus:
puntjesWoord = temp.toString();

Is wel wa omslachtig.

EDIT: en zoals killgore zei, als je echt efficient wil zijn, int j=counter ipv int j=0. Maar dat is maar een klein detail :p
Waar is uw "int" in feite bij het declareren van de j ?

$torm

Legacy Member
khad nog een vraag da nie echt de moeite is voor een nieuwe topic:

(gaat wel over een ander programma)
ik zit met een reeks if-structuren:

if (stringvoorwaarden) ...
else if (stringvoorwaarden)...
else if (stringvoorwaarden)...
else if ('converteerd string naar long-type'-voorwaarde)...
else ...

als ik een woord ingeef in de string krijg ik een error omdat je geen letters naar een logn type kan converteren....

nu is de vraag: kan ik nadat 1 van de voorgaande voorwaarden zijn voldaan de andere voorwaarden laten negeren zodat ik geen error krijg

killgore

Legacy Member
ik begrijp je niet goed. Zodra die andere voorwaarden voldaan zijn wordt die andere genegeerd, else/if is short-circuited ... (in zekere zin).

edit: ah, em geeft dit wrsch bij compilatie? Dan gebruik je een verkeerde conversie, je kan een string niet gewoon met (long) converten he. Dan moet je een valueOf gebruiken.

$torm

Legacy Member
Code:
if ((ingave.length() >= 8) && (ingave.substring(0, 5) == "setm ")) {

				behandelSetMemoryCommando();


			}

			else if ((ingave.length() == 10) && (ingave.substring(0, 8) == "display ")) {

				behandelDisplayMemoryCommando();


			}

			else if ((Long.parseLong(ingave.substring(0, ingave.indexOf(' '))) > Math.pow(-2, 63)) && (Long.parseLong(ingave.substring(0, ingave.indexOf(' '))) < Math.pow(2, 63))) {

				behandelRekenkundigeExpressie();

			}

			else {

				vraagIngave();

dit is mijn code(ben rekenmachine aan het maken met gehele getallen: '1337 + 1337'); ik moet zowel string die uit cijfers bestaan als strings die uit letters bestaan kunnen onderscheiden

indien het cijfers zijn die worden ingegeven, controleer ik die zoals bij de laatste 'else if'

maar wanneer ik dan een woord ingeef krijg ik een fout omdat "test" bv niet te parsen is naar een long type

forloRn_

Legacy Member
Je moet je NumberFormatException catchen.

Basically: voeg een extra method boolean isRekenkundigeExpressie(String) toe die nagaat of je input een getal is en roep die method aan in je laatste else if:

Code:
private boolean isRekenkundigeExpressie(String ingave) {
    try {
        return ((Long.parseLong(ingave.substring(0, ingave.indexOf(' '))) > Math.pow(-2, 63)) && (Long.parseLong(ingave.substring(0, ingave.indexOf(' '))) < Math.pow(2, 63)));
    } catch (NumberFormatException e) {
        return false;
    }
}

Je moet ook die -2^63 enzovoort vervangen door Long.MIN_VALUE maar daar heb ik nu geen zin in.

forloRn_

Legacy Member
Bij nader inzien zal die Long.parseLong() ook wel een NumberFormatException throwen als de waarde van je long buiten de grenzen ligt. Dan parse je gewoon en return je true op het einde van je try.

MilM

Legacy Member
primitieven worden in java doorgegeven bij value, gewone klassen by referentie.

Wanneer je "==" gebruikt, ga je gaan kijken of het om twee dezelfde objecten gaat en niet of het om twee dezelfden waarden gaat. (tenzij bij primitieven zoals int, daar kunt je wel aantal == 4 gebruiken)

Je moet dan voor een string ook een methode gebruiken ipv de "==" om strings te vergelijken.
Bv volgende methode van de klasse String

int compareTo(String anotherString)
Compares two strings lexicographically.

Dus ingave.substring(0, 5).compareTo("setm ") == 0 moet het zijn

De rest later bekijken, want ik ben nu echt gaan maffen :p

eniac

Legacy Member
MilM zei:
primitieven worden in java doorgegeven bij value, gewone klassen by referentie.

Mnee. Pass-by-reference bestaat niet in Java, het is strikt pass-by-value.

Vrij verwarrend en wordt op scholen vaak verkeerdelijk aangeleerd als pass-by-reference, maar is het dus niet.

The fact is, in dealing with Java's references to objects, a copy of the reference's value is what is passed to the method -- it's passed by value.

killgore

Legacy Member
eniac zei:
Mnee. Pass-by-reference bestaat niet in Java, het is strikt pass-by-value.

Vrij verwarrend en wordt op scholen vaak verkeerdelijk aangeleerd als pass-by-reference, maar is het dus niet.
ehm, die quote die jij geeft zegt dat de REFERENTIE wordt gekopieerd (net zoals dit in c++ en zo ook gebeurd), niet het object zelf :p. De referentie zelf wordt pass-by-value gedaan (logisch ook), het object wordt niet gekopieerd.
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