Nybörjarhjälp i programmering 1 C#

Permalänk
Medlem

Nybörjarhjälp i programmering 1 C#

Hej alla,

Jag pluggar just nu programmering 1 på distans och p.g.a brist på tid och andra omständigheter så har jag inte kunnat lägga ner den tid jag vill/behöver på programmeringen, vilket är sorgligt, då jag tycker att det är kul och det är nått jag vill lära mig. Jag borde enligt uppgiften kunna detta jag kommer att fråga om, men jag får inte till det, vilket gör mig oerhört frustrerad.

Pseudokoden enligt uppdraget ser ut såhär:
Fastställ en optimal temperatur
Fastställ godkänd minimi temperatur genom att ta bort 2 från optimal temperatur
Fastställ godkänd maximi temperatur genom att lägga till 2 från optimal temperatur

Repetera så länge användaren inte skrivit in en godkänd temperatur

Mata in temperatur

Om inmatad temp är lägre än lägsta godkända temperatur skriv ut ”Du har ställt in för låg temperatur”

Om inmatad temp är högre än högsta godkända temperatur skriv ut ”Du har ställt in för hög temperatur”

Skriv ut ”Du har ställt in en korrekt temperatur”

Koden jag har skrivit är följande:

int x = 80; int mini = x - 2; int maxi = x + 2; do { Console.WriteLine("Välkommen till bastun. Skriv in optimal temperatur: "); x = int.Parse(Console.ReadLine()); if (x < mini) { Console.WriteLine("Du har ställt in för låg temperatur: "); x = int.Parse(Console.ReadLine()); } else if (x > maxi) { Console.WriteLine("Du har ställt in för hög temperatur: "); x = int.Parse(Console.ReadLine()); } } while (x >= mini && x <= maxi); Console.WriteLine("Du har ställt in en korrekt temperatur"); Console.ReadKey();

Det som händer är att man ska skriva in en optimal temp, t.ex. 90. Då får jag meddelandet "Du har ställt in för hög temperatur: "
vilket är det jag vill. När jag sen skriver en annan temperatur så går den direkt till "Du har ställt in en korrekt temperatur", vilket jag inte vill att den ska göra. Jag vill ju att den ska börja om i loopen!

Kan någon vänlig själ förklara vad jag som nybörjare gör för fel? Hur löser jag mitt problem?

Permalänk
Hedersmedlem

Ta din pseudo-kod och lägger in som kommentarer i din kod. Se till att du bara gör det som pseudo-koden säger efter varje kommentar. Ser du något uppenbart?

Sedan är det nog lite knas med ditt while-uttryck. Du loopar så länge temperaturen är mellan mini och maxi, men det du vill göra är att loopa så länge den inte är mellan mini och maxi.

Visa signatur

Använd gilla för att markera nyttiga inlägg!

Permalänk
Medlem
Skrivet av giplet:

Ta din pseudo-kod och lägger in som kommentarer i din kod. Se till att du bara gör det som pseudo-koden säger efter varje kommentar. Ser du något uppenbart?

Sedan är det nog lite knas med ditt while-uttryck. Du loopar så länge temperaturen är mellan mini och maxi, men det du vill göra är att loopa så länge den inte är mellan mini och maxi.

Detta är det stora problemet här
Din while bör ser ut så här
while (x < mini || x > maxi);

Men sedan bör du också gör som @WarWolf.667 sade.

Men det "funkar" med den nya while uttrycket. Det är dock inte perfekt.

int x = 80; int mini = x - 2; int maxi = x + 2; do { Console.WriteLine("Välkommen till bastun. Skriv in optimal temperatur: "); x = int.Parse(Console.ReadLine()); if (x < mini) { Console.WriteLine("Du har ställt in för låg temperatur: "); } else if (x > maxi) { Console.WriteLine("Du har ställt in för hög temperatur: "); } } while (x < mini || x > maxi); Console.WriteLine("Du har ställt in en korrekt temperatur"); Console.ReadKey();

Permalänk
Medlem

Tack hörni! Ska pilla med detta och återkomma i tråden!

Permalänk
Medlem

Tror du förvirrar dig själv lite genom att återanvända variabeln x för att ta emot användarens input. Använd en separat variabel för det, och lär dig namnge variablerna bättre.

Permalänk
Medlem

Tack alla för era inputs! Det hjälpte mycket!

Mod kan låsa tråden..

Permalänk
Hedersmedlem
Skrivet av surmure:

Tack alla för era inputs! Det hjälpte mycket!

Mod kan låsa tråden..

Vi låser inte trådar bara föra att TS har fått sin fråga svarad på. Det finns en chans att någon läser tråden i framtiden och vill ställa en fråga i ämnet, då är det lämpligt att tråden är öppen istället för att personen kanske måste skapa en ny tråd.

Permalänk
Medlem

Hej igen!

Nu har jag ett annat problem. Jag ska skapa ett bingo spel där man fyller i 10 nummer mellan 1-25 i en vektor.
När man har gjort detta så ska 7 slumpnummer mellan 1-25 skapas, och dessa nummer ska sedan jämföras
mot de 10 nummer jag skrev in i början av programmet. Sedan ska programmet skriva ut antal rätt man har träffat.

Mitt program skrivet bara ut att jag får 0 rätt hela tiden, och det är uppenbart att jag har gjort någonting fel. Men var?

Här är min kod än så länge:

int count = 0; int[] bingo_chart = new int[10]; Console.WriteLine("Nu spelar vi Bingo, skriv in 10 nummer mellan 1-25"); for (int i = 0; i < bingo_chart.Length; i++) { int tmp = int.Parse(Console.ReadLine()); bingo_chart[i] = tmp; int[] slump_nummer = new int[7]; Random nummer = new Random(); bool upphittat = false; for (int n = 0; n < slump_nummer.Length; n++) { slump_nummer[n] = nummer.Next(1, 25); if (upphittat == true) { count++; } } } { Console.WriteLine("Du fick: " + count + " rätt"); Console.ReadLine(); }

Kan någon vara snäll att hjälpa mig?

Permalänk
Medlem
Skrivet av surmure:

Hej igen!

Nu har jag ett annat problem. Jag ska skapa ett bingo spel där man fyller i 10 nummer mellan 1-25 i en vektor.
När man har gjort detta så ska 7 slumpnummer mellan 1-25 skapas, och dessa nummer ska sedan jämföras
mot de 10 nummer jag skrev in i början av programmet. Sedan ska programmet skriva ut antal rätt man har träffat.

Mitt program skrivet bara ut att jag får 0 rätt hela tiden, och det är uppenbart att jag har gjort någonting fel. Men var?

Här är min kod än så länge:

int count = 0; int[] bingo_chart = new int[10]; Console.WriteLine("Nu spelar vi Bingo, skriv in 10 nummer mellan 1-25"); for (int i = 0; i < bingo_chart.Length; i++) { int tmp = int.Parse(Console.ReadLine()); bingo_chart[i] = tmp; int[] slump_nummer = new int[7]; Random nummer = new Random(); bool upphittat = false; for (int n = 0; n < slump_nummer.Length; n++) { slump_nummer[n] = nummer.Next(1, 25); if (upphittat == true) { count++; } } } { Console.WriteLine("Du fick: " + count + " rätt"); Console.ReadLine(); }

Kan någon vara snäll att hjälpa mig?

Du ska först få in 10 nummer i din vektor och kontrollera att dessa är mellan 1-25.
Du ska sedan generera 7 nummer mellan 1-25 i en annan vektor.
Du ska sedan iterera igenom din andra vektor och kolla om numret som genererades finns i den första vektorn, om numret finns öka din räknevariabel.

Det här har du inte gjort i din kod.

(Två fel du bör kolla på: du kollar om upphittat är sant fast den alltid är falsk, samt att du genererar en ny vektor varje gång användaren skriver in en ny siffra, den ska genereras efter)

Visa signatur

AW3423DW QD-OLED - Ryzen 5800x - MSI Gaming Trio X 3090 - 64GB 3600@cl16 - Samsung 980 Pro 2TB/WD Black SN850 2TB

Permalänk
Medlem

Titta en gång till var du räknar upp count, hur du kommer dit i koden och om du någonsin kan komma dit som koden ser ut nu. (Med reservation för att jag inte kan C#.)

Permalänk
Medlem

@celoz:

Tack för kommentarerna.
Ska kika på detta !

Permalänk
Medlem

Tur att tråden inte låstes ^^

Visa signatur

Chassi:FD Define S Moderkort:GB Z270 Gaming K3 CPU:i7 7700K Kylare:Noctua NH-D14 Nätagg:EVGA G2 650W RAM:Ballistix Sport DDR4 16GB GPU:Gigabyte 1050ti SSD:Intel 600P M.2 256GB Tangentbord:Func KB-460 MX Brown Mus:Steelseries Sensei Raw Ljud:M-Audio AV40 MK2
OS:Win10 Pro Laptop:MacBook Air M2 Mobil:iPhone 11 Pro Max

Permalänk
Medlem

Ett tips är att lära dig hur debuggern fungerar, vilket låter dig stega igenom programmet rad för rad och se vad som händer under körning. Se t.ex. denna sida för en kort introduktion.

Permalänk
Medlem
Skrivet av perost:

Ett tips är att lära dig hur debuggern fungerar, vilket låter dig stega igenom programmet rad för rad och se vad som händer under körning. Se t.ex. denna sida för en kort introduktion.

Tack för tipset

Permalänk
Medlem
Skrivet av surmure:

Mitt program skrivet bara ut att jag får 0 rätt hela tiden, och det är uppenbart att jag har gjort någonting fel. Men var?

int count = 0; int[] bingo_chart = new int[10]; Console.WriteLine("Nu spelar vi Bingo, skriv in 10 nummer mellan 1-25"); for (int i = 0; i < bingo_chart.Length; i++) { int tmp = int.Parse(Console.ReadLine()); bingo_chart[i] = tmp; int[] slump_nummer = new int[7]; Random nummer = new Random(); bool upphittat = false; for (int n = 0; n < slump_nummer.Length; n++) { slump_nummer[n] = nummer.Next(1, 25); if (upphittat == true) { count++; } } } { Console.WriteLine("Du fick: " + count + " rätt"); Console.ReadLine(); }

Dold text

Det blir problem när programmet varje gång måste slumpa 7 nummer för varje nummer du skriver.
Exempel: Du skriver 10, sedan slumpar programmet 2,7,1,10,22,16,12. Nästa nummer 24, slumpar; 6,3,12,18,19,25,1.
Som du förstår blir det väldigt svårt att få bingo då.

Här kommer nästa problem för att programmet skall öka "count" har du sagt "upphittat == true", och innan loopen sätter du det till "false", men där finns ingen kod som gör "false" till "true", det vill säga count kommer aldrig att öka.
Det är därför du får "0 rätt" hela tiden.

Som celoz skrev får man ändra om lite.

  • Separera ut funktionerna, och börja om.

  • Man kan dela upp programmet i 4 delar; 1.Dina Nummer; 2.Bingo Nummer; 3.Jämför; 4.Skriv ut antal rätt

  • En array för dina valda nummer; userArray[10]

  • En array för bingo nummerna; bingoArray[7]

  • Sedan kolla hur många av nummerna i "userArray" som existerar i "bingoArray"

  • Och om ett nummer stämmer öka count med 1

Ett exempel på hur man kan göra detta nedan

static int CheckCorrectCount(int[] userArray,int[] bingoArray) { int correctCount = 0; foreach (var number in userArray) { foreach (var exists in bingoArray) { if (number == exists) { correctCount++; } } } return correctCount; }

Dold text
Visa signatur

Dator: Ett metall chassi med varierande komponenter på insidan.

Permalänk

Bingo

Hej!
Det är nämligen så att även jag är fast i bingouppgiften, det känns som att koden ska vara färdig men när jag startar programmet så frågar den användaren att skriva in en siffra från 1-25 tio gånger och sedan stängs programmet ner direkt efter den tionde gången. Är en nybörjare när det gäller programmering och förstår inte riktigt vad jag har gjort för fel och varför spelas bara en del av koden upp, alltså den första delen?:/
Det skulle vara jätte snällt om någon i denna tråd kunde hjälpa mig!

int rätt = 0; int min = 1; int max = 25; bool uphittat = false; int[] bingobricka = new int [10]; for (int i = 0; i < bingobricka.Length; i++) { Console.WriteLine("Skriv in 10 tal till din bingo, talen skall vara mellan 1-25: "); int bingotal = Convert.ToInt32(Console.ReadLine()); bingobricka[i] = bingotal; } int[] nummer = new int[7]; Random randNum = new Random(); for (int j = 0; j < nummer.Length; j++) { { nummer[j] = randNum.Next(min, max); for (int i = 0; i < bingobricka.Length; i++) { if (bingobricka [i] == nummer) { uphittat = true; } if(uphittat == true) { rätt++; } } } { Console.WriteLine("Du fick: " + rätt + "rätt"); Console.ReadKey(); }

Permalänk
Medlem
Skrivet av bekkebekke:

Hej!
Det är nämligen så att även jag är fast i bingouppgiften, det känns som att koden ska vara färdig men när jag startar programmet så frågar den användaren att skriva in en siffra från 1-25 tio gånger och sedan stängs programmet ner direkt efter den tionde gången. Är en nybörjare när det gäller programmering och förstår inte riktigt vad jag har gjort för fel och varför spelas bara en del av koden upp, alltså den första delen?:/
Det skulle vara jätte snällt om någon i denna tråd kunde hjälpa mig!

int rätt = 0; int min = 1; int max = 25; bool uphittat = false; int[] bingobricka = new int [10]; for (int i = 0; i < bingobricka.Length; i++) { Console.WriteLine("Skriv in 10 tal till din bingo, talen skall vara mellan 1-25: "); int bingotal = Convert.ToInt32(Console.ReadLine()); bingobricka[i] = bingotal; } int[] nummer = new int[7]; Random randNum = new Random(); for (int j = 0; j < nummer.Length; j++) { { nummer[j] = randNum.Next(min, max); for (int i = 0; i < bingobricka.Length; i++) { if (bingobricka [i] == nummer) { uphittat = true; } if(uphittat == true) { rätt++; } } } { Console.WriteLine("Du fick: " + rätt + "rätt"); Console.ReadKey(); }

Testa dela in varje loop i en funktion. Enligt best practice bör en funktion göra en specifik sak. Se exempel nedan:

public static int[] GetUserInput() { Console.WriteLine("Skriv in 10 tal till din bingo, talen skall vara mellan 1-25: "); int[] bingobricka = new int[10]; for (int i = 0; i < bingobricka.Length; i++) { int bingotal = Convert.ToInt32(Console.ReadLine()); if (bingotal > 0 || bingotal < 26) { bingobricka[i] = bingotal; } else { Console.WriteLine("Ditt tal är inte mellan 1-25."); } } return bingobricka; }

Du kan även skapa en separat klass med funktionalitet och sedan instansiera den i din konstruktor. Det kan då se ut som följande:

static void Main(string[] args) { MyClass mc = new MyClass(); int[] myuserarr = mc.GetUserInput(); int[] myrandomarr = mc.GetRandom(); mc.Calculate(myuserarr, myrandomarr); }

Permalänk

@debben:

Fick till det nu men har bara en liten sak kvar som jag måste lägga in i koden men förstår inte hur och det är om man skriver in ett nummer som är under 1 och över 25 så ska det inte lagras utan användaren ska få ett nytt försök att skriva in 10 tal mellan 1-25.

Detta är koden jag har men måste bara får in det jag förklarade ovan in i koden :

int min = 1; int max = 25; int[] bingobricka = new int[10]; for (int i = 0; i < bingobricka.Length; i++) { Console.WriteLine("Skriv in 10 tal till din bingo, talen skall vara mellan 1-25: "); int bingotal = Convert.ToInt32(Console.ReadLine()); bingobricka[i] = bingotal; } int[] bingodragning = new int[7]; Random randNum = new Random(); for (int j = 0; j < bingodragning.Length; j++) { bingodragning[j] = randNum.Next(min, max); } { int correctCount = 0; foreach (var number in bingobricka) { foreach (var exists in bingodragning) { if (number == exists) { correctCount++; } } } { Console.WriteLine("Du fick: " + correctCount + "poäng"); Console.ReadKey(); } } } } }

Permalänk
Medlem
Skrivet av bekkebekke:

@debben:

Fick till det nu men har bara en liten sak kvar som jag måste lägga in i koden men förstår inte hur och det är om man skriver in ett nummer som är under 1 och över 25 så ska det inte lagras utan användaren ska få ett nytt försök att skriva in 10 tal mellan 1-25.

Detta är koden jag har men måste bara får in det jag förklarade ovan in i koden :

int min = 1; int max = 25; int[] bingobricka = new int[10]; for (int i = 0; i < bingobricka.Length; i++) { Console.WriteLine("Skriv in 10 tal till din bingo, talen skall vara mellan 1-25: "); int bingotal = Convert.ToInt32(Console.ReadLine()); bingobricka[i] = bingotal; } int[] bingodragning = new int[7]; Random randNum = new Random(); for (int j = 0; j < bingodragning.Length; j++) { bingodragning[j] = randNum.Next(min, max); } { int correctCount = 0; foreach (var number in bingobricka) { foreach (var exists in bingodragning) { if (number == exists) { correctCount++; } } } { Console.WriteLine("Du fick: " + correctCount + "poäng"); Console.ReadKey(); } } } } }

Om användaren måste börja om när denne skriver in ett tal som är < 1 eller > 25 måste du köra samma kod igen. Detta kallas rekursiv programmering.

Tänk dig att du har en funktion, liknande nedan:

public string GetUserInputRecursively() { string input = Console.ReadLine(); if(input != "Rekursiv") { Console.WriteLine("Du valde att inte köra rekursivt."); } else { GetUserInputRecursively(); } }

Det funktionen ovan gör är att kolla om användaren har matat in "Rekursiv", om användaren inte har gjort det så exekverar funktionen sig själv i else-blocket. (Dvs, körs igen).

Om du inte förstod är det bara fråga igen.

Permalänk

@debben:

Förstår faktiskt inte exakt hur och var jag ska lägga in den i koden jag har för närvarande, som sagt är jag ny i allt det här :/

int min = 1; int max = 25; int[] bingobricka = new int[10]; for (int i = 0; i < bingobricka.Length; i++) { Console.WriteLine("Skriv in 10 tal till din bingo, talen skall vara mellan 1-25: "); int bingotal = Convert.ToInt32(Console.ReadLine()); bingobricka[i] = bingotal; } int[] bingodragning = new int[7]; Random randNum = new Random(); for (int j = 0; j < bingodragning.Length; j++) { bingodragning[j] = randNum.Next(min, max); } { int correctCount = 0; foreach (var number in bingobricka) { foreach (var exists in bingodragning) { if (number == exists) { correctCount++; } } } { Console.WriteLine("Du fick: " + correctCount + "poäng"); Console.ReadKey(); } } } } }

Permalänk
Medlem

@bekkebekke:

Var ett tag sen jag höll på med C#, men nått sånt här, åt det hållet iallafall.

int min = 1; int max = 25; int[] bingobricka = new int[10]; for (int i = 0; i < bingobricka.Length; i++) { Console.WriteLine("Skriv in 10 tal till din bingo, talen skall vara mellan 1-25: "); int bingotal = CheckInput(); bingobricka[i] = bingotal; } int[] bingodragning = new int[7]; Random randNum = new Random(); for (int j = 0; j < bingodragning.Length; j++) { bingodragning[j] = randNum.Next(min, max); } { int correctCount = 0; foreach (var number in bingobricka) { foreach (var exists in bingodragning) { if (number == exists) { correctCount++; } } } { Console.WriteLine("Du fick: " + correctCount + "poäng"); Console.ReadKey(); } } } } }

Skapa metoden CheckInput int CheckInput() { while loop { läs input If satser som försöker göra om till int (int.TryParse) och kollar talets storlek. If sats = true, return If sats = false, fortsätt while-loop } }

[/quote]

Permalänk
Medlem

Måste alla 10 tal matas in på nytt, eller endast det talet som är fel?

Om endast det tal som är fel skall skrivas om så måste du göra två saker:
1. 'Hoppa tillbaka' ett steg i for-loopen, så att den inte går till nästa tal.
2. Eventuellt skippa koden som lagrar siffran.

1 löser du genom att bara ta bort ett från i. Något i stil med

for (int i = 0; i < bingobricka.Length; i++) { Console.WriteLine("Skriv in 10 tal till din bingo, talen skall vara mellan 1-25: "); int bingotal = CheckInput(); if(bingotal < 1 || bingotal > 25) i--; bingobricka[i] = bingotal; }

i-- i det här fallet motverkar i++ som körs varje varv i for-loopen, så att i har samma värde också nästa varv.

Du måste inte skippa resten av koden egentligen, då det inte gör något att du sparar ett felaktigt värde eftersom det ändå skrivs över nästa varv i och med i--. Vill du ändå skippa resten av koden kan du använda if och else, eller continue, som hoppar till nästa varv i for-loopen.

for (int i = 0; i < bingobricka.Length; i++) { Console.WriteLine("Skriv in 10 tal till din bingo, talen skall vara mellan 1-25: "); int bingotal = CheckInput(); if(bingotal < 1 || bingotal > 25) { i--; continue; } bingobricka[i] = bingotal; }

Permalänk
Medlem

Det största problemet är att du skriver att du vill lära dig och att programmering är roligt, men just nu lär du dig ingenting. Att klistra in vad andra har skrivit lär du dig ingenting av, då du inte förstår riktigt vad koden gör. Med tanke på hur "simpelt" uppgiften är borde du kunna lösa den genom att läsa lite tutorials på if-satser, loopar och funktioner.

Lär guider och lär dig på riktigt istället, annars kommer du köra fast big time i framtiden om du ska göra något mer avancerat.

Permalänk

Hej! Jag har en uppgift som jag har fastnat i helt och hållet. Har skapat ett program där man ska ta med vektorer, i detta fall ett föremål. Mitt problem är att när föremålet ska skrivas ut så återgår den till början och skriver då ut : System.String[] istället för föremålet som användaren matat in.
(Vet ej hur man gör PHP taggar)

Programmet (utan kommentarer):

string[] items = new string[1]; while (true) { Console.WriteLine("\n\tHej & välkommen!! "); Console.WriteLine("\n\t[1] Lägg till föremål" + "\n\t[2] Skriv ut föremål "); int number = Convert.ToInt32(Console.ReadLine()); if (number == 1) { Console.WriteLine("\n\tLägg till föremål: "); item = Console.ReadLine(); Console.WriteLine("\n\tVill du lägga till fler föremål?"); string input = Console.ReadLine(); bool add = input == "ja" || input == "Ja"; if (add) { Console.WriteLine("\n\tLägg till föremål: "); items[0] = Console.ReadLine(); } } if (number == 2) { Console.WriteLine("\tDu valde att lägga till: " + item); Console.WriteLine("\tAndra föremålet: " + items); } }

==========================================================

Jag tror att programmet går tillbaka till "string[] items = new string[1]; " även om jag har den innanför While-Loopen så blir det samma problem. Har skrivit till min Vikarie (läraren är sjuk) men han har inte svarat och uppgiften måste lämnas in idag.

Tacksam för snabba svar!

//L.K

La till code-taggar
Visa signatur

Define R4 | i5 4460k | ASUS Z97 | 8GB Corsair | Nvidia GeForce GTX960 | Samsung SSD 840 EVO 250GB | Dota2 | C#

Permalänk
Hedersmedlem
Skrivet av LadyKurczak:

Hej! Jag har en uppgift som jag har fastnat i helt och hållet. Har skapat ett program där man ska ta med vektorer, i detta fall ett föremål. Mitt problem är att när föremålet ska skrivas ut så återgår den till början och skriver då ut : System.String[] istället för föremålet som användaren matat in.
(Vet ej hur man gör PHP taggar)

Programmet (utan kommentarer):

string[] items = new string[1]; while (true) { Console.WriteLine("\n\tHej & välkommen!! "); Console.WriteLine("\n\t[1] Lägg till föremål" + "\n\t[2] Skriv ut föremål "); int number = Convert.ToInt32(Console.ReadLine()); if (number == 1) { Console.WriteLine("\n\tLägg till föremål: "); item = Console.ReadLine(); Console.WriteLine("\n\tVill du lägga till fler föremål?"); string input = Console.ReadLine(); bool add = input == "ja" || input == "Ja"; if (add) { Console.WriteLine("\n\tLägg till föremål: "); items[0] = Console.ReadLine(); } } if (number == 2) { Console.WriteLine("\tDu valde att lägga till: " + item); Console.WriteLine("\tAndra föremålet: " + items); } }

==========================================================

Jag tror att programmet går tillbaka till "string[] items = new string[1]; " även om jag har den innanför While-Loopen så blir det samma problem. Har skrivit till min Vikarie (läraren är sjuk) men han har inte svarat och uppgiften måste lämnas in idag.

Tacksam för snabba svar!

//L.K

Hjälpte dig med taggar.

Permalänk
Inaktiv

jag håller också på med bingouppgiften, detta är vad jag åstdakommit.. har lite strul. ska kommentera det bättre samt min catch går direkt till nästa tal att skriva in, vet inte om continue är rätt väg att gå. kanske ska ha en length-- somtriggas då? iaf här är koden:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace bingo { class Program { static void Main(string[] args) { //skapar vektorn bingorad int right = 0; int[] bingoRad = new int[10]; string[] positions = { "första", "andra", "tredje", "fjärde", "femte", "sjätte", "sjunde", "åttonde", "nionde", "tionde" }; //välkomst text Console.WriteLine(); Console.WriteLine("Välkommen till Console-Bingo!!"); Console.WriteLine(); Console.WriteLine("Skriv in dina 10 bingonummer mellan 1 och 25."); //for loppen for (int i = 0; i < bingoRad.Length; i++) { try { Console.WriteLine("Skriv in ditt {0} nummer:", positions[i]); int bingonr = int.Parse(Console.ReadLine()); bingoRad[i] = bingonr; } catch { Console.WriteLine("Använd siffror!"); //får ej till att fråga om samma bricknummer utan går vidare i loopen. inte heller om siffrar är under 0 eller över 25 vet inte om continue är rätt väg att gå här.. continue; } } //vektorn med de sju slumpade bingonummren int[] numbers = new int[7]; Random randmNr = new Random(); for (int r = 0; r < numbers.Length; r++) { // Slumpar numbers[r] = randmNr.Next(1, 26); } // går igenom de valda bingonummren och jämför med de slumpade for (int i = 0; i < bingoRad.Length; i++) { if (numbers.Contains(bingoRad[i])) { right++; } } { Console.WriteLine(); Console.WriteLine("### Du fick: {0} of 10 ###", right); Console.Write("Dina nummer:"); foreach (int number in bingoRad) { Console.Write(" {0}", number); } Console.WriteLine(); Console.Write("Vinnar nummer:"); foreach (int number in numbers) { Console.Write(" {0}", number); } Console.WriteLine(); Console.WriteLine("Tryck valfri tangent för att avsluta"); Console.ReadLine(); } } } }

Lagt in [code]-taggar //Mod
Permalänk
Medlem

@anon217901 Av vad jag kan se gör inte ditt continue statement något här. Vad continue gör är nämligen att hoppa över resten av koden i en for loop för att sedan fortsätta på nästa iteration. I detta fallet är det också sista raden i for loopen vilket gör att den inte gör något speciellt. Skulle du lägga något efter catch delen inom for loopen som ska hoppas över skulle du däremot behöva använda continue.

Edit: För att svara på frågan också (som jag förstod nu tror jag) så är du ute efter att minska i innan du är klar. Om du inte ska ha något mer i for loopen skulle jag byta ut 'continue;' mot 'i--;'. På detta sätt skulle den fråga om samma tal igen på nästa iteration. Om du sedan vill ha mer kod efter catch delen som inte ska köras om det blir catchat så bör du lägga in continue igen efter i--.

Permalänk
Inaktiv
Skrivet av AfterShock:

@yepsson Av vad jag kan se gör inte ditt continue statement något här. Vad continue gör är nämligen att hoppa över resten av koden i en for loop för att sedan fortsätta på nästa iteration. I detta fallet är det också sista raden i for loopen vilket gör att den inte gör något speciellt. Skulle du lägga något efter catch delen inom for loopen som ska hoppas över skulle du däremot behöva använda continue.

Edit: För att svara på frågan också (som jag förstod nu tror jag) så är du ute efter att minska i innan du är klar. Om du inte ska ha något mer i for loopen skulle jag byta ut 'continue;' mot 'i--;'. På detta sätt skulle den fråga om samma tal igen på nästa iteration. Om du sedan vill ha mer kod efter catch delen som inte ska köras om det blir catchat så bör du lägga in continue igen efter i--.

ok, så bort med continue, och ja du har rätt jag vill den ska fråga om samma fråga igen inte gå vidare till nästa.. skulle även vilja ha något som catchar om man skriver in ett tal under 0 eller över 25 då det enbart är dessa som slumpas.. Förslag på hur detta kan läggas upp?

Hur tycker du koden ser ut i övrigt?

Permalänk
Inaktiv
Skrivet av anon217901:

ok, så bort med continue, och ja du har rätt jag vill den ska fråga om samma fråga igen inte gå vidare till nästa.. skulle även vilja ha något som catchar om man skriver in ett tal under 0 eller över 25 då det enbart är dessa som slumpas.. Förslag på hur detta kan läggas upp?

Hur tycker du koden ser ut i övrigt?

Det gör du ju helst i koden där du kollar vad man matat in för nummer.

Ser också ett fel i din catch, du borde göra i-- i den så att man får försöka mata in samma nummer igen.

Kollar du numret man matade in är större än 0 men mindre än 26 kan du på samma vis göra i-- och fortsätta.

Permalänk
Medlem
Skrivet av anon217901:

ok, så bort med continue, och ja du har rätt jag vill den ska fråga om samma fråga igen inte gå vidare till nästa.. skulle även vilja ha något som catchar om man skriver in ett tal under 0 eller över 25 då det enbart är dessa som slumpas.. Förslag på hur detta kan läggas upp?

Hur tycker du koden ser ut i övrigt?

for (int i = 0; i < bingoRad.Length; i++) { try { Console.WriteLine("Skriv in ditt {0} nummer:", positions[i]); int bingonr = int.Parse(Console.ReadLine()); if (bingonr <= 0 || bingonr > 25) { Console.WriteLine("Talet måste vara större än 0 och mindre eller lika med 25"); i--; continue; } bingoRad[i] = bingonr; } catch { Console.WriteLine("Använd siffror!"); i--; } }

På ett ungefär så här hade jag lagt in en koll på om talet är inom rätt område. Du kan självklart byta ut 0 och 25 mot fördefinerade variabler för att öka modulariteten. Här använder jag också i-- för att loopen ska fråga om samma tal igen och här måste vi använda continue så den inte kör raden under 'bingoRad[i] = bingonr;' utan istället hoppar till nästa iteration. Detta borde fungera (inte testat) men jag hade personligen bytt ut det mot en while loop eftersom du har som krav att gå igenom varje tal på ett korrekt sätt innan du går vidare och på så sätt skulle du kunna föra samman ett par rader. Det hade inte krävts så mycket ändringar utan borde räcka med något i stil med

int bingoRadsNr = 0; while (bingoRadsNr < bingoRad.Length) { try { Console.WriteLine("Skriv in ditt {0} nummer:", positions[i]); int bingonr = int.Parse(Console.ReadLine()); if (bingonr <= 0 || bingonr > 25) { Console.WriteLine("Talet måste vara större än 0 och mindre eller lika med 25"); continue; } bingoRad[bingoRadsNr] = bingonr; bingoRadsNr++; } catch { Console.WriteLine("Använd siffror!"); } }

Poängen här är att istället för att backa tillbaka varje gång det blir fel gör vi istället så att vi går endast framåt de gånger det blivit rätt. Variabeln bingoRadsNr ersätter alltså i och incrementas endast när vi vet att siffran har förts in i vår array som tänkt.

Edit: Återigen, se det som pseudokod då jag inte testat den. Och som sidnot: Jag hade sedan flyttat ut det mesta ur try-catch delen då det inte är bra att ha kod i den som inte behöver 'prövas' men för att visa syftet med koden behåller jag det inom try delen.