dissabte, 22 d’agost del 2020

Funcions stdlib [8/9]: qsort, bsearch

Manipulació d'arrays:


Funció qsort:     void qsort(void *llista, size_t nmemb, size_t tamany,                                               int(*cmpfunc)(const void*, const void*));


Ordena una matriu.

*llista: és el punter al primer element de la matriu que s’ordenarà.

nmemb: és el numero de elements en la matriu apuntats per base.

Tamany: és el tamany en bytes de cada element de la matriu.

*cmpfunc: és la funció que compara dos elements.


Aquesta funció no retorna cap valor. 



Funció bsearch:   void *bsearch(const void *clau, const void  

                           *llista, size_t nitems, size_t tamany, int (*cmpfunc)(const

                            void *, const void *));



Busca en una matriu de nitems, el membre inicial del qual s’apunta per llista, para un membre que coincidies amb el objecte apuntat per clau. El tamany de cada membre de la matriu s’especifica per tamany.

El contingut de la matriu te que estar en ordre ascendent d’acord amb la funció de comparació a la que fa referencia compar.

*clau: és el punter al primer element de la matriu que comparara per trobar.

llista: és el numero de elements en la matriu apuntats per base.

Nitems: és numero de items que te el array

Tamany: és el tamany en bytes de cada element de la matriu.

*cmpfunc: és la funció que compara dos elements.








Més informació -> llibreria <stdlib.h>


Funcions stdlib [7/9]: calloc, malloc, realloc i free

 Gestió de memòries dinàmiques:



Funció calloc:     void *calloc(size_t nmemb,size_t tamany);


Adjudica espai para un array de nmemb objectes, cada qual te com a tamany tamany. 
El espai es inicialitzat a cero.

La funció calloc retorna o be un punter nul o be un punter al espai adjudicat.





Funció malloc:     void *malloc(size_t tamany);


Adjudica espai para un objecte, del qual el tamany es especificat per tamany del qual el valor es indeterminat.

La funció malloc retorna un punter nul o un punter al espai adjudicat.





Funció realloc:     void *realloc(void*ptr,size_t tamany);


Canvia el tampany del objecte apuntat per ptr al tamany especificat per tamany. 
Pot multiplicar, dividir, sumar i restar espais de memoria a una estructura.

El contingut del objecte no canviarà fins el menor dels tamanys nous i vells. Si el tamany nou es major, el valor de la porció novament adjudicada del objecte es indeterminat.

Si ptr es un punter nul, la funció realloc se comportarà a igual que la funció malloc para el tamany especificat. De lo contrari, si ptr no es igual a un punter prèviament retornat por la funció free, o realloc, el comportament no esta definit.

Si el espai no pot ser des adjudicat, el objecte apuntat per ptr no varia.

Si tamany es 0 i ptr no es un, el objecte al que apuntala es alliberat.

La funció realloc retorna o be un punter nul o be un punter possiblement al espai adjudicat mudat.



Funció free:     void free(void*ptr);


Causa el espai apuntat per ptr a ser des adjudicat, per lo que la memòria tornarà a ser disponible per a una altra adjudicació.

Si ptr es un punter nul, no es realitzarà cap acció. De lo contrari, si el argument no correspon a un punter prèviament retornat per la funció calloc, malloc o realloc, o si el espai ha sigut des adjudicat per una crida a fre o realloc, el comportament no serà definit.

La funció free no retorna ningun valor.



Més informació -> llibreria <stdlib.h>


Funcions stdlib [6/9]: strtod, strtol, strtoul

 Representar strings com a valor d'altres variables:



Funció strtod:     double strtod(const char *numPtr, char**finalPtr);


Converteix la porció inicial de una cadena apuntada per numPtr a una representació de long int

Primer descomposa la cadena de entrada en tres parts: una seqüencia inicial, possiblement buida, de caràcters de espai en blanc(tal com es especificat per la macro isspace), una seqüencia Font semblant a una constat de coma flotant; y una cadena final de un o mes caràcters irreconeguts, incloent el caràcter nul final de la cadena d’entrada.
Llavors, intenta convertir la seqüencia Font a un numero de coma flotant i retorna el resultat.

La forma expandida de la seqüencia Font es un signe, positiu o negatiu, opcional, seguint una seqüencia de dígits opcionalment contenint un caràcter de la coma decimal (sol ser un punt), seguint una part exponent opcional, però sense incloure un sufix de coma flotant.
La seqüencia font esta definida com la conseqüència inicial mes llarga de la cadena de entrada, començant per el primer caràcter que no es un espai en blanc, que és de la forma esperada. La seqüencia font no conte caràcter si la cadena de entrada esta buida o consisteix completament de espais en blanc, o si el primer caràcter que no es un espai en blanc, es diferent a un signe, un dígit, o un caràcter de la coma decimal (o punt decimal). Si la seqüencia font te la forma esperada, la seqüencia de caràcters començant per el primer dígit o el caràcter de la coma decimal (qualsevol que aparegui primer) es interpretat com una constant de com flotant, excepte que el caràcter de la coma decimal es usat en lloc de la coma, y si no apareix la part exponent ni el caràcter de la coma flotant, la coma decimal es assumit que segueix el últim dígit de la cadena.

Si la seqüencia font comença amb un signe negatiu, el valor resultant de la conversió es negatiu. Un punter a la cadena final es guardat en el objecte apuntat per finalPtr, amb la intenció de que finalPtr no es nul.

A continuació, se mostra el formato usat por esta funció:


[eb] [sn] [ddd] [.] [ddd] [e[sn]ddd]

on:

[eb] Espai en blanc opcional

[sn] Signe opcional (+ ó -)

e 'e' ó 'E' opcional

[.] Coma decimal opcional (punto decimal)

[ddd] Dígits opcionals.





Funció strol:     long int strol(const char *numPtr, char **finalPtr, int base);


Strtol: converteix la porció inicial de la cadena apuntada per numPtr a una representació de long int.

Primer descompon la cadena d'entrada en tres parts: una seqüència inicial, possiblement buida, de caràcters d'espai blanc (tal com és especificat per la funció isspace), una seqüència font assemblant-se a un enter representat en alguna base determinat pel valor de base , i una cadena final d'un o més caràcters irreconeguts, incloent el caràcter nul final de la cadena entrada. Llavors, intenta convertir la seqüència font a un sencer, i retorna el resultat.

Si el valor de base és zero, la forma esperada de la seqüència font és aquella d'una constant sencera, opcionalment precedida per un signe més o menys, però sense incloure un sufix sencer. Si el valor de base està entre 2 i 36, la forma esperada de la seqüència font és una seqüència de lletres i dígits representant un sencer amb una base especificat per base, opcionalment precedida per un signe positiu o negatiu, però sense incloure un sufix sencer .

Les lletres de a (o A) fins z (o Z) són atribuïts els valors de 10 a 35; només lletres els valors atribuïts són menors que aquells de la base estan permesos. Si el valor de base és 16, els caràcters 0x o 0X pots opcionalment precedir la seqüència de lletres i dígits, a continuació> de el signe, si aquest està present.

La seqüència font està definida com la seqüència inicial més llarga de la cadena d'entrada, començant pel primer caràcter que no és un espai blanc, que és de la forma esperada. La seqüència font no conté caràcters si la cadena d'entrada està buida o consisteix completament d'espai en blanc, o si el primer caràcter que no és un espai blanc és diferent a un signe o lletra o dígit permès.

Si la seqüència font té la forma esperada i el valor de base és zero, la seqüència de caràcters començant pel primer dígit és interpretada com una constant sencera. Si la seqüència font té la forma esperada i el valor de base està entre 2 i 36, és usada com la base per a la conversió, atribuint a cada lletra el seu valor donat tal com descrit anteriorment. Si la seqüència font comença amb un signe negatiu, el valor resultant de la conversió és negatiu. Un punter a la cadena final és guardat en l'objecte apuntat per finalPtr, per tal que finalPtr no és nul. Si la seqüència font està buida o no té la forma esperada, cap conversió és realitzada; el valor numPtr és guardat en l'objecte apuntat per finalPtr, per tal que finalPtr no és nul.

A continuació, es mostra el format usat per la funció:

[eb] [sn] [0] [x] [ddd],on:

[eb] espai en blanc opcional Cita en bloc

[sn] Signe opcional (+ ó -)

[0] Cero opcional (0)

[x] 'x' ó 'X' opcional

[ddd] Dígits opcionals

 Si base es cero, los primers caràcters de numPtr determinen la base:


Primer caràcter -----Segon caràcter ----- Cadena interpretada com...

0 ------------------------- 1 a 7 ------------------------- Octal
0 ------------------------- x ó X ------------------------- Hexadecimal
1 a 9 ---------------------(0 a 9) ------------------------ Decimal

La funció strtol retorna el valor convertit, si de cas existeix. Si no es va poder realitzar cap conversió, zero és retornat. Si el valor correcte no pertany a l'interval de valors representables, LONG_MAX o LONG_MIN és retornat (segons el signe de la valor), i el valor de la macro ERANGE és guardat en errno.

----------------------------------------------------------------------------------------

strtol et permet transformar un numero d'un string usant el teorema fonamental de la numeració per retornar-nos el valor segons la base a decimal i guardar el resultat en una memoria long int.



Per exemple:


Transformar i guardar un string amb valor binari en decimal:



Transformar i guardar un string amb valor decimal en decimal:



Transformar i guardar un string en base hexadecimal en decimal:





Funció strtoul:     unsigned long int strtoul(const char *numPtr, char **finalPtr, int base);


Converteix la porció inicial de la cadena apuntada per numPtr a una representació de unsigned long int.

La funció strtoul funciona idènticament a la funció strtol.

La funció strtoul retorna el valor convertit, si existeix. Si no s’ha pogut realitzar cap conversió, retornarà 0. Si el valor correcte no pretereix al Interval de valors representables, UONG_MAX es retornat, i el valor de la macro ERANGE es guardat a errno.






Més informació -> llibreria <stdlib.h>