Documentos de Académico
Documentos de Profesional
Documentos de Cultura
El lenguaje PHP
Hay que entender primero como funciona la solicitud de páginas en un navegador para
comenzar a programar en PHP.
Este proceso siempre es el mismo cuando hablamos de páginas estáticas (páginas que no
cambian), cualquiera sea el cliente que solicita la página el contenido siempre será el
mismo.
La única forma que el contenido del archivo cambie es que el administrador de ese sitio
web edite el contenido del archivo pagina1.htm y haga modificaciones.
1
Curso dinámico de programación
Tipos de variables
En PHP no es necesario definir el tipo de dato que almacena antes de utilizarla, las mismas
se crean en el momento de emplearlas. Las variables se declaran cuando se le asigna un
valor, por ejemplo:
También podemos hacer notar que para disponer comentarios de línea debemos utilizar dos
caracteres //
pagina1.php
<html>
<head>
<title>Problema</title>
</head>
<body>
<?php
$dia = 24; //Se declara una variable de tipo integer.
$sueldo = 758.43; //Se declara una variable de tipo double.
$nombre = "juan"; //Se declara una variable de tipo string.
$exite = true; //Se declara una variable boolean.
echo "Variable entera:";
echo $dia;
echo "<br>";
echo "Variable double:";
echo $sueldo;
echo "<br>";
echo "Variable string:";
echo $nombre;
echo "<br>";
echo "Variable boolean:";
echo $exite;
?>
2
Curso dinámico de programación
</body>
</html>
Hemos utilizado un comando echo para mostrar los mensajes, otro el contenido de variables
y finalmente otro para imprimir un elemento HTML. Este proceso puede acortarse un poco
pero para que sea más claro inicialmente tomaremos el camino largo de hacer la impresión
de un dato con cada comando echo.
Ejercicio 1:
Definir una variable de cada tipo: integer, double, string y boolean. Luego imprimirlas en la
página, una por línea.
3
Curso dinámico de programación
$cadena1="Hola";
$cadena2="Mundo";
echo $cadena1." ".$cadena2;
Tengamos en cuenta que el comando echo de más arriba lo podemos hacer más largo de la
siguiente forma:
echo $cadena1;
echo " ";
echo $cadena2;
A medida que uno haga ejercicios podremos resumir en un solo comando echo la salida de
múltiples variables.
Cuando una cadena encerrada entre comillas dobles contiene una variable en su interior,
ésta se trata como tal, por lo tanto se utilizará su contenido para el almacenamiento:
$dia=10;
$fecha="Hoy es $dia";
echo $fecha;
Una cadena se puede definir con las comillas simples (pero es importante tener en cuenta
que no se sustituyen las variables si empleamos comillas simples):
4
Curso dinámico de programación
Ejercicio 2:
Definir tres variables enteras. Luego definir un string que incorpore dichas variables y las
sustituya en tiempo de ejecución.
Recordar que una variable se sustituye cuando el string está encerrado por comillas dobles:
$precio=90;
Estructuras de decisión
Cuando se pretende que el programa, una vez llegado a un cierto punto, tome un camino
concreto en determinados casos y otro diferente si las condiciones de ejecución difieren, se
utiliza el conjunto de instrucciones:
if (Condición)
{
Instrucción a1;
Instrucción a2;
}
else
{
Instrucción b1;
Instrucción b2;
}
En los casos en que las condiciones sean varias, se pueden utilizar los if de un modo
denominado anidado o anillado, como se indica de la manera siguiente:
if (Condición 1)
{
Instrucción a1;
Instrucción a2;
}
else
{
if (Condición 2)
{
Instrucción b1;
5
Curso dinámico de programación
Instrucción b2;
}
else
{
Instrucción c1;
Instrucción c2;
}
}
if (Condición 1)
{
Instrucción a1;
Instrucción a2;
}
elseif (Condición 2)
{
Instrucción b1;
Instrucción b2;
}
else
{
Instrucción c1;
Instrucción c2;
}
Para las condiciones tener en cuenta que disponemos de los siguientes operadores:
6
Curso dinámico de programación
pagina1.php
<html>
<head>
<title>Problema</title>
</head>
<body>
<?php
$valor = rand(1, 10);
echo "El valor sorteado es $valor<br>";
if ($valor <= 5) {
echo "Es menor o igual a 5";
} else {
echo "Es mayor a 5";
}
?>
</body>
</html>
Ciclos
El Ciclo for
El primer ejemplo que haremos es mostrar en la página los números del 1 al 100:
7
Curso dinámico de programación
CicloFor.php
<html>
<head>
<title>Problema</title>
</head>
<body>
<?php
for ($f = 1; $f <= 100; $f++) {
echo $f;
echo "<br>";
}
?>
</body>
</html>
El primer argumento del for es la inicialización de una variable, en este caso se inicializa la
variable $f con el valor 1. Este primer argumento del for se ejecuta solo una vez. Luego se
ejecuta el segundo argumento que es la condición. Si la misma se verifica como verdadera
se ejecuta todo el bloque comprendido entre las llaves de apertura y cerrado. Luego de
haberse ejecutado el bloque repetitivo se ejecuta el tercer argumento del for que es el
incremento de la variable, en este caso $f++ incrementa el contenido de la variable $f en 1
(también podemos poner en lugar de $f++ la asignación $f=$f+1)
Luego del incremento de la variable se ejecuta nuevamente la condición del for (segundo
argumento), de validarse nuevamente verdadero pasa a ejecutar el bloque repetitivo.
Este ciclo se repite hasta que la condición del for se verifica falsa.
Ciclo while
while (condición)
{
[Instrucciones];
}
Esta estructura está en casi todos los lenguajes. El bloque se repite mientras la condición
del while sea verdadera.
8
Curso dinámico de programación
cicloWhile.php
<html>
<head>
<title>Problema</title>
</head>
<body>
<?php
$valor = rand(1, 100);
$inicio = 1;
while ($inicio <= $valor) {
echo $inicio;
echo "<br>";
$inicio++;
}
?>
</body>
</html>
La variable $inicio tiene el valor 1 antes de ingresar al while. Cada vez que se ejecuta una
vez el bloque del while se incrementa $inicio en uno. Cuando $inicio supere la variable
$valor finalizará la estructura repetitiva y pasará a ejecutarse la instrucción inmediatamente
siguiente a la llave de cerrado del while.
Es importante notar que luego de la condición del while NO se coloca PUNTO y COMA.
El ciclo do/while
Por último tenemos en el lenguaje una estructura repetitiva similar al while llamada
do/while, donde la condición se verifica luego de ejecutarse el bloque repetitivo.
9
Curso dinámico de programación
do
{
[Instrucciones];
} while (condición);
Ejercicio 3
Mostrar la tabla de multiplicar del 2. Emplear el for, luego el while y por último el
do/while.
EjemploConForm.html
<html>
<head>
<title>Formulario de entrada del dato</title>
</head>
<body>
<form method="post" action="pagina2.php">
Ingrese su nombre:
<input type="text" name="nombre">
<br>
10
Curso dinámico de programación
</html>
Esta página está completamente codificada en HTML, es decir no hay un script en PHP, el
formulario contiene elementos HTML puros.
La propiedad action indica el nombre del archivo que recibirá los datos ingresados por el
operador en el formulario y que serán enviados al servidor cuando se presione el botón
(submit). La propiedad method indica como se organizan esos datos para enviarlos al
servidor, pudiendo ser mediante los métodos post o get (normalmente los datos de un
formulario se envían mediante el método post).
Para crear un cuadro de texto para el ingreso del nombre debemos definir un objeto de tipo
"text" y darle un nombre:
La propiedad type nos permite definir el tipo de control y con la propiedad name indicamos
el nombre del control.
También utilizamos el elemento input pero en la propiedad type indicamos que se trata de
un botón de envío de datos. En la propiedad value indicamos el texto que queremos que
aparezca en el botón.
Ahora necesitamos una página con un pequeño programa en PHP que procese los datos
ingresados en el formulario:
pagina2.php
<html>
<head>
<title>Captura de datos del form</title>
</head>
11
Curso dinámico de programación
<body>
<?php
echo "El nombre ingresado es:";
echo $_REQUEST['nombre'];
?>
</body>
</html>
Para acceder al dato en PHP se cuenta con un vector llamado $_REQUEST indicando como
subíndice el nombre del cuadro de texto que definimos en el formulario (dicho nombre es
sensible a mayúsculas y minúsculas).
Es común indicar entre comillas simples el subíndice en lugar de comillas dobles (con
comillas dobles también funciona)
echo $_REQUEST['nombre'];
Ejercicio 4
Confeccionar un formulario que solicite el nombre de una persona y su edad, luego mostrar
si es mayor o menor de edad.
El control radio
El control HTML radio generalmente se utiliza en conjunto con otros controles radio.
Cuando agrupamos un conjunto de controles radio solo uno de ellos puede estar
seleccionado y si seleccionamos otro se desmarca el actual.
Implementar un formulario que solicite la carga de dos enteros, uno en cada text.
Disponer dos controles de tipo radio que nos permitan seleccionar si queremos sumar o
restar los dos valores ingresados:
12
Curso dinámico de programación
FormconBotonesdeRadio.html
<html>
<head>
<title>Problema</title>
</head>
<body>
<form action="pagina2.php" method="post">
Ingrese primer valor:
<input type="text" name="valor1">
<br>
Ingrese segundo valor:
<input type="text" name="valor2">
<br>
<input type="radio" name="radio1" value="suma">sumar
<br>
<input type="radio" name="radio1" value="resta">restar
<br>
<input type="submit" name="operar">
</form>
</body>
</html>
Es importante notar que se trata nuevamente de un archivo HTML puro, que no tiene
código PHP.
Para seleccionar el tipo de operación a efectuar disponemos dos controles de tipo radio:
Ahora vemos que los dos controles de tipo radio tienen el MISMO nombre. Esto es
necesario para que el navegador sepa que los dos controles están relacionados (recordar que
cuando uno selecciona un radio se debe deseleccionar el otro)
13
Curso dinámico de programación
Por último disponemos un control de tipo submit para el envío de los datos del formulario.
El código de la página que procesa el formulario, llamada:"pagina2.php" (la que indicamos
en el elemento FORM del formulario) es:
pagina2.php
<html>
<head>
<title>Problema</title>
</head>
<body>
<?php
if ($_REQUEST['radio1'] == "suma") {
$suma = $_REQUEST['valor1'] + $_REQUEST['valor2'];
echo "La suma es:" . $suma;
} else {
if ($_REQUEST['radio1'] == "resta") {
$resta = $_REQUEST['valor1'] - $_REQUEST['valor2'];
echo "La resta es:" . $resta;
}
}
?>
</body>
</html>
$_REQUEST['radio1']
$_REQUEST['valor1']
$_REQUEST['valor2']
if ($_REQUEST['radio1'] == "suma") {
$suma = $_REQUEST['valor1'] + $_REQUEST['valor2'];
14
Curso dinámico de programación
if ($_REQUEST['radio1'] == "resta") {
$resta = $_REQUEST['valor1'] - $_REQUEST['valor2'];
echo "La resta es:" . $resta;
}
}
Ejercicio 5
Solicitar que se ingrese por teclado el nombre de una persona y disponer tres controles de
tipo radio que nos permitan seleccionar si la persona: 1-no tiene estudios, 2-estudios
primarios y 3-estudios secundarios.
El control CheckBox
EjemploCheckBox.html
<head>
<title>Problema</title>
</head>
<body>
<form action="pagina2.php" method="post">
Ingrese primer valor:
<input type="text" name="valor1">
<br>
Ingrese segundo valor:
<input type="text" name="valor2">
<br>
<input type="checkbox" name="check1">sumar
15
Curso dinámico de programación
<br>
<input type="checkbox" name="check2">restar
<br>
<input type="submit" name="operar">
</form>
</body>
</html>
pagina2.php
<html>
<head>
<title>Problema</title>
</head>
<body>
<?php
if (isset($_REQUEST['check1'])) {
$suma = $_REQUEST['valor1'] + $_REQUEST['valor2'];
echo "La suma es:" . $suma . "<br>";
}
if (isset($_REQUEST['check2'])) {
$resta = $_REQUEST['valor1'] - $_REQUEST['valor2'];
echo "La resta es:" . $resta;
}
?>
</body>
</html>
16
Curso dinámico de programación
emplea la función isset, si retorna true significa que existe y por lo tanto el checkbox está
seleccionado.
Disponemos dos if independientes altura ya que los dos controles de tipo checkbox podrían
estar seleccionados.
Ejercicio 6
Hacer un formulario que solicite el nombre de una persona y que permita seleccionar una
serie de deportes que practica (futbol, basket, tennis, voley).
El control select
Veamos ahora como podemos rescatar desde PHP el elemento seleccionado de un control
HTML de tipo select.
Ejemplo:
Implementar un formulario que solicite la carga de dos enteros, uno en cada "text".
Disponer un control de tipo select que nos permita seleccionar si queremos sumar o restar
los dos valores ingresados:
EjemploSelect1.html
<html>
<head>
<title>Problema</title>
</head>
<body>
<form action="procesamiento.php" method="post">
Ingrese primer valor:
<input type="text" name="valor1">
<br>
Ingrese segundo valor:
<input type="text" name="valor2">
<br>
<select name="operacion">
<option value="suma">sumar</option>
17
Curso dinámico de programación
<option value="resta">restar</option>
</select>
<br>
<input type="submit" name="operar">
</form>
</body>
</html>
<select name="operacion">
<option value="suma">sumar</option>
<option value="resta">restar</option>
</select>
Cada opción tiene un valor (value). El seleccionado es el que se enviará a la página que
procesa el formulario. El texto que aparece dentro del control es el que disponemos entre
las marcas option.
procesamiento.php
<html>
<head>
<title>Problema</title>
</head>
<body>
<?php
if ($_REQUEST['operacion'] == "suma") {
$suma = $_REQUEST['valor1'] + $_REQUEST['valor2'];
echo "La suma es:" . $suma;
} else {
if ($_REQUEST['operacion'] == "resta") {
$resta = $_REQUEST['valor1'] - $_REQUEST['valor2'];
echo "La resta es:" . $resta;
}
}
?>
</body>
</html>
18
Curso dinámico de programación
if ($_REQUEST['operacion'] == "suma") {
$suma = $_REQUEST['valor1'] + $_REQUEST['valor2'];
echo "La suma es:" . $suma;
} else {
if ($_REQUEST['operacion'] == "resta") {
$resta = $_REQUEST['valor1'] - $_REQUEST['valor2'];
echo "La resta es:" . $resta;
}
}
Sólo se puede seleccionar un elemento de un control select (más adelante veremos como
seleccionar varios elementos en forma simultáneo)
Ejercicio 7
Confeccionar un formulario que solicite el ingreso del nombre de una persona y un control
select (en este último permitir la selección de los ingresos mensuales de la persona: 1-
1000,1001-3000,>3000)
En la página que procesa el formulario mostrar un mensaje si debe pagar impuestos, el cual
lo pagan los que ganen más de Q3000.00
El control textarea
El control HTML "textarea" se diferencia del "text" en que permite el ingreso de muchas
líneas.
Ejemplo:
Implementar un formulario web para ingresar el nombre de una persona en un control text y
mediante un control de tipo textarea se permita el ingreso del curriculum de dicha persona.
FormconTextArea.html
<html>
<head>
19
Curso dinámico de programación
<title>Problema</title>
</head>
<body>
<form action="pagina2.php" method="post">
Ingrese nombre:<input type="text" name="nombre"><br>
Ingrese su curriculum:<br>
<textarea name="curriculum"></textarea>
<br>
<input type="submit" value="Confirmar">
</form>
</body>
</html>
<textarea name="curriculum"></textarea>
La página PHP que procesa los dos datos ingresados en el formulario es:
pagina2.php
<html>
<head>
<title>Problema</title>
</head>
<body>
<?php
echo "El nombre ingresado:" . $_REQUEST['nombre'];
echo "<br>";
echo "El curriculum:" . $_REQUEST['curriculum'];
?>
</body>
</html>
El dato ingresado en el textarea se rescata en forma idéntica que los controles text, es decir
mediante el vector asociativo $_REQUEST:
20
Curso dinámico de programación
Ejercicio 8
Confeccionar una página que muestre un contrato dentro de un textarea, disponer puntos
suspensivos donde el operador debe ingresar un texto. La página que procesa el formulario
sólo debe mostrar el contrato con las modificaciones que hizo el operador.
Ej. de un contrato puede ser:
Arreglos unidimensionales
Un Array es una colección de valores. Los array pueden ser unidimensionales (vectores),
bidimensionales (matrices) y multidimensionales (más de dos dimensiones)
Los arrays se utilizan ampliamente en el lenguaje PHP.
$dias[0]=31;
$dias[1]=28;
Luego de estas dos líneas, tenemos creado un vector de dos elementos, a los cuales
accedemos por un subíndice.
El vector, como podemos ver, puede ir creciendo en forma dinámica, es decir que si ahora
hacemos:
$dias[2]=31;
21
Curso dinámico de programación
$dias[]=31;
$dias[]=28;
$dias[]=31;
Ejemplo:
Queremos imprimir todos los de un arreglo elementos
pagina1.php
<html>
<head>
<title>Problema</title>
</head>
<body>
<?php
$nombres[] = "juan";
$nombres[] = "pedro";
$nombres[] = "ana";
for ($f = 0; $f < count($nombres); $f++) {
echo $nombres[$f];
echo "<br>";
}
?>
</body>
</html>
22
Curso dinámico de programación
Inicialización de vectores
$edades=array("menores","jovenes","adultos");
El ciclo foreach
Cuando tenemos que recorrer en forma completa un vector en PHP es muy común utilizar
la estructura 'foreach'. Veamos el mismo ejemplo anterior para recorrer el vector
$nombres:
pagina1.php
<html>
<head>
<title>Problema</title>
</head>
<body>
<?php
$nombres[] = "juan";
$nombres[] = "pedro";
$nombres[] = "ana";
foreach ($nombres as $nombre) {
echo $nombre;
echo "<br>";
}
?>
</body>
</html>
En cada repetición del 'foreach' la variable $nombre almacena una componente del vector
$nombres, luego dentro del 'foreach' mostramos el contenido de la variable $nombre:
23
Curso dinámico de programación
echo "<br>";
}
Ejercicio 9
Definir un vector con los nombres de los días de la semana. Luego imprimir el primero y el
último elemento del vector.
Archivos de texto
Una actividad fundamental es poder registrar información en el servidor (no como hemos
estado haciendo hasta el momento generando sólo una página con los datos cargados)
Para el registro de datos en el servidor disponemos de dos herramientas que se
complementan en muchos casos (archivos de texto y bases de datos)
En este apartado veremos como crear un archivo de texto y añadir datos al mismo.
Lo presentaremos al tema resolviendo un problema.
Ejemplo:
pagina1.html
<html>
<head>
<title>Problema</title>
</head>
<body>
<form action="pagina2.php" method="post">
Ingrese su nombre:
<input type="text" name="nombre">
<br>
Comentarios:
<br>
<textarea name="comentarios" rows="10" cols="40"></textarea>
<br>
<input type="submit" value="Registrar">
</form>
24
Curso dinámico de programación
</body>
</html>
Este formulario es similar a los planteados en problemas anteriores, sólo le hemos agregado
al control textarea, las propiedades rows y cols que dimensionan el mismo en la pantalla:
<textarea name="comentarios" rows="10" cols="40"></textarea>
Veamos ahora la página (pagina2.php) que graba los datos cargados en el formulario en un
archivo:
pagina2.php
<html>
<head>
<title>Problema</title>
</head>
<body>
<?php
$ar = fopen("datos.txt", "a") or
die("Problemas en la creacion");
fputs($ar, $_REQUEST['nombre']);
fputs($ar, "\n");
fputs($ar, $_REQUEST['comentarios']);
fputs($ar, "\n");
fputs($ar,"-------------------------------------------------
-------");
fputs($ar, "\n");
fclose($ar);
echo "Los datos se cargaron correctamente.";
?>
</body>
</html>
25
Curso dinámico de programación
Para la grabación de datos utilizamos la función fputs que tiene dos parámetros: la
referencia al archivo donde grabamos y el string a grabar.
fputs($ar, $_REQUEST['nombre']);
fputs($ar, "\n");
Para el salto de línea en el archivo de texto, usamos los caracteres \n.De esta forma cuando
leamos el archivo de texto lo haremos línea a línea.
Cuando dejamos de trabajar con el archivo llamamos a la función fclose.
Hay que tener muy presente que el archivo se almacena en el servidor y no en la máguina
de la persona que está navegando. Si nos dirigimos a la carpeta c:\xampp\htdocs
encontraremos el archivo "datos.txt", tenga en cuenta que está en la máquina donde se
ejecutó el script de PHP (normalmente en un servidor web). Luego veremos como leer el
contenido del archivo y mostrarlo en otra página del sitio (En nuestro caso como utilizamos
el equipo como cliente/servidor el archivo datos.txt se crea en la misma carpeta donde se
alojan nuestras páginas php).
Ejercicio 10
Hacer un programa en PHP que permita hacer el pedido de pizzas via internet.
Nombre:[..............]
Direccion:[...................]
Jamon y queso:[x]
Cantidad[...]
Napolitana:[x]
Cantidad[...]
26
Curso dinámico de programación
Mozzarella:[x]
Cantidad[...]
[Confirmar]
Para el ingreso del nombre, dirección y cantidad de pizzas de cada tipo disponer objetos de
la clase "text".
Disponer tres objetos de tipo "checkbox" para seleccionar los tipos de pizzas.
Por último disponer un botón para el envío de datos: "submit".
Grabar en un archivo de texto llamado "pedidos.txt" cada pedido, separados por una línea
de puntos entre cada pedido.
Para la lectura de un archivo de texto contamos con la función fgets. Además debemos
abrir el archivo para lectura.
$ar=fopen("datos.txt","r") or
die("No se pudo abrir el archivo");
Para leer:
$linea=fgets($ar);
Ejemplo:
Veamos como mostrar por pantalla el contenido del archivo "datos.txt" creado en el punto
anterior:
pagina1.php
<html>
<head>
<title>Problema</title>
</head>
<body>
<?php
$ar = fopen("datos.txt", "r") or
27
Curso dinámico de programación
</html>
El segundo parámetro de fopen es "r" es decir read (apertura para lectura), si el archivo no
existe por ejemplo se ejecuta la función die que finaliza el programa mostrando el string
correspondiente.
La función feof retorna true si se ha llegado al final del archivo en caso contrario retorna
false. Para que se impriman todas las líneas del archivo se plantea una estructura repetitiva
que se ejecuta mientras no se llegue al final de archivo (el operador lógico not en PHP es el
caracter !):
while (!feof($ar)) {
Dentro de la estructura repetitiva leemos una línea completa del archivo de texto con la
función fgets:
$linea = fgets($ar);
La variable $linea contiene una línea completa del archivo de texto, inclusive el salto de
línea (\n)
Como el navegador no hace un salto de línea con este carácter, debemos convertir dicho
caracter al elemento <br> propia de HTML. La función que realiza esta actividad se llama
28
Curso dinámico de programación
$lineasalto = nl2br($linea);
echo $lineasalto;
Ejercicio 11
Realizar un programa que muestre el archivo de pedido de pizzas via internet del punto
anterior.
Recordemos que creamos el archivo de texto llamado pedidos.txt (grabar la página php en
el mismo directorio donde se encuentra el archivo pedidos.txt)
Vectores asociativos
Este tipo de vectores no es común a otros lenguajes, pero en PHP son de uso indispensable
en distintas situaciones (ya lo empleamos cuando recuperamos información de un
formulario accediendo al vector $_REQUEST que crea PHP en forma automática, cuando
accedamos a datos de una base de datos también lo emplearemos etc.)
Un vector asociativo permite acceder a un elemento del vector por medio de un subíndice
de tipo string.
Inicialmente uno piensa que esto nos complica las cosas, como veremos más adelante la
realidad nos demuestra lo contrario.
Ejemplo:
consideremos que deseamos guardar en un vector el DPI, nombre y dirección de una
persona. Empleando un vector con subíndice entero la solución sería:
<?php
$registro[] = "204563220101";
$registro[] = "Marco Antonio del Cid";
$registro[] = "zona 6";
?>
De esta forma debemos recordar que cuando deseamos mostrar el nombre de la persona
debemos acceder al subíndice 1. Esto es sencillo si tenemos un vector con tres elementos,
pero que sucede si debemos almacenar 20 datos relacionados en un vector.
Un vector asociativo se define de la siguiente forma:
29
Curso dinámico de programación
<?php
$registro['dni'] = "204563220101";
$registro['nombre'] = "Marco Antonio del Cid";
$registro['direccion'] = "zona 6";
echo $registro['nombre'];
?>
Ahora vemos que para imprimir el nombre de la persona no debemos recordar una posición
dentro de un vector sino un nombre de clave. Esto se hace indispensable cuando
administramos un conjunto de datos grandes.
<?php
$registro = array(
'dpi' => '204563220101',
'nombre' => 'Marco Antonio del Cid',
'direccion' => 'zona 6'
);
echo $registro['dpi'];
?>
Observación:
Cuando tenemos que recorrer en forma completa un vector asociativo en PHP podemos
utilizar la estructura 'foreach'. Veamos un ejemplo:
pagina1.php
<html>
<head>
<title>Problema</title>
</head>
<body>
<?php
$articulo = array(
'codigo' => 1,
'descripcion' => 'manzanas',
'precio' => 30.25
);
30
Curso dinámico de programación
</body>
</html>
En cada repetición del 'foreach' la variable $clave almacena el subíndice del vector y la
variable $valor contiene el valor de la componente del vector:
Ejemplo:
pagina1.html
<head>
<title>Problema</title>
</head>
<body>
<form action="pagina2.php" method="post">
Ingrese primer valor:
<input type="text" name="valor1">
<br>
Ingrese segundo valor:
31
Curso dinámico de programación
</html>
Es importante notar que al input de tipo 'submit' no le definimos la propiedad 'name', con el
objetivo que no se cargue en el vector asociativo '$_REQUEST'.
pagina2.php
<html>
<head>
<title>Problema</title>
</head>
<body>
<?php
$suma = 0;
foreach ($_REQUEST as $clave => $valor) {
echo "Valor: " . $valor;
echo "<br>";
$suma = $suma + $valor;
}
echo "La suma es: " . $suma;
?>
</body>
</html>
32
Curso dinámico de programación
Como vemos podemos recorrer en forma completa los 5 elementos del vector
'$_REQUEST' y acceder tanto a su valor como su clave:
$suma = 0;
foreach ($_REQUEST as $clave => $valor) {
echo "Valor: " . $valor;
echo "<br>";
$suma = $suma + $valor;
}
Si solo queremos acceder a los valores del vector asociativo y no a sus claves, luego
podemos codificar la sintaxis del foreach:
Ejercicio 12
Crear un vector asociativo que almacene las claves de acceso de 5 usuarios de un sistema.
Acceder a cada componente por su nombre. Imprimir una componente del vector.
Funciones en PHP
Ejemplo:
33
Curso dinámico de programación
EjemploFunciones.php
<html>
<head>
<title>Problema</title>
</head>
<body>
mostrartitulo("Primer titulo");
echo "<br>";
mostrartitulo("Segundo segundo");
?>
</body>
</html>
Si vemos la función, notamos que lo más trabajoso es definir todos los elementos HTML
para crear el titulo. Es importante notar que en PHP para introducir las dobles comillas
dentro de un string debemos anteceder el carácter '\'; para introducir el carácter '\' debemos
escribir dos barras \\.
Las llamadas a la función las hacemos por medio de su nombre y pasamos el único
parámetro que requiere:
mostrartitulo("Primer titulo");
echo "<br>";
mostrartitulo("Segundo segundo");
Las funciones nos permiten tener un programa más ordenado y facilitan la reutilización del
código.
Más adelante veremos como hacer archivos con rutinas comunes a muchas páginas.
34
Curso dinámico de programación
Una función puede retornar un dato, supongamos que necesitamos una función que nos
retorne el promedio de dos valores, el código sería:
Ejemplo:
EjemploFunciones2.php
<html>
<head>
<title>Problema</title>
</head>
<body>
<?php
function retornarpromedio($valor1, $valor2)
{
$pro = $valor1 / $valor2;
return $pro;
}
$v1 = 100;
$v2 = 50;
$p = retornarpromedio($v1, $v2);
echo $p;
?>
</body>
</html>
Cuando una función retorna un dato debemos emplear la palabra clave return seguida del
valor que devuelve.
En la llamada a la función el valor retornado se almacena generalmente en una variable:
$p = retornarpromedio($v1, $v2);
Si queremos que retorne más de un dato debemos emplear parámetros por referencia.
Supongamos que necesitamos ahora que una función nos retorne el cuadrado y cubo de un
número:
35
Curso dinámico de programación
Ejemplo:
EjemploFunciones3.php
<html>
<head>
<title>Problema</title>
</head>
<body>
<?php
function cuadradocubo($valor, &$cuad, &$cub)
{
$cuad = $valor * $valor;
$cub = $valor * $valor * $valor;
}
</html>
Ejercicio 13
36
Curso dinámico de programación
Uno de los empleos principales de PHP es el acceso a una base de datos en el servidor. Las
operaciones básicas se hacen empleando como lenguaje el SQL.
PHP implementa distintas funciones según la base de datos a emplear. Existen funciones
actualmente para acceder a las siguientes servidores de bases de datos:
• MySQL
• MariaDB
• Microsoft SQL Server
• Oracle
• PostgreSQL
• SysBase
• FrontBase
• Informix
• InterBase
• Ingres
• mSQL
• dBase
• SQLlite
Para crear una base de datos el XAMPP instala también un programa codificado en PHP
que nos permite interactuar con el MySQL o MariaDB.
Ejemplo:
37
Curso dinámico de programación
Los campos nombre y mail son de tipo varchar (podemos almacenar cualquier caracter) y
por último el campo codigocurso representa el curso a tomar por el alumno (1=PHP, 2=ASP
y 3=JSP)
El campo clave de esta tabla es el código de alumno (es decir no podemos tener dos
alumnos con el mismo código, no así el nombre del alumno que puede eventualmente
repetirse)
Luego de crear una base de datos y sus tablas (Vamos a trabajar con la base de datos ya
creada: base1, que contiene la tabla alumnos), veremos como agregar registros.
Necesitamos dos páginas para este proceso, una será el formulario de carga de datos y la
siguiente será la que efectúe la inserción en la tabla.
pagina1.html
<html>
<head>
<title>Problema</title>
</head>
<body>
<h1>Alta de Alumnos</h1>
<form action="pagina2.php" method="post">
Ingrese nombre:
<input type="text" name="nombre"><br>
Ingrese mail:
<input type="text" name="mail"><br>
Seleccione el curso:
<select name="codigocurso">
<option value="1">PHP</option>
<option value="2">ASP</option>
<option value="3">JSP</option>
</select>
<br>
<input type="submit" value="Registrar">
</form>
</body>
</html>
38
Curso dinámico de programación
El formulario es bastante similar a los que venimos desarrollando en puntos anteriores, tal
vez lo distinto es cómo emplearemos el control "select" del curso a desarrollar:
<select name="codigocurso">
<option value="1">PHP</option>
<option value="2">ASP</option>
<option value="3">JSP</option>
</select>
Cada opción tiene su respectivo valor (en este caso los números 1,2 y 3) y los textos a
mostrar PHP, ASP y JSP. El dato que se envía a la otra página es el código de curso (esto
debido a que definimos la propiedad value).
pagina2.php
<html>
<html>
<head>
<title>Problema</title>
</head>
<body>
<?php
$conexion = mysqli_connect("localhost", "root", "",
"base1") or
die("Problemas con la conexión");
('$_REQUEST[nombre]','$_REQUEST[mail]',
$_REQUEST[codigocurso])")
or die("Problemas en el select" .
mysqli_error($conexion));
mysqli_close($conexion);
39
Curso dinámico de programación
</html>
En caso de haber algún error en la llamada a la función la misma retorna false por lo que se
ejecuta la instrucción seguida del operador or, en nuestro caso llamamos a la función die
que detiene la ejecución del programa y muestra el mensaje por pantalla.
('$_REQUEST[nombre]','$_REQUEST[mail]',
$_REQUEST[codigocurso])")
or die("Problemas en el select" .
mysqli_error($conexion));
La sintaxis del comando insert es bastante sencilla, indicamos el nombre de la tabla y los
campos de la tabla a cargar. Luego debemos indicar en el mismo orden los valores a cargar
en cada campo (dichos valores los rescatamos del formulario anterior).
Los campos de tipo varchar SQL requiere que encerremos entre comillas simples, esto
sucede para el nombre y el mail; en cambio, para el codigocurso esto no debe ser así.
Otra cosa a tener en cuenta es que los subíndices de los vectores asociativos no deben ir
entre simples comillas ya que se encuentran dentro de un string, sino se producirá un error.
40
Curso dinámico de programación
En caso que MySql detecte un error, retorna false la función mysqli_query, por lo que se
ejecuta la instrucción posterior al or, es decir la función die que mostrará el error generado
por MySql llamando a la función mysqli_error.
Por último cerramos la conexión con la base de datos y mostramos un mensaje indicando
que la carga se efectuó en forma correcta.
Ejercicio 14
Implementar las dos páginas necesarias para efectuar el alta de cursos. Un formulario para
ingresar el nombre del curso
Para recuperar datos desde MySQL o MariaDB debemos emplear el comando select:
select codigo,nombre,mail,codigocurso from alumnos.
Debemos pasar desde PHP un string con este comando para que MySQL lo ejecute y
retorne todas las filas de la tabla alumnos.
Veremos entonces como recuperar los datos almacenados en la tabla alumnos de la base de
datos "base1".
pagina1.php
<html>
<head>
<title>Problema</title>
</head>
<body>
41
Curso dinámico de programación
<?php
$conexion = mysqli_connect("localhost", "root", "",
"base1") or
die("Problemas con la conexión");
} //fin de while
mysqli_close($conexion);
?>
</body>
</html>
La primer parte es similar a lo visto hasta ahora, es decir nos conectamos con el servidor de
base de datos y seleccionamos la base de datos base1:
42
Curso dinámico de programación
El comando SQL que nos permite recuperar datos de tablas se llama SELECT. Indicamos
los campos a rescatar de la tabla y luego de la palabra clave from indicamos el nombre de la
tabla:
Para rescatar registro a registro los datos obtenidos por el select debemos llamar a la
función mysqli_fetch_array. Esta función retorna un vector asociativo con los datos del
registro rescatado, o false en caso de no haber más registros. Es decir que si retorna un
registro se almacena en el vector $reg y la condición del while se valida como verdadero y
pasa a ejecutarse el bloque del while:
43
Curso dinámico de programación
El bloque del while muestra el contenido del registro rescatado por la función
mysqli_fetch_array. Como vemos, para rescatar cada campo accedemos mediante el vector
asociativo $reg indicando como subíndice un campo contenido en el select:$reg['codigo']
Cada vez que llamamos a la función mysqli_fetch_array nos retorna el siguiente registro.
Cuando debemos mostrar el curso mediante la instrucción switch, analizamos si tiene un
1,2 ó 3 y procedemos a mostrar el nombre del curso.
Ejercicio 15
Hacer un programa que recupere los datos de la tabla cursos de la base de datos base1.
Mostrar el código de curso y su nombre.
Consultas
Haremos un programa que nos permita consultar los datos de un alumno ingresando su mail
para su búsqueda. Tengamos en cuenta que no puede haber dos alumnos con el mismo mail,
por lo que la consulta nos puede arrojar uno o ningún registro.
pagina1.html
<html>
<head>
<title>Problema</title>
</head>
<body>
<form action="pagina2.php" method="post">
Ingrese el mail del alumno a consultar:
<input type="text" name="mail">
<br>
<input type="submit" value="buscar">
</form>
44
Curso dinámico de programación
</body>
</html>
Por otro lado tenemos el archivo "pagina2.php" que se encarga de buscar el mail ingresado
en el formulario:
pagina2.php
<html>
<head>
<title>Problema</title>
</head>
<body>
<?php
$conexion = mysqli_connect("localhost", "root", "",
"base1") or
die("Problemas con la conexión");
if ($reg = mysqli_fetch_array($registros)) {
echo "Nombre:" . $reg['nombre'] . "<br>";
echo "Curso:";
switch ($reg['codigocurso']) {
case 1:
echo "PHP";
break;
case 2:
echo "ASP";
break;
case 3:
echo "JSP";
break;
}
} else {
echo "No existe un alumno con ese mail.";
}
mysqli_close($conexion);
?>
</body>
45
Curso dinámico de programación
</html>
Acá es donde con la clausula where seleccionamos sólo el registro que cumple con la
condición que el mail sea igual al que ingresamos.
Como sólo puede haber un registro que cumpla la condición, llamamos a la función
mysqli_fetch_array en un if y no una estructura repetitiva como el listado:
if ($reg = mysqli_fetch_array($registros)) {
Ejercicio 16
Eliminar registros
Para eliminar filas en una tabla debemos utilizar el comando SQL delete.
La primera página es idéntica a la consulta, ya que debemos implementar un formulario que
solicite la carga del mail del alumno:
46
Curso dinámico de programación
pagina1.html
<html>
<head>
<title>Problema</title>
</head>
<body>
<form action="pagina2.php" method="post">
Ingrese el mail del alumno a borrar:
<input type="text" name="mail">
<br>
<input type="submit" value="buscar y borrar">
</form>
</body>
</html>
Por otro lado tenemos el archivo "pagina2.php" que se encarga de buscar el mail ingresado
en el formulario y en caso que exista se procede a borrarlo:
pagina2.php
<html>
<head>
<title>Problema</title>
</head>
<body>
<?php
$conexion = mysqli_connect("localhost", "root", "",
"base1") or die("Problemas con la conexión");
if ($reg = mysqli_fetch_array($registros)) {
mysqli_query($conexion, "delete from alumnos where
mail='$_REQUEST[mail]'") or
die("Problemas en el select:" .
mysqli_error($conexion));
47
Curso dinámico de programación
</html>
En esta segunda página efectuamos dos llamadas a la función mysqli_query, una para
consultar si existe el mail ingresado y otra para efectuar el borrado del registro respectivo.
Si no existe el mail ingresado mostramos un mensaje de tal situación.
Ejercicio 17
Vimos en el concepto anterior que podemos borrar una o más filas de una tabla indicando
en el where del comando SQL delete la condición que debe cumplir la fila para ser borrada.
Para borrar todos los registros de una tabla debemos llamar al comando delete de SQL sin
disponer la cláusula where.
Ejemplo:
pagina1.php
<html>
<head>
<title>Problema</title>
</head>
<body>
48
Curso dinámico de programación
<?php
$conexion = mysqli_connect("localhost", "root", "",
"base1") or die("Problemas con la conexión");
mysqli_close($conexion);
?>
</body>
</html>
De las actividades con una tabla esta es la más larga. Vamos a resolverlo implementando
tres páginas, la primera un formulario de consulta del mail de un alumno, la segunda otro
formulario que nos permita cargar su mail modificado y la última registrará el cambio en la
tabla.
pagina1.html
<html>
<head>
<title>Problema</title>
</head>
<body>
<form action="pagina2.php" method="post">
Ingrese el mail del alumno:
<input type="text" name="mail"><br>
<input type="submit" value="buscar">
</form>
</body>
</html>
49
Curso dinámico de programación
pagina2.php
<html>
<head>
<title>Problema</title>
</head>
<body>
<?php
<?php
} else
echo "No existe alumno con dicho mail";
?>
</body>
</html>
if ($reg = mysqli_fetch_array($registros)) {
?>
50
Curso dinámico de programación
<?php
Si queremos que el control text se cargue con el mail ingresado en el formulario anterior
debemos cargar la propiedad value con dicho valor:
pagina3.php
<html>
<head>
<title>Problema</title>
</head>
<body>
<?php
$conexion = mysqli_connect("localhost", "root", "",
"base1") or die("Problemas con la conexión");
51
Curso dinámico de programación
</html>
$_REQUEST[mailnuevo] y $_REQUEST[mailviejo].
Si no llamamos a:
mysqli_close($conexion);
Cuando finaliza la ejecución del script de PHP se libera automáticamente la conexión con
MySQL.
Ejercicio 18
Efectuar la modificación del nombre del curso de la tabla "cursos". Para la búsqueda
ingresar el código de curso.
Ahora veremos como imprimir todos los alumnos inscriptos a los cursos junto al nombre
del curso donde está inscripto. Los datos se encuentran en las tablas "alumnos" y "cursos".
Debemos aparear el código de curso de la tabla "alumnos" con el código de la tabla
"cursos".
pagina1.php
<html>
<head>
<title>Problema</title>
</head>
<body>
<?php
52
Curso dinámico de programación
</html>
Hay varias cosas nuevas cuya sintaxis necesitamos analizar, la primera es como hacer el
apareo con la tabla cursos:
En este caso rescatamos el código del alumno (y no el código de curso). Debemos crear un
alias si dos tablas tienen el mismo nombre de campo para evitar confusión; como ocurre
aquí con el campo codigo de las tablas alumnos y cursos. También creamos un alias para la
tabla alumnos.
53
Curso dinámico de programación
Cuando rescatamos los datos y los mostramos en la página, hacemos referencia al alias del
campo:
Ejercicio 19
Función count
Hay en MySQL funciones que nos permiten contar registros, calcular sumas, promedios,
obtener valores máximos y mínimos. Veamos la función count.
Cuando necesitamos saber la cantidad de registros utilizamos la función count, por ejemplo
si deseamos conocer la cantidad de alumnos que hay en la tabla "alumnos" debemos
implementar el siguiente comando SQL:
pagina1.php
<html>
<head>
<title>Problema</title>
</head>
<body>
<?php
$conexion = mysqli_connect("localhost", "root", "",
"base1") or die("Problemas con la conexión");
54
Curso dinámico de programación
$reg = mysqli_fetch_array($registros);
?>
</body>
</html>
El select no tiene cláusula where ya que debemos contar todos los alumnos y no los de
algún curso en particular.
$reg = mysqli_fetch_array($registros);
Ejercicio 20
Hacer un programa que muestre por pantalla los nombres de todos los cursos y al final la
cantidad total de cursos.
55
Curso dinámico de programación
Para resolver este problema tenemos que plantear tres páginas, una donde ingresemos el
mail del alumno, la segunda donde se pueda cambiar el curso y por última una que permita
modificar la tabla "alumnos" con el nuevo curso seleccionado.
La primer página de ingreso del mail es:
pagina1.html
<html>
<head>
<title>Problema</title>
</head>
<body>
<form action="pagina2.php" method="post">
Ingrese el mail del alumno:
<input type="text" name="mail"><br>
<input type="submit" value="buscar">
</form>
</body>
</html>
pagina2.php
<html>
<head>
<title>Problema</title>
</head>
<body>
<?php
$conexion = mysqli_connect("localhost", "root", "",
"base1") or
die("Problemas con la conexión");
56
Curso dinámico de programación
<select name="codigocurso">
<?php
$registros = mysqli_query($conexion, "select * from
cursos") or die("Problemas en el select:" .
mysqli_error($conexion));
<?php
} else
echo "No existe alumno con dicho mail";
?>
</body>
</html>
La primera consulta de la tabla alumnos es para verificar si existe un alumno con el mail
ingresado por teclado:
En caso de existir un alumno con dicho mail, el if se verifica verdadero y pasamos a poblar
el control select con los distintos cursos que contiene la tabla "cursos":
57
Curso dinámico de programación
{
echo "<option value=\"$reg[codigo]\"
selected>$reg[nombrecurso]</option>";
}
else
echo "<option value=\"$reg[codigo]\">$reg[nombrecurso]</
option>";
}
?>
</select>
Para que aparezca seleccionado el curso actual debemos inicializar lo marca option con la
propiedad selected. Es decir que el if dentro del while se verifica verdadero una solo vez.
Por último la tercer página procede a registrar el cambio en la tabla "alumnos":
pagina3.php
<html>
<head>
<title>Problema</title>
</head>
<body>
<?php
$conexion = mysqli_connect("localhost", "root", "",
"base1") or die("Problemas con la conexión");
die("Problemas en el select:" .
mysqli_error($conexion));
echo "El curso fue modificado con exito";
?>
</body>
</html>
Ejercicio 21
Confeccionar la modificación del mail, nombre y curso de la tabla "alumnos". Ingresar por
teclado el código de alumno para su búsqueda.
Solución
58
Curso dinámico de programación
Agrupamientos
Entre las muchas posibilidades que nos brinda SQL, una es agrupar registros y obtener
información resumida de tablas.
pagina1.php
<html>
<head>
<title>Problema</title>
</head>
<body>
<?php
$conexion = mysqli_connect("localhost", "root", "",
"base1") or
die("Problemas con la conexión");
echo "<hr>";
59
Curso dinámico de programación
}
mysqli_close($conexion);
?>
</body>
</html>
Hay varias partes importantes en este código; primero, en el select indicamos que cuente la
cantidad de registros de la tabla "alumnos":
group by alu.codigocurso
Con esta cláusula se hace un corte de control por cada grupo de registros que tienen el
mismo código de curso almacenado.
Luego mostramos el nombre de curso con la cantidad de inscriptos para dicho curso:
Ejercicio 22
Hacer un programa que muestre el nombre del curso, la cantidad de inscriptos y todos los
inscriptos a dicho curso. Repetir esto con todos los cursos.
Es decir, en la página debe aparecer algo parecido a:
60
Curso dinámico de programación
Parámetros en un hipervínculo
Hasta ahora hemos visto como enviar datos de una página a otra mediante formularios. Otra
forma muy utilizada que complementa la anterior es como parámetro en un hipervínculo.
Confeccionaremos una página que muestre tres hipervínculos, cada uno tiene por objetivo
mostrar en una página las tablas de multiplicar del 2, del 3 o la del 5.
La primer página es un archivo HTML puro, ya que sólo disponemos las marcas de
hipervínculos:
pagina1.html
<html>
<head>
<title>Problema</title>
</head>
<body>
<A href="pagina2.php?tabla=2">Tabla del 2</A> <br>
<A href="pagina2.php?tabla=3">Tabla del 3</A> <br>
<A href="pagina2.php?tabla=5">Tabla del 5</A>
</body>
</html>
Es decir, luego del caracter "?" indicacamos el nombre del parámetro y seguidamente el
valor del mismo.
La página que rescata el valor pasado como parámetro es la siguiente:
61
Curso dinámico de programación
pagina2.php
<html>
<head>
<title>Problema</title>
</head>
<body>
<?php
echo "Listado de la tabla del $_REQUEST[tabla] <br>";
for ($f = 1; $f <= 10; $f++) {
$valor = $f * $_REQUEST['tabla'];
echo $valor . "-";
}
?>
</body>
</html>
Es decir que con el mismo vector asociativo $_REQUEST recuperamos los datos enviados
por parámetro en la llamada a la página.
Observaciones:
PHP crea 2 vectores asociativos llamados $_GET y $_POST. El primero almacena los datos
pasados en el hipervínculo, quiere decir que el problema anterior lo podemos resolver con
la siguiente sintaxis:
pagina2.php
<html>
<head>
<title>Problema</title>
</head>
<body>
<?php
echo "Listado de la tabla del $_GET[tabla] <br>";
for ($f = 1; $f <= 10; $f++) {
$valor = $f * $_GET['tabla'];
echo $valor . "-";
}
?>
</body>
</html>
62
Curso dinámico de programación
El vector asociativo $_POST almacena los datos que se pasan por medio de un formulario
HTML.
El vector asociativo $_REQUEST almacena tanto los datos del vector $_GET como el
$_POST.
Ejercicio 23
Confeccionar un programa que muestre una página con todos los nombres de la tabla
"cursos". Los nombres deben aparecer como hipervínculos a otra página que deberá
mostrar todos los alumnos inscriptos a dicho curso. Como parámetro en el hipervínculo,
pasar el código de curso.
Paginación de registros.
En situaciones en las cuales una consulta retorna muy muchos datos, en vez de enviarlos
todos al navegador, se puede enviar un conjunto limitado de registros. Luego, mediante
hipervínculos, ver el resto de datos. Por ejemplo, cuando hacemos búsquedas con el
servidor google, generalmente no nos retorna todas las direcciones donde se encuentran los
resultados buscados, nos retorna páginas con 10 enlaces por página (pensemos el tiempo de
transferencia si nos retornara 1.000.000 de enlaces).
Bueno, ahora resolvamos con el lenguaje PHP este problema de paginación, mostraremos
dos alumnos por página:
pagina1.php
<?php
if (isset($_REQUEST['pos']))
$inicio = $_REQUEST['pos'];
else
$inicio = 0;
?>
<html>
<head>
<title>Problema</title>
</head>
<body>
<?php
$conexion = mysqli_connect("localhost", "root", "",
"base1") or
die("Problemas con la conexión");
63
Curso dinámico de programación
</body>
</html>
La función isset retorna verdadero si existe la variable que le pasamos como parámetro, en
este caso le estamos pasando la componente pos del vector asociativo $_REQUEST.
Cuando llamamos por primera vez a esta página, lo hacemos : pagina1.php sin parámetros,
por lo que el if se verifica como falso. Es decir la variable $inicio se carga con el valor 0.
Otro concepto importante es la cláusula limit que es propia del gestor MySQL. Mediante
esta cláusula limitamos la cantidad de registros que retorna el select. El primer valor del
limit indica a partir de cual registro y el segundo la cantidad de registros. Es decir si un
select sin limit retorna 100 registro, luego utilizando por ejemplo la sintaxis limit 50,25 nos
retornará, de esa lista de 100 registros, a partir del registro de la posición 50, 25 registros.
En nuestro problema indicamos que retorne desde valor que tenga la variable $inicio y
como cantidad 2 (páginas con 2 registros):
64
Curso dinámico de programación
$registros=mysqli_query($conexion,"select alu.codigo as
codigo, nombre, mail,codigocurso, nombrecurso
from alumnos as alu inner join cursos as cur on
cur.codigo=alu.codigocurso
limit $inicio,2") or
die("Problemas en el select:".mysqli_error($conexion));
Seguidamente mostramos todos los registros retornados y
además los contamos:
$impresos = 0;
while ($reg = mysqli_fetch_array($registros)) {
$impresos++;
echo "Codigo:" . $reg['codigo'] . "<br>";
echo "Nombre:" . $reg['nombre'] . "<br>";
echo "Mail:" . $reg['mail'] . "<br>";
echo "Curso:" . $reg['nombrecurso'] . "<br>";
echo "<hr>";
}
if ($inicio == 0)
echo "anteriores ";
else {
$anterior = $inicio - 2;
echo "<a href=\"pagina1.php?pos=$anterior\">Anteriores </
a>";
}
Si la variable $inicio vale 0 significa que no hay registros antes de éste, por lo que sólo
mostramos un texto "anteriores". En caso que la variable $inicio sea distinta de 0, se ejecuta
el else, donde disponemos un hipervínculo con la misma página e inicializando el
parámetro pos con el valor de $inicio menos 2.
Si el contador $impresos tiene el valor 2 significa que posiblemente hay más registros por
mostrar y debemos disponer un hipervínculo con la misma página pero inicializando el
parámetro pos con el valor de $inicio más 2:
if ($impresos == 2) {
$proximo = $inicio + 2;
echo "<a
href=\"pagina1.php?pos=$proximo\">Siguientes</a>";
} else
echo "siguientes";
65
Curso dinámico de programación
Ejercicio 24
Confeccionar un programa que muestre los registros de la tabla "cursos" con páginas de 3
registros.
pagina1.html
<html>
<head>
<title>Problema</title>
</head>
<body>
<form action="pagina2.php" method="post"
enctype="multipart/form-data">
Seleccione el archivo:
<input type="file" name="foto"><br>
<input type="submit" value="Enviar">
</form>
</body>
</html>
Veamos los puntos que tenemos que respetar cuando efectuamos el upload de archivos:
<form action="pagina2.php" method="post" enctype="multipart/form-data">
Se define una nueva propiedad para la etiqueta form, con esta indicamos que dentro del
formulario de carga se envían archivos. Hay que tener mucho cuidado cuando tipeamos esta
propiedad, si nos equivocamos en algún carácter el proceso de upload no funcionará.
66
Curso dinámico de programación
pagina2.php
<html>
<head>
<title>Problema</title>
</head>
<body>
<?php
copy($_FILES['foto']['tmp_name'], $_FILES['foto']['name']);
echo "La foto se registro en el servidor.<br>";
$nom = $_FILES['foto']['name'];
echo "<img src=\"$nom\">";
?>
</body>
</html>
Cuando se ejecuta esta página, ya está almacenado en el servidor el archivo, en una carpeta
temporal. Ahora nos hace falta copiar el mismo a la carpeta donde se encuentra nuestra
página (en definitiva nuestro sitio de internet). Para esto llamamos a la función copy:
copy($_FILES['foto']['tmp_name'],$_FILES['foto']['name']);
$nom=$_FILES['foto']['name'];
echo "<img src=\"$nom\">";
67
Curso dinámico de programación
Ejercicio 25
Confeccionar un programa que permita hacer múltiples upload con una página (por ejemplo
que permita seleccionar hasta 3 archivos)
El protocolo HTTP es desconectado. Esto significa que cada vez que solicitamos una
página a un servidor representa una conexión distinta.
Una cookie es una pequeña cantidad de datos almacenada por el navegador del usuario
cuando solicita una página a un servidor. El que envía que se genere la cookie es el
servidor.
Una cookie consta de un nombre, un valor, una fecha de expiración y un servidor. Una
cookie está limitada a 4KB.
Luego que una cookie es creada sólo el sitio que la creó puede leerla. Luego de creada una
cookie, cada vez que el navegador del usuario visita el sitio, se envía dicha cookie. Otra
cosa importante que hay que tener en cuenta es que el usuario del browser puede configurar
el mismo para no permitir la creación de cookies, lo que significa que el uso de cookies
debe hacerse con moderación y cuando la situación lo requiera. De todos modos, el 99% de
los navegadores están configurados para permitir la creación de cookies.
Para la creación de una cookie desde PHP debemos llamar a la función setcookie.
Con un problema sencillo entenderemos el uso de esta función. Supongamos que queremos
que los usuarios que entran a nuestro sitio puedan configurar con qué color de fondo de
página quiere que aparezca cada vez que ingresa al sitio. Al color seleccionado por el
visitante lo almacenaremos en una cookie. En caso que no exista el color, por defecto es
blanco.
La primera página mostrará un formulario con tres controles de tipo radio para la selección
del color. También esta página verificará si existe la cookie creada, en caso afirmativo fijará
68
Curso dinámico de programación
el fondo de la página con el valor de la cookie. Tengamos en cuenta que la primera vez que
ejecutemos este programa la página es de color blanco, luego variará según el color
seleccionado en el formulario.
pagina1.php
<html>
<head>
<title>Problema</title>
</head>
</html>
El formulario no varía en nada respecto a otros vistos. Lo más importante es el bloque PHP
que verifica si ya existe la cookie en el navegador del cliente. Es importante entender que la
primera vez que ejecutemos esta página la cookie no existe, por lo que el if se verifica
falso:
El vector asociativo $_COOKIE almacena todas las cookies creadas por el visitante. Si es
la primera vez que peticionamos esta página, el vector $_COOKIE no tendrá elementos.
69
Curso dinámico de programación
pagina2.php
<?php
if ($_REQUEST['radio'] == "rojo")
setcookie("color", "#ff0000", time() + 60 * 60 * 24 * 365,
"/");
elseif ($_REQUEST['radio'] == "verde")
setcookie("color", "#00ff00", time() + 60 * 60 * 24 * 365,
"/");
elseif ($_REQUEST['radio'] == "azul")
setcookie("color", "#0000ff", time() + 60 * 60 * 24 * 365,
"/");
?>
<html>
<head>
<title>Problema</title>
</head>
<body>
Se creó la cookie.
<br>
<a href="pagina1.php">Ir a la otra página</a>
</body>
</html>
<?php
if ($_REQUEST['radio'] == "rojo")
setcookie("color", "#ff0000", time() + 60 * 60 * 24 * 365,
"/");
elseif ($_REQUEST['radio'] == "verde")
setcookie("color", "#00ff00", time() + 60 * 60 * 24 * 365,
"/");
elseif ($_REQUEST['radio'] == "azul")
setcookie("color", "#0000ff", time() + 60 * 60 * 24 * 365,
"/");
?>
70
Curso dinámico de programación
24 horas * 365 días) es decir que la cookie existirá en la máquina del visitante hasta el año
próximo.
Cuando indicamos como directorio la sintaxis "/" significa que la cookie se crea a nivel del
sitio y con cuaquier petición a dicho sitio, el navegador enviará la cookie al servidor.
Por último dispusimos en esta página un hipervínculo a la página anterior, para ver que, de
ahora en más, cada vez que ejecutemos la pagina1.php, el color de fondo de la misma
dependerá del valor de la cookie registrada.
Ejercicio 26
Crear un formulario que solicite la carga del nombre de usuario. Cuando se presione un
botón crear una cookie para dicho usuario. Luego cada vez que ingrese al formulario
mostrar el último nombre de usuario ingresado.
71
Curso dinámico de programación
Para borrar una cookie se debe llamar a la función setcookie con una fecha anterior a la
actual.
También tengamos en cuenta que una cookie tiene una fecha de expiración por lo que si un
visitante reingresa a nuestro sitio y la cookie expiró el navegador no la enviará.
pagina1.php
<html>
<head>
<title>Problema</title>
</head>
<body>
<form action="pagina2.php" method="post">
Ingrese su mail:
<input type="text" name="mailusuario" value="<?php if
(isset($_COOKIE['mail'])) echo $_COOKIE['mail']; ?>">
<br>
<input type="radio" name="opcion" value="recordar">
Recordar en esta computadora el mail ingresado.
<br>
<input type="radio" name="opcion" value="norecordar">
No recordar.
<br>
<input type="submit" value="confirmar">
</form>
</body>
</html>
Mediante dos controles de tipo radio daremos la posibilidad al cliente que el navegador
recuerde o no el mail ingresado.
72
Curso dinámico de programación
Como es sabido, la primera vez que accedamos a la página no existe la cookie llamada
mail.
La segunda página:
pagina2.php
<?php
if ($_REQUEST['opcion'] == "recordar")
setcookie("mail", $_REQUEST['mailusuario'], time() + (60 *
60 * 24 * 365), "/");
elseif ($_REQUEST['opcion'] == "norecordar")
setcookie("mail", "", time() - 1000, "/");
?>
<html>
<head>
<title>Problema</title>
</head>
<body>
<?php
if ($_REQUEST['opcion'] == "recordar")
echo "cookie creada";
elseif ($_REQUEST['opcion'] == "norecordar")
echo "cookie eliminada";
?>
<br>
<a href="pagina1.php">Ir a la otra página</a>
</body>
</html>
En esta página verificamos cuál control radio está seleccionado, si es el primero, creamos la
cookie mail con una vida de 1 año:
setcookie("mail",$_REQUEST['mailusuario'],time()+(60*60*24*365),"/");
En caso que esté seleccionado el segundo radio, creamos la misma cookie pero con una
fecha de caducidad inferior a la actual (con esto estamos virtualmente eliminando la
cookie):
setcookie("mail","",time()-1000,"/");
73
Curso dinámico de programación
Cookie de sesión
Para crear una cookie que sólo tenga existencia mientras no cerremos la ventana del
navegador, pasaremos como fecha de expiración de la cookie, el valor cero.
Una vez que la instancia del navegador se cierra, dicha cookie desaparecerá.
Este tipo de cookie puede ser muy útil para validar un usuario en un conjunto de páginas, si
previamente ingresó correctamente su nombre de usuario y clave. Es decir, una vez
validado el usuario, se verifica en páginas sucesivas si existe la cookie. Una vez que el
usuario cierra el navegador, no hay posibilidad de solicitar las páginas recorridas sin previa
validación nuevamente de clave y usuario.
setcookie(<nombre de la cookie>,<valor>,0)
Veamos un pequeño ejemplo para crear y verificar si existe una cookie de sesión.
pagina1.php
<html>
<head>
<title>Problema</title>
</head>
<body>
<?php
if (isset($_COOKIE['usu']))
echo "Cookie de sesión creada. Su valor es
$_COOKIE[usu]";
else
echo "No existe cookie de sesión";
?>
<br>
<a href="pagina2.php">Crear cookie de sesión</a>
</body>
</html>
74
Curso dinámico de programación
pagina2.php
<?php
setcookie("usu", "marco", 0);
?>
<html>
<head>
<title>Problema</title>
</head>
<body>
Cookie de sesión creada.<br>
<a href="pagina1.php">Retornar a la página anterior.</a>
</body>
</html>
75
Curso dinámico de programación
76
Curso dinámico de programación
CAPÍTULO 2
JAVA
77
Curso dinámico de programación
Programas Secuenciales
Ejemplo:
Realizar la carga de dos números enteros por teclado e imprimir su suma y su producto.
Tenemos dos entradas num1 y num2 (recordar cuáles son los nombres de variables
correctas), dos operaciones: realización de la suma y del producto de los valores ingresados
y dos salidas, que son los resultados de la suma y el producto de los valores ingresados. En
el símbolo de impresión podemos indicar una o más salidas, eso queda a criterio del
programador, lo mismo para indicar las entradas por teclado.
Programa:
import java.util.Scanner;
Recordemos que tenemos que seguir todos los pasos vistos para la creación de un proyecto,
su clase, definición de la función main y la codificación del diagrama de flujo (como son
problemas muy sencillos con una única clase puede especificar el nombre del proyecto con
el mismo nombre de la clase: SumaProductoNumeros)
78
Curso dinámico de programación
int num1,num2,suma,producto;
System.out.println(suma);
Problemas propuestos
1) Realizar la carga del lado de un cuadrado, mostrar por pantalla el perímetro del
mismo (El perímetro de un cuadrado se calcula multiplicando el valor del lado por
cuatro)
Estructuras de decisión
No todos los problemas pueden resolverse empleando estructuras secuenciales. Cuando hay
que tomar una decisión aparecen las estructuras condicionales.
Por el camino del verdadero pueden existir varias operaciones, entradas y salidas, inclusive
ya veremos que puede haber otras estructuras condicionales.
79
Curso dinámico de programación
Ejemplo
Ingresar el sueldo de una persona, si supera los Q3000 mostrar un mensaje en pantalla
indicando que debe abonar impuestos.
Diagrama de flujo:
Programa:
import java.util.Scanner;
La palabra clave "if" indica que estamos en presencia de una estructura condicional;
seguidamente disponemos la condición entre paréntesis. Por último encerrada entre llaves
las instrucciones de la rama del verdadero.
Es necesario que las instrucciones a ejecutar en caso que la condición sea verdadera estén
encerradas entre llaves { }, con ellas marcamos el comienzo y el fin del bloque del
verdadero.
Cuando se presenta la elección tenemos la opción de realizar una actividad u otra. Es decir
tenemos actividades por el verdadero y por el falso de la condición. Lo más importante que
hay que tener en cuenta que se realizan las actividades de la rama del verdadero o las del
falso, NUNCA se realizan las actividades de las dos ramas.
En una estructura condicional compuesta tenemos entradas, salidas, operaciones, tanto por
la rama del verdadero como por la rama del falso.
80
Curso dinámico de programación
Ejemplo:
Realizar un programa que solicite ingresar dos números distintos y muestre por pantalla el
mayor de ellos.
Programa:
import java.util.Scanner;
81
Curso dinámico de programación
Operadores Relacionales
> (mayor)
< (menor)
>= (mayor o igual)
<= (menor o igual)
== (igual)
!= (distinto)
Operadores Aritméticos
+ (más)
- (menos)
* (producto)
/ (división)
% (resto de una división) Ej.: x=13%5; {se guarda 3}
Hay que tener en cuenta que al disponer una condición debemos seleccionar que operador
relacional se adapta a la pregunta.
Ejemplos:
Los problemas que se pueden presentar son infinitos y la correcta elección del operador
sólo se alcanza con la práctica intensiva en la resolución de problemas.
Problemas propuestos
1) Realizar un programa que lea por teclado dos números, si el primero es mayor al
segundo informar su suma y diferencia, en caso contrario informar el producto y la
división del primero respecto al segundo.
82
Curso dinámico de programación
3) Se ingresa por teclado un número positivo de uno o dos dígitos (1..99) mostrar un
mensaje indicando si el número tiene uno o dos dígitos.
(Tener en cuenta que condición debe cumplirse para tener dos dígitos, un número entero)
If anidado
Decimos que una estructura condicional es anidada cuando por la rama del verdadero o el
falso de una estructura condicional hay otra estructura condicional.
Ejemplo:
Confeccionar un programa que pida por teclado tres notas de un alumno, calcule el
promedio e imprima alguno de estos mensajes:
Programa:
import java.util.Scanner;
83
Curso dinámico de programación
}
}
}
int nota1,nota2,nota3;
Problemas propuestos
1) Se cargan por teclado tres números distintos. Mostrar por pantalla el mayor de ellos.
2) Se ingresa por teclado un valor entero, mostrar una leyenda que indique si el
número es positivo, nulo o negativo.
84
Curso dinámico de programación
Operador &&
Cuando vinculamos dos o más condiciones con el operador &&, las dos condiciones deben
ser verdaderas para que el resultado de la condición compuesta de Verdadero y continúe por
la rama del verdadero de la estructura condicional.
Ejemplo:
Hacer un programa que lea por teclado tres números distintos y nos muestre el mayor.
Programa:
import java.util.Scanner;
85
Curso dinámico de programación
num2=teclado.nextInt();
System.out.print("Ingrese tercer valor:");
num3=teclado.nextInt();
if (num1>num2 && num1>num3) {
System.out.print(num1);
} else {
if (num2>num3) {
System.out.print(num2);
}else {
System.out.print(num3);
}
}
}
}
Operador ||
Cuando vinculamos dos o más condiciones con el operador Or, con que una de las dos
condiciones sea Verdadera alcanza para que el resultado de la condición compuesta sea
Verdadero.
Ejemplo:
Se carga una fecha (día, mes y año) por teclado. Mostrar un mensaje si corresponde al
primer trimestre del año (enero, febrero o marzo) Cargar por teclado el valor numérico del
día, mes y año.
Programa:
import java.util.Scanner;
86
Curso dinámico de programación
Problemas propuestos
1) Realizar un programa que pida cargar una fecha cualquiera, luego verificar si dicha
fecha corresponde a Navidad.
2) Se ingresan tres valores por teclado, si todos son iguales se imprime la suma del
primero con el segundo y a este resultado se lo multiplica por el tercero.
3) Se ingresan por teclado tres números, si todos los valores ingresados son menores a
10, imprimir en pantalla la leyenda "Todos los números son menores a diez".
4) Se ingresan por teclado tres números, si al menos uno de los valores ingresados es
menor a 10, imprimir en pantalla la leyenda "Alguno de los números es menor a
diez".
87
Curso dinámico de programación
El ciclo while
Ejemplo:
Programa:
88
Curso dinámico de programación
Respuestas:
Problemas propuestos
3) En una empresa trabajan n empleados cuyos sueldos oscilan entre $100 y $500,
realizar un programa que lea los sueldos que cobra cada empleado e informe
cuántos empleados cobran entre $100 y $300 y cuántos cobran más de $300.
Además el programa deberá informar el importe que gasta la empresa en sueldos al
personal.
5) Mostrar los múltiplos de 8 hasta el valor 500. Debe aparecer en pantalla 8 - 16 - 24,
etc.
6) Realizar un programa que permita cargar dos listas de 15 valores cada una. Informar
con un mensaje cual de las dos listas tiene un valor acumulado mayor (mensajes
"Lista 1 mayor", "Lista 2 mayor", "Listas iguales")
89
Curso dinámico de programación
7) Tener en cuenta que puede haber dos o más estructuras repetitivas en un algoritmo.
8) Desarrollar un programa que permita cargar n números enteros y luego nos informe
cuántos valores fueron pares y cuántos impares.
El ciclo for
Cualquier problema que requiera una estructura repetitiva se puede resolver empleando la
estructura while. Pero hay otra estructura repetitiva cuyo planteo es más sencillo en ciertas
situaciones.
Sintaxis:
Ejemplo 1:
90
Curso dinámico de programación
Programa:
Ejemplo 2:
Desarrollar un programa que permita la carga de 10 valores por teclado y nos muestre
posteriormente la suma de los valores ingresados y su promedio. Este problema ya lo
desarrollamos , lo resolveremos empleando la estructura for.
Programa:
import java.util.Scanner;
Problemas propuestos
1) Confeccionar un programa que lea n pares de datos, cada par de datos corresponde a
la medida de la base y la altura de un triángulo. El programa deberá informar:
a) De cada triángulo la medida de su base, su altura y su superficie.
91
Curso dinámico de programación
El Ciclo do while
La estructura do while es otra estructura repetitiva, la cual ejecuta al menos una vez su
bloque repetitivo, a diferencia del while o del for que podían no ejecutar el bloque.
Esta estructura repetitiva se utiliza cuando conocemos de antemano que por lo menos una
vez se ejecutará el bloque repetitivo.
La condición de la estructura está abajo del bloque a repetir, a diferencia del while o del for
que está en la parte superior.
Sintaxis:
do
{
} while (
Es importante analizar y ver que las operaciones se ejecutan como mínimo una vez.
92
Curso dinámico de programación
Ejemplo 1:
Escribir un programa que solicite la carga de un número entre 0 y 999, y nos muestre un
mensaje de cuántos dígitos tiene el mismo. Finalizar el programa cuando se cargue el valor
0.
Programa:
import java.util.Scanner;
}
}
Ejemplo 2:
Escribir un programa que solicite la carga de números por teclado, obtener su promedio.
Finalizar la carga de valores cuando se cargue el valor 0.
Programa:
import java.util.Scanner;
93
Curso dinámico de programación
int suma,cant,valor,promedio;
suma=0;
cant=0;
do {
System.out.print("Ingrese un valor (0 para
finalizar):");
valor=teclado.nextInt();
if (valor!=0) {
suma=suma+valor;
cant++;
}
} while (valor!=0);
if (cant!=0) {
promedio=suma/cant;
System.out.print("El promedio de los valores
ingresados es:");
System.out.print(promedio);
} else {
System.out.print("No se ingresaron valores.");
}
}
}
Problemas propuestos
1. Realizar un programa que acumule (sume) valores ingresados por teclado hasta
ingresar el 9999 (no sumar dicho valor, indica que ha finalizado la carga). Imprimir
el valor acumulado e informar si dicho valor es cero, mayor a cero o menor a cero.
Se pide confeccionar un programa que lea los datos de las cuentas corrientes e informe:
a)De cada cuenta: número de cuenta y estado de la cuenta según su saldo, sabiendo que:
94
Curso dinámico de programación
Cadenas de caracteres
En Java hemos visto que cuando queremos almacenar un valor entero definimos una
variable de tipo int, si queremos almacenar un valor con decimales definimos una variable
de tipo float. Ahora si queremos almacenar una cadena de caracteres (por ejemplo un
nombre de una persona) debemos definir un objeto de la clase String.
Ejemplo 1:
Solicitar el ingreso del nombre y edad de dos personas. Mostrar el nombre de la persona
con mayor edad.
Programa:
import java.util.Scanner;
Para almacenar un nombre debemos definir una variable de tipo String y su ingreso por
teclado se hace llamando al método next() del objeto teclado:
nombre1=teclado.next();
95
Curso dinámico de programación
La primera salvedad que tenemos que hacer cuando utilizamos el método next() es que solo
nos permite ingresar una cadena de caracteres con la excepción del espacio en blanco (es
decir debemos ingresar un nombre de persona y no su nombre y apellido separado por un
espacio en blanco)
Veamos que existe otro método llamado nextLine() que nos permite cargar espacios en
blanco pero para su uso se complica cuando cargamos otras valores de tipo distinto a String
(por ejemplo int, float etc.)
Ejemplo 2:
Solicitar el ingreso del apellido, nombre y edad de dos personas. Mostrar el nombre de la
persona con mayor edad. Realizar la carga del apellido y nombre en una variable de tipo
String.
Programa:
import java.util.Scanner;
Cuando se ingresa una cadena con caracteres en blanco debemos tener en cuenta en llamar
al método nextLine().
96
Curso dinámico de programación
System.out.print("Ingrese edad:");
edad1=teclado.nextInt();
System.out.print("Ingrese el apellido y el nombre:");
teclado.nextLine();
apenom2=teclado.nextLine();
Como vemos llamamos al método nextLine() dos veces, la primera retorna la tecla "Enter"
y la segunda se queda esperando que ingresemos el apellido y nombre (tener en cuenta que
esto es necesario solo si previamente se llamó al método nextInt() o nextFloat().
Ejemplo 3:
Programa:
import java.util.Scanner;
Para comparar si el contenido de dos String son iguales no podemos utilizar el operador ==.
Debemos utilizar un método de la clase String llamado equals y pasar como parámetro el
String con el que queremos compararlo:
if (apellido1.equals(apellido2)) {
97
Curso dinámico de programación
El método equals retorna verdadero si los contenidos de los dos String son exactamente
iguales, esto hace que se ejecute el bloque del verdadero.
Recordemos que hemos utilizado el método next() para la carga de los String, luego esto
hace que no podamos ingresar un apellido con espacios en blanco (podemos probar que si
ingresamos por ejemplo "Rodriguez Rodriguez" en el primer apellido, luego se carga la
cadena "Rodriguez" en la variable apellido1 y "Rodriguez" en la variable apellido2 (con
esto hacemos notar que cada vez que ingresamos un espacio en blanco cuando utilizamos el
método next() los caracteres que siguen al espacio en blanco son recuperados en la
siguiente llamada al método next())
El método equals retorna verdadero si los contenidos de los dos String son exactamente
iguales, es decir si cargamos "Martinez" en apellido1 y "martinez" en apellido2 luego el
método equals retorna falso ya que no es lo mismo la "M" mayúscula y la "m" minúscula.
if (apellido1.equalsIgnoreCase(apellido2)) {
System.out.print("Los apellidos son iguales sin tener
en cuenta mayúsculas y minúsculas");
}
else {
System.out.print("Los apellidos son distintos sin tener
en cuenta mayúsculas y minúsculas");
}
98
Curso dinámico de programación
Una clase es un molde del que luego se pueden crear múltiples objetos, con similares
características.
Una clase es una plantilla (molde), que define atributos (variables) y métodos (funciones)
La clase define los atributos y métodos comunes a los objetos de ese tipo, pero luego, cada
objeto tendrá sus propios valores y compartirán las mismas funciones.
Debemos crear una clase antes de poder crear objetos (instancias) de esa clase. Al crear un
objeto de una clase, se dice que se crea una instancia de la clase o un objeto propiamente
dicho.
Ejemplo 1:
Confeccionar una clase que permita carga el nombre y la edad de una persona. Mostrar los
datos cargados. Imprimir un mensaje si es mayor de edad (edad>=18)
Programa:
import java.util.Scanner;
public class Persona {
private Scanner teclado;
private String nombre;
private int edad;
99
Curso dinámico de programación
El nombre de la clase debe hacer referencia al concepto (en este caso la hemos llamado
Persona):
Veremos más adelante que un atributo es normalmente definido con la cláusula private (con
esto no permitimos el acceso al atributo desde otras clases)
A los atributos se tiene acceso desde cualquier función o método de la clase (salvo la main)
Luego de definir los atributos de la clase debemos declarar los métodos o funciones de la
clase. La sintaxis es parecida a la main (sin la cláusula static):
100
Curso dinámico de programación
edad=teclado.nextInt();
}
En el método inicializar (que será el primero que deberemos llamar desde la main) creamos
el objeto de la clase Scanner y cargamos por teclado los atributos nombre y edad. Como
podemos ver el método inicializar puede hacer acceso a los tres atributos de la clase
Persona.
El segundo método tiene por objetivo imprimir el contenido de los atributos nombre y edad
(los datos de los atributos se cargaron al ejecutarse previamente el método inicializar:
El tercer método tiene por objetivo mostrar un mensaje si la persona es mayor o no de edad:
Por último en la main declaramos un objeto de la clase Persona y llamamos a los métodos
en un orden adecuado:
Ejemplo 2:
Desarrollar un programa que cargue los lados de un triángulo e implemente los siguientes
métodos: inicializar los atributos, imprimir el valor del lado mayor y otro método que
muestre si es equilátero o no.
101
Curso dinámico de programación
Programa:
import java.util.Scanner;
public class Triangulo {
private Scanner teclado;
private int lado1,lado2,lado3;
102
Curso dinámico de programación
Todos los problemas que requieran la entrada de datos por teclado debemos definir un
atributo de la clase Scanner:
Este problema requiere definir tres atributos de tipo entero donde almacenamos los valores
de los lados del triángulo:
El primer método que deberá llamarse desde la main es el inicializar donde creamos el
objeto de la clase Scanner y cargamos los tres atributos por teclado:
Como podemos observar cuando un problema se vuelve más complejo es más fácil y
ordenado separar los distintos algoritmos en varios métodos y no codificar todo en la main.
El último método de esta clase verifica si los tres enteros ingresados son iguales:
103
Curso dinámico de programación
System.out.print("No es un triángulo
equilátero");
}
}
Ejemplo 3:
Desarrollar una clase que represente un punto en el plano y tenga los siguientes métodos:
cargar los valores de x e y, imprimir en que cuadrante se encuentra dicho punto (concepto
matemático, primer cuadrante si x e y son positivas, si x<0 e y>0 segundo cuadrante, etc.)
Programa:
import java.util.Scanner;
public class Punto {
private Scanner teclado;
int x,y;
void imprimirCuadrante() {
if (x>0 && y>0) {
System.out.print("Se encuentra en el primer
cuadrante.");
} else {
if (x<0 && y>0) {
System.out.print("Se encuentra en el segundo
cuadrante.");
} else {
if (x<0 && y<0) {
System.out.print("Se encuentra en el
tercer cuadrante.");
} else {
104
Curso dinámico de programación
Definimos tres atributos (el objeto de la clase Scanner y los dos enteros donde
almacenamos la coordenada x e y del punto:
El método inicializar crea el objeto de la clase Scanner y pide cargar las coordenadas x e y:
void imprimirCuadrante() {
if (x>0 && y>0) {
System.out.print("Se encuentra en el primer
cuadrante.");
} else {
if (x<0 && y>0) {
105
Curso dinámico de programación
Ejemplo 4:
Desarrollar una clase que represente un Cuadrado y tenga los siguientes métodos: cargar el
valor de su lado, imprimir su perímetro y su superficie.
Programa:
import java.util.Scanner;
public class Cuadrado {
private Scanner teclado;
int lado;
106
Curso dinámico de programación
En este problema es interesante ver como no definimos dos atributos donde se almacenan la
superficie y el perímetro del cuadrado, esto debido a que solo estos datos se los requiere en
el método donde se imprimen:
107
Curso dinámico de programación
Problemas propuestos
1) Hacer una clase que represente un empleado. Definir como atributos su nombre y su
sueldo. Confeccionar los métodos para la carga, otro para imprimir sus datos y por
último uno que imprima un mensaje si debe pagar impuestos (si el sueldo supera a
3000)
Declaración de métodos
Cuando uno plantea una clase en lugar de especificar todo el algoritmo en un único método
(lo que hicimos en los primeros programas de este libro) es dividir todas las
responsabilidades de las clase en un conjunto de métodos.
Los parámetros los podemos imaginar como variables locales al método, pero su valor se
inicializa con datos que llegan cuando lo llamamos.
Ejemplo 1:
Confeccionar una clase que permita ingresar valores enteros por teclado y nos muestre la
tabla de multiplicar de dicho valor. Finalizar el programa al ingresar el -1.
108
Curso dinámico de programación
Programa:
import java.util.Scanner;
public class TablaMultiplicar {
public void cargarValor() {
Scanner teclado=new Scanner(System.in);
int valor;
do {
System.out.print("Ingrese valor:");
valor=teclado.nextInt();
if (valor!=-1) {
calcular(valor);
}
} while (valor!=-1);
}
En esta clase no hemos definido ningún atributo, ya que el objeto de la clase Scanner lo
requerimos en un solo método, por ello lo definimos como una variable local.
El método calcular recibe un parámetro de tipo entero, luego lo utilizamos dentro del
método para mostrar la tabla de multiplicar de dicho valor, para esto inicializamos la
variable f con el valor que llega en el parámetro. Luego de cada ejecución del for
incrementamos el contador f con el valor de v.
Un método puede no tener parámetros como hemos visto en problemas anteriores o puede
tener uno o más parámetros (en caso de tener más de un parámetro los mismos se separan
por coma)
109
Curso dinámico de programación
El método cargarValores no tiene parámetros y tiene por objetivo cargar un valor entero por
teclado y llamar al método calcular para que muestre la tabla de multiplicar del valor que le
pasamos por teclado:
Como vemos al método calcular lo llamamos por su nombre y entre paréntesis le pasamos
el dato a enviar (debe ser un valor o variable entera)
Cuando un método retorna un dato en vez de indicar la palabra clave void previo al nombre
del método indicamos el tipo de dato que retorna. Luego dentro del algoritmo en el
momento que queremos que finalice el mismo y retorne el dato empleamos la palabra clave
return con el valor respectivo.
110
Curso dinámico de programación
Ejemplo 2:
Confeccionar una clase que permita ingresar tres valores por teclado. Luego mostrar el
mayor y el menor.
Programa:
import java.util.Scanner;
public class MayorMenor {
public void cargarValores() {
Scanner teclado=new Scanner(System.in);
System.out.print("Ingrese primer valor:");
int valor1=teclado.nextInt();
System.out.print("Ingrese segundo valor:");
int valor2=teclado.nextInt();
System.out.print("Ingrese tercer valor:");
int valor3=teclado.nextInt();
int mayor,menor;
mayor=calcularMayor(valor1,valor2,valor3);
menor=calcularMenor(valor1,valor2,valor3);
System.out.println("El valor mayor de los tres
es:"+mayor);
System.out.println("El valor menor de los tres
es:"+menor);
}
111
Curso dinámico de programación
}
return m;
}
Si vemos la sintaxis que calcula el mayor de tres valores enteros es similar al algoritmo
visto en conceptos anteriores:
Lo primero que podemos observar que el método retorna un entero y recibe tres
parámetros:
Dentro del método verificamos cual de los tres parámetros almacena un valor mayor, a este
valor lo almacenamos en una variable local llamada "m", al valor almacenado en esta
variable lo retornamos al final con un return.
mayor=calcularMayor(valor1,valor2,valor3);
Debemos asignar a una variable el valor devuelto por el método calcularMayor. Luego el
contenido de la variable mayor lo mostramos:
112
Curso dinámico de programación
Hemos empleado variables de distinto tipo para el almacenamiento de datos (variables int,
float, String) En esta sección veremos otros tipos de variables que permiten almacenar un
conjunto de datos en una única variable.
Un vector es una estructura de datos que permite almacenar un CONJUNTO de datos del
MISMO tipo.
Con un único nombre se define un vector y por medio de un subíndice hacemos referencia a
cada elemento del mismo (componente)
Ejemplo 1:
Programa:
import java.util.Scanner;
public class PruebaVector1 {
private Scanner teclado;
private int[] sueldos;
113
Curso dinámico de programación
En el método de cargar lo primero que hacemos es crear el vector (en java los vectores son
objetos por lo que es necesario proceder a su creación mediante el operador new):
sueldos=new int[5];
Para cargar cada componente debemos indicar entre corchetes que elemento del vector
estamos accediendo:
for(int f=0;f<5;f++) {
System.out.print("Ingrese valor de la componente:");
sueldos[f]=teclado.nextInt();
}
La estructura de programación que más se adapta para cargar en forma completa las
componentes de un vector es un for, ya que sabemos de antemano la cantidad de valores a
cargar.
Cuando f vale cero estamos accediendo a la primer componente del vector (en nuestro caso
sería):
sueldos[0]=teclado.nextInt();
Lo mas común es utilizar una estructura repetitiva for para recorrer cada componente del
vector.
Utilizar el for nos reduce la cantidad de código, si no utilizo un for debería en forma
secuencial implementar el siguiente código:
114
Curso dinámico de programación
System.out.print("Ingrese valor de la
componente:");
sueldos[1]=teclado.nextInt();
sueldos[2]=teclado.nextInt();
Siempre que queremos acceder a una componente del vector debemos indicar entre
corchetes la componente, dicho valor comienza a numerarse en cero y continua hasta un
número menos del tamaño del vector, en nuestro caso creamos el vector con 5 elementos:
sueldos=new int[5];
Ejemplo 2:
Definir un vector de 5 componentes de tipo float que representen las alturas de 5 personas.
Obtener el promedio de las mismas. Contar cuántas personas son más altas que el promedio
y cuántas más bajas.
Programa:
115
Curso dinámico de programación
import java.util.Scanner;
public class PruebaVector2 {
private Scanner teclado;
private float[] alturas;
private float promedio;
116
Curso dinámico de programación
}
}
alturas=new float[5];
for(int f=0;f<5;f++) {
System.out.print("Ingrese la altura de la persona:");
alturas[f]=teclado.nextFloat();
}
Por último en un tercer método comparamos cada componente del vector con el atributo
promedio, si el valor almacenado supera al promedio incrementamos un contador en caso
que sea menor al promedio incrementamos otro contador:
117
Curso dinámico de programación
}
}
System.out.println("Cantidad de personas mayores al
promedio:"+may);
System.out.println("Cantidad de personas menores al
promedio:"+men);
}
Observación:
En este problema podemos observar una ventaja de tener almacenadas todas las alturas de
las personas. Si no conociéramos los vectores tenemos que cargar otra vez las alturas por
teclado para compararlas con el promedio.
Ejemplo 3:
Una empresa tiene dos turnos (mañana y tarde) en los que trabajan 8 empleados (4 por la
mañana y 4 por la tarde).
Hacer un programa que permita almacenar los sueldos de los empleados agrupados por
turno. Imprimir los gastos en sueldos de cada turno.
Programa:
import java.util.Scanner;
public class PruebaVector3 {
private Scanner teclado;
private float[] turnoMan;
private float[] turnoTar;
118
Curso dinámico de programación
turnoTar[f]=teclado.nextFloat();
}
}
Definimos dos atributos de tipo vector donde almacenaremos los sueldos de los empleados
de cada turno:
turnoMan=new float[4];
turnoTar=new float[4];
119
Curso dinámico de programación
turnoTar[f]=teclado.nextFloat();
}
En otro método procedemos a sumar las componentes de cada vector y mostrar dichos
acumuladores:
float man=0;
float tar=0;
for(int f=0;f<4;f++){
man=man+turnoMan[f];
tar=tar+turnoTar[f];
}
System.out.println("Total de gastos del turno de la
mañana:"+man);
System.out.println("Total de gastos del turno de la
tarde:"+tar);
Problemas propuestos
3) Se tienen las notas del primer parcial de los alumnos de dos cursos, el curso A y el
curso B, cada curso cuenta con 5 alumnos. Realizar un programa que muestre el
curso que obtuvo el mayor promedio general.
120
Curso dinámico de programación
Una matriz es una estructura de datos que permite almacenar un CONJUNTO de datos del
MISMO tipo.
Con un único nombre se define la matriz y por medio de DOS subíndices hacemos
referencia a cada elemento de la misma (componente)
La figura muestra una matriz de 3 filas y 5 columnas. Para hacer referencia a cada elemento
debemos indicar primero la fila y luego la columna, por ejemplo en la componente 1,4 se
almacena el valor 97.
En este ejemplo almacenamos valores enteros. Todos los elementos de la matriz deben ser
del mismo tipo (int, float, String etc.)
Las filas y columnas comienzan a numerarse a partir de cero, similar a los vectores.
Una matriz se la puede representar por un conjunto de vectores.
Ejemplo1:
Crear una matriz de 3 filas por 5 columnas con elementos de tipo int, cargar sus
componentes y luego imprimirlas.
Programa:
import java.util.Scanner;
public class Matriz1 {
private Scanner teclado;
private int[][] mat;
121
Curso dinámico de programación
for(int c=0;c<5;c++) {
System.out.print("Ingrese componente:");
mat[f][c]=teclado.nextInt();
}
}
}
Para definir una matriz debemos antecederle los corchetes abiertos y cerrados dos veces:
De esta forma el compilador de Java puede diferenciar los vectores de las matrices.
Para crear la matriz, es decir hacer la reserva de espacio de todas sus componentes debemos
utilizar el operador new y mediante dos subíndices indicamos la cantidad de filas y
columnas que tendrá la matriz:
mat=new int[3][5];
Luego debemos pasar a cargar sus 15 componentes (cada fila almacena 5 componentes y
tenemos 3 filas).
Lo más cómodo es utilizar un for anidado, el primer for que incrementa el contador f lo
utilizamos para recorrer las filas y el contador interno llamado c lo utilizamos para recorrer
las columnas.
Cada vez que se repite en forma completa el for interno se carga una fila completa, primero
se carga la fila cero en forma completa, luego la fila uno y finalmente la fila 2.
Siempre que accedemos a una posición de la matriz debemos disponer dos subíndices que
hagan referencia a la fila y columna mat[f][c]):
122
Curso dinámico de programación
for(int f=0;f<3;f++) {
for(int c=0;c<5;c++) {
System.out.print("Ingrese componente:");
mat[f][c]=teclado.nextInt();
}
}
Para imprimir la matriz de forma similar utilizamos dos for para acceder a cada elemento
de la matriz:
for(int f=0;f<3;f++) {
for(int c=0;c<5;c++) {
System.out.print(mat[f][c]+" ");
}
System.out.println();
}
}
Cada vez que se ejecuta todas las vueltas del for interno tenemos en pantalla una fila
completa de la matriz, por eso pasamos a ejecutar un salto de línea (con esto logramos que
en pantalla los datos aparezcan en forma matricial):
System.out.println();
Ejemplo 2:
Crear y cargar una matriz de 4 filas por 4 columnas. Imprimir la diagonal principal.
x - - -
- x - -
- - x -
- - - x
Programa:
import java.util.Scanner;
public class Matriz2 {
private Scanner teclado;
private int[][] mat;
123
Curso dinámico de programación
for(int c=0;c<4;c++) {
System.out.print("Ingrese componente:");
mat[f][c]=teclado.nextInt();
}
}
}
for(int k=0;k<4;k++) {
System.out.print(mat[k][k]+" ");
}
Ejemplo 3:
Crear y cargar una matriz de 3 filas por 4 columnas. Imprimir la primer fila. Imprimir la
última fila e imprimir la primer columna.
Programa:
import java.util.Scanner;
public class Matriz3 {
private Scanner teclado;
private int[][] mat;
124
Curso dinámico de programación
mat[f][c]=teclado.nextInt();
}
}
}
mat=new int[3][4];
Luego de cargarla el primer método que codificamos es el que imprimime la primer fila.
Disponemos un for para recorrer las columnas, ya que la fila siempre será la cero. Como
son cuatro los elementos de la primer fila el for se repite esta cantidad de veces:
125
Curso dinámico de programación
Para imprimir la última fila el algoritmo es similar, disponemos un for que se repita 4 veces
y en el subíndice de la fila disponemos el valor 2 (ya que la matriz tiene 3 filas):
Para imprimir la primer columna el for debe repetirse 3 veces ya que la matriz tiene 3 filas.
Dejamos constante el subíndice de la columna con el valor cero:
System.out.println("Primer columna:");
for(int f=0;f<3;f++) {
System.out.println(mat[f][0]);
}
Problema propuesto
Crear una matriz de 2 filas y 5 columnas. Realizar la carga de componentes por columna
(es decir primero ingresar toda la primer columna, luego la segunda columna y así
sucesivamente). Imprimir luego la matriz.
126
Curso dinámico de programación
Constructores de la clase
Ejemplo 1:
Se desea guardar los sueldos de 5 operarios en un vector. Realizar la creación y carga del
vector en el constructor.
Programa:
import java.util.Scanner;
public class Operarios {
private Scanner teclado;
private int[] sueldos;
public Operarios()
{
teclado=new Scanner(System.in);
sueldos=new int[5];
for(int f=0;f<5;f++) {
System.out.print("Ingrese valor de la
componente:");
sueldos[f]=teclado.nextInt();
}
}
127
Curso dinámico de programación
Como podemos ver es el mismo problema que resolvimos cuando vimos vectores. La
diferencia es que hemos sustituido el método cargar con el constructor:
public Operarios()
{
teclado=new Scanner(System.in);
sueldos=new int[5];
for(int f=0;f<5;f++) {
System.out.print("Ingrese valor de la
componente:");
sueldos[f]=teclado.nextInt();
}
}
op.imprimir();
Ejemplo 2:
Plantear una clase llamada Alumno y definir como atributos su nombre y su edad. En el
constructor realizar la carga de datos. Definir otros dos métodos para imprimir los datos
ingresados y un mensaje si es mayor o no de edad (edad >=18)
128
Curso dinámico de programación
Programa:
import java.util.Scanner;
public class Alumno {
private Scanner teclado;
private String nombre;
private int edad;
public Alumno() {
teclado=new Scanner(System.in);
System.out.print("Ingrese nombre:");
nombre=teclado.next();
System.out.print("Ingrese edad:");
edad=teclado.nextInt();
}
Declaramos la clase Persona, sus tres atributos y definimos el constructor con el mismo
nombre de la clase:
public Alumno() {
teclado=new Scanner(System.in);
System.out.print("Ingrese nombre:");
nombre=teclado.next();
System.out.print("Ingrese edad:");
129
Curso dinámico de programación
edad=teclado.nextInt();
}
Los otros dos métodos deben llamarse por su nombre y en el orden que necesitemos:
alumno1.imprimir();
alumno1.esMayorEdad();
Problemas propuestos
1) Hacer una clase que represente un empleado. Definir como atributos su nombre y su
sueldo. En el constructor cargar los atributos y luego en otro método imprimir sus
datos y por último uno que imprima un mensaje si debe pagar impuestos (si el
sueldo supera a 3000)
La Clase String
La clase String está orientada a manejar cadenas de caracteres. Hasta este momento hemos
utilizado algunos métodos de la clase String (equals, compareTo)
130
Curso dinámico de programación
El funcionamiento es casi exactamente igual que el método equals con la diferencia que no
tiene en cuenta mayúsculas y minúsculas (si comparamos 'Ana' y 'ana' luego el método
equalsIgnoreCase retorna true)
Retorna un caracter del String, llega al método la posición del caracter a extraer.
int length()
Retorna -1 si el String que le pasamos como parámetro no está contenida en la cadena del
objeto que llama al método. En caso que se encuentre contenido el String s1 retorna la
posición donde comienza a repetirse.
String toUpperCase()
String toLowerCase()
131
Curso dinámico de programación
Ejemplo 1:
Confeccionar una clase que solicite el ingreso de dos String y luego emplee los métodos
más comunes de la clase String.
Programa:
import java.util.Scanner;
public class Cadena1 {
public static void main(String[] ar) {
Scanner teclado=new Scanner(System.in);
String cad1;
String cad2;
System.out.print("Ingrese la primer cadena:");
cad1=teclado.nextLine();
System.out.print("Ingrese la segunda cadena:");
cad2=teclado.nextLine();
if (cad1.equals(cad2)==true) {
System.out.println(cad1+" es exactamente igual a
"+cad2);
} else {
System.out.println(cad1+" no es exactamente igual
a "+cad2);
}
if (cad1.equalsIgnoreCase(cad2)==true) {
System.out.println(cad1+" es igual a "+cad2+" sin
tener en cuenta mayúsculas/minúsculas");
} else {
System.out.println(cad1+" no es igual a "+cad2+"
sin tener en cuenta mayúsculas/minúsculas");
}
if (cad1.compareTo(cad2)==0) {
System.out.println(cad1+" es exactamente igual a
"+cad2);
} else {
if (cad1.compareTo(cad2)>0) {
System.out.println(cad1+ " es mayor
alfabéticamente que "+cad2);
} else {
System.out.println(cad2+ " es mayor
alfabéticamente que "+cad1);
}
}
char carac1=cad1.charAt(0);
System.out.println("El primer caracter de "+cad1+" es
"+carac1);
int largo=cad1.length();
System.out.println("El largo del String "+cad1+" es
"+largo);
132
Curso dinámico de programación
String cad3=cad1.substring(0,3);
System.out.println("Los primeros tres caracteres de
"+cad1+" son "+cad3);
int posi=cad1.indexOf(cad2);
if (posi==-1) {
System.out.println(cad2+" no está contenido en
"+cad1);
} else {
System.out.println(cad2+" está contenido en
"+cad1+" a partir de la
posición "+posi);
}
System.out.println(cad1+ " convertido a mayúsculas es
"+cad1.toUpperCase());
System.out.println(cad1+ " convertido a minúsculas es
"+cad1.toLowerCase());
}
}
Para cargar los dos String utilizamos en este caso el método nextLine para permitir ingresar
espacios en blanco:
Problemas propuestos
1) Realizar una clase, que permita cargar una dirección de mail en el constructor, luego
en otro método mostrar un mensaje si contiene el caracter '@'.
3) Desarrollar un programa que solicite la carga de una clave. La clase debe tener dos
métodos uno para la carga y otro que muestre si la clave es la correcta (la clave a
comparar es "123abc")
133
Curso dinámico de programación
4) Confeccionar un programa que permita cargar los nombres de 5 personas y sus mail,
luego implementar los siguientes métodos:
a) Mostrar por pantalla los datos.
b) Consulta del mail ingresando su nombre.
c) Mostrar los mail que no tienen el carácter @.
5) Codifique un programa que permita cargar una oración por teclado, luego mostrar cada
palabra ingresada en una línea distinta.
Debe aparecer:
La
mañana
está
fría.
134
Curso dinámico de programación
Colaboración de clases
Ejemplo 1:
Un banco tiene 3 clientes que pueden hacer depósitos y extracciones. También el banco
requiere que al final del día calcule la cantidad de dinero que hay depositada.
Cliente
atributos:
nombre
monto
métodos:
constructor
depositar
extraer
retornarMonto
Banco
atributos:
3 Cliente (3 objetos de la clase Cliente)
1 Scanner (Para poder hacer la entrada de datos por teclado)
métodos:
constructor
operar
depositosTotales
Creamos un proyecto en Netbeans llamado: Proyecto1 y dentro del proyecto creamos dos
clases llamadas: Cliente y Banco.
135
Curso dinámico de programación
Programa:
public Banco() {
cliente1=new Cliente("Juan");
cliente2=new Cliente("Ana");
cliente3=new Cliente("Pedro");
}
136
Curso dinámico de programación
int t = cliente1.retornarMonto () +
cliente2.retornarMonto () + cliente3.retornarMonto ();
System.out.println ("El total de dinero en el banco
es:" + t);
cliente1.imprimir();
cliente2.imprimir();
cliente3.imprimir();
}
Los atributos de una clase normalmente son privados para que no se tenga acceso
directamente desde otra clase, los atributos son modificados por los métodos de la misma
clase:
Los métodos depositar y extraer actualizan el atributo monto con el dinero que llega como
parámetro (para simplificar el problema no hemos validado que cuando se extrae dinero el
atributo monto quede con un valor negativo):
137
Curso dinámico de programación
El método retornarMonto tiene por objetivo comunicar al Banco la cantidad de dinero que
tiene el cliente (recordemos que como el atributo monto es privado de la clase, debemos
tener un método que lo retorne):
Por último el método imprimir muestra nombre y el monto de dinero del cliente:
Como podemos observar la clase Cliente no tiene función main. Entonces donde definimos
objetos de la clase Cliente?
La respuesta a esta pregunta es que en la clase Banco definimos tres objetos de la clase
Cliente.
En le constructor creamos los tres objetos (cada vez que creamos un objeto de la clase
Cliente debemos pasar a su constructor el nombre del cliente, recordemos que su monto de
depósito se inicializa con cero):
public Banco() {
cliente1=new Cliente("Juan");
cliente2=new Cliente("Ana");
cliente3=new Cliente("Pedro");
}
El método operar del banco (llamamos a los métodos depositar y extraer de los clientes):
138
Curso dinámico de programación
El método depositosTotales obtiene el monto depositado de cada uno de los tres clientes,
procede a mostrarlos y llama al método imprimir de cada cliente para poder mostrar el
nombre y depósito:
Por último en la main definimos un objeto de la clase Banco (la clase Banco es la clase
principal en nuestro problema):
Ejemplo 2:
Plantear un programa que permita jugar a los dados. Las reglas de juego son: se tiran tres
dados si los tres salen con el mismo valor mostrar un mensaje que "gano", sino "perdió".
Dado
atributos:
valor
métodos:
tirar
imprimir
retornarValor
139
Curso dinámico de programación
JuegoDeDados
atributos:
3 Dado (3 objetos de la clase Dado)
métodos;
constructor
jugar
Creamos un proyecto en Eclipse llamado: Proyecto2 y dentro del proyecto creamos dos
clases llamadas: Dado y JuegoDeDados.
Programa:
public JuegoDeDados() {
dado1=new Dado();
dado2=new Dado();
dado3=new Dado();
}
140
Curso dinámico de programación
dado1.retornarValor()==dado3.retornarValor()) {
System.out.println("Ganó");
} else {
System.out.println("Perdió");
}
}
La clase dado define el atributo "valor" donde almacenamos un valor aleatorio que
representa el número que sale al tirarlo.
El método tirar almacena el valor aleatorio (para generar un valor aleatorio utilizamos el
método random de la clase Math, el mismo genera un valor real comprendido entre 0 y 1,
pero nunca 0 o 1. Puede ser un valor tan pequeño como 0.0001 o tan grando como 0.9999.
Luego este valor generado multiplicado por 6 y antecediendo (int) obtenemos la parte
entera de dicho producto):
Como vemos le sumamos uno ya que el producto del valor aleatorio con seis puede generar
números enteros entre 0 y 5.
El método imprimir de la clase Dado muestra por pantalla el valor del dado:
Por último el método que retorna el valor del dado (se utiliza en la otra clase para ver si los
tres dados generaron el mismo valor):
141
Curso dinámico de programación
La clase JuegoDeDatos define tres atributos de la clase Dado (con esto decimos que la clase
Dado colabora con la clase JuegoDeDados):
public JuegoDeDados() {
dado1=new Dado();
dado2=new Dado();
dado3=new Dado();
}
En el método jugar llamamos al método tirar de cada dado, pedimos que se imprima el
valor generado y finalmente procedemos a verificar si se ganó o no:
En la main creamos solo un objeto de la clase principal (en este caso la clase principal es el
JuegoDeDados):
142
Curso dinámico de programación
Problema propuesto
Herencia
Vimos en el concepto anterior que dos clases pueden estar relacionadas por la colaboración.
Ahora veremos otro tipo de relaciones entre clases que es la Herencia.
La herencia significa que se pueden crear nuevas clases partiendo de clases existentes, que
tendrá todas los atributos y los métodos de su 'superclase' o 'clase padre' y además se le
podrán añadir otros atributos y métodos propios.
clase padre
Clase de la que desciende o deriva una clase. Las clases hijas (descendientes) heredan
(incorporan) automáticamente los atributos y métodos de la la clase padre.
Subclase
Vehículo
Honda Toyota
Siempre hacia abajo en la jerarquía hay una especialización (las subclases añaden nuevos
atributos y métodos.
143
Curso dinámico de programación
Software
DeAplicacion De sistemas
El primer tipo de relación que habíamos visto entre dos clases, es la de colaboración.
Recordemos que es cuando una clase contiene un objeto de otra clase como atributo.
Cuando la relación entre dos clases es del tipo "...tiene un..." o "...es parte de...", no
debemos implementar herencia. Estamos frente a una relación de colaboración de clases no
de herencia.
Si tenemos una ClaseA y otra ClaseB y notamos que entre ellas existe una relacion de tipo
"... tiene un...", no debe implementarse herencia sino declarar en la clase ClaseA un atributo
de la clase ClaseB.
Por ejemplo: tenemos una clase Auto, una clase Rueda y una clase Volante. Vemos que la
relación entre ellas es: Auto "...tiene 4..." Rueda, Volante "...es parte de..." Auto; pero la
clase Auto no debe derivar de Rueda ni Volante de Auto porque la relación no es de tipo-
subtipo sino de colaboración. Debemos declarar en la clase Auto 4 atributos de tipo Rueda
y 1 de tipo Volante.
Luego si vemos que dos clase responden a la pregunta ClaseA "..es un.." ClaseB es posible
que haya una relación de herencia.
Por ejemplo:
Ejemplo 1:
144
Curso dinámico de programación
Si analizamos ambas clases encontramos que muchos atributos y métodos son idénticos. En
estos casos es bueno definir una clase padre que agrupe dichos atributos y
responsabilidades comunes.
Operación
Suma Resta
Solamente el método operar es distinto para las clases Suma y Resta (esto hace que no lo
podamos disponer en la clase Operacion), luego los métodos cargar1, cargar2 y
mostrarResultado son idénticos a las dos clases, esto hace que podamos disponerlos en la
clase Operacion. Lo mismo los atributos valor1, valor2 y resultado se definirán en la clase
padre Operacion.
Crear un proyecto y luego crear cuatro clases llamadas: Operacion, Suma, Resta y Prueba
Programa:
import java.util.Scanner;
public class Operacion {
protected Scanner teclado;
protected int valor1;
protected int valor2;
protected int resultado;
public Operacion() {
teclado=new Scanner(System.in);
}
145
Curso dinámico de programación
import java.util.Scanner;
public class Operacion {
protected Scanner teclado;
protected int valor1;
protected int valor2;
protected int resultado;
146
Curso dinámico de programación
Ya veremos que definimos los atributos con este nuevo modificador de acceso (protected)
para que la subclase tenga acceso a dichos atributos. Si los definimos private las subclases
no pueden acceder a dichos atributos.
public Operacion() {
teclado=new Scanner(System.in);
}
Ahora veamos como es la sintaxis para indicar que una clase hereda de otra:
Utilizamos la palabra clave extends y seguidamente el nombre de la clase padre (con esto
estamos indicando que todos los métodos y atributos de la clase Operación son también
métodos de la clase Suma.
void operar() {
resultado=valor1+valor2;
}
El método operar puede acceder a los atributos heredados (siempre y cuando los mismos se
declaren protected, en caso que sean private si bien lo hereda de la clase padre solo los
pueden modificar métodos de dicha clase padre.
Ahora podemos decir que la clase Suma tiene cinco métodos (cuatro heredados y uno
propio) y 3 atributos (todos heredados)
147
Curso dinámico de programación
Podemos llamar tanto al método propio de la clase Suma "operar()" como a los métodos
heredados. Quien utilice la clase Suma solo debe conocer que métodos públicos tiene
(independientemente que pertenezcan a la clase Suma o a una clase superior)
Problemas propuestos
1) Crear una clase Persona que tenga como atributos el nombre y la edad. Definir
como responsabilidades un método que cargue los datos personales y otro que los
imprima.
2) Plantear una segunda clase Empleado que herede de la clase Persona. Añadir un
atributo sueldo y los métodos de cargar el sueldo e imprimir su sueldo.
148
Curso dinámico de programación
Ejemplo 1:
Programa:
import java.util.Scanner;
public class Matriz9 {
private Scanner teclado;
private String[] empleados;
private int[][] sueldos;
private int[] sueldostot;
149
Curso dinámico de programación
150
Curso dinámico de programación
Para resolver este problema lo primero que hacemos es definir una matriz donde se
almacenarán los sueldos mensuales de cada empleado, un vector de tipo String donde
almacenaremos los nombre de cada empleado y finalmente definimos un vector paralelo a
la matriz donde almacenaremos la suma de cada fila de la matriz:
empleados=new String[4];
sueldos=new int[4][3];
for(int f=0;f<empleados.length;f++){
System.out.print("Ingrese el nombre del
empleado:");
empleados[f]=teclado.next();
for(int c=0;c<sueldos[f].length;c++) {
System.out.print("Ingrese sueldo:");
sueldos[f][c]=teclado.nextInt();
}
}
El método sumar sueldos crea el vector donde se almacenará la suma de cada fila de la
matriz. Mediante dos for recorremos toda la matriz y sumamos cada fila:
sueldostot=new int[4];
for(int f=0;f<sueldos.length;f++) {
int suma=0;
for(int c=0;c<sueldos[f].length;c++) {
suma=suma+sueldos[f][c];
}
sueldostot[f]=suma;
}
El método imprimirTotalPagado tiene por objetivo mostrar los dos vectores (el de nombre
de los empleados y el que almacena la suma de cada fila de la matriz):
for(int f=0;f<sueldostot.length;f++) {
System.out.println(empleados[f]+" -
"+sueldostot[f]);
}
151
Curso dinámico de programación
Por último para obtener el nombre del empleado con mayor sueldo acumulado debemos
inicializar dos variables auxiliares con el primer elemento del vector de empleados y en otra
auxiliar guardamos la primer componente del vector sueldostot:
int may=sueldostot[0];
String nom=empleados[0];
for(int f=0;f<sueldostot.length;f++) {
if (sueldostot[f]>may) {
may=sueldostot[f];
nom=empleados[f];
}
}
System.out.println("El empleado con mayor sueldo es
"+ nom + " que tiene un sueldo de "+may);
Problema propuesto
Se desea saber la temperatura media trimestral de cuatro paises. Para ello se tiene como
dato las temperaturas medias mensuales de dichos paises. Se debe ingresar el nombre del
país y seguidamente las tres temperaturas medias mensuales.
152
Curso dinámico de programación
Matrices irregulares
Java nos permite crear matrices irregulares. Se dice que una matriz es irregular si la
cantidad de elementos de cada fila varía. Luego podemos imaginar una matriz irregular:
Como podemos ver la fila cero tiene reservado dos espacios, la fila uno reserva cuatro
espacios y la última fila reserva espacio para tres componentes.
Primero creamos la cantidad de filas dejando vacío el espacio que indica la cantidad de
columnas:
mat=new int[3][];
mat[0]=new int[2];
mat[1]=new int[4];
mat[2]=new int[3];
Luego la forma para acceder a sus componentes es similar a las matrices regulares, siempre
teniendo en cuenta y validando que exista dicha componente:
mat[0][0]=120;
Dará un error si queremos cargar la tercer componente de la fila cero (esto debido a que no
existe):
mat[0][2]=230;
153
Curso dinámico de programación
Sytem.out.println(mat.length);
Ejemplo 1:
Confeccionaremos un programa que permita crear una matriz irregular y luego imprimir la
matriz en forma completa.
Programa:
import java.util.Scanner;
public class MatrizIrregular1 {
private Scanner teclado;
private int[][] mat;
154
Curso dinámico de programación
System.out.println();
}
}
Primero creamos la cantidad de filas que tendrá la matriz (en los corchetes para las
columnas no disponemos valor):
Dentro del primer for pedimos que ingrese la cantidad de elementos que tendrá cada fila y
utilizamos el operador new nuevamente, pero en este caso se están creando cada fila de la
matriz (Java trata a cada fila como un vector):
for(int f=0;f<mat.length;f++) {
System.out.print("Cuantas elementos tiene la fila
" + f + ":");
int elementos=teclado.nextInt();
mat[f]=new int[elementos];
Dentro del for interno hacemos la carga de las componentes propiamente dicho de la matriz
(podemos ir cargando cada fila a medida que las vamos creando):
for(int c=0;c<mat[f].length;c++) {
System.out.print("Ingrese componente:");
mat[f][c]=teclado.nextInt();
}
Luego imprimimos la matriz en forma completa teniendo cuidado las condiciones que
disponemos en cada for.
El primer for se repite tantas veces como filas tiene la matriz: f<mat.length y
el for interno se repite tantas veces como elementos tiene la fila que estamos procesando
c<mat [f].length:
155
Curso dinámico de programación
for(int f=0;f<mat.length;f++) {
for(int c=0;c<mat[f].length;c++) {
System.out.print(mat[f][c]+" ");
}
System.out.println();
}
Problemas propuestos
1) Hacer una clase para administrar una matriz irregular de 5 filas y 1 columna la
primer fila, 2 columnas la segunda fila y así sucesivamente hasta 5 columnas la
última fila (crearla sin la intervención del operador)
3) Confeccionar una clase para administrar los días que han faltado los 3 empleados de
una empresa.
4) Definir un vector de 3 elementos de tipo String para cargar los nombres y una
matriz irregular para cargar los días que han faltado cada empleado (cargar el
número de día que faltó)
156
Curso dinámico de programación
157