Gå til innhold

Anbefalte innlegg

Skrevet

Hei!

I en opg skal en bruker kunne skrive inn et tall i en tekstboks, for så å få svar om tallet finnes i arrayen. Jeg har laget en kode, som er slik at brukeren får svar om tallet er i arrayen, men det kommer ikke noe svar om det ikke finnes.

 

int[] tall = { 0, 1, 2, 4, 5, 6, 7, 8, 9, 10, 13, 45, 12, 1, 2, 3, 45, 5, 6, 6, 7, 778, 889, 99};

int tallInn = Convert.ToInt32(txtTall.Text);

 

for (int verdi = 0; verdi < tall.Length; verdi++)

{

if (tallInn == (tall[verdi]))

labMelding.Text = "Tallet " + tallInn + " finnes i arrayen";

}

 

Spørsmålet er da hvordan brukeren skal kunne få et svar hvis tallet ikke finnes. Jeg prøvde meg med en labMelding utenfor for-løkken, men da kom det et svar om at den ikke fantes hele tiden. Hvordan løses dette, og hvorfor går det ikke å bare ha en labMelding utenfor for-løkken som sier at tallet ikke finnes?

Videoannonse
Annonse
Skrevet (endret)

Else inne i for løkka som ^skriver eller isteden for å msgbox inne i for løkka kan du ha en boolean variabel som settes true hvis den finner. Så setter du en if-else setning utenfor som sjekker verdien til boolean og msgbox der.

Endret av LNF
Skrevet (endret)

LNF sitt forslag er enkelt, greit og effektivt.

boolean finnes(int[] tall, int tallInn)
{
for(int i=0; i<tall.length; i++)
{
if(tall[i] == tallInn) return true;
}
return false;
}

 

i main-metoden slenger du da inn

if(finnes(tall, tallInn)
{
// handling når tall finnes
}
else
{
// handling når tall ikke finnes, dersom dette er nødvendig å ha med
}

 

Nå har jeg skrevet i java ettersom jeg ikke kjenner C#, men koden i førsteinnlegg er definitivt også gyldig java-kode, så jeg regner med du skjønner gangen her. Løser du det på denne måten vil programmet kun søke gjennom arrayet til den finner en forekomst av tallet (altså, metoden "finnes" vil returnere true straks tall er lik tallInn, og søke-løkken stopper), eller gjennom hele arrayet dersom tallet ikke finnes. Dermed sparer du endel iterasjoner, og du får maks en "success"-utskrift, selv om tallet forekommer flere ganger i arrayet.

Endret av srbz
  • Liker 1
Skrevet

Hva med å legge til et else-uttrykk?

 

Nettopp dette prøvde jeg også etter if-testen, men da fikk jeg samme problem som med labMeldingen utenfor for-løkken. Skjønner ikke hvorfor!!!

Skrevet (endret)

Skal du ha et if / else-uttrykk kan det lønne seg å bruke krøllklammer for å holde oversikt over hva som hører til hvor. Eksempelvis kan løsningen bli seende slik ut:

 

int[] tall = { 0, 1, 2, 4, 5, 6, 7, 8, 9, 10, 13, 45, 12, 1, 2, 3, 45, 5, 6, 6, 7, 778, 889, 99};

int tallInn = Convert.ToInt32(txtTall.Text);

 

for (int verdi = 0; verdi < tall.Length; verdi++)

{

if (tallInn == (tall[verdi])) {

labMelding.Text = "Tallet " + tallInn + " finnes i arrayet.";

}

else {

labMelding.Text = "Tallet " + tallInn + " finnes ikke i arrayet."

}

}

 

 

Når det er sagt, liker jeg LNF og srbz sitt forslag også, fordi det er gjenbrukbar kode du enkelt kan bruke andre plasser. Kanskje ikke nødvendig akkurat her, men en grei praksis å benytte seg av ;)

 

EDIT: Nå failet det tydeligvis å bruke indent-taggen inne i code-taggen, så da blir det slik i stedet. Noe å fikse, mods? I tillegg noe dumt at [/ indent] automatisk medfører linjeskift, slik det virker som det gjør. Blir mer uoversiktlig i redigeringsboksen for å få ting til å se skikkelig ut :p

Endret av Araho
Skrevet

Skal du ha et if / else-uttrykk kan det lønne seg å bruke krøllklammer for å holde oversikt over hva som hører til hvor. Eksempelvis kan løsningen bli seende slik ut:

 

int[] tall = { 0, 1, 2, 4, 5, 6, 7, 8, 9, 10, 13, 45, 12, 1, 2, 3, 45, 5, 6, 6, 7, 778, 889, 99};

int tallInn = Convert.ToInt32(txtTall.Text);

 

for (int verdi = 0; verdi < tall.Length; verdi++)

{

if (tallInn == (tall[verdi])) {

labMelding.Text = "Tallet " + tallInn + " finnes i arrayet.";

}

else {

labMelding.Text = "Tallet " + tallInn + " finnes ikke i arrayet."

}

}

 

 

Når det er sagt, liker jeg LNF og srbz sitt forslag også, fordi det er gjenbrukbar kode du enkelt kan bruke andre plasser. Kanskje ikke nødvendig akkurat her, men en grei praksis å benytte seg av ;)

 

EDIT: Nå failet det tydeligvis å bruke indent-taggen inne i code-taggen, så da blir det slik i stedet. Noe å fikse, mods?

 

Hva i alle verden er indent? Har ikke hørt om det før...

Skrevet

Den koden er akkurat slik jeg har prøvd tidligere, og den fungerer ikke, altså med en else-kommando inne i for-løkken. Prøvde også ut denne over, og den gikk heller ikke.

Skrevet (endret)

Ok, nytt forsøk:

 

int[] tall = { 0, 1, 2, 4, 5, 6, 7, 8, 9, 10, 13, 45, 12, 1, 2, 3, 45, 5, 6, 6, 7, 778, 889, 99};

int tallInn = Convert.ToInt32(txtTall.Text);

 

boolean exists = false; // Oppretter en boolsk (true / false) verdi, og setter den til false.

 

for (int verdi = 0; verdi < tall.Length; verdi++)

{

if (tallInn == tall[verdi] && exists != true) { // Denne sjekker for det første om tallet er likt, og i tillegg kan ikke tallet allerede ha vært funnet i arrayet.

exists = true;

}

}

 

if ( exists == true) { // Hvis innholdet i if-setninga har blitt kjørt, dvs at tallet finnes.

labMelding.Text = "Tallet " + tallInn + " finnes i arrayet."

}

else {

labMelding.Text = "Tallet finnes ikke i arrayet."

}

 

EDIT: La til noen kommentarer i koden.

Endret av Araho
Skrevet (endret)

Ok, nytt forsøk:

 

int[] tall = { 0, 1, 2, 4, 5, 6, 7, 8, 9, 10, 13, 45, 12, 1, 2, 3, 45, 5, 6, 6, 7, 778, 889, 99};

int tallInn = Convert.ToInt32(txtTall.Text);

 

boolean exists = false; // Oppretter en boolsk (true / false) verdi, og setter den til false.

 

for (int verdi = 0; verdi < tall.Length; verdi++)

{

if (tallInn == tall[verdi] && exists != true) { // Denne sjekker for det første om tallet er likt, og i tillegg kan ikke tallet allerede ha vært funnet i arrayet.

exists = true;

}

}

 

if ( exists == true) { // Hvis innholdet i if-setninga har blitt kjørt, dvs at tallet finnes.

labMelding.Text = "Tallet " + tallInn + " finnes i arrayet."

}

else {

labMelding.Text = "Tallet finnes ikke i arrayet."

}

 

EDIT: La til noen kommentarer i koden.

 

 

Nå fungerte det Araho!:) Noen forklaring på hvorfor det ikke gikk å sette else-kommandoen i for-løkken? :p

Endret av hoyre
Skrevet

Problemet ditt da blir at hver gang tallet IKKE stemmer, vil du sette variabelen til false. Så med mindre tallet er sist i arrayet, vil du skrive over true og legge inn false etterpå ;p

Skrevet

Ja, nettopp. Såvidt jeg har skjønt er du kun ute etter å finne ut hvorvidt tallet eksisterer i arrayet, og da trenger du i bunn og grunn bare å søke gjennom arrayet til du finner tallet. Hvis du finner tallet trenger du ikke søke lenger, og hvis du har søkt gjennom hele arrayet uten å finne tallet eksisterer det ikke. Du kan slenge inn en break i if-blokken inni for-løkken som vil avbryte søket straks du finner tallet, noe som basically vil gjøre ca det samme som kodeeksempelet mitt tidligere.

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...