Está en la página 1de 42

Resumen del Segundo Parcial

INTRODUCCIÓN AL LENGUAJE C
HISTORIA DEL LENGUAJE C
Fue creado por Brian Kernighan y Dennis Ritchie, en 1978, en los Laboratorios BELL, basándose
en el lenguaje B, creado por Ken Thompson. En 1989, el Instituto Nacional Estadounidense de
Estándares (American National Standards Institute - ANSI) finalizó el trabajo de establecer una
especificación estándar de C. Esta versión estándar del lenguaje se conoce como ANSI C.

A mediados de los ochenta se crea el C++, que es una extensión orientada a objetos de C

C++ se convierte en estándar ISO en 1998

VENTAJAS DEL LENGUAJE C


● Es poderoso y flexible. Sus órdenes, operaciones y funciones de biblioteca se pueden
utilizar para escribir la mayoría de los programas que corren en la computadora.
● Puede ser utilizado para el desarrollo de sistemas operativos, compiladores, sistemas
de tiempo real y aplicaciones de comunicaciones.
● Portabilidad: un programa en C puede ser escrito para un tipo de computadora y
trasladarse a otra computadora con pocas o ninguna modificación.
● Velocidad de ejecución.

● Se han creado numerosas bibliotecas C que soportan gran variedad de aplicaciones,


incluyendo: aplicaciones de bases de datos, gráficos, edición de texto, etc.

ESTRUCTURA DE UN LENGUAJE EN C
INCLUSIÓN DE LIBRERÍAS
La directiva #include permite añadir librerías o funciones que se encuentran en otros archivos

Indicando al compilador la ruta donde se encuentra el archivo

#include "C:\includes\funcion.h"

Indicando que se encuentran en el directorio por defecto del compilador

#include <funcion.h>

IDENTIFICADORES
Nombres dados a las variables o funciones

Un identificador se forma con una secuencia de letras (minúsculas de la a a la z; mayúsculas de


la A a la Z; y dígitos del 0 al 9)

El carácter subrayado o underscore (_) se considera como una letra más

Un identificador no puede contener espacios en blanco, ni otros caracteres distintos de los


citados (*, ; . : - +)

El primer carácter de un identificador debe ser siempre una letra o un (_)

Se hace distinción entre letras mayúsculas y minúsculas

ANSI C permite definir identificadores de hasta 31 caracteres de longitud

PALABRAS RESERVADAS
Las palabras reservadas en programación, o palabras clave, tienen un significado especial para
el compilador de cualquier lenguaje de programación.

Todas las palabras reservadas están prohibidas para usarlas con otro propósito. Por ejemplo,
no podemos llamar una variable o función if o int, ya que el compilador lo entendería
como un error.
Tipos de Datos Elementales y Entrada/Salida de
Datos
Constantes
Mantienen su valor a lo largo de todo el programa

Tipos de constantes
Constantes numéricas
Son valores numéricos, enteros o de punto flotante. Se permiten también constantesoctales y
hexadecimales. Ejemplos

● 23484 Constante de tipo int

● 011 Constante octal (9 en base 10)

● 1.23 Constante de tipo double

Constantes carácter
Cualquier carácter individual encerrado entre comillas simples. Ejemplos

● ‘a’

● ‘Y’

● ‘+’

● ‘7’

Cadenas de caracteres
Un conjunto de caracteres alfanuméricos encerrados entre comillas dobles. Ejemplo

“Teoría y Aplicaciones de la Informática 1”

Constantes simbólicas
Poseen un identificador y se definen mediante la palabra reservada CONST

Ejemplo

const int i = 10;

Las constantes también se pueden definir usando la directiva #define


Formato

#define <identificador> <valor

Ejemplos

#define PI 3.1416

#define NCOLS 20

El pre-procesador de C sustituirá la ocurrencia de PI por el valor 3.1416 en


todo el programa antes de efectuar la compilación. Del mismo modo sustituirá

las ocurrencias de NCOLS por 20.

Tipos de Datos

Calificadores de Tipo
Modifican el rango de valores de un determinado tipo

Signed
La variable lleva signo

Tamaño Rango de
valores

signed char 1 byte -128 a 127

signed int 2 bytes -32768 a


32767

Unsigned
La variable no lleva signo

Tamaño Rango de
valores

unsigned char 1 byte 0 a 255

unsigned int 2 bytes 0 a 65535

Short
Rango de valores en formato corto
Tamaño Rango de
valores

short char 1 byte -128 a 127

short int 2 bytes -32768 a 32767

Long
Rango de valores en formato largo

Tamaño Rango de valores

long int 4 bytes -2.147.483.648 a


2.147.483.647

long 10 bytes -3.4 E-4932 a 3.4 E+4932


double

Variables
Una variable representa una posición de memoria referenciada por un identificador. El valor
de una variable puede cambiar durante la ejecución del programa

Declaración e Inicialización

Toda variable debe ser declarada antes de ser utilizada.

Formato

<tipo> <identificador> = valor;

<tipo> <identificador1>, <identificador2>, <identificador3>;

Variables - ¿Dónde se declaran?


Pueden ser declaradas al inicio del programa, fuera de toda función

Variables Globales

Estas variables globales pueden ser utilizadas en cualquier parte del programa y viven durante
toda la ejecución del mismo

Pueden ser declaradas dentro de una función

Variables Locales

Sólo pueden ser utilizadas por la función que la declara

Se crean cuando se llama a la función y se destruyen cuando ésta finaliza

int a; /* variable global */

main () {

int b = 4; /* variable local */


}

Duración y Visibilidad
Se refiere al modo de almacenamiento, el cual determina cuándo se crea una variable, cuándo
deja de existir y desde dónde se puede acceder a ella

Las variables locales: Sólo son visibles en el bloque donde están declaradas, se crean cuando
comienza a ejecutarse el bloque y se destruyen cuando éste finaliza su ejecución.

Las variables globales: Son visibles por todas las funciones que están entre la definición y el fin
del fichero. Existen durante toda la ejecución del programa.

Conversiones
Casting (Conversión Explícita): Mecanismo usado para cambios de tipo

int a;

float b;

char c;

b = 65.0;

a = (int)b; /*a vale 65 */

c = (char)a; /* c vale 65 (Código ASCII de ‘A’) */

Conversión Implícita: Ocurre cuando en una expresión se combinan variables de diferentes


tipos

int a;

float b;

long double > double > float > unsigned long > long > unsigned int > int > char

int x;

double i = 2.5, j = 5.3;

x = ((i * j) – j) + 1;

Salida de Datos
printf()
Formato:

printf ( “cadena de formato”, arg1, arg2, ... argN);

En la cadena de formato aparecen: el texto que se desea imprimir, caracteres especiales 


secuencias de escape (como por ejemplo \n)
Indicaciones del formato de los argumentos

Para usar printf hay que escribir al principio del programa la directiva

#include <stdio.h>

Función printf( ): Caracteres de Conversión

%d Entero decimal

%c Carácter simple

%s Cadena de caracteres

%f Coma flotante (decimal)

%e Coma flotante (notación exponencial)

%g Usa el %f o el %e más corto

%lf Tipo double

%u Entero decimal sin signo

%o Entero octal sin signo

%x Entero hexadecimal sin signo

Entrada de datos
scanf()
Formato:

int scanf (“cadena de formato”, &arg1, &arg2, ... );

En cadena de formato se especifica qué tipo de datos se quieren leer. Se utiliza la misma
descripción de formato que en printf. scanf retorna un entero que representa la cantidad de
conversiones que:

1) hicieron match con alguna entrada

2) se convirtieron sin error

3) se asignaron sin error

Para usar scanf, hay que escribir al principio del programa la directiva:

#include <stdio.h>

Función scanf( ): Caracteres de Conversión

%d Entero decimal

%c Carácter simple

%s Cadena de caracteres
%f Coma flotante

%lf Coma flotante en tipo double

%e Coma flotante

%ld Entero largo

%u Entero decimal sin signo

%o Entero octal sin signo

%x Entero hexadecimal sin signo

%h Entero corto

Operadores
Son signos especiales que asocian variables y/o constantes para realizar una determinada
operación

● Operadores aritméticos (+, -, *, /, %)

● Operadores de asignación (=, +=, -=, *=, /=)

● Operadores relacionales (==, <, >,<=, >=, !=)

● Operadores lógicos (&&, ||, !)

Ejemplo de uso de operadores

espacio = espacio_inicial + 0.5 * aceleración * tiempo;

Operadores Aritméticos
En C se utilizan cinco operadores aritméticos:

● Suma: +

● Resta: -

● Multiplicación: *

● División: /

● Resto: %

● Incremento: ++
● Decremento: --

● Cambio de signo: -

Operadores de Asignación
Asignan a una variable -depositan en la zona de memoria correspondiente a dicha variable- el
resultado de una expresión o el valor de otra variable

El operador de asignación es:

nombre_variable = expresión;

a + b = c; // Esta asignación es incorrecta

= Asignación simple

+= Asignación y suma

-= Asignación y resta

*= Asignación y multiplicación

/= Asignación y división

% Asignación y resto (módulo)


=

Operadores Relacionales
Permiten estudiar si se cumplen una o más condiciones

> Mayor que

< Menor que

>= Mayor o igual que

<= Menor o igual que

== Igual que

!= Distinto que

Ejemplos:

(2 == 1) // resultado = 0 porque la condición no se cumple


(3 <= 3) // resultado = 1 porque la condición se cumple

(3 < 3) // resultado = 0 porque la condición no se cumple

(1 != 1)// resultado = 0 porque la condición no se cumple 32

Operadores Lógicos
Permiten combinar los resultados de los operadores relacionales, comprobando que se
cumplen simultáneamente varias condiciones

&& AND

|| OR

! NOT

Jerarquía de Operadores
() Mayor precedencia

++ --

*/%

+- Menor precedencia

Precedencia Asociatividad
()[] izda a dcha

! +(unario) -(unario) dcha a izda

++ -- (Pre- incremento y decremento) dcha a izda

++ -- (Post- incremento y decremento) izda a dcha

*/% izda a dcha

+- izda a dcha

< <= > >= izda a dcha

== != izda a dcha

&& izda a dcha

|| izda a dcha

= += -= *= /= dcha a izda
Expresiones
Una expresión es una combinación de variables (constantes) y operadores

Una expresión es equivalente al resultado que proporciona el aplicar sus operadores a sus
operandos

Una expresión puede estar formada por otras expresiones más sencillas, y puede contener
paréntesis de varios niveles agrupando distintos términos

Construcciones Condicionales e Iterativas


If
La condición es una expresión. Si el resultado de la expresión es CERO, se considera una
condición FALSA. Si el resultado de la expresión NO ES CERO, se considera una condición
CIERTA.

Sintaxis if: Sintaxis if-else:

if ( condición ) if ( condición )
sentencia 1;
sentencia;
else
sentencia 2;

switch La expresión es, usualmente, una variable entera o


enumerada
Sintaxis:
Las sentenciasA se ejecutarán si expresión
switch ( expresión ){ adquiere el valor1.
case valor1: Las sentenciasB se ejecutarán si adquiere el valor2.
... sentenciasA... Las sentenciasC se ejecutarán si adquiere el valor3
o el valor4, indistintamente.
break;
Cualquier otro valor de expresión conduce a la
case valor2: ejecución de las sentenciasD; eso viene indicado
por la palabra reservada default.
... sentenciasB ...
El break causa que el flujo de ejecución salte a la
break; sentencia que sigue a la llave de cierre (}) del
case valor3: switch
Cuando case valorN da verdadero, se ejecutan las
case valor4:
sentenciasN, y posteriormente ya no se evalúan los
... sentenciasC ... demás case valorN+1, por lo que si las sentenciasN
no terminan con break; las sentenciasN+1 también
break;
se ejecutarán, y así sucesivamente
default:

... sentenciasD ...

}
While
La condición es una expresión.

Mientras el resultado de la condición sea distinto a CERO (condición verdadera), se mantiene


en el ciclo.

Cuando el resultado de la condición sea CERO (condición falsa), el ciclo termina.

Sintaxis:

while( condición ) {

sentencia;

do ... while
La condición es una expresión.

Mientras el resultado de la condición sea distinto a CERO (condición verdadera), se mantiene


en el ciclo.

Cuando el resultado de la condición sea CERO (condición falsa), el ciclo termina.

El bloque se ejecuta al menos una vez.

Sintaxis:

do {

sentencia;

} while (condición )

For
Sintaxis:

for ( expresión_inicial; condición; expresión_de_paso ) {

sentencia;

}
Enumeraciones, Arreglos y Registros
Enumeraciones
Consisten en tipos de datos definidos por el programador.

Permite definir un conjunto de identificadores agrupados por una idea en común.

Cada identificador está asociado a una constante numérica.

Definición:

enum nombre_de_tipo {

lista_de_identificadores

};

Opcionalmente, cualquiera de los identificadores puede recibir un valor inicial

entero. En caso de que no se especifique dicho valor, los identificadores toman

valores enteros partiendo de cero.

Una vez hecha una definición como esta, se pueden emplear variables del tipo

de esta enumeración; estas variables se declaran en la forma:

enum nombre_de_tipo var_1, var_2,..., var_n;

Arreglos
Un arreglo es un identificador que referencia un conjunto de datos del mismo tipo

En C los arreglos comienzan por la posición 0

El acceso es directo, a través de un índice, que representa un valor entero y positivo

Arreglos Unidimensionales
También conocido como Vectores
Sólo utiliza un índice para referenciar cada uno de los elementos

Su declaración se realiza así:

tipo nombre [tamaño];

Un vector puede inicializarse al momento de su declaración: (Esto significa que podemos


rellenarla con los datos)

tipo nombre [n] = {valor1, valor2, ..., valorn};

tipo nombre [ ] = { valor1, valor2, ... }

Cadenas
Una cadena se define como un arreglo unidimensional de caracteres, con un carácter de
terminación nulo ‘\0’

Ejemplos

char cadena[5]="hola";

char cadena[5]={'h','o','l','a','\0'};

char cadena[]="hola";

Lectura de cadenas desde el teclado con fgets

fgets lee un máximo de N-1 caracteres, o hasta encontrar un carácter de nueva línea (el Enter
con el que se finaliza la entrada de datos), lo que ocurra primero

#define N 80

...

char cadena[N];

printf(“Introduzca una cadena: \n”);

fgets(cadena, N, stdin);

Inconvenientes al leer cadenas de caracteres con scanf y con gets

Desbordamientos

Si el usuario escribe más caracteres de los que caben en la cadena destino, igual todos son
leídos y asignados, sobre- escribiendo posiciones de memoria que pueden tener datos
relevantes

scanf no acepta cadenas con espacios

La biblioteca estándar de C suministra funciones para el

manejo de cadenas. Entre las más importantes están:


strcpy(), strcat(), strcmp() y strlen()

strcmp
strcmp(cad1, cad2);

Compara la cadena cad1 con cad2.

Devuelve un valor negativo si cad1 es menor que cad2

Devuelve un valor positivo si cad1 es mayor que cad2

Devuelve cero si cad1 es igual a cad2

strcpy
strcpy (destino, origen);

Copia la cadena origen en destino.

Ejemplo:

char str[20];

strcpy(str, “hola”);

printf(“%s”, str);

strcat
strcat(uno, dos);

Concatena la cadena dos a uno.

Ejemplo:

char str[20];

strcpy(str, “Buenos”);

strcat(str, “Dias”);

printf(“%s”, str);

strlen
strlen(str);

Devuelve la longitud en caracteres de la cadena str

Ejemplo:

char cadena[] = “programador”;

int longi = strlen(cadena);

printf(“%d”, longi);
Arreglos Multidimensionales
Matrices

Representan un arreglo de dos o más dimensiones. Su declaración se realiza así:

tipo nombre [tamaño 1][tamaño 2] ... ;

Una matriz bidimensional, se podría representar gráficamente como una tabla con filas y
columnas

Matrices

Una matriz también puede ser inicializada al momento de su declaración (Rellenarla de


números)

int numeros[4][3] = {{1,2,3}, {4,5,6}, {7,8,9}, {10,11,12}};

int numeros[4][3]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};

numeros[0][0]=1 numeros[0][1]=2 numeros[0][2]=3

numeros[1][0]=4 numeros[1][1]=5 numeros[1][2]=6

numeros[2][0]=7 numeros[2][1]=8 numeros[2][2]=9

numeros[3][0]=10 numeros[3][1]=11 numeros[3][2]=12

También se pueden inicializar cadenas de texto:

char dias[7][10] = { "lunes", "martes", ..., “domingo" };

Para referenciar cada palabra basta con el primer índice (en una matriz de 2 dimensiones):

printf("%s", dias[i]);

C permite crear una tabla de cadenas bidimensional

char nombres[10][40];

fgets(nombres[2], 40, stdin); /*Para leer una cadena*/

printf(“%s”,nombres[4]); /*Para mostrar una cadena*/


Registros o Estructuras
Una estructura o registro es un conjunto de variables que pueden ser de tipos diferentes,
agrupadas bajo un mismo nombre.

La declaración de una estructura se hace de la siguiente manera:

struct nombre_tipo_estructura {

tipo1 dato1;

tipo2 dato2;

...

tipoN datoN;

};

Una vez definida la estructura, podemos usarla declarando una variable con esa estructura:
struct nombre_tipo_estructura nombre_variable;

Para acceder a los campos de la estructura, lo haremos de la manera siguiente:

nombre_variable.dato1;

MODULARIZACIÓN – FUNCIONES Y
PROCEDIMIENTOS
MODULARIZACIÓN
Una forma natural de atacar problemas grandes es dividirlo en sub-problemas que se puedan
resolver de forma "independiente" y luego combinarse.

En programación, esta técnica se refleja en el uso de sub-programas: conjunto de


instrucciones que realizan una tarea específica.

En C los sub-programas se denominan funciones.

Una función recibe valores de entrada (parámetros) y proporciona un valor de salida (valor de
retorno). La función se llama o invoca cuando deseamos aplicarla.

La utilización de subprogramas permite:

● Reducir la complejidad del programa (“divide y vencerás”).

● Eliminar código duplicado.

● Limitar los efectos de los cambios (aislar aspectos concretos).

● Ocultar detalles de implementación (p.ej. algoritmos complejos).

● Promover la reutilización de código

● Mejorar la legibilidad del código.


● Facilitar la portabilidad del código.

FUNCIONES
Desde el punto de vista matemático, una función es una operación que a partir de uno o más
valores (argumentos), produce un valor denominado resultado o valor de la función.

Ejemplo: F(x) = x / (1+x2)

F es el nombre de la función y x es el argumento. Para evaluar F se necesita darle valor a x.

Si x = 3, entonces F(3) = 3 / (1+32) = 0.3

Una función puede tener varios argumentos, aunque el resultado o valor de la función es
único.

Definición de la función
Describe el funcionamiento interno de la misma, es decir, el algoritmo que se aplica para
calcular el valor que se debe devolver.

Se distinguen dos partes en la definición

La cabecera de la función: que es idéntica al prototipo (sin el punto y coma final)

El cuerpo de la función: serie de declaraciones y sentencias que deben encerrarse entre llaves
(estructura similar al cuerpo del programa principal)

Ejemplos de definiciones de funciones

double promedio(double v1, double v2){

return((v1+v2)/2.0);

int esNroPar(int nro){

if(nro%2 == 0) return(1);

else return(0);

int esMayor(int a, int b){

return(a > b);

}
FUNCIONES PREDEFINIDAS
Los lenguajes proveen una serie de funciones predefinidas que facilitan la tarea al
programador. Por ejemplo, las incluidas en las librerías stdio.h, string.h, math.h

Para utilizarlas, debemos escribir nombre_de_la_función(argumentos)

Ejemplos:

scanf(“%d”, &numero)

printf(“%d”, numero)

fgets(frase, 80, stdin)

strcpy(cadena, “hola”)

DECLARACIÓN DE FUNCIONES
Declaración o Prototipo de la función

<tipo> nombre_func (<lista de parámetros>);

<tipo>: especifica el tipo del valor que devuelve la función (el tipo que tendrá el resultado)

Por defecto, se devuelve int

Las funciones no pueden retornar arrays nombre_func: el nombre de la función

<lista de parámetros> lista que indica cuántos argumentos y de qué tipo se necesitan para
utilizar la función. El nombre del parámetro es opcional.

La declaración de la función termina con un punto y coma.

Un prototipo permite al compilador validar la cantidad de parámetros y la correspondencia de


tipos en los argumentos

Ejemplos de prototipos

● double promedio(double v1, double v2);

● int esNroPar(int nro);

● double sqrt(double x);

● char toupper(char c);

● int esMayor(int a, int b);

● int aprobado(int notaPromedio);


PARÁMETROS FORMALES Y PARÁMETROS
ACTUALES
Qué ocurre cuando hacemos:

precio = precioFinal(5.0, 8 );

double precioFinal(double costoUnidad, int cantItems)

double subTotal;

subTotal = costoUnitario * cantItems;

return(subTotal + subTotal*IVA);

Se copia el valor de los argumentos o parámetros actuales en los parámetros formales.

Se transfiere el flujo de ejecución a la función invocada.

Cuando la función termina su ejecución, devuelve el control al programa principal, que


continuará en la línea siguiente a la invocación.

FUNCIONES QUE NO RETORNAN NINGÚN VALOR


Llamadas también "Procedimientos"

En la declaración se indica:

void nombre_func(<lista de parámetros>);

Útiles para mostrar información

Ejemplos

void limpiarPantalla();

void mostrarValores(int v1, int v2);

REGLAS DE ALCANCE
El buen uso de la programación modular requiere que los módulos (funciones) sean
independientes.

Esto se consigue intentando satisfacer dos condiciones:

Cada módulo se diseña sin conocimiento del diseño de otros módulos


La ejecución de un subprograma particular no tiene por qué afectar a los valores de las
variables de otros subprogramas.

Dado que se permite el anidamiento en la llamada a funciones, es necesario establecer


mecanismos para evitar problemas con los identificadores definidos en varias partes del
código.

Conceptos de variables locales y globales

VARIABLES LOCALES
Son aquellas que se declaran en el cuerpo de la función. Solo son "visibles" o "usables" dentro
de la función donde se han declarado.

Dos funciones diferentes, pueden utilizar los mismos nombres de variables sin "interferencias"
ya que se refieren a posiciones diferentes de memoria.

void main () {

int k = 3;

printf(“%d”, cuadrado(k));

printf(“%d”,k);

Otro tambien podria ser:

int cuadrado(int n) {

int k;

k = n*n;

return(k);

En el main, la variable k sigue valiendo 3 después de llamar a cuadrado(k)

RECOMENDACIONES PARA LA DEFINICIÓN DE


FUNCIONES
Escriba funciones como si fueran "cajas negras": el usuario debe saber QUÉ hace la función y
no CÓMO lo hace.

La declaración de la función y un comentario adecuado deben ser suficientes para saber cómo
usarla.

Todas las variables utilizadas en el cuerpo de la función deben estar definidas en el cuerpo de
la función.
GENERACIÓN DE NÚMEROS ALEATORIOS
Para generar números aleatorios se usan las funciones rand y srand

Se debe incluir <sdtlib.h>


Función rand
Prototipo

int rand();

Devuelve un número entero aleatorio entre 0 y RAND_MAX (RAND_MAX es una constante


definida en C)

Para acotar el rango

Entre 0 y 10

int n = rand() % 11;

Entre 0 y N

int n = rand() % (N+1);

Entre LIMINF y LIMSUP (límite inferior y límite superior)

int n = rand() % (LIMSUP-LIMINF+1) + LIMINF

Función srand
Supongamos que tenemos un programa que genera 3 número aleatorios entre 0 y 10

● Al ejecutarlo la primera vez se generan, por ejemplo, 4, 9, 3

● Al ejecutarlo la segunda vez se generan: 4, 9, 3

● ....

● Al ejecutarlo la N vez se genera: 4, 9, 3

Por defecto, rand calcula los números aleatorios partiendo siempre de una misma semilla
(número inicial). Para generar el segundo número se toma como semilla al primer número
generado, para generar el tercer número se toma como semilla el segundo número, y así
sucesivamente

El problema se arregla inicializando un número semilla antes de la primera ejecución de rand


Para esto se usa la función srand

Uso: srand (time(NULL)); (si time no se reconoce, incluir time.h)

En el ejemplo, srand toma la hora actual y a partir de eso genera un número semilla para rand

En la ejecución de un programa, basta con llamar una vez a srand

PASO DE PARÁMETROS A FUNCIONES


El paso de parámetros a las funciones o procedimientos se puede hacer

⮚ Por valor

⮚ Por referencia

Es el mecanismo que hemos visto hasta ahora. El valor de los argumentos se copia en los
parámetros formales.

Los cambios hechos en los parámetros de la función no tienen efecto sobre las variables que se
utilizan en la llamada.

Los argumentos que se "pasan" por valor, también reciben el nombre de parámetros de
entrada.

Los parámetros formales funcionan como variables locales.

Los argumentos pueden ser variables o valores literales

Ejemplos: cuadrado (4), cuadrado(n) C utiliza por defecto la llamada por valor para pasar
argumentos
PASO DE PARÁMETROS POR REFERENCIA
Un parámetro por referencia sirve para que la función comunique valores calculados al
programa que la invocó.

También se denominan parámetros de salida o entrada/ salida

El valor de un parámetro por referencia puede ser leído y modificado dentro de la función y
ésta modificación queda reflejada en el parámetro actual cuando acaba la función.

Para usar parámetros por referencia el identificador del parámetro formal debe estar
precedido por el símbolo clave &

El parámetro actual debe ser una variable, no una expresión

Ejemplos no válidos: cuadrado(4), cuadrado(n+1)

Ejemplo válido: cuadrado(&n)


BASES DE DATOS
Datos vs. Información
Datos
Hechos en bruto; aún no se han procesado para revelar su significado.

Ejemplos:

La fecha de emisión de una factura.

El monto total de una factura.

Información
Datos procesados.

Ejemplo:
Una tabla/grafico que muestra el total de ventas de una empresa, en un año específico, por
mes.

Administración de datos
Los datos constituyen los bloques de construcción de la información.

La información revela el significado de los datos.

La información adecuada, pertinente y oportuna es la clave para una buena toma de


decisiones.

Los datos deben generarse apropiadamente y deben guardarse adecuadamente en un formato


que sea fácil de acceder y de procesar.

El ambiente donde están almacenados los datos debe manejarse con cuidado.

La administración de datos es la disciplina enfocada a la generación, almacenamiento y


recuperación apropiadas de datos.

La administración de datos eficiente requiere el uso de una base de datos computarizada.

Sistemas de archivos
Los sistemas de archivos preceden a las bases de datos como medios de almacenamiento de
datos en disco.

Los archivos utilizados por una aplicación para almacenar sus datos se diseñaban
específicamente para esa aplicación.

Eficiencia inicial: la estructura de los datos en el archivo está pensada para el programa que lo
va a utilizar.

A la larga, surgen inconvenientes:

Al crear programas nuevos que necesitan acceder a los datos del sistema de archivos existente,
por motivos de eficiencia puede ser necesario replicar los archivos, pero con una estructura de
datos nueva, más adecuada para el programa nuevo. Esto puede llevar a:

Información duplicada en más de un archivo (redundancia, se utiliza más espacio en disco del
necesario).

Complicaciones en los procesos de actualización de datos, ya que la actualización se debe


realizar en más de un archivo.
Se corre el riesgo de tener datos inconsistentes entre los distintos archivos.

Problemas en aplicaciones que usan sistemas de archivos

Dificultad de mantenimiento
En archivos con información parcialmente duplicada, realizar actualizaciones de datos es un
proceso complejo y costoso.

Se deberán actualizar varios archivos con diferentes organizaciones/estructuras.

Si la actualización no se realiza correctamente, se tendrán datos inconsistentes.

Redundancia
Hay redundancia cuando hay datos que no aportan información. Su valor se puede deducir del
de otros datos.

Caso trivial: se incluye más de una vez un mismo dato. Esto no sueleocurrir en un archivo, pero
sí en un sistema de archivos.

Rigidez de búsqueda
La estructura de los datos en un archivo se concibe para que un programa acceda a los datos
de un modo determinado.

El programa debe conocer el orden en que aparecen los datos y accede a ellos
secuencialmente.

Dependencia con los programas


El programa que trabaja con un archivo debe conocer las relaciones entre los datos del
archivo.

Cada vez que hace una lectura, el programa recibe una cadena de caracteres. La información
de dónde comienza y termina cada dato, su tipo, etc., está controlada y es inherente al
programa.

Al hacer una modificación de la estructura de un archivo, se deberán modificar todos los


programas que lo utilicen. Incluso, si por ejemplo, se aumenta la longitud de un campo, habrá
que modificar incluso los programas que no usan ese campo.

Confidencialidad y seguridad
Al trabajar con un sistema de archivos, el programa se deberá encargar de:

Impedir la consulta de determinados usuarios a determinados datos


Impedir modificaciones provocadas por usuarios no autorizados.

Sin embargo, no se podrá impedir que alguien construya un programa para modificar o ver el
contenido de un archivo, si el sistema operativo le permite el acceso.

Bases de datos
Las bases de datos surgieron como alternativa a los sistemas de archivos, intentando eliminar,
o al menos, reducir sus inconvenientes.

Una base de datos es un sistema formado por un conjunto de datos y un paquete software
para la gestión de dicho conjunto de datos de tal modo que:

● Se controla el almacenamiento de datos redundantes

● Los datos resultan independientes de los programas que los usan

● Se almacenan las relaciones entre los datos

● Se puede acceder a los datos de diversas formas (no sólo secuencialmente)

Requisitos que debe cumplir


Acceso múltiple
Diversos usuarios acceden simultáneamente a la base de datos

Utilización múltiple
Cada usuario puede tener una imagen o visión particular de la estructura de la base de datos

Flexibilidad
Distintos métodos de acceso, tiempos de respuesta cortos

Confidencialidad y seguridad
Se controla el acceso a los datos, impidiéndoselo a usuarios no autorizados

Protección contra fallos


Deben existir mecanismos de recuperación en caso de fallos del computador

Independencia física
Se puede cambiar el soporte físico de la base de datos (modelo de discos, por ejemplo), sin
que esto repercuta en la base de datos ni en los programas que la usan
Independencia lógica
Se pueden modificar los datos contenidos en la base de datos, las relaciones existentes entre
ellos, o incluir nuevos datos, sin afectar a los programas que los usan

Redundancia controlada
Los datos se almacenan una sola vez

Interfaz de alto nivel


Existe una forma sencilla y cómoda de utilizar la base de datos desde un lenguaje de
programación de alto nivel

Interrogación directa (query)


Existe una utilidad que permite el acceso a los datos de forma conversacional

Estructura general de una base de datos


En una base de datos se almacena información de una serie de objetos o elementos.

Estos objetos reciben el nombre de entidades. En una base de datos de una empresa se
pueden tener las siguientes entidades: cliente, producto, vendedor, etc.

De cada entidad se almacenan una serie de datos que se denominan atributos de la entidad.

Atributos de la entidad alumno: CI, nombres, apellidos, sexo, fecha de nacimiento,


nacionalidad, etc.

Entidades y atributos son conceptos abstractos. La información de cada entidad se almacena


en registros, y cada atributo en campos de dicho registro.

Un identificador es un conjunto de atributos de una entidad que determina de forma unívoca


cada uno de los elementos de dicha entidad

En una base de datos se almacenan, además de las entidades, las relaciones existentes entre
ellas.

Ejemplo:

En la base de datos académica se tienen relaciones entre las siguientes entidades:

Cursos y alumnos

Alumnos y profesores

Profesores y asignaturas

Tipos de relaciones
Uno a uno (1 a 1)
Ejemplo: un alumno tiene un expediente académico y un expediente académico corresponde a
un alumno.

Uno a muchos (1 a N)double promedio(double v1, double v2){


return((v1+v2)/2.0);
}

Ejemplo: un alumno tiene muchos libros, y cada uno de esos libros tiene un único dueño.

Muchos a muchos (N a M)
Ejemplo: un profesor es profesor de muchos alumnos y cada uno de esos alumnos es alumno
de varios profesores.

Representación de relaciones

El esquema de una base de datos define su estructura lógica: especifica los registros con sus
campos y las relaciones entre ellos.

El esquema puede representarse de forma gráfica o textual.

Un subesquema describe la estructura lógica de una parte de la base de datos que va a ser
usada por uno o más programas.

Está contenido en el esquema.

Los nombres de campos, registros y relaciones pueden ser distintos en el esquema y


subesquema.

El subesquema:

● Aísla los programas de la estructura lógica de la base de datos

● Permite que varios usuarios utilicen distintas estructuras de una misma base de datos

● Limita el acceso a distintas partes de la base de datos


Tipos de bases de datos
Las bases de datos se clasifican tradicionalmente en tres grupos, en cuanto a su modelo de
administración de datos:

● Jerárquicas

● En red

● Relacionales

Categoría más reciente

● Bases de datos orientadas a objetos

Bases de datos jerárquicas


Sólo admite estructuras jerárquicas, es decir, en forma de árbol (cada registro tiene sólo un
padre, pero puede tener varios hijos).

Es posible definir relaciones uno a uno y uno a muchos.

No es posible definir relaciones muchos a muchos.

Hoy en día están obsoletas.

Bases de datos en red


Admite estructuras en forma de grafo (cada registro puede tener varios padres y varios hijos)
Hoy en día están obsoletas.

Bases de datos en red simples: No permiten utilizar, directamente, relaciones muchos a


muchos.

Una relación muchos a muchos se puede representar, indirectamente, de la siguiente manera:


Se sustituye la relación muchos a muchos por dos relaciones uno a muchos usando un registro
auxiliar.

Bases de datos en red complejas

Sí permiten utilizar, directamente, relaciones muchos a muchos.

Bases de datos relacionales


Surgieron como alternativa a las bases de datos jerárquicas y en red, con el objetivo de
proveer más flexibilidad y más rigor en el tratamiento de los datos.

Están formadas por tablas. Una tabla es una estructura bidimensional formada por una
sucesión de registros del mismo tipo.

Las tablas deben cumplir las siguientes condiciones:

● Todos los registros de una tabla son del mismo tipo. Para almacenar registros de tipos
distintos se usan tablas distintas.
● En ninguna tabla aparecen campos repetidos.
● En ninguna tabla existen registros duplicados.

● El orden de los registros en la tabla es indiferente. En cada momento se pueden


recuperar los registros en un orden particular.

Bases de datos orientado a objetos


os y recuperación tras fallos del sistema.
Las tres primeras funciones se realizan mediante dos lenguajes específicos:

Lenguaje de manipulación de datos (o DML, del inglés Data Manipulation Language): se utiliza
para el acceso a la base de datos desde lenguajes de alto nivel o en modo conversacional.

Lenguaje de descripción de datos (o DDL, del inglés Data Description Language): utilizado para
la descripción del esquema y de los subesquemas.

El DBMS actúa como intermediario entre los programas de aplicación y el sistema operativo,
esto permite que los programas sean independientes de la estructura física de los datos.

Sistemas de gestión de bases de datos relacionales


El DDL de una base de datos relacional debe permitir:

Definir cada una de las tablas de una base de datos relacional.

La descripción de una tabla consta de:


● Nombre de la tabla

● Descripción de los campos de que consta cada registro de la tabla.

● Nombre de los campos que se usan como identificadores.

Realizar operaciones con las tablas.

Ejemplos de operaciones:

● La proyección de una tabla es otra tabla que contiene los mismos registros que la tabla de
partida y sólo determinadas columnas. Al proyectar una tabla se especifican las columnas
que se desean obtener.
● Una selección en una tabla produce como resultado otra tabla que contiene los registros
que cumplen una determinada condición. La condición se expresa en función de los
valores de los campos. La tabla creada contiene todas las columnas de la tabla original.
● La composición o unión es una operación que se realiza con dos tablas para producir una
nueva. La unión se realiza en base al valor de algún campo. Para cada par de registros de
las tablas a componer, que tengan el mismo valor en dicho campo, se añade un registro en
la tabla de salida. La tabla de salida contiene los campos que se encuentran en alguna de
las tablas de entrada.

El DML de una base de datos relacional deberá contener al menos sentencias equivalentes a
las siguientes:

● Append: añade un registro a una tabla.

● Edit: modifica un registro de una tabla.

● Delete: borra un registro de una tabla.

● Display: proyecta una tabla.

● Display for: selecciona registros en una tabla.

● Join: une dos tablas.

MODELO ENTIDAD RELACIÓN


Diseño de bases de datos
Un buen diseño es la clave para iniciar con buen pie el desarrollo de una aplicación basada en
una base de datos o la implementación de un sistema.

Es sencillo diseñar una base de datos, pero a menudo hay que reconsiderar posteriormente la
estructura de los datos, lo cual ocasiona retrasos y modificaciones. Es más lenta la obtención
de un diseño lo más óptimo posible, pero el tiempo invertido se recupera al no tener que
volver atrás para replantearse el diseño de los datos.
Un diseño apresurado o simplemente bosquejado puede mostrarse inservible o muy
mejorable cuando la aplicación ya está parcialmente codificada, o el administrador de la base
de datos ya tiene organizados el mantenimiento y el control de acceso a los datos.

Esquema e instancia
Esquema

● Diseño general de la base de datos a nivel lógico.

● Incluye el tipo de datos y las relaciones entre ellos.

● Es de naturaleza fija y solo se altera excepcionalmente.

● El esquema se define y se mantiene utilizando el lenguaje de definición de datos (DDL).

Instancia

● Contenido concreto de la base de datos en un momento dado.

● Varía con el tiempo, al añadir, eliminar o modificar datos, utilizando el lenguaje de


modificación de datos (DML).

A un mismo esquema, pueden corresponderle múltiples instancias de base de datos

Niveles de diseño de bases de datos


El diseño de una base de datos se realiza a dos niveles:

Nivel conceptual

Se contempla una estructura abstracta y no implementable directamente con un DBMS

Nivel físico

En el cual la base de datos es ya implementable.

Fases del diseño de base de datos


1. Descripción en lenguaje natural.
2. Diagrama Entidad-Relación (E-R), también conocido como "diagrama de Chen". Estos
diagramas modelan el problema mediante entidades asociadas por relaciones. Adoptan la
forma de grafos donde los datos se relacionan mediante flechas. El diagrama E-R no
depende del modelo de datos.
3. Elección del modelo de datos (usualmente el relacional).
4. Conversión del diagrama E-R al modelo relacional (tablas).
5. Normalización (eliminar diversos defectos de diseño).
6. Optimización (según criterios de almacenamiento interno, como el espacio en disco y el
tiempo medio de acceso).

Los pasos 1, 2 y 3 corresponden al nivel conceptual


Los pasos 4, 5, y 6 corresponden al nivel físico

Modelos de datos
Estructura general de los datos y técnicas de acceso proporcionadas por un DBMS.

Un SGBD usa siempre un único modelo de datos.

Hay tres modelos de datos posibles:

Jerárquico
● Estructura de árbol

● Está obsoleto.

● De red

Estructura de grafos
Fue el primero utilizado comercialmente. Está obsoleto.

Relacional
● Estructura de tablas

● Es uno de los modelos más empleados hasta hoy en día.

● Es sencillo y cercano a la forma humana de organizar la información.

El modelo Entidad-Relación
El modelo Entidad-Relación fue propuesto por Peter Chen a mediados de los años setenta
como medio de representación conceptual de los problemas y para representar la visión de un
sistema de forma global.

Un diseñador de base de datos diseña una base de datos usando un modelo Entidad-Relación.
Al hacer esto trabaja a nivel conceptual. Por lo tanto, un modelo Entidad-Relación se puede
implementar luego en diferentes DBMS.

Un diagrama Entidad-Relación adopta la forma de un grafo escrito en papel (o en un editor sw)


al que se denomina diagrama Entidad- Relación.

Elementos fundamentales:

Entidades

Relaciones
Entidad
Entidades son los objetos que aparecen en la vida real.

Ejemplos: alumno, empleado, avión, coche, alojamiento, ...

Al convertir un modelo ER a un modelo relacional (fase 4 del diseño de una base de datos), una
entidad da lugar a una tabla de la base de datos.

Atributo
Las entidades están compuestas por atributos, que representan sus propiedades.

Ejemplo: a entidad alumno, tendrá los atributos nombre, CI, nacionalidad, fecha de
nacimiento, ...

Los atributos del modelo ER se convertirán a columnas (campos) de una tabla en una base de
datos relacional.

Elemento
Cada entidad tendrá un número ilimitado de elementos.

Ejemplo: un elemento de la entidad alumno será un alumno en sí; así el alumno Pepe será un
elemento, José será otro, ...

Cada elemento sería una fila o registro de una base de datos relacional.

Identificador o clave primaria


Dada una entidad, uno o varios de sus atributos se utilizarán para identificar de manera única a
un elemento de los demás.

Este atributo o conjunto de atributos es el que denominamos identificador o clave primaria.

A menudo es un código creado expresamente para tal fin.

Tablas
Combinando los conceptos de entidad, atributos, claves primarias y elementos de un modelo
ER, se puede derivar una estructura del tipo tabla de una base de datos relacional.

Ejemplo: Tabla Alumno

Nombre DNI Nacionalidad Fecha de nacimiento

Joseph 99.999.999 Irlanda 9/9/1969

Pepe 88.888.888 España 8/8/1968

José 77.777.777 Chile 7/7/1967

Relaciones
Las entidades no están aisladas, sino que están relacionadas entre sí.

Estas relaciones pueden ser de tres tipos diferentes:


● 1a1

● 1 a muchos (1 a N)

● Muchos a muchos (M a N)

Introducción a SQL y MySQL


Sistemas de gestión de bases de datos
✔ Un sistema de gestión de bases de datos (SGBD) es una aplicación que permite
trabajar con bases de datos:
✔ Definir la información

✔ Insertar información

✔ Eliminar información

✔ Consultar la información

✔ Ordenar la información

✔ Filtrar la información

Ejemplos: Oracle, Sybase, Microsoft Access, MySQL

SQL
SQL = lenguaje de consulta estructurado (por sus siglas en inglés, Structured Query Language)

Es un lenguaje declarativo de acceso a bases de datos relacionales que permite especificar


diversos tipos de operaciones en ellas.

Una de sus características es el manejo del álgebra y el cálculo relacional que permiten
efectuar consultas con el fin de recuperar de forma sencilla información de interés de bases de
datos, así como hacer cambios en ellas.

Componentes
El lenguaje SQL está compuesto por:

● Comandos

● Cláusulas

● Operadores
● Funciones de agregación

Estos elementos se combinan en las instrucciones para crear, actualizar y manipular las bases
de datos

Comandos
Existen dos tipos de comandos SQL:

● Los DDL, que permiten crear y definir nuevas bases de datos, tablas, campos e índices.

● Los DML, que permiten insertar, modificar o eliminar datos, así como también generar
consultas para ordenar, filtrar y extraer datos de la base de datos.

Comandos DDL
Comando Descripción

CREATE Utilizado para crear nuevas bases de datos,


tablas, campos e índices

DROP Empleado para eliminar bases de datos,


tablas e índices

SHOW Permite visualizar las bases de datos activas


o las tablas que forman parte de una base de
datos

USE Utilizado para seleccionar la base de datos


con la cual se desea trabajar

DESCRIBE Permite visualizar todos los campos de una


tabla específica

ALTER Utilizado para modificar las tablas agregando


campos o cambiando la definición de los
campos.

Comandos DML
Comando Descripción

SELECT Utilizado para recuperar registros de la base


de datos

INSERT Utilizado para insertar datos en la base de


datos

UPDATE Utilizado para modificar los valores de los


campos y registros especificados

DELETE Utilizado para eliminar registros de una tabla


de una basede datos
Cláusulas
Las cláusulas son condiciones de modificación

Cláusula Descripción

FROM Utilizada para especificar la tabla de la cual


se van a seleccionar los registros

WHERE Utilizada para especificar las condiciones que


deben reunir los registros que se van a
recuperar

GROUP BY Utilizada para separar los registros


seleccionados en grupos específicos

HAVING Utilizada para expresar la condición que


debe satisfacer cada grupo

ORDER BY Utilizada para ordenar los registros


seleccionados de acuerdo con un orden
específico

Operadores
Operadores lógicos
Operador Uso

AND Es el "y" lógico. Evalúa dos expresiones y


devuelve un valor verdadero sólo si ambas
son ciertas.

OR Es el "o" lógico. Evalúa dos expresiones y


devuelve un valor verdadero si alguna de las
dos es cierta.

NOT Negación lógica. Devuelve el valor contrario


de la expresión.

Operadores de comparación
Operador Uso

< Menor que

> Mayor que

<> Distinto de

<= Menor o igual que

>= Mayor o igual que


= Igual que

BETWEEN Utilizado para especificar un intervalo de


valores.

LIKE Utilizado en la comparación de un modelo

In Utilizado para especificar registros de una


base de datos

Funciones de agregación
Las funciones de agregación se usan dentro de una cláusula SELECT en grupos de registros para
devolver un único valor que se aplica al grupo de registro.

Función Descripción

AVG Utilizada para calcular el promedio de los


valores de un campo determinado

COUNT Utilizada para devolver el número de


registros de la selección

SUM Utilizada para devolver la suma de todos los


valores de un campo determinado

MAX Utilizada para devolver el valor más alto de


un campo especificado

MIN Utilizada para devolver el valor más bajo de


un campo especificado

MySQL
MySQL es un sistema de gestión de bases de datos (SGBD) relacional, multihilo y multiusuario,
con más de seis millones de instalaciones.

Es desarrollado por MySQL AB, subsidiaria de Sun Microsystems desde el 2008, y ésta a su vez
de Oracle Corporation desde el 2009.

Es software libre.

Es utilizada por muchos sitios web grandes y populares como Wikipedia, Google (aunque no
para búsquedas), Facebook, Twitter, Flickr y YouTube.
Tipos de datos
Creación de bases de datos y tablas
mysql> USE zoologico ;
El mensaje indica que la base de datos
ERROR 1049: Unknown database 'zoologico' no ha sido creada, por lo tanto,
necesitamos crearla.
mysql>

mysql> CREATE DATABASE zoologico;

Query OK, 1 row affected (0.00 sec)

mysql> USE zoologico;

Database changed

mysql>

También podría gustarte