Scrie o funcție în PHP 7+ care să verifice un număr natural


(Serghei Amelian) #21

Păi… în cazul ăsta eşti invitatul meu să faci o funcţie prin care să detectezi ca argumentul 0020 NU este număr natural. Succes :slight_smile:


#22

N-are legătură cu funcția mea :slight_smile:

E convertit înainte să ajungă la ea.


(Serghei Amelian) #23

Aha, te-ai prins şi tu că e ceva legat de conversie şi că sistemul de numeraţie n-are nicio treabă cu numărul natural sau supranatural :slight_smile: Ideea e alta, ce te faci cu numerele care NU SUNT convertite? Funcţia ta va interpreta in mod diferit 020 şi “020”.

020 este o convenţie a php-ului prin care poţi să reprezinţi numere în sistem de numeraţie octal, 020 în sistem zecimal fiind egal cu 16. Pe de alta parte, “020” e cu totul altceva, type casting-ul la integer pur si simplu va elimina primul zero şi vei obţine “20”.

Din acest motiv trebuie să fii extrem de atent cum enunţi o cerinţă pentru inputul unei funcţii, mai ales la un limbaj ca PHP unde tipurile variabilelor sunt dinamice. Altfel te vrei trezi că funcţia ta funcţionează, dar funcţioneaza anapoda.


(Ionuț Staicu) #24

În JS cred că se poate. Am omis vreun test?

(btw, cred că ar fi mai util dacă cerințele ar include testele iar rezultatul să treacă acele teste :wink: )


#25

Aș vrea să nu te contrazic, dar trebuie …

Când trimiți un input prin HTTP el devine automat un string.

Dacă trimiți de exemplu 0020, PHP o să-l primească ca string.

Înafară de asta, nu poți trimite 0020 ca parametru decât manual.

Nici dacă jonglezi cu el.

Ori, să fim serioși, vorbim despre programare…


(Serghei Amelian) #26

Deci ce vrei să zici, că funcţia ta care poate primi orice tip de variabilă poate de fapt să lucreze corect doar cu string-uri? :slight_smile:


#27

N-am testat funcția ta foarte mult, dar la prima vedere pare că îndeplinește toate cerințele.

Să n-aveți dubii că în PHP nu se poate.


#28

Nu numai cu string-uri. Ci cu ce primește funcția, cu parametrul pe care îl primește.

Dacă parametrul este alterat pe drum, nu putem spune că funcția e de vină.


(Serghei Amelian) #29

Funcţia lui Ionuţ are exact aceeaşi problemă pe care am ridicat-o şi eu.

0111454013352 dă true
111454013352 dă false

LE De fapt acum mi-am dat seama cum a rezolvat Ionuţ problema consistenţei, pur şi simplu nu accepta numere ca string-uri. Lasă conversia pe seama caller-ului şi e problema lui cum îşi dă peste deşte :slight_smile:


(Serghei Amelian) #30

Parametrul nu este alterat pe drum, funcţia respectivă alterează parametrul, făcând in mod inconsistent type cast-ul. Hai să vorbim pe concret, implementeaza tu funcţia is_natural() şi să vedem dacă rezistă la teste.


#31

Înseamnă că mai are de lucru la ea :laughing:


(Ionuț Staicu) #32

Nu știu ce să zic, testele astea trec:

assert.isFalse(parse(0111454013352));
assert.isFalse(parse(111454013352));

Ba da, acceptă numere ca stringuri, dar doar numere. E.g. "42" e ok. "a42" sau "42a" nu.


#33

Eu nu înțeleg cum de n-ai reușit să faci funcția. Ai doar 2 lucruri pe care le-ai omis. Numărul de caractere și problema cu obiectul.

E @ș@ de greu ? :smiley:


(Serghei Amelian) #34

Ciudat, am rulat manual asa:

console.log(parse(10));
console.log(parse("10"));

Si imi da “true”, respectiv “false”

De ce m-ar interesa numărul de caractere?


(Cosmin Popescu) #35

Asta este solutia mea

<?php

function CheckIfIsNumber($number = null){
    if($number === (object)$number)
        return false;
    if ($number <= 0) 
        return false;
    if($number >= 9876543210)
        return false;    
    if ($number === (int)$number)
        return true;    
}
 echo(assert(CheckIfIsNumber(42)));
 echo(assert(CheckIfIsNumber("42")));
 echo(assert(CheckIfIsNumber(0)));
 echo(assert(CheckIfIsNumber(-1)));
 echo(assert(CheckIfIsNumber(new stdClass())));
 echo(assert(CheckIfIsNumber(111454013352)));
 echo(assert(CheckIfIsNumber(123)));
 echo(assert(CheckIfIsNumber(0111454013352)));
 echo(assert(CheckIfIsNumber("42aaa")));
 echo(assert(CheckIfIsNumber("4a2b")));
 echo(assert(CheckIfIsNumber(1.2)));
 echo(assert(CheckIfIsNumber(null))); 
 echo(CheckIfIsNumber((object)['caught' => true]));
 echo(assert(CheckIfIsNumber((object)['caught' => true])));

Sa fiti blanzi. nu am lucrat cu assert :slight_smile:

Rezultate

1
Warning: assert(): Assertion failed in C:\xampp\htdocs\Puzzle\index.php on line 14

Warning: assert(): Assertion failed in C:\xampp\htdocs\Puzzle\index.php on line 15

Warning: assert(): Assertion failed in C:\xampp\htdocs\Puzzle\index.php on line 16

Warning: assert(): Assertion failed in C:\xampp\htdocs\Puzzle\index.php on line 17

Warning: assert(): Assertion failed in C:\xampp\htdocs\Puzzle\index.php on line 18
1
Warning: assert(): Assertion failed in C:\xampp\htdocs\Puzzle\index.php on line 20

Warning: assert(): Assertion failed in C:\xampp\htdocs\Puzzle\index.php on line 21

Warning: assert(): Assertion failed in C:\xampp\htdocs\Puzzle\index.php on line 22

Warning: assert(): Assertion failed in C:\xampp\htdocs\Puzzle\index.php on line 23

Warning: assert(): Assertion failed in C:\xampp\htdocs\Puzzle\index.php on line 24

Warning: assert(): Assertion failed in C:\xampp\htdocs\Puzzle\index.php on line 26

@Dexter, respecta cerintele ?


Daca aveti idei de imbunatatire feel free !

LE: Am tratat si cazul cu object :slight_smile:


#36

Pentru că de principiu am vrut să testez cât de bine se înțelege inițiatorul cu PHP.

În cazul ăsta, e important numărul de caractere.

Aș putea face funcția, iar în interior să mai includ încă 2 fișiere…

Oricum, am explicat și mai sus.


#37

Funcția nu trebuie să arunce erori și ar trebui să conțină cât mai puține caractere.

Măcar de-ai opri erorile… Am spus mai sus. Am dat indicii.


(Cosmin Popescu) #38

Erorile sunt aruncate de assert. Evaluarea a esuat. L-am foloit pt a testa cu parametrii diferiti

Am incercast si cu resursa obiect :slight_smile:


(Serghei Amelian) #39

Din moment ce faci type cast la integer si faci o comparatie, nu vad cu ce te ajuta numarul de caractere.


(Cosmin Popescu) #40

Cred ca economia la nr de caractere nu mai este o problema in ziua de azi :slight_smile: