Mostrando las entradas con la etiqueta programacion. Mostrar todas las entradas
Mostrando las entradas con la etiqueta programacion. Mostrar todas las entradas

Operadores de programacion

 OPERADORES
® Operadores Aritméticos
® Operadores de Asignación
® Operadores de Bits
® Operadores de Comparación
® Operadores de Control de Errores
® Operador de Ejecución
® Operadores de Incremento/decremento
® Operadores Lógicos
® Operador de cadenas de texto
® Operadores de Matrices
® Operadores de Tipo
® Precedencia y asociatividad de operandos

5.1. Operadores Aritméticos
Disponemos de los clásicos operadores aritméticos:

Operación Nombre Resultado
$a + $b Suma Suma de $a y $b.
$a - $b Resta Diferencia entre $a y $b.
$a * $b Multiplicación Producto de $a y $b.
$a / $b División Cociente de $a y $b.
$a % $b Módulo Resto de la operación $a / $b.
-$a Negación El opuesto de $a
5.2. Operadores de Asignación
El operador básico de asignación es "=". A primera vista podrías pensar que es el
operador de comparación "igual que". Pero no. Realmente significa que el operando de
la izquierda toma el valor de la expresión a la derecha, (esto es, "toma el valor de").

El valor de una expresión de asignación es el propio valor asignado. Esto es, el
valor de "$a = 3" es 3. Esto permite hacer cosas curiosas como

$a = ($b = 4) + 5; // ahora $a es igual a 9, y $b vale 4.
Además del operador básico de asignación, existen los "operadores combinados"
para todas las operaciones aritméticas y de cadenas que sean binarias. Este operador
combinado permite, de una sola vez, usar una variable en una expresión y luego
establecer el valor de esa variable al resultado de la expresión. Por ejemplo:

$a = 3;
$a += 5; // establece $a a 8, como si hubiésemos escrito: $a = $a + 5;
$b = "Hola ";
$b .= "Ahí!"; // establece $b a "Hola Ahí!", igual que si hiciésemos $b = $b . "Ahí!";

Al igual que en C, C++ y Java, en PHP se dispone de estos operadores
combinados para, en una sola operación, operar sobre una variable y asignarle a esa
misma variable el resultado. PROGRAMACIÓN EN LENGUAJE PHP5. NIVEL BÁSICO

60
Las operaciones susceptibles de ser usadas con estos operadores son:
+  -  *  /  %  &  ^  .  >>  y  <<
resultando en los nuevos signos de operación-asignación:
+=  -=  *=  /=  %=  &=  ^=  .=  >>=  y  <<=
Ejemplos de uso:
$var1 += 3;        // $var1 = $var1 + 3;
$var2 /= 2;        // $var2 = $var2 / 2;
$var3 >>= 1;        // $var3 = $var3 >> 1;
Fíjese en que la asignación realiza una nueva copia de la variable original
(asignación por valor), por lo que cambios a la variable original no afectan a la copia.
Esto puede tener interés si necesitas copiar algo como un array con muchos elementos
dentro de un bucle que se repita muchas veces (cada vez se realizará una nueva copia
del array). PHP soporta asignación por referencia, usando la sintaxis $var =
&$othervar; , pero esto no es posible en PHP3. 'Asignación por referencia' quiere decir
que ambas variables acabarán apuntando al mismo dato y que nada es realmente
copiado. A partir de PHP5 los objetos son asignados por referencia a menos que
explícitamente se diga lo contrario con la nueva palabra clave clone.
5.3. Operadores de bits
Veamos ahora los operadores BIT a BIT de que dispone PHP:

Operación Nombre Resultado
$a & $b Y Se ponen a 1 los bits que están a 1 en $a y $b.
$a | $b O Se ponen a 1 los bits que están a 1 en $a o $b.
$a ^ $b
O Exclusivo
(XOR)
Se ponen a 1 los bits que están a 1 en $a o $b, pero no
en ambos.
~ $a No Se invierten los bits (se cambian 1 por 0 y viceversa.)
$a << $b Desp. Izq.
Desplaza $b posiciones a la izquierda todos los bits de
$a (cada posición supone multiplicar por dos).
$a >> $b Desp. Drch.
Desplaza $b posiciones a la derecha todos los bits de $a
(cada posición supone dividir por dos).
5.4. Operadores de Comparación
Los operadores de comparación, como su nombre indica, permiten comparar dos
valores.

Operación Nombre Resultado
$a == $b Igualdad
Compara si el valor de los dos operandos es el
mismo.
$a === $b Identidad
Compara si el valor es el mismo y, además, el
tipo coincide (A partir de PHP4).
$a != $b No igual Cierto si el valor de $a no es igual al de $b.
$a !== $b No idéntico
Cierto si $a no es igual a $b, o si no tienen
el mismo tipo.
$a < $b Menor que Cierto si $a es estrictamente menor que $b. PROGRAMACIÓN EN LENGUAJE PHP5. NIVEL BÁSICO
61
Operación Nombre Resultado
$a > $b Mayor que Cierto si $a es estrictamente mayor que $b.
$a <= $b Menor o igual que  Cierto si $a es menor o igual que $b.
$a >= $b Mayor o igual que Cierto si $a es mayor o igual que $b.
$a <> $b No igual Cierto si el valor de $a no es igual al de $b

Si se compara un entero con una cadena, la cadena es convertida a un número. Si
se compara dos cadenas numéricas, son comparadas como enteros. Estas reglas también
se aplican a la sentencia switch.
Otro operador condicional es el operador "?:" (o ternario), que funciona como en
C y otros muchos lenguajes.
(expr1) ? (expr2) : (expr3);
La expresión toma el valor expr2 si expr1 se evalúa a cierto, y expr3 si expr1 se
evalúa a falso.

$cad = $a > $b ? “a es mayor que b” : “a no es mayor que b”;
5.5. Operadores de Control de Errores
PHP ofrece soporte para un operador de control de errores: el signo de arroba
(@). Cuando es colocado al comienzo de una expresión en PHP, cualquier mensaje de
error que pudiera generarse a causa de esa expresión será ignorado.

Si la característica track_errors está habilitada, cualquier mensaje de error
generado por la expresión será almacenado en la variable $php_errormsg. La variable
será sobrescrita en cada instancia de error, así que realice sus chequeos de forma
temprana si quiere usarla.

<?php
/* Error intencionado de archivo */
$mi_archivo = @file ('archivo_que_no_existe')
or die ("La apertura de archivo ha fallado: el error fue
             '$php_errormsg'");

// esto funciona con cualquier expresión, no solo con funciones:
$valor = @$cache[$llave];
// no producirá una anotación si el índice $llave no existe.
?>

Puede usar el operado @ al inicio de variables, llamadas a funciones y sentencias
include(), constantes. No puede usarlo sobre definiciones de función o clase, ni sobre
estructuras condicionales como if y foreach.
5.6. Operador de ejecución
PHP soporta un operador de ejecución: la comilla invertida (`). ¡Fíjese que no
son comillas normales! PHP intentará ejecutar la instrucción contenida dentro de las PROGRAMACIÓN EN LENGUAJE PHP5. NIVEL BÁSICO

62
comillas invertidas como si fuera un comando del shell; y su salida devuelta como el
valor de esta expresión (i.e., no tiene por qué ser simplemente volcada como salida;
puede asignarse a una variable). El uso de este operados es idéntico a la función
shell_exec().

$output = `dir /a-d`;
echo "<pre>$output</pre>";
5.7. Operadores de Incremento/decremento
PHP soporta los operadores de pre y post decremento y incremento al estilo de
C. Estos operadores no afectan a valores booléanos y incrementar NULL resulta en 1.
Operación Nombre Resultado
++$a Pre-incremento
Incrementa $a en 1, y devuelve $a (ya
incrementado)
$a++ Post-incremento
Devuelve $a (sin incrementar), y después lo
incrementa en 1.
--$a Pre-decremento Decrementa $a en 1, y después lo devuelve.
$a-- Post-decremento Devuelve $a, y después lo incrementa en 1.

He aquí un listado de ejemplo:
<?php
echo "<h3>Postincremento</h3>";
$a = 5;
echo "Debería ser 5: " . $a++ . "<br>\n";
echo "Debería ser 6: " . $a . "<br>\n";

echo "<h3>Preincremento</h3>";
$a = 5;
echo "Debería ser 6: " . ++$a . "<br>\n";
echo "Debería ser 6: " . $a . "<br>\n";
echo "<h3>Postdecremento</h3>";
$a = 5;
echo "Debería ser 5: " . $a-- . "<br>\n";
echo "Debería ser 4: " . $a . "<br>\n";
echo "<h3>Predecremento</h3>";
$a = 5;
echo "Debería ser 4: " . --$a . "<br>\n";
echo "Debería ser 4: " . $a . "<br>\n";
?>

5.8. Operadores lógicos
Los operadores lógicos realizan operaciones dependiendo del valor booleano de
los operandos.
Operación Nombre Resultado
$a and $b Y Cierto si $a y $b son ciertos.
$a or $b O Cierto si $a o $b es cierto.
$a xor $b O Exclusivo.
Cierto si $a o $b es cierto, pero no
ambos.
! $a No Cierto si $a es falso.
$a && $b Y Cierto si $a y $b son ciertos.
$a || $b O Cierto si $a o $b es cierto. PROGRAMACIÓN EN LENGUAJE PHP5. NIVEL BÁSICO
63

La razón de que haya dos operadores distintos para las operaciones Y y O lógicas
es que tienen distinta precedencia.
5.9. Operador de cadenas de texto
Para operar con cadenas sólo disponemos de un operador: la concatenación de
cadenas representada por el punto ‘.’.

Por ejemplo:
$a = 1;
$b = 2;
$c = “El resultado de “ . $a . “ + “ . $b . “ es “ . ($a + $b);
Que dejaría en $c la cadena “El resultado de 1 + 2 es 3”. Antes de cada
concatenación se realizarán las conversiones de tipo que fueran necesarias (en el
ejemplo, los enteros se convierten a cadenas.)
5.10. Operadores de Matrices
Ejemplo Nombre Resultado
$a + $b Unión Unión de $a y $b.
$a == $b Igualdad Cierto si $a y $b tienen las mismas parejas llave/valor.
$a=== $b Identidad
Cierto si $a y $b tienen las mismas parejas llave/valor
en el mismo orden y de los mismos tipos.
$a != $b
Noigualdad
Cierto si $a no es igual a $b.
$a <> $b
Noigualdad
Cierto si $a no es igual a $b.
$a!== $b
Noidentidad
Cierto si $a no es idéntico a $b.

El operador + adiciona elementos de las claves restantes de la matriz del lado
derecho a aquella al lado izquierdo, al mismo tiempo que cualquier clave duplicada NO
es sobrescrita.
<?php
$a = array("a" => "manzana", "b" => "banano");
$b = array("a" => "pera", "b" => "fresa", "c" => "cereza");

$c = $a + $b; // Unión de $a y $b
echo "Unión de \$a y \$b: \n";
var_dump($c);
$c = $b + $a; // Unión de $b y $a
echo "Unión de \$b y \$a: \n";
var_dump($c);
?>

Cuando sea ejecutado, este script producirá la siguiente salida:

Unión de $a y $b:
array(3) {
  ["a"]=>
  string(7) "manzana"
  ["b"]=> PROGRAMACIÓN EN LENGUAJE PHP5. NIVEL BÁSICO

64
  string(6) "banano"
  ["c"]=>
  string(6) "cereza"
}
Unión de $b y $a:
array(3) {
  ["a"]=>
  string(4) "pera"
  ["b"]=>
  string(5) "fresa"
  ["c"]=>
  string(6) "cereza"
}

Los elementos de las matrices son considerados equivalentes en la comparación
si éstos tienen la misma clave y valor.

<?php
$a = array("manzana", "banano");
$b = array(1 => "banano", "0" => "manzana");

var_dump($a == $b); // bool(true) tiene las mismas clave-valor
var_dump($a === $b); // bool(false) pero en orden distinto
?>
5.11. Operadores de Tipo
instanceof es usado para determinar si una variable PHP es una instancia de
objeto de cierta clase:

<?php
class MiClase
{
}

class NoMiClase
{
}
$a = new MiClase;
var_dump($a instanceof MiClase);
var_dump($a instanceof NoMiClase);
?>

El resultado del ejemplo sería:
bool(true)
bool(false)
El operador instanceof fue introducido en PHP5. Anteriormente se usaba la
función is_a() pero desde la introdución del operados instanceof, la función anterior se
considera obsoleta.
5.12. Precedencia y asociatividad de operandos
La precedencia de los operandos resuelve el orden en el que se evalúa una
expresión múltiple que no ha sido delimitada con paréntesis. Por ejemplo, 1 + 5 * 3 en
PHP daría como resultado 1 + (5 * 3) = 16 y no (1 + 5) * 3 = 18 ya que el producto
tiene mayor precedencia que la suma. PROGRAMACIÓN EN LENGUAJE PHP5. NIVEL BÁSICO


La tabla muestra la asociatividad de los operandos en PHP, y está ordenada en
orden creciente de precedencia (los más prioritarios al final):
Asociatividad Operandos
izquierda ,
izquierda or
izquierda xor
izquierda and
Derecha = += -= *= /= .= %= &= |= ^= ~= <<= >>=
izquierda ? :
izquierda ||
izquierda &&
izquierda |
izquierda ^
izquierda &
no-asociativo == != === !==
no-asociativo < <= > >=
izquierda << >>
izquierda + - .
izquierda * / %
derecha !
no-asociativo
~ - (int) (float) (string) (array) (object)
(bool) @
no-asociativo ++ --
izquierda [
no-asociativo clone new

La asociatividad de izquierda quiere decir que la expresión es evaluada desde la
izquierda a la derecha, la asociatividad de derecha quiere decir lo contrario.
<?php
$a = 3 * 3 % 5; // (3 * 3) % 5 = 4
$a = true ? 0 : true ? 1 : 2; // (true ? 0 : true) ? 1 : 2 = 2

$a = 1;
$b = 2;
$a = $b += 3; // $a = ($b += 3) -> $a = 5, $b = 5
?>

Tipos de datos de php


                          Tipos de Datos                              
® Booleanos
® Enteros
® Números en punto flotante
® Cadenas
® Arrays
® Objetos
® Recursos
® NULL
® Forzado de tipos
PHP soporta ocho tipos primitivos:
• booleanos
• enteros
• números en punto flotante
• cadenas
• matrices
• objetos
• recursos (resource)
• NULL

El tipo de una variable normalmente no lo indica el programador; en su lugar, lo
decide PHP en tiempo de ejecución dependiendo del contexto en el que se utilice esa
variable.
Si desea conocer el tipo y valor de una expresión, se puede usar la función
var_dump(). Para obtener una representación legible para humanos del tipo de una
variable para propósitos de depuración, se puede usar la función gettype(). Para
comprobar si una variable es de un cierto tiepo, no se debe usar gettype(), si no las
funciones is_tipo.

<?php
$un_bool = TRUE;   // un valor booleano
$un_str  = "foo";  // una cadena
$un_str2 = 'foo';  // una cadena
$un_int  = 12;     // un entero

echo gettype($un_bool); // imprime: boolean
echo gettype($un_str);  // imprime: string
// Si este valor es un entero, incrementarlo en cuatro
if (is_int($un_int)) {
    $un_int += 4;
}
// Si $bool es una cadena, imprimirla
// (no imprime nada)
if (is_string($un_bool)) {
    echo "Cadena: $un_bool";
}
?>

Si se quisiese obligar a que una variable se convierta a un tipo concreto, se
podría forzar la variable o usar la función settype() para ello.  PROGRAMACIÓN EN LENGUAJE PHP5. NIVEL BÁSICO

50
Nótese que una variable se puede comportar de formas diferentes en ciertas
situaciones, dependiendo de qué tipo sea en ese momento.
4.1. Booleanos
Este es el tipo más simple. Un booleano expresa un valor de verdad. Puede ser
TRUE o FALSE. Para especificar un literal booleano, use alguna de las palabras clave
TRUE o FALSE. Ambas son insensibles a mayúsculas y minúsculas.

$foo = True; // asigna el valor TRUE a $foo
4.2. Enteros
Los enteros se pueden especificar usando una de las siguientes sintaxis:
$a = 1234; # número decimal
$a = -123; # un número negativo
$a = 0123; # número octal (equivalente al 83 decimal)
$a = 0x12; # número hexadecimal (equivalente al 18 decimal)
4.3. Números en punto flotante
Los números en punto flotante (double) se pueden especificar utilizando
cualquiera de las siguientes sintaxis:

$a = 1.234;
$a = 1.2e3;
$a = 7E-10;
4.4. Cadenas
Las cadenas de caracteres se pueden especificar usando uno de dos tipos de
delimitadores.

Si la cadena está encerrada entre dobles comillas ("), las variables que estén
dentro de la cadena serán expandidas (sujetas a ciertas limitaciones de interpretación).
Como en C y en Perl, el carácter de barra invertida ("\") se puede usar para especificar
caracteres especiales:
secuencia significado
\n Nueva línea
\r Retorno de carro
\t Tabulación horizontal
\\ Barra invertida
\$ Signo del dólar
\" Comillas dobles
\[0-7]{1,3}
la secuencia de caracteres que coincida con la expresión regular es un carácter en
notación octal
\x[0-9A-Fa-f]{1,2}
la secuencia de caracteres que coincida con la expresión regular es un carácter en
notación hexadecimal
 PROGRAMACIÓN EN LENGUAJE PHP5. NIVEL BÁSICO
51
Se puede proteger cualquier otro carácter, pero se producirá una advertencia en
el nivel de depuración más alto.

La segunda forma de delimitar una cadena de caracteres usa el carácter de
comilla simple (‘). Cuando una cadena va encerrada entre comillas simples, los únicos
caracteres de escape que serán comprendidos son \\ y \'. Esto es por convenio, así que se
pueden tener comillas simples y barras invertidas en una cadena entre comillas simples.
Las variables no se expandirán dentro de una cadena entre comillas simples.

Las cadenas se pueden concatenar usando el operador . (punto). Nótese que el
operador + (suma) no sirve para esto.

Se puede acceder a los caracteres dentro de una cadena tratándola como un array
de caracteres indexado numéricamente, usando una sintaxis similar a la de C. Vea un
ejemplo más abajo.
<?php
/* Asignando una cadena. */
$str = "Esto es una cadena";

/* Añadiendo a la cadena. */
$str = $str . " con algo más de texto";
/* Otra forma de añadir, incluye un carácter de nueva línea protegido. */
$str .= " Y un carácter de nueva línea al final.\n";
/* Esta cadena terminará siendo '<p>Número: 9</p>' */
$num = 9;
$str = "<p>Número: $num</p>";
/* Esta será '<p>Número: $num</p>' */
$num = 9;
$str = '<p>Número: $num</p>';
/* Obtener el primer carácter de una cadena  */
$str = 'Esto es una prueba.';
$first = $str[0];
/* Obtener el último carácter de una cadena. */
$str = 'Esto es aún una prueba.';
$last = $str[strlen($str)-1];
?>

4.4.1. Conversión a cadenas
Un valor puede ser convertido a cadena usando el moldeamiento (string) o la
función strval().
Un valor booleano TRUE es convertido a la cadena "1", el valor FALSE se
representa como "" (la cadena vacía). De esta forma, se puede convertir de ida y vuelta
entre valores booleanos y de cadena.

Un número integer o de punto flotante (float) es convertido a una cadena que
representa el número textualmente (incluyendo la parte del exponente para los números
de punto flotante). Los números de punto flotante pueden ser convertidos usando la
notación exponencial (4.1E+6).
 PROGRAMACIÓN EN LENGUAJE PHP5. NIVEL BÁSICO

52
Las matrices son siempre convertidas a la cadena "Array"; por esta razón,
echo() y print() no pueden por su cuenta mostrar los contenidos de un valor array. Para
ver un elemento sencillo, use una construcción como echo $arr['foo'].

Los objetos a partir de PHP 4 son convertidos siempre a la cadena "Object". Por
eso, al igual que pasa con las matrices echo() y print() no pueden por su cuenta mostrar
los contenidos de un valor objecto.

Los recursos son siempre convertidos a cadenas con la estructura "Resource id
#1" en donde 1 es el número único del valor recurso asignado por PHP en tiempo de
ejecución. No se debe escribir código que dependa de esta estructura; está sujeta a
cambios.

NULL se convierte siempre a una cadena vacía.

Como se ha indicado anteriormente, convertir directamente un valor tipo array,
object, o resource a un string no ofrece información útil sobre los valores más allá de su
tipo. Si desea inspeccionar el contenido de estos tipos debe usar las funciones print_r()
y var_dump().
 
La mayoría de valores PHP pueden ser convertidos también a string para su
almacenamiento permanentemente. Este método es conocido como serialización
(seriación), y es efectuado por la función serialize().

4.4.2. Conversión de cadenas a números
Cuando una cadena se evalúa como un valor numérico, el valor resultante y el
tipo se determinan como sigue.
La cadena se evaluará como un doble si contiene cualquiera de los caracteres '.',
'e', o 'E'. En caso contrario, se evaluará como un entero.
El valor viene dado por la porción inicial de la cadena. Si la cadena comienza
con datos de valor numérico, este será el valor usado. En caso contrario, el valor será 0
(cero). Los datos numéricos válidos son un signo opcional, seguido por uno o más
dígitos (que opcionalmente contengan un punto decimal), seguidos por un exponente
opcional. El exponente es una 'e' o una 'E' seguidos por uno o más dígitos.

Cuando la primera expresión es una cadena, el tipo de la variable dependerá de
la segunda expresión.

$foo = 1 + "10.5";                // $foo es doble (11.5)
$foo = 1 + "-1.3e3";              // $foo es doble (-1299)
$foo = 1 + "bob-1.3e3";           // $foo es entero (1)
$foo = 1 + "bob3";                // $foo es entero (1)
$foo = 1 + "10 Cerditos";         // $foo es entero (11)
$foo = 1 + "10.0 Cerditos";       // $foo es double (11)
$foo = "10.0 cerdos " + 1;        // $foo es double (11)
$foo = "10.0 cerdos " + 1.0;      // $foo es double (11)
Si quisiera probar cualquiera de los ejemplos de esta sección, puede cortar y
pegar los ejemplos e insertar la siguiente línea para ver por sí mismo lo que va
ocurriendo:  PROGRAMACIÓN EN LENGUAJE PHP5. NIVEL BÁSICO
53

echo "\$foo==$foo; el tipo es " . gettype( $foo ) . "<br>\n";
4.5. Arrays
Los arrays actualmente actúan tanto como tablas hash (arrays asociativos) como
arrays indexados (vectores).
4.5.1. Arrays unidimensionales
PHP soporta tanto arrays escalares como asociativos. De hecho, no hay
diferencias entre los dos. Se puede crear una array usando las funciones list() o array(),
o se puede asignar el valor de cada elemento del array de manera explícita.

$a[0] = "abc";
$a[1] = "def";
$b["foo"] = 13;
$matriz = array("foo" => "bar", 12 => true);

También se puede crear un array simplemente añadiendo valores al array.
Cuando se asigna un valor a una variable array usando corchetes vacíos, el valor se
añadirá al final del array.
$a[] = "hola"; // $a[2] == "hola"
$a[] = "mundo"; // $a[3] == "mundo"
Los arrays se pueden ordenar usando las funciones asort(), arsort(), ksort(),
rsort(), sort(), uasort(), usort(), y uksort() dependiendo del tipo de ordenación que se
desee.

Se puede contar el número de elementos de un array usando la función count().
Se puede recorrer un array usando las funciones next() y prev(). Otra forma
habitual de recorrer un array es usando la función each().
4.5.2. Arrays Multidimensionales

Los arrays multidimensionales son bastante simples actualmente. Para cada
dimensión del array, se puede añadir otro valor [clave] al final:
$a[1]      = $f;           # ejemplos de una sola dimensión
$a["foo"]  = $f;  

$a[1][0]     = $f;         # bidimensional
$a["foo"][2] = $f;         # (se pueden mezclar índices numéricos y asociativos)
$a[3]["bar"] = $f;         # (se pueden mezclar índices numéricos y asociativos)
$a["foo"][4]["bar"][0] = $f;   # tetradimensional!

En PHP3 no es posible referirse a arrays multidimensionales directamente dentro
de cadenas. Por ejemplo, lo siguiente no tendrá el resultado deseado:

$a[3]['bar'] = 'Bob';
echo "Esto no va a funcionar: $a[3][bar]"; PROGRAMACIÓN EN LENGUAJE PHP5. NIVEL BÁSICO

54
En PHP3, lo anterior tendrá la salida Esto no va a funcionar: Array[bar]. De
todas formas, el operador de concatenación de cadenas se puede usar para solucionar
esto:
$a[3]['bar'] = 'Bob';
echo "Esto va a funcionar: " . $a[3][‘bar’];
A partir de PHP4, sin embargo, todo el problema se puede solucionar encerrando
la referencia al array (dentro de la cadena) entre llaves:

$a[3]['bar'] = 'Bob';
echo "Esto va a funcionar: {$a[3][‘bar’]}";
Se pueden "rellenar" arrays multidimensionales de muchas formas, pero la más
difícil de comprender es cómo usar el comando array() para arrays asociativos. Estos
dos trozos de código rellenarán el array unidimensional de la misma manera:
# Ejemplo 1:

$a["color"] = "rojo";
$a["sabor"] = "dulce";
$a["forma"] = "redondeada";
$a["nombre"] = "manzana";
$a[3]  = 4;
# Ejemplo 2:
$a = array(
     "color" => "rojo",
     "sabor" => "dulce",
     "forma" => "redondeada",
     "nombre"  => "manzana",
     3       => 4
);

La función array() se puede anidar para arrays multidimensionales:
<?php
$a = array(
     "manzana"  => array(
          "color"  => "rojo",
          "sabor"  => "dulce",
          "forma"  => "redondeada"
     ),
     "naranja"  => array(
          "color"  => "naranja",
          "sabor"  => "ácido",
          "forma"  => "redondeada"
     ),
     "plátano"  => array(
          "color"  => "amarillo",
          "sabor"  => "paste-y",
          "forma"  => "aplatanada"
     )
);

echo $a["manzana"]["sabor"];    # devolverá "dulce"
?>

Siempre deben usarse comillas alrededor de un índice de matriz tipo cadena
literal. Por ejemplo, $foo['bar'] es correcto, mientras que $foo[bar] no lo es. Funciona
pero no es correcto. Funciona porque PHP automáticamente convierte una cadena pura
(una cadena sin comillas que no corresponda con símbolo conocido alguno) en una
cadena que contiene la cadena pura. Por ejemplo, si no se ha definido una constante
llamada bar, entonces PHP reemplazará su valor por la cadena 'bar' y usará ésta última. PROGRAMACIÓN EN LENGUAJE PHP5. NIVEL BÁSICO
55
4.6. Objetos
Para inicializar un objeto, se usa la sentencia new para instanciar el objeto a una
variable.

class foo {
    function do_foo () {
        echo "Haciendo foo.";
    }
}

$bar = new foo;
$bar->do_foo();
4.7. Recursos
Un valor tipo resource es una variable especial, que contiene una referencia a un
recurso externo. Los recursos son creados y usados por funciones especiales. Gracias al
sistema de conteo de referencias introducido con el Motor Zend de PHP 4, un recurso
que ya no es referenciado es detectado automáticamente, y es liberado por el recolector
de basura. Por esta razón, rara vez se necesita liberar la memoria manualmente. Los
enlaces persistentes con bases de datos son una excepción a esta regla. Estos no son
destruidos por el recolector de basura.

4.8. NULL
El valor especial NULL representa una variable que no tiene valor. NULL es el
único valor posible del tipo NULL. Una variable es considerada como null si:

Ö se le ha asignado la constante NULL.
Ö no ha sido definida con valor alguno.
Ö ha sido eliminada con unset().

Existe un solo valor de tipo null, y ese es la palabra clave NULL, insensible a
mayúsculas y minúsculas.

$var = NULL;

Hay varias funciones interesantes para trabajar con el valor null: is_null() y unset().
4.9. Forzado de tipos
PHP no requiere (o soporta) la declaración explícita del tipo en la declaración de
variables; el tipo de una variable se determina por el contexto en el que se usa esa
variable. Esto quiere decir que si se asigna un valor de cadena a la variable var, var se
convierte en una cadena. Si después se asigna un valor entero a la variable var, se
convierte en una variable entera.
 PROGRAMACIÓN EN LENGUAJE PHP5. NIVEL BÁSICO

56
Un ejemplo de conversión de tipo automática en PHP es el operador suma '+'. Si
cualquiera de los operandos es un flotante, entonces todos los operandos se evalúan
como flotantes, y el resultado será un flotante. En caso contrario, los operandos se
interpretarán como enteros, y el resultado será también un entero. Nótese que esto NO
cambia los tipos de los operandos propiamente dichos; el único cambio está en cómo se
evalúan los operandos.

$foo = "0";  // $foo es una cadena (ASCII 48)
$foo++;      // $foo es la cadena "1" (ASCII 49) convertido a entero (1)
$foo += 1;   // $foo ahora es un entero (2)
$foo = $foo + 1.3;  // $foo ahora es un doble (3.3)
$foo = 5 + "10 Cerditos Pequeñitos"; // $foo es entero (15)
$foo = 5 + "10 Cerditos";     // $foo es entero (15)
Si se desea obligar a que una variable sea evaluada con un tipo concreto se
puede realizar un forzado de tipos. Si se desea cambiar el tipo de una variable se puede
usar la función settype().
Si quisiese probar cualquiera de los ejemplos de esta sección, puede cortar y
pegar los ejemplos e insertar la siguiente línea para ver por sí mismo lo que va
ocurriendo o usar la función var_dump():

echo "\$foo==$foo; el tipo es " . gettype( $foo ) . "<br>\n";

Nota: La posibilidad de una conversión automática a array no está definida
actualmente.

$a = 1;       // $a es un entero
$a[0] = "f";  // $a se convierte en un array, en el que $a[0] vale "f"
Aunque el ejemplo anterior puede parecer que claramente debería resultar en que
$a se convierta en un array, el primer elemento del cual es 'f', consideremos esto:

$a = "1";     // $a es una cadena
$a[0] = "f";  // ¿Qué pasa con los índices de las cadenas? ¿Qué ocurre?
Dado que PHP soporta indexación en las cadenas vía offsets usando la misma
sintaxis que la indexación de arrays, el ejemplo anterior nos conduce a un problema:
¿debería convertirse $a en un array cuyo primer elemento sea "f", o debería convertirse
"f" en el primer carácter de la cadena $a?
 
El forzado de tipos en PHP funciona como en C: el nombre del tipo deseado se
escribe entre paréntesis antes de la variable a la que se pretende forzar.

$foo = 10;   // $foo es un entero
$bar = (double) $foo;   // $bar es un doble

Los forzados de tipo permitidos son:
(int), (integer) - fuerza a entero (integer)
(bool),(bolean) – fuerza a booleano
(real), (double), (float) - fuerza a doble (double)
(string) - fuerza a cadena (string)
(array) - fuerza a array (array)
(object) - fuerza a objeto (object) PROGRAMACIÓN EN LENGUAJE PHP5. NIVEL BÁSICO
57

Nótese que las tabulaciones y espacios se permiten dentro de los paréntesis, así
que los siguientes ejemplos son funcionalmente equivalentes:

$foo = (int) $bar;
$foo = ( int ) $bar;
Puede no ser obvio que ocurrirá cuando se fuerce entre ciertos tipos. Por
ejemplo, lo siguiente debería ser tenido en cuenta.
Cuando se fuerza el cambio de un escalar o una variable de cadena a un array, la
variable se convertirá en el primer elemento del array:

$var = 'ciao';
$arr = (array) $var;
echo $arr[0];  // produce la salida 'ciao'

Cuando se fuerza el tipo de una variable escalar o de una cadena a un objeto, la
variable se convertirá en un atributo del objeto; el nombre del atributo será 'scalar':

$var = 'ciao';
$obj = (object) $var;
echo $obj->scalar;  // produce la salida 'ciao'
Cuando se fuerza el tipo de una variable a booleano, el valor de la variable será
FALSE si: es el valor booleano FALSE, si es el entero 0, si es el flotante 0.0 si es la
cadena vacía o la cadena “0”, si es un array con cero elementos, si es NULL; en
cualquier otro caso el valor será TRUE.

HTML y PHP ¿Cual es mejor?


Para interpretar un archivo, PHP simplemente interpreta el texto del archivo
hasta que encuentra uno de los carácteres especiales que delimitan el inicio de código
PHP. El intérprete ejecuta entonces todo el código que encuentra, hasta que encuentra
una etiqueta de fin de código, que le dice al intérprete que siga ignorando el código
siguiente. Este mecanismo permite embeber código PHP dentro de HTML: todo lo que
está fuera de las etiquetas PHP se deja tal como está, mientras que el resto se interpreta
como código.

Hay cuatro conjuntos de etiquetas que pueden ser usadas para denotar bloques
de código PHP. De estas cuatro, sólo 2 (<?php ... ?> y <script language="php"> ...
</script>) están siempre disponibles; el resto pueden ser configuradas en el fichero de
php.ini para ser o no aceptadas por el intérprete. Mientras que el formato corto de
etiquetas (short-form tags) y el estilo ASP (ASP-style tags) pueden ser convenientes, no
son portables como la versión de formato largo de etiquetas. Además, si se pretende
embeber código PHP en XML o XHTML, será obligatorio el uso del formato <?php ...
?> para la compatibilidad con XML.

Las etiquetas soportadas por PHP son:
Formas de escapar de HTML
<?php
echo("si quieres servir documentos XHTML o XML, haz  como   aquí<BR>");
?>

<?
echo ("esta es la más simple, una instrucción de procesado   SGML <BR>");
?>
<?= expression ?> Esto es una abreviatura de "<? echo expression ?>"<BR>
<script language="php">
echo ("muchos editores (como FrontPage) no aceptan instrucciones de
procesado<BR>");
</script>
<%
echo ("Opcionalmente, puedes usar las etiquetas ASP<BR>");
%>
<%= $variable; # Esto es una abreviatura de "<% echo . . ." %>

El método primero, <?php ... ?>, es el más conveniente, ya que permite el uso
de PHP en código XML como XHTML.
El método segundo no siempre está disponible. El formato corto de etiquetas
está disponible con la función short_tags() (sólo PHP 3), activando el parámetro del
fichero de configuración de PHP short_open_tag, o compilando PHP con la opción --
enable-short-tags del comando configure. Está activa por defecto en php.ini-dist. PROGRAMACIÓN EN LENGUAJE PHP5. NIVEL BÁSICO

34
 
El método cuarto sólo está disponible si se han activado las etiquetas ASP en el
fichero de configuración: asp_tags.
Nota: El soporte de etiquetas ASP se añadió en la versión 3.0.4.
Nota: No se debe usar el formato corto de etiquetas cuando se desarrollen
aplicaciones o librerías con intención de redistribuirlas, o cuando se
desarrolle para servidores que no están bajo nuestro control, porque puede
ser que el formato corto de etiquetas no esté soportado en el servidor. Para
generar código portable y redistribuíble, asegúrate de no usar el formato
corto de etiquetas.

La etiqueta de fin de bloque incluirá tras ella la siguiente línea si hay alguna
presente. Además, la etiqueta de fin de bloque lleva implícito el punto y coma; no
necesitas por lo tanto añadir el punto y coma final de la última línea del bloque PHP.
PHP permite estructurar bloques como:
<?php
if ($expression) {
?>
    <strong>This is true.</strong>
<?php
} else {
?>
    <strong>This is false.</strong>
<?php
}
?>

Este ejemplo realiza lo esperado, ya que cuando PHP encuentra las etiquetas ?>
de fin de bloque, empieza a escribir lo que encuentra tal cual hasta que encuentra otra
etiqueta de inicio de bloque. El ejemplo anterior es, por supuesto, inventado. Para
escribir bloques grandes de texto generamente es más eficiente separalos del código
PHP que enviar todo el texto mediante las funciones echo(), print() o similares.
2.2. Comentarios
Una vez visto como se introduce código PHP dentro del código HTML, lo
siguiente es ver como se puede comentar el código PHP. PHP soporta el estilo de
comentarios de 'C', 'C++' y de la interfaz de comandos de Unix. Por ejemplo:

<?php
    echo "Esto es una prueba"; // Comentario estilo c++
    /* Comentario multi-linea
       con varias lineas de comentario */
    echo "Otra prueba";
    echo "Prueba final"; # Comentario estilo shell de Unix
?>

Los estilos de comentarios de una línea (es decir, // y #) actualmente sólo
comentan hasta el final de la línea o el bloque actual de código PHP, lo primero que
ocurra.
<h1>Esto es un <?php # echo "simple";?> ejemplo.</h1>
<p>La cabecera de arriba dice 'Esto es un ejemplo.'. PROGRAMACIÓN EN LENGUAJE PHP5. NIVEL BÁSICO

Hay que tener cuidado con no anidar comentarios de estilo 'C', algo que puede
ocurrir al comentar bloques largos de código.

<?php
 /*
   echo "Esto es una prueba"; /* Este comentario causa problemas*/
 */
?>
Los estilos de comentarios de una linea actualmente sólo comentan hasta el final
de la linea o del bloque actual de código PHP, lo primero que ocurra. Esto implica que
el código HTML tras // ?> será impreso: ?> sale del modo PHP, retornando al modo
HTML, el comentario // no le influye.
2.3. Instrucciones
Un fragmento de código PHP va a estar compuesto por una o varias
instrucciones. En PHP la separación de instrucciones se hace de la misma manera que
en C o Perl - terminando cada instrucción con un punto y coma.

La etiqueta de fin de bloque (?>) implica el fin de la instrucción, por lo tanto no
es necesario un punto y coma después de la última instrucción. Como se ve en el
ejemplo donde los dos fragmentos siguientes son equivalentes:
<?php
    echo "Esto es una prueba";
?>

<?php echo "Esto es una preba" ?>
Todo script PHP se compone de una serie de sentencias o instrucciones. Una
sentencia puede ser una asignación, una llamada a función, un bucle, una sentencia
condicional e incluso una sentencia que no haga nada (una sentencia vacía). Las
sentencias normalmente acaban con punto y coma como se ha dicho anteriormente.
Además, las sentencias se pueden agrupar en grupos de sentencias encapsulando un
grupo de sentencias con llaves. Un grupo de sentencias es también una sentencia.

Para construir las sentencias o instrucciones se necesitan distintos elementos:
variables y constantes, operadores, estructuras de control, funciones, ...
A continuación se irán viendo cada uno de estos elementos que permiten construir los
scripts de PHP.

PHP frente a otros lenguajes

Para seleccionar un lenguaje de Script las cuatro grandes características que debe
cumplir son: Velocidad, estabilidad, seguridad y simplicidad.

• Velocidad: No sólo la velocidad de ejecución, la cual es importante, sino además no
crear demoras en la máquina. Por esta razón no debe requerir demasiados recursos
de sistema. PHP se integra muy bien junto a otro software, especialmente bajo
ambientes Unix, cuando se configura como módulo de Apache, esta listo para ser
utilizado.
• Estabilidad: La velocidad no sirve de mucho si el sistema se cae cada cierta
cantidad de ejecuciones. Ninguna aplicación es 100% libre de bugs, pero teniendo
de respaldo una increíble comunidad de programadores y usuarios es mucho mas
difícil para lo bugs sobrevivir. PHP utiliza su propio sistema de administración de
recursos y dispone de un sofisticado método de manejo de variables, conformando
un sistema robusto y estable.
• Seguridad: El sistema debe poseer protecciones contra ataques. PHP provee
diferentes niveles de seguridad, estos pueden ser configurados desde el archivo .ini
• Simplicidad: Se les debe permitir a los programadores generar código
productivamente en el menor tiempo posible. Usuarios con experiencia en C y C++
podrán utilizar PHP rápidamente.

Bueno otra característica a tener en cuenta seria la conectividad. PHP dispone de
una amplia gama de librerías, y agregarle extensiones es muy fácil. Esto le permite al
PHP ser utilizado en muchas áreas diferentes, tales como encriptado, gráficos, XML y
otras.
Ventajas adicionales de PHP
• PHP corre en (casi) cualquier plataforma utilizando el mismo código fuente,
pudiendo ser compilado y ejecutado en algo así como 25 plataformas, incluyendo
diferentes versiones de Unix, Windows (95,98,NT,ME,2000,XP,...) y Macs. Como
en todos los sistemas se utiliza el mismo código base, los scripts pueden ser
ejecutados de manera independiente al OS.
• La sintaxis de PHP es similar a la del C, por esto cualquiera con experiencia en
lenguajes del estilo C podrá entender rápidamente PHP. Entre los lenguajes del tipo
C incluimos al Java y Javascript, de hecho mucha de la funcionalidad del PHP se la
debe al C en funciones como fread() o srtlen(), así que muchos programadores se
sentirán como en casa.
• PHP es completamente expandible. Está compuesto de un sistema principal (escrito
por Zend), un conjunto de módulos y una variedad de extensiones de código.
• Muchas interfaces distintas para cada tipo de servidor. PHP actualmente se puede
ejecutar bajo Apache 1.3 y 2.X, IIS, Lighttpd, Netscape servers (Sun Java System,
Sun One, iPlanet, …),… . Otra alternativa es configurarlo como modulo CGI.
• Puede interactuar con muchos motores de bases de datos tales como MySQL, MS
SQL, Oracle, Informix, PostgreSQL, y otros muchos. Siempre podrás disponer de
ODBC para situaciones que lo requieran.
• Una gran variedad de módulos cuando un programador PHP necesite una interfase
para una librería en particular, fácilmente podrá crear una API para esta. Algunas de
las que ya vienen implementadas permiten manejo de gráficos, archivos PDF, Flash,
Cybercash, calendarios, XML, IMAP, POP, etc.
• Rapidez. PHP generalmente es utilizado como modulo de Apache, lo que lo hace
extremadamente veloz. Esta completamente escrito en C, así que se ejecuta
rápidamente utilizando poca memoria.
• PHP es Open Source, lo cual significa que el usuario no depende de una compañía
específica para arreglar cosas que no funcionan, además no estás forzado a pagar
actualizaciones anuales para tener una versión que funcione.

Algunas desventajas
• El manejo de errores no es tan sofisticado como otros lenguajes (ASP.Net, …) .
• No existe IDE o Debugger consolidado. Aunque en la actualidad existen proyectos
varios entre los mas destacados está Eclipse (gratuito) o Zend Studio (de pago).

Cuando debes utilizar PHP y cuando debes utilizar otro lenguaje
Si estás desarrollando bajo una plataforma UNIX o Linux, debes elegir entre
Perl y PHP, ambos excelentes. Para mucha gente PHP es más simple a la hora de
escribir scripts, haciéndolo más productivo en proyectos.
En ambientes Windows compite muy de cerca con ASP.Net , aquí la elección se
basa en asuntos un poco más técnicos y en la política que desee utilizarse para el sitio.
ASP.Net junto a IIS es probablemente más estable que PHP con IIS. Pero en términos
puramente técnicos, PHP bajo Windows Server es mucho más estable (además de ser
más rápido y utilizar menos recursos). De cualquier manera ASP.Net ofrece una mejor
integración con este ambiente sobre todo si se desea utilizar COM+.


Funcionamiento de un Servidor Web


Dado que en este curso se va a tratar el desarrollo de sitios web dinámicos
mediante PHP, antes de entrar en porque elegir PHP y no otro lenguaje de
programación, y como funciona dicho lenguaje, hemos de comprender como funciona
un servidor web cuando un usuario solicita una de esas páginas que nosotros vamos a
construir con PHP.

Vamos a comenzar explicando como funciona un servidor web (como Apache,
IIS, PWS, ...) cuando un usuario solicita una página HTML estática que contiene 5
imágenes en su contenido.
Para resolver dicha petición, el navegador del usuario debe establecer una
conexión HTTP distinta para cada elemento que se desea solicitar al servidor web, es
decir, una conexión HTTP para la página HTML y 5 conexiones HTTP adicionales para
las imágenes (una por imagen).
Es decir, la situación vendría a ser como se muestra a continuación:

Si en lugar de páginas estáticas, las páginas son dinámicas, es decir muestran
información obtenida de ficheros, bases de datos, u otras fuentes, pero que varía en
función de una serie de parámetros sin la intervención del programador web, se nos
presentan distintas alternativas para dar el carácter dinámico a las páginas: bien darles
dinamismo en la parte de clientes (por ejemplo usando applets), o bien darles
dinamismo en la parte del servidor (usando CGI, SERVLETS o lenguajes como PHP,
ASP O JSP).

Si optamos por dar dinamismo en la parte del cliente, el funcionamiento cuando
el usuario solicita una página que contiene un APPLET es bastante similar al visto para
las páginas estáticas, es decir, se tendrá que realizar una conexión HTTP para obtener la
página y tantas conexiones HTTP como APPLETS contenga dicha página. Un
APPLET, que es un programa escrito en el lenguaje JAVA, se ejecuta en la propia
CLIENTE SERVIDOR
Petición HTTP
Archivo HTML
CLIENTE SERVIDOR
Petición HTTP 1 imagen
Archivo imagen
5 veces5 veces PROGRAMACIÓN EN LENGUAJE PHP5. NIVEL BÁSICO


máquina del cliente, con las consiguientes desventajas de acceso a recursos ubicados en
el servidor, y con la desventaja de que se tiene que ejecutar en una JVM (Java Virtual
Machine) que hay que tener instalada en la máquina  en la que se sitúa el cliente.
Su uso se reduce a dotar a las páginas de efectos visuales y sonoros, textos en
movimiento, pequeñas utilidades para incluir en la página como un reloj, pequeños
programas educativos, pequeños juegos interactivos, presentaciones multimedia, etc
Sin embargo, si optamos por dar dinamismo en la parte del servidor el
funcionamiento es un poco diferente. Desde el punto de vista del usuario que solicita
una página el funcionamiento es el ya visto, es decir, el usuario solicita una página y se
le devuelve un archivo HTML (lo que genera una conexión HTTP al servidor) y tantas
imágenes o elementos como tenga incluidos la página (una conexión HTTP por cada
uno de estas imágenes o elementos).

Pero desde el punto de vista del servidor la cosa es un poco más compleja.
Cuando se solicita una pagina web que contiene código denominado script, es decir,
incluido dentro de la página HTML, escrito en PHP, ASP, JSP o cualquier otro lenguaje
similar, el servidor web antes de devolver dicha página HTML, solicita al interprete de
scripts que ejecute ese código como si de un programa se tratase y le devuelva un
resultado. Ese resultado incrustado en el documento HTML original constituye el
documento HTML devuelto al usuario. El interprete de scripts para ejecutar dicho
código script y devolver un resultado puede acceder a multitud de recursos del servidor
(bases de datos, ficheros, servicios de correo, ftp, news, ....) u de otros servidores. De
esta forma el esquema anterior se complica para quedar de la siguiente forma:


CLIENTE SERVIDOR
Petición HTTP
Archivo HTML
CLIENTE SERVIDOR
Petición HTTP
Archivo HTML
SCRIPT RECURSOS
Ejecutar Script Obtener recurso
Devolver  recurso Devolver  resultado

Las diferencias de amigos y mejores amigos

Amigo: Te pide permiso para agarrar agua o comida.
Mejor amigo: Es la razón por la cual no tienes comida en la nevera.
Amigo: Te sacaría de la cárcel.
Mejor amigo: Estaría preso contigo diciéndote: “¿tienes frío maricon?”.
Amigo: No te ha visto llorar.
Mejor amigo: No le diría a nadie que has llorado, pero se cagaría de la risa cuando ya no estuvieras triste.
Amigo: Te pide prestadas tus cosas un par de días y te las devuelve.
Mejor amigo: Bota tus vainas y te dice “Coño pana; no se donde lo dejé”…
Amigo: Solo sabe algunas cosas sobre ti.
Mejor amigo: Podría escribir un libro con todas las pendejadas que han pasado y las brutalidades que has hecho.
Amigo: Te dejaría de hablar si los demás lo hacen.
Mejor amigo: Manda a comer mierda a los que te dejen de hablar.
Amigo: Toca la puerta de tu casa.
Mejor amigo: Entra hasta tu cuarto y grita: Hay comida…?
Amigo: Te quita la cerveza cuando ve que ya estás cayéndote de la pea.
Mejor amigo: Ya tambaleándose se acerca y te medio dice: “te la terminas GÜEVÓN porque aquí no desperdiciamos nada”

C++ ejemplos

Ejemplos
En este apéndice se incluyen algunos programas de ejemplo escritos en lenguaje
C.  Los  programas  han sido  realizados  de  forma  que  puedan ser  compilados  en la
mayoría de compiladores existentes para los sistemas operativos MS-DOS y UNIX sin
que exista la necesidad de realizar ningún tipo de cambio en los mismos.
B.1 - palindro.c.
/* Programa que calcula si una palabra es palindroma, esto es, se lee
igual de derecha a izquierda que de izquierda a derecha. */
#include <stdio.h>
#include <string.h>
#define TAM 100
/* Rutina que calcula si una palabra es palindroma.
Parametros: char *cadena Puntero al string con la palabra.
Return: int 0 no palindroma, <>0 palindroma. */
int Palindroma(char *cadena)
{
   register int i,j;
   i=0;
   j=strlen(cadena)-1;
   while (i<j && cadena[i]==cadena[j])
   {
      i++;
j--;
}
return (i>=j);
}
int main(void)
{
   char cadena[TAM];
   printf("\nIntroduce la palabra\n");
   gets(cadena);
   printf("La palabra: %s %s palindroma.\n",cadena,
      (Palindroma(cadena)) ? "es" : "no es");
return 0;
}
B.2 - matriz.c.
/* Programa que calcula el producto de dos matrices. */
#include <stdio.h>
75El lenguaje de programación C
/* Definicion del tamaño maximo */
#define TAM 10
/* Definicion de los codigos de error */
#define OK 0
#define ERROR 1
/* Definicion de la estructura de datos */
struct MATRIZ
{
   unsigned fila,columna;
float matriz[TAM][TAM];
};
/* Rutina que muestra un menu y pide una opcion del menu.
Parametros: Ninguno.
Return: char Opcion del menu elegida. */
char Menu(void)
{
   register char d;
   printf("\nElige la opcion deseada:\n");
   printf("\t0 -- Salir del programa.\n");
   printf("\t1 -- Cambiar la matriz A.\n");
   printf("\t2 -- Cambiar la matriz B.\n");
   printf("\t3 -- Calcular A*B\n");
   printf("\t4 -- Calcular B*A\n");
   while ((d=getchar())<'0' || d>'4');
return d;
}
/* Rutina que pide el numero de filas o de columnas de una matriz.
Parametros: char *cadena Puntero al string a mostrar.
Return: unsigned Numero de filas o de columnas. */
unsigned PedirTamano(const char *cadena)
{
unsigned valor;
do
{
      printf("%s",cadena);
      scanf("%u",&valor);
   }
   while (valor==0 || valor>TAM);
   return valor;
}
/* Rutina que cambia una matriz.
Parametros: struct MATRIZ *a Puntero a la matriz que vamos a cambiar.
Return: Ninguno. */
void PedirMatriz(struct MATRIZ *a)
{
   register unsigned i,j;
float valor;
76El lenguaje de programación C
   a->fila=PedirTamano("\nNumero de filas de la matriz: ");
   a->columna=PedirTamano("\nNumero de columnas de la matriz: \n");
   for(i=0;i<a->fila;i++)
      for(j=0;j<a->columna;j++)
      {
         printf("M[%u][%u]: ",i,j);
         scanf("%f",&valor);
         a->matriz[i][j]=valor;
      }
}
/* Rutina que multiplica dos matrices. Las matrices se pasan por
puntero pues ello es mas rapido, aunque no se modifican en toda la
funcion.
Parametros: struct MATRIZ *a Puntero a la estructura con la primera
matriz a multiplicar.
            struct MATRIZ *b Puntero a la estructura con la segunda
matriz a multiplicar.
            struct MATRIZ *res Puntero a la estructura que contendra
el resultado.
Return: int Codigo de error. */
int Multiplicar(const struct MATRIZ *a,const struct MATRIZ *b,struct
MATRIZ *res)
{
   register unsigned i,j,k;
if (a->columna!=b->fila)
      return ERROR;
   res->fila=a->fila;
   res->columna=b->columna;
for(i=0;i<a->fila;i++)
      for(j=0;j<b->columna;j++)
{
         res->matriz[i][j]=0;
for(k=0;k<a->fila;k++)
            res->matriz[i][j]+=a->matriz[i][k]*b->matriz[k][j];
}
   return OK;
}
/* Rutina que muestra en pantalla el resultado de la operacion.
Parametros: struct MATRIZ *res Puntero a la estructura con el
resultado.
Return: Ninguno. */
void Mostrar(const struct MATRIZ *res)
{
register unsigned i,j;
for(i=0;i<res->fila;i++)
{
      for(j=0;j<res->columna;j++)
         printf("Res[%u][%u]= %f\n",i,j,res->matriz[i][j]);
      printf("\nPulsa Enter para continuar.\n");
      getchar();
   }
}
77El lenguaje de programación C
int main(void)
{
   struct MATRIZ a,b,res;
   char d;
   a.fila=a.columna=b.fila=b.columna=1;
   a.matriz[0][0]=b.matriz[0][0]=1.0;
   do
      switch(d=Menu())
{
         case '0':break;
case '1':PedirMatriz(&a);
            break;
case '2':PedirMatriz(&b);
break;
case '3':
if (Multiplicar(&a,&b,&res)==ERROR)
               printf("\nNo es posible multiplicar A*B\n");
else
               Mostrar(&res);
break;
         case '4':
            if (Multiplicar(&b,&a,&res)==ERROR)
               printf("\nNo es posible multiplicar B*A\n");
else
Mostrar(&res);
break;
      }
   while (d!='0');
return 0;
}
B.3 - ordenar.c.
/* Programa que ordena un fichero de cualquier tamaño mediante el
algoritmo QuickSort. El fichero contiene como primer elemento un
unsigned con el numero de elementos del fichero, y a continuacion
figuran todos los elementos a ordenar */
#include <stdio.h>
#include <stdlib.h>
/* Rutina que lee el fichero de datos y devuelve un puntero al array
de la memoria reservada.
Parametros: char *nombre Nombre del fichero a leer.
            unsigned *num Puntero al unsigned que contendra el numero
de elementos del array.
Return: float * Puntero al array de float, NULL si sucede un error. */
float *LeerFichero(const char *nombre, unsigned *num)
{
   FILE *fp;
float *p;
register unsigned i;
78El lenguaje de programación C
   if ((fp=fopen(nombre,"rt"))==NULL)
{
      printf("\nError, no puedo abrir el fichero: %s\n",nombre);
      return NULL;
}
fscanf(fp,"%u\n",num);
if ((p=(float *)calloc(*num,sizeof(float)))==NULL)
{
      printf("\nError, memoria insuficiente.\n");
      fclose(fp);
return NULL;
}
for(i=0;i<*num;i++)
fscanf(fp,"%f\n",&p[i]);
fclose(fp);
return p;
}
/* Rutina que escribe el fichero de datos ordenado.
Parametros: char *nombre Nombre del fichero donde guardar los datos.
            unsigned num Numero de elementos del array.
            float *p Puntero al array ordenado.
Return: Ninguno. */
void GuardarFichero(const char *nombre,const unsigned num,const float
*p)
{
   FILE *fp;
register unsigned i;
if ((fp=fopen(nombre,"wt"))==NULL)
{
      printf("\nError, no puedo crear el fichero: %s\n",nombre);
      return;
}
fprintf(fp,"%u\n",num);
for(i=0;i<num;i++)
fprintf(fp,"%f\n",p[i]);
fclose(fp);
}
/* Rutina que ordena un array segun el algoritmo Quick-Sort.
Parametros:   float *p Puntero al array a ordenar.
              unsigned izq Elemento de la izquierda a ordenar.
              unsigned der Elemento de la derecha a ordenar.
Return:   Ninguno. */
void QuickSort(float *p,unsigned izq,unsigned der)
{
register unsigned i=izq,j=der;
float val,inter;
val=p[(i+j)/2];
do
{
      while (p[i]<val) i++;
while (p[j]>val) j--;
if (i<=j)
79El lenguaje de programación C
      {
         inter=p[i];
p[i]=p[j];
p[j]=inter;
i++;
j--;
      }
   }
while (i<=j);
if (izq<j) QuickSort(p,izq,j);
if (i<der) QuickSort(p,i,der);
return;
}
int main(int argc,char *argv[])
{
float *p;
unsigned num;
if (argc!=3)
   {
      printf("\nModo de uso: %s <fichero1> <fichero2>\n",argv[0]);
      return(1);
}
if ((p=LeerFichero(argv[1],&num))==NULL)
return 1;
QuickSort(p,0,num-1);
GuardarFichero(argv[2],num,p);
free(p);
return 0;
}
B.4 - fichero.c.
/* Programa que maneja una pequeña base de datos directamente sobre el
fichero */
#include <stdio.h>
#include <string.h>
/* Definicion de las constantes del programa */
#define TAM 30
#define TAM_BUFFER 10
/* Definicion de los codigos de error */
#define OK 0
#define ERROR 1
/* Definicion de las estructuras de datos del programa */
struct FICHA
{
   unsigned long dni;
char nombre[TAM];
   char apellido[2][TAM];
};
80El lenguaje de programación C
/* Rutina que muestra un menu en pantalla.
Parametros: Ninguno.
Return: char Opcion elegida. */
char Menu(void)
{
   register char d;
   printf("\nElige una opcion:\n");
   printf("\t0 -- Salir del programa.\n");
   printf("\t1 -- Insertar un nuevo elemento.\n");
   printf("\t2 -- Buscar un elemento por su dni.\n");
   printf("\t3 -- Buscar un elemento por su apellido.\n");
   while ((d=getchar())<'0' || d>'3');
return d;
}
/* Rutina que muestra un elemento en pantalla.
Parametros: struct FICHA *ficha Puntero a la estructura con los datos
a mostrar.
Return: Ninguno. */
void Mostrar(const struct FICHA *ficha)
{
   printf("\n\nDNI: %lu\n",ficha->dni);
   printf("NOMBRE: %s\n",ficha->nombre);
   printf("PRIMER APELLIDO: %s\n",ficha->apellido[0]);
   printf("SEGUNDO APELLIDO: %s\n",ficha->apellido[1]);
   printf("\nPulsa Enter para continuar\n");
   getchar();
}
/* Rutina que busca un elemento dado su dni.
Parametros: FILE *fichero Puntero al fichero de trabajo.
            unsigned long dni Numero de dni a buscar.
            char opcion Opcion de ejecucion, 1 mostrar, 0 no mostrar.
Return: int Codigo de error. */
int BuscarDni(FILE *fichero,const unsigned long dni,const char opcion)
{
struct FICHA ficha;
   fseek(fichero,0L,SEEK_SET);
while (fread(&ficha,sizeof(struct FICHA),1,fichero)==1)
      if (dni==ficha.dni)
{
         if (opcion)
            Mostrar(&ficha);
Return OK;
}
   return ERROR;
}
/* Rutina que busca por apellidos.
Parametros: FILE *fichero Puntero al fichero de trabajo.
            char *apellido Apellido a buscar.
Return: int Codigo de error.*/
81El lenguaje de programación C
int BuscarApellido(FILE *fichero,char *apellido)
{
   struct FICHA ficha;
char encontrado=0;
fseek(fichero,0L,SEEK_SET);
while (fread(&ficha,sizeof(struct FICHA),1,fichero)==1)
      if (!strcmp(apellido,ficha.apellido[0]) ||
         !strcmp(apellido,ficha.apellido[1]))
      {
         Mostrar(&ficha);
         encontrado=1;
      }
   return (encontrado) ? OK : ERROR;
}
/* Rutina que inserta un nuevo elemento en el fichero.
Parametros: FILE *fichero Puntero al fichero de trabajo.
            struct FICHA *ficha Puntero a la ficha a insertar.
Return: int Codigo de error. */
int Insertar(FILE *fichero,const struct FICHA *ficha)
{
   if (BuscarDni(fichero,ficha->dni,0)!=ERROR)
      return ERROR;
   fseek(fichero,0L,SEEK_END);
   fwrite(ficha,sizeof(struct FICHA),1,fichero);
return OK;
}
/* Rutina que pide los datos de una ficha.
Parametros: struct FICHA *ficha Puntero a la ficha que contendra los
datos.
            char opcion Opcion de ejecucion (0..2).
Return: struct FICHA * Puntero a la ficha que contiene los datos. */
struct FICHA *PedirDatos(struct FICHA *ficha,
const char opcion)
{
   switch(opcion)
{
      case 0: printf("\nDNI: ");
         scanf("%lu",&ficha->dni);
fflush(stdin);
break;
case 1: fflush(stdin);
printf("APELLIDO: ");
         strupr(gets(ficha->apellido[1]));
break;
case 2: printf("\nDNI: ");
scanf("%lu",&ficha->dni);
fflush(stdin);
printf("NOMBRE: ");
strupr(gets(ficha->nombre));
printf("PRIMER APELLIDO: ");
         strupr(gets(ficha->apellido[0]));
         printf("SEGUNDO APELLIDO: ");
         strupr(gets(ficha->apellido[1]));
82El lenguaje de programación C
         break;
   }
return ficha;
}
int main(int argc,char *argv[])
{
FILE *fichero;
struct FICHA ficha;
register char d;
if (argc!=2)
{
      printf("\nModo de uso: %s <fichero>\n",argv[0]);
return 1;
}
if ((fichero=fopen(argv[1],"a+b"))==NULL)
{
      printf("\nError creando el fichero: %s\n",argv[1]);
return 1;
}
if (setvbuf(fichero,NULL,_IOFBF,
TAM_BUFFER*sizeof(struct FICHA))!=0)
{
      printf("\nError creando el buffer para %d elementos.\n",
         TAM_BUFFER);
fclose(fichero);
return 1;
}
do
switch(d=Menu())
{
         case '0':break;
case '1':if (Insertar(fichero,PedirDatos(&ficha,2))==ERROR)
                     printf("\nNumero de dni duplicado.\n");
            break;
         case '2':PedirDatos(&ficha,0);
            if (BuscarDni(fichero,ficha.dni,1)==ERROR)
               printf("\nDni no existente.\n");
            break;
         case '3':PedirDatos(&ficha,1);
            if (BuscarApellido(fichero,ficha.apellido[1])==ERROR)
               printf("\nApellido inexistente.\n");
            break;
      }
   while (d!='0');
fclose(fichero);
return 0;
}
B.5 - arbol.c.
/* Programa que lee las palabras de un fichero y las almacena en un
arbol binario */
#include <stdio.h>
 El lenguaje de programación C
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
/* Definicion de la longitud maxima de una palabra */
#define TAM 30
/* Definicion de las estructuras de datos del programa */
struct ARBOL
{
   char pal[TAM+1];
struct ARBOL *izq,*der;
};
/* Rutina que lee una palabra del fichero.
Parametros: FILE *fichero Puntero al fichero de donde se leen las
palabras.
            char *cadena Array de caracteres donde almacenar las
palabras.
Return: char * Puntero a la cadena con la palabra leida, NULL si
error. */
char *LeerPalabra(FILE *fichero,char *cadena)
{
   register char d,i=0;
while ((d=fgetc(fichero))!=EOF && !isalpha(d));
if (d==EOF)
      return NULL;
do
cadena[i++]=d;
while (i<TAM && (isalpha(d=fgetc(fichero)) || isdigit(d) ||
d=='_'));
cadena[i]='\0';
   return cadena;
}
/* Rutina que crea el arbol binario, leyendo para ello el fichero.
Parametros: char *nombre Nombre del fichero a leer.
Return: struct ARBOL * Puntero a la raiz del arbol creado, NULL si
error. */
struct ARBOL *LeerFichero(char *nombre)
{
   FILE *fichero;
   char cadena[TAM+1],insertado;
   int val;
struct ARBOL *cab=NULL,*p,*q;
if ((fichero=fopen(nombre,"rt"))==NULL)
   {
      printf("\nError, no puedo leer el fichero: %s\n",nombre);
      return(NULL);
   }
   while (LeerPalabra(fichero,cadena)!=NULL)
{
      if ((q=(struct ARBOL *)malloc(sizeof(struct ARBOL)))==NULL)
{
84El lenguaje de programación C
         printf("\nError reservando memoria.\n");
         fclose(fichero);
return NULL;
      }
      strcpy(q->pal,cadena);
q->izq=q->der=NULL;
if (cab==NULL)
cab=q;
else
{
p=cab;
insertado=0;
while (!insertado)
            if ((val=strcmp(cadena,p->pal))<0)
               if (p->izq==NULL)
{
                  p->izq=p;
                  insertado=1;
}
else
p=p->izq;
            else
if (val>0)
if (p->der==NULL)
{
                     p->der=q;
insertado=1;
}
else
p=p->der;
               else
insertado=1;
      }
   }
fclose(fichero);
return cab;
}
/* Rutina que muestra por pantalla el arbol ordenado a la vez que
libera la memoria.
Parametros: struct ARBOL *p Puntero al nodo a mostrar.
            unsigned *cont Puntero al contador de elementos para
permitir parar la visualizacion.
Return: Ninguno.
*/
void Mostrar(struct ARBOL *p,unsigned *cont)
{
   if (p->izq!=NULL)
      Mostrar(p->izq,cont);
puts(p->pal);
if (++*cont>21)
{
*cont=1;
printf("\nPulsa Enter para continuar.\n");
getchar();
}
if (p->der!=NULL)
85El lenguaje de programación C
      Mostrar(p->der,cont);
   free(p);
}
int main(int argc,char *argv[])
{
struct ARBOL *p;
unsigned cont=1;
if (argc!=2)
{
      printf("\nModo de uso: %s <fichero>\n",argv[0]);
      return 1;
}
if ((p=LeerFichero(argv[1]))==NULL)
return 1;
printf("\n\n\n\n\n\n");
Mostrar(p,&cont);
   return 0;
}

c++ apendice e y f

A.5 - Asignación dinámica de memoria.
calloc
#include <stdlib.h>
void *calloc(size_t num,size_t tam);
La función calloc() asigna memoria para un array de num objetos, cada uno de
los cuales tiene tamaño tam. La memoria asignada es inicializada con el valor cero. La
función calloc() devuelve un puntero al primer byte de la región asignada. Si no existe
memoria  libre  suficiente  para  satisfacer  la  petición,  se  devuelve  un  puntero  nulo
(NULL).
free
#include <stdlib.h>
void free(void *ptr);
La  función  free() libera  la  memoria  apuntada  por  ptr,  haciendo  que  dicha
memoria este disponible para futuras asignaciones. Solo se debe llamar a free() con un
puntero que haya sido previamente asignado utilizando alguna función de asignación
dinámica.El lenguaje de programación C
malloc
#include <stdlib.h>
void *malloc(size_t tam);
La  función  malloc() devuelve  un puntero  al  primer  byte  de  una  región de
memoria de tamaño tam que se encuentra libre. Si no existe memoria suficiente para
satisfacer la petición, se devuelve un puntero nulo (NULL).
realloc
#include <stdlib.h>
void *realloc(void *ptr,size_t tam);
La función realloc() cambia el tamaño de la memoria apuntada por  ptr al que
esta especificado por  tam. El valor de  tam puede ser mayor o menor que el original.
Devuelve un puntero al  nuevo bloque de memoria,  ya  que puede ser  necesario que
realloc() traslade el bloque de posición al  incrementar  su tamaño. Si  esto sucede,  el
contenido del antiguo bloque se copia en el nuevo bloque, por lo cual, la información
no se pierde.
Si  ptr es un puntero nulo (NULL),  realloc() simplemente asigna  tam bytes de
memoria y devuelve un puntero a dicha memoria. Si tam es cero, la memoria asignada
se libera. Si no existe memoria suficiente para satisfacer la petición, realloc() devuelve
un puntero nulo (NULL), y el bloque de memoria original se deja sin cambiar.
A.6 - Funciones varias.
abs
#include <stdlib.h>
int abs(int num);
La función abs() devuelve el valor absoluto del entero dado por num.
atof
#include <stdlib.h>
double atof(const char *cad);
La función  atof() convierte  la  cadena apuntada  por  cad en un valor  de tipo
double. La cadena debe contener un número valido en coma flotante. En caso contrario
el valor devuelto es indefinido.
El número puede terminar por cualquier carácter que no pueda formar parte de
un  número  válido  en  coma  flotante.  Esto  incluye  espacios  en  blanco,  signos  de
puntuación distintos del punto, y caracteres que no sean E o e. Así si se llama a atof()
con la cadena "100.00HOLA", devolverá el valor 100.00.El lenguaje de programación C
atoi
#include <stdlib.h>
int atoi(const char *cad);
La función atoi() convierte la cadena apuntada por cad en un valor de tipo int.
La  cadena  debe contener  un número entero valido.  Si  no es  este  el  caso,  el  valor
devuelto  es  indefinido,  aunque,  la  mayoría  de  implementaciones  de  la  función
devuelven el valor cero.
El número puede acabar con cualquier carácter que no pueda formar parte de un
número entero.  Esto incluye espacios  en blanco,  signos  de puntuación,  y cualquier
carácter  que no sea la  E o la  e. Esto supone que si  se llama a  atoi() con la cadena
"123.23", devolverá el valor 123.
atol
#include <stdlib.h>
long int atol(const char *cad);
La función atol() convierte la cadena apuntada por cad en un valor de tipo long
int. Para más información consultar la función atoi().
exit
#include <stdlib.h>
void exit(int estado);
La  función  exit() da  lugar  inmediatamente  a  la  terminación  normal  de  un
programa.  El  valor  de  estado se  pasa  al  proceso  que  llamo  a  este  programa,
normalmente el sistema operativo, si el entorno lo soporta. Por convenio, si el valor de
estado es cero, se supone que se ha producido una terminación normal del programa.
Un  valor  distinto  de  cero  puede  utilizarse  para  indicar  un  error  definido  por  la
implementación.
labs
#include <stdlib.h>
long labs(long num);
La función labs() devuelve el valor absoluto de num.
system
#include <stdlib.h>
int system(const char *cad);
La  función  system() pasa  la  cadena  apuntada  por  cad como  una  orden  al
procesador  de ordenes del  sistema operativo.  Si  se llama a  system() con un puntero
nulo (NULL),  devuelve un valor  distinto de cero si  está  presente un procesador  deEl lenguaje de programación C
ordenes, en otro caso, se devuelve un valor distinto de cero. Si  cad no es un puntero
nulo  (NULL),  system() devuelve  el  valor  cero  si  la  orden  ha  sido  correctamente
ejecutada, y un valor distinto de cero en caso contrario.

C++ apendice d

A.4 - Funciones matemáticas.
acos
#include <math.h>
double acos(double arg);
La función acos() devuelve el arcocoseno de arg. El argumento de acos() debe
estar en el rango de -1 a 1, en cualquier otro caso se produce un error de dominio.
asin
#include <math.h>
double asin(double arg);
La función  asin() devuelve el  arcoseno de  arg.  El  argumento de  asin() debe
estar en el rango de -1 a 1, en cualquier otro caso se produce un error de dominio.
atan
#include <math.h>
double atan(double arg);
La función atan() devuelve el arcotangente de arg.
atan2
#include <math.h>
double atan2(double y,double x);
La  función  atan2() devuelve el  arcotangente  de  y/x.  Utiliza  el  signo de sus
argumentos para obtener el cuadrante del valor devuelto.El lenguaje de programación C
ceil
#include <math.h>
double ceil(double num);
La  función  ceil() devuelve  el  menor  entero  mayor  o  igual  que  num y  lo
representa como double. Por ejemplo, dado 1.02, ceil() devuelve 2.0, dado -1.02, ceil()
devuelve -1.0.
cos
#include <math.h>
double cos(double arg);
La función cos() devuelve el coseno de arg. El valor de arg debe venir dado en
radianes.
cosh
#include <math.h>
double cosh(double arg);
La función cosh() devuelve el coseno hiperbólico de arg. El valor de arg debe
venir dado en radianes.
exp
#include <math.h>
double exp(double arg);
La función exp() devuelve el número e elevado a la potencia de arg.
fabs
#include <math.h>
double fabs(double num);
La función fabs() devuelve el valor absoluto de num.
floor
#include <math.h>
double floor(double num);
La función floor() devuelve el mayor entero, representado como double, que no
es mayor que  num. Por ejemplo, dado  1.02,  floor() devuelve  1.0, dado  -1.02,  floor()
devuelve -2.0.El lenguaje de programación C
fmod
#include <math.h>
double fmod(double x,double y);
La función fmod() devuelve el resto de la división entera x/y.
log
#include <math.h>
double log(double num);
La función log() devuelve el logaritmo neperiano de num. Se produce un error
de dominio si num es negativo, y un error de rango si el argumento es cero.
log10
#include <math.h>
double log10(double num);
La función  log10() devuelve el logaritmo en base  10 de  num.  Se produce un
error de dominio si num es negativo, y un error de rango si el argumento es cero.
pow
#include <math.h>
double pow(double base,double exp);
La función pow() devuelve base elevada a exp. Se produce un error de dominio
si  base es  cero y  exp es  menor  o igual  a  cero.  También puede ocurrir  si  base es
negativo y exp no es entero. Un desbordamiento produce un error de rango.
sin
#include <math.h>
double sin(double arg);
La función sin() devuelve el seno de  arg. El valor de  arg debe venir dado en
radianes.
sinh
#include <math.h>
double sinh(double arg);
La función  sinh() devuelve el  seno hiperbólico de  arg.  El  valor  de  arg debe
venir dado en radianes.El lenguaje de programación C
sqrt
#include <math.h>
double sqrt(double num);
La función sqrt() devuelve la raíz cuadrada de num. Si se llama con un número
negativo, se produce un error de dominio.
tan
#include <math.h>
double tan(double arg);
La función tan() devuelve la tangente de arg. El valor de arg debe venir dado en
radianes.
tanh
#include <math.h>
double tanh(double arg);
La función tanh() devuelve la tangente hiperbólica de arg. El valor de arg debe
venir dado en radianes.

c++ apendice c

A.3 - Funciones de cadenas.
memchr
#include <string.h>
void *memchr(const void *buffer,int ch,size_t cuenta);
La  función  memchr() busca  en  buffer la  primera  ocurrencia  de  ch en  los
primeros cuenta caracteres. La función devuelve un puntero a la primera ocurrencia del
carácter ch en buffer. Si no encuentra ch, devuelve un puntero nulo (NULL).
memcmp
#include <string.h>
int memcmp(const void *buf1,const void *buf2,size_t cuenta);
La función  memcmp() compara  los  primeros cuenta  caracteres  de los arrays
apuntados  por  buf1 y  buf2.  La comparación se hace lexicográficamente.  La función
devuelve un entero que es interpretado según se indica a continuación:
Valor devuelto Descripción
Menor que cero buf1 es menor que buf2
Igual a cero buf1 es igual a buf2
Mayor que cero buf1 es mayor que buf2
Tabla A.3.1: Interpretación de los valores devueltos por la función memcmp().
memcpy
#include <string.h>
void *memcpy(void *hacia,const void *desde,size_t cuenta);
La función memcpy() copia cuenta caracteres del array apuntado por desde en el
array apuntado por hacia. Si los arrays se superponen, el comportamiento de memcpy()
queda indefinido. La función devuelve un puntero a hacia.
memset
#include <string.h>
void *memset(void *buf,int ch,size_t cuenta);
La función  memset() copia el  byte menos significativo de  ch en los primero
cuenta caracteres  del  array  apuntado por  buf.  Devuelve  buf.  Su uso más  común es
inicializar una región de memoria con algún valor conocido.
strcat
#include <string.h>
char *strcat(char *cad1,const char *cad2);El lenguaje de programación C
La función strcat() concatena una copia de  cad2 en cad1, y añade al  final de
cad1 un carácter  nulo ('\0'). El carácter  nulo de terminación, que originalmente tenía
cad1, es sustituido por el primer carácter de cad2. La cadena cad2 no se modifica en
esta operación. La función strcat() devuelve cad1.
strchr
#include <string.h>
char *strchr(char *cad,int ch);
La función strchr() devuelve un puntero a la primera ocurrencia del byte menos
significativo de ch en la cadena apuntada por  cad. Si no sucede, devuelve un puntero
nulo (NULL).
strcmp
#include <string.h>
int strcmp(const char *cad1,const char *cad2);
La función strcmp() compara lexicográficamente dos cadenas que finalizan con
el carácter nulo, y devuelve un entero que se interpreta de la siguiente forma:
Valor devuelto Descripción
Menor que cero cad1 es menor que cad2
Igual a cero cad1 es igual a cad2
Mayor que cero cad1  es  mayor  que
cad2
Tabla A.3.2: Interpretación de los valores devueltos por la función strcmp().
strcpy
#include <string.h>
char *strcpy(char *cad1,const char *cad2);
La función  strcpy() se  utiliza  para  copiar  el  contenido de  cad2 en  cad1.  El
elemento cad2 debe ser un puntero a una cadena que finalice con un carácter nulo. La
función devuelve un puntero a cad1.
strlen
#include <string.h>
unsigned int strlen(char *cad);
La función strlen() devuelve el número de caracteres de la cadena apuntada por
cad que finaliza con un carácter nulo. El carácter nulo no se contabiliza.
strtok
#include <string.h>
char *strtok(char *cad1,const char *cad2);El lenguaje de programación C
La función  strtok() devuelve un puntero a la siguiente palabra  de la  cadena
apuntada por cad1. Los caracteres que constituyen la cadena apuntada por cad2 son los
delimitadores que identifican la palabra. Devuelve un puntero nulo (NULL) cuando no
existe ninguna palabra que devolver.
La primera vez que se llama a strtok() se utiliza realmente cad1 en la llamada.
Las llamadas posteriores utilizan un puntero nulo (NULL) como primer argumento.
La función strtok() modifica la cadena apuntada por cad1, pues, cada vez que se
encuentra una palabra,  se pone un carácter  nulo donde esta  el  delimitador.  De esta
forma strtok() puede continuar avanzando por la cadena.

c++ apendice c

A.3 - Funciones de cadenas.
memchr
#include <string.h>
void *memchr(const void *buffer,int ch,size_t cuenta);
La  función  memchr() busca  en  buffer la  primera  ocurrencia  de  ch en  los
primeros cuenta caracteres. La función devuelve un puntero a la primera ocurrencia del
carácter ch en buffer. Si no encuentra ch, devuelve un puntero nulo (NULL).
memcmp
#include <string.h>
int memcmp(const void *buf1,const void *buf2,size_t cuenta);
La función  memcmp() compara  los  primeros cuenta  caracteres  de los arrays
apuntados  por  buf1 y  buf2.  La comparación se hace lexicográficamente.  La función
devuelve un entero que es interpretado según se indica a continuación:
Valor devuelto Descripción
Menor que cero buf1 es menor que buf2
Igual a cero buf1 es igual a buf2
Mayor que cero buf1 es mayor que buf2
Tabla A.3.1: Interpretación de los valores devueltos por la función memcmp().
memcpy
#include <string.h>
void *memcpy(void *hacia,const void *desde,size_t cuenta);
La función memcpy() copia cuenta caracteres del array apuntado por desde en el
array apuntado por hacia. Si los arrays se superponen, el comportamiento de memcpy()
queda indefinido. La función devuelve un puntero a hacia.
memset
#include <string.h>
void *memset(void *buf,int ch,size_t cuenta);
La función  memset() copia el  byte menos significativo de  ch en los primero
cuenta caracteres  del  array  apuntado por  buf.  Devuelve  buf.  Su uso más  común es
inicializar una región de memoria con algún valor conocido.
strcat
#include <string.h>
char *strcat(char *cad1,const char *cad2);El lenguaje de programación C
La función strcat() concatena una copia de  cad2 en cad1, y añade al  final de
cad1 un carácter  nulo ('\0'). El carácter  nulo de terminación, que originalmente tenía
cad1, es sustituido por el primer carácter de cad2. La cadena cad2 no se modifica en
esta operación. La función strcat() devuelve cad1.
strchr
#include <string.h>
char *strchr(char *cad,int ch);
La función strchr() devuelve un puntero a la primera ocurrencia del byte menos
significativo de ch en la cadena apuntada por  cad. Si no sucede, devuelve un puntero
nulo (NULL).
strcmp
#include <string.h>
int strcmp(const char *cad1,const char *cad2);
La función strcmp() compara lexicográficamente dos cadenas que finalizan con
el carácter nulo, y devuelve un entero que se interpreta de la siguiente forma:
Valor devuelto Descripción
Menor que cero cad1 es menor que cad2
Igual a cero cad1 es igual a cad2
Mayor que cero cad1  es  mayor  que
cad2
Tabla A.3.2: Interpretación de los valores devueltos por la función strcmp().
strcpy
#include <string.h>
char *strcpy(char *cad1,const char *cad2);
La función  strcpy() se  utiliza  para  copiar  el  contenido de  cad2 en  cad1.  El
elemento cad2 debe ser un puntero a una cadena que finalice con un carácter nulo. La
función devuelve un puntero a cad1.
strlen
#include <string.h>
unsigned int strlen(char *cad);
La función strlen() devuelve el número de caracteres de la cadena apuntada por
cad que finaliza con un carácter nulo. El carácter nulo no se contabiliza.
strtok
#include <string.h>
char *strtok(char *cad1,const char *cad2);El lenguaje de programación C
La función  strtok() devuelve un puntero a la siguiente palabra  de la  cadena
apuntada por cad1. Los caracteres que constituyen la cadena apuntada por cad2 son los
delimitadores que identifican la palabra. Devuelve un puntero nulo (NULL) cuando no
existe ninguna palabra que devolver.
La primera vez que se llama a strtok() se utiliza realmente cad1 en la llamada.
Las llamadas posteriores utilizan un puntero nulo (NULL) como primer argumento.
La función strtok() modifica la cadena apuntada por cad1, pues, cada vez que se
encuentra una palabra,  se pone un carácter  nulo donde esta  el  delimitador.  De esta
forma strtok() puede continuar avanzando por la cadena.

C++ apendice b

A.2 -Funciones de caracteres.
isalnum
#include <ctype.h>
int isalnum(int ch);
La función isalnum() devuelve un valor distinto de cero si  ch es una letra del
alfabeto o un dígito. En caso contrario, se devuelve un valor distinto de cero.
isalphaEl lenguaje de programación C
#include <ctype.h>
int isalpha(int ch);
La función isalpha() devuelve un valor distinto de cero si  ch es una letra del
alfabeto, en cualquier otro caso devuelve cero.
iscntrl
#include <ctype.h>
int iscntrl(int ch);
La función iscntrl() devuelve un valor distinto de cero si ch se encuentra entre 0
y 0x1F o si ch es igual a 0x7F (tecla DEL), en cualquier otro caso devuelve cero.
isdigit
#include <ctype.h>
int isdigit(int ch);
La función isdigit() devuelve un valor distinto de cero si  ch es un dígito (0..9),
en cualquier otro caso devuelve el valor cero.
isgraph
#include <ctype.h>
int isgraph(int ch);
La  función  isgraph() devuelve  un valor  distinto  de  cero si  ch es  cualquier
carácter imprimible distinto del espacio, en cualquier otro caso devuelve cero.
islower
#include <ctype.h>
int islower(int ch);
La función  islower() devuelve un valor  distinto de cero si  ch es una carácter
minúscula, en cualquier otro caso devuelve cero.
isprint
#include <ctype.h>
int isprint(int ch);
La  función  isprintf() devuelve  un valor  distinto  de  cero  si  ch es  cualquier
carácter imprimible, incluyendo el espacio, en cualquier otro caso devuelve cero.
ispunct
#include <ctype.h>El lenguaje de programación C
int ispunct(int ch);
La función ispunct() devuelve un valor distinto de cero si  ch es un carácter de
puntuación, excluyendo el espacio, en cualquier otro caso devuelve el valor cero.
isspace
#include <ctype.h>
int isspace(int ch);
La función  isspace() devuelve un valor  distinto de cero si  ch es un espacio,
tabulador, o carácter de salto de línea, en cualquier otro caso devuelve el valor cero.
isupper
#include <ctype.h>
int isupper(int ch);
La  función  isupper() devuelve  un valor  distinto  de  cero si  ch es  una  letra
mayúscula, en cualquier otro caso devuelve cero.
isxdigit
#include <ctype.h>
int isxdigit(int ch);
La  función  isxdigit() devuelve  un valor  distinto  de  cero si  ch es  un dígito
hexadecimal, en cualquier otro caso devuelve cero. Un dígito hexadecimal está en uno
de estos rangos: 0 hasta 9, A hasta F y a hasta f.
tolower
#include <ctype.h>
int tolower(int ch);
La función tolower() devuelve el equivalente en minúscula de ch, si  ch es una
letra mayúscula, en cualquier otro caso se devuelve ch sin modificar.
toupper
#include <ctype.h>
int toupper(int ch);
La función toupper() devuelve el equivalente en mayúsculas de ch, si ch es una
letra minúscula, en cualquier otro caso se devuelve ch sin modificar.
THEMRFRIKI S.A. Con tecnología de Blogger.

About