Gå til innhold

PHP-terningskast feil


Anbefalte innlegg

Hei

 

Leker meg litt med PHP og prøvde å lage et enkelt terningskast-script som kaster en terning 100 ganger og skriver ut hvor mange det er av hver. Men det er tydeligvis noe feil med koden:

 


<?php
function dice()
{
	for($i = 0; $i < 100; $i++)
	{
		switch(rand(0, 5))
		{
			case 0: $en++;
			case 1: $to++;
			case 2: $tre++;
			case 3: $fire++;
			case 4: $fem++;
			case 5: $seks++;
		}	
	}
	return "Antall énere: " . $en . "<br/>" . 
      		"Antall toere: " . $to . "<br/>" . 
      		"Antall treere: " . $tre . "<br/>" . 
      		"Antall firere: " . $fire . "<br/>" . 
      		"Antall femere: " . $fem . "<br/>" . 
      		"Antall seksere: " . $seks . "<br/>";
}
echo dice() . "<br/>Noe feil...";
?>

 

 

Du kan se scriptet i aksjon her, som oppgave 5.6.

 

Må jeg f. eks ha med break her egentlig?

Lenke til kommentar
Videoannonse
Annonse

Damn raske svar, takker! :-D

Akkurat nå lurer jeg dog på hvorfor jeg ikke prøvde break først når jeg spurte :whistle:

Var vel litt det at jeg er vant med switch og break, men jeg tenkte litt som slik at kanskje det kunne gå uten break mtp. casene ikke var like på noen måte.

Og bruk av arrays kunne forenklet koden din en del. ;)

Beklager at jeg er litt treig, men har kun erfaring fra Java og er litt uvant med slik arrays ofte settes opp i PHP, så om du kunne illustrert hadde det vært fint : )

Endret av Occi
Lenke til kommentar

Blir som med java:

 

java.util.Random gen = new java.util.Random();

int[] terningsFrekvens = new int[6];

for(...)

terningFrekvens[gen.nextInt(6)]++;

 

Tar jeg ikke feil trenger man ikke deklarere arrayet i PHP engang (Er litt rusten på den)

 

//Vet ikke om denne er nødvendig

for($i = 0; $i < 6; $i++)

$terning[$i] = 0;

 

for(...)

$terning[rand(0, 5)]++;

Endret av Zic0
  • Liker 1
Lenke til kommentar

Tar jeg ikke feil trenger man ikke deklarere arrayet i PHP engang (Er litt rusten på den)

Riktig :-)

 

Og takk Zic0, akkurat det jeg trengte for å komme på hvordan jeg burde gjøre det :-)

 

Har nemlig gjort dette med terning tidligere, men fant ikke .java-filen, så klarte jeg ikke å se for meg hvordan det var best å løse det.

 

Har også effektivisert koden endel:

 

<?php
function dice()
{
	for($i = 0; $i < 100; $i++)
	{
		$roll[rand(0,5)]++;	
	}
	for($i = 0; $i < 6; $i++)
	{
		echo "Antall " . ($i + 1) . "ere = " . $roll[$i] . "<br/>";
	}
}
echo dice();
?>

 

Det jeg dog lurer på: Jeg tror jeg har sett en innebygd funksjon i PHP som teller opp antall variable for hver index i en array, og returnerer dette, men jeg husker ikke navnet og klarer ikke å Google. Er dette bare noe tull som jeg kanskje innbiller meg? :p

 

Da kunne det jo vært noe slik som dette under, som hadde gjort det enda kortere.

 

echo "Antall " . ($i++ + 1) . "ere = " . tellOpp($roll[]);

Endret av Occi
Lenke til kommentar

Takk skal du ha Thomas., er garantert kjekt til seinere bruk, men er litt usikker på om det vil gjøre denne koden kortere. Prøvde med en str_repeat, men den reagerte visst ikke på f. eks $j++

Endret av Occi
Lenke til kommentar
  • 3 uker senere...

Såvidt jeg kan se så var det lite å gjøre, men så noen vanlige "feil" :)

function dice() {
for($i = 1; $i <= 100; $i++) {
	$roll[rand(1,6)]++;     
}
for($i = 1; $i <= 6; $i++) {
	echo "Antall {$i}-ere = {$roll[$i]} <br/>";
}
}
echo dice();

Lenke til kommentar

Regner med det bare er en liten glipp fra din side, tROOP4H, men det er ingen grunn til å kalle dice() med echo, da den ikke returnerer noe :)

 

Forøvrig kan det være greit å ikke ha <br/> på den siste linjen man printer.

echo "Antall {$i}-ere = {$roll[$i]}" . (($i % 6) ? "<br/>" : "");

Lenke til kommentar

Regner med det bare er en liten glipp fra din side, tROOP4H, men det er ingen grunn til å kalle dice() med echo, da den ikke returnerer noe :)

 

Forøvrig kan det være greit å ikke ha <br/> på den siste linjen man printer.

echo "Antall {$i}-ere = {$roll[$i]}" . (($i % 6) ? "<br/>" : "");

 

Ja, det er helt sant :) Vandt med å benytte meg av return() i funkjoner :)

Endret av tROOP4H
Lenke til kommentar

Må jeg f. eks ha med break her egentlig?

Du har allerede fått svar, men for å utdype: switch-case er såkalt fall-through. Bra forklart i manualen:

It is important to understand how the switch statement is executed in order to avoid mistakes. The switch statement executes line by line (actually, statement by statement). In the beginning, no code is executed. Only when a case statement is found with a value that matches the value of the switch expression does PHP begin to execute the statements. PHP continues to execute the statements until the end of the switch block, or the first time it sees a break statement. If you don't write a break statement at the end of a case's statement list, PHP will go on executing the statements of the following case.

http://php.net/manual/en/control-structures.switch.php

  • Liker 1
Lenke til kommentar
Det jeg dog lurer på: Jeg tror jeg har sett en innebygd funksjon i PHP som teller opp antall variable for hver index i en array, og returnerer dette

Du har array-count-values

<?php
$dice = array(1, 1, 5, 5, 4, 6);
print_r (array_count_values($dice));
?>
//Array ( [1] => 2 [5] => 2 [4] => 1 [6] => 1 ) 

Et terningskast med python.

>>> from collections import Counter
>>> print Counter([randint(1,6) for i in range(100)])
Counter({1: 20, 2: 19, 5: 18, 3: 16, 4: 15, 6: 12})

En grei løsning med collections Counter som er ligner på array-count-values i PHP.

Bruker list comprehension som er rimlig vanlig og bruke i python.

Bryter man opp list comprehension blir det sånn.

l = []
for i in range(100):
   l.append([randint(1,6))
print l

collections Counter virker fra pyton 2.7 -->

Eller så har det vært mest vanlig i python og bruke dictionary for og telle elementer.

>>> d = {}
>>> dice = [randint(1,6) for i in range(100)]
>>> d = {}
>>> for v in dice: d[v] = d.get(v, 0) + 1
>>> print d
{1: 11, 2: 20, 3: 19, 4: 17, 5: 12, 6: 21}

>>> #Eller på en line
>>> print dict((k, dice.count(k)) for k in set(dice))
{1: 11, 2: 20, 3: 19, 4: 17, 5: 12, 6: 21}

  • Liker 1
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...