Gå til innhold

C#: Skrive ut like heltall + hangmanoppgave (arrayer)


Anbefalte innlegg

Skal lage en array og så skal jeg skrive ut alle tall som forekommer flere ganger, samt indeksene det gjelder. Samme kombinasjon skal bare skrives ut en gang. Begynte slik men det funket ikke bra:

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class HeltallKombinasjoner : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
	int[] heltall = {7,2,4,5,6,6,7,8,6,7,8,5,7,5,6,6,4,6,5,4,3,5,3,2,1,2,3,4,5,6,7,8,9,0,9,8,7,6,5,4,3,2,1};

	for (int i = 0; i < heltall.Length; i++)
	{
		for (int j = 0; j < heltall.Length; j++)
		{
			if (heltall[i] == heltall[j])
			{
				labHeltall.Text += Convert.ToString(heltall[i]) + " " + Convert.ToString(heltall[j]);
			}
		}
	}
}
}

 

Oppgave 2:

 

Lag en webside som innholder en array med bokstaver som tilsammen former et ord. Brukeren skal gjette på bokstavene i en tekstboks og få tilbakemelding om bokstaven forekommer i ordet.

 

Så skal oppgaven utvides til å bli en enkel hangmann. Lag en array som skal være av typen char med så mange plasser plasser som det skal være forsøk, og ta vare på forsøkte bokstaver i denne. Vis så hele tiden de bokstavene av det hemmlige ordet som også finnes i arrayen med forsøkte bokstaver. Lag en variabel som innholder feil og vise bilder med filnavn på følgene form; feil1.jpg, feil2.jpg, feil3.jpg osv.

 

Har ikke prøvd meg noe på oppgave 2, men ønsker gjerne et par småtriks på hvordan jeg burde begynne. :)

Lenke til kommentar
Videoannonse
Annonse
Gjest Slettet-aNZFa3

Jeg ser ingen direkte feil nå sånn på sparket. Hva er den som feiler? Kommer det feilmelding? Eller kommer det ikke noe som helst?

Lenke til kommentar

Får ut dette:

 

7 77 77 77 77 77 72 22 22 22 24 44 44 44 44 45 55 55 55 55 55 55 56 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 67 77 77 77 77 77 78 88 88 88 86 66 66 66 66 66 66 66 67 77 77 77 77 77 78 88 88 88 85 55 55 55 55 55 55 57 77 77 77 77 77 75 55 55 55 55 55 55 56 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 64 44 44 44 44 46 66 66 66 66 66 66 66 65 55 55 55 55 55 55 54 44 44 44 44 43 33 33 33 35 55 55 55 55 55 55 53 33 33 33 32 22 22 22 21 11 12 22 22 22 23 33 33 33 34 44 44 44 44 45 55 55 55 55 55 55 56 66 66 66 66 66 66 66 67 77 77 77 77 77 78 88 88 88 89 99 90 09 99 98 88 88 88 87 77 77 77 77 77 76 66 66 66 66 66 66 66 65 55 55 55 55 55 55 54 44 44 44 44 43 33 33 33 32 22 22 22 21 11 1
Lenke til kommentar

Resultatet du har sier at 7 er på plass nr. 7, seks ganger og så gjøres dette igjen og igjen. Du repererer for mye med andre ord. Kort ned den indre løkka til kunn å sjekke fra ytre posisjon i stedet ifra 0. Dette fordi tallene i forkant allerede er sjekket. Putt kombinasjonene du finner i en LIST. Da kan du sjekke om du har kombinasjonen fra før.

Lenke til kommentar

Du har jo to løkker. Dette for å sjekke alle tall om de eksisteder flere ganger. Løkka di sjekker jo alle tallene med absolutt alle og det er jo ikke nødvendig. Det holder jo å sjekke med kunn de resterende tallene, altså slik:

tallrekke: 1 2 3 4 5

Sjekkes slik:

1-2, 1-3, 1-4, 1-5, 2-3, 2-4, 2-5, 3-4, 3-5, 4-5

Din løkke sjekker jo slik:

1-1, 1-2, 1-3, 1-4, 1-5, 2-1, 2-2, 2-3, 2-4, 2-5, 3-1, 3-2, 3-3, 3-4, 3-5, 4-1, 4-2, 4-3, 4-4, 4-5, 5-1, 5-2, 5-3, 5-4, 5-5

Og dette var bare fem siffer. Med din algoritme så sjekkes jo ting en dullion ganger, derfor kan du endre løkkene slik:

for (int i = 0; i < tallrekke.length; i++)
 for (int o = i+1; o < tallrekke.length; o++)
 {
if(tallrekke[i] == tallrekke[o])
{
  // Vi haar en mætsj og vi kan lagre mætsjen i f.eks. en LIST
}
 }

Skjønner?

LIST overlater jeg til deg å studere selv. Bare søk i MSDN så finner du at List<t> og SortedList<t, T> er to utrolig kraftige klasser

Endret av HDSoftware
Lenke til kommentar
int[] heltall = {7,2,4,5,6,6,7,8,6,7,8,5,7,5,6,6,4,6,5,4,3,5,3,2,1,2,3,4,5,6,7,8,9,0,9,8,7,6,5,4,3,2,1};
Dictionary<int,List<int>> numbers = new Dictionary<int,List<int>>();

for(int i=0;i<heltall.Length;i++)
if (numbers.ContainsKey(heltall[i]))
	numbers[heltall[i]].Add(i);
else
	numbers.Add(heltall[i], new List<int> { i });

StringBuilder builder = new StringBuilder();
foreach (KeyValuePair<int, List<int>> number in numbers.Where(x => x.Value.Count > 1).OrderBy(x => x.Key))
{
builder.AppendFormat("{0}: ", number.Key);
for (int i = 0; i < number.Value.Count; i++)
{
	builder.AppendFormat("{0}", number.Value[i]);
	if (i == number.Value.Count - 1)
		builder.AppendLine();
	else
		builder.Append(",");
}
}

Console.Write(builder.ToString());

Endret av The Jackal
Lenke til kommentar

Det der er iallefall en helt annen måte enn det vi pleier å skrive på. :)

 

Uansett prøvde jeg. For det første hadde du glemt to "}" på slutten. Men det var ikke noe problem selvsagt. Problmet er at jeg får komp. feil. "The type or namespace 'StringBuilder' could not be foud. Hva er galt?

Lenke til kommentar
Du har jo to løkker. Dette for å sjekke alle tall om de eksisteder flere ganger. Løkka di sjekker jo alle tallene med absolutt alle og det er jo ikke nødvendig. Det holder jo å sjekke med kunn de resterende tallene, altså slik:

tallrekke: 1 2 3 4 5

Sjekkes slik:

1-2, 1-3, 1-4, 1-5, 2-3, 2-4, 2-5, 3-4, 3-5, 4-5

Din løkke sjekker jo slik:

1-1, 1-2, 1-3, 1-4, 1-5, 2-1, 2-2, 2-3, 2-4, 2-5, 3-1, 3-2, 3-3, 3-4, 3-5, 4-1, 4-2, 4-3, 4-4, 4-5, 5-1, 5-2, 5-3, 5-4, 5-5

Og dette var bare fem siffer. Med din algoritme så sjekkes jo ting en dullion ganger, derfor kan du endre løkkene slik:

for (int i = 0; i < tallrekke.length; i++)
 for (int o = i+1; o < tallrekke.length; o++)
 {
if(tallrekke[i] == tallrekke[o])
{
  // Vi haar en mætsj og vi kan lagre mætsjen i f.eks. en LIST
}
 }

Skjønner?

LIST overlater jeg til deg å studere selv. Bare søk i MSDN så finner du at List<t> og SortedList<t, T> er to utrolig kraftige klasser

Skjønner ikke helt hva jeg skal skrive i if- settningen. Prøver f.eks med "labHeltall.Text += heltall + " ";" men det funker dårlig.

Lenke til kommentar
Det der er iallefall en helt annen måte enn det vi pleier å skrive på. :)

 

Uansett prøvde jeg. For det første hadde du glemt to "}" på slutten. Men det var ikke noe problem selvsagt. Problmet er at jeg får komp. feil. "The type or namespace 'StringBuilder' could not be foud. Hva er galt?

 

du må ha med System.Text namespace. Skriv "using System.Text;" helt øverst i filen. Jeg har brukt LINQ for å den siste for løkken for å skrive ut. Krever .NET 3.5. Vet ikke om du får lov å bruke det i oppgaven din.

Lenke til kommentar

Takk for hjelpen the jackal. virker uansett ikke som det funka. Og det er skrevet på en helt annen måte enn en det vi lærer nå.

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class HeltallKombinasjoner : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
	int[] heltall = { 7, 2, 4, 5, 6, 6, 7, 8, 6, 7, 8, 5, 7, 5, 6, 6, 4, 6, 5, 4, 3, 5, 3, 2, 2, 3, 4, 5, 6, 7, 8, 9, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1 };
	int[] antall = new int[11];

	for (int i = 0; i < antall.Length; i++)
	{
		for (int j = i+1; j < antall.Length; j++)
		{
			if (heltall[i] == heltall[j])
			{
				labHeltall.Text += "Antall " + i + " er: " + heltall[j] + "<br />";
			}
		}
	}
}
}

Dette funker nesten. Får ut:

Antall 0 er: 7

Antall 0 er: 7

Antall 0 er: 7

Antall 1 er: 2

Antall 2 er: 4

Antall 3 er: 5

Antall 4 er: 6

Antall 4 er: 6

Antall 4 er: 6

Antall 5 er: 6

Antall 5 er: 6

Antall 6 er: 7

Antall 6 er: 7

Antall 7 er: 8

Antall 7 er: 8

Antall 8 er: 6

Antall 9 er: 7

Antall 10 er: 8

Lenke til kommentar

Koden min funker helt perfekt den egentlig, bare at den er tilpasset console og ikke web. Her er outputen:

 

1: 24,42

2: 1,23,25,41

3: 20,22,26,40

4: 2,16,19,27,39

5: 3,11,13,18,21,28,38

6: 4,5,8,14,15,17,29,37

7: 0,6,9,12,30,36

8: 7,10,31,35

9: 32,34

 

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

 

Uansett, din løsning fungerer ikke nesten egentlig. I den tallrekka forekommer 0 kun 1 gang, og skal dermed ikke skrives ut f.eks :) For å få til dette må du mellomlagre alle tallene i en egen liste som du etter for løkkene looper gjennom for å skrive ut.

Lenke til kommentar
Takk for hjelpen the jackal. virker uansett ikke som det funka. Og det er skrevet på en helt annen måte enn en det vi lærer nå.

Hva er skrevet på en annen måte egentlig?

C# er C# enten du skriver sånn eller slik

 

Tenker du kansje på at det ikke er klammeparanteser i IF testene hans? Det kommer i så fall at man kan forenkle koden sin hvis kunn en ting skal utføres i en IF. Du må huske på at { og } kunn markerer starten og sluttten på et SCOPE og har svert lite med IF å gjøre

if (test == svar)
{
 Heisan();
}

er akklurat det samme som

if (test == svar)
 Heisann();

Eneste forskjellen er at i det øverste eksemplet så kan du legge inn mere kode. I eksemplet under er det kunn Heisann() som blir kjørt. derfor:

if (test == svar)
 Heisann();
 Hoppsann();

Her vil Hoppsann() ALLTID bli kjørt, fordi det kunn er Heisann() som berøres av IF testen. Ut over dette så er koden hans rimelig lik din kode ;-)

Lenke til kommentar
Tentke mer på begkrepene han bruker her. Vi har aldri brukt, og det står ikke noe i boka om det, begreper som; Dictionary, console.write, Stringbuilder ++

 

Dictionary er bare en klasse, egentlig på lik linje som "Convert" som du bruker i originalkoden din bare at de brukes til forskjellige ting. Console og StringBuilder er forsåvidt også det, men brukes i litt forskjellige sammenhenger.

 

Console brukes stort sett for å skrive ut til konsollet hvis du lager en konsoll applikasjon. Siden du lager en web applikasjon så vil ikke denne klassen være noe særlig brukelig for deg, men du kunne byttet ut denne linjen med "labHeltall = builder.ToString();" og du ville fått resultatet som jeg skrev i min forrige post.

 

Grunnen til å bruke StringBuilder er fordi den er mer optimalisert for å bygge opp strenger. Det er blant annet fordi string klassen er såkalt immutable. Skal ikke gå innpå akkurat hva det er siden det sannsynligvis er et stykke utenfor ditt pensum.

 

Alt i alt består .NET av massevis av hjelpeklasser. Dette er egentlig bare noen av dem og du vil helt sikkert lære å bruke dem etterhvert. Det kan spare deg for massevis av tid.

Lenke til kommentar
Tentke mer på begkrepene han bruker her. Vi har aldri brukt, og det står ikke noe i boka om det, begreper som; Dictionary, console.write, Stringbuilder ++

 

Du, disse ordene du nevner har ingenting med C# å gjøre. Det er klasser i .NET biblioteket og dette biblioteket inneholder tusen vis av dem. Det betyr jo ikke at noe skrives på en annen måte en det dere lærer, men at svarene du får kansje er litt mere avanserte en nivået dere har kommet til på skolen.

 

Mange av oss her på forumet programmerer C# som levebrød og jeg kan garantere deg at svarene du får her vil være basert på "the way it should be" og ikke de typpiske skoleeksemplene. Dette fordi .NET er et så rikt bibliotek av funksjoner at det mest sansynligvis finnes en støtte for problemstillinger der allerede. Derfor, når man stiller et spørsmål om "hvordan gjør jeg det..." så vil svarene i 9 av 10 tilfeller være en eller annen .NET løsning og ikke en programerings løsning. Eksempelvis vil et spørsmål om hvordan du deler opp en komma separert streng baseres på SPLIT metoden til string klassen, og ikke en løkke som søker igjennom strengen.

fordelen ved dette er soleklar. Man lærer hvordan .NET fungerer.

Ulempen er også soleklar. Man lærer ikke program logikk

Lenke til kommentar

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...