Capitulo V: Funciones en C
La modularización, es una técnica usada por los programadores para hacer sus códigos más cortos, ya que consiste en reducir un gran problema complejo, en pequeños problemitas más sencillos, concentrándose en la solución por separado, de cada uno de ellos.
En C, se conocen como funciones aquellos trozos de códigos utilizados para dividir un programa con el objetivo que, cada bloque realice una tarea determinada.
En las funciones juegan un papel muy importe las variables, ya que como se ha dicho estas pueden ser locales o globales.
Variables Globales: Estas se crean durante toda la ejecución del programa, y son globales, ya que pueden ser llamadas, leídas, modificadas, etc; desde cualquier función. Se definen antes del main().
Variables Locales: Estas, pueden ser utilizadas únicamente en la función que hayan sido declaradas.
La sintaxis de una función es la siguiente:
Tipo_de_datos nombre_de_la_funcion(tipo y nombre de argumentos)
{
acciones
}
donde:
- Tipo_de_datos: Es el tipo de dato que devolverá esa función, que puede ser real, entera, o tipo void(es decir que no devolverá ningún valor).
- Nombre_de_la_funcion: Es el identificador que le damos a nuestra función, la cual debe cumplir las reglas que definimos en un principio para los identificadores.
- Tipo y nombre de argumentos: son los parámetros que recibe la función. Los argumentos de una función no son más que variables locales que reciben un valor. Este valor se lo enviamos al hacer la llamada a la función. Pueden existir funciones que no reciban argumentos.
- Acciones: Constituye el conjunto de acciones, de sentencias que cumplirá la función, cuando sea ejecutada. Entre ellas están:
- Asignaciones
- Lecturas
- Impresiones
- Cálculos, etc
Una función, termina con la llave de cerrar, pero antes de esta llave, debemos colocarle la instrucción return, con la cual devolverá un valor específico. Es necesario recalcar que si la función no devuelve ningún valor, es decir, es tipo void, no tiene que ir la sentencia return, ya que de lo contrario, nos dará un error.
Pero, es válido que nos hagamos la siguiente pregunta:
¿Cómo es que funcionan los Subprogramas?
A menudo, utilizamos el adjetivo de "Subprogramas", para referirnos a las funciones, así que, el lector debe familiarizarse también con este término.
Los subprogramas se comunican con el programa principal, que es el que contiene a las funciones, mediante parámetros, que estos pueden ser: Parámetros Formales y Parámetros Actuales.
Cuando se da la comunicación los parámetros actuales son utilizados en lugar de los parámetros formales.
Paso de Parámetros
Existen dos formas de pasar parámetros, las cuales son:
- Paso por Valor
También conocido como parámetros valor. Los valores se proporcionan en el orden de cálculos de entrada.
Los parámetros se tratan como variables locales y los valores iniciales se proporcionan copiando los valores de correspondientes argumentos.
Los parámetros formales-Locales de una función reciben como inicilaes los valores de los parámetros actuales y con ellos se ejecutan las acciones descritas en el subprograma.
Ejemplo:
A=5;
B=7;
C=proc1(A, 18, B*3+4);
Proc1(X, Y, Z)
Explicación:
Donde, se encuentra c, se está llamando la función, denominada proc1, en la cual se están enviando como parámetros el valor de A, que es cinco; el cual es recibido por la variable X, en la definición de la función proc1; en la misma función, Y tendrá el valor de 18; por que ese es el valor del parámetro formal, mientras que Z, tendrá un valor inicial de 25, ya que ese es el resultado del tercer parámetro que resulta ser una expresión aritmética.
Funciones Definidas Por El Usuario en C
Una función, como ya se ha dicho, es un bloque de código dentro del programa que se encarga de realizar una tarea determinada. Por lo tanto un programa en c debe constar de una o más funciones, y por su puesto no puede faltar la función principal main().
Un viejo adagio dice: Separa y vencerás, lo cual se acopla perfectamente cuando tenemos un programa que es bastante grande; podemos separarlos en pequeños subprogramas (funciones), y concentrarnos en la solución por separados de cada uno de ellos y así resolver un gran problemas, en unos cuantos problemitas más pequeños.
Si un programa, está constituido por más de una función, las llamadas a la misma, pueden realizarse desde cualquier parte del programa, y la definición de ellas debe ser independiente unas de otras.
Por lo tanto sería un grave error el tratar de definir una función dentro de otra.
Una función puede ser llamada desde cualquier parte del programa no sólo una vez, y cuando es llamada, empieza a ejecutar las acciones que están escritas en código.
Para mayor comodidad del lector vamos a ver varios ejemplos, del uso de funciones y a medida que vayamos avanzando se volverán más complejos.
El orden será el siguiente:
- Funciones que no devuelven ningún valor
- Funciones que devuelven un valor entero
- Funciones que devuelven un valor Real
- Funciones combinadas
- Funciones en las que usamos Menú.
- Funciones que no devuelven ningún valor.
Cómo se ha dicho las funciones pueden o no devolver algún valor, para mi parecer, este tipo de funciones son las más sencillas, ya que cuando se llama la función, esta realiza lecturas, asignaciones, cálculos o impresiones, finaliza la ejecución de la función y el programa continúa normalmente.
Ejemplo 5.1
Diseñe un programa que dados dos números enteros determine la suma y cual de ellos es mayor, usando dos funciones diferentes.
#include <stdio.h>
#include <conio.h>
void suma (int a, int b); /*Declaraci¢n de la funci¢n*/
void mayor (int a, int b); /*Tipo de dato, nombre de la funci¢n y el tipo y nombre de los argumentos*/
main()
{
int a, b;
printf("Ingrese el valor de a:n");
scanf("%d", &a);
printf("Ingrese el valor de b:n");
scanf("%d", &b);
suma(a,b); /*Llamado de la funci¢n*/
mayor(a,b); /*Unicamente el nombre de la funci¢n y de los par metros*/
getch();
return 0;
}
void suma(int a, int b) /*Definici¢n de la funci¢n*/
{ /*Abrimos llaves al inicio de la definici¢n*/
int sum; /*Declaraci¢n de las variables locales*/
sum=a+b;
printf("El valor de la suma es %d:nn", sum);
} /*Fin de la funci¢n suma*/
void mayor(int a, int b)
{
if(a==b)
printf("Son igualesnn");
else
{
if(a>b)
printf("El valor de a es mayor que el de bnn");
else
printf("El valor de b es mayor que el de ann");
}
}
Definición de la Función
La función ha sido declarada, ha sido llamada y por lo tanto deber haber sido definida. Lo cual consta de dos partes, las cuales son:
Que como su nombre lo indica, es la primera línea de la definición de la función y con ella le indicamos al compilador que está en presencia de una función. Su formato es el siguiente:
Tipo_de_dato nombre_de_la_función (tipo y nombre de los argumentos)
- La Primera Línea
- Cuerpo de la función
Se inicia con una llave "{", y en ella, se pueden realizar asignaciones, cálculos, impresiones, así como la declaración de las variables locales. Puede estar constituidas por estructuras secuenciales, selectivas, iterativas, anidamientos, se pueden llamar otras funciones, etc; finaliza con "}". Puede devolver uno o ningún valor.
Ejemplo 5.2
Diseñe un Programa en C, que Dado un número entero y mayor que cero, Determine si es o no un número Primo. Ojo, los números primos sólo son divisibles por el mismo y por la unidad (1).
#include <stdio.h>
#include <conio.h>
void primo (int numero);
main()
{
int numero, ban=1;
clrscr();
while(ban==1)
{
printf("Introduzca el n£mero por favor:n");
scanf("%d", &numero);
while(numero<0)
{
printf("ERROR, el valor del n£mero debe ser mayor que ceron");
scanf("%d", &numero);
}
primo(numero);
printf("¨Otro n£mero (si=1 y No=0)?n");
scanf("%d", &ban);
}
getch();
return 0;
}
void primo (int numero)
{
int div, primo=1;
for(div=2; div<numero; div++)
{
if(numero%div==0)
{
primo=0;
printf("%d NO es primonnn", numero);
return 0;
}
else
primo=1;
}
if(primo!=0)
printf("%d es primonnn", numero);
}
Las funciones que devuelven algún valor, se les llama PROTOTIPOS DE FUNCIONES:
Antes de usar una función C debe tener conocimiento acerca del tipo de dato que regresara y el tipo de los
parámetros que la función espera.
El estándar ANSI de C introdujo una nueva (mejor) forma de hacer lo anterior respecto a las versiones previas
de C.
La importancia de usar prototipos de funciones es la siguiente:
Se hace el código mas estructurado y por lo tanto, más fácil de leer.
Se permite al compilador de C revisar la sintaxis de las funciones llamadas.
Lo anterior es hecho, dependiendo del alcance de la función. Básicamente si una función ha sido definida antes
de que sea usada (o llamada), entonces se puede usar la función sin problemas.
Si no es así, entonces la función se debe declarar. La declaración simplemente maneja el tipo de dato que la
función regresa y el tipo de parámetros usados por la función.
Es una práctica usual y conveniente escribir el prototipo de todas las funciones al principio del programa, sin
embargo esto no es estrictamente necesario.
Para declarar un prototipo de una función se indicara el tipo de dato que regresará la función, el nombre de la
función y entre paréntesis la lista del tipo de los parámetros de acuerdo al orden que aparecen en la definición de la
función. Por ejemplo:
int longcad(int n); Lo anterior declara una función llamada longcad que regresa un valor entero y acepta otro valor entero como parámetro.
(Tomado de "Manual de C" de Héctor Tejada Villela)
Ejemplo 5.3
Diseñe un programa, que dado un número entero y mayor que cero, muestre su factorial. (El factorial de 5 es 120; 5x4x3x2x1=120)
#include <stdio.h>
#include <conio.h>
int factorial (int num);
main()
{
int num, ban=1;
clrscr();
while(ban==1)
{
printf("Ingrese el valor del n£mero por favor:n");
scanf("%d", &num);
while(num<0)
{
printf("ERROR, el valor del n£mero debe ser mayor que cero:n");
scanf("%d", &num);
}
printf("El valor del factorial es %dnn", factorial (num));
printf("¨Desea Realizar otro calculo?Si=1 y No=0n");
scanf("%d", &ban);
}
getch();
return 0;
}
int factorial (int num)
{
int sum=1, i;
for(i=2; i<=num; i++)
{
sum=sum*i;
}
return (sum);
}
Explicación:
Quizá, lo único nuevo, e importante de explicar, radica en la llamada y la definición de la función. Cuando una función nos devolverá un valor entero, al identificador de dicha función debe precederle el tipo de dato. En el lugar, donde llamamos la función, es que aparecerá el valor que nos devuelva, como valor de retorno. En nuestro ejemplo, en una impresión. Y al momento de definirla, no se nos debe olvidar, colocarle la sentencia return(); ya que, mediante esta declaratoria, está retornando el valor calculado.
Pero, que sucede cuando se está trabajando, con valores bastante grandes, al utilizar solamente el int, se producirá un error lógico; ya que como valor de retorno podría ser un cero o una cifra negativa. Por tanto debemos usar el tipo de dato "long int".
Ejemplo 5.4
Diseñe un programa, que dada una cifra entera y mayor que cero, sea elevada a una potencia introducida por el usuario, la cual. (Ejemplo: 5^2=25).
#include <stdio.h>
#include <conio.h>
long int potencia (int base, int exponente);
main()
{
int base, exponente;
clrscr();
printf("La Base es:n");
scanf("%d", &base);
while (base<0)
{
printf("ERROR, el dato debe ser mayor que cero:n");
scanf("%d", &base);
}
printf("El Exponente es:n");
scanf("%d", &exponente);
printf("%d ^ %d es %ldnn", base, exponente, potencia(base,exponente));
getch();
return 0;
}
long int potencia (int base, int exponente)
{
long int sum=0, i,x;
for(i=1; i<exponente; i++)
{
x=base*base;
sum=sum+x;
}
return (sum);
}
Este método es un poco complejo y puede realizarse de manera más fácil, haciendo uso de las funciones predefinidas en C, de las cuales hablaremos a continuación.
- Funciones que devuelven un valor entero
- Funciones que Devuelven un Valor Real
Antes que nada, trataremos las funciones predefinidas en C. Ya que C, posee ciertas funciones que nos ayudan hacer nuestros programas más fáciles y utilizar menos código.
El lenguaje c, cuenta con una serie de funciones de bibliotecas que realizan operaciones y cálculos de uso frecuente.
Para acceder a una función, se realiza mediante el nombre seguido de los argumentos que le servirán a la función a realizar la tarea específica.
Nombre(arg1, arg2,…argn);
*Funciones Matemáticas
Para acceder a ellas, se debe colocar la directiva #include <math.h> en el encabezado del programa.
Función (Sintaxis)
Tipo de Dato
Propósito
acos(d)
double
Devuelve el arco coseno de d
asin(d)
double
Devuelve el arco seno de d
atan(d)
double
Devuelve el arco tangente de d
atan(d1, d2)
double
Devuelve el arco tangente de d1/d2
ceil(d)
double
Devuelve el valor redondeado por exceso, al siguiente entero mayor
cos(d)
double
Devuelve el coseno de d
cosh(d)
double
Devuelve coseno hiperbólico de d
exp(d)
double
Eleva a la potencia d
fabs(d)
double
Devuelve el valor absoluto de d
floor(d)
double
Devuelve el valor redondeado por defecto al entero menor más cercano
log(d)
double
Devuelve el logaritmo natural de d
log10(d)
double
Devuelve el lo. (base10) de d
pow(d1, d2)
double
Devuelve d1 elevado a la potencia d2
sin(d)
Double
Devuelve el seno de d
sinh(d)
double
Seno hiperbólico de d
sqrt(d)
double
Raíz cuadrada de d
Tan(d)
double
Devuelve la tangente de d
tanh(d)
double
Devuelve la tangente hiperbólica de d
Las siguientes funciones se encuentran en las librerías: stdid.h ó stdlib.h:
Función (sintaxis)
Tipo
Propósito
abs(i)
int
Devuelve el valor absoluto de i
ran()
int
Devuelve un entero aleatorio
srand(u)
void
Inicializa el generador de números aleatorios
div(d1/d2)
Double/
int
Devuelve el cociente y el resto de la división
atuf(s)
Double
Convierte la cadena a una cantidad de doble precisión
atoi(s)
int
Convierte cadenas a un entero
atol(s)
long
Convierte cadenas a un entero largo
Hay muchas otras funciones, pero para ahondar más, debes saber cuál es la versión de C, instalada en tu máquina y así verificar cuáles funcionan correctamente; pero por lo general, estas funciones son muy estándar para la mayoría de compiladores.
A continuación, pasaremos a desarrollar una serie de ejercicios, en los cuales haremos uso de la funciones predefinidas en c, así como la modularización, es decir; el uso de funciones definidas por el usuario.
Ejemplo 5.5
Se desea conocer el resultado de las siguientes operaciones:
- Ö a+b
- |a-b|
Las variables a y b, son de tipo real, y pueden ser positivas o negativas.
#include <stdio.h>
#include <conio.h>
#include <math.h>
double raiz(float a, float b);
double valor_absoluto(float a, float b);
double exponente (float a, float b);
main()
{
float a, b;
clrscr();
printf("ttBIENVENIDOnn");
printf("Ingrese el valor de a, por favor:n");
scanf("%f", &a);
printf("Ahora el valor de b:n");
scanf("%f", &b);
printf("El resultado de la ra¡z cuadrada de %.2f + %.2f es %.2fnn", a,b,raiz(a,b));
printf("|%.2f-%.2f| es igual a %.2fnn", a,b,valor_absoluto(a,b));
printf("%.2f^%.2f es igual a %fnn", a,b,exponente(a,b));
getch();
return 0;
}
double raiz(float a, float b)
{
float x;
double y;
x=a+b;
y=sqrt(x);
return (y);
}
double valor_absoluto(float a, float b)
{
float x;
double y;
x=a-b;
y=fabs(x);
return (y);
}
double exponente (float a, float b)
{
double x;
x=pow(a,b);
return (x);
}
Supongo que, este ejemplo no requiere mayor explicación. Pero me gustaría que el lector, comprenda la gran cantidad de usos que podemos darle, a aquellas funciones matemáticas, junto con las funciones definidas por el usuario, esta es una gran ayuda, ya que ¿se imaginan la cantidad de código que deberíamos colocar, para determinar cosas tan elementales como el valor absoluto?; con estas funciones matemáticas, C, nos ahorra mucho trabajo y código.
- ab
A continuación veremos un ejemplo de un programa en el cual utilizamos dos funciones de diferente tipo de dato.
Ejemplo 5.5
El valor del número e se puede aproximar sumando n términos de la serie: e = 1 + 1/1! + 1/2! + 1/3! + … Escribir un programa que solicite el número de términos de la serie a sumar e informe del valor aproximado de e. Téngase en cuenta que el termino i de la anterior serie se obtiene dividiendo por (i-1). (La exclamación es el factorial).
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
void calculodatos(int numero);
double factorial(int dato);
void main(void)
{
int numero;
char respuesta;
printf("nnnINICIO DEL PROGRAMAnnn");
printf("nnEl programa te calcula el valor del numero e.");
do {
do {
printf("nnIntroduzca un numero de terminos de la serie: ");
scanf("%d",&numero);
} while (numero<0);
calculodatos(numero);
printf("nn¨Desea introducir mas datos?nn");
respuesta=getch();
system("cls");
} while (respuesta=='s' || respuesta=='S');
printf("nnnttÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ");
printf("nttÛÛÛ FIN DEL PROGRAMA ÛÛÛ");
printf("nttÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛnnn");
}
void calculodatos(int numero)
{
register int i;
register double e=1.;
for (i=1;i<=numero;i++) {
e=e+1./factorial(i);
}
printf("nnEl valor de e para %d terminos es %f.",numero,e);
}
double factorial(int dato)
{
register int i;
register double resultado=1;
for (i=dato;i>0;i–) resultado=resultado*i;
return resultado;
}
El ejemplo anterior ha sido tomado de "Practicas de C", de Fernando Muñoz Ledesma. ledesmafernando[arroba]msn.com
Y así como este ejemplo, podemos realizar muchas otras combinaciones de funciones, según necesitemos y lo solicite nuestro programa.
- Funciones Combinadas
- Funciones en las que usamos Menú
En la práctica, muchas veces debemos diseñar programas, que nos permitan elegir la acción o acciones a realizar, es decir haciendo uso de un menú. El cual, no es más ni menos que la aplicación de un selector múltiple. Un switch.
Veamos un ejemplo.
Ejemplo 5.6
Diseñe un programa, que dado un ángulo, muestre su seno, coseno o tangente; según lo desee el usuario.
#include <stdio.h>
#include <conio.h>
#include <math.h>
void seno (float angulo);
void coseno (float angulo);
void tangente (float angulo);
main()
{
float angulo;
int opcion, ban=1;
clrscr();
while(ban==1)
{
printf("ttBIENVENIDO/Ann");
printf("Introduzca el valor del angulo, por favor:n");
scanf("%f", &angulo);
printf("¨Que desea hacer?:nn");
printf("********************************************n");
printf("**** 1. seno del angulo ****n");
printf("**** 2. coseno del angulo ****n");
printf("**** 3. tangente del angulo ****n");
printf("********************************************n");
scanf("%d", &opcion);
while(opcion<0 || opcion>3)
{
printf("ERROR, la opcion debe estar entre 0 y 3:n");
scanf("%d", &opcion);
}
clrscr();
switch(opcion)
{
case 1: seno (angulo);
break;
case 2: coseno (angulo);
break;
case 3: tangente (angulo);
break;
}
printf("¨Hay mas datos? (si=1 y no=0)n");
scanf("%d",&ban);
}
getch();
return 0;
}
void seno (float angulo)
{
float y;
y=sin (angulo);
printf("El seno de %f es %fnn", angulo, y);
}
void coseno (float angulo)
{
float y;
y=cos(angulo);
printf("El coseno de %f es %fnn", angulo, y);
}
void tangente (float angulo)
{
float y;
y=tan(angulo);
printf("La tangente de %f es %fnn", angulo, y);
getch();
}
Cuestionario
- Mencione y explique, las parte en las que se componen las funciones definidas por el usuario en C:______________________________________________________________________________________________
- ¿Cuál es la diferencia entre las funciones predefinidas en c y las funciones definidas por el usuario?________________________________________________________________________________________
- ¿En que consiste el paso de parámetros?:____________________________________________________________
- ¿Cuál es la diferencia entre parámetros formales y actuales?:______________________________________________________________________________________
- En que se diferencias las variables locales a las globales:_______________________________________________________________________________________
Ejercicios
- Realice una pequeña calculadora, utilizando funciones
- Diseñe un programa que permita calcular la serie ½ + 1/3 + ¼+ … 1/n.
- Diseñe un programa, que muestre el mayor y el menor de tres introducidos por el usuario.
- Se desea conocer el logaritmo natural y el logaritmo base 10 de una serie de números. Así como la suma de dichos valores
- Se desea conocer la permutación de dos números distintos. Usando funciones. Diseñe un programa que resuelva dicho problema. (NOTA: 5P3=5!/(5-3)!)
- Se desea conocer la equivalencia de dólares a colones (un dólar = 8.75 de colón), la equivalencia de un kilogramos a libras (1kg=2.2lb) y la conversión de kilómetros a millas (1km=0.62millas). realice esta solución mediante un menú.
- Calcule lo que debe pagar cada cliente en un almacén; si por cada compra el cliente tiene derecho a sacar un papelito, y dependiendo del color, se efectúan diferentes descuentos. Si el color es blanco, se realiza un descuento del 2.63% sobre la cuenta, si es verde, un descuento de 4.85% y si es rojo, un descuento de 5.02%. se sabe además que si es día lunes o viernes, el porcentaje de descuento es el doble.
- El seno de un ángulo, puede aproximarse, de la siguiente manera: sin(x) = x – x^3/3! + x^5/5! – x^7/7! + …, determine este valor, y usando la función sin(d), luego muestre la diferencia entre estos valores.
- En una empresa de electricidad, se cobrar las facturas correspondientes al consumo de kwh, de la siguiente manera: los primeros 100 kwh, se cobran $2.5, lo siguientes 200 kwh, son a $5.00, los 300kwh, siguientes, son cobrados a razón de $7.5, los kwh siguientes se cobran a $7.00. diseñe un programa que permita determinar lo que debe pagar un grupo de clientes al final del mes.
- En una empresa de repuestos de automóvil, poseen 10 tipos de repuestos identificados con los números de 1 al 10. durante la semana se realizan diferentes ventas de los repuestos. Se desea saber la cantidad de repuestos que se deben comprar, para actualizar el inventario. El cual se realiza cada cinco días, y se procede de la siguiente manera: cada día se contabilizan el total de facturas, en las cuales se muestran la cantidad de artículos vendidos así como el total de la venta. Con esos datos, indique al usuario cuantos y de que tipo, son los repuestos que se deben comprar así como la ganancia.
Capitulo VI "Estructuras de Datos"
Un array es un identificador que referencia un conjunto de datos del mismo tipo. Imagina un tipo de dato int; podremos crear un conjunto de datos de ese tipo y utilizar uno u otro con solo cambiar el índice que lo referencia. El índice será un valor entero y positivo. En 'C' los arrays comienzan por la posición 0.
Vectores
Un vector es un array unidimensional, es decir, solo usa un índice para referenciar a cada uno de los elementos.
Su declaración será: tipo nombre [tamaño];
El tipo puede ser cualquiera de los ya conocidos y el tamaño indica el número de elementos del vector (se debe indicar entre corchetes [ ]). En el ejemplo puedes observar que la variable i es utilizada como índice, el primer for sirve para rellenar el vector y el segundo para visualizarlo. Como ves, las posiciones van de 0 a 9 (total 10 elementos).
(Tomado de "Introducción al lenguaje de programación de C/C++". Sergio Pacho)
Ejemplo:
int num[100]; /*Arreglo de tipo entero compuesto de 100 posiciones*/
char nom[80]; /*Texto de 80 caracteres*/
float x[12]; /*arreglo de 12 elementos punto flotantes */
Constante Simbólica
Hace más sencillo o más fácil modificar un programa que utiliza arreglos. Ya que todas las referencias al tamaño del arreglo pueden ser alteradas, cambiando el valor de la constante simbólica.
Ejemplo 6.1
Diseñe un programa que lea un vector de 10 posiciones, luego determine si la quinta posición es positiva, si la primera posición es negativa y si la ultima posición es cero.
#include <stdio.h>
#include <conio.h>
#define N 10
main()
{
float x[N];
int i;
for(i=0; i<N; i++)
{
printf("Ingrese el valor %d:n", i);
scanf("%f", &x[i]);
}
if(x[4]>0)
{
printf("La quinta Posici¢n es Positivann");
}
if(x[0]<0)
{
printf("La 1ø Posici¢n es Negativonn");
}
if(x[N-1]==0)
{
printf("La Ultima Posici¢n es ceronn");
}
getch();
return 0;
}
Explicación
En este ejemplo estamos haciendo uso de la constante simbólica, de cuyos beneficios ya se habló. La definimos con 10 posiciones, recordando que C, empieza a contar desde cero. Luego definimos el vector llamado x, como punto flotante, y ojo, que éste va acompañado de su dimensión. Luego haciendo uso de un for, empezamos a llenar el vector. Luego preguntamos si la posición cuatro es positiva. El lector se preguntará el por que, la instrucción es x[4] y no x[5], ya que; lo que queremos es averiguar, si la posición cinco es la positiva. Pues bien, la posición identificada con el número cuatro, es en efecto la que contiene el quinto número.
Así:
Esta es una versión gráfica, de lo que sucedería al llenar nuestro vector con los valores indicados. Como podemos ver, C empieza a enumerar las casillas desde el cero, hasta el 9. totalizando de esa manera 10 posiciones. Así que, x[4]=8.
Es por ello, que el for, lo inicializamos con cero, hasta un valor menor que el de la constante, ya que de lo contrario nos daría un error.
Una particularidad con los vectores de tipo char (cadena de caracteres), es que deberemos indicar en que elemento se encuentra el fin de la cadena mediante el carácter nulo (). Esto no lo controla el compilador, y tendremos que ser nosotros los que insertemos este carácter al final de la cadena. Por tanto, en un vector de 10 elementos de tipo char podremos rellenar un máximo de 9, es decir, hasta vector[8].Si solo rellenamos los 5 primeros, hasta vector[4], debemos asignar el carácter nulo a vector[5]. Es muy sencillo: vector[5]='';
Ahora veremos un ejemplo de como se rellena un vector de tipo char. Podemos ver que en el for se encuentran dos condiciones:
1.-Que no se hayan rellenado todos los elementos (i<19).
2.-Que el usuario no haya pulsado la tecla ENTER, cuyo código ASCII es 13.
(cadena[x-i]!=13).
Uso de Vectores dentro de las Funciones
Un vector, solo puede ser argumento formal, es decir; por el momento, no podemos enviarlo como valor de retorno., digo por el momento por que cuando hablemos de punteros, veremos que si se pueden enviar.
Y dicho proceso se realiza de la siguiente manera:
- Declaración o Prototipo:
Tipo_de_dato nombre de la funcion (tipo_de_dato[]);
- Llamado de la Función
Nombre_de_la_funcion(nombre del vector);
- Definición de la función
Tipo_de_dato nombre de la funcion (tipo_de_dato nombre[])
Ejemplo 6.2
Diseñe un programa en C, que lea un vector de un máximo de 20 posiciones, y luego determine:
-La suma de todos los valores
-El mayor de los valores, así como la posición del mismo.
se sabe que dichos datos son de tipo entero
#include <stdio.h>
#include <conio.h>
#define N 20
int suma (int [N]); /*Declaración de la función*/
void mayor (int [N]); /*Ojo, los argumentos que son vectores solo necesitan el tipo de dato y la dirección*/
main()
{
int numeros[N], i;
printf("Ingrese la Cantidad de Valores:n");
scanf("%d", &limite);
while(limite<0 || limite >N)
for(i=0; i<N; i++)
{
printf("Ingrese el elemento %d del vector:n", i);
scanf("%d", &numeros[i]);
}
printf("La suma de todos los elementos del vector es: %dn", suma(numeros));
mayor(numeros); /*Llamado de la función */
getch();
return 0;
}
int suma (int numeros [N]) /*Definición de la función */
{
int sum=0, i;
for(i=0; i<N; i++)
sum=sum+numeros[i];
return (sum);
}
void mayor (int numeros [N])
{
int pos=0, mayor=numeros[0], i;
for(i=1; i<N; i++)
{
if(numeros[i]>mayor)
{
mayor=numeros[i];
pos=i;
}
}
printf("El valor mayor es %d y esta en la posici¢n %dnn", mayor, pos);
}
El lector, debe preguntarse, que pasaría si existen dos valores exactamente iguales que sean los valores máximos y que por ende, estén en diferentes posiciones, que solución le darías como programador?… este tipo de preguntas debe hacerse siempre que ha finalizado un programa, y nunca dejar nada sin resolver, por que recordemos que los programas que diseñamos son para que otras personas los usen.
Matrices
Las matrices se declaran de forma análoga, con corchetes independientes para cada
subíndice. La forma general de la declaración es:
tipo nombre[numero_filas][numero_columnas];
donde tanto las filas como las columnas se numeran también a partir de 0. La forma de
acceder a los elementos de la matriz es utilizando su nombre, seguido de las expresiones
enteras correspondientes a los dos subíndices, entre corchetes.
En C tanto los vectores como las matrices admiten los tipos de las variables escalares
(char, int, long, float, double, etc.),
Las matrices en C se almacenan por filas, en posiciones consecutivas de memoria. En
cierta forma, una matriz se puede ver como un vector de vectores-fila. Si una matriz tiene N
filas (numeradas de 0 a N-1) y M columnas (numeradas de 0 a la M-1), el elemento (i, j)
ocupa el lugar:
posición_elemento(0, 0) + i * M + j
A esta fórmula se le llama fórmula de direccionamiento de la matriz.
(Tomado de "Aprenda Lenguaje ANSI C como si estuviera en Primero". Universidad de Navarra).
Ejemplo 6.3
Diseñe un programa que lea un matriz de 6*6 y luego determine la suma de cada una de las filas y la almacene en un vector llamado suma.
#include <stdio.h>
#include <conio.h>
#define F 6
#define C 6
main()
{
int matriz[F][C], i,j, vector [F]={0,0,0,0,0,0};
for(i=0; i<F; i++)
for(j=0; j<C; j++)
{
printf("Ingrese el elemento F=%d y Columna=%d de la matriz:n", i,j);
scanf("%d", &matriz[i][j]);
vector[i]=vector[i]+matriz[i][j];
}
printf("La Matriz generada es:nn");
for(i=0; i<F; i++)
{
for(j=0; j<C; j++)
{
printf("*%d*", matriz[i][j]);
}
printf("n");
}
printf("Y el vector suma de las filas es:nn");
for(i=0; i<F; i++)
printf("%dt", vector[i]);
getch();
return 0;
}
Creo que no hay mucho por explicar, el uso de una matriz en C, es bastante parecido al de un vector, pero con las diferencias que en un vector tenemos únicamente una dimensión y en las matrices tenemos dos.
A continuación desarrollaremos un ejemplo, el cual es bastante significativo para mi, ya que fue mi primer proyecto, cuando cursé la Materia de Programación I en la Universidad, espero que les guste:
Ejemplo 6.4
Escriba un programa que visualice un cuadro mágico de orden impar N, comprendido entre 3 y 11; el usuario debe elegir el valor de N. Un cuadro mágico se compone de números enteros entre 1 y N, la suma de los números que figuran en cada fila, columna y diagonal son iguales.
Ejemplo:
8
1
6
3
5
7
4
9
2
Un método de generación consiste en situar en el centro de la primera fila, el número siguiente en la casilla situada por encima y a la derecha, y así sucesivamente … el cuadro es cíclico, la línea encima de la primera, es de hecho, la última y la columna a la derecha de la ultima es la primera. En caso de que el número generado caiga en una casilla ocupada, se elige la casilla situada de bajo del número que acaba de ser situado.
(Un poco complicado de entender… ¿verdad?… no te preocupes, a mi me costó un poco de tiempo entenderlo, para darle solución)
#include <stdio.h>
#include <conio.h>
#define N 11
#define M 11
int comprueba (int [N][M], int dim);
void impresion (int [N][M], int dim);
main()
{
int cuadrado[N][M];
int dim, f, c, i;
clrscr();
printf("Introduzca la dimenci¢n por favor:n");
scanf("%d", &dim);
while(dim<3 || dim>11)
{
printf("ERROR, el valor de la dimenci¢n debe estar entre 3 y 11:n");
scanf("%d", &dim);
}
while((dim%2)!=1)
{
printf("ERROR el valor de la dimenci¢n debe ser Impar:n");
scanf("%d", &dim);
}
for(f=0; f<dim; f++)
for(c=0; c<dim; c++)
cuadrado[f][c]=0;
f=0;
c=dim/2;
cuadrado[f][c]=1;
for(i=2; i<=dim*dim; i++)
{
f–;
c++;
if(f<0 && c==dim)
{
f=1;
c=dim-1;
}
if(f<0)
f=dim-1;
if(c==dim)
c=0;
if(cuadrado[f][c]!=0)
{
c–;
f=f+2;
}
cuadrado[f][c]=i;
}
printf("La constante m gica es: %dnn", comprueba (cuadrado, dim));
impresion(cuadrado, dim);
getch();
return 0;
}
int comprueba (int cuadrado [N][M], int dim)
{
int magic=1, f,c, consmagic, sum=0, i, j=-1;
consmagic=((dim*dim*dim)+dim)/2;
for(f=0; f<dim; f++)
{
sum=0;
for(c=0; c<dim; c++)
sum=sum+cuadrado[f][c];
if(sum!=consmagic)
magic=0;
}
for(c=0; c<dim; c++)
{
sum=0;
for(f=0; f<dim; f++)
sum=sum+cuadrado[f][c];
if(sum!=consmagic)
magic=0;
}
sum=0;
for(i=0; i<dim; i++)
sum=sum+cuadrado[i][i];
if(sum!=consmagic)
magic=0;
sum=0;
for((i=dim-1); i>=0; i–)
{
j=j+1;
sum=sum+cuadrado[i][j];
}
if(sum!=consmagic)
magic=0;
if(magic==0)
consmagic=0;
return (consmagic);
}
void impresion (int cuadrado[N][M], int dim)
{
int f, c;
printf("tEL CUADRO GENERADO ES:nn");
for(f=0; f<dim; f++)
{
for(c=0; c<dim; c++)
printf("*%d*", cuadrado[f][c]);
printf("n");
}
}
Cuestionario
- ¿Qué es una array o arreglo?_____________________________________________________________________
- ¿Cuál es la diferencia entre un vector y una matriz?______________________________________________________________________________________
- ¿Cómo se define y se declara una función cuyos parámetros son vectores o matrices?____________________________________________________________________________________
- ¿Cuáles son los tipos de datos admitidos para los arreglos?:____________________________________________________________________________________
- ¿Cuáles son las diferencias fundamentales entre un arreglo y una variable simple?____________________________________________________________________________________
Ejercicios
- En una escuela se tiene el listado de 30 alumnos con sus respectivas notos, diseñe un programa que muestre las notas de los alumnos que tuvieron una nota mayor que el promedio.
- Diseñe un programa que dado un vector de magnitud X, busque y muestre la posición en la que se encuentra un valor N, dentro del vector
- Se tiene dos vectores A y B, diseñe una solución, en la cual, en un tercer vector se guarde la multiplicación de los vectores A y B, y luego se impriman los tres vectores, uno a la par del otro, en forma vertical
- Diseñe un programa en C, en el cual guarde un vector de 100 posiciones, determine la media y la desviación estándar.
- Almacenar 50 números en un vector, elevar al cuadrado cada valor almacenado en el vector, almacenar el resultado en otro vector. Imprimir el vector original y el vector resultante
- Diseñe un algoritmo y programa que lea dos vectores A y B de 20 elementos cada uno y sume el primer elemento de A con el ultimo elemento de B y luego el segundo elemento de A por el diecinueveavo elemento de B y así sucesivamente hasta llegar al veinteavo elemento de A por el primer elemento de B. El resultado de la suma almacenarlo en un vector C.
- Se desea conocer la suma de la diagonal mayor y la diagonal menor de una matriz de F*C, e indique la diferencia matemática entre ambos resultados.
- En una tiemda, hay 8 departamentos y se tiene el registro de las ventas del año pasado de cada departamento por mes. Se desea conocer: el departamento que tuvo mayores ventas a lo largo de año. El departamento que tuvo menores ventas en el año. El mes en que se vendió más en el departamento número 3 y los meses y el departamento que superó las ventas promedios así como el total de lo vendido a lo largo de año.
- Se tienen dos Matrices de tamaño 4×4, se pide escriba un programa en el cual,. Mediante un menú, se puedan sumar, multiplicar o dividir las matrices.
10. El departamento de policía de la ciudad de San Salvador ha acumulado información referente a las infracciones de los límites de velocidad durante un determinado periodo de tiempo. El departamento ha dividido la ciudad en cuatro cuadrantes y desea realizar una estadística de las infracciones a los límites de velocidad en cada uno de ellos. Para cada infracción se ha preparado una tarjeta que contiene la siguiente información:
· numero de registro del vehículo;
· cuadrante en el que se produjo la infracción
· limite de velocidad en milla por hora
Diseñe un programa para producir 2 informes; el 1o. Que contiene una lista de la multa de velocidad recolectadas, donde la multa se calcula como la suma del costo de la corte ($20,000) mas $ 1,250 por cada mph que exceda la velocidad limite. Prepare una tabla con los siguientes resultados:
INFRACCIONES A LOS LIMITES DE VELOCIDAD
Registro del vehículo
Velocidad registrada (MPH)
Velocidad limite
Multa
Este informe debe ser seguido de un segundo en el cual se proporcione un análisis de las infracciones por cuadrante. Para cada uno de los 4 cuadrantes mencionados, debe darse el numero de infracciones y la multa promedio.
Dedicatoria Final
Espero que estas pequeñas y humildes páginas te sean de mucha utilidad, para esta etapa de tu vida como programador…
Deseo a la Vez dedicar, este pequeño triunfo a mi Madre, que siempre está apoyándome y dándome impulso a pesar de todo…
Si tienes alguna duda, comentario o sugerencia, puedes hacerla a mi correo:
(Espera próximamente una segunda entrega en la cual hablaré de algunos aspectos como punteros, colas, pilas…. etc)
"Los sueños no son para los soñadores, sino para los que trabajan por hacerlos realidad"
Animo!!! Y no te desalientes, sigue siempre adelante
Autor:
Br. Manuel Antonio Ortez
Página anterior | Volver al principio del trabajo | Página siguiente |