/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
while <= kan ikke regne?
Fra : Kurt Hansen


Dato : 04-07-02 12:22

<?
$tal = 1;
while ($tal <= 10) echo ++$tal." ";
?>

giver følgende output:

2 3 4 5 6 7 8 9 10 11

Hvorfor kommer 11 med, når jeg har bedt den om kun at fortsætte
sålænge $tal er mindre end eller lig med 10?

Venlig hilsen
Kurt Hansen

 
 
N/A (04-07-2002)
Kommentar
Fra : N/A


Dato : 04-07-02 16:01



Kurt Hansen (04-07-2002)
Kommentar
Fra : Kurt Hansen


Dato : 04-07-02 16:01

On Thu, 4 Jul 2002 13:36:07 +0200, Jesper Krogh wrote:

>In article <bnb8iuohrcvu7vfk3enostn09h6nbdqs5r@4ax.com>, Kurt Hansen wrote:
>> <?
>> $tal = 1;
>> while ($tal <= 10) echo ++$tal." ";
>> ?>
>>
>> giver følgende output:
>>
>> 2 3 4 5 6 7 8 9 10 11
>>
>> Hvorfor kommer 11 med, når jeg har bedt den om kun at fortsætte
>> sålænge $tal er mindre end eller lig med 10?
>
>fordi $tal hvor du tester er 10 også tæller du 10 en op til 11 og laver
>echo på den.

Ja undskyld, men det er altså lidt terapi til en newbie det her. Jeg
kan ikke tro andet, end at det volder andre nybegyndere vanskeligheder
at FORSTÅ hvad der der sker, så jeg vil tillade mig at trampe lidt
mere rundt i det. Man kommer jo ikke langt med bare at lære det udenad
- at sådan ER det bare.

>> <?
>> $tal = 1;
>> while ($tal <= 10) echo ++$tal." ";
>> ?>

Vi starter med at sætte variablen til værdien 1.
Dernæst sættes en løkke igang og den kører sålænge betingelsen om at
værdien må være mindre end eller lig med 10. Og så bliver jeg altså
knotten, når svinet alligevel slutter festligt af med at skrive 11.

Det første tal der udskrives må nødvendigvist blive 2, da
udgangspunktet er værdien 1, hvortil der som en start lægges 1. Og så
går det ellers slaw i slaw:

1 ++$tal =2 (tallet udskrives og vi validerer: betingelsen er opfyldt)
2 ++$tal =3 (tallet udskrives og vi validerer: betingelsen er opfyldt)
3 ++$tal =4 (tallet udskrives og vi validerer: betingelsen er opfyldt)
4 ++$tal =5 (tallet udskrives og vi validerer: betingelsen er opfyldt)
5 ++$tal =6 (tallet udskrives og vi validerer: betingelsen er opfyldt)
6 ++$tal =7 (tallet udskrives og vi validerer: betingelsen er opfyldt)
7 ++$tal =8 (tallet udskrives og vi validerer: betingelsen er opfyldt)
8 ++$tal =9 (tallet udskrives og vi validerer: betingelsen er opfyldt)
9 ++$tal =10 (tallet udskrives og vi validerer: betingelsen er
opfyldt)
10 ++$tal =11 (tallet udskrives og vi validerer: betingelsen er IKKE
opfyldt og processen stopper, men da er det for sent: tallet 11 er
allerede udskrevet).

Ahaaaa!!! Er det sådan det skal forståes? Tilgiv mig min
hjerteskærende naivitet.

Men prøv så lige at bide spids på denne her:

<?
$tal=1000;
while ($tal>=10) {
$tal=$tal/5;
echo $tal." ";
}
?>

Den udskriver "200 40 8" - igen en postgang for sent. Lad os lige
prøve samme recept som før:

$tal (1000) divideres med 5 (ny værdi for $tal er dermed 200). Tallet
200 udskrives til skærmen, vi kører tilbage og konstaterer at
betingelsen er opfyldt.

$tal (200) divideres med 5 (ny værdi for $tal er dermed 40). Tallet 40
udskrives til skærmen, vi kører tilbage og konstaterer at betingelsen
er opfyldt.

$tal (40) divideres med 5 (ny værdi for $tal er dermed 8). Tallet 8
udskrives til skærmen, vi kører tilbage og konstaterer at betingelsen
IKKE er opfyldt, hvorfor processen stopper, men da er det for sent:
tallet 8 er allerede udskrevet.

Nå ja, øf, øf, øf, det var bare lige lidt mere massage til de små grå.
Disse Fårevejle-løkker skal man jo bruge hele tiden, så det er jo
vigtigt at få principperne banket fast

Venlig hilsen
Kurt Hansen

Jesper Krogh (04-07-2002)
Kommentar
Fra : Jesper Krogh


Dato : 04-07-02 16:21

In article <2bm8iucdoc66nqavhhuv3ctkvsa4l3fu42@4ax.com>, Kurt Hansen wrote:
> Nå ja, øf, øf, øf, det var bare lige lidt mere massage til de små grå.
> Disse Fårevejle-løkker skal man jo bruge hele tiden, så det er jo
> vigtigt at få principperne banket fast

Og det har ovenkøbet den herlige effekt at det ikke kun er php, der har
det sådan, men alle programmeringssprog ( Jeg kender

Og god fornøjelse

--
../Jesper Krogh, jesper@linuxpusher.dk
webshop: http://www.linuxpusher.dk - Mandrake 8.2 PowerPack er nu i hus.


Kurt Hansen (04-07-2002)
Kommentar
Fra : Kurt Hansen


Dato : 04-07-02 17:11

On Thu, 4 Jul 2002 17:21:10 +0200, Jesper Krogh wrote:

>In article <2bm8iucdoc66nqavhhuv3ctkvsa4l3fu42@4ax.com>, Kurt Hansen wrote:
>> Nå ja, øf, øf, øf, det var bare lige lidt mere massage til de små grå.
>> Disse Fårevejle-løkker skal man jo bruge hele tiden, så det er jo
>> vigtigt at få principperne banket fast
>
>Og det har ovenkøbet den herlige effekt at det ikke kun er php, der har
>det sådan, men alle programmeringssprog ( Jeg kender
>
>Og god fornøjelse

Jo tak, faktisk er det en fornøjelig udfordring, men jeg kan godt
mærke, at jeg ikke er 18 år længere

Ud fra eksemplet:

>> <?
>> $tal = 1;
>> while ($tal <= 10) echo ++$tal." ";
>> ?>
>>
>> giver følgende output:
>>
>> 2 3 4 5 6 7 8 9 10 11

- er jeg nu klar over forskellen på ++$tal og $tal++. Fint nok, så er
DET problem jo løst.

At jeg dog ikke har fattet det væsentlige endnu, vidner det følgende
eksempel om. Med udgangspunkt i tallet 1000 vil jeg dividere med 5
indtil værdien når ned på 10. Jeg ønsker ikke tallet 1000 med i
outputtet - kun resultaterne af divisionerne. Derfor har jeg lavet en
do først og det går da osse fint, men den fortsætter sgu ud over
baglinien: 200 40 8 - og jeg gider altså ikke det 8-tal.

Hvilken løsning vil du foreslå? Her er min Fedtmule-kode:

<?
$tal=1000;
do {
$tal=$tal/5;
echo $tal." ";
}
while ($tal>=10);
?>

Venlig hilsen
Kurt Hansen

Regin Larsen (04-07-2002)
Kommentar
Fra : Regin Larsen


Dato : 04-07-02 18:17

Kurt Hansen wrote:
> Hvilken løsning vil du foreslå? Her er min Fedtmule-kode:
> <?
> $tal=1000;
> do {
> $tal=$tal/5;
> echo $tal." ";
> }
> while ($tal>=10);
> ?>

<?php
$tal = 1000;
while (($tal /= 5) > 10) echo $tal." ";
?>


--
Regin Larsen


Kurt Hansen (04-07-2002)
Kommentar
Fra : Kurt Hansen


Dato : 04-07-02 19:02

On Thu, 04 Jul 2002 19:16:44 +0200, Regin Larsen wrote:

>Kurt Hansen wrote:
>> Hvilken løsning vil du foreslå? Her er min Fedtmule-kode:
>> <?
>> $tal=1000;
>> do {
>> $tal=$tal/5;
>> echo $tal." ";
>> }
>> while ($tal>=10);
>> ?>

><?php
>$tal = 1000;
>while (($tal /= 5) > 10) echo $tal." ";
>?>

Pu-ha, dobbeltparanteser er jeg slet ikke kommet til endnu, men jeg
kan godt gennemskue konstruktionen. Elementært, men osse lidt genialt,
min gode Regin. Tak

Venlig hilsen
Kurt Hansen

Per Thomsen (05-07-2002)
Kommentar
Fra : Per Thomsen


Dato : 05-07-02 13:52


"Kurt Hansen" <kurt@towle.dk> wrote in message
news:ves8iu4lhiu4sijhdr9upk517ac2ffcb3l@4ax.com...
> On Thu, 4 Jul 2002 17:21:10 +0200, Jesper Krogh wrote:
>
[snip]
> At jeg dog ikke har fattet det væsentlige endnu, vidner det følgende
> eksempel om. Med udgangspunkt i tallet 1000 vil jeg dividere med 5
> indtil værdien når ned på 10. Jeg ønsker ikke tallet 1000 med i
> outputtet - kun resultaterne af divisionerne. Derfor har jeg lavet en
> do først og det går da osse fint, men den fortsætter sgu ud over
> baglinien: 200 40 8 - og jeg gider altså ikke det 8-tal.
>
> Hvilken løsning vil du foreslå? Her er min Fedtmule-kode:
>
> <?
> $tal=1000;
> do {
> $tal=$tal/5;
> echo $tal." ";
> }
> while ($tal>=10);
> ?>

Hvis det blot er spørgsmålet om at du ikke vil have skrevet tallet ud, så
byt lidt rundt på nogle statements og ændrer start-værdien.

<?php
$tal=200;
do {
echo $tal;
$tal = $tal/5;
} while( $tal>=10 );
?>

eller måske er det fordi du i virkelighenden vil have
den til at stoppe før $tal når helt <=10, f.eks.

<?php
$tal=200;
while( $tal>=50 ) {
echo $tal;
$tal=$tal/5;
}
?>

Her har jeg multipliceret slut værdien med 5, fordi
jeg i virkeligheden gerne vil have løkken til at stoppe
et skridt tidligere.

Svaret ligger altså ikke i hvorvidt du bruger do..while
eller while..do, men svaret ligger derimod i grænse-værdierne.

Jeg kan f.eks. også gøre det med en for løkke:

<?php
for($tal=200; $tal/=5; $tal>=50) {
echo $tal;
}
?>

MVH Per Thomsen
http://www.pert.dk/




Kurt Hansen (05-07-2002)
Kommentar
Fra : Kurt Hansen


Dato : 05-07-02 14:42

On Fri, 5 Jul 2002 14:52:05 +0200, Per Thomsen wrote:

>"Kurt Hansen" <kurt@towle.dk> wrote in message
>news:ves8iu4lhiu4sijhdr9upk517ac2ffcb3l@4ax.com...
>> On Thu, 4 Jul 2002 17:21:10 +0200, Jesper Krogh wrote:
>>
>[snip]
>> At jeg dog ikke har fattet det væsentlige endnu, vidner det følgende
>> eksempel om. Med udgangspunkt i tallet 1000 vil jeg dividere med 5
>> indtil værdien når ned på 10. Jeg ønsker ikke tallet 1000 med i
>> outputtet - kun resultaterne af divisionerne. Derfor har jeg lavet en
>> do først og det går da osse fint, men den fortsætter sgu ud over
>> baglinien: 200 40 8 - og jeg gider altså ikke det 8-tal.

>Hvis det blot er spørgsmålet om at du ikke vil have skrevet tallet ud, så
>byt lidt rundt på nogle statements og ændrer start-værdien.
>
><?php
> $tal=200;
> do {
> echo $tal;
> $tal = $tal/5;
> } while( $tal>=10 );
>?>

Okay, det virker, men kun ved at ændre startværdien.

>eller måske er det fordi du i virkelighenden vil have
>den til at stoppe før $tal når helt <=10, f.eks.
>
><?php
> $tal=200;
> while( $tal>=50 ) {
> echo $tal;
> $tal=$tal/5;
> }
>?>
>
>Her har jeg multipliceret slut værdien med 5, fordi
>jeg i virkeligheden gerne vil have løkken til at stoppe
>et skridt tidligere.

Outputtet bliver faktisk kun tallet 200, da du har sat
slutværdien/betingelsen til 50, hvorved tallet 40 udelukkes. Ved at
sætte slutværdien til f.eks. 30, får jeg så endelig det ønskede
resultat, nemlig et output der siger "200 40".

>Svaret ligger altså ikke i hvorvidt du bruger do..while
>eller while..do, men svaret ligger derimod i grænse-værdierne.

Det kan jeg godt se. På den anden side føler jeg mig lidt utryg ved,
at man ikke "bare" kan stille PhP en opgave der lyder:
"Lav en side der bliver ved med at dividere en variabel med 5 indtil
variablens værdi ikke kommer ned på 10, men ikke under".

I det foreliggende tilfælde med en startværdi på 1000 er det jo til at
overskue, men hvis det nu havde være start ved 237547 som skulle deles
med 9, hvilke start og slutværdier ville du så bruge i en
håndevending? Nu er dette jo et meget simpelt problem (og muligvis er
det endda kun mig der overhovedet gør det til et problem), men hvis
det bliver mere indviklet, kan det ikke være rimeligt at man skal
sidde og skønne nogle tillempninger, for at få outputtet til at passe.

Venlig hilsen
Kurt Hansen

Per Thomsen (05-07-2002)
Kommentar
Fra : Per Thomsen


Dato : 05-07-02 15:08


"Kurt Hansen" <kurt@towle.dk> wrote in message
news:g67biu8tklpk0iadqo3uakrc9q1ko470v4@4ax.com...
> On Fri, 5 Jul 2002 14:52:05 +0200, Per Thomsen wrote:
>
> >"Kurt Hansen" <kurt@towle.dk> wrote in message
> >news:ves8iu4lhiu4sijhdr9upk517ac2ffcb3l@4ax.com...
> >> On Thu, 4 Jul 2002 17:21:10 +0200, Jesper Krogh wrote:
> >>
[snip]
>
> >Hvis det blot er spørgsmålet om at du ikke vil have skrevet tallet ud, så
> >byt lidt rundt på nogle statements og ændrer start-værdien.
> >
> ><?php
> > $tal=200;
> > do {
> > echo $tal;
> > $tal = $tal/5;
> > } while( $tal>=10 );
> >?>
>
> Okay, det virker, men kun ved at ændre startværdien.
[snip]
> ><?php
> > $tal=200;
> > while( $tal>=50 ) {
> > echo $tal;
> > $tal=$tal/5;
> > }
> >?>
> >
> >Her har jeg multipliceret slut værdien med 5, fordi
> >jeg i virkeligheden gerne vil have løkken til at stoppe
> >et skridt tidligere.
>
> Outputtet bliver faktisk kun tallet 200, da du har sat
> slutværdien/betingelsen til 50, hvorved tallet 40 udelukkes. Ved at
> sætte slutværdien til f.eks. 30, får jeg så endelig det ønskede
> resultat, nemlig et output der siger "200 40".

doh! Det får man ud af ikke lige at teste ;)

>
> >Svaret ligger altså ikke i hvorvidt du bruger do..while
> >eller while..do, men svaret ligger derimod i grænse-værdierne.
>
> Det kan jeg godt se. På den anden side føler jeg mig lidt utryg ved,
> at man ikke "bare" kan stille PhP en opgave der lyder:
> "Lav en side der bliver ved med at dividere en variabel med 5 indtil
> variablens værdi ikke kommer ned på 10, men ikke under".

Jeg tillader mig lige at omskrive den sætning, til det jeg tror du mener ;)

"Lav en sider sider der bliver med ved at dividere en variabel med 5
sålænge værdien ikke er under eller lig med 10".

while( $tal>=10 ) {
$tal/=5;
}

Denne vil dividere tallet indtil det kommer under 10.
Problemet er her at divisionen ligger inden i {}-blokken, hvorimod det du
egentlig gerne vil er:

"Lav en side der bliver ved med at dividere en variabel med 5, sålænge
resultatet af denne divisioin ikke bliver under eller lig med 10".

while( ($tal/5)>=10) { $tal = $tal/=5; }

Som du jo så også så elegant fik den serveret i et andet indlæg :)

Nu ligger humlen altså i at vide, hvad det egentlig er du gerne vil, for
php gøre nemlig _præcis_ hvad du beder den om, og ikke hvad den
tror du mener. (Og sådan er med alle programmerings-sprog).

Jeg forsøger om jeg kan skære det ud i pap.

Du har sagt:
Tag et tal.
Divider dette tal med 5.
Hvis værdien er over 10 så start forfra.

Men det du mente er:
Tag et tal.
Hvis resultatet af dette tal divideret med 5 er over 10,
så divider taller med 5.

Ja, det blev mest bare pseudo kode, men jeg kan ikke gøre
det bedre lige nu. Jeg håber du forstår, hvad forskellen er.


MVH Per Thomsen,
http://www.pert.dk/




Søg
Reklame
Statistik
Spørgsmål : 177560
Tips : 31968
Nyheder : 719565
Indlæg : 6408952
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste