Kezdőoldal » Számítástechnika » Programozás » Mit kellene javítani, hogy...

2105as kérdése:

Mit kellene javítani, hogy jól fusson a program? (c#, rövid)

Figyelt kérdés

Alapjában véve eléggé rég programoztam , csak vissza kellene rázódnom, meg persze tanulni.

Fogalmam sincs mi lehet a probléma

a programnak az ötös lottót kellene szimulálni, és hogy kétszer egy számot ne húzzon ki:

Random rnd = new Random();

int[] nyer = new int [5];



for (int i = 0; i < 5; i++)

{

nyer[i] = rnd.Next(1,6);


int j = 0;

while(i != j)

{

if(nyer[i] == nyer[j])

{

nyer[i] = rnd.Next(1,6);

}

j++;

}



}



Console.Write("A nyerő számok : ");

for (int i = 0; i < nyer.Length; i++)

{

Console.Write("{0}\t",nyer[i]);

}



Console.ReadKey();



A program 1-5ig generál, ez csak tesztelésre csináltam és a végén 1,2,3,4,5 szám kellene kijöjjön (sorrend változás fennáll), majd javítom 1-90ig.

Nem igazán értem a feltételt.


2017. szept. 10. 21:26
 1/7 anonim ***** válasza:

Mármint a while cikluson belüli if feltételt nem érted?

Az aktuális indexig ellenőrzöd, hogy a korábbi indexeken előfordult-e már az aktuálisan generált érték. Ha igen, akkor az aktuális indexre generálsz egy új random értéket.

A probléma ezzel az, hogy másodszorra ugyanúgy generálhatsz egy már meg értéket. Amikor újragenerálsz, ismét a 0. indextől kellene ellenőrznid az akutális indexig.

2017. szept. 10. 21:44
Hasznos számodra ez a válasz?
 2/7 anonim ***** válasza:
*egy már meglévő értéket
2017. szept. 10. 21:44
Hasznos számodra ez a válasz?
 3/7 A kérdező kommentje:

if(...)

{

....

j = 0;

}


és a while végén még a j++ marad

próbáltam de így sem jó

ha erre gondoltál

2017. szept. 10. 21:48
 4/7 anonim ***** válasza:
100%

A halmaz (angolul: set) adatszerkezetet pont arra találták ki, hogy az ilyen ismétlődéseket kiszűrjék vele.


Random r = new Random();

HashSet<int> WinnerNumbers = new HashSet<int>();

while (WinnerNumbers.Count != 5) {

.. WinnerNumbers.Add(

.. .. r.Next(1, 100)

.. );

}


Ez addig fog számokat generálni, amíg nem lesz 5 darab különböző számod.

2017. szept. 10. 22:53
Hasznos számodra ez a válasz?
 5/7 sharkxxx ***** válasza:

using System;


namespace ConsoleTestApp {

  public class Program {

    public static void Main(string[] args) {

      Random rnd = new Random();

      int[] nyer = new int[5];

     

      for (int i = 0; i < 5; i++)

      {

        nyer[i] = rnd.Next(1,6);

       

        int j = 0;

        while (j < i)

        {

          if (nyer[i] == nyer[j])

          {

            nyer[i] = rnd.Next(1,6);

            j = 0;

          } else {

            j++;

          }

        }

      }

     

      Console.Write("A nyerõ számok : ");

      for (int i = 0; i < nyer.Length; i++)

      {

        Console.Write("{0}\t",nyer[i]);

      }

      Console.WriteLine();

     

      Console.ReadKey();

    }

  }

}

2017. szept. 10. 23:12
Hasznos számodra ez a válasz?
 6/7 anonim ***** válasza:

Erre van több egyszerű megoldás is, ami úgy generál ismétlések nélkül, hogy nem kell ismételni a randomgenerálást.


Dönthetsz úgy, hogy egy tömbben eltárolod az összes számot, sorban. Ezesetben az egyik legegyszerűbb, ámda picikét költségesebb megoldás, hogy összekevered a tömb elemeit, és kiválasztod az első 5-öt. Vagy:

Először kiválasztasz egy számot rendesen, 1-tól 5-ig (avagy 0-től 4-ig). Majd fogod, és azt az elemet, amit kisorsoltál, kicseréled a tömb első elemével. Ezután a következő számot 2-től 5-ig sorsolod, és az eredményt kicseréled a második elemmel. Így csinálod végig, aztán a tömb első 5 elemében megkapod a nyerő számaidat.


NAmost, ennek van az a hátulütője, hogy számon kell tartani az összes számot, ami nem feltétlenül tetszetős. Némi módosítással viszont ez a metodika átültethető olyan formába, ahol nem kell eltárolni a számokat. Az alapelv hasonló: kisorsols egy számot, feldolgozod, kisorsolod a következőt, eggyel nagyobb kezdőértéktől. A feldolgozás rész az, ami változik. Az én elképzelésemben a legegyszerűbb egy map (avagy Dictionary) használata <int,int> típusparaméterezéssel.


Minden húzáskor ellenőrzöd, hogy a kisorsolt számon szerepel-e érték a Dictionaryben. Ha nem, akkor felveszel egy új kulcs-érték párt benne, a kulcs a kihúzott szám, az érték pedig hogy hanyadik húzás. Ha szerepel, akkor a kihúzott számhoz eltárolt érték lesz az új kisorsolt szám. EZzel újra elvégzed az ellenőrzést a Dictionaryben, ha szerepel, akkor megint a kulcson levő értékre lecseréled, és addig foyltatod, amíg nem veszel fel új párt. Miután végeztél a sorsolással, a szótárban levő kulcsok lesznek a

kisorsolt számaid. Legrosszabb esetben is igencsak véges, és jól becsülhető lefutási ideje van. Ízlés szerint amúgy tovább optimalizálható még.


Kódot nem írok, ahhoz lusta vagyok, de ha valakinek van ekdve, öntse ezt át C#-ba :D

2017. szept. 11. 15:44
Hasznos számodra ez a válasz?
 7/7 A kérdező kommentje:
Köszönöm a válaszokat, aki az előre beépített függvényt írta annak is , csak próbálom előbb "alap esetekben" megérteni mielőtt már megírtat használnák.
2017. szept. 11. 19:23

Kapcsolódó kérdések:





Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!