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
CUna 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ónLa 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 lospará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 previasde 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 antesde 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 lafunció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, sinembargo 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 lafunción y entre paréntesis la
lista del tipo de los parámetros de acuerdo al
orden que aparecen en la definición de
lafunció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/d2ceil(d)
double
Devuelve el valor redondeado por exceso, al
siguiente entero mayorcos(d)
double
Devuelve el coseno de d
cosh(d)
double
Devuelve coseno hiperbólico de
dexp(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 cercanolog(d)
double
Devuelve el logaritmo natural de
dlog10(d)
double
Devuelve el lo. (base10) de d
pow(d1, d2)
double
Devuelve d1 elevado a la potencia
d2sin(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
dLas 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
aleatoriosdiv(d1/d2)
Double/
int
Devuelve el cociente y el resto de la
divisiónatuf(s)
Double
Convierte la cadena a una cantidad de doble
precisiónatoi(s)
int
Convierte cadenas a un entero
atol(s)
long
Convierte cadenas a un entero
largoHay 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.comY 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
FuncionesUn 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
cadasubí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 deacceder a los elementos de la matriz es
utilizando su nombre, seguido de las expresionesenteras 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.
Encierta forma, una matriz se puede ver como un
vector de vectores-fila. Si una matriz tiene
Nfilas (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 +
jA 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 horaDiseñ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
VELOCIDADRegistro del
vehículoVelocidad 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
adelanteAutor:
Br. Manuel Antonio Ortez
Página anterior | Volver al principio del trabajo | Página siguiente |