Permalänk
Medlem

C#

Ja, trots att jag pluggat C# ganska mycket så kommer här en definitiv n00b fråga.

Anledning: Min lärare lärde inte ut om listor. //Bra lärare på gymnasiet (wooohooo!)

Problem:

Jag ska skapa ett program som har 3 kontroller för input, 3 textboxar. Dessa tar bara emot int tal (heltal). //Inga problem här än.
Dessa tre ska tippa chansen för förekomsten av tre alternativ i en list kontroll (treeview). De ska påverka en rad bland 13 redan existerande rader (1-13).
De ska += "1, x eller 0". Men enbart en i taget som inte redan är såpass lång eller inte blivit påverkad än. //Lite tvistat problem hittills.

Min kod ser ut som följande:

for (int i = 0; i < 14; i++) { indexFree.Add(i); } try { int _sannolikhet = Convert.ToInt32(textBox1.Text) + 1; // Hemma int xSannolik = Convert.ToInt32(textBox2.Text); // Oavgjort int sannolik = Convert.ToInt32(textBox3.Text); // Borta for (int i = 1; i < _sannolikhet; i++) { int chosen = indexFree[R.Next(0, indexFree.Count)]; treeView1.Nodes[indexFree[chosen]].Text += vinst[R.Next(0, 2)]; indexFree.RemoveAt(chosen); } } catch (Exception etc) { //Lite pepptalk MessageBox.Show("Du suger på programmering.\nHär är beviset: " + etc.Message); }

Det i for-loopen ska sedan implementeras för de två andra sannolikheterna men konstruerar en först.

Summering:

Programmet har 3 input. Dessa är int, de kan varieras av användaren till att påverka chansen av samtliga att förekomma i listan. Denna listan printas i en treeview.
Treeviewen ska visa alla resultat för 13 olika nodes. Dessa node formuleras med texten 1, x eller 0. De formuleras på det sätt visat ovan, inte optimalt men så det ser ut i nuläge.
Listan kommer fyllas direkt med de 13 olika nodes med korrekt svar direkt. Vi säger att vi fyller i 5, 3, 8 då kommer 8 vara: 0 och 3 st vara x och resterande vara 1.

Knapparna som används är en. Det är den som får all magi att ske.

Känner mig väldigt n00b som frågar om detta eftersom det är väldigt låg kompetens nivå på detta programmet egentligen men som sagt har jag inte invänt hos min lärare eller lärt mig det på egen hand utan betar igenom det nu för att lära mig mer.

De krävs inte 3 olika for loops utan kan även lösas på annat sätt.

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
AzireVPN - Felkod40

Permalänk
Medlem

Börjar med att säga att jag kan mycket väl vara helt ute och cycklar men blir det inte fel om man har samma int i 2 for loopar?

Permalänk
Medlem
Skrivet av Erniaa:

Börjar med att säga att jag kan mycket väl vara helt ute och cycklar men blir det inte fel om man har samma int i 2 for loopar?

Anser detsamma men så ser tyvärr situationen ut, däremot skulle ju en större loop se bättre ut, både ur mitt och andras perspektiv. Sen kan inte den konflikten uppstå eftersom att efter loopen tas variabeln bort ur listan.

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
AzireVPN - Felkod40

Permalänk
Skrivet av Erniaa:

Börjar med att säga att jag kan mycket väl vara helt ute och cycklar men blir det inte fel om man har samma int i 2 for loopar?

Nej eftersom variabler endast existerar inom de block de är skapade i. Hade den första for-loopen täckt den andra så hade det varit som du säger.

Förresten tycker det ser konstigt ut när man börjar loopen på 1. Jag har alltid börjat på 0 då kod är uppbyggt på det sättet.
Skulle även vara bra om du kunde förklara ditt problem bättre, förstår inte riktigt vad du menar.

Permalänk
Medlem
Skrivet av RottingRhubarbs:

Nej eftersom variabler endast existerar inom de block de är skapade i. Hade den första for-loopen täckt den andra så hade det varit som du säger.

Förresten tycker det ser konstigt ut när man börjar loopen på 1. Jag har alltid börjat på 0 då kod är uppbyggt på det sättet.

Precis. Men grejen är den att den börjar på 1 istället för att annars behöver jag modifiera första node'n till att ha nummer 1, vilket bara blir anständigare än att påbörja listan på 1 istället. Bättre beskrivning under "summering". Alla listor börjar på 0 och det gör den automatiskt men om jag fyller med loop står det 0: det kan inte förekomma något i 0. Vi kan inte t.ex. säga att dag: 0 ska vi bygga en bäverdamm.

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
AzireVPN - Felkod40

Permalänk
Skrivet av freddyfresh:

Precis. Men grejen är den att den börjar på 1 istället för att annars behöver jag modifiera första node'n till att ha nummer 1, vilket bara blir anständigare än att påbörja listan på 1 istället. Bättre beskrivning under "summering". Alla listor börjar på 0 och det gör den automatiskt men om jag fyller med loop står det 0: det kan inte förekomma något i 0. Vi kan inte t.ex. säga att dag: 0 ska vi bygga en bäverdamm.

Okej, du menar så

Permalänk
Medlem
Skrivet av RottingRhubarbs:

Okej, du menar så

Ursäktar förvirringen

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
AzireVPN - Felkod40

Permalänk
Medlem

Ett tips är att istället för Convert.ToInt32() så använd int.TryParse() istället, så slipper du try catch.

Permalänk
Medlem
Skrivet av freddyfresh:

Ursäktar förvirringen

Jag är också förvirrad, förstår inte på din exempelkod vad du försöker göra.

Vad innehåller variabeln vinst? Jag gissar på strängarna "1", "x" och "0" men det är inte jättetydligt.
Var används xSannolik och sannolik?
Och återigen, vad är poängen med att låta indexet börja på 1? Värdena i indexFree läggs aldrig till någonstans, menar du att första noden i trädet ligger på index [1]?

Varför är du en dålig programmerare om användaren av programmet skriver in "korv" i ett textfält avsett för siffror?

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av Teknocide:

Jag är också förvirrad, förstår inte på din exempelkod vad du försöker göra.

Vad innehåller variabeln vinst? Jag gissar på strängarna "1", "x" och "0" men det är inte jättetydligt.
Var används xSannolik och sannolik?
Och återigen, vad är poängen med att låta indexet börja på 1? Värdena i indexFree läggs aldrig till någonstans, menar du att första noden i trädet ligger på index [1]?

Varför är du en dålig programmerare om användaren av programmet skriver in "korv" i ett textfält avsett för siffror?

1: Sant, vinst är en lista med variabler som är 1, x, 0.
2: de tre variablerna är de tre textboxarnas inlästa värde
3: Om jag börjar på 0, så är det fel, det ska inte stå 0 för i detta fall kan inte något börja från noll för då kommer det stå: (exempelvis) "Match nr 0", det finns ingen noll. Bara 1-13, och igen, modifiera node 0 till att inte stå 0 är en möjlighet.
4: De läggs till genom denna koden (verkar ha exkluderat de):

indexFree.Clear(); for (int i = 0; i < 14; i++) { indexFree.Add(i); }

5: sant, men det kommer ändras (Korv). Men egentligen inte nödvändigt att göra något annat än en tom exception för en catch.

Fail är att den ska inte välja samma index två gånger, den ska inte bara ta 2 i taget och om jag säger 10st i första, 2 i andra och 1 i sista så ska det bli: 10x 1; 2x X; 1x 0. Men det funkar inte.

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
AzireVPN - Felkod40

Permalänk
Medlem

Med det upplägg du har idag:

// Shuffle från http://stackoverflow.com/questions/273313/randomize-a-listt-i... public static void Shuffle<T>(this IList<T> list) { Random rng = new Random(); int n = list.Count; while (n > 1) { n--; int k = rng.Next(n + 1); T value = list[k]; list[k] = list[n]; list[n] = value; } } int chance1; int chanceX; int chance0; int.TryParse(textBox1, out chance1); int.TryParse(textBox2, out chanceX); int.TryParse(textBox3, out chance0); if (chance1 + chanceX + chance0 == 13) { var foo = new List<string>(); foo.AddRange(Enumerable.Repeat("1", chance1)); foo.AddRange(Enumerable.Repeat("X", chanceX)); foo.AddRange(Enumerable.Repeat("0", chance0)); foo.Shuffle(); for (int i=0; i<foo.Count; i++) { treeView1.Nodes[i].Text += foo[i]; } } else { // felaktig input }

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem

...

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
AzireVPN - Felkod40

Permalänk
Medlem
Skrivet av freddyfresh:

Fick modifiera din kod lite men funkar nu. ...

Om chance1 + chanceX + chance0 == 13 så kommer Foo.Count alltid vara större än 0, if(Foo.Count > 0)-kollen är meningslös. Vad är det du try-catchar? Varför har du med indexFree? Den används aldrig (till något vettigt).

Det är rätt att Shuffle måste vara en extensionmetod, men den behöver inte ligga i en partial-klass.

edit: sträng-till-int-konverteringen kan göras bättre ser jag nu. Det testas aldrig om textboxarna innehåller negativa värden.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av Teknocide:

Om chance1 + chanceX + chance0 == 13 så kommer Foo.Count alltid vara större än 0, if(Foo.Count > 0)-kollen är meningslös. Vad är det du try-catchar? Varför har du med indexFree? Den används aldrig (till något vettigt).

Det är rätt att Shuffle måste vara en extensionmetod, men den behöver inte ligga i en partial-klass.

edit: sträng-till-int-konverteringen kan göras bättre ser jag nu. Det testas aldrig om textboxarna innehåller negativa värden.

indexFree används egentligen bara för att slumpa ett index mellan 0-13 genom i, sen det övriga stämmer.
Kan inte direkt komma upp med en egen bättre lösning...

Applikationen fungerar iaf för tillfället och utför exakt vad jag hade i tanke att den skulle göra. Nu får man bara finslipa hur den gör det

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
AzireVPN - Felkod40

Permalänk
Medlem
Skrivet av freddyfresh:

indexFree används egentligen bara för att slumpa ett index mellan 0-13 genom i, sen det övriga stämmer.
Kan inte direkt komma upp med en egen bättre lösning...

Applikationen fungerar iaf för tillfället och utför exakt vad jag hade i tanke att den skulle göra. Nu får man bara finslipa hur den gör det

indexFree innehåller talen 0 till 13 i den ordningen (14 nummer, ett för mycket)

0 1 2 3 4 5 6 osv

När du anropar indexFree[i] så hämtar du värdet på position i:

indexFree: 0 1 2 3 4 5 6 ... för i: 0 1 2 3 4 5 6

indexFree är med andra ord meningslös.
(och Foo.Count > 0 kommer alltid att vara sant inne i if-satsen som tidigare sagts)

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av Teknocide:

Har redan tagit bort Foo.count > 0 eftersom jag insåg att den var värdelös då den alltid kommer vara högre än 0 då användaren inte får ange något annat än något som resulterar i talet 13 tillsammans. Har även lagt till fler if-satser för felkontrollering och för att kolla värdena.

Sant, vad ska man då ersätta indexFree med då programmet för tillfället är beroende av den?

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
AzireVPN - Felkod40

Permalänk
Medlem
Skrivet av freddyfresh:

Sant, vad ska man då ersätta indexFree med då programmet för tillfället är beroende av den?

Ersätt den med 'i': treeView1.Nodes[i].Text = ...

Visa signatur

Kom-pa-TI-bilitet