Este documento explica conceptos básicos de programación como funciones estándar, entrada y salida de datos, funciones definidas por el usuario, paso de parámetros y punteros. Define funciones como printf() y describe cómo se usan funciones estándar y definidas por el usuario, incluido cómo se pasan parámetros y se devuelven valores. También explica la diferencia entre paso por valor y paso por referencia.
1. INSTITUTO TECNOLOGICO SUPERIOR
DE GUASAVE
ALGORITMOS YLENGUAJE
PROGRAMACION
ASESOR:
CARLOS ALFREDO CERVANTES
ALUMNO:
RUIZ ALVAREZ ARAN ISAAC
ING. INSDUTRIAL 4-4
2. FUNCION ESTANDAR
Se denomina una función estándar de C, es decir, una función que está
incluida con el compilador. Para poder usarla dentro de un programa hay que
decir en el mismo como es su forma: eso se hace incluyendo la línea #include
<stdio.h> al principio. De momento dejaremos esto así y lo explicaremos dentro
de más sobre printf.
Para poder trabajar o llamar a una función estándar hay que conocer que
necesita y qué hace. De la función printf hay que saber:
Su nombre cada vez que se coloca printf en un programa le estamos diciendo
al compilador de C que queremos usar esta función.
Lo que se quiere imprimir, que irá entre los paréntesis
En general, la expresión (números o texto) que va entre los paréntesis de una
función se llaman parámetros de la función. Por ejemplo, si en matemáticas se
quiere calcular el valor de
Fórmula
en MathML: Logaritmo de tres equis al cuadrado
, el parámetro de la función logaritmo sería
Fórmula
en MathML: Tres equis al cuadrado
. En lenguaje C, algunas funciones necesitan que le demos datos para poder
hacer su trabajo y otras no. Por ejemplo, printf necesita el texto que hay que
mostrar por pantalla (el cual se entrecomilla), pero para la función principal
main no es obligatorio.
Qué hace y cómo funciona
3. printf() escribe texto en la pantalla del computador. Los detalles de
funcionamiento aparecen en el manual del compilador que se esté usando. El
manual nos dice, por ejemplo, que si colocamos el código n dentro del
parámetro de printf(), se imprimirá un salto de línea.
Un compilador suele tener decenas de funciones estándar, aunque su número
exacto y los detalles concretos de funcionamiento de las funciones estándar de
C dependen de cada compilador.
Las variables nos permiten almacenar datos. Estos datos pueden ser de
distinto tipo o formato numérico y de distinto tamaño (en bits o bytes). Por
ejemplo, un dato numérico puede almacenarse en una variable de tipo entero o
en otra de coma flotante simple precisión. Recíprocamente, 32 bits (4 bytes) de
la memoria pueden servir para contener un número de coma flotante simple
precisión, o para 4 letras según el convenio ASCII. Es decir, que las variables
fijan una interpretación de los bits de memoria o datos de que disponemos en
el programa.
Las variables pueden ser manipulados usando expresiones de distinto
tipo. Una expresión es un conjunto de operaciones que realizan cálculos con
datos o con los datos contenidos en las variables. Por ejemplo, las expresiones
aritméticas son las más comunes.
2 ENTRADA Y SALIDAD DE DATOS
En un algoritmo, los datos de entrada son los que la computadora va a
procesar. Los datos de salida son datos derivados, es decir, obtenidos a partir
de los datos de entrada. Por esta razón, a los datos de salida se les considera
más significativos que a los datos de entrada. Sin embargo, en un sentido más
filosófico, a los datos de entrada se les considera la materia primade los datos
de salida, considerados estos como la verdadera información.
Entrada
Una instrucción de entrada (o simplemente entrada) consiste en asignar a una
o más variables, uno o más valores recibidos desde el exterior. Normalmente,
4. los datos son recogidos desde la entrada estándar (el teclado), pero, también
existen otros dispositivos de entrada (el ratón, el escáner,...).
En algoritmos la instruccion de entrada es:
leer( <nombre_de_la_variable_1>,
<nombre_de_la_variable_2>,
...,
<nombre_de_la_variable_n> )
También se puede escribir como:
leer( <lista_de_variables> )
Ejemplo : Partiendo de las variables
cadena: nombre, apellidos
entero: edad
para cada una de ellas se puede recoger un valor desde el
teclado, escribiendo:
leer( nombre )
leer( apellidos )
leer( edad )
Otra posibilidad es
leer( nombre, apellidos, edad )
Salida
Una instrucción de salida (o simplemente salida) consiste en llevar hacia el
exterior los valores obtenidos de la evaluación de una lista de expresiones.
Normalmente, los datos son enviados a la salida estándar (la pantalla), pero,
también existen otros dispositivos de salida (la impresora, el plotter,...).
En pseudocodigo, la sintaxis de una instruccion de salida es:
5. escribir( <expresión_1>, ..., <expresión_n> )
También se puede escribir como:
escribir( <lista_de_expresiones> )
Ejemplo: Partiendo de las variables
cadena nombre = "Timoteo"
entero edad = 27, hijos = 2
al escribir
escribir ( nombre, " tiene ", edad, " años." )
Escribir ( nombre, " tiene ", hijos, " hijos." )
FUNCIONES DEFINIDAS POR EL USUARIO.
Definición de Funciones
Las funciones definidas por el programador se escriben “fuera” de la función
main. Si se recuerda, uno de los objetivos del uso de las funciones es la
descomposición de problemas complejos y el trabajo en grupo. El siguiente es
un ejemplo de una definición de una función. Se utiliza antes de presentar la
sintaxis formal de modo que nos podamos familiarizar con la terminología:
double square(double numero)
{
double cuadrado;
cuadrado = numero * numero;
return cuadrado;
}
Esta definición de la función square consiste de:
1) El encabezado de la función double square(double numero)
6. Observe que el encabezado no termina con punto y coma. Las partes del
encabezado de una función son los siguientes.
a) Una lista de los argumentos de la función entre paréntesis:
(double numero)
Si se considera a la función como un programa pequeño, la lista de argumentos
serían equivalentes a los datos que en un programa se introduciría a través de
la instrucción cin. Es importante que observe que en la lista de argumentos se
indican tanto la lista de los argumentos necesarios como el tipo de cada uno de
ellos.
b) El nombre de la función
square
que puede se cualquier identificador válido en C++.
c) El tipo de valor que regresa la función como resultado.
double
2) El cuerpo de la función
{
double cuadrado;
cuadrado = numero * numero;
return cuadrado;
}
El cuerpo de la función se encierra entre llaves y en él se escriben las
sentencias que se necesitan ejecutar para lograr el objetivo de la función.
Contiene al menos una sentencia return. La sentencia return va seguida del
nombre de una variable o de un valor constante.
return cuadrado;
El valor de dicha variable (o el valor de dicha constante) constituye el valor de
regreso de la función. El tipo del valor que regresa la función debe ser
consistente con el tipo del valor de regreso especificado en el encabezado de
la función. Observe que, en este ejemplo, el valor de regreso de la función (tipo
7. de la variable llamada cuadrado) es double, al igual que el tipo de valor de
regreso especificado en el encabezado.
Llamado de Funciones
El llamado de las funciones definidas por el usuario se realiza de la misma
forma que el llamado a funciones predefinidas. Por ejemplo, si un programador
ha definido la función square de este ejemplo, los siguientes serían llamados
válidos a la función:
double x,y,z;
x=2.0;
y = square(10.0);
z = square(x+y);
Observe que los argumentos que se pasan a la función (10.0 en el primer caso
y x+y en el segundo caso) son del tipo double y coinciden con el tipo definido
para el argumento de la función. Asimismo, a la variable y se le asigna el valor
de regreso de la función square(10.0). Esto es correcto porque el valor de
regreso de la función es de tipo double y la variable y también es de tipo
double. Note que no es necesario que los argumentos con que la función es
llamada se nombren igual que los identificadores usados en el encabezado de
la función.
Paso por valor
El paso de parámetros por valor consiste en copiar el contenido de la variable
que queremos pasar en otra dentro del ámbito local de la subrutina, consiste
pues en copiar el contenido de la memoria del argumento que se quiere pasar
a otra dirección de memoria, correspondiente al argumento dentro del ámbito
de dicha subrutina. Se tendrán dos valores duplicados e independientes, con lo
que la modificación de uno no afecta al otro.
Paso por referencia
El paso de parámetros por referencia consiste en proporcionar a la subrutina a
la que se le quiere pasar el argumento la dirección de memoria del dato. En
8. este caso se tiene un único valor referenciado (o apuntado) desde dos puntos
diferentes, el programa principal y la subrutina a la que se le pasa el
argumento, por lo que cualquier acción sobre el parámetro se realiza sobre la
misma posición de memoria.
Puntero
Un puntero o apuntador es una variable que da referencia a una región
de memoria; en otras palabras es una variable cuyo valor es una dirección de
memoria. Si se tiene una variable ' p ' de tipo puntero que contiene una
dirección de memoria en la que se encuentra almacenado un valor ' v ' se dice
que ' p ' apunta a ' v '. El programador utilizará punteros para guardar datos en
memoria en muchas ocasiones, de la forma que se describe a continuación.
Trabajar con punteros no implica la manipulación de los datos en sí, sino
manejar las direcciones de memoria en la cuales estos residenEl ejemplo que
sigue es propio del lenguaje C/C++ y no es de aplicación en otros lenguajes de
programación:
struct Elemento // Ejemplo de un nodo de lista doble enlazada
{
int dato;
struct Elemento *siguiente; // El '*' es el operador de indirección, y es el
usado para declarar punteros
struct Elemento *anterior;
};
Para acceder a los atributos como punteros de una estructura que va a ser
tratada como tal, se debe desreferenciar el puntero y acceder a sus miembros
como se haría con una variable normal, o usar directamente el operador: ->. De
tal modo que:
Elemento *elem;
Elemento sig1 = (*elem).siguiente;
Elemento sig2 = elem->siguiente;
/* Se cumple que: sig1==sig2 */
9. Los paréntesis en este ejemplo son necesarios, pues el operador '*' es el que
menor
prioridad
de
operaciones
tiene
asignada
(por
lo
que
se
haría *(elem.siguiente), lo que es incorrecto, pues trataría acceder a un campo
de una dirección de memoria, y no de una estructura. Esto es un error
sintáctico, en tiempo de compilación).
Otro ejemplo en C++: Se presenta una función que no devuelve ningún valor,
esta función llamada "swap" tiene como parámetros dos punteros del tipo int.
Así, cuando sea llamada desde alguna parte del programa, recibirá las
direcciones de dos variables; luego accederá a dichas variables gracias al
operador de indirección (* precediendo al identificador del puntero) y podrá
intercambiar sus valores residentes.
void swap(int *x, int *y)
{
int temp;
temp = *x; // copia el valor apuntado por x a temp
*x = *y;
// copia el valor apuntado por y en la ubicación del puntero x
*y = temp; // copia el valor de temp en la ubicación apuntada por y
}