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: 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: Cap�tulo IV "Ciclos"
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 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
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 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:
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 |