[PHP] Wiskundig probleem

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ik heb drie waardes, a,b en c die vastliggen. Nu heb ik een variabele d waarvan ik wil weten waar die het dichts bij zit (a, b of c). Wanneer d precies tussen twee waardes inzit, wil ik de hoogste terughebben. Helaas heb ik nooit zo goed opgelet tijdens wiskunde vroeger maar heb het volgende stukje code:

PHP:
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
if ($CurRes = $HTTP_GET_VARS['id']){
    $check = rescheck($CurRes);
    echo $check;
}
function rescheck($CurRes){
    $a = "800";
    $b = "1024";
    $c = "1600";
    $d = $CurRes;
    $x1 = abs($d - $a);
    $x2 = abs($d - $b);
    $x3 = abs($d - $c);
    switch ($d){
        case ($d < $a):
            return $a;  
            break;
        case ($d > $c):
            return $c;
            break;
        case ($x1 < $x2):
            if ($x1 == $x2){ // $d zit precies in het midden van a en b, dan wil ik b
                return $b;  
            }
            else{
                return $a;
            }
            break;
        case ($x2 < $x3):
            if ($x2 == $x3){ // $d zit precies in het midden van b en c, dan wil ik c
                return $c;  
            }
            else{
                return $b;
            }
            break;

        case ($x2 < $x3):
            return $b;
            break;
        default:
            return $c;
    }
}


Dit werkt maar ik vraag me af of er handiger manieren zijn om dit te doen. Ik wil graag zo efficient mogelijk leren coden dus vandaar mijn vraag.

Acties:
  • 0 Henk 'm!

  • Sosabowski
  • Registratie: Juni 2003
  • Laatst online: 18-09 21:03

Sosabowski

nerd

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?
if ($CurRes = $HTTP_GET_VARS['id']){ 
    $check = rescheck($CurRes); 
    echo $check; 
} 
function rescheck($CurRes){ 
    $a = "800"; 
    $b = "1024"; 
    $c = "1600"; 
    $d = $CurRes; 

    if ($d < ($a+$b)/2) { 
      return $a;
    } elseif ($d < ($b+$c)/2) {
      return $b;
    } else {
     return $c; 
    }
}
?> 


toch niet zo moeilijk?

[ Voor 25% gewijzigd door Sosabowski op 05-03-2004 11:07 . Reden: het kon nog simpeler! ]

The whole problem with the world is that fools and fanatics are always so certain of themselves, and wiser people so full of doubts. -- Bertrand Russell


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Die switch in je code is vrij zinloos volgens mij, omdat je hem verder niet gebruikt in je cases.
Verder heb je meerdere dingen die allemaal hetzelfde returnen (2x return $a, 2x return $b, enz), als je dat eens samenpakts in 1 vergelijking is het al een stuk compacter.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

Ik ken geen PHP, maar gelukkig kan ik wel programmeren....

Als je nu je grenzen eens anders legt..
dus niet op 800, 1024 of 1600, maar op de waarde die je eigenlijk gebruikt ( de waarden halverwege tussen A, B en C )

dus
911 (dat is ( (800 + 1024) / 2) - 1) als uiterste grens voor A
1311 (dat is ( (1024 + 1600) / 2) - 1) als uiterste grens voor B
1600 als uiterste grens voor C

Dan wordt je case een stuk eenvoudiger, lijkt me...

[edit] IorGie was me al voor, maar dat is exact wat ik bedoel.....

[ Voor 8% gewijzigd door Verwijderd op 05-03-2004 11:07 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Goeie reacties allemaal.

De oplossing van IorGie vind ik persoonlijk het mooist.

En het is inderdaad niet zo moeilijk als het er eenmaal staat :)

Acties:
  • 0 Henk 'm!

  • RupS
  • Registratie: Februari 2001
  • Laatst online: 17-07 14:45
Hmm, ik heb even geen PHP bij de hand, maar wel javascript...

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var num = 900;
var checks = new Array(800, 1024, 1600);

for (var i=0; i<checks.length; i++) {
  if (num < checks[i]) {
    if ((num-checks[i-1]) < (checks[i]-num)) {
      document.write(checks[i-1]);
      break;
    } else {
      document.write(checks[i]);
      break;
    }
  } else {
    document.write(checks[checks.length-1]);
    break;
  }
}


Doet dit niet ook wat je wilt? Nu kan je gewoon extra waardes in het array zetten zonder dat je if statements toe hoeft te voegen....
In PHP zul je een aantal dingen anders moeten doen, maar het is meer een idee :)

Kan zijn dat ik het helemaal fout heb, mijn javascript skills zijn ook niet echt geweldig B)

[ Voor 7% gewijzigd door RupS op 05-03-2004 11:17 ]


Acties:
  • 0 Henk 'm!

Verwijderd

mijn idee:

PHP:
1
2
3
4
5
6
7
8
9
10
<?php

$getal = 912;
$checks = Array(800,1024,1600);
$uitkomst = $checks[0];
foreach($checks as $check)
  if(abs($check - $getal) <= abs($uitkomst - $getal)) $uitkomst = $check;
echo $uitkomst;

?>


De enige voorwaarde is wel dat de array netjes gesorteerd is van klein naar groot.

[ Voor 5% gewijzigd door Verwijderd op 05-03-2004 12:02 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hm die laatste is ook wel erg netjes.....

RupS: Javascript is helaas geen optie voor dit project. Ik gebruik de functie om te bepalen of een bezoeker een afwijkende resolutie heeft (van 800x600/1024x768/1600x1200) en aan de hand van de uitkomst bepaal ik welke plaatjes er het dichtste bij zitten qua dimensies. Ik wil de uitkomst niet naar de browser sturen dus :)

Acties:
  • 0 Henk 'm!

  • RupS
  • Registratie: Februari 2001
  • Laatst online: 17-07 14:45
Verwijderd schreef op 05 maart 2004 @ 14:47:
Hm die laatste is ook wel erg netjes.....

RupS: Javascript is helaas geen optie voor dit project. Ik gebruik de functie om te bepalen of een bezoeker een afwijkende resolutie heeft (van 800x600/1024x768/1600x1200) en aan de hand van de uitkomst bepaal ik welke plaatjes er het dichtste bij zitten qua dimensies. Ik wil de uitkomst niet naar de browser sturen dus :)
Ik bedoelde ook absoluut niet dat je javascript moest gebruiken, maar omdat ik even geen php heb hier, dacht ik je een idee te geven met een loop, ipv. (beperkende) if-jes, omdat je voor elke resolutie toevoeging een if statement moet toevoegen.
Je moet het alleen omschrijven naar php ;)

Maar ik zou absoluut de veel nettere oplossing van chris1 met abs() nemen :)
Pagina: 1