Cap�tulo IV "Ciclos"
Introducci�n**
Es muy com�n encontrar en los programas operaciones
que se deben ejecutar un n�mero repetido de veces en per�odos
m�s o menos espaciados. Si bien las instrucciones son las mismas, los
datos sobre los que operan var�an. A nuestro alrededor, encontramos problemas
que presentan esas caracter�sticas, por ejemplo: el c�lculo de
la nota final de los estudiantes de Programaci�n I, se realizar�
tantas veces como alumnos hayan inscritos en dicha asignatura, el c�lculo
del salario de los empleados de una empresa, etc. En estos casos la soluci�n
que se dise�e para un solo grupo de datos se debe repetir tantas veces
como sea necesario (de acuerdo al n�mero de estudiantes y de empleados
para los ejemplos anteriores).
Los c�lculos simples o la manipulaci�n de peque�os
conjuntos de datos se pueden realizar f�cilmente a mano, pero las tareas
grandes o repetitivas son realizadas con mayor eficacia por una computadora,
ya que estas est�n especialmente preparadas para ello.
Para repetir varias veces un proceso determinado haremos uso
de los ciclos repetitivos, a los cuales se les conoce con el nombre de estructura
repetitiva, estructura iterativa, lazo o bucle.
(Tomado de Los guiones de clase de Introducci�n a la
Inform�tica. Universidad de El Salvador. A�o 2005)
En C, podemos encontrar tres tipos de ciclos:
- Entrada Asegurada (while)
- Ciclo Controlado Por Contador (for)
- Hacer Mientras (do.. while)
Este ultimo, no est� l�gicamente estructurado,
por tanto no haremos mucho hincapi� en �l.
Conceptos Generales
Funcionamiento de Un Ciclo
Un ciclo, funciona de la siguiente manera: Eval�a una
condici�n de resultar cierta, realiza una acci�n o bloque de acciones,
luego vuelve a evaluar la condici�n y si nuevamente resulta cierta, realiza
la (s) acci�n (es). Cuando la condici�n de c�mo resultado
falso, se sale del ciclo y contin�a con la ejecuci�n normal del
programa.
Acumulador:
Es una variable, que , como su nombre lo indica se encarga
de acumular valores. Esto se vuelve muy �til, por ejemplo, cuando
queremos encontrar la suma de los n�meros del 0 al 9, en el acumulador,
vamos guardando los valores de dichas cifras. Puede ser tanto real como entera.
Su valor inicial, en la mayor�a de los casos es cero.
Contador:
Es una variable de tipo entero, que nos ayuda, en el programa
a contabilizar el n�mero de ejecuciones de una misma acci�n, de
un grupo de alumnos etc. Un acumulador tiene tres valores distintos:
- Valor Inicial: es el valor con el cual iniciamos nuestro contador. Generalmente
es cero. Esta asignaci�n puede hacerse cuando se declara la variable. - Valor Final: despu�s de la ejecuci�n del ciclo, el valor del
contador, ser� distinto a su valor inicial, este puede ser mayo o menor
que el mismo, todo depende si fue una cuenta creciente o decreciente. - Valor de Cambio: Es el valor Constante, en el cual se ir�
incrementando nuestro contador, este puede ser positivo o negativo; es decir,
si la cuanta se realiza de manera ascendente o descendente.
NOTA: el lector no debe confundirse entre las variables tipo
acumulador y tipo contador, estas se diferencian unas de otras en que: los contadores,
su valor de cambio es una constante, ya que aumenta y disminuyen en el mismo
valor, mientras que los acumuladores su valor de cambio no es constante. Un
acumulador necesariamente lo inicializamos con cero (o al menos en la mayor�a
de los casos). Un contador puede iniciar con cualquier valor.
Bandera:
Las variables tipo bandera son aquellas que s�lo admiten
dos valores: cierto o falso, true o false, hombre o mujer… etc
Ciclo de Entrada Asegurada
La sintaxis es la siguiente:
while(condici�n)
Acci�n;
Funciona de la siguiente manera: primero eval�a la condici�n,
si da como resultado cierta realiza la acci�n, luego vuelve a evaluar
la condici�n, si su resultado es falso, se sale del ciclo y contin�a
con la ejecuci�n del programa.
Hay que tener mucho cuidado, cuando trabajamos con ciclos,
ya que podemos caer en un ciclo infinito, es decir que nunca se sale de �l.
Lo cual no es un error de sintaxis sino de l�gica. Por lo cual en las
acciones debemos siempre colocar algo que haga que se modifique el resultado
de la condici�n, lo cual puede ser una bandera, un contador o un acumulador.
Ejemplo 4.1
Dise�e un Programa que imprima los primeros 10 n�meros.
#include <stdio.h>
#include <conio.h>
main()
{
int i=1; /*Declaramos nuestro contador con su Valor Inicial*/
while(i<=10) /*Mientras i sea menor o igual a 10:*/
{
printf("%dt", i);/*Imprimir el valor de i*/
i+=1;/*Aumentar el contador en 1*/
}
getch();
return 0;
}
Ejemplo 4.2
Se desea conocer el promedio de los n�meros mayores
que cero, en una serie de n�meros ingresados por el usuario. De los cuales
no se sabe la cantidad, haciendo uso de una bandera, dise�e un programa
en el cual el usuario ingrese los n�meros que desee.
#include <stdio.h>
#include <conio.h>
main()
{
int i=0, sum=0, ban=1, n;
float prom;
while(ban==1)
{
printf("Ingrese un n�mero por Favor:n");
scanf("%d", &n);
if(n>0)
{
i=i+1;
sum+=n;
}
printf("Desea Ingresar Otro N�mero? (Si=1 y No=0)n");
scanf("%d", &ban);
}
prom=sum/i;
printf("************************************************************n");
printf("*** El Promedio de los numeros mayores que cero es:
%.2f ***n", prom);
printf("************************************************************n");
getch();
return 0;
}
Ejercicio 4.3
En un sal�n se tienen las notas de 14, alumnos; de los
cuales se desea saber cual fue el promedio de todas las notas, cual fue la nota
mayor y la nota menor. As� como la cantidad de aprobados en el curso
(Para Aprobar la asignatura se requiere de una nota mayor o igual a 6.0)
#include <stdio.h>
#include <conio.h>
main()
{
float suma=0, prom, menor=11, mayor=-1, nota;
int i=1,j=0;
while(i<=14)
{
printf("Ingrese la Nota del alumno %d:n", i);
scanf("%f", ¬a);
while(nota<0.00 || nota >10.00)
{
printf("ERROR, la nota debe estar entre 0 y 10n");
scanf("%f", ¬a);
}
if(nota>=6.00)
j=j+1;
if(nota>mayor)
mayor=nota;
if(nota<menor)
menor=nota;
i=i+1;
suma=suma+nota;
}
prom=suma/14;
printf("El Promedio es %.2fnn", prom);
printf("El total de Aprobados es %dn", j);
printf("La Mayor nota fue %.2fn", mayor);
printf("%.2f corresponde a la nota menorn", menor);
getch();
return 0;
}
Ciclo Controlado por contador.
En algunas ocasiones, sabemos a ciencia cierta el n�mero
de veces que se tiene que repetir una misma acci�n o bloque de acciones.
Y para ello es que nos sirve, esta estructura. Su sintaxis es la siguiente:
for( valor inicial; condici�n; incremento)
accion;
Donde:
Valor inicial: es el valor con el cual inicializamos nuestra
variable de control.
Condici�n: si la cumple, ejecuta la acci�n o
acciones e incrementa o decrementa la variable de control, sino la cumple la
condici�n, se sale del ciclo.
Incremento; que puede ser positivo o negativo (decremento).
Veamos un ejemplo sencillo:
Ejemplo 4.4:
Dise�e un programa que imprima los primeros 10 n�meros:
#include <stdio.h>
#include <conio.h>
main()
{
int i;
for(i=1; i<=10; i++)
printf("%dt", i);
getch();
return 0;
}
ejemplo4.5
Dise�e un programa en C, que calcule las compras totales,
realizadas por un grupo de 20 amas de casa. Luego con esa informaci�n
obtenga la media.
#include <stdio.h>
#include <conio.h>
main()
{
int i;
float compra, desvia, prom, varinza, sum=0;
for(i=1; i<=10; i++)
{
printf("Ingrese la cantidad que gast� la ama de casa
%d:n", i);
scanf("%f", &compra);
while(compra<0)
{
printf("ERROR, la compra debe ser mayor que cero,
vuelva a intentarlo:n");
scanf("%f", &compra);
}
sum=sum+compra;
}
prom=sum/12;
printf("El promedio de las compras es %.2fnna", prom);
getch();
return 0;
}
Cabe, mencionar que, en el ciclo for, podemos hacer cuentas
decrecientes, es decir asignarle un valor grande a nuestra variable de control
y luego irla disminuyendo hasta un valor determinado.
Ejemplo 4.6
En un cine, se tienen 3 diferentes clases de boletos. Se pide
que dise�e un programa en el cual:
- se lea el precio de las 3 clase de boletos
- Se lea el numero de boletos vendidos de cada tipo
- Calcular cual boleto es el que se vendi� menos
- El total recaudado en taquilla
Adem�s se sabe que durante el d�a se realizaron
un total de n ventas.
#include <stdio.h>
#include <conio.h>
main()
{
float preciob1, preciob2, preciob3, sum=0, sum1=0, sum2=0,
sum3=0;
int n, i, boletos1, boletos2, boletos3, boleto;
clrscr();
printf("ttBIENVENIDO(A)nnn");
printf("Ingrese el precio de los boletos 1:n");
scanf("%f", &preciob1);
while(preciob1<0)
{
printf("ERRORn");
scanf("%f", &preciob1);
}
printf("Ingrese el precio de los boletos 2:n");
scanf("%f",&preciob2);
while(preciob2<0)
{
printf("ERRORn");
scanf("%f", &preciob2);
}
printf("Ingrese el precio de los boletos 3:n");
scanf("%f",&preciob3);
while(preciob3<0)
{
printf("ERRORn");
scanf("%f", &preciob3);
}
printf("�Cu ntas ventas se realizaron este d�a?:n");
scanf("%d", &n);
while(n<0)
{
printf("ERRORn");
scanf("%d", &n);
}
for(i=1; i<=n; i++)
{
printf("Ingrese el Boleto:n");
scanf("%d", &boleto);
switch(boleto)
{
case 1: printf("Ingrese la cantidad de boletos vendidos:n");
scanf("%d", &boletos1);
sum1+=boletos1;
sum=sum+(boletos1*preciob1);
break;
case 2: printf("Ingrese la cantidad de boletos vendidos:n");
scanf("%d", &boletos2);
sum2+=boletos2;
sum=sum+(boletos2*preciob2);
break;
case 3: printf("Ingrese la cantidad de boletos vendidos:n");
scanf("%d", &boletos3);
sum3+=boletos3;
sum=sum+(boletos3*preciob3);
break;
default: printf("ERROR, Vuelva a intentarlonn");
break;
}
}
clrscr();
if(sum3<sum2 && sum3<sum1)
printf("Los Boletos que se vendieron menos fueron los
boletos numero UNOnn");
if(sum2<sum3 && sum2<sum1)
printf("Los Boletos que se vendieron menos fueron los
boletos numero DOSnn");
if(sum1<sum2 && sum1<sum3)
printf("Los Boletos que se vendieron menos fueron los
boletos numero TRESnn");
printf("El total recaudado en taquilla, durante este dia fue:
%.2fnn", sum);
getch();
return 0;
}
Ciclo Do… while
Es te ciclo funciona de la siguiente manera, realiza la acci�n
o conjunto de acciones, luego eval�a una condici�n de resultar
cierta vuelve a realizar la/s accion/es. Cuando sea falsa, se sale del ciclo.
Esta estructura, no est� l�gicamente, estructurada, por ello,
no hablaremos mucho, sin embargo realizaremos un par de ejemplos, de este ciclo.
Formato :
do {
sentencia;
.
.
} while(<expL>);
La diferencia fundamental, entre el ciclo while y do…while,
es que en este ultimo, las sentencias se realizar�n por lo menos una
vez, en cambio, con while, solo se cumplir�n mientras se cumpla
la condici�n, lo cual puede ser nunca.
Ejemplo 4.7
Programa que determina si un a�o es bisiesto o no. Y
un a�o es bisiesto si es m�ltiplo de cuatro, pero excluyendo aquellos
que son m�ltiplos de 100 pero no de 400
#include <stdio.h>
#include <conio.h>
void main()
{
int anio;
char respuesta;
printf("nnnINICIO DEL PROGRAMAnnn");
printf("nnEl programa te pide un anio y te dice exactamente si es bisiesto
o no");
do
{
/*ENTRADA DE DATOS*/
printf("nnIntroduzca un anio determinado ");
scanf("%d",&anio);
/*PROCESO Y SALIDA DE DATOS*/
if ((anio%4==0 && anio%100!=0)||(anio%400==0)) printf("nnEl
anio es bisiesto");
else printf("nnEl anio no es bisiesto");
printf("nnDesea introducir mas datosnn");
respuesta=getch();
} while(respuesta=='S' || respuesta=='s');
printf("nnnFIN DEL PROGRAMAnnn");
}
NOTA: este c�digo ha sido tomado de "Practicas
de Programaci�n en C", de Fernando Mu�oz Ledesma. Practica
3, ejercicio 5.
Cuestionario
- �qu� es y c�mo funciona un ciclo?____________________________________________________________________________________________________________________
- Cu�l es la diferencia entre un contador y un acumulador:_____________________________________________________________________________________________________________
- �cu�l es la mejor manera de validar datos?:_________________________________________________________________________________________________________________
- �c�mo se evita un ciclo infinito?:__________________________________________________________________________________________________________________
- �Qu� diferencia existe entre un ciclo de entrada asegurada y el do…
while?:______________________________________________________
Descubre donde est� el error.
El siguiente c�digo muestra la serie:
1^2+2^2+3^2….n^2
en el cual hay errores de l�gica, de sintaxis o hasta
de ejecuci�n, puedes descubrirlos y corregirlos?
#include <stdio.h>
#include <conio.h>
main()
{
int n i, x, sum=0;
printf("Inrtroduzca el valor de n:n");
scanf("%d", &n);
while(n<0)
{
printf("Error, vuelva a digitar el valor de n:n");
scanf("%d", n);
}
for(i=1; i<=n, i++)
x=i*i;
sum+=n;
printf("El valor de la suma es:%dnn", sum)
getch();
return 0;
}
Ejercicios
- Se desea conocer la suma de los n�meros enteros, positivos menores
que n, el cual es un dato dado por el usuario. - Muestre un programa en c, que imprima en pantalla los n�meros desde
un valor inicial, hasta un valor final, ingresados por el usuario, tanto en
forma descendente como ascendente. - Dise�e un programa que imprima la serie de Fugonacci, as�:
0 1 1 2 3 5 8 13…. hasta un n�mero n dado por el usuario. - Calcule el promedio de edades de un grupo de estudiantes, de los cuales
no se conoce la cantidad. - Dise�e un programa que obtenga, la calificaci�n mayor y la
calificaci�n menor, de un grupo de 40 estudiantes, adem�s de
los nombres de dichos alumnos. - En un pa�s hubieron elecciones para elegir al presidente. El pa�s
consta de 7 provincias o regiones, de las cuales se han levantado actas que
contiene el total de votos obtenidos por los 4 partidos pol�ticos en
dicha regi�n. Dise�e un programa en c, que lea las actas de
las 7 provincias, muestre que partido gan� las elecciones y en caso
de empate, lo especifique con un mensaje. - en un supermercado, hay 3 departamentos (de ropa, comestibles y perfumer�a),
en lo cuales se realizan un descuento de 5%, 3.5% y 8% respectivamente, por
las compras totales mayores de $100.00. dise�e un programa que dado
el monto de la compra, realice los descuentos pertinentes por departamento,
le indique al usuario a cuanto asciende su nuevo monto e indique, cuanto fue
lo recaudado al final del d�a. - La Empresa, el porvenir s.a de c.v desea conocer lo que debe pagar en concepto
de horas extras aun grupo de n empleados. Se sabe que una hora extra diurna,
se paga el doble que una hora normal. Y una hora extra nocturna se paga el
doble de una hora normal m�s el 25%. Adem�s que todos los empleados
tiene sueldos diferentes, muestre el nuevo sueldo de cada uno de ellos y lo
que tendr� que pagar la empresa en concepto de horas extra. - Una compa��a de tel�fonos, cobra $0.03 por minuto la
llamada nacional local, $0.06 por la llamada de larga distancia nacional y
$0.10 la llamada de larga distancia internacional. Dise�e un programa
que calcule las facturas mensuales de los clientes, sabiendo que, si las llamadas
fueron realizadas por la ma�ana tienen un doble valor, y si los 10
primeros minutos de llamadas locales son gratis, en cualquier horario.
Cap�tulo 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
- Paso por Valor
- 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.
- La Primera L�nea
- Cuerpo de la funci�n
- Funciones que devuelven un valor entero
- Funciones que Devuelven un Valor Real
- Ö a+b
- |a-b|
- ab
- Funciones Combinadas
- Funciones en las que usamos Men�
- 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:___________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
- 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. - Declaraci�n o Prototipo:
- Llamado de la Funci�n
- Definici�n de la funci�n
- �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?________________________________________________________________________________________________________________________________________________________________________________________________________________________________ - 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.
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:
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:
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)
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.
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 |
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 |
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:
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.
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.
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
Ejercicios
Cap�tulo 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:
Tipo_de_dato nombre de la funcion (tipo_de_dato[]);
Nombre_de_la_funcion(nombre del vector);
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
Ejercicios
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.
P�gina anterior | Volver al principio del trabajo | P�gina siguiente |