PHP týden Předvánoční slevová akce
Pouze tento týden sleva až 80 % na PHP e-learning!
Využij předvánočních slev a získej od nás 20 % bodů zdarma! Více zde

Diskuze: Výběr z množiny

Aktivity (2)
Avatar
Richard Riči Šebek:28. listopadu 21:53

Tvořím aplikaci na procvičování převodů jednotek a vytvořil jsem množinu jednotek (zatím jen vzdálenost, ale chci více druhů), které se sami vybírají. Potřebuju aby se vygenerované jednotky nerovnaly, protože pak by příklad neměl smysl. Také potřebuji správně definovat vztah mezi jednotkami o kolik je daná jednotka vůči druhé menší/větší. Moc si s tím nevím rady, něco jsem hledal, něco jsem zkoušel... Doufám že mi tady poradíte :D

<!DOCTYPE HTML>
<html >
<head>

<title>Převodník jednotek</title>

</head>
<body>

<div id="container">
 <h1>Převodník jednotek</h1>

 <form action="#">
  <p>Převeď centimetry na metry. <br> Jako destinnou čárkou používej tečku.</p>
  <p>Příklad č. <a id="priklad">0</a></p>
  <input id="generated" type="text" readonly>
  <label id="zadani0"></label>
  <label> = </label>
  <input id="number" >
  <label id="zadani1"></label>
  <label id="spravny_vysledek" style="color:red;"></label>
  <label id="test"></label>
  <br>
  <p>Pokusy: <a id="pokus">0</a><br>
  Správně: <a id="spravne">0</a><br>
  Špatně <a id="spatne">0</a></p>
  <button id="button" type="button">Zkontrolovat</button>
  <br>
  <br>
  <button id="generovat" type="button">Generovat nový příklad</button>

 </form>
</div>

<script>

(function( d ) {
     d.getElementsByTagName( 'form')[0].reset();
     document.getElementById("generovat").addEventListener( "click" , generator );
     var priklad = 0;
     var pokus = 0;
     var spravne = 0;
     var spatne = 0;
     function generator(){
     priklad += 1;
     document.getElementById("priklad").innerHTML = priklad;

     var zadani = [
       "mm",
       "cm",
       "dm",
       "m",
       "km"
     ];

     var zadani0 = zadani[Math.floor(Math.random()*zadani.length)];
     var zadani1 = zadani[Math.floor(Math.random()*zadani.length)];
     if (zadani0 == zadani1) {
             zadani1 = zadani[0];
         }
     else if (zadani0 == zadani1) {
             zadani1 = zadani[2];
         }
     else {
         }

     d.getElementById("zadani0").innerHTML = zadani0;
     d.getElementById("zadani1").innerHTML = zadani1;
     d.getElementById( 'generated' ).value = Math.floor(( Math.random() * 10001 ) - 5000) / 10;
     d.getElementById("spravny_vysledek").innerHTML = "";
     d.getElementById("number").value = "";
     d.getElementById("test").innerHTML = "";
     };
     d.getElementById( 'button' ).addEventListener( 'click',
     function() {
     pokus += 1;
     document.getElementById("pokus").innerHTML = pokus;
                var x = d.getElementById( 'generated' ).value;
            var y = d.getElementById( 'number' ).value;
            var z = 1;
            var a = x / z;
            var jednotka = d.getElementById("zadani1").innerHTML;
         if ( a == y ) {
             text = "✔";
             vysledek = "";
             spravne += 1;
         }
         else {
             text = "✘";
             vysledek = "Správný výsledek je " + a + " " + jednotka;
             spatne += 1;
         }
         document.getElementById("test").innerHTML = text;
         document.getElementById("spravny_vysledek").innerHTML = vysledek;
         document.getElementById("spatne").innerHTML = spatne;
         document.getElementById("spravne").innerHTML = spravne;
         }, false );
}( document ));
</script>

</body>
</html>
 
Odpovědět
28. listopadu 21:53
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:29. listopadu 8:32
function $(id) {return document.getElementById(id);} // to by ti tam zjednodusilo praci...
function rnd(n) {return Math.floor(Math.random()*n);}
x = zadani.length; // nepouzivej opakovane pole.length, pokud ti zalezi na rychlosti
a = rnd(x)
b = rnd(x)
while (a==b) {b = rnd(x)} // jenze to muze provest treba 1-1000 opakovani takze by mozna bylo lepcejsi...
if (a==b) {b = (b+1+rnd(x-1)) % x}
// cili b+1, aby posun byl min +1
// rnd(x-1), aby posun nebyl max protoze by ses dostal na zacatek
// % x je zbytek po celeciselne deleni, to funguje tak, ze vraci f(cislo, x) = 0 az x-1 = (cislo/x - floor(cislo/x)) * x

Zkratka % funguje takto

x = 3
0 % 3 = 0
1 % 3 = 1
2 % 3 = 2 // 2/3 = 0, zbytek 2
3 % 3 = 0 // 3/3 = 1, zbytek 0
4 % 3 = 1
5 % 3 = 2

A ten posun

x = 3
a = 1
b = 1
---
b+1 = 2
rnd(x) kdyby ti vyslo 2, cili max hodnota
b+1+2 = 2+2 = 4
4 % 3 = 1 == a, coz se rovna puvodne 'a' a tos nechtel, tak proto rnd(x-1)
---
b + 1 proto, ze rdn vychazi i 0, takze by mohl nastat pripad
b + rnd(x-1) = b + 0
Editováno 29. listopadu 8:34
 
Nahoru Odpovědět
29. listopadu 8:32
Avatar
Jan Hlavatý
Člen
Avatar
Jan Hlavatý:29. listopadu 10:15

Ahoj, jen mě napadlo, jestli by nebylo jednodušší:
krok 1...zamíchat pole s jednotkama
krok 2. zadani 1...pole[0] zadani 2...pole[1]

 
Nahoru Odpovědět
29. listopadu 10:15
Avatar
Richard Riči Šebek:2. prosince 20:15

Díky za rady, vykoumal jsem to trošku jinak, ale pomohli jste mi. Ještě bych ale potřeboval nějak definovat vztahy mezi jednotkama. Ve smyslu že 1 m = 100 cm atd... Mám řešení s podmínkou, ale řekl bych že to je přímo prasácký xD. Uvítal bych rady :D

 
Nahoru Odpovědět
2. prosince 20:15
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:3. prosince 7:52

Pouzij tabulku osami x-x, to mi prijde jednoduche, prehledne, snadno doplnitelne treba o prevody u prace na joule-watt.
.001 = 1e-3
1000 = 1e3
1000000 = 1e6

 
Nahoru Odpovědět
3. prosince 7:52
Avatar
Odpovídá na Peter Mlich
Richard Riči Šebek:3. prosince 12:48

Jo, ty hodnoty takhle mám vymyšlený... Ale nevím teda o té tabulce, zkusím zagooglit, ale kdyby si mi ji dal třeba pro vzdálenost, byla by to ideálka :D

 
Nahoru Odpovědět
3. prosince 12:48
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:3. prosince 16:02

No, tabulku x-x. Nevim, jak to rici jinak. Bud mas tabulku x+radky nebo x-y nebo jinou. popisky z x pouzijes pro y. Jsem teda predpokladal asi mysle, ze umis tabulku zapsat do js array.

y\x    mm   cm  dm
mm  0       0.1  0.01
cm   10     0      0.1
dm   100  10       0

y = dm z jednotek
x = mm do jednotek
nasobek = tab[y][x] = 100

// zapisuje se to takto
// tab = []
// tab[2] = []
// tab[2][0] = 100
// nebo
// tab = []
// tab[2] = [100, 10, 0, 0.1]
// nebo
tab = [
[0, 0.1, 0.01],
[10, 0, 0.1, 0.01], // v podstate zkopirujes radek a pred prvni cislo napises nove; cisla na konci nemusis mazat
[100, 0, 0.1, 0.01] // posledni je bez carky
]
Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
 
Nahoru Odpovědět
3. prosince 16:02
Avatar
Odpovídá na Peter Mlich
Richard Riči Šebek:3. prosince 16:18

Já nejsem tak znalej :D ale díky za pomoc :D

 
Nahoru Odpovědět
3. prosince 16:18
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 8 zpráv z 8.