9 svar
645 visningar
Malla2 5 – Fd. Medlem
Postad: 6 maj 2020 12:17

C# Söka igenom array efter dubletter innan värde läggs till array skapas.

Hej

Jag försöker lösa en uppgift där en användare lägger in ett antal nummer i en int array. Det ska bara vara möjligt att lägga till nya nummer som till hör en viss serie t ex 1 till 10. Hur löser jag att programmet söker igenom värdena som är tillagda hittills i arrayen när användaren skriver in ett nytt nummer? 

Obs jag har löst värderna som läggas in i arrayen är serien 1 till 10 via en if-sats och att användaren lägger in enbart siffror via try och catch och en bool-loop.

Lindehaven 820 – Lärare
Postad: 6 maj 2020 12:24

Du kan prova med metoden Contains(nya_numret) på din int array.

Malla2 5 – Fd. Medlem
Postad: 6 maj 2020 12:26

Tack! Mitt uppdrag är att lösa utan contains med loopar och  satser

Lindehaven 820 – Lärare
Postad: 6 maj 2020 13:14

Iterera genom din lista och om det nya numret finns där så lägg inte till det. Ungefär så här men inte färdigt:

foreach (int oldNumber in numberArray)
    if (newNumber == oldNumber)
        // Nej, lägg inte till det nya numret

Malla2 5 – Fd. Medlem
Postad: 6 maj 2020 13:27

Tack för din guidning, jag uppskattar den verkligen!

Jag jobbar på en foreach kod men när jag kollar i konsolfönstret så skriver den ut "meddelande" redan efter första körningen och om jag väljer en dublett i listan skriver den ut samma meddelande två ggr och efter tredje gången 3 ggr.

Konsolefönstret:

Vill du spela Lotto?
Välj 7 nummer mellan 1 och 25
Skriv in Nr 1: 5
Du kan inte välja samma tal, välj ett nytt!
Skriv in Nr 2: 5
Du kan inte välja samma tal, välj ett nytt!
Du kan inte välja samma tal, välj ett nytt!
Skriv in Nr 3: 5
Du kan inte välja samma tal, välj ett nytt!
Du kan inte välja samma tal, välj ett nytt!
Du kan inte välja samma tal, välj ett nytt!
Skriv in Nr 4:

Jag har skrivit denna kod (foreach koden är ligger som //kommentar under try):

static void Main(string[] args)
{
int[] ballsNrLottery = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };// En vektor där lotteriets nummer är inlagda index 0 till 24
int[] chosenNr = new int[7]; // En vektor som fylls med spelarens valda nummer index 0 till 6
Console.WriteLine("Vill du spela Lotto?");
Console.WriteLine("Välj 7 nummer mellan 1 och 25");

// Denna for-loop läser in spelarens 7 nummer i vektorn chosenNr


for (int i = 0; i < chosenNr.Length; i++)
{
bool loopChoseNrOK = true;
do
{
Console.Write($"Skriv in Nr {i + 1}: ");

try

{
chosenNr[i] = Convert.ToInt32(Console.ReadLine());
int chosenNrTemp = chosenNr[i];
loopChoseNrOK = false;
if (chosenNr[i] < 1 || chosenNr[i] > 25)
{

loopChoseNrOK = true;
Console.WriteLine("Du kan bara skriva talen 1 till 25 med siffror, Försök igen");
}


//foreach (int value in chosenNr)
//{
// if (chosenNrTemp == value)
// {
// loopChoseNrOK = false;
// Console.WriteLine("Du kan inte välja samma tal, välj ett nytt!");
// }
// else
// {

 

// }
//}
}
catch (Exception)
{
Console.WriteLine("Du kan bara skriva talen 1 till 25 med siffror, Försök igen");

}


} while (loopChoseNrOK);
}

 


// Denna for-loop skriver ut och bekräftar numren som spelaren valt
Console.Write("Här är dina valda nummer: ");
//Denna metod sorterar numren
Array.Sort(chosenNr);
int foo; //
for (int i = 0; i < chosenNr.Length; i++)
{
for (int j = 0; j < chosenNr.Length; j++)
{
if (chosenNr[i] < chosenNr[j])
{
foo = chosenNr[i];
chosenNr[i] = chosenNr[j];
chosenNr[j] = foo;
}
}

}
//Foreach loopen hämtar alla värden i vektorn chosenNr och skriver ut värdet på indes från 0 till 6
foreach (int value in chosenNr)
{
Console.Write($"{value} | ");
}

Lindehaven 820 – Lärare
Postad: 6 maj 2020 18:56

Det beror på att du först tilldelar chosenNr[i] ...

chosenNr[i] = Convert.ToInt32(Console.ReadLine());

... och sedan itererar hela chosenNr...

foreach (int value in chosenNr)

... där värdet redan lagts in.

Malla2 5 – Fd. Medlem
Postad: 7 maj 2020 16:21

Hej hänger inte riktigt med på det sista men har fått till en variant som funkar. Nu är jag i steg 2 i denna utmaning nu ska jag ta fram 7 nummer slumpvis. Se nedan. Det funkar men jag får fel på mina Randomnummer. Ibland blir ett av talen  0 och ibland får jag flera nollor och ibland funkar det. Jag ser inte vad felet är har provat sätta in värdet i stället för längden på Random men får samma resultat ????? Hoppas någon ser vad som är galet.

 

static void Main(string[] args)
{
int[] ballsNrLottery = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 };// En vektor där lotteriets valbaran ummer är inlagda index 0 till 25
int[] drawnNr = new int[7]; // En vektor som fylls med Random tal (ska motsvara vinnande nummer) valda nummer index 0 till 6
bool loopChoseNrOK = true;// denna loop gör att den kör antal önskat varv
do
{
for (int i = 0; i < drawnNr.Length; i++)// Startvärde O villkor sålänge i är mindre än drawnNr längd dvs 7 förändring + en.
{
loopChoseNrOK = false; // här är jag lite lost varför den står i false men det funkar
Random drawnNRTemp = new Random(); //Deklartion av Random variabel/eller det kanske är ett anrop till en metod??
int winningNr = drawnNRTemp.Next(ballsNrLottery.Length); //Deklaration av variabeln som jag tror ska hämta värdena från int variabel ballNrLottery högst upp
//int winningNr = drawnNRTemp.Next(1, 25);//Jag har även testat denna men får också här värde 0 ibland?

//Console.WriteLine("index" + winningNr); // Detta har jag försökt felsöka med

bool loopDubletter = true;//loop som har till uppgift att kolla om värdet användaren angett redan finns i vektorn (vilket innebär att användaren redan valt det numret).

foreach (int value in drawnNr)
{
if (winningNr == value)
{
loopDubletter = false;// Denna loopen kollar igenom vektorn "drawnNr" innehåller samma värde som det senaste inmatade "chosenNr Temp
loopChoseNrOK = true;// Denna loopen gör att när Random väljer samma nummer gör den ett extra val.??? Här blir det ibland 0
//Console.WriteLine("Detta nummer är redan valt, byt till ett annat");// Felsökningsinfo
}
}
if (loopDubletter == true)//if-satsen kollar om loopen är sann ska följande ske

{
drawnNr[i] = winningNr;//Numret som användaren angett finns inte i vektorn och lägg nu in i den.
}
}
} while (loopChoseNrOK);

 

 

// Denna for-loop skriver ut och bekräftar numren som spelaren valt
Console.Write("Här är vinnande raden: ");
//Denna metod sorterar numren
//Array.Sort(drawnNr);
int foo; //
for (int k = 0; k < drawnNr.Length; k++)
{
for (int j = 0; j < drawnNr.Length; j++)
{
if (drawnNr[k] < drawnNr[j])
{
foo = drawnNr[k];
drawnNr[k] = drawnNr[j];
drawnNr[j] = foo;
}
}

}
//Foreach loopen hämtar alla värden i vektorn chosenNr och skriver ut värdet på indes från 0 till 6
foreach (int value in drawnNr)
{
Console.Write($"{value} | ");
}


}

Lindehaven 820 – Lärare
Postad: 7 maj 2020 16:48

Metoden Next() ger ett slumptal i det värdeområde du anger som argument, exempel:

int winningNr = drawnNRTemp.Next(1, 26);

Malla2 5 – Fd. Medlem
Postad: 7 maj 2020 17:49

Jag testade den, men 0 dyker fortfarande upp ibland. Jag får även denna info.

C:\Users\Malla2\source\repos\ConsoleApp10\ConsoleApp10\bin\Debug\netcoreapp3.1\ConsoleApp10.exe (process 20400) exited with code 0.

Hänger det felmeddelandet ihop. Jag har försökt att stega igenom men ser inte vad som blir fel?

Lindehaven 820 – Lärare
Postad: 7 maj 2020 18:38

Att en process (en applikation) avslutas med kod 0 tyder på att den avslutades normalt. Med det sagt betyder det inte att applikationen nödvändigtvis fungerade korrekt.

Här är en ny idé. Eftersom du har lotteriets nummer sparade i en array så skulle du istället kunna nyttja metoden Shuffle() för att slumpa ordningen på de talen. Det behöver du göra endast en gång för varje dragning.

int[] ballsNrLottery = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 };

Random random = new Random();

random.Shuffle(ballsNrLottery);

När det är gjort kan du plocka ut de första 7 numren ur ballsNrLottery. Eftersom de har slumpats fram så bör det bli olika nummer vid varje dragning.

Fördelen med Shuffle() är att du slipper håller reda på om ett visst nummer dras fler gånger än en. Om du slumpar fram olika tal med Next(1, 26) så kan den metoden faktiskt slumpa fram samma tal som den gjort tidigare.

Svara Avbryt
Close