Está en la página 1de 202

C

odigos de Programas
en el lenguaje C++
Efran Soto Apolinar
Codigos de Programas
en el lenguaje C
++
Compilados por
Efran Soto Apolinar

PISIS
Monterrey, N.L., Mexico. 2007

Indice
1 Introduccion 7
1.1 Conceptos basicos . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.1.1 Conceptos de programacion . . . . . . . . . . . . . . . . . 8
1.1.2 Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.2 Sintaxis del lenguaje C++ . . . . . . . . . . . . . . . . . . . . . . 11
1.2.1 Palabras reservadas . . . . . . . . . . . . . . . . . . . . . 11
1.2.2 Tipos de datos . . . . . . . . . . . . . . . . . . . . . . . . 11
1.2.3 Tipos de constantes . . . . . . . . . . . . . . . . . . . . . 12
1.2.4 Caracteres especiales . . . . . . . . . . . . . . . . . . . . . 12
1.2.5 Declaracion de variables . . . . . . . . . . . . . . . . . . . 12
1.2.6 Asignacion . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.2.7 Operaciones matematicas . . . . . . . . . . . . . . . . . . 14
1.2.8 Comparaciones . . . . . . . . . . . . . . . . . . . . . . . . 15
1.2.9 Ciclos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
1.2.10 Ejemplos de control de ujo . . . . . . . . . . . . . . . . . 17
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
4
1.2.11 Operaciones logicas . . . . . . . . . . . . . . . . . . . . . . 21
1.3 Funciones en C++ . . . . . . . . . . . . . . . . . . . . . . . . . . 22
1.3.1 Funciones predenidas . . . . . . . . . . . . . . . . . . . . 22
1.3.2 Funciones denidas por el usuario . . . . . . . . . . . . . 23
1.4 Clases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
2 Codigos 31
2.1 Mis primeros programas . . . . . . . . . . . . . . . . . . . . . . . 32
2.2 Programas con funciones . . . . . . . . . . . . . . . . . . . . . . . 38
2.3 Funciones cin, cout . . . . . . . . . . . . . . . . . . . . . . . . . . 39
2.4 if, for, while and the like... . . . . . . . . . . . . . . . . . . . . . . 46
2.5 Mis tareas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
2.5.1 Simulacion 1 . . . . . . . . . . . . . . . . . . . . . . . . . 60
2.5.2 Calculo analtico . . . . . . . . . . . . . . . . . . . . . . . 64
2.5.3 Simulacion 2 . . . . . . . . . . . . . . . . . . . . . . . . . 65
2.5.4 Simulacion 3 . . . . . . . . . . . . . . . . . . . . . . . . . 68
2.5.5 Simulacion 4 . . . . . . . . . . . . . . . . . . . . . . . . . 70
2.5.6 Simulacion 5 . . . . . . . . . . . . . . . . . . . . . . . . . 72
2.5.7 Simulacion 6 . . . . . . . . . . . . . . . . . . . . . . . . . 74
2.5.8 Simulacion 7 . . . . . . . . . . . . . . . . . . . . . . . . . 78
2.5.9 Simulacion 8 . . . . . . . . . . . . . . . . . . . . . . . . . 80
2.5.10 Simulacion de la distribucion binomial . . . . . . . . . . . 84
2.5.11 Introduccion a la dinamica de poblaciones . . . . . . . . . 87
2.6 Proyectos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
2.6.1 Regresion lineal . . . . . . . . . . . . . . . . . . . . . . . . 89
2.6.2 Regresion cuadratica . . . . . . . . . . . . . . . . . . . . . 91
2.7 Librera Estadstica . . . . . . . . . . . . . . . . . . . . . . . . . . 96
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
5
2.8 Implementacion . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
2.8.1 Ejemplos de uso . . . . . . . . . . . . . . . . . . . . . . . 139
2.8.1.1 funiforme(total, archivo) . . . . . . . . . . . . . 139
2.8.1.2 funiforme(total, archivo, A, B) . . . . . . . . . . 140
2.8.1.3 fnormal(total, archivo) . . . . . . . . . . . . . . 142
2.8.1.4 fnormal(total, archivo, media, SD) . . . . . . . . 143
2.8.1.5 fexponencial(total, lambda, archivo) . . . . . . . 144
2.8.1.6 fgeometrica(total, p, archivo) . . . . . . . . . . . 145
2.8.1.7 fpoisson(total, alpha, archivo) . . . . . . . . . . 145
2.8.1.8 fweibull(total, archivo, c, k) . . . . . . . . . . . . 146
2.8.1.9 frayleigh(total, archivo, media) . . . . . . . . . . 147
2.8.1.10 histograma(archivo, intervalos) . . . . . . . . . . 148
2.8.1.11 PchiUniforme(archivo, No Int) . . . . . . . . . . 154
2.8.1.12 PchiNormal(archivo, No Int) . . . . . . . . . . . 156
2.8.1.13 PchiExponencial(archivo, Num Int, lambda) . . 157
2.8.1.14 PchiWeibull(Archivo, Num Int, C, K) . . . . . . 159
2.8.1.15 PchiRayleigh(archivo, Num Int, media) . . . . . 161
2.8.1.16 RL(archivo) . . . . . . . . . . . . . . . . . . . . 162
2.8.1.17 RC(archivo) . . . . . . . . . . . . . . . . . . . . 163
2.8.2 Otras funciones . . . . . . . . . . . . . . . . . . . . . . . . 165
2.8.2.1 uniforme() . . . . . . . . . . . . . . . . . . . . . 165
2.8.2.2 uniforme(a,b) . . . . . . . . . . . . . . . . . . . . 166
2.8.2.3 weibull(c,k) . . . . . . . . . . . . . . . . . . . . . 167
2.8.2.4 rayleigh(media) . . . . . . . . . . . . . . . . . . 168
2.8.2.5 normal() . . . . . . . . . . . . . . . . . . . . . . 169
2.8.2.6 normal(media, desviacionStd) . . . . . . . . . . 170
2.8.2.7 exponencial(lambda) . . . . . . . . . . . . . . . . 171
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
2.8.2.8 geometrica(p) . . . . . . . . . . . . . . . . . . . 172
2.8.2.9 poisson(alpha) . . . . . . . . . . . . . . . . . . . 173
2.8.2.10 media(archivo), desviacionStd(archivo) . . . . . 174
2.8.3 Simulacion del recurso eolico . . . . . . . . . . . . . . . . 176
2.8.3.1 Energa extraida del viento . . . . . . . . . . . . 176
2.8.4 Distribucion del viento . . . . . . . . . . . . . . . . . . . . 178
2.8.4.1 Distribucion Weibull . . . . . . . . . . . . . . . . 178
2.8.4.2 Distribucion Rayleigh . . . . . . . . . . . . . . . 179
2.8.4.3 Distribucion de energa . . . . . . . . . . . . . . 180
2.8.4.4 Anemometros digitales . . . . . . . . . . . . . . 180
2.8.4.5 Prediccion del recurso eolico . . . . . . . . . . . 180
2.8.5 Un caso especco . . . . . . . . . . . . . . . . . . . . . . 181
2.8.6 Implementacion . . . . . . . . . . . . . . . . . . . . . . . . 181
2.8.7 Resultados de la simulacion . . . . . . . . . . . . . . . . . 186
2.9 Esqueletos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
2.10 Lecciones aprendidas . . . . . . . . . . . . . . . . . . . . . . . . . 193
3 End matter 195
3.1 Fuentes bibliogracas . . . . . . . . . . . . . . . . . . . . . . . . . 196
3.2 Terminos de uso . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
3.3 Creditos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
3.4 Simbologa utilizada . . . . . . . . . . . . . . . . . . . . . . . . . 200
1
Introduccion
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
8 Introduccion
1.1 Conceptos b

asicos
En este apartado se dan algunos conceptos que necesitas conocer para poder
aprovechar la lectura de este material.
Se presentan diversas secciones con contenidos igual de importantes. Los primeros
tienen que ver con las bases de programacion y despues se incluyen los que
conciernen al lenguaje C
++
.
1.1.1 Conceptos de programacion
Los conceptos que debes entender para iniciarte en el arte de la programacion
son:
Denicion 1.1.1.
Algoritmo
Una sucesion ordenada de instrucciones para resolver un problema o una tarea.
Puedes pensar en un algoritmo como si se tratara de una receta. Es el procedi-
miento que se debe realizar para resolver un problema especco.
Denicion 1.1.2.
Compilador
Es el programa de computadora que traduce las instrucciones que nosotros le
damos en un lenguaje especco.
Denicion 1.1.3.
Programa fuente
Es el codigo que t u vas a escribir. En este texto encontraras el programa fuente
para resolver muchos problemas. El programa fuente tambien se conoce como
codigo fuente.
Denicion 1.1.4.
C odigo
Es un conjunto de instrucciones en alg un lenguaje de alto nivel. En este material
solamente encontraras codigo en C
++
.
El codigo no necesariamente es un programa completo, puede tratarse solamente
de una parte del programa.
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
1.1 Conceptos basicos 9
Denicion 1.1.5.
Sintaxis
Son las reglas de acuerdo a las cuales debes escribir el programa fuente. Cada
lenguaje de programacion tiene su sintaxis. Puedes imaginar que la sintaxis son
las reglas de gramatica de ese lenguaje.
Denicion 1.1.6.
Compilar
Indicar a la computadora que verique que el programa fuente no contenga
errores. Esta tarea siempre la realizara un software (el compilador).
Denicion 1.1.7.
Correr (un programa)
Ordenar a la computadora que ejecute las instrucciones indicadas por el codigo
de un programa. Evidementemente, un programa en C
++
debe correrse en un
compilador de ese lenguaje. (Yo utilizo el Dev-C
++
, que es gratuito.)
Nota 1.1.1. Algunas veces el compilador no encontrara errores, pero existe la
posibilidad de que s existan. Por ejemplo, en el caso de que t u hayas cometido
el error de escribir un + en lugar de un *, el compilador no se da cuenta,
porque no sabe realmente que debe hacer el programa. En otras palabras, las
computadoras todava no pueden leer tu mente.
Denicion 1.1.8.
Mensaje de error
Es un mensaje que el compilador te dara cuando encuentre errores en el pro-
grama fuente. Estos mensajes te ayudan a corregir el codigo.
Denicion 1.1.9.
Error de sint axis
Ocurre cuando el codigo no esta completamente escrito de acuerdo a las reglas de
sintaxis del mismo. Por ejemplo, si escribes, Go To en lugar de GOTO, cometiste
un error de sintaxis (de acuerdo a la sintaxis del lenguaje GWBasic).
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
10 Introduccion
Denicion 1.1.10.
Errores l ogicos
Los que comete el programador cuando traduce el algoritmo al lenguaje C
++
.
El programa realmente no hace lo que el algoritmo indica. Tal vez no tenga
errores de sintaxis... simplemente no realiza la tarea que debe realizar. Cuidado
con esto.
1.1.2 Variables
Denicion 1.1.11.
Identificador
Es el nombre que el programador asigna a un valor dentro de un programa. En
C
++
, un identicador debe empezar con una letra o el smbolo: y los demas
caracteres deben ser letras, dgitos o el smbolo .
Denicion 1.1.12.
Variable
Es una herramienta de programacion utilizada para asignar valores (no nece-
sariamente numericos) a letras o cadenas de letras. Las variables se clasican
de acuerdo al tipo de valor que almacenan.
Denicion 1.1.13.
Constante
Es un valor que no cambia durante la ejecucion del programa. Una constante
puede ser de cualquiera de los tipos de datos denidos en C
++
.
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
1.2 Sintaxis del lenguaje C++ 11
1.2 Sintaxis del lenguaje C++
1.2.1 Palabras reservadas
En C
++
, las siguientes son consideradas reservadas: !
asm
auto
bool
break
case
char
catch
class
const
const cast
continue
default
delete
do
double
dynamic cast
else
enum
explicit
extern
false
float
for
friend
goto
if
inline
int
log
long
mutable
namespace
new
operator
private
protected
public
register
reinterpret cast
return
short
signed
sizeof
static
static cast
struct
switch
template
this
throw
true
try
typedef
typeid
typename
union
unsigned
using
virtual
void
volatile
while
esto signica que no se permite utilizar alguna de las palabras que se enlistaron
antes como un identicador. !
1.2.2 Tipos de datos
En C
++
hay varios tipos de datos que podemos denir para las variables y
constantes que utilicemos en nuestros programas.
!
Variable Rango Precision Ejemplo
short 32 767 a 32 767 No Aplica 23
int 2 147 483 647 a 2 147 483 647 No Aplica 4
unsigned int 2 147 483 647 a 2 147 483 647 No Aplica 4
oat 10
38
a 10
38
7 dgitos 3.1416
double 10
308
a 10
308
15 dgitos 3.141592654
long double 10
4932
a 10
4932
19 dgitos 2.718281828
char No aplica No aplica a
string No aplica No aplica Hola Amigo.
bool False/True No aplica False
Tipos de datos.
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
12 Introduccion
Decidir como denir una variable depende del uso que se le va a dar. Cuando
vayas a denir una variable trata de pensar en que le va a pasar durante la
ejecucion del programa.
1.2.3 Tipos de constantes
Una variable, por denicion, puede cambiar de valor durante la ejecucion de
un programa. Por el contrario una constante no cambia de valor durante la
ejecucion del programa.
Bueno, muchos se preguntan, si nunca cambia de valor, para que utilizar un
identicador y utilizar mas memoria... Ok. Acepto el argumento. Sin embargo,
algunas veces un valor constante aparece en muchas partes del codigo de un
programa, por ejemplo, la tasa de cambio.
Si cambia de un da para otro este valor, es una buena idea denirlo como
constante, y cambiar su valor... porque si nos decidimos cambiar todos los
lugares donde aparezca esta constante, existe la posibilidad de que omitamos uno
o varios cambios. Ademas, existe tambien la posibilidad de que otra constante
tenga el mismo valor y eso pueda ocasionar mas errores todava.
Cuando una variable del tipo bool toma el valor true, este resultado no es
una cadena de caracteres, es decir, no es una variable del tipo string. De i
manera que si quieres enga nar al compilador o a la computadora asignando a una
constante del tipo bool la cadena true, al compilar te dara el correspondiente
mensaje de error.
1.2.4 Caracteres especiales
En C
++
se denen los siguientes caracteres especiales. !
Caracter especial Constante
Salto de lnea \n
Tabulacion \t
Nulo \0
Diagonal inversa \\
Caracteres especiales.
1.2.5 Declaraci on de variables
En C
++
, estas obligado a declarar cualquier variable antes de poder utilizarla.
La sintaxis para declarar una variable es la siguiente:
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
1.2 Sintaxis del lenguaje C++ 13
Tipo_de_variable variable1;
Tambien puedes declarar dos o mas variables al mismo tiempo separandolas por
comas:
Tipo_de_variable variable1, variable2, variable3;
Igual, podemos declarar una constante, anteponiendo la palabra const a la
declaracion.
Ejemplos: o
int contador, dia, mes, edad; // Variables tipo int (entero)
double promedio, precio, masa, volumen; // con punto decimal
char nombre[15], apellido_m[15], apellido_p[15]; // Cadenas
const double e = 2.718281828; // Constante tipo double
1.2.6 Asignacion
En C
++
, para hacer una asignaci on de un valor al identicador de una varia-
ble, necesariamente debemos escribir primero (i.e., a la izquierda) el valor del
identicador que almacenara el valor y a la derecha el valor o una expresion
matematica correctamente codicada en C
++
. Como es costumbre, en medio
debemos escribir el smbolo =.
La sintaxis es la siguiente:
variable = expresion;
Ejemplos: o
total = total + incremento;
edad = year_actual - year_de_nac;
area = 3.1416
*
radio
*
radio;
importe = precio_unitario
*
no_articulos;
aceleracion = (v_f - v_i) / t;
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
14 Introduccion
Tambien podemos asignar un valor a un identicador a la hora de declarar la
variable. Hay dos formas igualmente aceptables para hacer esto. La sintaxis es
la siguiente:
Tipo\_de\_variable variable1 = valor\_1, variable2 = valor\_2, var3 = valor\_3;\\
Tipo\_de\_variable variable4 (valor\_4), variable5 (valor\_5), var6 (valor\_6);
Ejemplos: o
int contador= 1, factor_de_conversion = 12;
double alpha(0.32), delta_Cu(375.23);
char respuesta = c;
1.2.7 Operaciones matematicas
En C
++
estan denidas las operaciones aritmeticas basicas: +, , , .
Para la suma y la resta usamos los signos + y , respectivamente. Para la
multiplicacion usamos el smbolo * y para la division, el smbolo: /.
Es importante utilizar signos de agrupacion para denir correctamente las opera-
ciones.
Por ejemplo, supongamos que tenemos que realizar el siguiente calculo:
x
1
=
b +

b
2
4 ac
2 a
En C
++
esta misma expresion se codica como sigue: o
x_1 = (- b + sqrt(b
*
b - 4
*
a
*
c))/(2
*
a);
La funcion sqrt() esta denida en una librera de C
++
(math.h)
1
.
En el caso de la formula:
y
f
=
1
2
a t
2
+v
0
t +y
i
se codica como: o
1
Mas sobre funciones y libreras en los siguientes temas.
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
1.2 Sintaxis del lenguaje C++ 15
y_f = a
*
t
*
t / 2 + v_0
*
t + y_i;
En la programacion es muy com un utilizar la operacion incremento. Es decir,
incrementamos el valor de una variable en 1, digamos un contador.
Debido a esto, en C
++
hay varias operaciones matematicas unitarias, en el sen-
tido que se realizan con solamente una variable, no dos, en cuyo caso seran
binarias. o
Ejemplo: Equivalente a:
contador++; contador = contador + 1;
reg ; reg = reg 1
decenas += 10; decenas = decenas + 10;
p Neto = desc; p Neto = p Neto desc;
factor *= celcuis; factor = factor * celcius;
residuo %= divisor; residuo = residuo % divisor;
mejor *= calif1 + calif2; mejor = mejor * (calif1 + calif2);
Operaciones unitarias
1.2.8 Comparaciones
En la mayoria de los programas se requiere hacer comparaciones para controlar
el ujo del procedimiento.
En seguida se muestra la tabla que contiene los tipos de comparaciones. !
Smbolo En En Ejemplo Equivalente
Matematico Espa nol C++ Practico a
= Igual a == x == 0 x = 0
= Distinto a != x != 0 x = 1
< Menor a < x < 0 x < 0
Menor o igual a <= x <= 0 x 0
> Mayor a > x > 0 x > 0
Mayor o igual a >= x >= 0 x 0
Operadores de Comparacion
Las instrucciones que nos ayudan a realizar operaciones de comparacion (booleanas)
son las siguientes:
If then else
if (Expresion Booleana){
// Aqu van las instrucciones que
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
16 Introduccion
// debe realizar en caso de que la
// expresion Booleana sea verdadera
}
else{
// Aqu van las instrucciones que
// debe realizar en caso de que la
// expresion Booleana sea falsa
}
1.2.9 Ciclos
While
while (Expresion Booleana){
// Algo debe ocurrir aqu
// Varias veces para que el ciclo
// cumpla con su funcion...
} // Este ciclo no requiere punto y coma al final...
do...while
do{
// Algo debe ocurrir aqu
// Varias veces para que el ciclo
// cumpla con su funcion...
} while (Expresion Booleana);
// Nota el punto y coma al final...
for
for (incializacion ; Expresion booleana ; Incremento){
// Algo debe ocurrir aqu
// Varias veces para que el ciclo
// cumpla con su funcion...
}
// Este ciclo tampoco requiere punto y coma al final...
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
1.2 Sintaxis del lenguaje C++ 17
1.2.10 Ejemplos de control de ujo
if...then...else
1 #include <stdio.h>
2 #include <iostream>
3
4 using namespace std;
5 int main(void){
6 char respuesta;
7 cout << "\n\nTe gusta el rock? [S/N] ";
8 cin >> respuesta;
9 if (respuesta == S){
10 // dice que s ...
11 cout << "\n\nQue bien,";
12 cout << "\nIgual a mi...";
13 }
14 else{
15 // dice que no...
16 cout << "\n\nBueno, creo que hay mejor musica...";
17 cout << "\nPor ejemplo, el Jazz...";
18 }
19 cout << "\n\n\n";
20 system ("PAUSE");
21 return 0;
22 }
for
1 #include <stdio.h>
2 #include <iostream>
3
4 using namespace std;
5 int main(void){
6 int total = 0,cuadrado;
7 cout << "\n\nCu antos cuadrados deseas calcular?";
8 cin >> total;
9 for (int i = 0 ; i <= total ; i++){
10 cuadrado = i
*
i;
11 cout << "\nEl cuadrado de " << i << " es: " << i
*
i;
12 }
13 cout << "\n\n\n";
14 system ("PAUSE");
15 return 0;
16 }
while
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
18 Introduccion
1 #include <stdio.h>
2 #include <iostream>
3
4 using namespace std;
5 int main(void){
6 int total = 0, i = 0, cuadrado;
7 cout << "\n\nCu antos cuadrados deseas calcular?";
8 cin >> total;
9 while (i <= total){
10 cuadrado = i
*
i;
11 cout << "\nEl cuadrado de " << i << " es: " << i
*
i;
12 i++;
13 }
14 cout << "\n\n\n";
15 system ("PAUSE");
16 return 0;
17 }
do...while
1 #include <stdio.h>
2 #include <iostream>
3
4 using namespace std;
5 int main(void){
6 int total = 0, i = 0, cuadrado;
7 cout << "\n\nCu antos cuadrados deseas calcular?";
8 cin >> total;
9 do{
10 cuadrado = i
*
i;
11 cout << "\nEl cuadrado de " << i << " es: " << i
*
i;
12 i++;
13 }while (i <= total);
14 cout << "\n\n\n";
15 system ("PAUSE");
16 return 0;
17 }
switch
1 #include <stdio.h>
2 #include <iostream>
3
4 using namespace std;
5 int main(void){
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
1.2 Sintaxis del lenguaje C++ 19
6 int calificacion;
7 cout << "\n\nQue calificacion obtuviste en tu examen? ";
8 cout << "\n(Introduce un numero entero) ";
9 cin >> calificacion;
10 switch (calificacion){
11 case 0:
12 cout << "\nCero!!!";
13 break;
14 case 1:
15 cout << "\nPor qu e?";
16 break;
17 case 2:
18 cout << "\nQu e te pas o?";
19 break;
20 case 3:
21 cout << "\nAy, no me digas!";
22 break;
23 case 4:
24 cout << "\nCaramba!!!!";
25 break;
26 case 5:
27 cout << "\nPor qu e no estudiaste?";
28 break;
29 case 6:
30 cout << "\nDebes echarle m as ganas...";
31 break;
32 case 7:
33 cout << "\nPasaste de panzaso";
34 break;
35 case 8:
36 cout << "\nQue bien...";
37 break;
38 case 9:
39 cout << "\nMuy bien...";
40 break;
41 case 10:
42 cout << "\nFelicidades!!!";
43 break;
44 default:
45 cout << "\nTe ped tu calificaci on,";
46 cout << "\nno tu edad!!!\n";
47 }
48 cout << "\n\n\n";
49 system ("PAUSE");
50 return 0;
51 }
Un ejemplo donde se generan las tablas de multiplicar:
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
20 Introduccion
1 #include <stdio.h>
2 #include <iostream>
3
4 using namespace std;
5 int main(void){
6 int i, j, k;
7 // Empiezan las tablas de multiplicar...
8 for (i = 1; i <= 12; i++){
9 cout << "Tabla del " << i << "\n";
10 for (j = 1 ; j <= 12 ; j++){
11 k = i
*
j;
12 cout << i << " x " << j << " = " << k << "\n";
13 }
14 cout <<"\n\n\n";
15 // Termino una tabla... voy con la siguiente...
16 }
17 cout << "\n\n\n";
18 system ("PAUSE");
19 return 0;
20 }
El siguiente genera las tablas de multiplicar, pero el usuario decide hasta
cual. Se utiliza un ciclo for innito para que el usuario pueda ingresar un
n umero entero positivo. En caso de que ingrese un n umero negativo o cero, el
programa enva un mensaje de error y le permite volver a ingresar el valor de
la ultima tabla a imprimir.
1 #include <stdio.h>
2 #include <iostream>
3
4 using namespace std;
5 int main(void){
6 int i, j, k;
7 int total;
8 for (;;){ // for infinito
9 cout << "\n\nCuantas tablas desea que se impriman? ";
10 cin >> total;
11 if (total <= 0){
12 cout << "\n\nError en argumento...";
13 cout << "\nDebe introducir un numero entero positivo...";
14 }
15 else{
16 // salir del for infinito...
17 break;
18 }
19 } // end for infinito...
20 cout << "\n\n\n"; // un poco de espacio
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
1.2 Sintaxis del lenguaje C++ 21
21 // Empiezan las tablas de multiplicar...
22 for (i = 1; i <= total; i++){
23 cout << "Tabla del " << i << "\n";
24 for (j = 1 ; j <= 12 ; j++){
25 k = i
*
j;
26 cout << i << " x " << j << " = " << k << "\n";
27 }
28 cout <<"\n\n\n";
29 // Termino una tabla... voy con la siguiente...
30 }
31 cout << "\n\n\n";
32 system ("PAUSE");
33 return 0;
34 }
1.2.11 Operaciones logicas
A las operaciones logicas tambien se les conocen en programacion como opera-
ciones booleanas.
AND: Se codica con la instruccion: &&.
Ejemplo:
if ((x != 0) && (divisor == 3))
{
// Aqu va a ocurrir algo...
}
//...
OR: Se codica con la instruccion: ||.
Ejemplo:
{if ((x > 0) || (divisor > 3))
{
// Aqu va a ocurrir otra cosa...
}
...
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
22 Introduccion
1.3 Funciones en C++
1.3.1 Funciones predenidas
En C
++
el truco de programar consiste en desmenuzar cada problema com-
plejo en sus partes m as elementales idependientes una de la otra. Es como si un
ser pluricelular lo separaras en sus celulas y trabajaras con cada una de ellas.
Cuando las juntes, todas van a trabajar como si fueran un ser completo, cada
una realizando su tarea, sin preocuparse de las otras partes.
En seguida se muestra una lista de las funciones predenidas en C
++
.
Nombre Descripcion Argumento Retorno Librera
sqrt raz cuadrada double double math.h
pow potencia double double math.h
abs valor absoluto int int math.h
labs valor absoluto long long stdlib.h
fabs valor absoluto doule double math.h
ceil cielo doule double math.h
floor piso doule double math.h
exp exp(x) doule double math.h
log ln(x) doule double math.h
log10 log
10
(x) doule double math.h
Funciones predenidas en C
++
Las funciones trigonometricas e hiperbolicas estan denidas en la librera math.h.
Nombre Descripcion Argumento Retorno
acos arco coseno double double
asin arco seno double double
atan arco tangente double double
cos coseno double double
cosh coseno hiperbolico double double
sin seno double double
sinh seno hiperbolico double double
tan tangente double double
tanh tangente hiperbolico double double
Funciones trigonometricas en C
++
Las funciones se invocan escribiendo primero el nombre de la funcion y despues,
entre parentesis, los argumentos que requiera la misma.
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
1.3 Funciones en C++ 23
La sintaxis es la siguiente.
Funcion (Argumento 1,Argumento 2, ,Argumento n);
Ejemplo:
pi = 3.1416;
radio = sqrt(area /pi);
edad = abs(year de nac - year actual);
base = 5;
exponente = 3;
potencia = pow(base,exponente);
1.3.2 Funciones denidas por el usuario
El programador de C
++
puede crear sus propias funciones.
Primero indicamos que tipo de valor nos devolvera. Despues indicamos el nom-
bre de la funcion. Inmediatamente despues se encierra entre parentesis los ar-
gumentos de la funcion, los cuales deben ir precedidos del tipo de dato que le
corresponde a cada uno.
Finalmente, entre corchetes debemos incluir las instrucciones que debe realizar
la funcion sobre la informacion que se le entregue.
Recuerda que debes denir la funcion como si se tratara de otra variable. Es
decir, debes denirla antes de hacer uso de ella en el cuerpo del programa.
La sintaxis es la siguiente:
Tipo devuelto Nombre funcion(Tipo 1 Arg 1,Tipo 2 Arg 2, ,Tipo n Arg n)
{// Aqu se incluyen las instrucciones de lo que debe
// realizar la funcion sobre los argumentos...
}
Ejemplo:
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
24 Introduccion
// Esta funcion calcula el p porciento de una cantidad C.
double porcentaje(double porciento,double cantidad)
{
double resultado; // defino una variable para almacenar ah el resultado...
resultado = porciento * cantidad / 100;
return resultado;
// la instruccion return devuelve el valor a la funcion que lo llamo...
// generalmente, a la funcion main()
}
La misma funcion anterior pudo denirse de la siguiente manera:
// Esta funcion calcula el p porciento de una cantidad C.
double porcentaje(double porciento,double cantidad)
{
return (porciento * cantidad / 100);
}
Funciones que he necesitado...
1 /
*
Nombre del archivo: prueba.cpp
2 Descripci on:
3 Este programa ayuda en la revisi on de funciones
4 definidas por el usuario...
5 ----------------------------------------------------
6 ----------------------------------------------------
7 Autor: Efra n Soto Apolinar
8 Email: efrain@yalma.fime.uanl.mx
9 Fecha de ultima Modificaci on: 24 de enero de 2008
10 Lenguaje de Programaci on: C++
11 Compilador: Dev - C++ Versi on 4.9.9.2.
12 ----------------------------------------------------
13 ----------------------------------------------------
14
*
/
15 #include <iostream> // Funciones b asicas para input/output
16 #include <stdlib.h> // para usar la funci on rand()
17 #include <math.h> // funciones matem aticas (sin (double))
18 #include <conio.h> // para usar: getche, getch
19 #include <ctime> // double difftime(time_t time2, time_t time1);
20
21 int errores; // variable global
22 int factorial(int n);
23 int permuta(int n, int k);
24 int potencia(int e);
25
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
1.3 Funciones en C++ 25
26 using namespace std;
27 int main(void)
28 {
29 char respuesta;
30 int n,total;
31 int i,j,k; // contadores
32 double pBin, pBer; // probabilidades
33 clock_t tiempo1,tiempo2;
34
35 cout << "\nEste programa sirve para verificar que";
36 cout << "\nlas funciones definidas m as abajo (en el c odigo)";
37 cout << "\nsean correctas......";
38 //
39 for (;;)
40 {tiempo1 = clock()/CLOCKS_PER_SEC;
41 cout << "\n\nPrimero verificamos que la funci on ";
42 cout << "\nfactorial no tenga errores: ";
43 cout << "\n\n\nIngresa un n umero natural";
44 cout << "para calcular su factorial ";
45 cin >> n;
46 cout << "\n\n\nEl factorial de " << n << " es: " << factorial(n);
47
48 cout << "\n\nAhora verificamos que la funci on ";
49 cout << "\nsubfactorial no tenga errores: ";
50 cout << "\n\n\nIngresa un n umero natural n";
51 cout << "\npara calcular las permutaciones ";
52 cin >> n;
53 cout << "\n\n\nIngresa un n umero natural k";
54 cout << "\npara las permutaciones ";
55 cin >> k;
56 cout << "\n\n\nEl resultado de combinar " << k;
57 cout << " de entre " << n << " es: " << permuta(n,k);
58
59 cout << "\n\nFinalmente verificamos que la funci on ";
60 cout << "\npotencia no tenga errores: ";
61 cout << "\n\n\nIngresa un n umero natural n";
62 cout << "\npara calcular 2n: ";
63 cin >> n;
64 cout << "\n\n\nEl resultado de elevar 2" << n;
65 cout << " es: " << potencia(n);
66
67 cout << "\n\nFinalmente verificamos el valor de ";
68 cout << "\nCLOCKS_PER_SECOND: ";
69 cout << CLOCKS_PER_SEC << endl;
70 cout << "\nTiempo 1 (inicio): " << tiempo1;
71 tiempo2 = clock()/CLOCKS_PER_SEC;
72 cout << "\nTiempo 2 (actual): " << tiempo2;
73
74 cout << "\n\nTotal de errores: " << errores;
75 //
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
26 Introduccion
76 cout << "\n\n\nPresione < S > para salir...";
77 respuesta = getche();
78 if ((respuesta == S)||(respuesta == s))
79 {
80 break; // Salir del ciclo for inicial...
81 }
82 cout <<"\n\n\n";
83 }
84 return 0;
85 }
86 /
**************************************
87 Declaro la funci on factorial...
88
***************************************
/
89 int factorial(int n)
90 {
91 int fi,i;
92 fi = i = 1;
93 while (i<=n)
94 {
95 fi
*
=i;
96 if (fi <= 0){ // por si se rebasa la memoria...
97 cout << "\n\n\nEl hecho de que sea computadora ";
98 cout << "\nno implica que haga milagros...\n";
99 cout << "\nLo siento, se rebas o la memoria...";
100 fi = 1;
101 errores++;
102 break;
103 }
104 i++;
105 }
106 return fi;
107 }
108 /
**************************************
109 Declaro la funci on permuta...
110
***************************************
/
111 int permuta(int n, int k)
112 {
113 int p,subfactorial,i;
114 i = n - k + 1; // n - k + 1 para calcular el subfactorial
115 // el subfactorial es el numerador de la f ormula para
116 // calcular las combinaciones n en k
117 //C(n,k) = (n-k+1)(n-k+2)...(n) / k!
118 subfactorial = 1; // reinicio el subfactorial
119 while (i<=n){
120 subfactorial
*
=i;
121 i++;
122 }
123 p = subfactorial / factorial(k);
124 // p siempre es entero...
125 return p;
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
1.3 Funciones en C++ 27
126 }
127 /
**************************************
128 Declaro la funci on potencia...
129
***************************************
/
130 int potencia(int e)
131 {// para calcular la potencia 2e
132 int i,potencia; // contador y resultado
133 potencia = 1;
134 for (i=1; i <= e; i++)
135 {
136 potencia
*
=2;
137 }
138 return potencia;
139 }
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
28 Introduccion
1.4 Clases
Yo me imagino las clases como tipos de datos que deno por comodidad.
Por ejemplo, si necesito trabajar con n umeros complejos, mejor deno un nuevo
tipo de variable con una clase. as, podre denir n umeros complejos como si se
tratara de un tipo de variable que ya estuviera denido en C
++
.
La idea es que ademas de declarar tipos de datos tambien podre denir funciones
y realizar operaciones con ellos, por ejemplo, sumarlos, multiplicarlos, etc.
1 /
*
2 Este programa crea una clase
3 que se llama n umero complejo
4
*
/
5 #include <iostream> // Funciones para input/output
6 #include <cstdlib> //
7
8 using namespace std;
9 class complejo{
10 public:
11 double real; // parte real del n umero complejo.
12 double imaginary; // parte imaginaria del # complejo
13 };
14 int main(void){
15 // defino una instancia de mi clase
16 // se trata de un n umero complejo
17 complejo z1;
18 z1.real = 3.14159; // parte real
19 z1.imaginary = 2.717281828; // parte imaginaria
20 cout << "\n\n\n";
21
22 cout << "\n\nParte real de z1 es z1.real = "
23 << z1.real;
24 cout << "\n\nParte compleja de z1 es z1.imaginary = "
25 << z1.imaginary;
26 cout << "\n\n";
27 system("PAUSE");
28 return 0;
29 }
El siguiente codigo muestra funciones pertenecientes a una clase.
1 /
*
2 Este programa crea una clase
3 que se llama n umero complejo.
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
1.4 Clases 29
4 Se muestra adem as el uso de funciones
5 definidas para las clases.
6
*
/
7 #include <iostream> // Funciones para input/output
8 #include <cstdlib> //
9 using namespace std;
10 class complejo{
11 public:
12 // para asignar la parte real
13 void DefinirReal(double r);
14 // para asignar la parte imaginaria
15 void DefinirImaginario(double i);
16 // para leer la parte real
17 double LeerReal(void);
18 // para leer la parte imaginaria
19 double LeerImaginario(void);
20 private:
21 double real; // parte real
22 double imaginary; // parte imaginaria
23 };
24 int main(void){
25 // defino una instancia de mi clase
26 complejo z1;
27 z1.DefinirReal(3.14159);
28 z1.DefinirImaginario(2.717281828);
29 cout << "\n\n\n";
30
31 cout << "\n\nEste programa muestra el uso de
32 funciones de clase.";
33 cout << "\n\nParte real de z1 se obiente con
34 z1.LeerReal(); = " << z1.LeerReal();
35 cout << "\n\nParte compleja de z1 se obtiene con
36 z1.LeerImaginario(); = " << z1.LeerImaginario();
37 cout << "\n\n";
38 system("PAUSE");
39 return 0;
40 }
41 // Ahora defino las funciones de la clase.
42
43 // para asignar la parte real
44 void complejo::DefinirReal(double r){
45 real = r;
46 }
47
48 // para asignar la parte imaginaria
49 void complejo::DefinirImaginario(double i){
50 imaginary = i;
51 }
52
53 // para leer la parte real
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
30 Introduccion
54 double complejo::LeerReal(void){
55 return(real);
56 }
57
58 // para leer la parte imaginaria
59 double complejo::LeerImaginario(void){
60 return(imaginary);
61 }
Debes notar que en el primer codigo se han denido las variables real e imaginary
como variables p ublicas, pero en el segundo ejemplo se han denido como vari-
ables privadas. De esta forma, no se puede tener acceso a ellas, salvo a traves
de las funciones que se denen en la clase.
En este ejemplo se trata de las funciones: LeerImaginario(), LeerReal(),
DefinirImaginario(double i), y DefinirReal(double r).
Observa tambien que las funciones de clase se denen con el siguiente codigo:
1 tipod clase::nombreFuncion(tipoa argumento){
2 // Instrucciones de la funci on...
3 .
4 .
5 .
6 }
tipod indica el tipo de valor que devolvera la funcion.
clase es el nombre de la clase a la que pertenece la funcion.
nombreFuncion es el nombre de la funcion.
tipoa es el tipo de variable que tendra el argumento.
argumento es el identicador de la variable que sera el argumento de la
funcion.
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2
Codigos
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
32 Codigos
2.1 Mis primeros programas
En este apartado se muestra el codigo de algunos programas basicos.
Estructura basica del programa.
0
/* Nombre del archivo: ProgramTemplate 1
Template - Esta es una estructura de base 2
para escribir programas en C
++
3
---------------------------------- 4
---------------------------------- 5
Nombre del Archivo: ProgramTemplate 6
Autor: Tu Nombre va aqu... 7
Email: tu.cuenta@tubuzon.mail.com 8
Descripcion: Estructura para programa 9
Fecha de ultima Modificacion: 17 de Noviembre del 2007 10
---------------------------------- 11
---------------------------------- 12
/ 13
#include <iostream> // Funciones basicas para input/output 14
#include <math.h> // funciones matematicas 15
using namespace std; 16
int main(int nNumberofArgs, char* pszArgs[]) 17
{ 18
// El codigo del programa C
++
debe estar encerrado entre llaves {} 19
// despues del la instruccion "main" 20
// (Bueno, en realidad se trata de una funcion...) 21
// La siguiente instruccion: system("PAUSE"); 22
// permite que el usuario haya ledo la informacion 23
// que se obtuvo como resultado de la ejecucion del programa... 24
system("PAUSE"); 25
return 0; 26
} 27
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.1 Mis primeros programas 33
Las reglas basicas del lenguaje C
++
.
#include <stdio.h>
int main()
{
printf("\n Los parentesis siempre aparecen en pares!");
printf("\n Los comentarios en una lnea se indican con //");
printf("\n O bien, se inician don /
*
");
printf("\n y se terminan con
*
/");
printf("\n cuando abarcan varias lneas...");
printf("\n Las instrucciones terminan con un punto y coma (;)");
printf("\n Los espacios son opcionales");
printf("\n Puedes dejar lneas en blanco entre el codigo");
printf("\n para hacerlo mas legible");
printf("\n Debe contener la funcion main()");
printf("\n C++ usa mayormente minusculas.");
printf("\n En C++ las letras mayusculas y las minusculas");
printf("\n no dan los mismos resultados en las instrucciones...");
return(0);
}
Calcula el area de un triangulo.
0
#include <iostream> 1
using namespace std; 2
int main(void) 3
{ 4
double area, base, altura; 5
string unidad; 6
cout << "Que unidad de medida usaras? "; 7
cin >> unidad; 8
cout << "Cuantos " << unidad << 9
"mide la base del triangulo? "; 10
cin >> base; 11
cout << "Cuantos " << unidad << 12
"mide la altura del triangulo? "; 13
cin >> altura; 14
area = base*altura/2; 15
cout << "El area del triangulo es: " 16
<< area << unidad << " cuadrados."; 17
system("PAUSE"); 18
return 0; 19
} 20
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
34 Codigos
Una tonelada metrica equivale a 35,273.92 onzas. Escribe un programa
que lea el peso de un paquete de cereal en onzas y la salida sea el peso en
toneladas metricas as como el n umero de cajas que se requieren para que pesen
una tonelada metrica. El programa debe permitir al usuario realizar el calculo
tantas veces como lo desee.
1
0
/* 1
Nombre del Archivo: proyecto1.cpp 2
Descripcion: En el encabezado... 3
Fecha de ultima Modificacion: 18 de Noviembre del 2007 */ 4
#include <iostream> 5
using namespace std; 6
int main(void) 7
{ 8
double pesoOnzas, pesoTon, n; 9
double coef=35273.92; 10
char respuesta = c; 11
for (;;) 12
{ 13
cout << "Cual es el peso de un paquete en onzas?: "; 14
cin >> pesoOnzas; 15
pesoTon = pesoOnzas / coef; 16
n = coef / pesoTon; 17
cout << "Un paquete pesa " << pesoTon << " Toneladas Metricas.\n\n"; 18
cout << "Se requieren " << n << "cajas de cereal\n"; 19
cout << "para que pesen una Tonelada Metrica,\n"; 20
cout << "dado que 1 TM = 35,273.92 onzas.\n\n"; 21
cout << "Presione < S > para salir o < C > para continuar...."; 22
cin >> respuesta; 23
if ((respuesta == S)||(respuesta == s)) 24
{ break; // Salir del ciclo... 25
} 26
cout <<"\n\n\n"; 27
} 28
return 0; // Le indico que devuelva cero la funcion "main()" 29
} 30
1
A partir de este programa se omiten el autor y el correo electronico del mismo. En todos
los casos se trata del autor de este material.
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.1 Mis primeros programas 35
Un laboratorio de investigacion ha concluido que el azucar X, un endulzante
articial dietetico, causara la muerte de ratones de laboratorio. Un paciente
desea conocer cuanto refresco de cola endulzado con el azucar X puede tomar
sin morir. Escribe un programa para encontrar la respuesta. La entrada es la
cantidad (en gramos) de azucar X requerida para matar a un raton, el peso del
raton y el peso del paciente. Para asegurar la integridad del paciente, indica el
peso a cual el paciente dejara de controlar su dieta, en lugar de su peso actual.
Suponga que el refresco de cola contiene un decimo de porciento de az ucar X.
El programa debe repetirse tantas veces como el usuario requiera.
0
/* Nombre del Archivo: proyecto2.cpp 1
Fecha de ultima Modificacion: 18 de Noviembre del 2007 */ 2
#include <iostream> 3
using namespace std; 4
int main(void) 5
{ 6
double pesoPac, pesoRat, dosisRat, dosisPac; 7
double ratio=0.001; 8
char respuesta = c; 9
for (;;) { 10
cout << "Cual es el peso del raton? [gr]: "; 11
cin >> pesoRat; 12
cout << "Cual es la dosis mortal para el raton?: "; 13
cin >> dosisRat; 14
cout << "Cual es el peso deseado del paciente? [kg]: "; 15
cin >> pesoPac; 16
// Calculos... 17
dosisPac= 1000*dosisRat * pesoPac / pesoRat; // dosis de pura azucar X 18
dosisPac = dosisPac / ratio; // dosis de refresco... 19
cout << "El paciente no debe exceder de " << dosisPac << 20
" gramos de refresco endulzado con Azucar X, \n"; 21
cout << "para que su integridad fsica este a salvo. \n"; 22
cout << "Presione < S > para salir o < C > para continuar...."; 23
cin >> respuesta; 24
if ((respuesta == S)||(respuesta == s)) 25
{ break; // Salir del ciclo... 26
} 27
cout <<"\n\n\n"; 28
} 29
return 0; // Le indico que devuelva cero la funcion "main()" 30
} 31
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
36 Codigos
Los trabajadores de una compa na en particular han ganado un 7.6% de
incremento retroactivo a seis meses. Escribe un programa que toma el salario
promedio anual como entrada y da como salida el pago retroactivo al empleado,
el nuevo salario anual y el nuevo salario mensual. Usa la declaracion de variable
con el modicador const para expresar el aumento en el salario. El programa
debe permitir realizar el calculo tantas veces como se requiera.
0
/* Nombre del Archivo: proyecto3.cpp 1
Descripcion: Ver el encabezado... 2
Fecha de ultima Modificacion: 20 de Noviembre del 2007 */ 3
#include <iostream> 4
using namespace std; 5
int main(void) 6
{ 7
double salarioInicial, salarioFinal, salarioMensual, retro; 8
double aumento=0.076; 9
int meses; 10
char respuesta = c; 11
for (;;) 12
{ cout << "Cual es el salario anual inicial del trabajador [en pesos]? "; 13
cin >> salarioInicial; 14
cout << "Cuantos meses se aplican de retroactivo [n<=6]? "; 15
cin >> meses; 16
retro = meses * aumento * salarioInicial; 17
salarioFinal = salarioInicial * (1 + aumento); 18
salarioMensual = salarioFinal/12; 19
cout << "El monto del retroactivo es de: " << retro << " pesos.\n\n"; 20
cout << "El nuevo salario anual es de: " << salarioFinal << " pesos,\n"; 21
cout << "y equivale a: " << salarioMensual << " pesos mensuales.\n\n"; 22
cout << "Presione < S > para salir o < C > para continuar...."; 23
cin >> respuesta; 24
if ((respuesta == S)||(respuesta == s)) 25
{ break; // Salir del ciclo... 26
} 27
cout <<"\n\n\n"; 28
} 29
return 0; 30
} 31
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.1 Mis primeros programas 37
Elaborar un programa que calcule el factorial de un n umero entero positivo.
0
/* Nombre del Archivo: factorial.cpp 1
Autor: Efran Soto Apolinar. 2
Email: efra.soto.a@gmail.com 3
Descripcion: Ver el encabezado... 4
Fecha de ultima Modificacion: 22 de Noviembre del 2007 */ 5
#include <iostream> 6
using namespace std; 7
int main(void) 8
{ 9
int i,n,factorial; 10
char respuesta = c; 11
for ( ; ; ){ 12
cout << "Este programa calcula el valor del factorial \n"; 13
cout << "de un numero entero positivo\n"; 14
cout << "Introduzca el valor de n: "; 15
cin >> n; 16
factorial=1; 17
for (i = 1; i <= n ;i++) 18
{ factorial *=i;} 19
cout << "El factorial del numero " << n << " es: " << factorial << "\n\n\n"; 20
cout << "Presione < S > para salir o < C > para continuar...."; 21
cin >> respuesta; 22
if ((respuesta == S)||(respuesta == s)) 23
{ 24
break; // Salir del ciclo... 25
} 26
cout <<"\n\n\n"; 27
} 28
return 0; 29
} 30
31
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
38 Codigos
2.2 Programas con funciones
En los siguientes ejemplos, los codigos incluyen programas que hacen llamadas
a funciones que se denen en los mismos.
Generar un programa donde se dena una funcion que calcule el factorial de
un n umero natural dado.
0
/* Nombre del archivo: proyecto4.cpp 1
Nombre del Archivo: proyecto4.cpp 2
Descripcion: Ver el encabezado... 3
Fecha de ultima Modificacion: 01 de Diciembre del 2007 */ 4
#include <iostream> 5
using namespace std; 6
int main(void) 7
{ int f,n,i; 8
int factorial(int n); // Declaro la funcion antes de usarla... 9
char respuesta = c; 10
for ( ; ;) 11
{ cout << "Ingresa el numero natural para el cual \n"; 12
cout << "deseas calcular el factorial. "; 13
cin >> n; 14
f = factorial(n); // Aqu llamo la funcion factorial... 15
cout << " \n\n\n"; cout << "El factorial del numero " << n << " es: 16
" << f << " \n\n\n"; 17
cout << "Presione < S > para salir o < C > para continuar...."; 18
cin >> respuesta; 19
if ((respuesta == S)||(respuesta == s)) 20
{ cout <<"\n\n\n\n"; 21
break; } 22
} 23
return 0; 24
} 25
// Declaro la funcion factorial... 26
int factorial(int n) 27
{ int fi,i; 28
fi = i = 1; 29
while (i<=n) 30
{ 31
fi *=i; 32
i++; 33
} 34
return fi; 35
} 36
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.3 Funciones cin, cout 39
2.3 Funciones cin, cout
En esta seccion se enumeran programas sencillos que serviran de ejemplo para
otros ejercicios.
Calcular el promedio. o
1 /
*
Nombre del archivo: UnoUno.cpp
2 Descripci on:
3 Escribir un programa que calcule la media real de 3
4 n umeros enteros dados por el usuario.
5 Fecha de ultima Modificaci on: 03 de enero del 2008
6 ----------------------------------
7 ----------------------------------
8
*
/
9 #include <iostream> // Funciones b asicas para input/output
10 using namespace std;
11 int main(void){
12 int a,b,c;
13 double promedio;
14 cout << "\nEscribe el primer n umero entero: ";
15 cin >> a;
16 cout << "\nEscribe el segundo n umero entero: ";
17 cin >> b;
18 cout << "\nEscribe el tercer n umero entero: ";
19 cin >> c;
20 promedio = double(a + b + c)/3.0;
21 cout << "\nEl promedio de estos valores es: "
22 << promedio << endl;
23 system("PAUSE");
24 return 0;
25 }
Calcular la suma de dos n umeros. o
1 /
*
Nombre del archivo: UnoDos.cpp
2 Descripci on:
3 Escribir un programa que calcule la suma de 2
4 n umeros enteros dados por el usuario.
5 Fecha de ultima Modificaci on: 03 de enero del 2008
6 ----------------------------------
7 ----------------------------------
8
*
/
9 #include <iostream> // Funciones b asicas para input/output
10 using namespace std;
11 int main(void){
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
40 Codigos
12 int a,b;
13 cout << "\nEscribe el primer n umero entero: ";
14 cin >> a;
15 cout << "\nEscribe el segundo n umero entero: ";
16 cin >> b;
17 cout << (a + b) << endl;
18 system("PAUSE");
19 return 0;
20 }
Calcular la diferencia de dos n umeros. o
1 /
*
Nombre del archivo: UnoTres.Cpp
2 Descripci on:
3 Escribir un programa que pida dos n umeros y
4 muestre la diferencia de ambos.
5 Fecha de ultima Modificaci on: 03 de enero del 2008
6 ----------------------------------
7 ----------------------------------
8
*
/
9 #include <iostream> // Funciones b asicas para input/output
10 using namespace std;
11 int main(void){
12 int a,b;
13 cout << "\nEscribe el minuendo: ";
14 cin >> a;
15 cout << "\nEscribe el sustraendo: ";
16 cin >> b;
17 cout << (a - b) << endl;
18
19 system("PAUSE");
20 return 0;
21 }
Intercambiar el valor de dos variables. o
1 /
*
Nombre del archivo: UnoCuatro.cpp
2 Descripci on:
3 Dados dos n umeros que introducir a el usuario,
4 escribir un programa que intercambie sus valores.
5 Fecha de ultima Modificaci on: 03 de enero del 2008
6 ----------------------------------
7 ----------------------------------
8
*
/
9 #include <iostream> // Funciones b asicas para input/output
10 using namespace std;
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.3 Funciones cin, cout 41
11 int main(void){
12 double a,b,temp;
13 cout << "\nEscribe el primer valor: ";
14 cin >> a;
15 cout << "\nEscribe el segundo valor: ";
16 cin >> b;
17 temp = a;
18 a = b;
19 b = temp;
20 cout << "\nLos valores intercambiados de orden son: "
21 << a << " y " << b << endl;
22 system("PAUSE");
23 return 0;
24 }
Insertar un dato tipo string. o
1 /
*
Nombre del archivo: UnoCinco.cpp
2 Descripci on:
3 Escribir un programa que pida el nombre y el apellido
4 paterno de una persona y lo muestre en pantalla de la
5 forma apellido paterno, nombre.
6 Fecha de ultima Modificaci on: 03 de enero del 2008
7 ----------------------------------
8 ----------------------------------
9
*
/
10 #include <iostream> // Funciones b asicas para input/output
11 using namespace std;
12 int main(void){
13 char nombre[15], aPaterno[15], aMaterno[15];
14 cout << "Escribe tu nombre: ";
15 gets(nombre);
16 cout << "\nEscribe tu apellido paterno: ";
17 gets(aPaterno);
18 cout << "\nEscribe tu apellido materno: ";
19 gets(aMaterno);
20 cout << "\n\nTu nombre es: \n" << aPaterno << " "
21 << aMaterno << ", " << nombre << "\n";
22 system("PAUSE");
23 return 0;
24 }
Convertir grados sexagesimales a radianes. o
1 /
*
Nombre del archivo: UnoSeis.cpp
2 Descripci on:
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
42 Codigos
3 Escribir un programa que acepte el valor de un angulo
4 medido en grados sexagesimales e imprima su valor en
5 radianes.
6 Nota: Utiliza Pi = 3.141592654
7 Fecha de ultima Modificaci on: 03 de enero del 2008
8 ----------------------------------
9 ----------------------------------
10
*
/
11 #include <iostream> // Funciones b asicas para input/output
12 using namespace std;
13 int main(void){
14 const double pi = 3.141592654;
15 double grados, rad;
16 cout << "\nEscribe la medida del angulo en grados
17 sexagesimales: ";
18 cin >> grados;
19 rad = grados
*
pi / 180;
20 cout << "\nLa medida del angulo en radianes es: "
21 << rad << endl;
22 system("PAUSE");
23 return 0;
24 }
Calcular el volumen de una esfera. o
1 /
*
Nombre del archivo: UnoSiete.cpp
2 Descripci on:
3 El volumen de una esfera puede calcularse con
4 V = 4
*
Pi
*
r3 / 3.
5 Escribir un programa que solicite el radio de
6 una esfera e imprima su volumen.
7
8 Fecha de ultima Modificaci on: 03 de enero del 2008
9 ----------------------------------
10 ----------------------------------
11
*
/
12 #include <iostream> // Funciones b asicas para input/output
13 using namespace std;
14 int main(void){
15 double r, volumen;
16 const double pi = 3.141592654;
17 cout << "\nEscribe el radio de la esfera: ";
18 cin >> r;
19 volumen = 4
*
pi
*
r
*
r
*
r / 3;
20 cout << "\nEl volumen de esa esfera es: "
21 << volumen << endl;
22 system("PAUSE");
23 return 0;
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.3 Funciones cin, cout 43
24 }
Calcular area del crculo y permetro de circunferencia. o
1 /
*
Nombre del archivo: UnoOcho.cpp
2 Descripci on:
3 El area de un c rculo es :
4 A = Pi
*
r2
5 La longitud de la circunferencia es:
6 P = 2
*
Pi
*
r
7 Escribir un programa que solicite el radio de un
8 c rculo e imprima en pantalla su per metro y su area.
9
10 Fecha de ultima Modificaci on: 03 de enero del 2008
11 ----------------------------------
12 ----------------------------------
13
*
/
14 #include <iostream> // Funciones b asicas para input/output
15 using namespace std;
16 int main(void){
17 double r, perimetro, area;
18 const double pi = 3.141592654;
19 cout << "\nEscribe el radio del c rculo: ";
20 cin >> r;
21 perimetro = 2
*
pi
*
r;
22 area = pi
*
r
*
r;
23 cout << "\nEl area del c rculo es: " << area;
24 cout << "\nEl perimetro de la circunferenca es: "
25 << perimetro << endl;
26 system("PAUSE");
27 return 0;
28 }
Realizar calculos relacionados con un viaje. o
1 /
*
Nombre del archivo: UnoNueve.cpp
2 Descripci on:
3 Escribir un programa que pida el total de kil ometros
4 recorridos, el precio de la gasolina (por litro),
5 el dinero de gasolina gastado en el viaje (en pesos)
6 y el tiempo que se ha tardado (en horas y minutos)
7 en ese viaje.
8 Calcular, adem as:
9 - Consumo de gasolina por cada 100 Km
10 - Consumo de gasolina por cada Km
11 - Velocidad media
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
44 Codigos
12
13 Fecha de ultima Modificaci on: 03 de enero del 2008
14 ----------------------------------
15 ----------------------------------
16
*
/
17 #include <iostream> // Funciones b asicas para input/output
18 using namespace std;
19 int main(void){
20 int KmR, Hrs, Min;
21 double PrecioGas, ImporteGas, Tiempo, VelKmH, VelMS;
22 double ConsumoGasPC, ConsumoGasP, ConsumoGasLC, ConsumoGasL;
23 cout << "\nEscribe la distancia recorrida en kil ometros: ";
24 cin >> KmR;
25 cout << "\nEscribe el precio de un litro de gasolina: ";
26 cin >> PrecioGas;
27 cout << "\nEscribe el importe gastado en gasolina: ";
28 cin >> ImporteGas;
29 cout << "\n\nEscribe el tiempo que tard o el viaje. ";
30 cout << "\nPrimero indica los minutos y despu es
31 los segundos... ";
32 cout << "\nHoras: ";
33 cin >> Hrs;
34 cout << "\nMinutos: ";
35 cin >> Min;
36 // Aquu van los c alculos...
37 Tiempo = Hrs + Min / 60; // Tiempo en formato double...
38 VelKmH = KmR / Tiempo;
39 VelMS = VelKmH
*
1000 / 3600;
40 ConsumoGasL = ImporteGas / PrecioGas;
41 ConsumoGasP = ConsumoGasL
*
PrecioGas;
42 ConsumoGasLC =ConsumoGasL
*
100;
43 ConsumoGasPC =ConsumoGasP
*
100;
44 cout << "\n\nLa velocidad promedio de ese viaje es: \n"
45 << VelKmH << " Kil ometros por hora " ;
46 cout << "\no bien...";
47 cout << "\n\nLa velocidad promedio de ese viaje es: \n"
48 << VelMS << " metros por segundo" ;
49 cout << "\nSe consumieron: " << ConsumoGasL
50 << " litros de gasolina por cada kil ometro recorrido" ;
51 cout << "\nSe consumieron: " << ConsumoGasLC
52 << " litros de gasolina por cada cien kil ometros" ;
53 cout << "\n\no bien...";
54 cout << "\nSe consumieron: " << ConsumoGasP
55 << " pesos de gasolina por cada kil ometro recorrido" ;
56 cout << "\nSe consumieron: " << ConsumoGasPC
57 << " pesos de gasolina por cada cien kil ometros" << endl;
58 system("PAUSE");
59 return 0;
60 }
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.3 Funciones cin, cout 45
Calcular pendiente y ecuacion de una recta.
o
1 /
*
Nombre del archivo: UnoDiez.cpp
2 Descripci on:
3 Escribir un programa que encuentre la ecuaci on de
4 la recta que pasa por los dos puntos dados por el
5 usuario A(x_a, y_a), y B(x_b, y_b).
6 Indicar adem as sus intersecciones con los ejes
7 coordenados.
8
9 Fecha de ultima Modificaci on: 03 de enero del 2008
10 ----------------------------------
11 ----------------------------------
12
*
/
13 #include <iostream> // Funciones b asicas para input/output
14 using namespace std;
15 int main(void){
16 int x_a, x_b, y_a, y_b, Dx, Dy, b;
17 double m;
18 cout << "\nEste programa calcula la pendiente de una recta ";
19 cout << "\na partir de las coordenadas de dos puntos
20 por los cuales pasa... ";
21 cout << "\nEscriba las coordenadas de acuerdo a como
22 se piden: ";
23 cout << "\nCoordenada x del punto A: ";
24 cin >> x_a;
25 cout << "\nCoordenada y del punto A: ";
26 cin >> y_a;
27 cout << "\nCoordenada x del punto B: ";
28 cin >> x_b;
29 cout << "\nCoordenada y del punto B: ";
30 cin >> y_b;
31 // C alculos...
32 Dx = x_b - x_a;
33 Dy = y_b - y_a;
34 m = Dy / Dx;
35 b = Dx
*
y_a - Dy
*
x_a;
36 cout << "\nLa pendiente de la recta que pasa por esos dos
37 puntos es: " << m;
38 cout << "\ny su ecuaci on es: \n\n" << Dy << "x + " << -Dx
39 << "y +" << b << "= 0.";
40 cout << endl;
41 system("PAUSE");
42 return 0;
43 }
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
46 Codigos
2.4 if, for, while and the like...
Las operaciones booleanas (comparaciones) y los ciclos nos permiten controlar
el ujo del programa.
Decidir si el usuario es mayor de edad. o
1 /
*
2 Nombre del archivo: DosUno.cpp
3 Descripci on:
4 Escribir un programa que solicite la edad del usuario
5 y decida si es o no mayor de edad.
6 Considera a una persona mayor de edad si tiene al menos
7 18 a nos cumplidos.
8
9 Fecha de ultima Modificaci on: 04 de enero del 2008
10 ----------------------------------
11 ----------------------------------
12
*
/
13 #include <iostream> // Funciones b asicas input/output
14 using namespace std;
15 int main(void){
16 int edad;
17 cout << "\nEste programa decide si el usuario es mayor
18 de edad o no ";
19 cout << "\na partir de su edad... ";
20 cout << "\n\nCu al es tu edad? ";
21 cin >> edad;
22 if (edad > 17) {
23 cout << "\n\nEl usuario es mayor de edad \n";
24 }
25 else{
26 cout << "\n\nEl usuario es menor de edad \n";
27 }
28 system("PAUSE");
29 return 0;
30 }
Indicar el nombre del mes a partir de un n umero. o
1 /
*
Nombre del archivo: DosDos.cpp
2 Descripci on:
3 Escribir un programa que pida un n umero del 1 al 12
4 (inclusive) e imprima a qu e mes del a no corresponde
5 ese valor.
6
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.4 if, for, while and the like... 47
7 Fecha de ultima Modificaci on: 04 de enero del 2008
8 ----------------------------------
9 ----------------------------------
10
*
/
11 #include <iostream> // Funciones b asicas input/output
12 using namespace std;
13 int main(void){
14 int mes;
15 cout << "\nEste programa imprime el nombre del mes ";
16 cout << "\na partir del n umero que le corresponde... ";
17 cout << "\nIndique el n umero del mes ";
18 cin >> mes;
19 cout << endl;
20 if (mes == 1){
21 cout << "El mes " << mes << " corresponde a Enero.";
22 }
23 if (mes == 2){
24 cout << "El mes " << mes << " corresponde a Febrero.";
25 }
26 if (mes == 3){
27 cout << "El mes " << mes << " corresponde a Marzo.";
28 }
29 if (mes == 4){
30 cout << "El mes " << mes << " corresponde a Abril.";
31 }
32 if (mes == 5){
33 cout << "El mes " << mes << " corresponde a Mayo.";
34 }
35 if (mes == 6){
36 cout << "El mes " << mes << " corresponde a Junio.";
37 }
38 if (mes == 7){
39 cout << "El mes " << mes << " corresponde a Julio.";
40 }
41 if (mes == 8){
42 cout << "El mes " << mes << " corresponde a Agosto.";
43 }
44 if (mes == 9){
45 cout << "El mes " << mes << " corresponde a Septiembre.";
46 }
47 if (mes == 10){
48 cout << "El mes " << mes << " corresponde a Octubre.";
49 }
50 if (mes == 11){
51 cout << "El mes " << mes << " corresponde a Noviembre.";
52 }
53 if (mes == 12){
54 cout << "El mes " << mes << " corresponde a Diciembre.";
55 }
56 // por si el usuario es medio g uey...
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
48 Codigos
57 if ((mes > 12) || (mes < 1)){
58 cout << "El mes " << mes << " no existe." ;
59 }
60 cout << endl;
61 system("PAUSE");
62 return 0;
63 }
El mismo programa que el anterior, pero ahora utilizando la sentencia switch
o
1 /
**************************************************
2 Nombre del Archivo: DosDosSwitch.cpp
3 Autor: Efra n Soto Apolinar
4 Email: efra.soto.a@gmail.com
5 Descripci on:
6 Escribir un programa que pida un n umero del 1 al 12
7 (inclusive) e imprima a qu e mes del a no corresponde
8 ese valor.
9
10 Fecha de ultima Modificaci on: 23 de marzo de 2008
11
*****************************************************
/
12 #include <iostream> // Funciones b asicas input/output
13 using namespace std;
14 int main(void){
15 int mes;
16 cout << "\nEste programa imprime el nombre del mes ";
17 cout << "\na partir del n umero que le corresponde... ";
18 cout << "\nIndique el n umero del mes ";
19 cin >> mes;
20 switch (mes){
21 case 1:
22 cout << "\nEl mes " << mes << " corresponde a Enero.\n" ;
23 break;
24 case 2:
25 cout << "\nEl mes " << mes << " corresponde a Febrero.\n" ;
26 break;
27 case 3:
28 cout << "\nEl mes " << mes << " corresponde a Marzo.\n" ;
29 break;
30 case 4:
31 cout << "\nEl mes " << mes << " corresponde a Abril.\n" ;
32 break;
33 case 5:
34 cout << "\nEl mes " << mes << " corresponde a Mayo.\n" ;
35 break;
36 case 6:
37 cout << "\nEl mes " << mes << " corresponde a Junio.\n" ;
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.4 if, for, while and the like... 49
38 break;
39 case 7:
40 cout << "\nEl mes " << mes << " corresponde a Julio.\n" ;
41 break;
42 case 8:
43 cout << "\nEl mes " << mes << " corresponde a Agosto.\n" ;
44 break;
45 case 9:
46 cout << "\nEl mes " << mes << " corresponde a Septiembre.\n" ;
47 break;
48 case 10:
49 cout << "\nEl mes " << mes << " corresponde a Octubreo.\n" ;
50 break;
51 case 11:
52 cout << "\nEl mes " << mes << " corresponde a Noviembre.\n" ;
53 break;
54 case 12:
55 cout << "\nEl mes " << mes << " corresponde a Diciembre.\n" ;
56 break;
57 default:
58 // Error en argumento...
59 cout << "\nEl mes " << mes << " no existe.\n" ;
60 } // end switch
61 cout << "\n\n\n";
62 system("PAUSE");
63 return 0;
64 }
Calcular una potencia. o
1 /
*
Nombre del archivo: DosTres.cpp
2 Descripci on:
3 Calcular a elevado a la potencia b.
4
5 Fecha de ultima Modificaci on: 05 Enero 2008
6 ----------------------------------
7 ----------------------------------
8
*
/
9 #include <iostream> // Funciones b asicas input/output
10 using namespace std;
11 int main(void){
12 int i, exponente, base;
13 double potencia;
14 cout << "\nEste programa calcula la potencia de un n umero ";
15 cout << "\nsiendo la base y el exponente n umeros enteros ";
16 cout << "\nIngresa el valor de la base: ";
17 cin >> base;
18 cout << "\nIngresa el valor del exponente: ";
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
50 Codigos
19 cin >> exponente;
20 potencia = 1;
21 if (exponente == 0){
22 potencia = 1;
23 }
24 if (exponente > 0){
25 for (i=1 ; i<=exponente ; i++){
26 potencia
*
= base;
27 }
28 }
29 if (exponente < 0){
30 for (i=-1 ; i>=exponente ; i--){
31 potencia /= double(base);
32 // la instrucci on double(var)
33 // convierte un entero a tipo double...
34 }
35 }
36 cout << "\nEl resultado de elevar el n umero: " << base
37 << " a la potencia " << exponente << " es: " << potencia
38 << endl;
39 system("PAUSE");
40 return 0;
41 }
Pedir dos n umeros y su suma. o
1 /
***************************************************
2 Nombre del archivo: DosCuatro.cpp
3 Descripci on:
4 Escribir un programa que pida dos n umeros a, b
5 y despu es solicite la suma de ambos.
6 En caso de que la suma sea incorrecta indicarlo y dar
7 oportunidad para que escriba de nuevo el resultado.
8
9 Fecha de ultima Modificaci on: 04 Enero 2008
10
****************************************************
/
11 #include <iostream> // Funciones b asicas input/output
12 using namespace std;
13 int main(void){
14 int a,b,suma;
15 char respuesta;
16 cout << "\nEste pide dos n umeros enteros ";
17 cout << "\ny solicita su suma ";
18 cout << "\nEn caso de error te permite volver a intentar.";
19 cout << "\nIntroduce el primer n umero entero: ";
20 cin >> a;
21 cout << "\nIntroduce el segundo n umero entero: ";
22 cin >> b;
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.4 if, for, while and the like... 51
23 for (;;){
24 cout << "\nIntroduce la suma de los n umeros: ";
25 cin >> suma;
26 if (suma == (a+b)){
27 cout << "\nCorrecto!!!\n\n ";
28 break;
29 // sale del ciclo for
30 }
31 else{
32 cout << "\nIncorrecto!!!";
33 }
34 cout << "Presione < S > para salir o < C > para
35 continuar...";
36 cin >> respuesta;
37 if ((respuesta == S)||(respuesta == s)){
38 break; // Salir del ciclo...
39 }
40 cout <<"\n\n\n";
41 }
42 system("PAUSE");
43 return 0;
44 }
Pedir dos n umeros y un operador para realizar el calculo. o
1 /
*
Nombre del archivo: DosCinco.cpp
2 Descripci on:
3 Escribir un programa que solicite al usuario dos
4 n umeros y una operaci on y mostrar el resultado
5 de esa operaci on con esos dos n umeros.
6
7 Fecha de ultima Modificaci on: 05 Enero 2008
8 ----------------------------------
9 ----------------------------------
10
*
/
11 #include <iostream> // Funciones b asicas input/output
12 using namespace std;
13 int main(void){
14 double a,b,resultado;
15 char operacion;
16 cout << "\nEste pide dos n umeros enteros ";
17 cout << "\ny solicita un operador ";
18 cout << "\nDespu es te muestra el resultado... ";
19 cout << "\nIntroduce el primer n umero entero: ";
20 cin >> a;
21 cout << "\nIntroduce el segundo n umero entero: ";
22 cin >> b;
23 cout << "\nIntroduce el operador: ";
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
52 Codigos
24 cin >> operacion;
25 if (operacion == +){
26 resultado = a + b;
27 }
28 if (operacion == -){
29 resultado = a - b;
30 }
31 if (operacion ==
*
){
32 resultado = a
*
b;
33 }
34 if (operacion == /){
35 resultado = a / b;
36 }
37 cout << endl << "\t" << a << " " << operacion
38 << " " << b << " = " << resultado << endl;
39 system("PAUSE");
40 return 0;
41 }
Calcular el valor absoluto de un n umero. o
1 /
*
Nombre del archivo: DosSeis.cpp
2 ----------------------------------
3 ----------------------------------
4 Nombre del Archivo: DosSeis.cpp
5 Autor: Efra n Soto Apolinar
6 Email: efra.soto.a@gmail.com
7 Descripci on:
8 Escribir un programa que calcule el valor absoluto
9 de un n umero introducido por el usuario.
10
11 Fecha de ultima Modificaci on: 05 Enero 2008
12 ----------------------------------
13 ----------------------------------
14
*
/
15 #include <iostream> // Funciones b asicas input/output
16 using namespace std;
17 int main(void){
18 double a, absa;
19 cout << "\nEste pide un n umero real ";
20 cout << "\ny calcula su valor absoluto ";
21 cout << "\nIntroduce un n umero real: ";
22 cin >> a;
23 if (a>=0){
24 absa = a;
25 }
26 else{
27 absa = -a;
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.4 if, for, while and the like... 53
28 }
29 cout << "\nEl valor absoluto del n umero real: " << a
30 << " es: " << "\t" << absa << endl;
31 system("PAUSE");
32 return 0;
33 }
Calcular el area de un triangulo a partir de la medida de sus lados
2
. o
1 /
*
Nombre del archivo: DosSiete.cpp
2 Descripci on:
3 Escribir un programa que calcule el area de un
4 tri angulo conocidos las longitudes de sus tres lados.
5 Sugerencia: Aplica la f ormula de Her on:
6 A = sqrt(p
*
(p-a)
*
(p-b)
*
(p-c))
7 donde:
8 a,b,c son las longitudes de los lados del tri angulo, y
9 p es el semiper metro del tri angulo, es decir,
10 p = (a + b + c) / 2
11
12 Fecha de ultima Modificaci on: 05 Enero 2008
13 ----------------------------------
14 ----------------------------------
15
*
/
16 #include <iostream> // Funciones b asicas input/output
17 #include <math.h> // Funciones matem aticas
18 using namespace std;
19 int main(void){
20 double a,b,c,p,area;
21 cout << "\nEste programa calcula el area de un ";
22 cout << "\ntri angulo a partir de la medida de sus lados.";
23 cout << "\nIntroduce la medida del primer lado: ";
24 cin >> a;
25 cout << "\nIntroduce la medida del segundo lado: ";
26 cin >> b;
27 cout << "\nIntroduce la medida del tercer lado: ";
28 cin >> c;
29 if (((a + b) > c) && ((b + c) > a) && ((a + c) > b)){
30 // verifico que cumpla la desigualdad del tri angulo...
31 // la suma de dos lados siempre es mayor al tercero...
32 p = (a + b + c)/2; // Semiper metro
33 area = sqrt(p
*
(p-a)
*
(p-b)
*
(p-c));
34 cout << "\nEl area de el tri angulo es:" << area
35 << endl;
36 }
37 else{
2
Observe se aplica la desigualdad del tri angulo en la condici on If.
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
54 Codigos
38 // por ejemplo, si ingres o:
39 // primer lado = 100, segundo lado = 1, tercer lado = 1
40 cout << "\nEs imposible construir un tri angulo ";
41 cout << "\ncon esas longitudes para sus lados. "
42 // i.e., pareces g uey!!!
43 << endl;
44 }
45 system("PAUSE");
46 return 0;
47 }
Calcular la distancia de un punto a una recta. o
1 /
*
Nombre del archivo: DosOcho.cpp
2 Descripci on:
3 Escribir un programa que calcule la distancia
4 desde el punto P(x_0, y_0) a la recta
5 Ax+By+C=0.
6
7 Fecha de ultima Modificaci on: 05 de enero de 2008
8 ----------------------------------
9 ----------------------------------
10
*
/
11 #include <iostream> // Funciones b asicas input/output
12 #include <math.h> // Funciones matem aticas
13 using namespace std;
14 int main(void){
15 double A,B,C,x_0,y_0,d;
16 cout << "\nEste programa calcula la distancia desde el ";
17 cout << "\npunto P(x_0, y_0) hasta la recta: Ax + By + C = 0";
18 cout << "\nIntroduce el coeficiente A: ";
19 cin >> A;
20 cout << "\nIntroduce el coeficiente B: ";
21 cin >> B;
22 cout << "\nIntroduce el coeficiente C: ";
23 cin >> C;
24 cout << "\nIntroduce la coordenada x_0 del punto P: ";
25 cin >> x_0;
26 cout << "\nIntroduce la coordenada y_0 del punto P: ";
27 cin >> y_0;
28 d = fabs(A
*
x_0 + B
*
y_0 + C)/sqrt(A
*
A + B
*
B);
29 cout << "\nLa distancia desde el punto P(" << x_0
30 << " , " << y_0 << "), es:" << d << endl;
31 system("PAUSE");
32 return 0;
33 }
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.4 if, for, while and the like... 55
Decidir si un n umero entero positivo dado es par o impar.
o
1 /
*
Nombre del archivo: DosNueve.cpp
2 Descripci on:
3 Escribir un programa que determine si el n umero
4 positivo introducido por el usuario es par o impar.
5
6 Fecha de ultima Modificaci on: 05 de enero de 2008
7 ----------------------------------
8 ----------------------------------
9
*
/
10 #include <iostream> // Funciones b asicas input/output
11 using namespace std;
12 int main(void){
13 int ent,residuo;
14 char respuesta;
15 cout << "\nEste programa pide un n umero entero positivo";
16 cout << "\ny decide si es par o impar...";
17 for (;;){
18 cout << "\nIntroduce un n umero entero positivo:";
19 cin >> ent;
20 // Encuentro el residuo de la divisi on por 2
21 // para saber si es par o impar...
22 residuo = ent % 2;
23 if (ent <= 0) {
24 cout << "\nSolo acepto n umeros enteros positivos."
25 << endl;
26 }
27 else{
28 if (residuo == 0){
29 cout << "\nEl n umero es par." << endl;
30 }
31 else{
32 cout << "\nEl n umero es impar." << endl;
33 }
34 }
35 cout << "\nPresione < S > para salir...";
36 cin >> respuesta;
37 if ((respuesta == S)||(respuesta == s)){
38 break; // Salir del ciclo...
39 }
40 cout <<"\n\n\n";
41 }
42 return 0;
43 }
Convertir temperaturas de la escala Farenheit a la escala centgrada. o
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
56 Codigos
1 /
*
Nombre del archivo: DosDiez.cpp
2 Descripci on:
3 Escribir un programa que convierta una temperatura
4 dada por el usuario en grados Farenheit a grados
5 Celsius.
6 El usuario debe poder realizar el c alculo tantas
7 veces como lo desee.
8
9 Fecha de ultima Modificaci on: 05 enero de 2008
10 ----------------------------------
11 ----------------------------------
12
*
/
13 #include <iostream> // Funciones b asicas input/output
14 using namespace std;
15 int main(void){
16 double C, F;
17 char respuesta;
18 cout << "\nEste programa convierte una temperatura ";
19 cout << "\nde la escala Farenheit a Cent grada...";
20 for (;;){
21 cout << "\nIntroduce la temperatura en escala Farenheit: ";
22 cin >> F;
23 C = (F - 32) / 1.8;
24 cout << endl << F << " grados Farenheit equivalen a " << C
25 << " grados Cent grados" << endl ;
26 //
27 cout << "Presione < S > para salir...";
28 cin >> respuesta;
29 if ((respuesta == S)||(respuesta == s)){
30 break; // Salir del ciclo...
31 }
32 cout <<"\n\n\n";
33 }
34 return 0;
35 }
Encontrar el mayor de 3 n umeros enteros dados. o
1 /
*
Nombre del archivo: DosOnce.cpp
2 Descripci on:
3 Escribir un programa que lea tres n umeros e imprima el mayor
4 valor de los 3.
5
6 Fecha de ultima Modificaci on: 05 enero de 2008
7 ----------------------------------
8 ----------------------------------
9
*
/
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.4 if, for, while and the like... 57
10 #include <iostream>
11 using namespace std;
12 int main(void){
13 int a,b,c,max;
14 char respuesta;
15 cout << "\nEste programa pide tres n umeros enteros";
16 cout << "\ne indica el mayor de los tres.";
17 //
18 for (;;){
19 cout << "\nIntroduce el primer n umero ";
20 cin >> a;
21 cout << "\nIntroduce el segundo n umero ";
22 cin >> b;
23 cout << "\nIntroduce el tercer n umero ";
24 cin >> c;
25 if (a > b){
26 max = a;
27 }
28 else{
29 max = b;
30 }
31 if (c > max){
32 max = c;
33 }
34 cout << "\nEl mayor de los n umeros es: " << max << endl;
35 //
36 cout << "Presione < S > para salir...";
37 cin >> respuesta;
38 if ((respuesta == S)||(respuesta == s)){
39 break; // Salir del ciclo...
40 }
41 cout <<"\n\n\n";
42 }
43 return 0;
44 }
Encontrar el mayor y el menor de 3 n umeros enteros dados. o
1 /
*
Nombre del archivo: DosDoce.cpp
2 Descripci on:
3 Escribir un programa que lea tres n umeros enteros e
4 indique el mayor de los 3 y el menor de los 3.
5
6 Fecha de ultima Modificaci on: 05 enero de 2008
7 ----------------------------------
8 ----------------------------------
9
*
/
10 #include <iostream> // Funciones b asicas input/output
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
58 Codigos
11 using namespace std;
12 int main(void){
13 int a,b,c,min,max;
14 char respuesta;
15 cout << "\nEste programa pide tres n umeros enteros,";
16 cout << "\nindica el mayor de los tres y ";
17 cout << "\nel menor de los tres...";
18 //
19 for (;;){
20 cout << "\nIntroduce el primer n umero ";
21 cin >> a;
22 cout << "\nIntroduce el segundo n umero ";
23 cin >> b;
24 cout << "\nIntroduce el tercer n umero ";
25 cin >> c;
26 if (a > b){
27 max = a;
28 min = b;
29 }
30 else{
31 max = b;
32 min = a;
33 }
34 if (c > max){
35 max = c;
36 }
37 if (c < min){
38 min = c;
39 }
40 cout << "\nEl menor de los n umeros es: " << min << endl;
41 cout << "\ny el mayor de los n umeros es: " << max << endl;
42 //
43 cout << "Presione < S > para salir...";
44 cin >> respuesta;
45 if ((respuesta == S)||(respuesta == s)){
46 break; // Salir del ciclo...
47 }
48 cout <<"\n\n\n";
49 }
50 return 0;
51 }
Identicar el mayor y el menor de una lista de n umeros. o
1 /
*
Nombre del archivo: DosTrece.cpp
2 Descripci on:
3 Escribir un programa que lea una lista de n umeros
4 positivos y escriba el valor m aximo y el valor
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.4 if, for, while and the like... 59
5 m nimo. La lista finalizar a cuando se introduzca el
6 n umero cero (0).
7
8 Fecha de ultima Modificaci on: 05 enero de 2008
9 ----------------------------------
10 ----------------------------------
11
*
/
12 #include <iostream>
13 using namespace std;
14 int main(void){
15 double inicial, actual, max, min;
16 char respuesta;
17 cout << "\nEste programa pide n umeros positivos,";
18 cout << "\nindica el mayor de todos y ";
19 cout << "\nel menor de ellos..." << endl;
20 cout << "\nPara terminar de ingresar los n umeros";
21 cout << "\nintroduce el n umero 0" << endl;
22 //
23 for (;;){
24 cout << "\nIntroduce el primer n umero positivo: ";
25 cin >> actual;
26 min = actual; // Asigno valor inicial min
27 max = actual; // Asigno valor inicial max
28 while (actual !=0){ // mientras no presione cero...
29 if (actual > max){
30 max = actual;
31 }
32 if (actual < min){
33 min = actual;
34 }
35 cout << "\nIntroduce otro n umero positivo: ";
36 cin >> actual;
37 }
38 cout << "\nEl mayor de todos los n umeros introducidos es: "
39 << max << endl;
40 cout << "\nEl menor de todos los n umeros introducidos es: "
41 << min << endl;
42 //
43 cout << "Presione < S > para salir o < C > para continuar...";
44 cin >> respuesta;
45 if ((respuesta == S)||(respuesta == s)){
46 break; // Salir del ciclo...
47 }
48 cout <<"\n\n\n";
49 }
50 return 0;
51 }
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
60 Codigos
2.5 Mis tareas
En esta seccion encontraras el codigo de las tareas que voy entregando en mis
clases de Simulacion de Sistemas.
2.5.1 Simulaci on 1
Se lanza un aller de longitud L a una mesa que tiene dibujadas lneas paralelas
equidistantes separadas a L unidades una de la otra. Calcular la probabilidad
de que el aller toque lnea.
Consideraciones
Se realizaron las siguientes suposiciones:
1. La longitud del aller es 1.
2. El aller siempre cae dentro de la mesa.
3. La distancia (medida verticalmente) de una recta a la cabeza del aller es
una variable aleatoria que presenta distribucion uniforme.
4. El angulo que forma el aller con las rectas dibujadas sobre la mesa es una
variable aleatoria que presenta distribucion uniforme.
Con base en estas suposiciones, podemos denir como x la distancia (medida
verticalmente) de una recta a la cabeza del aller, y como el angulo que forma
una de las rectas dibujadas sobre la mesa y el aller.

i+1

1
0
x
Ahora denimos y como la posicion de la punta del aller (el extremo opuesto
a la cabeza del aller).
Dado que el aller mide 1, la coordenada y puede calcularse con:
y = x + sin(2 )
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.5 Mis tareas 61
donde = 3.141592654 , es la constante geometrica
3
, y es el angulo como
se denio anteriormente.
El aller tocara lnea siempre y cuando se cumpla alguna de las siguientes condi-
ciones:
i. y > 1, o
ii. y < 0
Geometricamente, de la gura podemos ver que en estos casos, la punta del
aller estara fuera del area encerrada por las lneas paralelas
i
y
i+1
.
Simulacion por computadora
En seguida se muestra el codigo del programa que simula este experimento.
/
*
Nombre del archivo: simulacion01.cpp
Descripcion:
Este programa simula el siguiente experimento:
Se lanza un alfiler de longitud L a una mesa
que tiene dibujadas lneas paralelas equidistantes
separadas a L unidades una de la otra.
El usuario debe ingresar el numero total de
experimentos (entero) que se deben realizar,
entendiendo por experimento la simulacion de un
lanzamiento del alfiler sobre la mesa.
El resultado indica la probabilidad de que el
alfiler toque una de las lneas dibujadas sobre la
mesa.
----------------------------------------------------
----------------------------------------------------
Autor: Efran Soto Apolinar
Email: efrain@yalma.fime.uanl.mx
Fecha de ultima Modificacion: 24 de enero de 2008
Lenguaje de Programacion: C++
Compilador: Dev - C++ Version 4.9.9.2.
----------------------------------------------------
----------------------------------------------------
*
/
#include <iostream> // Funciones basicas para input/output
#include <stdlib.h> // para usar la funcion rand()
#include <math.h> // funciones matematicas (sin (double))
#include <conio.h> // para usar: getche, getch
using namespace std;
int main(void)
3
Al multiplicar por 2 convertimos la variable aleatoria , cuyos valores van desde 0
hasta 1 a radianes. Se trata de un simple mapeo uno a uno.
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
62 Codigos
{
char respuesta;
int si, no, i, j, total;
double p, x, y, a;
const double pi = 3.141592654;
/
*
x --> representa la distancia de una recta
paralela de referencia
al punto donde cayo la cabeza del alfiler.
y = x + sin (2
*
pi
*
a)
a --> es el angulo que forma el alfiler con
las rectas paralelas dibujadas sobre
la mesa
si --> es el numero de veces que el alfiler
toca lnea
no --> es el numero de veces que el alfiler
NO toca lnea
p --> es la probabilidad de que toque...
total --> es el numero de experimentos que
realizara el programa...
*
/
cout << "\nEste programa calcula la probabilidad de que";
cout << "\nal lanzar un alfiler de una longitud dada ";
cout << "\nsobre una mesa que tiene dibujadas lneas ";
cout << "\nparalelas separadas por una distancia igual ";
cout << "\na la longitud del alfiler, toque lnea... ";
//
for (;;)
{
cout << "\n\n\nIngrese el numero de experimentos: ";
cin >> total;
si = no = 0;
p = 0;
for (i = 1 ; i <= total ; i++)
{ // realizo los experimentos
x = double(rand()) / double(RAND_MAX);
a = double(rand()) / double(RAND_MAX);
y = x + sin(2
*
pi
*
a);
if ((y < 0) || (y > 1))
{si++;}
else
{no++;}
} // end del ciclo for ()
p = double(si) / double(total);
cout << "\n\n\nDe los " << total << " experimentos ";
cout << si << " tocaron lnea, \nmientras que " << no ;
cout << " no tocaron lnea.\n";
cout << "\nDe aqu que la probabilidad de que el alfiler";
cout << "\ntoque lnea es: " << p;
cout << "\n\n\n";
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.5 Mis tareas 63
//
cout << "Presione < S > para salir...";
respuesta = getche();
if ((respuesta == S)||(respuesta == s))
{
break; // Salir del ciclo for inicial...
}
cout <<"\n\n\n";
}
return 0;
}
Como los resultados generados con este programa son aleatorios, los resultados
varan ligeramente.
En la siguiente tabla se muestran algunos resultados obtenidos con el mismo.
No. Experimentos Probabilidad
100 0.66
200 0.62
300 0.613333
400 0.63
500 0.644
600 0.646667
700 0.624173
800 0.64
900 0.647778
1 000 0.623
10 000 0.6437
10
6
0.636592
10
8
0.636612
De hecho, a un si se dan los mismos valores al programa, este arrojara diferentes
resultados cada vez, dado que los valores que van tomando las variables x (que
representa la distancia desde la recta
i
a la cabeza del aller) y (que representa
el angulo que forma el aller con cualquiera de las lneas dibujadas sobre la mesa)
son variables aleatorias con distribucion contnua.
Esto se puede vericar realizando los calculos de nuevo con el programa ali-
mentandolo con los mismos valores.
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
64 Codigos
2.5.2 Calculo analtico
Para hacer el calculo analtico podemos denir las siguientes coordenadas: Sea
d la distancia del centro del aller a la recta mas cercana.
Sea esta recta, y sea como el menor angulo formado entre y el aller. De
aqu se deduce que:
0 d
1
2
, y 0

2
Tambien es claro que el aller tocara la recta si la hipotenusa del triangulo es
menor a 0.5, es decir:
d
sin
<
1
2
Entonces, al lanzar el aller, las coordenadas (d, ) tienen distribucion uniforme
en los intervalos antes denidos, que se pueden representar mediante el siguiente
rectangulo:

2
1
2
La probabilidad de que el aller toque lnea es igual a la fraccion del area del
rectangulo que yace debajo de la graca de la funcion: d =
1
2
sin.
El area del rectangulo es: /4 y el area debajo de la graca de la funcion en
cuestion es:
/2
_
0
1
2
sind =
1
2
y as obtenemos:
p(A) =
1
2

4
=
2

0.6366197724
As que la simulacion codicada en C
++
es correcta.
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.5 Mis tareas 65
2.5.3 Simulaci on 2
Desarrollar una simulacion por computadora que simule experimentos de
Bernoulli. El programa debe repetir los intentos hasta que se supere un valor
jo p de exito, denido por el usuario. Este mismo experimento debe realizarse
con el metodo binomial. Se debe ir calculando el valor de la probabilidad bino-
mial P(n, k) para k = 0, 1, 2 i, hasta que se rebase el valor de p.
El programa debe indicar al usuario cuantos intentos de Bernoulli se requierieron
para superar el valor de p y cuantas iteraciones binomiales se requirieron para
alcanzar el mismo objetivo.
Se elaboro un programa que requiere de la siguiente informacion:
Maximo de intentos de Bernoulli, que corresponde al n umero maximo de
experimentos de Bernoulli que se simularan.
El valor de la probabilidad de exito, que corresponde al valor de p del
evento a simular.
El c odigo en el lenguaje C
++
se enlista en seguida.
/
*
Nombre del archivo: simulacion02.cpp
Descripcion:
Este programa simula experimentos de Bernoulli
y probabilidad binomial.
----------------------------------------------------
----------------------------------------------------
Autor: Efran Soto Apolinar
Email: efrain@yalma.fime.uanl.mx
efra.soto.a@gmail.com
Webpage: http://yalma.fime.uanl.mx/efrain/
Fecha de ultima Modificacion: 03 de febrero de 2008
Lenguaje de Programacion: C++
Compilador: Dev - C++ Version 4.9.9.2.
----------------------------------------------------
----------------------------------------------------
*
/
#include <iostream> // Funciones basicas para input/output
#include <stdlib.h> // para usar la funcion rand()
#include <math.h> // funciones matematicas (pow (double))
#include <conio.h> // para usar: getche, getch
#include <ctime> // clock_t = clock();
int errores; // variable global...
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
66 Codigos
int factorial(int n);
int permuta(int n, int k);
//
using namespace std;
int main(void){
char respuesta;
int i, j, kBer, kBin, n;
double p, q, prob, x;
//
cout << "\nEste programa simula experimentos binomiales";
cout << "\ny repeticiones de experimentos de Bernoulli...";
//
//
//
for (;;){
errores = 0;
kBer = 0;
kBin = 0;
cout << "\n\n\nMaximo de intentos de Bernoulli: ";
cin >> n;
if((n < 0) || (n > 20)) {
cout << "\nn debe estar entre 1 y 20 (inclusive)...";
cout << "\n\n";
continue;
}
for (;;) { // para que pueda ingresar el valor de p...
cout << "\nIngrese el valor de la probabilidad de exito: ";
cin >> p;
if ((p < 0) || (p > 1)) {
cout << "\np esta entre cero y uno (inclusive)...";
cout << "\n\n\n";
continue;
}
q = 1 - p; // probabilidad de fracaso...
break;
} // termina el for...
//
//
//
// realizo el calculo de acuerdo a Bernoulli...
for (i=1 ; i <= n ; i++) {
x = double(rand()) / double(RAND_MAX); // genero x
if (p >= x){
kBer++;
} // endif
} // end for
//
//
// realizo el calculo por Binomial...
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.5 Mis tareas 67
x = double(rand())/ double(RAND_MAX); // genero x
prob = 0; // inicio la probabilidad acumulada de Bernoulli
kBin = 0; // inicio el numero de intentos...
for(;;){ // for infinito...
prob += double(permuta(n,kBin))
*
pow(p,double(kBin))
*
pow(q,double(n-kBin));
if (prob >= x) {
break;
}
kBin++;
}
//
// Muestro los resultados...
cout << "\n\n\nIntentos con Bernoulli: " << kBer;
cout << "\n\nIntentos con Binomial: " << kBin;
cout << "\n\n\nTotal de errores: " << errores;
//
cout << "\n\n\nPresione < S > para salir...";
respuesta = getche();
if ((respuesta == S)||(respuesta == s)){
break; // Salir del ciclo for inicial...
}
cout << "\n\n\n";
}
return 0;
}
/
**************************************
Declaro la funcion factorial...
***************************************
/
int factorial(int n){
long fi,i;
fi = i = 1;
while (i <= n){
fi
*
=i;
if (fi <= 0){ // por si se pasa la memoria...
cout << "\nLo siento, se rebaso la memoria...";
fi = 1;
errores++;
break;
}
i++;
}
return fi;
}
/
**************************************
Declaro la funcion permuta...
***************************************
/
int permuta(int n, int k){
int perm,subfactorial,i;
i = n - k + 1; // n - k + 1 para calcular el subfactorial
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
68 Codigos
subfactorial = 1; // reinicio el subfactorial
while (i <= n){
subfactorial
*
= i;
i++;
}
perm = subfactorial / factorial(k);
return perm;
}
2.5.4 Simulaci on 3
Desarrollar un programa por computadora que simule experimentos con dis-
tribucion de Poisson. El programa debe repetir los intentos hasta que se supere
un valor jo p de exito, denido por el usuario.
El programa debe indicar al usuario cuantos intentos del experimento se re-
quierieron para superar el valor de p.
Se elaboro un programa que requiere de la siguiente informacion:
Valor de Lambda, que corresponde al promedio de la muestra.
El valor de la probabilidad de exito, que corresponde al valor de p del
evento a simular.
El codigo en el lenguaje C
++
se enlista en seguida.
/
*
Nombre del archivo: simulacion03.cpp
Descripcion:
Este programa simula experimentos con distribucion de Poisson
y probabilidad binomial.
----------------------------------------------------
----------------------------------------------------
Autor: Efran Soto Apolinar
Email: efrain@yalma.fime.uanl.mx
efra.soto.a@gmail.com
Webpage: http://yalma.fime.uanl.mx/efrain/
Fecha de ultima Modificacion: 03 de febrero de 2008
Lenguaje de Programacion: C++
Compilador: Dev - C++ Version 4.9.9.2.
----------------------------------------------------
----------------------------------------------------
*
/
#include <iostream> // Funciones basicas para input/output
#include <stdlib.h> // para usar la funcion rand()
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.5 Mis tareas 69
#include <math.h> // funciones matematicas (pow (double))
#include <conio.h> // para usar: getche, getch
#include <ctime> // clock_t = clock();
int errores; // variable global...
int factorial(int n);
int permuta(int n, int k);
//
using namespace std;
int main(void){
char respuesta;
int i, k;
double p, prob, x, lambda;
//
cout << "\nEste programa simula experimentos con";
cout << "\ndistribucion de Poisson...";
//
//
//
for (;;){
errores = 0;
cout << "\n\n\nValor de Lambda (Promedio): ";
cin >> lambda;
if((lambda < 0)) {
cout << "\nLambda debe ser un valor positivo...\n\n";
continue;
}
for (;;) { // para que pueda ingresar el valor de p...
cout << "\nIngrese el valor de la probabilidad de exito: ";
cin >> p;
if ((p < 0) || (p > 1)) {
cout << "\np esta entre cero y uno (inclusive)...";
cout << "\n\n\n";
continue;
}
break;
} // termina el for...
//
//
// realizo el calculo de la probabilidad...
srand(unsigned(time(0)));// Semilla para el aleatorio...
x = double(rand())/ double(RAND_MAX); // genero x
prob = 0; // inicio la probabilidad acumulada
for(i = 0 ; prob <= x ; i++){
prob += exp(-lambda)
*
pow(lambda,i) / factorial(i);
//
}
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
70 Codigos
//
// Muestro los resultados...
cout << "\n\n\nIntentos con Poisson: " << i-1;
cout << "\n\n\nTotal de errores: " << errores;
//
cout << "\n\n\nPresione < S > para salir...";
respuesta = getche();
if ((respuesta == S)||(respuesta == s)){
break; // Salir del ciclo for inicial...
}
cout << "\n\n\n";
}
return 0;
}
/
**************************************
Declaro la funcion factorial...
***************************************
/
int factorial(int n){
long fi,i;
fi = i = 1;
while (i <= n){
fi
*
=i;
if (fi <= 0){ // por si se pasa la memoria...
cout << "\nLo siento, se rebaso la memoria...";
fi = 1;
errores++;
break;
}
i++;
}
return fi;
}
2.5.5 Simulaci on 4
Desarrollar un programa por computadora que simule el lanzamiento de dos
dados.
El programa debe permitir al usuario indicar cuantos experimentos realizar y si
desea o no ver los resultados de cada experimento.
El programa debe imprimir en pantalla el promedio de la suma de todos los
experimentos realizados.
El codigo en el lenguaje C
++
se enlista en seguida.
/
*
Nombre del archivo: simulacion04.cpp
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.5 Mis tareas 71
Descripcion:
Este programa simula el lanzamiento de dos dados...
----------------------------------------------------
----------------------------------------------------
Autor: Efran Soto Apolinar
Email: efrain@yalma.fime.uanl.mx
efra.soto.a@gmail.com
Webpage: http://yalma.fime.uanl.mx/efrain/
Fecha de ultima Modificacion: 08 de febrero de 2008
Lenguaje de Programacion: C++
Compilador: Dev - C++ Version 4.9.9.2.
----------------------------------------------------
----------------------------------------------------
*
/
#include <iostream> // Funciones basicas para input/output
#include <stdlib.h> // para usar la funcion rand()
#include <conio.h> // para usar: getche, getch
#include <ctime> // clock_t = clock();
using namespace std;
int main(void){
char respuesta,resp;
int i, x, y, n; // variables aleatorias...
int suma;
double promedio;
//
cout << "\nEste programa simula el lanzamiento";
cout << "\nde dos dados...";
//
//
//
for (;;){
// realizo el calculo de la probabilidad...
cout << "\n\n\nCuantos lanzamientos deseas simular? ";
cin >> n;
cout << "\n\n\nDeseas ver los resultados? ";
cin >> resp;
srand(unsigned(time(0)));// Semilla para el aleatorio...
suma = 0; // reinicio la suma de resultados...
if ((resp == S)||(resp == s)){
cout << "\n\nSimulacion ";
cout << "\t\tDADO 1: ";
cout << "\tDADO 2: ";
cout << "\tSUMA: \n";
}
for (i = 1 ; i <= n ; i++ ){
//
x = (rand() % 6) + 1;
y = (rand() % 6) + 1;
//
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
72 Codigos
suma += x+y;
if ((resp == S)||(resp == s)){
// Muestro los resultados...
cout << "\t" << i << "\t";
cout << "\t " << x << "\t";
cout << "\t " << y << "\t";
cout << "\t " << x+y << "\n\n";
}
}
promedio = double(suma) / double(i-1);
cout << "\n\n\n Suma Promedio: " << promedio;
//
cout << "\n\n\nPresione < S > para salir...";
respuesta = getche();
if ((respuesta == S)||(respuesta == s)){
break; // Salir del ciclo for inicial...
}
cout << "\n\n\n";
}
return 0;
}
2.5.6 Simulacion 5
Elaborar un programa para simular experimentos con distribucion de Poisson.
La variable de dominio tiene una distribucion exponencial y se compara con
la distribucion de Poisson con dominio en una variable aleatoria que presenta
distribucion uniforme.
/
*
Nombre del archivo: simulacion05.cpp
Descripcion:
Este programa simula experimentos con distribucion de Poisson
cuya variable de dominio tiene una distribucion exponencial
y compararla con la distribucion de Poisson con dominio en
una variable aleatoria con distribucion uniforme.
----------------------------------------------------
----------------------------------------------------
Autor: Efran Soto Apolinar
Email: efrain@yalma.fime.uanl.mx
efra.soto.a@gmail.com
Fecha de ultima Modificacion: 03 de febrero de 2008
Lenguaje de Programacion: C++
Compilador: Dev - C++ Version 4.9.9.2.
----------------------------------------------------
----------------------------------------------------
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.5 Mis tareas 73
*
/
#include <iostream> // Funciones basicas input/output
#include <stdlib.h> // para la funcion rand()
#include <math.h> // funciones matematicas
#include <conio.h> // para usar getche, getch
#include <ctime> // clock();
int errores; // variable global...
int factorial(int n); // funcion...
using namespace std;
int main(void){
char respuesta;
int i, ipe, ip;
double prob, probe, u, lambda, x;
//
for (;;){
cout << "\nEste programa simula experimentos con";
cout << "\ndistribucion de Poisson a partir de una";
cout << "\nvariable aleatoria con distribucion exponencial...";
//
//
srand(unsigned(time(0)));// Semilla para el aleatorio...
// Con distribucion Poisson - Exponencial
probe = 0; // inicio la probabilidad acumulada
for(i = 0 ; probe <= 1 ; i++){ // calculo la probabilidad...
u = double(rand())/ double(RAND_MAX); // genero x
x = - log(1 - u) / u; //
probe += exp(-x)
*
pow(x,i) / factorial(i);
ipe = i;
}
//
// Ahora realizo el calculo con distribucion uniforme...
prob = 0; // inicio la probabilidad acumulada
for(i = 0 ; prob <= 1 ; i++){
prob += exp(-lambda)
*
pow(lambda,i) / factorial(i);
//
}
//
// Muestro los resultados...
cout << "\n\n\nIntentos con poisson exponencial: " << ipe;
cout << "\n\n\nIntentos con poisson uniforme: " << i;
cout << "\n\n\nPresione < S > para salir...";
respuesta = getche();
if ((respuesta == S)||(respuesta == s)){
break; // Salir del ciclo for inicial...
}
cout << "\n\n\n";
}
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
74 Codigos
return 0;
}
/
**************************************
Declaro la funcion factorial...
***************************************
/
int factorial(int n){
long fi,i;
fi = i = 1;
while (i <= n){
fi
*
=i;
if (fi <= 0){ // por si se pasa la memoria...
cout << "\nLo siento, se rebaso la memoria...";
fi = 1;
errores++;
break;
}
i++;
}
return fi;
}
2.5.7 Simulacion 6
Elaborar un programa para simular la transformacion inversa de la distribucion
normal, esto es, a partir del valor de u = (x) calcula de manera aproximada
x. El usuario indica el valor u que esta en el intervalo (0,1)
/
*
Nombre del archivo: simulacion06.cpp
Descripcion:
Este programa simula transformacion inversa de la
distribucion normal, esto es, a partir del valor de
u = Phi(x) calcula de manera aproximada x.
El usuario indica el valor u que esta en el
intervalo (0,1)
----------------------------------------------------
----------------------------------------------------
Autor: Efran Soto Apolinar
Email: efrain@yalma.fime.uanl.mx
efra.soto.a@gmail.com
Fecha de ultima Modificacion: 18 de febrero de 2008
Lenguaje de Programacion: C++
Compilador: Dev - C++ Version 4.9.9.2.
----------------------------------------------------
----------------------------------------------------
*
/
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.5 Mis tareas 75
#include <iostream> // Funciones basicas input/output
#include <stdlib.h> // para usar rand()
#include <math.h> // funciones matematicas
#include <conio.h> // para usar getche, getch
#include <ctime> // clock();
int errores; // variable global...
double rfactorial(int n); // funcion...
double normal(double x); // funcion...
double intnormal(double x);
const double pi = 3.141592653589; // global
using namespace std;
int main(void){
char respuesta;
double x, xa, u, approx, approxa;
double step, error, errorx;
int j, total, cont, z;
char signo;
// para los dgitos...
cout.setf(ios::fixed);
cout.setf(ios::showpoint);
cout.precision(8);
//
for (;;){
cout << "\nEste programa simula la generacion de numeros";
cout << "\ncon distribucion normal a partir de un";
cout << "\nvalor dado por el usuario entre cero y uno...";
for (;;){
cout << "\n\n\ningresa un valor entre cero y 1: ";
cin >> u;
if (u < 0 && u > 1){
cout << "\nError en argumento...";
cout << "\n\n";
continue;
}
break;
} // end for para pedir u
//
x = 0; // valor inicial supuesto (media)
z = 0;
if (u < 0.01){
step = u / 2;
}
else{
step = 0.25;
}
for (;;){
//
xa = x;
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
76 Codigos
approx = normal(x);
// Decido si incremento o decremento x
while (approx < u){
x += step;
approx = normal(x);
z++;
}
step /= 1.5;
while (approx > u){
x -= step;
approx = normal(x);
z++;
}
step /= 1.5;
if (approx < 0.0001 && fabs(x) > 3.999){
x = u / 2;
approx = normal(u);
}
// calculo el error relativo para x
if (fabs(xa - x) < 0.0001){
// Criterio para salir del ciclo...
cout << "\tu = " << u << "\tApprox = "
<< intnormal(x) << "\t x = " << x;
break;
}
} // end for que hace las iteraciones...
//
cout << "\n\n\nPresione < S > para salir...";
respuesta = getche();
if ((respuesta == S)||(respuesta == s)){
break; // Salir...
}
cout << "\n\n\n";
} // end for infinito...
return 0; // Salir...
}
/
**************************************
Declaro la funcion normal...
***************************************
/
double normal(double x){
double u = 0;
double un, ua, temp;
int i;
if (x < -4){
return 0;
}
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.5 Mis tareas 77
if (x > 4){
return 1;
}
for (i = 0 ; i < 40 ; i++){
ua = u;
u += pow(-0.5
*
x
*
x,i)
*
rfactorial(i) / (2
*
i+1);
un = u;
} // endfor
if (x < 0 ){
u = 0.5 - u
*
x / sqrt(2
*
pi);
}
else{
u = 0.5 + u
*
x / sqrt(2
*
pi);
}
return u;
}
/
**************************************
Declaro la funcion normal...
***************************************
/
double intnormal(double x){
double u = 0;
double ua, up, ac;
double xi, step;
// xi es la iteracion actual
// step es el tamano del paso...
int i;
step = 0.00000001; // El paso es 1 / 107
xi = 0; // empieza a integrar desde cero...
while (xi <= fabs(x)){
u += exp(- xi
*
xi / 2)
*
step;
xi += step;
} // endfor
u = u / sqrt(2
*
pi) + 0.5;
if (x < 0 ){
return (u - 0.5);
}
else{
return u;
}
}
/
**************************************
Declaro la funcion rfactorial...
***************************************
/
double rfactorial(int n){
double fi, i;
int j;
fi = i = 1.0;
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
78 Codigos
j = 1;
//
while (j <= n){
fi /=i;
i = i + 1;
j++;
}
return fi;
}
2.5.8 Simulacion 7
Programar un generador de n umeros pseudoaleatorios con distribucion normal
por el metodo de aceptacion - rechazo.
/
*
Nombre del archivo: simulacion08.cpp
Este programa simula la generacion de numeros
aleatorios con distribucion normal
por el metodo de aceptacion - rechazo.
----------------------------------
----------------------------------
Autor: Efran Soto Apolinar
Email: efra.soto.a@gmail.com
efrain@yalma.fime.uanl.mx
Fecha de ultima Modificacion: 01 de marzo de 2008
----------------------------------
----------------------------------
*
/
#include <cstdio> //
#include <cstdlib> //
#include <iostream> // Funciones basicas input/output
#include <math.h> // funciones matematicas
#include <conio.h> // para usar getche, getch
// Defino las funciones que voy a usar...
double f(double y);
double g(double y);
//
using namespace std;
int main(void){
int i, total;
char respuesta;
double x, y, z, u;
// el valor de c = 1.315489247, se calculo con:
// const double c = sqrt(2
*
2.718281828 / 3.141592653);
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.5 Mis tareas 79
const double c = 1.315489247;
//
for (;;){ // for infinito...
cout << "\nEste programa simula la generacion de numeros";
cout << "\ncon distribucion normal con el metodo de ";
cout << "\naceptacion y rechazo...";
cout << "\n\nCuantos numeros desea generar... ";
cin >> total;
cout << "\n\n\n"; // un poco de espacio...
for (i = 1; i<= total ; i++){
x = double(rand()) / double(RAND_MAX); // aleatorio
z = double(rand()) / double(RAND_MAX); // aleatorio
if (z < 0.5){ // genero el valor de y
y = log(2
*
z);
}
else{
y = - log(2 - 2
*
z);
}
// x es el valor a comparar...
// y es el argumento de las funciones...
u = f(y) / (c
*
g(y));
if (u >= x){
// aceptar el valor...
cout << "\n" << i << "\t----->\t" << y;
}
}
cout << "\n\n\nPresione < S > para salir...";
respuesta = getche();
if ((respuesta == S)||(respuesta == s)){
break; // Salir del ciclo for inicial...
}
cout << "\n\n\n";
} // end for infinito...
return 0;
}
/
*************************************
Defino la funcion f(y)
**************************************
/
double f(double y){
return 0.39894228
*
exp(- y
*
y / 2) ;
// el factor
// 0.39894228 = 1 / sqrt(2
*
3.141592653);
}
/
*************************************
Defino la funcion g(y)
**************************************
/
double g(double y){
return exp(-fabs(y)) / 2;
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
80 Codigos
}
2.5.9 Simulacion 8
Elaborar un programa para simular un movimiento browniano
Puede encontrar un PDF con una animacion de los resultados generados por
este programa en: http://yalma.fime.uanl.mx/~efrain/project.html
/
*
Nombre del archivo: simulacion08.cpp
Este programa simula un movimiento browniano.
----------------------------------
----------------------------------
Autor: Efran Soto Apolinar
Email: efra.soto.a@gmail.com
efrain@yalma.fime.uanl.mx
Fecha de ultima Modificacion: 01 de marzo de 2008
----------------------------------
----------------------------------
*
/
#include <cstdio> //
#include <cstdlib> //
#include <iostream> // Funciones basicas input/output
#include <math.h> // funciones matematicas
#include <conio.h> // para usar getche, getch
#include <fstream> // para grabar los datos generados...
//
const double PI = 3.141592653;
double step;
// funcion para generar los numeros pseudoaleatorios
// con distribucion normal...
double dnormal(double media, double sigma);
double dnormal(void);
// Funcion para generar un numero pseudoaleatorio
// con distribucion uniforme en el intervalo (0,1)
double uniforme(void);
using namespace std;
int main(void){
char respuesta, semilla;
double t, tiempo; // escala de tiempo.
double xn, x = 0; // posicion de la partcula.
double media, sigma; // parametros de dist. Normal.
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.5 Mis tareas 81
int i = 0;
//
for (;;){ // for infinito...
cout << "\nEste programa simula un ";
cout << "movimiento browniano ";
cout << "\n\nTiempo en segundos a simular: ";
cin >> tiempo;
for (;;){
cout << "\nIntervalo entre dos posiciones consecutivas
(seg): ";
cin >> step;
if (step <= 0){
cout << "\n\nEl intervalo debe ser positivo...";
cout << "\nPreferentemente menor a un segundo.";
cout << "\nValor sugerido: 0.05";
}
else{ // ingreso un step positivo...
break;
cout << "\n\n\n";
}
} // end for...
// No requiero los siguientes renglones porque
// se definio el problema con media cero...
cout << "\nMedia de la posicion de la partcula:
(sobre el eje x)";
cout << "\n(Presione 0 (cero) si la desconoce): ";
cin >> media;
cout << "\n\nDesviacion estandar de la posicion...";
cout << "\n(Presione 0 si la desconoce): ";
cin >> sigma;
if (sigma == 0){
sigma = 1;
}
for (;;){ // hasta que presione S o N
cout << "\n\nDesea iniciar la semilla?";
cout << "\n(del generador de numeros aleatorios) [S/N]";
cin >> semilla;
if (semilla == S || semilla == s){
srand(unsigned(time(0)));
cout << "\n\nSe reinicia la semilla...";
break; // salir del for infinito
}
if (semilla == N || semilla == n){
cout << "\n\nNo se reinicia la semilla...";
break; // salir del for infinito
}
cout << "\n\nError en argumento...";
} // end for infinito para la semilla
cout << "\n\n\n"; // un poco de espacio...
t = 0; // reinicio el tiempo del experimento...
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
82 Codigos
ofstream out_stream; // creo canal p/escritura de datos...
out_stream.open("brown.txt"); // creo y abro el archivo...
if (out_stream.fail()){ // si no puede abrir el archivo...
cout << "\n\nNo se pudo abrir el archivo...";
cout << "\nPor favor, reinicie el programa...";
exit(1); // Termina el programa
}
out_stream << "\n";
out_stream << "# Simulacion de un movimiento Browniano"
<< "\n";
out_stream << "# el eje t representa al tiempo" << "\n";
out_stream << "# y el eje x (vertical) representa la
posicion..." << "\n";
out_stream << "# Los datos van desde t = 0 hasta t = "
<< tiempo << ".\n";
out_stream << "0 0 i\n"; // Primer dato...
for (t = step; t <= tiempo ; t += step){
x += dnormal();
out_stream << t << " " << x << " i\n";
i++;
}
cout << "\n\n\nSe han grabado " << i
<< " datos en el archivo";
cout << "\nbrown.txt\n";
out_stream << "# Este archivo contiene "
<< i << " datos.";
// pregunto si desea salir...
cout << "\n\n\nPresione < S > para salir...";
respuesta = getche();
if ((respuesta == S)||(respuesta == s)){
break; // Salir del ciclo for inicial...
}
cout << "\n\n\n";
} // end for infinito...
return 0;
}
/
**************************************
Declaro la funcion DNORMAL...
***************************************
/
double dnormal(double media, double sigma){
/
*
Esta funcion genera numeros pseudoaleatorios
con distribucion uniforme a partir de su media
y su desviacion estandar.
*
/
double u, v, x, y, z;
u = uniforme();
y = uniforme();
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.5 Mis tareas 83
x = sqrt(-2
*
log(u))
*
cos(2
*
PI
*
y);
if (u >= 0.5){
z = media + sigma
*
step
*
x;
}
else{
z = media - sigma
*
step
*
x;
}
return z;
// step se utiliza porque el problema define
// que la varianza es proporcional al intervalo de tiempo.
}
/
**************************************
Declaro la funcion DNORMAL...
***************************************
/
double dnormal(void){
/
*
Esta funcion genera numeros pseudoaleatorios
con distribucion uniforme.
*
/
double u, x, y, z;
// Defino la media y desviacion estandar...
double media = 0, sigma = 1;
u = uniforme();
y = uniforme();
x = sqrt(-2
*
log(u))
*
cos(2
*
PI
*
y);
if (u >= 0.5){
z = media + sigma
*
step
*
x;
}
else{
z = media - sigma
*
step
*
x;
}
return z;
// step se utiliza porque el problema define
// que la varianza es proporcional al intervalo de tiempo.
}
/
**************************************
Declaro la funcion UNIFORME...
***************************************
/
double uniforme(void){
// Esta funcion genera un numero pseudoaleatorio
// con distribucion uniforme en el intervalo (0,1).
return (double(rand())/double(RAND_MAX));
}
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
84 Codigos
2.5.10 Simulaci on de la distribucion binomial
Utilizando ANSI-C y las funciones de generacion de n umeros pseudoaleatorios,
escribe un programa que por simulacion y la ley de grandes n umeros aproxima
la distribucion binomial con n y p para todos los valores de k = 0, 1, 2, , n.
Incluye en tu respuesta el codigo que escribiste junto con un dibujo preparado
con gnuplot de la distribucion Bin(n, p) con los valores denidos para n y p.
1 /
*
2 Tarea 3.
3 Nombre del archivo: tres.c
4 Utilizando ANSI-C y las funciones de generacion
5 de numeros pseudoaleatorios, escribe un programa
6 que por simulacion y la ley de numeros grandes
7 aproxima la distribucion binomial con n y p para
8 todos los valores de k = 0, 1, 2, . . . , n.
9 Incluye en tu respuesta el codigo que escribiste
10 junto con un dibujo preparado con gnuplot de la
11 distribucion Bin(n, p) con los valores definidos
12 para n y p.
13 Autor: Efrain Soto Apolinar.
14 fecha de ultima modificacion: 15 de agosto de 2008
15
*
/
16 #include <stdio.h>
17 #include <math.h>
18 #include <stdlib.h>
19 int combinaciones(int m, int k);
20 float binomial(double p, int N, int k);
21 void bernoulli(int n, double p, int N);
22 float uniforme(void);
23 int main(int argc, char
**
args) {
24 char letra;
25 int n, k, N = 15;
26 int i, j; // contadores
27 double p = 0.4;
28 float resp;
29 printf("\nEste programa simula un proceso");
30 printf("\nbinomial por la ley de los grandes numeros");
31 printf("\n\nparametro p = 0.4");
32 printf("\n\nparametro N = 15");
33 printf("\nIntroduce el numero de simulaciones:");
34 scanf("%i", &n);
35 // La simulacion es:
36 bernoulli(n, p, N);
37 printf("\n\nValores teoricos:\n");
38 for(i = 0 ; i < 16 ; i++){
39 printf("\nk = %i, p = %f,", i, binomial(p,N,i));
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.5 Mis tareas 85
40 }
41 printf("\n\n");
42 printf("\nPresiona una tecla...");
43 scanf("%c", &letra);
44 return 0;
45 }
46 /
*
-----------------------------------------------
47 Funcion para calcular las combinaciones
48 -------------------------------------------------
*
/
49 int combinaciones(int m, int k){
50 int i; // contador
51 long int num = 1;
52 long int den = 1;
53 int r = 1; // resultado
54 for(i = 0 ; i < k ; i++){
55 num = num
*
(m - i);
56 den = den
*
(i + 1);
57 // simplifico para que no crezca rapido...
58 while(num % 2 == 0 && den % 2 == 0){
59 num /= 2;
60 den /= 2;
61 }
62 while(num % 3 == 0 && den % 3 == 0){
63 num /= 3;
64 den /= 3;
65 }
66 while(num % 5 == 0 && den % 5 == 0){
67 num /= 5;
68 den /= 5;
69 }
70 }
71 r = num / den;
72 return r;
73 }
74
75 /
*
-----------------------------------------------
76 Funcion para calcular la probabilidad binomial
77 -------------------------------------------------
*
/
78 float binomial(double p, int N, int k){
79 int i; // contador
80 float r; // respuesta
81 r = (int)(combinaciones(N,k))
*
pow(p,k)
*
pow(1-p,N-k);
82 return r;
83 }
84
85 /
*
-----------------------------------------------
86 Funcion para el proceso de Bernoulli...
87 Voy a realizar n exprimentos de Bernoulli
88 p = probabilidad de exito
89 N = numero de ensayos por experimento
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
86 Codigos
90 n = numero de experimentos
91 -------------------------------------------------
*
/
92 void bernoulli(int n, double p, int N){
93 int arreglo[16]; // cuenta
94 int i, j, c; // contadores
95 int tote; // total de exitos
96 float u;
97 // reinicio el arreglo
98 for(c = 0 ; c < 16 ; c++){
99 arreglo[c] = 0;
100 }
101 // Vienen los n ensayos de Bernoulli
102 for(i = 1 ; i <= n ; i++){
103 tote = 0; // reinicio total exitos
104 for(j = 0 ; j <= N ; j++){
105 u = uniforme(); // pseudo-uniforme (0,1)
106 if (u <= p){ // exito
107 tote++;
108 }
109
110 }
111 arreglo[tote]++;
112 }
113 // Imprimo los resultados...
114 printf("\n\nResultados de la simulacion:\n");
115 for (c = 0 ; c < 16 ; c++){
116 printf("\nk = %i, p = %f,", c, 1.0
*
arreglo[c]/n);
117 }
118 }
119
120 /
*
-----------------------------------------------
121 Funcion para generar uniformes (0,1)
122 -------------------------------------------------
*
/
123 float uniforme(void){
124 float u;
125 u = (float)(rand()) / RAND_MAX;
126 return u;
127 }
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.5 Mis tareas 87
2.5.11 Introducci on a la dinamica de poblaciones
1. Denir estado inicial N (poblacion inicial)
2. Probabilidad de un nacimiento sin muerte p (homogenea)
3. Probabilida de una muerte sin nacimiento q (homogenea)
4. Probabilidad de mantener el mismo estado 1 p q
Observar el desarrollo del tama no de la poblacion sobre varias repeti-
ciones del proceso.
Variar los valores de p y q.
1 /
*
2 Simulacion de la dinamica de poblaciones
3 Fecha: 19 de agosto de 2008
4
5 Caso discreto.
6 Definir estado inicial N (poblacion inicial)
7 Probabilidad de un nacimiento sin muerte p (homogenea)
8 Probabilida de una muerte sin nacimiento q (homogenea)
9 Probabilidad de mantener el mismo estado 1 - p - q
10
11 Observar el desarrollo del tama no de la poblacion
12 sobre varias repeticiones del proceso
13
*
/
14 #include <stdlib.h>
15 #include <stdio.h>
16 #include <math.h>
17
18 double uniforme(void);
19
20 int main(int argc, char
**
args){
21 int i = 0; // contadores
22 double p = 0.45; // probabilidad de nuevo nacimiento
23 double q = 0.45; // probabilidad de muerte
24 double eq = 1 - p - q; // probabilidad de quedar igual
25 double r; // numero aleatorio
26 int N = 10000; // poblacion inicial
27 int MAXP = 10
*
N; // poblacion final
28
29 // para el manejo del archivo...
30 FILE
*
stream_f; //
31 stream_f = fopen("datos.txt", "w"); // abrir para lectura
32 if (stream_f == NULL){
33 printf ("\nNo se puede abrir el archivo <<datos.txt>>\n");
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
88 Codigos
34 printf("\nPor favor, verifique el nombre archivo");
35 }
36 srand(unsigned(time(0)));
37 printf("\nEspere por favor...\n");
38 printf("\nSimulando dinamica de la poblacion...");
39 while (N > 0 && N < MAXP){
40 r = uniforme();
41 if (r <= p){
42 // Felicidades! nacio un changuito
43 N++;
44 }
45 if (r > p && r <= p + q){
46 // Desgracia, un changuito fue devorado
47 N--;
48 }
49 //if (r > p + q){
50 // Nadie nacio...
51 // Nadie murio...
52 //}
53 printf("\nt = %i \tN = %i",i, N);
54 // guardo en archivo...
55 if(i % 25 == 0){
56 fprintf(stream_f, "\n%i \t%i",i, N);
57 }
58 i++;
59 if (i > 10000){
60 break;
61 }
62 }
63 fclose(stream_f);
64 printf("\nSimulacion exitosa...");
65 return 0;
66 }
67
68 /
*
-----------------------------------------------
69 Funcion para generar uniformes (0,1)
70 -------------------------------------------------
*
/
71 double uniforme(void){
72 double u;
73 u = 1.0
*
rand() / RAND_MAX;
74 return u;
75 }
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.6 Proyectos 89
2.6 Proyectos
En esta seccion encontraras codigos de problemas que he resuelto para incre-
mentar mi biblioteca de programas.
Espero que sean de ayuda para ti.
2.6.1 Regresion lineal

/
*
Nombre del archivo: LR.cpp
Este programa pide las coordenadas (x,y) de n puntos
y los graba en un archivo. Despues lee estos datos y
calcula la recta de mejor ajuste por el metodo de
mnimos cuadrados.
----------------------------------
----------------------------------
Autor: Efran Soto Apolinar
Email: efra.soto.a@gmail.com
efrain@yalma.fime.uanl.mx
Fecha de ultima Modificacion: 21 de marzo de 2008
----------------------------------
----------------------------------
*
/
#include <cstdio> //
#include <cstdlib> //
#include <iostream> // Funciones basicas input/output
#include <math.h> // funciones matematicas
#include <conio.h> // para usar: getche, getch
#include <fstream> // para grabar datos generados...
//
using namespace std;
int main(void){
char respuesta, letra;
// char file_name[15];
int i, j, n; // contadores
double b, m; // parametros...
double xi, yi; // datos
double Sx, Sy, Sxs, Sxy; // sumas de datos...
for(;;){ // for infinito...
Sx = 0; Sy = 0; Sxs = 0; Sxy = 0;
// Informacion sobre el programa...
cout << "\n\nEste programa pide un grupo de datos ";
cout << "\nque corresponden a las coordenadas de n";
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
90 Codigos
cout << "\npuntos en el plano, guarda esta informacion";
cout << "\nen un archivo y despues lee esa informacion";
cout << "\npara encontrar la recta de regresion";
cout << "\n\n\nPor favor, introduce las coordenadas de ";
cout << "\nlos puntos conocidos, ingresando primero";
cout << "\nlacoordenada en x y despues la coordenada en y";
cout << "\nCuando hayas terminado introduce el numero ";
cout << "\n1 000 000, pero sin espacios.";
ifstream in_stream;
ofstream out_stream;
// cout << "\nNombre del archivo: ";
// cin >> file_name;
//out_stream.open(file_name); // creo y abro el archivo...
//
out_stream.open("LR.txt"); // creo y abro el archivo...
if (out_stream.fail()){ // si no puede abrir el archivo...
cout << "\n\nNo se pudo abrir el archivo...";
cout << "\nPor favor, reinicie el programa...";
exit(1); // Termina el programa
}
for (i = 1 ; ; i++){
cout << "\nCoordenada en x del punto " << i << ": ";
cin >> xi;
if (xi == 1000000){
cout << "\n\n\nEl ultimo valor no se incluye
en los datos...";
out_stream.close();// Cierro el archivo...
cout << "\nLos datos se han grabado correctamente...";
cout << "\n\nProcesando informacion...";
n = i - 1; // Numero total de datos...
break;
}
cout << "\nCoordenada en y del punto " << i << ": ";
cin >> yi;
if (yi == 1000000){
cout << "\n\n\nEl ultimo valor no se incluye
en los datos...";
out_stream.close();// Cierro el archivo...
cout << "\nLos datos se han grabado correctamente...";
cout << "\n\nProcesando informacion...";
n = i - 1; // numero total de datos...
break;
}
out_stream << xi << " " << yi << " i\n";
cout << "Dato " << i << " grabado correctamente";
cout << "\n";
} // Termino de grabar la informacion...
// Abrimos el archivo para leer...
in_stream.open("LR.txt");
if (in_stream.fail()){// si no puede abrir el archivo...
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.6 Proyectos 91
cout << "\n\nNo se pudo abrir el archivo...";
cout << "\nPor favor, reinicie el programa...";
exit(1); // Termina el programa
}
for (j=1; j <= n ; j++){ // realizo calculos...
in_stream >> xi >> yi;
do { // estoy buscando el siguiente renglon
in_stream >> letra;
} while (!letra == \n);
//
Sx += xi; // Suma de x
Sy += yi; // Suma de y
Sxy += xi
*
yi; // Suma de xy
Sxs += xi
*
xi; // Suma de x cuadrada
}
// Cierro el archivo de lectura...
in_stream.close();
// Calculo los parametros...
m = (n
*
Sxy - Sx
*
Sy) / (n
*
Sxs - Sx
*
Sx);
b = (Sy - m
*
Sx) / n;
// Muestro los resultados...
cout << "\n\n\n"; // espacio
cout << "La recta de mejor ajuste es: \n";
cout << "\n y = " << b << " + " << m << " x.";
// pregunto si desea salir...
cout << "\n\n\nPresione < S > para salir...";
respuesta = getche();
if ((respuesta == S)||(respuesta == s)){
break; // Salir del ciclo for inicial...
}
cout << "\n\n\n";
} // end for infinito...
return 0;
}
2.6.2 Regresion cuadratica

/
*
Nombre del archivo:CR.cpp
Este programa pide las coordenadas (x,y) de n puntos
y los graba en un archivo. Despues lee estos datos y
calcula:
a) la recta demejor ajuste, la cual se expresa como:
y = beta + mx
b) La parabola de mejor ajuste, que se expresa como:
y = ax2 + bx + c
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
92 Codigos
ambos por el metodo de mnimos cuadrados.
----------------------------------
----------------------------------
Autor: Efran Soto Apolinar
Email: efra.soto.a@gmail.com
efrain@yalma.fime.uanl.mx
Fecha de ultima Modificacion: 21 de marzo de 2008
----------------------------------
----------------------------------
*
/
#include <cstdio> //
#include <cstdlib> //
#include <iostream> // Funciones basicas input/output
#include <conio.h> // para usar getche, getch
#include <fstream> // para grabar los datos generados...
//
using namespace std;
int main(void){
char respuesta, letra;
// char file_name[15];
int i, j, n; // contadores
double a, b, c; // parametros para parabola...
double m, beta; // parametros para recta...
double Da = 0, Dp = 0;
double xi, yi; // datos
double Sx, Sy, Sx2, Sx3, Sx4, Sxy, Sx2y;
double Error_p = 0, Error_r = 0;
double dip, dir, y_approxp, y_approxr;
for(;;){ // for infinito...
Sx = 0; Sy = 0; Sxy = 0;
Sx2 = 0; Sx3 = 0; Sx4 = 0; Sx2y = 0;
// Informacion sobre el programa...
cout << "\n\nEste programa pide un grupo de datos ";
cout << "\nque corresponden a las coordenadas de n";
cout << "\npuntos en el plano, guarda esta informacion";
cout << "\nen un archivo y despues lee esa informacion";
cout << "\npara encontrar la parabola de regresion";
cout << "\n\n\nPor favor, introduce las coordenadas de ";
cout << "\nlos puntos conocidos, ingresando primero";
cout << "\nlacoordenada en x y despues la coordenada en y";
cout << "\nCuando hayas terminado introduce el numero ";
cout << "\n1 000 000, pero sin espacios.";
ifstream in_stream;
ofstream out_stream;
// cout << "\nNombre del archivo: ";
// cin >> file_name;
//out_stream.open(file_name); // creo y abro el archivo...
//
out_stream.open("CR.txt"); // creo y abro el archivo...
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.6 Proyectos 93
if (out_stream.fail()){ // si no puede abrir el archivo...
cout << "\n\nNo se pudo abrir el archivo...";
cout << "\nPor favor, reinicie el programa...";
exit(1); // Termina el programa
}
for (i = 1 ; ; i++){
cout << "\nCoordenada en x del punto " << i << ": ";
cin >> xi;
if (xi == 1000000){
cout << "\n\n\nEl ultimo valor no se incluye
en los datos...";
out_stream.close();// Cierro el archivo...
cout << "\nLos datos se han grabado correctamente...";
cout << "\n\nProcesando informacion...";
n = i - 1; // Numero total de datos...
break;
}
cout << "\nCoordenada en y del punto " << i << ": ";
cin >> yi;
if (yi == 1000000){
cout << "\n\n\nEl ultimo valor no se incluye
en los datos...";
out_stream.close();// Cierro el archivo...
cout << "\nLos datos se han grabado correctamente...";
cout << "\n\nProcesando informacion...";
n = i - 1; // numero total de datos...
break;
}
out_stream << xi << " " << yi << " i\n";
cout << "Dato " << i << " grabado correctamente";
cout << "\n";
} // Termino de grabar la informacion...
// Abrimos el archivo para leer...
in_stream.open("CR.txt");
if (in_stream.fail()){ // si no abrir el archivo...
cout << "\n\nNo se pudo abrir el archivo...";
cout << "\nPor favor, reinicie el programa...";
exit(1); // Termina el programa
}
for (j = 1; j <= n ; j++){ // realizo calculos...
in_stream >> xi >> yi;
do { // estoy buscando el siguiente renglon
in_stream >> letra;
} while (!letra == \n);
//
Sx += xi; // Suma de x
Sy += yi; // Suma de y
Sxy += xi
*
yi; // Suma de xy
Sx2 += xi
*
xi; // Suma de x cuadrada
Sx3 += xi
*
xi
*
xi; // Suma de x cubica
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
94 Codigos
Sx4 += xi
*
xi
*
xi
*
xi; // Suma x cuarta
Sx2y += xi
*
xi
*
yi;
}
// Cierro el archivo de lectura...
in_stream.close();
// Calculo parametros de recta...
m = (n
*
Sxy - Sx
*
Sy) / (n
*
Sx2 - Sx
*
Sx);
beta = (Sy - m
*
Sx) / n;
// Calculo los parametros de parabola...
Da = Sy
*
Sx2
*
Sx2 + n
*
Sxy
*
Sx3 + Sx
*
Sx
*
Sx2y;
Da = Da - n
*
Sx2
*
Sx2y - Sx
*
Sx3
*
Sy - Sx
*
Sxy
*
Sx2;
Dp = Sx2
*
Sx2
*
Sx2 + n
*
Sx3
*
Sx3 + Sx4
*
Sx
*
Sx;
Dp = Dp - n
*
Sx2
*
Sx4 - 2
*
Sx
*
Sx2
*
Sx3;
a = Da / Dp;
b = (Sx
*
(Sy - a
*
Sx2) - n
*
(Sxy - a
*
Sx3))
/ (Sx
*
Sx - n
*
Sx2);
c = (Sy - a
*
Sx2 - b
*
Sx) / n;
// Muestro los resultados...
cout << "\n\n\n"; // espacio
cout << "La recta de mejor ajuste es: \n";
cout << "\n y = " << beta << " + " << m << " x ";
cout << "\n\n\n"; // espacio
cout << "La parabola de mejor ajuste es: \n";
cout << "\n y = " << a << " x2 + " << b << " x + " << c;
cout << "\n\n\n";
//
//
// Vuelvo a abrir el archivo...
in_stream.open("CR.txt");
if (in_stream.fail()){ // si no puede abrir el archivo...
cout << "\n\nNo se pudo abrir el archivo...";
cout << "\nPor favor, reinicie el programa...";
exit(1); // Termina el programa
}
for (j = 1; j <= n ; j++){ // realizo calculos...
in_stream >> xi >> yi;
do { // estoy buscando el siguiente renglon
in_stream >> letra;
} while (!letra == \n);
//
// calculo el pronostico con parabola de regresion...
y_approxp = a
*
xi
*
xi + b
*
xi + c;
y_approxr = beta + m
*
xi;
// discrepancia...
dip = (yi - y_approxp)
*
(yi - y_approxp);
dir = (yi - y_approxr)
*
(yi - y_approxr);
Error_p += dip; // Error total
Error_r += dir;
}
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.6 Proyectos 95
// Cierro el archivo de lectura...
in_stream.close();
cout << "\n\n\n"; // espacio
cout << "\nError total para la recta: " << Error_r;
cout << "\nError total para la parabola: " << Error_p;
//
//
//
cout << "\n\n\n"; // espacio
cout << "Generando datos de la parabola de mejor ajuste...";
// creo y abro el archivo...
// pma = parabola de mejor ajuste.
out_stream.open("pma.txt");
if (out_stream.fail()){ // si no puede abrir el archivo...
cout << "\n\nNo se pudo abrir el archivo...";
cout << "\nPor favor, reinicie el programa...";
exit(1); // Termina el programa
}
// Reinicio las coordenadas...
xi = 0;
yi = 0;
for (i = 0 ; i <= 100 ; i++){
yi = a
*
xi
*
xi + b
*
xi + c;
// grabamos los datos en el archivo...
out_stream << xi << " " << yi << " i\n";
xi = xi + 0.07;
}
cout << "\n\n\nSe han grabado 100 datos
en el intervalo";
cout << "\n(0,7) en el archivo <<pma.txt>>";
out_stream.close();// Cierro el archivo...
// pregunto si desea salir...
cout << "\n\n\nPresione < S > para salir...";
respuesta = getche();
if ((respuesta == S)||(respuesta == s)){
break; // Salir del ciclo for inicial...
}
cout << "\n\n\n";
} // end for infinito...
return 0;
}
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
96 Codigos
2.7 Librer

a Estad

stica
Crear una librera con funciones estadsticas basicas para utilizar durante los
siguientes semestres de la maestra.
Media / Desviacion estandar / Varianza
Moda (intervalo de mayor frecuencia)
Gracar el histograma de frecuencias
Generadores de n umeros pseudoalestorios con las siguientes distribuciones:
Uniforme en el intervalo (0,1),
Uniforme en el intervalo (a, b), denido por el usuario,
Normal con media 0.0 y desviacion estandar 1.0,
Normal con media y desviacion estandar , denidas por el usuario,
Exponencial con parametro , denido por el usuario,
Weibull con parametros de forma c y de escala k, denidos por el
usuario,
Rayleigh con media , denida por el usuario.
La librera se codicara de manera que se pueda utilizar en el lenguaje C
++
,
con posibilidad de adaptarla al lenguaje ANSI-C.
2.8 Implementaci

on
Puede accesar al archivo Puede accesar al archivo Puede accesar al archivo Puede accesar al archivo Puede accesar al archivo Puede accesar al archivo Puede accesar al archivo Puede accesar al archivo Puede accesar al archivo Puede accesar al archivo Puede accesar al archivo Puede accesar al archivo Puede accesar al archivo Puede accesar al archivo Puede accesar al archivo Puede accesar al archivo Puede accesar al archivo estadistica.h con un clc derecho con un clc derecho con un clc derecho con un clc derecho con un clc derecho con un clc derecho con un clc derecho con un clc derecho con un clc derecho con un clc derecho con un clc derecho con un clc derecho con un clc derecho con un clc derecho con un clc derecho con un clc derecho con un clc derecho y elija y elija y elija y elija y elija y elija y elija y elija y elija y elija y elija y elija y elija y elija y elija y elija y elija Open File
en el siguiente cono en el siguiente cono en el siguiente cono en el siguiente cono en el siguiente cono en el siguiente cono en el siguiente cono en el siguiente cono en el siguiente cono en el siguiente cono en el siguiente cono en el siguiente cono en el siguiente cono en el siguiente cono en el siguiente cono en el siguiente cono en el siguiente cono : . O bien, con doble clc doble clc doble clc doble clc doble clc doble clc doble clc doble clc doble clc doble clc doble clc doble clc doble clc doble clc doble clc doble clc doble clc sobre el mismo.
A continuacion esta el codigo del mismo archivo.
1 /
*
2 Nombre del archivo: "estadistica.h"
3 Descripci on:
4 Este archivo contiene funciones y clases
5 para trabajar con cuestiones de probabilidad.
6
7 Las funciones se detallan con comentarios
8 en el c odigo.
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.8 Implementacion 97
9
10
11 Fecha de ultima Modificaci on: 02 de junio de 2008.
12
13 BIBLIOGRAF

IA CONSULTADA:
14 -----------------------------------------
15 CUESTIONES DE ESTAD

ISTICA...
16 -----------------------------------------
17 [1] Jerry Banks, John S. Carson II, Barry L. Nelson.
18 Discrete-Event System Simulation.
19 Ed. Prentice Hall.
20 2nd Edition.
21 1996. U.S.A.
22
23 [2] John E. Freund
24 Mathematical Statistics
25 Ed. Prentice Hall
26 5th Edition.
27 1992. U.S.A.
28
29 -----------------------------------------
30 CUESTIONES DE PROGRAMACI

ON...
31 -----------------------------------------
32 [1] Walter Savitch
33 Problem Solving with C++: The Object of Programming
34 Ed. Addison Wesley Longmann Inc.
35 U.S.A. 1999.
36
37 [2] Edward Scheinerman
38 C++ for Mathematicians
39 An Introduction for Students and Professionals
40 Ed. Chapman & Hall/CRC
41 2006. U.S.A.
42
43 [3] Herbert Schildt
44 C++: The Complete Reference
45 Third Edition
46 Ed. McGraw-Hill
47 1998. U.S.A.
48
49 -----------------------------------------
50 Sitios de Internet Consultados...
51 -----------------------------------------
52 - Algoritmo para generar n umeros
53 pseudoaleatorios con distribuci on Rayleigh:
54 http://www.brighton-webs.co.uk/distributions/rayleigh.asp
55
56
*
/
57
58 #ifndef PROBABILITY_H
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
98 Codigos
59 #define PROBABILITY_H
60
61 #include <math.h>
62 #include <time.h>
63 #include <stdlib.h>
64 #include <stdio.h>
65 #include <wchar.h>
66 #include <ctype.h>
67 #include <assert.h>
68
69
70 const double PI = 3.141592654;
71 const long PROBABILITY_RAND_MAX = 2147483647;// = 231 - 1;
72
73 // Declaro las funciones...
74 void suniforme(unsigned seed);
75 double uniforme(void);
76 double uniforme(float a, float b);
77 void funiforme(int N, char filename[]);
78 void funiforme(int N, float a, float b, char filename[]);
79 double lpuniforme(void);
80
81 //double triangular(double media);
82 double normal(void);
83 double normal(double media, double desviacionStd);
84 void fnormal(int N, char filename[]);
85 void fnormal(int N, char filename[], double media,
86 double desvStd);
87 void errorDNormal(void);
88
89 double weibull(double c, double k);
90 void fweibull(int N, double C, double K, char filename[]);
91
92 float exponencial(float lambda);
93 void fexponencial(int N, float Lambda, char filename[]);
94
95 int geometrica(float p);
96 void fgeometrica(int N, float p, char filename[]);
97 int poisson(float alpha);
98 void fpoisson(int N, float a, char filename[]);
99
100 double rayleigh(float media);
101 void frayleigh(int N, char filename[], float M);
102 void ftriangular(int N, char filename[], float media);
103
104 double media(char filename[]);
105 double desviacionStd(char filename[]);
106
107 double media(char filename[]);
108 double desviacionStd(char filename[]);
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.8 Implementacion 99
109
110 void histograma(char filename[]);
111 void histograma(char filename[], int No_Int);
112 //hist Phistograma(char filename[], int No_Int);
113
114 void PchiUniforme(char filename[], int Num_Int, float alpha);
115
116 /
***************************************************
117 double uniforme(void)
118 Descripci on:
119 Esta funci on genera un n umero pseudo-aleatorio
120 con distribuci on uniforme en el intervalo (0,1).
121 BUGS:
122 Ninguno conocido...
123
****************************************************
/
124 double uniforme(void){/
***
[tested]
***
/
125 double u;
126 u = (double)(rand()) / (double)(RAND_MAX);
127 return u;
128 }
129
130
131
132 /
***************************************************
133 double uniforme(float a, float b)
134 Descripci on:
135 Esta funci on genera un n umero pseudo-aleatorio
136 con distribuci on uniforme en el intervalo (a,b).
137 /////////////////////////////////////////////////////
138 BUGS:
139 Ninguno conocido...
140
****************************************************
/
141 double uniforme(float a, float b){/
***
[tested]
***
/
142 double x;
143 x = (double)(a) + uniforme()
*
(double)(b - a);
144 return x;
145 }
146
147 /
***************************************************
148 void funiforme(int N, char filename[15])
149 Descripci on:
150 Esta funci on guarda N n umeros pseudoaleatorios
151 con distribuci on uniforme en el intervalo (0,1)
152 en el archivo con nombre <<filename>>.
153 /////////////////////////////////////////////////////
154 BUGS:
155 Ninguno conocido.
156
****************************************************
/
157 void funiforme(int N, char filename[15]){/
***
[tested]
***
/
158 float x;
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
100 Codigos
159 FILE
*
stream_unif; //
160 stream_unif = fopen(filename, "w"); // abrir archivo
161 if (stream_unif == NULL){
162 printf ("\nNo se puede abrir el archivo %s\n",
163 filename);
164 printf("\nPor favor, verifique el nombre archivo");
165 return;
166 }
167 fprintf(stream_unif, "# Este archivo contiene %i
168 n umeros\n", N);
169 fprintf(stream_unif, "# pseudoaletorios con distribucion
170 uniforme\n");
171 fprintf(stream_unif, "# en el intervalo [0.0, 1.0]\n");
172 // Aqu va el c odigo para grabar...
173 for(int i = 1 ; i <= N ; i++){
174 x = uniforme(); // generamos un n umero
175 fprintf(stream_unif, "%f\n", x); // grabamos...
176 }
177 fclose(stream_unif); // cerrar archivo...
178 }
179
180 /
***************************************************
181 void funiforme(int N, char filename[], float a, float b)
182 Descripci on:
183 Esta funci on guarda N n umeros pseudoaleatorios
184 con distribuci on uniforme en el intervalo (a,b)
185 en el archivo con nombre <<filename>>.
186 /////////////////////////////////////////////////////
187 BUGS:
188 Ninguno conocido.
189
****************************************************
/
190 void funiforme(int N, char filename[], float a, float b){
191 /
***
[tested]
***
/
192 float x;
193 FILE
*
stream_unif; //
194 stream_unif = fopen(filename, "w"); // abrir archivo
195 if (stream_unif == NULL){
196 printf ("\nNo se puede abrir el archivo %s\n",
197 filename);
198 printf("\nPor favor, verifique el nombre archivo");
199 return;
200 }
201 fprintf(stream_unif, "# Este archivo contiene %i
202 n umeros\n", N);
203 fprintf(stream_unif, "# pseudoaletorios con distribucion
204 uniforme\n");
205 fprintf(stream_unif, "# en el intervalo [%.3f,%.3f]\n",
206 a, b);
207 // Aqu va el c odigo para grabar...
208 for(int i = 1 ; i <= N ; i++){
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.8 Implementacion 101
209 x = uniforme(a, b); // generamos un n umero
210 fprintf(stream_unif, "%f\n", x); // grabamos...
211 }
212 fclose(stream_unif); // cerrar archivo...
213 }
214
215
216 /
***************************************************
217 double lpuniforme(void)
218 Descripci on:
219 Esta funci on genera n umeros pseudoaleatorios
220 con distribuci on normal con media 0.0
221 y desviaci on est andar 1.0.
222 /////////////////////////////////////////////////////
223 BUGS:
224
*
Este generador de n umeros seudoaleatorios
225 solamente ha sido probado dibujando histogramas
226 y parece presentar distribuci on uniforme.
227 NO se ha sometido a ninguna prueba estad stica
228 formal.
229
*
Se sugiere utilizar para requerimientos de
230 grandes cantidades de n umeros pseudoaleatorios.
231
*
Cuando se utiliza para generar n umeros
232 pseudoaleatorios con distribuci on normal
233 el histograma aparece con sesgo negativo
234 (corrido hacia la derecha). [Instancia de
235 10,000 n umeros generados]
236
****************************************************
/
237 double lpuniforme(void){
238 double u;
239 int primo1 = 8191; // = 213 - 1; N umero primo
240 int primo2 = 524287; // = 219 - 1; Otro n umero primo
241 static int semilla = 1001; // es primo...
242 static bool first = true;
243 if (first){
244 first = false;
245 return ((double)(semilla)/((double)
246 (PROBABILITY_RAND_MAX)));
247 }
248 unsigned modular = semilla;
249 //
250 modular = (primo1
*
modular + primo2) %
251 PROBABILITY_RAND_MAX;
252 semilla = modular; // cambio el valor de la semilla...
253 // calculo el valor que me va a devolver...
254 u = (double)(modular) / ((double)
255 (PROBABILITY_RAND_MAX));
256 return (u);
257 }
258
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
102 Codigos
259 /
***************************************************
260 double normal(void)
261 Descripci on:
262 Esta funci on genera n umeros pseudoaleatorios
263 con distribuci on normal con media 0.0
264 y desviaci on est andar 1.0.
265 /////////////////////////////////////////////////////
266 BUGS:
267 Ninguno conocido...
268
****************************************************
/
269 double normal(void){/
***
[tested]
***
/
270 double media = 0.0, desviacionStd = 1.0;
271 double u, x, v, z;
272 u = uniforme();
273 v = uniforme();
274 x = sqrt(-2
*
log(u))
*
cos(2
*
PI
*
v);
275 if (u >= 0.5){
276 z = media + desviacionStd
*
x;
277 }
278 else{
279 z = media - desviacionStd
*
x;
280 }
281 return z;
282 }
283
284 /
***************************************************
285 double normal(double media, double desviacionStd)
286 Descripci on:
287 Esta funci on genera n umeros pseudoaleatorios
288 con distribuci on normal con media << media >>
289 y desviaci on est andar << desviacionStd >>
290 /////////////////////////////////////////////////////
291 BUGS:
292 Ninguno conocido...
293
****************************************************
/
294 double normal(double media, double desviacionStd){
295 /
***
[tested]
***
/
296 if (desviacionStd <= 0){
297 errorDNormal();
298 return 0.0;
299 }
300 double u, x, v, z;
301 u = uniforme();
302 v = uniforme();
303 x = sqrt(-2
*
log(u))
*
cos(2
*
PI
*
v);
304 if (u >= 0.5){
305 z = media + desviacionStd
*
x;
306 }
307 else{
308 z = media - desviacionStd
*
x;
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.8 Implementacion 103
309 }
310 return z;
311 }
312
313 /
***************************************************
314 void fnormal(int N, char filename[15])
315 Descripci on:
316 Esta funci on guarda N n umeros pseudoaleatorios
317 con distribuci on normal con media 0.0 y
318 desviacion est andar 1.0 en el archivo con
319 nombre <<filename>>.
320 /////////////////////////////////////////////////////
321 BUGS:
322 Ninguno conocido...
323
****************************************************
/
324 void fnormal(int N, char filename[]){/
***
[tested]
***
/
325 double x;
326 FILE
*
stream_normal; //
327 stream_normal = fopen(filename, "w"); // abrir archivo
328 if (stream_normal == NULL){
329 printf ("\nNo se puede abrir el archivo %s\n",
330 filename);
331 printf("\nPor favor, verifique el nombre archivo");
332 return;
333 }
334 fprintf(stream_normal, "# Este archivo contiene %i
335 n umeros\n", N);
336 fprintf(stream_normal, "# pseudoaletorios con distribucion
337 normal\n");
338 fprintf(stream_normal, "# con media = 0.0 y desviacion
339 estandar = 1.0\n");
340 // Aqu va el c odigo para grabar...
341 for(int i = 1 ; i <= N ; i++){
342 x = normal(); // generamos un n umero
343 fprintf(stream_normal, "%f\n", x); // grabamos...
344 }
345 fprintf(stream_normal, "\n# Fin del archivo...\n");
346 fclose(stream_normal); // cerrar archivo...
347 }
348 /
**********************************************
349 void fnormal(int N, char filename[], float med, float desvStd)
350 Descripci on:
351 Esta funci on guarda N n umeros pseudoaleatorios
352 con distribuci on normal con media << med >> y
353 desviacion est andar << desvStd >> en el archivo
354 de nombre <<filename>>.
355 /////////////////////////////////////////////////////
356 BUGS:
357 Ninguno conocido...
358
**********************************************
/
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
104 Codigos
359 void fnormal(int N, char filename[], float med, float desvStd){
360 /
***
[tested]
***
/
361 if (desviacionStd <= 0){
362 errorDNormal();
363 return;
364 }
365 double x;
366 FILE
*
stream_normal; //
367 stream_normal = fopen(filename, "w"); // abrir archivo
368 if (stream_normal == NULL){
369 printf ("\nNo se puede abrir el archivo %s\n",
370 filename);
371 printf("\nPor favor, verifique el nombre archivo");
372 return;
373 }
374 fprintf(stream_normal, "# Este archivo contiene %i
375 n umeros\n", N);
376 fprintf(stream_normal, "# pseudoaletorios con
377 distribucion normal\n");
378 fprintf(stream_normal, "# con media = %.3f y desviacion
379 est andar = %.3f.\n", med, desvStd);
380 // Aqu va el c odigo para grabar...
381 for(int i = 1 ; i <= N ; i++){
382 x = normal(med, desvStd); // generamos un n umero
383 fprintf(stream_normal, "%f\n", x); // grabamos...
384 }
385 fprintf(stream_normal, "\n# Fin del archivo...\n");
386 fclose(stream_normal); // cerrar archivo...
387 return;
388 }
389
390 /
***************************************************
391 double lnormal(void)
392 Descripci on:
393 Esta funci on genera n umeros pseudoaleatorios
394 con distribuci on normal con media 0.0
395 y desviaci on est andar 1.0.
396 /////////////////////////////////////////////////////
397 BUGS:
398 Esta funci on genera n umeros que presentan un sesgo
399 hacia la derecha cuando se grafican su histograma
400 de frecuencias. Sin embargo, los calculos de media
401 y desciaci on est andar est an cercanos a 0.0 y 1.0,
402 respectivamente.
403
****************************************************
/
404 double lnormal(void){/
***
[tested]
***
/
405 double media = 0.0, desviacionStd = 1.0;
406 double u, x, v, z;
407 u = lpuniforme();
408 v = lpuniforme();
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.8 Implementacion 105
409 x = sqrt(-2
*
log(u))
*
cos(2
*
PI
*
v);
410 if (u >= 0.5){
411 z = media + desviacionStd
*
x;
412 }
413 else{
414 z = media - desviacionStd
*
x;
415 }
416 return z;
417 }
418
419
420 void errorDNormal(void){
421 // Imposible generar n umero
422 // con distribuci on normal as ...
423 printf("\n\nError en el segundo argumento de funci on:");
424 printf("\ndouble normal(double media, double
425 desviacionStd)");
426 printf("\ndesviacionStd debe ser un n umero
427 positivo...");
428 printf("\nPor favor corrija el valor...");
429 return;
430 }
431
432 /
**************************************
433 float exponencial(float lambda)
434 Descripci on:
435 Esta funci on genera n umeros pseudoaleatorios
436 con distribuci on exponencial de par ametro
437 lambda.
438 /////////////////////////////////////////////////////
439 BUGS:
440 Ninguno conocido...
441
***************************************
/
442 float exponencial(float lambda){/
***
[tested]
***
/
443 double x;
444 x = -log(1 - uniforme()) / lambda;
445 return x;
446 }
447
448 /
**************************************
449 void fexponencial(int N, float Lambda, char filename[15])
450 Descripci on:
451 Esta funci on genera N n umeros pseudoaleatorios
452 con distribuci on exponencial, con par ametro
453 << Lambda >>, y los graba en el archivo de nombre
454 << filename >>
455 /////////////////////////////////////////////////////
456 BUGS:
457 Ninguno conocido...
458
***************************************
/
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
106 Codigos
459 void fexponencial(int N, float Lambda, char filename[]){
460 /
***
[tested]
***
/
461 float x;
462 FILE
*
stream_exponencial; //
463 stream_exponencial = fopen(filename, "w");//abrir archivo
464 if (stream_exponencial == NULL){
465 printf ("\nNo se puede abrir el archivo %s\n",
466 filename);
467 printf("\nPor favor, verifique el nombre archivo");
468 return;
469 }
470 fprintf(stream_exponencial, "# Este archivo contiene %i
471 n umeros\n", N);
472 fprintf(stream_exponencial, "# pseudoaletorios con
473 distribucion exponencial\n");
474 fprintf(stream_exponencial, "# con par ametro lambda =
475 %.3f\n", Lambda);
476 // Aqu va el c odigo para grabar...
477 for(int i = 1 ; i <= N ; i++){
478 x = exponencial(Lambda); // generamos un n umero
479 fprintf(stream_exponencial, "%f\n", x);
480 }
481 fprintf(stream_exponencial, "\n# Fin del archivo...\n");
482 fclose(stream_exponencial); // cerrar archivo...
483 }
484
485
486 /
**************************************
487 float geometrica(float p)
488 Descripci on:
489 Esta funci on genera n umeros pseudoaleatorios
490 con distribuci on geometrica de par ametro p.
491 /////////////////////////////////////////////////////
492 BUGS:
493 Ninguno conocido...
494
***************************************
/
495 int geometrica(float p){
496 double x;
497 int y;
498 x = (log(1 - uniforme()) / log(1 - p)) - 1;
499 y = (int)(x + 0.5); // redondeo... [round Up]
500 return y;
501 }
502
503
504 /
**************************************
505 void fgeometrica(int N, float p, char filename[15])
506 Descripci on:
507 Esta funci on genera N n umeros pseudoaleatorios
508 con distribuci on geometrica, con par ametro
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.8 Implementacion 107
509 << p >>, y los graba en el archivo de nombre
510 << filename >>.
511 /////////////////////////////////////////////////////
512 BUGS:
513 Ninguno conocido...
514
***************************************
/
515 void fgeometrica(int N, float p, char filename[]){
516 /
***
[tested]
***
/
517 int x;
518 FILE
*
stream_geometrica; //
519 stream_geometrica = fopen(filename, "w");// abrir archivo
520 if (stream_geometrica == NULL){
521 printf ("\nNo se puede abrir el archivo %s\n",
522 filename);
523 printf("\nPor favor, verifique el nombre archivo");
524 return;
525 }
526 fprintf(stream_geometrica, "# Este archivo contiene %i
527 n umeros\n", N);
528 fprintf(stream_geometrica, "# pseudoaletorios con
529 distribucion geom etrica\n");
530 fprintf(stream_geometrica, "# con par ametro p =
531 %.3f\n", p);
532 // Aqu va el c odigo para grabar...
533 for(int i = 1 ; i <= N ; i++){
534 x = geometrica(p); // generamos un n umero
535 fprintf(stream_geometrica, "%i\n", x);
536 }
537 fprintf(stream_geometrica, "\n# Fin del archivo...\n");
538 fclose(stream_geometrica); // cerrar archivo...
539 }
540
541
542 /
**************************************
543 int poisson(float alpha)
544 Descripci on:
545 Esta funci on genera n umeros pseudoaleatorios
546 con distribuci on Poisson de par ametro alpha.
547 /////////////////////////////////////////////////////
548 BUGS:
549 Ninguno conocido...
550
***************************************
/
551 int poisson(float alpha){
552 int n = 0;
553 static int p = 1;
554 double comparador;
555 double u;
556 do{
557 u = (double)(rand()) / (double)(RAND_MAX);
558 comparador
*
= p
*
u;
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
108 Codigos
559 n++;
560 } while (comparador > exp(-alpha));
561 return n;
562 }
563
564
565 /
**************************************
566 void fpoisson(int N, float a, char filename[15])
567 Descripci on:
568 Esta funci on genera N n umeros pseudoaleatorios
569 con distribuci on poisson, con par ametro
570 << a >>, y los graba en el archivo de nombre
571 << filename >>.
572 /////////////////////////////////////////////////////
573 BUGS:
574 Ninguno conocido...
575
***************************************
/
576 void fpoisson(int N, float a, char filename[]){
577 /
***
[tested]
***
/
578 int x;
579 FILE
*
stream_poisson; //
580 stream_poisson = fopen(filename, "w");// abrir archivo
581 if (stream_poisson == NULL){
582 printf ("\nNo se puede abrir el archivo %s\n",
583 filename);
584 printf("\nPor favor, verifique el nombre archivo");
585 return;
586 }
587 fprintf(stream_poisson, "# Este archivo contiene %i
588 n umeros\n", N);
589 fprintf(stream_poisson, "# pseudoaletorios con
590 distribucion geom etrica\n");
591 fprintf(stream_poisson, "# con par ametro p = %.3f\n",
592 a);
593 // Aqu va el c odigo para grabar...
594 for(int i = 1 ; i <= N ; i++){
595 x = poisson(a); // generamos un n umero
596 fprintf(stream_poisson, "%i\n", x);
597 }
598 fprintf(stream_poisson, "\n# Fin del archivo...\n");
599 fclose(stream_poisson); // cerrar archivo...
600 }
601
602
603
604 /
***************************************************
605 double weibull(double c, double k)
606 Esta funci on genera n umeros pseudoaleatorios
607 con distribuci on Weibull.
608 Los par ametros c y k corresponden a la forma
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.8 Implementacion 109
609 y escala de la distribuci on, respectivamente.
610 /////////////////////////////////////////////////////
611 BUGS:
612 Ninguno conocido...
613
****************************************************
/
614 double weibull(double c, double k){/
***
[tested]
***
/
615 double x;
616 x = c
*
pow(-log(1 - uniforme()), 1/k);
617 return x;
618 }
619
620 /
***************************************************
621 void fweibull(int N, char filename[15], float C, float K)
622 Descripci on:
623 Esta funci on genera N n umeros pseudoaleatorios
624 con distribuci on weibull, con par ametros
625 << C >> y << K >>, y los graba en el archivo de
626 nombre << filename >>.
627 /////////////////////////////////////////////////////
628 BUGS:
629 Ninguno conocido...
630
****************************************************
/
631 void fweibull(int N, char filename[], float C, float K){
632 /
***
[tested]
***
/
633 float x;
634 FILE
*
stream_weib; //
635 stream_weib = fopen(filename, "w"); // abrir archivo
636 if (stream_weib == NULL){
637 printf ("\nNo se puede abrir el archivo %s\n",
638 filename);
639 printf("\nPor favor, verifique el nombre archivo");
640 return;
641 }
642 fprintf(stream_weib, "# Este archivo contiene %i
643 n umeros\n", N);
644 fprintf(stream_weib, "# pseudoaletorios con distribucion
645 Weibull\n");
646 fprintf(stream_weib, "# con par ametros C = %.3f y K =
647 %.3f\n", C, K);
648 // Aqu va el c odigo para grabar...
649 for(int i = 1 ; i <= N ; i++){
650 x = weibull(C, K); // generamos un n umero
651 fprintf(stream_weib, "%f\n", x); // grabamos...
652 }
653 fclose(stream_weib); // cerrar archivo...
654 }
655
656 /
**************************************
657 double rayleigh(float media)
658 Descripci on:
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
110 Codigos
659 Esta funci on genera n umeros pseudoaleatorios
660 con distribuci on rayleigh con media << media >>
661 Fuente:
662 http://www.brighton-webs.co.uk/distributions/rayleigh.asp
663 /////////////////////////////////////////////////////
664 BUGS:
665 Ninguno conocido...
666
***************************************
/
667 double rayleigh(float media){/
***
[tested]
***
/
668 double factor, r;
669 factor = media / 1.253314;
670 r = sqrt(-2
*
factor
*
factor
*
log(uniforme()));
671 return r;
672 }
673
674 /
***************************************************
675 void frayleigh(int N, char filename[15], float M)
676 Descripci on:
677 Esta funci on genera N n umeros pseudoaleatorios
678 con distribuci on rayleigh, con media
679 << M >> y los graba en el archivo de
680 nombre << filename >>.
681 /////////////////////////////////////////////////////
682 BUGS:
683 Ninguno conocido...
684
****************************************************
/
685 void frayleigh(int N, char filename[], float M){
686 /
***
[tested]
***
/
687 float x;
688 FILE
*
stream_rayl; //
689 stream_rayl = fopen(filename, "w"); // abrir archivo
690 if (stream_rayl == NULL){
691 printf ("\nNo se puede abrir el archivo %s\n",
692 filename);
693 printf("\nPor favor, verifique el nombre archivo");
694 return;
695 }
696 fprintf(stream_rayl, "# Este archivo contiene %i
697 n umeros\n", N);
698 fprintf(stream_rayl, "# pseudoaletorios con distribuci on
699 Rayleigh\n");
700 fprintf(stream_rayl, "# con media = %.3f\n", M);
701 // Aqu va el c odigo para grabar...
702 for(int i = 1 ; i <= N ; i++){
703 x = rayleigh(M); // generamos un n umero
704 fprintf(stream_rayl, "%f\n", x); // grabamos...
705 }
706 fclose(stream_rayl); // cerrar archivo...
707 }
708
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.8 Implementacion 111
709
710 /
***************************************************
711 double triangular(double media)
712 Esta funci on genera n umeros pseudoaleatorios
713 con distribuci on triangular con par ametro << media >>
714 /////////////////////////////////////////////////////
715 BUGS:
716 Al dibujar el histograma la distribuci on en realidad
717 no parece triangular...
718 NO USAR...
719 BUSCAR EN INTERNET C

OMO SIMULARLA...
720
****************************************************
/
721 double triangular(double media){
722 double R, x;
723 R = uniforme();
724 if (R <= 0.5){
725 x = sqrt(2
*
media
*
R); // Ok...
726 }
727 else{
728 x = media
*
(2 - sqrt(2
*
(R)));
729 }
730 return x;
731 }
732
733 /
***************************************************
734 void ftriangular(int N, char filename[], float media)
735 Descripci on:
736 Esta funci on genera N n umeros pseudoaleatorios
737 con distribuci on rayleigh, con media
738 << M >> y los graba en el archivo de
739 nombre << filename >>.
740 /////////////////////////////////////////////////////
741 BUGS:
742 Ninguno conocido...
743
****************************************************
/
744 void ftriangular(int N, char filename[], float media){
745 /
***
[tested]
***
/
746 float x;
747 FILE
*
stream_tria; //
748 stream_tria = fopen(filename, "w"); // abrir archivo
749 if (stream_tria == NULL){
750 printf ("\nNo se puede abrir el archivo %s\n",
751 filename);
752 printf("\nPor favor, verifique el nombre archivo");
753 return;
754 }
755 fprintf(stream_tria, "# Este archivo contiene %i
756 n umeros\n", N);
757 fprintf(stream_tria, "# pseudoaletorios con distribuci on
758 Rayleigh\n");
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
112 Codigos
759 fprintf(stream_tria, "# con media = %.3f\n", media);
760 // Aqu va el c odigo para grabar...
761 for(int i = 1 ; i <= N ; i++){
762 x = triangular(media); // generamos un n umero
763 fprintf(stream_tria, "%f\n", x); // grabamos...
764 }
765 fclose(stream_tria); // cerrar archivo...
766 }
767
768
769
770
771
772
773 /
**************************************
774 double media(char filename[])
775 Descripci on:
776 Esta funci on calcula la media aritm etica de
777 los datos contenidos en el archivo de nombre
778 << filename >>.
779 /////////////////////////////////////////////////////
780 BUGS:
781 Ninguno conocido...
782
***************************************
/
783 double media(char filename[]){/
***
[tested]
***
/
784 char respuesta, letra = ;
785 double datum;
786 double x, Sx;
787 double media; // lo que va a regresar
788 int n = 0, j = 1, i = 0; // contadores...
789 char dato[15];
790 char B4; // letra leida antes...
791 FILE
*
stream_media; // stream_uniforme
792 stream_media = fopen(filename, "r+"); // abrir archivo
793 if (stream_media == NULL){
794 printf ("\nNo se puede abrir el archivo %s\n",
795 filename);
796 printf("\nPor favor, verifique el nombre archivo");
797 system("PAUSE");
798 return 0;
799 }
800 Sx = 0; // reinicio la suma de datos
801 // Ahora leemos los datos...
802 do{
803 letra = fgetc(stream_media); // leer un char
804 if (letra == feof(stream_media)){
805 break; // Salir del ciclo...
806 }
807 switch(letra){
808 case \n: // lleg o a un nuevo rengl on
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.8 Implementacion 113
809 if (i > 1){
810 dato[i] = \0; // fin del arreglo
811 x = atof(dato); // convierto a float
812 Sx += x; // Suma de x
813 i = 0;
814 n++;
815 }
816 break;
817 case \t: // para el caso de varias columnas...
818 //if (i > 0){
819 dato[i] = \0; // fin del arreglo
820 x = atof(dato); // convierto a float
821 Sx += x; // Suma de x
822 i = 0;
823 n++;
824 //}
825 break;
826 case : // espacio en blanco...
827 if (i > 1){
828 dato[i] = \0; // fin del arreglo
829 x = atof(dato); // convierto a float
830 Sx += x; // Suma de x
831 i = 0;
832 n++;
833 break;
834 }
835 case #: // comentario...
836 do{ // leer todos los alfanum ericos
837 letra = fgetc(stream_media);
838 if (letra == feof(stream_media)){
839 break;
840 }
841 } while (letra!=\n);
842 i = 1;
843 dato[0] = letra;
844 break;
845 default:
846 dato[i] = letra;
847 i++;
848 }
849 } while(!feof(stream_media));
850 fclose(stream_media); // cerrar archivo...
851
852 media = Sx / (1.0
*
n);
853 return(media);
854 }
855
856 /
**************************************
857 double desviacionStd(char filename[15])
858 Descripci on:
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
114 Codigos
859 Esta funci on calcula la desviaci on est andar de
860 los datos contenidos en el archivo de nombre
861 << filename >>.
862 /////////////////////////////////////////////////////
863 BUGS:
864 Ninguno conocido...
865
***************************************
/
866 double desviacionStd(char filename[]){/
***
[tested]
***
/
867 char respuesta, letra = ;
868 double datum;
869 double x, Sx, Sx2;
870 double varianza, sd;
871 int n = 0, j = 1, i = 0; // contadores...
872 char dato[15];
873 char B4; // letra leida antes...
874 FILE
*
stream_sd; // stream_uniforme
875 stream_sd = fopen(filename, "r+"); // abrir archivo
876 if (stream_sd == NULL){
877 printf ("\nNo se puede abrir el archivo %s\n",
878 filename);
879 printf("\nPor favor, verifique el nombre archivo");
880 return 0.0;
881 }
882 Sx = 0, Sx2 = 0; // reinicio los contadores
883 // Ahora leemos los datos...
884 do{
885 letra = fgetc(stream_sd); // leer un char
886 if (letra == feof(stream_sd)){
887 break; // Salir del ciclo...
888 }
889 switch(letra){
890 case \n: // lleg o a un nuevo rengl on
891 if (i > 1){
892 dato[i] = \0; // fin del arreglo
893 x = atof(dato); // convierto a float
894 Sx += x; // Suma de x
895 Sx2 += x
*
x; // Suma de x2
896 i = 0;
897 n++;
898 }
899 break;
900 case \t: // para el caso de varias columnas...
901 //if (i > 0){
902 dato[i] = \0; // fin del arreglo
903 x = atof(dato); // convierto a float
904 Sx += x; // Suma de x
905 Sx2 += x
*
x; // Suma de x2
906 i = 0;
907 n++;
908 //}
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.8 Implementacion 115
909 break;
910 case : // espacio en blanco...
911 if (i > 1){
912 dato[i] = \0; // fin del arreglo
913 x = atof(dato); // convierto a float
914 Sx += x; // Suma de x
915 Sx2 += x
*
x; // Suma de x2
916 i = 0;
917 n++;
918 break;
919 }
920 case #: // comentario...
921 do{ // leer todos los alfanum ericos
922 letra = fgetc(stream_sd);
923 if (letra == feof(stream_sd)){
924 break;
925 }
926 } while (letra!=\n);
927 i = 1;
928 dato[0] = letra;
929 break;
930 default:
931 dato[i] = letra;
932 i++;
933 }
934 } while(!feof(stream_sd));
935 fclose(stream_sd); // cerrar archivo...
936 varianza = (Sx2 - Sx
*
Sx / (1.0
*
n)) / (n - 1.0);
937 sd = sqrt(varianza);
938 return(sd);
939 printf("\n\n\n");
940 }
941
942
943
944
945 /
**************************************
946 void histograma(char filename[15])
947 Descripci on:
948 Esta funci on genera un histograma en la pantalla
949 a partir de los datos le dos en el archivo de
950 nombre filename.
951 /////////////////////////////////////////////////////
952 BUGS:
953 Ninguno conocido...
954
***************************************
/
955 void histograma(char filename[]){/
***
[tested]
***
/
956 int I[10]; // los intervalos...
957 int errores = 0, max =0, min = 1000000;
958 int n = 0, j = 1, i = 0; // contadores
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
116 Codigos
959 int imax, imin;//
960 double vmax = -2147483647, vmin = 2147483647;
961 double anchoIntervalo; // = vmax - vmin
962 char dato[15]; // cada dato en forma de string
963 float x; // el n umero generado...
964 double escala; // para hacer la gr afica...
965 int factor; // para hacer la gr afica...
966 char letra = ;
967 //
968 // limpio la memoria del array para el histograma...
969 for (i = 0 ; i <= 9 ; i++){
970 I[i] = 0;
971 }
972 // Histograma
973 FILE
*
stream_histo; //
974 stream_histo = fopen(filename, "r+"); // abrir archivo
975 if (stream_histo == NULL){
976 printf ("\nNo se puede abrir el archivo %s\n",
977 filename);
978 printf("\nPor favor, verifique el nombre archivo");
979 return;
980 }
981 // Ahora leemos los datos...
982 do{
983 letra = fgetc(stream_histo); // leer un char
984 if (letra == feof(stream_histo)){
985 break; // Salir del ciclo...
986 }
987 switch(letra){
988 case \n: // lleg o a un nuevo rengl on
989 if (i > 1){
990 dato[i] = \0; // fin del arreglo
991 x = atof(dato); // convierto a float
992 // encuentro el m nimo y el m aximo...
993 if (x > vmax){
994 vmax = x;
995 }
996 if (x < vmin){
997 vmin = x;
998 }
999 i = 0;
1000 n++;
1001 }
1002 break;
1003 case \t: // para el caso de varias columnas...
1004 dato[i] = \0; // fin del arreglo
1005 x = atof(dato); // convierto a float
1006 // encuentro el m nimo y el m aximo...
1007 if (x > vmax){
1008 vmax = x;
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.8 Implementacion 117
1009 }
1010 if (x < vmin){
1011 vmin = x;
1012 }
1013 i = 0;
1014 n++;
1015 break;
1016 case : // espacio en blanco...
1017 if (i > 1){
1018 dato[i] = \0; // fin del arreglo
1019 x = atof(dato); // convierto a float
1020 i = 0;
1021 n++;
1022 // encuentro el m nimo y el m aximo...
1023 if (x > vmax){
1024 vmax = x;
1025 }
1026 if (x < vmin){
1027 vmin = x;
1028 }
1029
1030
1031 break;
1032 }
1033 case #: // comentario...
1034 do{ // leer todos los alfanum ericos
1035 letra = fgetc(stream_histo);
1036 if (letra == feof(stream_histo)){
1037 break;
1038 }
1039 } while (letra!=\n);
1040 i = 1;
1041 dato[0] = letra;
1042 break;
1043 default:
1044 dato[i] = letra;
1045 i++;
1046 }
1047 } while(!feof(stream_histo));
1048 anchoIntervalo = vmax - vmin;
1049 // regreso al inicio del archivo
1050 fseek(stream_histo, 0, SEEK_SET);
1051 // Volvemos a leer los datos...
1052 // Ahora para generar el histograma
1053 do{
1054 letra = fgetc(stream_histo); // leer un char
1055 if (letra == feof(stream_histo)){
1056 break; // Salir del ciclo...
1057 }
1058 switch(letra){
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
118 Codigos
1059 case \n: // lleg o a un nuevo rengl on
1060 if (i > 1){
1061 dato[i] = \0; // fin del arreglo
1062 x = atof(dato); // convierto a float
1063 i = 0;
1064 n++;
1065 // Asigno al arreglo para el histograma
1066 for(j = 0 ; j <= 9 ; j++){
1067 if ((x > (0.1
*
j
*
anchoIntervalo
1068 + vmin)) && (x <= (0.1
*
(j+1)
*
1069 anchoIntervalo + vmin))){
1070 I[j]++;
1071 break;
1072 }
1073 }
1074 }
1075 break;
1076 case \t: // para el caso de varias columnas...
1077 dato[i] = \0; // fin del arreglo
1078 x = atof(dato); // convierto a float
1079 i = 0;
1080 n++;
1081 // Asigno al arreglo para el histograma
1082 for(j = 0 ; j <= 9 ; j++){
1083 if ((x > (0.1
*
(j)
*
anchoIntervalo
1084 + vmin)) && (x <= (0.1
*
(j+1)
*
1085 anchoIntervalo + vmin))){
1086 I[j]++;
1087 break;
1088 }
1089 }
1090 break;
1091 case : // espacio en blanco...
1092 if (i > 1){
1093 dato[i] = \0; // fin del arreglo
1094 x = atof(dato); // convierto a float
1095 i = 0;
1096 n++;
1097 // Asigno al arreglo para el histograma
1098 for(j = 0 ; j <= 9 ; j++){
1099 if ((x > (0.1
*
(j)
*
anchoIntervalo
1100 + vmin)) && (x <= (0.1
*
(j+1)
*
1101 anchoIntervalo + vmin))){
1102 I[j]++;
1103 break;
1104 }
1105 }
1106 break;
1107 }
1108 case #: // comentario...
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.8 Implementacion 119
1109 do{ // leer todos los alfanum ericos
1110 letra = fgetc(stream_histo);
1111 if (letra == feof(stream_histo)){
1112 break;
1113 }
1114 } while (letra!=\n);
1115 i = 1;
1116 dato[0] = letra;
1117 break;
1118 default:
1119 dato[i] = letra;
1120 i++;
1121 }
1122 } while(!feof(stream_histo));
1123 fclose(stream_histo); // cerrar archivo...
1124 // Encuentro el intervalo con mayor n umero de ocurrencias
1125 for (i = 0; i <= 9 ; i++){
1126 if (I[i] > max){
1127 max = I[i];
1128 imax = i;
1129 }
1130 if (I[i] < min){
1131 min = I[i];
1132 imin = i;
1133 }
1134 }
1135 // Ahora imprimo los resultados...
1136 printf("\n\n"); // un poco de espacio...
1137 for (i = 0 ; i <= 9 ; i++){
1138 printf("\n Intervalo %.1f -- %.1f ", (anchoIntervalo
*
i
1139 / 10 + vmin),(anchoIntervalo
*
(i+1) / 10) + vmin);
1140 escala = 35.0
*
I[i] / max;
1141 factor = int(escala + 0.5); // redondeo
1142 // Imprime la barra del intervalo (i-1)
1143 for (j = 0 ; j <= factor ; j++){
1144 printf("|");
1145 } // termina de imprimir la barra...
1146 if (I[i] == max){
1147 printf(" (%i) [Max]\n", I[i]);
1148 continue;
1149 }
1150 if (I[i] == min){
1151 printf(" (%i) [Min]\n", I[i]);
1152 continue;
1153 }
1154 printf(" (%i)\n", I[i]);
1155 }
1156 return;
1157 } // Fin de la funci on HISTOGRAMA
1158
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
120 Codigos
1159
1160 /
**************************************
1161 void histograma(char filename[], int No_Int)
1162 Descripci on:
1163 Esta funci on genera un histograma de << No_Int >>
1164 intervalos en la pantalla a partir de los datos
1165 le dos en el archivo de nombre << filename >>.
1166 /////////////////////////////////////////////////////
1167 BUGS:
1168 Ninguno conocido...
1169
***************************************
/
1170 void histograma(char filename[], int No_Int){
1171 /
***
[tested]
***
/
1172 int I[No_Int - 1]; // los intervalos...
1173 int errores = 0, max =0, min = 1000000;
1174 int n = 0, j = 1, i = 0; // contadores
1175 int imax, imin;//
1176 double vmax = -2147483647, vmin = 2147483647;
1177 double anchoIntervalo; // = vmax - vmin
1178 char dato[15]; // cada dato en forma de string
1179 float x; // el n umero generado...
1180 double escala; // para hacer la gr afica...
1181 int factor; // para hacer la gr afica...
1182 char letra = ;
1183 //
1184 // limpio la memoria del array para el histograma...
1185 for (i = 0 ; i < No_Int ; i++){
1186 I[i] = 0;
1187 }
1188 // Histograma
1189 FILE
*
stream_histo; //
1190 stream_histo = fopen(filename, "r+"); // abrir archivo
1191 if (stream_histo == NULL){
1192 printf ("\nNo se puede abrir el archivo %s\n", filename);
1193 printf("\nPor favor, verifique el nombre archivo");
1194 return;
1195 }
1196 // Ahora leemos los datos...
1197 do{
1198 letra = fgetc(stream_histo); // leer un char
1199 if (letra == feof(stream_histo)){
1200 break; // Salir del ciclo...
1201 }
1202 switch(letra){
1203 case \n: // lleg o a un nuevo rengl on
1204 if (i > 1){
1205 dato[i] = \0; // fin del arreglo
1206 x = atof(dato); // convierto a float
1207 // encuentro el m nimo y el m aximo...
1208 if (x > vmax){
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.8 Implementacion 121
1209 vmax = x;
1210 }
1211 if (x < vmin){
1212 vmin = x;
1213 }
1214 i = 0;
1215 n++;
1216 }
1217 break;
1218 case \t: // para el caso de varias columnas...
1219 dato[i] = \0; // fin del arreglo
1220 x = atof(dato); // convierto a float
1221 // encuentro el m nimo y el m aximo...
1222 if (x > vmax){
1223 vmax = x;
1224 }
1225 if (x < vmin){
1226 vmin = x;
1227 }
1228 i = 0;
1229 n++;
1230 break;
1231 case : // espacio en blanco...
1232 if (i > 1){
1233 dato[i] = \0; // fin del arreglo
1234 x = atof(dato); // convierto a float
1235 i = 0;
1236 n++;
1237 // encuentro el m nimo y el m aximo...
1238 if (x > vmax){
1239 vmax = x;
1240 }
1241 if (x < vmin){
1242 vmin = x;
1243 }
1244
1245
1246 break;
1247 }
1248 case #: // comentario...
1249 do{ // leer todos los alfanum ericos
1250 letra = fgetc(stream_histo);
1251 if (letra == feof(stream_histo)){
1252 break;
1253 }
1254 } while (letra!=\n);
1255 i = 1;
1256 dato[0] = letra;
1257 break;
1258 default:
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
122 Codigos
1259 dato[i] = letra;
1260 i++;
1261 }
1262 } while(!feof(stream_histo));
1263 anchoIntervalo = vmax - vmin;
1264 // regreso al inicio del archivo
1265 fseek(stream_histo, 0, SEEK_SET);
1266 // Volvemos a leer los datos...
1267 // Ahora para generar el histograma
1268 do{
1269 letra = fgetc(stream_histo); // leer un char
1270 if (letra == feof(stream_histo)){
1271 break; // Salir del ciclo...
1272 }
1273 switch(letra){
1274 case \n: // lleg o a un nuevo rengl on
1275 if (i > 1){
1276 dato[i] = \0; // fin del arreglo
1277 x = atof(dato); // convierto a float
1278 i = 0;
1279 n++;
1280 // Asigno al arreglo para el histograma
1281 for(j = 0 ; j < No_Int ; j++){
1282 if ((x > (j
*
anchoIntervalo / No_Int
1283 + vmin)) && (x <= ((j+1)
*
1284 anchoIntervalo / No_Int + vmin))){
1285 I[j]++;
1286 break;
1287 }
1288 }
1289 }
1290 break;
1291 case \t: // para el caso de varias columnas...
1292 dato[i] = \0; // fin del arreglo
1293 x = atof(dato); // convierto a float
1294 i = 0;
1295 n++;
1296 // Asigno al arreglo para el histograma
1297 for(j = 0 ; j < No_Int ; j++){
1298 if ((x > (j
*
anchoIntervalo / No_Int
1299 + vmin)) && (x <= ((j+1)
*
1300 anchoIntervalo / No_Int + vmin))){
1301 I[j]++;
1302 break;
1303 }
1304 }
1305 break;
1306 case : // espacio en blanco...
1307 if (i > 1){
1308 dato[i] = \0; // fin del arreglo
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.8 Implementacion 123
1309 x = atof(dato); // convierto a float
1310 i = 0;
1311 n++;
1312 // Asigno al arreglo para el histograma
1313 for(j = 0 ; j < No_Int ; j++){
1314 if ((x > (j
*
anchoIntervalo / No_Int
1315 + vmin)) && (x <= ((j+1)
*
1316 anchoIntervalo / No_Int + vmin))){
1317 I[j]++;
1318 break;
1319 }
1320 }
1321 break;
1322 }
1323 case #: // comentario...
1324 do{ // leer todos los alfanum ericos
1325 letra = fgetc(stream_histo);
1326 if (letra == feof(stream_histo)){
1327 break;
1328 }
1329 } while (letra!=\n);
1330 i = 1;
1331 dato[0] = letra;
1332 break;
1333 default:
1334 dato[i] = letra;
1335 i++;
1336 }
1337 } while(!feof(stream_histo));
1338 fclose(stream_histo); // cerrar archivo...
1339 // Encuentro el intervalo con mayor n umero de ocurrencias
1340 for (i = 0; i < No_Int ; i++){
1341 if (I[i] > max){
1342 max = I[i];
1343 imax = i;
1344 }
1345 if (I[i] < min){
1346 min = I[i];
1347 imin = i;
1348 }
1349 }
1350 // Ahora imprimo los resultados...
1351 printf("\n\n"); // un poco de espacio...
1352 for (i = 0 ; i < No_Int ; i++){
1353 printf("\n Intervalo %.1f -- %.1f ", (anchoIntervalo
*
i
1354 / No_Int + vmin),(anchoIntervalo
*
(i+1) / No_Int) + vmin);
1355 escala = 35.0
*
I[i] / max;
1356 factor = int(escala + 0.5); // redondeo
1357 // Imprime la barra del intervalo (i-1)
1358 for (j = 0 ; j <= factor ; j++){
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
124 Codigos
1359 printf("|");
1360 } // termina de imprimir la barra...
1361 if (I[i] == max){
1362 printf(" (%i) [Max]\n", I[i]);
1363 continue;
1364 }
1365 if (I[i] == min){
1366 printf(" (%i) [Min]\n", I[i]);
1367 continue;
1368 }
1369 printf(" (%i)\n", I[i]);
1370 }
1371 return;
1372 } // Fin de la funci on HISTOGRAMA
1373
1374
1375
1376 struct hist{
1377 /
*
1378 Esta estructura servir a para crear
1379 un histograma y pasarlo como
1380 argumento y regresarlo...
1381
*
/
1382 //int size;
1383 int I[30];
1384 int imax, imin;
1385 float vmin, vmax;
1386 int total_datos;
1387 };
1388
1389
1390
1391 /
**************************************
1392 void histograma(char filename[15])
1393 Descripci on:
1394 Esta funci on genera un histograma de No_Int
1395 intervalos en la pantalla a partir de los
1396 datos le dos en el archivo de nombre
1397 << filename >>.
1398 /////////////////////////////////////////////////////
1399 BUGS:
1400 Ninguno conocido...
1401
***************************************
/
1402 hist Phistograma(char filename[], int No_Int){
1403 /
***
[tested]
***
/
1404 int errores = 0, max =0, min = 1000000;
1405 int n = 0, j = 1, i = 0; // contadores
1406 int imax, imin;//
1407
1408 double anchoIntervalo; // = vmax - h.vmin
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.8 Implementacion 125
1409 char dato[15]; // cada dato en forma de string
1410 float x; // el n umero generado...
1411 double escala; // para hacer la gr afica...
1412 int factor; // para hacer la gr afica...
1413 char letra = ;
1414 hist h; // Nuevo histograma
1415 h.imax = -1;
1416 h.imin = -1;
1417 h.vmax = -2147483647; // m aximo
1418 h.vmin = 2147483647; // m nimo
1419 h.total_datos = 0;
1420 //
1421 // limpio la memoria del array para el histograma...
1422 for (i = 0 ; i < 30 ; i++){
1423 h.I[i] = 0;
1424 }
1425 // Histograma
1426 FILE
*
stream_histo; //
1427 stream_histo = fopen(filename, "r+"); // abrir archivo
1428 if (stream_histo == NULL){
1429 printf ("\nNo se puede abrir el archivo %s\n",
1430 filename);
1431 printf("\nPor favor, verifique el nombre archivo");
1432 return h;
1433 }
1434 // Ahora leemos los datos...
1435 do{
1436 letra = fgetc(stream_histo); // leer un char
1437 if (letra == feof(stream_histo)){
1438 break; // Salir del ciclo...
1439 }
1440 switch(letra){
1441 case \n: // lleg o a un nuevo rengl on
1442 if (i > 1){
1443 dato[i] = \0; // fin del arreglo
1444 x = atof(dato); // convierto a float
1445 h.total_datos++;
1446 // encuentro el m nimo y el m aximo...
1447 if (x > h.vmax){
1448 h.vmax = x;
1449 }
1450 if (x < h.vmin){
1451 h.vmin = x;
1452 }
1453 i = 0;
1454 n++;
1455 }
1456 break;
1457 case \t: // para el caso de varias columnas...
1458 dato[i] = \0; // fin del arreglo
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
126 Codigos
1459 x = atof(dato); // convierto a float
1460 h.total_datos++;
1461 // encuentro el m nimo y el m aximo...
1462 if (x > h.vmax){
1463 h.vmax = x;
1464 }
1465 if (x < h.vmin){
1466 h.vmin = x;
1467 }
1468 i = 0;
1469 n++;
1470 break;
1471 case : // espacio en blanco...
1472 if (i > 1){
1473 dato[i] = \0; // fin del arreglo
1474 x = atof(dato); // convierto a float
1475 h.total_datos++;
1476 i = 0;
1477 n++;
1478 // encuentro el m nimo y el m aximo...
1479 if (x > h.vmax){
1480 h.vmax = x;
1481 }
1482 if (x < h.vmin){
1483 h.vmin = x;
1484 }
1485
1486
1487 break;
1488 }
1489 case #: // comentario...
1490 do{ // leer todos los alfanum ericos
1491 letra = fgetc(stream_histo);
1492 if (letra == feof(stream_histo)){
1493 break;
1494 }
1495 } while (letra!=\n);
1496 i = 1;
1497 dato[0] = letra;
1498 break;
1499 default:
1500 dato[i] = letra;
1501 i++;
1502 }
1503 } while(!feof(stream_histo));
1504 anchoIntervalo = h.vmax - h.vmin;
1505 // regreso al inicio del archivo
1506 fseek(stream_histo, 0, SEEK_SET);
1507 // Volvemos a leer los datos...
1508 // Ahora para generar el histograma
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.8 Implementacion 127
1509 do{
1510 letra = fgetc(stream_histo); // leer un char
1511 if (letra == feof(stream_histo)){
1512 break; // Salir del ciclo...
1513 }
1514 switch(letra){
1515 case \n: // lleg o a un nuevo rengl on
1516 if (i > 1){
1517 dato[i] = \0; // fin del arreglo
1518 x = atof(dato); // convierto a float
1519 i = 0;
1520 n++;
1521 // Asigno al arreglo para el histograma
1522 for(j = 0 ; j < No_Int ; j++){
1523 if ((x > (j
*
anchoIntervalo / No_Int
1524 + h.vmin)) && (x <= ((j+1)
*
1525 anchoIntervalo / No_Int + h.vmin))){
1526 h.I[j]++;
1527 break;
1528 }
1529 }
1530 }
1531 break;
1532 case \t: // para el caso de varias columnas...
1533 dato[i] = \0; // fin del arreglo
1534 x = atof(dato); // convierto a float
1535 i = 0;
1536 n++;
1537 // Asigno al arreglo para el histograma
1538 for(j = 0 ; j < No_Int ; j++){
1539 if ((x > (j
*
anchoIntervalo / No_Int
1540 + h.vmin)) && (x <= ((j+1)
*
1541 anchoIntervalo / No_Int + h.vmin))){
1542 h.I[j]++;
1543 break;
1544 }
1545 }
1546 break;
1547 case : // espacio en blanco...
1548 if (i > 1){
1549 dato[i] = \0; // fin del arreglo
1550 x = atof(dato); // convierto a float
1551 i = 0;
1552 n++;
1553 // Asigno al arreglo para el histograma
1554 for(j = 0 ; j < No_Int ; j++){
1555 if ((x > (j
*
anchoIntervalo / No_Int
1556 + h.vmin)) && (x <= ((j+1)
*
1557 anchoIntervalo / No_Int + h.vmin))){
1558 h.I[j]++;
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
128 Codigos
1559 break;
1560 }
1561 }
1562 break;
1563 }
1564 case #: // comentario...
1565 do{ // leer todos los alfanum ericos
1566 letra = fgetc(stream_histo);
1567 if (letra == feof(stream_histo)){
1568 break;
1569 }
1570 } while (letra!=\n);
1571 i = 1;
1572 dato[0] = letra;
1573 break;
1574 default:
1575 dato[i] = letra;
1576 i++;
1577 }
1578 } while(!feof(stream_histo));
1579 fclose(stream_histo); // cerrar archivo...
1580 for (i = 0; i < No_Int ; i++){
1581 if (h.I[i] > max){
1582 max = h.I[i];
1583 h.imax = i;
1584 }
1585 if (h.I[i] < min){
1586 min = h.I[i];
1587 h.imin = i;
1588 }
1589 }
1590 return h;
1591 } // Fin de la funci on HISTOGRAMA
1592
1593
1594
1595
1596 /
******************************************************
1597 void PchiUniforme(char filename[], int Num_Int)
1598 Descripci on:
1599 Esta funci on prueba que los datos contenidos en el
1600 archivo de nombre << filename >> presenten una
1601 distribuci on normal, calculando el valor de Chi2.
1602 /////////////////////////////////////////////////////
1603 BUGS:
1604 Ninguno conocido...
1605 ------------------------------------------------------
1606 NOTAS:
1607 A. El algoritmo es el siguiente:
1608 1. Se leen los datos del archivo para contar
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.8 Implementacion 129
1609 las frecuencias realtivas en cada intervalo
1610 del histograma y el total de datos N
1611 contenidos en el archivo.
1612 2. Se generan N numeros pseudoaleatorios con
1613 distribuci on uniforme en el intervalo
1614 (0,1)
1615
********************************************************
/
1616 void PchiUniforme(char filename[], int Num_Int){
1617 float discrepancia = 0.0;
1618 hist observado; // datos leidos
1619 hist teorico; // datos generados
1620 float pt, po;
1621 int i;
1622 // Primero generamos el histograma
1623 // a partir de los datos contenidos en el archivo
1624 observado = Phistograma(filename, Num_Int);
1625 // Ahora generamos n umeros en ese mismo intervalo...
1626 funiforme(observado.total_datos, "ChiUnif.txt");
1627 teorico = Phistograma("ChiUnif.txt", Num_Int);
1628 //
1629 pt = 1.0 / (float)(Num_Int);
1630 for(i = 0 ; i < Num_Int ; i++){
1631 po = (float)(observado.I[i]) /
1632 (float)(observado.total_datos);
1633 discrepancia += (po - pt)
*
(po - pt) / (pt);
1634 }
1635 printf("\nEl archivo %s contiene %i datos.", filename,
1636 observado.total_datos);
1637 printf("\n\nChi2 = %f", discrepancia);
1638 if (discrepancia < 0.15 && teorico.total_datos > 1000){
1639 printf("\nLos datos contenidos en el archivo %s",
1640 filename);
1641 printf("\nparecen presentar distribucion uniforme.");
1642 return;
1643 }
1644 }
1645
1646 /
******************************************************
1647 void PchiNormal(char filename[], int Num_Int)
1648 Descripci on:
1649 Esta funci on prueba que los datos contenidos en el
1650 archivo de nombre << filename >> presenten una
1651 distribuci on uniforme.
1652 Devuelve el n umero de datos leidos del archivo,
1653 la media de esos datos y su desviaci on est andar.
1654 Tambi en despliega el valor de Chi2.
1655 /////////////////////////////////////////////////////
1656 BUGS:
1657 Ninguno conocido...
1658
********************************************************
/
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
130 Codigos
1659 void PchiNormal(char filename[], int Num_Int){
1660 float discrepancia = 0.0;
1661 hist observado; // datos leidos
1662 hist teorico; // datos generados
1663 float m, DStd;
1664 float pt, po;
1665 float z; // punto medio del intervalo i
1666 int i;
1667 int NI;
1668 // Primero generamos el histograma
1669 // a partir de los datos contenidos en el archivo
1670 observado = Phistograma(filename, Num_Int);
1671 // Calculamos los par ametros de la distribuci on...
1672 m = media(filename);
1673 DStd = desviacionStd(filename);
1674 // Ahora generamos n umeros con esos par ametros...
1675 fnormal(100000, "ChiNorm.txt", m, DStd);
1676 teorico = Phistograma("ChiNorm.txt", Num_Int);
1677 // Comparamos los dos histogramas...
1678 for(i = 0 ; i < Num_Int ; i++){
1679 po = (float)(observado.I[i]) /
1680 (float)(observado.total_datos);
1681 pt = (float)(teorico.I[i]) /
1682 (float)(teorico.total_datos);
1683 discrepancia += (po - pt)
*
(po - pt) / (pt);
1684 }
1685 // Resultados...
1686 printf("\nEl archivo %s contiene %i datos.", filename,
1687 observado.total_datos);
1688 printf("\nMedia calculada: %f", m);
1689 printf("\nDesviacion Estandar calculada: %f", DStd);
1690 printf("\n\nChi2 = %f\n", discrepancia);
1691 if (discrepancia < 0.15 && teorico.total_datos > 1000){
1692 printf("\nLos datos contenidos en el archivo %s",
1693 filename);
1694 printf("\nparecen presentar distribucion normal.");
1695 return;
1696 }
1697 }
1698
1699 /
******************************************************
1700 void PchiExponencial(char filename[], int Num_Int,
1701 float lambda)
1702 Descripci on:
1703 Esta funci on prueba que los datos contenidos en el
1704 archivo de nombre << filename >> presenten una
1705 distribuci on exponencial con par ametro << lambda >>.
1706 Devuelve el n umero de datos leidos del archivo,
1707 la media de esos datos el valor de Chi2.
1708 /////////////////////////////////////////////////////
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.8 Implementacion 131
1709 BUGS:
1710 Ninguno conocido...
1711
********************************************************
/
1712 void PchiExponencial(char filename[], int Num_Int,
1713 float lambda){
1714 float discrepancia = 0.0;
1715 hist observado; // datos leidos
1716 hist teorico; // datos generados
1717 float m;
1718 float pt, po;
1719 int i;
1720 // Primero generamos el histograma
1721 // a partir de los datos contenidos en el archivo
1722 observado = Phistograma(filename, Num_Int);
1723 // Calculamos los par ametros de la distribuci on...
1724 m = media(filename);
1725 // Ahora generamos n umeros pseudoaleatorios...
1726 fexponencial(100000, lambda, "ChiExpo.txt");
1727 teorico = Phistograma("ChiExpo.txt", Num_Int);
1728 // Comparamos los dos histogramas...
1729 for(i = 0 ; i < Num_Int ; i++){
1730 po = (float)(observado.I[i]) /
1731 (float)(observado.total_datos);
1732 pt = (float)(teorico.I[i]) /
1733 (float)(teorico.total_datos);
1734 discrepancia += (po - pt)
*
(po - pt) / (pt);
1735 }
1736 printf("\nEl archivo %s contiene %i datos.", filename,
1737 observado.total_datos);
1738 printf("\nMedia calculada: %f", m);
1739 printf("\n\nChi2 = %f\n", discrepancia);
1740 if (discrepancia < 0.15 && teorico.total_datos > 1000){
1741 printf("\nLos datos contenidos en el archivo %s",
1742 filename);
1743 printf("\nparecen presentar distribucion
1744 exponencial.");
1745 return;
1746 }
1747 }
1748
1749 /
******************************************************
1750 void PchiWeibull(char filename[], int Num_Int, float c,
1751 float k)
1752 Descripci on:
1753 Esta funci on prueba que los datos contenidos en el
1754 archivo de nombre << filename >> presenten una
1755 distribuci on Weibull con par ametro << promedio >>.
1756 Devuelve el n umero de datos leidos del archivo,
1757 la media de esos datos el valor de Chi2.
1758 /////////////////////////////////////////////////////
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
132 Codigos
1759 BUGS:
1760 Ninguno conocido...
1761
********************************************************
/
1762 void PchiWeibull(char filename[], int Num_Int, float c,
1763 float k){
1764 float discrepancia = 0.0;
1765 hist observado; // datos leidos
1766 hist teorico; // datos generados
1767 float m; // media calculada
1768 float pt, po;
1769 int i;
1770 // Primero generamos el histograma
1771 // a partir de los datos contenidos en el archivo
1772 observado = Phistograma(filename, Num_Int);
1773 // Calculamos los par ametros de la distribuci on...
1774 m = media(filename);
1775 // Ahora generamos n umeros pseudoaleatorios...
1776 fweibull(100000, "ChiWeib.txt", c, k);
1777 teorico = Phistograma("ChiWeib.txt", Num_Int);
1778 // Comparamos los dos histogramas...
1779 for(i = 0 ; i < Num_Int ; i++){
1780 po = (float)(observado.I[i]) /
1781 (float)(observado.total_datos);
1782 pt = (float)(teorico.I[i]) /
1783 (float)(teorico.total_datos);
1784 discrepancia += (po - pt)
*
(po - pt) / (pt);
1785 }
1786 printf("\nEl archivo %s contiene %i datos.", filename,
1787 observado.total_datos);
1788 printf("\nMedia calculada: %f", m);
1789 printf("\n\nChi2 = %f\n", discrepancia);
1790 if (discrepancia < 0.15 && teorico.total_datos > 1000){
1791 printf("\nLos datos contenidos en el archivo %s",
1792 filename);
1793 printf("\nparecen presentar distribucion Weibull.");
1794 return;
1795 }
1796 }
1797
1798 /
******************************************************
1799 void PchiRayleigh(char filename[], int Num_Int, float media)
1800 Descripci on:
1801 Esta funci on prueba que los datos contenidos en el
1802 archivo de nombre << filename >> presenten una
1803 distribuci on exponencial con par ametro << lambda >>.
1804 Devuelve el n umero de datos leidos del archivo,
1805 la media de esos datos el valor de Chi2.
1806 /////////////////////////////////////////////////////
1807 BUGS:
1808 Ninguno conocido...
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.8 Implementacion 133
1809
********************************************************
/
1810 void PchiRayleigh(char filename[], int Num_Int, float Media){
1811 float discrepancia = 0.0;
1812 hist observado; // datos leidos
1813 hist teorico; // datos generados
1814 float m;
1815 float pt, po;
1816 int i;
1817 // Primero generamos el histograma
1818 // a partir de los datos contenidos en el archivo
1819 observado = Phistograma(filename, Num_Int);
1820 // Calculamos los par ametros de la distribuci on...
1821 m = media(filename);
1822 // Ahora generamos n umeros pseudoaleatorios...
1823 frayleigh(100000, "ChiExpo.txt", Media);
1824 teorico = Phistograma("ChiExpo.txt", Num_Int);
1825 // Comparamos los dos histogramas...
1826 for(i = 0 ; i < Num_Int ; i++){
1827 po = (float)(observado.I[i]) /
1828 (float)(observado.total_datos);
1829 pt = (float)(teorico.I[i]) /
1830 (float)(teorico.total_datos);
1831 discrepancia += (po - pt)
*
(po - pt) / (pt);
1832 }
1833 printf("\nEl archivo %s contiene %i datos.", filename,
1834 observado.total_datos);
1835 printf("\nMedia calculada: %f", m);
1836 printf("\n\nChi2 = %f\n", discrepancia);
1837 if (discrepancia < 0.15 && teorico.total_datos > 1000){
1838 printf("\nLos datos contenidos en el archivo %s",
1839 filename);
1840 printf("\nparecen presentar distribucion Rayleigh.");
1841 return;
1842 }
1843 }
1844
1845
1846 /
******************************************************
1847 void RL(char filename[])
1848 Descripci on:
1849 Esta funci on calcula la recta de mejor ajuste a los
1850 datos contenidos en el archivo << filename >>.
1851 /////////////////////////////////////////////////////
1852 BUGS:
1853 Ninguno conocido...
1854
********************************************************
/
1855 void RL(char filename[]){
1856 char letra;
1857 char dato[15]; // cada dato en forma de string
1858 float x, y; // coordenadas del punto
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
134 Codigos
1859 int i, j = 0; // contadores
1860 float m, beta; // par ametros para recta...
1861 float Sx, Sy, Sx2, Sxy; // sumas de datos...
1862 float Error_r = 0;
1863 float dir, y_approxr;
1864 int punto = 0;
1865 Sx = 0; Sy = 0; Sxy = 0;
1866 Sx2 = 0;
1867 FILE
*
stream_RL; //
1868 stream_RL = fopen(filename, "r+"); // abrir archivo
1869 if (stream_RL == NULL){
1870 printf ("\nNo se puede abrir el archivo %s\n",
1871 filename);
1872 printf("\nPor favor, verifique el nombre archivo");
1873 return;
1874 }
1875 do{
1876 letra = fgetc(stream_RL); // leer un char
1877 if (letra == feof(stream_RL)){
1878 break; // Salir del ciclo...
1879 }
1880 switch(letra){
1881 case \n: // lleg o a un nuevo rengl on
1882 if (i > 1){
1883 dato[i] = \0; // fin del arreglo
1884 if (j % 2 == 0){ // dato impar...
1885 x = atof(dato);// convierto a un float
1886 punto = 0;
1887 }
1888 else{
1889 y = atof(dato);
1890 punto = 1;
1891 }
1892 j++;
1893 i = 0;
1894 }
1895 break;
1896 case \t: // para el caso de varias columnas...
1897 dato[i] = \0; // fin del arreglo
1898 if (j % 2 == 0){
1899 x = atof(dato);// convierto a un float
1900 punto = 0;
1901 }
1902 else{
1903 y = atof(dato);
1904 punto = 1;
1905 }
1906 j++;
1907 i = 0;
1908 break;
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.8 Implementacion 135
1909 case : // espacio en blanco...
1910 if (i > 1){
1911 dato[i] = \0; // fin del arreglo
1912 if (j % 2 == 0){
1913 x = atof(dato);// convierto a un float
1914 punto = 0;
1915 }
1916 else{
1917 y = atof(dato);
1918 punto = 1;
1919 }
1920 j++;
1921 i = 0;
1922 break;
1923 }
1924 case #: // comentario...
1925 do{ // leer todos los alfanum ericos
1926 letra = fgetc(stream_RL);
1927 if (letra == feof(stream_RL)){
1928 break;
1929 }
1930 } while (letra!=\n);
1931 i = 0;
1932 dato[0] = letra;
1933 break;
1934 default:
1935 dato[i] = letra;
1936 punto = 0;
1937 i++;
1938 }
1939 if (punto == 1){ // realizar c alculos
1940 // Realizamos los c alculos...
1941 Sx += x; // Suma de x
1942 Sy += y; // Suma de y
1943 Sxy += x
*
y; // Suma de xy
1944 Sx2 += x
*
x; // Suma de x cuadrada
1945 punto = 0;
1946 }
1947 } while(!feof(stream_RL));
1948
1949 // Calculo par ametros de recta...
1950 if (j > 4){
1951 m = (j
*
Sxy - Sx
*
Sy) / (j
*
Sx2 - Sx
*
Sx);
1952 beta = (Sy - m
*
Sx) / j;
1953 // Muestro los resultados...
1954 printf("\n\nLa recta de mejor ajuste es:");
1955 printf("\n y = %.3f + %.3f x.\n", beta, m);
1956 }
1957 else{
1958 printf("\nNo se pueden realizar los calculos.");
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
136 Codigos
1959 printf("\nEl archivo contiene dos datos o menos...");
1960 }
1961 // cierro el archivo...
1962 fclose(stream_RL);
1963 //system("PAUSE");
1964 return;
1965 }
1966
1967 /
******************************************************
1968 void RC(char filename[])
1969 Descripci on:
1970 Esta funci on calcula la recta de mejor ajuste a los
1971 datos contenidos en el archivo << filename >>.
1972 /////////////////////////////////////////////////////
1973 BUGS:
1974 Ninguno conocido...
1975
********************************************************
/
1976 void RC(char filename[]){
1977 char letra;
1978 char dato[15]; // cada dato en forma de string
1979 float x, y; // coordenadas del punto
1980 int i, j = 0; // contadores
1981 float a, b, c; // par ametros para par abola...
1982 float Da = 0, Dp = 0;
1983 float Sx, Sy, Sx2, Sx3, Sx4, Sxy, Sx2y;// sumas de datos.
1984 float Error_p = 0;
1985 float dip, y_approxp;
1986 int punto = 0;
1987 Sx = 0; Sy = 0; Sxy = 0;
1988 Sx2 = 0; Sx3 = 0; Sx4 = 0; Sx2y = 0;
1989
1990 FILE
*
stream_RC; //
1991 stream_RC = fopen(filename, "r+"); // abrir archivo
1992 if (stream_RC == NULL){
1993 printf ("\nNo se puede abrir el archivo %s\n",
1994 filename);
1995 printf("\nPor favor, verifique el nombre archivo");
1996 return;
1997 }
1998 do{
1999 letra = fgetc(stream_RC); // leer un char
2000 if (letra == feof(stream_RC)){
2001 break; // Salir del ciclo...
2002 }
2003 switch(letra){
2004 case \n: // lleg o a un nuevo rengl on
2005 if (i > 1){
2006 dato[i] = \0; // fin del arreglo
2007 if (j % 2 == 0){ // dato impar...
2008 x = atof(dato); // convierto a un float
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.8 Implementacion 137
2009 punto = 0;
2010 }
2011 else{
2012 y = atof(dato);
2013 punto = 1;
2014 }
2015 j++;
2016 i = 0;
2017 }
2018 break;
2019 case \t:// para el caso de varias columnas...
2020 dato[i] = \0; // fin del arreglo
2021 if (j % 2 == 0){
2022 x = atof(dato); // convierto a un float
2023 punto = 0;
2024 }
2025 else{
2026 y = atof(dato);
2027 punto = 1;
2028 }
2029 j++;
2030 i = 0;
2031 break;
2032 case : // espacio en blanco...
2033 if (i > 1){
2034 dato[i] = \0; // fin del arreglo
2035 if (j % 2 == 0){
2036 x = atof(dato); // convierto a un float
2037 punto = 0;
2038 }
2039 else{
2040 y = atof(dato);
2041 punto = 1;
2042 }
2043 j++;
2044 i = 0;
2045 break;
2046 }
2047 case #: // comentario...
2048 do{ // leer todos los alfanum ericos
2049 letra = fgetc(stream_RC);
2050 if (letra == feof(stream_RC)){
2051 break;
2052 }
2053 } while (letra!=\n);
2054 i = 0;
2055 dato[0] = letra;
2056 break;
2057 default:
2058 dato[i] = letra;
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
138 Codigos
2059 punto = 0;
2060 i++;
2061 }
2062 if (punto == 1){
2063 // Realizamos los c alculos...
2064 Sx += x; // Suma de x
2065 Sy += y; // Suma de y
2066 Sxy += x
*
y; // Suma de xy
2067 Sx2 += x
*
x; // Suma de x cuadrada
2068 Sx3 += x
*
x
*
x; // Suma de x c ubica
2069 Sx4 += x
*
x
*
x
*
x; // Suma x cuarta
2070 Sx2y += x
*
x
*
y;
2071 punto = 0;
2072 }
2073 } while(!feof(stream_RC));
2074
2075 // Calculo par ametros de la par abola...
2076 if (j > 6){
2077 // Calculo los par ametros de par abola...
2078 Da = Sy
*
Sx2
*
Sx2 + j
*
Sxy
*
Sx3 + Sx
*
Sx
*
Sx2y;
2079 Da = Da - j
*
Sx2
*
Sx2y - Sx
*
Sx3
*
Sy - Sx
*
Sxy
*
Sx2;
2080 Dp = Sx2
*
Sx2
*
Sx2 + j
*
Sx3
*
Sx3 + Sx4
*
Sx
*
Sx;
2081 Dp = Dp - j
*
Sx2
*
Sx4 - 2
*
Sx
*
Sx2
*
Sx3;
2082 a = Da / Dp;
2083 b = (Sx
*
(Sy - a
*
Sx2) - j
*
(Sxy - a
*
Sx3)) /
2084 (Sx
*
Sx - j
*
Sx2);
2085 c = (Sy - a
*
Sx2 - b
*
Sx) / j;
2086 // Muestro los resultados...
2087 printf("\nLa parabola de mejor ajuste es:");
2088 printf("\n y = %.3f x2 + %.3f x + %.3f\n\n", a, b, c);
2089 }
2090 else{
2091 printf("\nNo se pueden realizar los calculos.");
2092 printf("\nEl archivo contiene menos de tres datos...");
2093 }
2094 // cierro el archivo...
2095 fclose(stream_RC);
2096 //system("PAUSE");
2097 return;
2098 }
2099
2100
2101
2102 #endif // PROBABILITY_H
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.8 Implementacion 139
2.8.1 Ejemplos de uso
En esta seccion se muestra como utilizar dentro de programas las funciones que
se denieron anteriormente.
Despues de cada codigo se muestra el resultado que imprimio cada programa.
Dado que el encabezado del programa es el mismo siempre se muestra solamente
el programa completo en el primer programa y en los demas se omite.
2.8.1.1 funiforme(total, archivo)
Funcion 2.8.1
void funiforme(int N, char filename[])
Descripcion: Esta funcion guarda N n umeros pseudoaleatorios con dis-
tribucion uniforme en el intervalo (0.0, 1.0) en el archivo con nombre filename.
1 /
*
Nombre del archivo: testP.cpp
2 Con este programa estoy revisando que las
3 funciones que he incluido en el archivo:
4 <<estadistica.h>> que estoy elaborando est en
5 correctas.
6 ----------------------------------
7 ----------------------------------
8 Nombre del Archivo: testP.cpp
9 Autor: Efra n Soto Apolinar
10 Email: efrain@yalma.fime.uanl.mx
11 efra.soto.a@gmail.com
12 Fecha de ultima modificaci on: 29 de mayo de 2008
13 ----------------------------------
14 ----------------------------------
15
*
/
16 #include "estadistica.h"
17
18 using namespace std;
19 int main(void){
20 int total; // n umeros a generar...
21 char archivo[15]; // nombre del archivo...
22 printf("\nEste programa verifica que las funciones");
23 printf("\nincluidas en el codigo del archivo");
24 printf("\n<< estadistica.h >>");
25 printf("\nfuncionen correctamente...");
26 printf("\n\nEstamos probando las funciones: \n");
27 printf("- funiforme(int N, char filename[]),\n");
28 printf("- histograma(char filename[]),\n");
29 printf("- media(char filename[]),\n");
30 printf("- desviacionStd(char filename[]),\n");
31 printf("\n\nCuantos numeros desea generar: ");
32 scanf("%i", &total);
33 printf("\nNombre del archivo: [Incluye extension] ");
34 scanf("%s", &archivo);
35 funiforme(total, archivo);
36 histograma(archivo);
37 printf("\n\nMedia calculada: %f", media(archivo));
38 printf("\n\nDesviacion Estandar calculada: %f", desviacionStd(archivo));
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
140 Codigos
39 printf("\n\n\n");
40 system("PAUSE");
41 return 0;
42 }
El programa arroja los siguientes resultados ante los siguientes datos:
Este programa verifica que las funciones
incluidas en el codigo del archivo
<< estadistica.h >>
funcionen correctamente...
Estamos probando las funciones:
- funiforme(int N, char filename[15]),
- histograma(char filename[15]),
- media(char filename[15]),
- desviacionStd(char filename[15]),
Cuantos numeros desea generar: 10000
Nombre del archivo: [Incluye extension] test.txt
Intervalo 0.0 -- 0.1 |||||||||||||||||||||||||||||||||| (987)
Intervalo 0.1 -- 0.2 |||||||||||||||||||||||||||||||||| (1004)
Intervalo 0.2 -- 0.3 |||||||||||||||||||||||||||||||| (955) [Min]
Intervalo 0.3 -- 0.4 ||||||||||||||||||||||||||||||||| (978)
Intervalo 0.4 -- 0.5 |||||||||||||||||||||||||||||||||| (996)
Intervalo 0.5 -- 0.6 ||||||||||||||||||||||||||||||||| (984)
Intervalo 0.6 -- 0.7 |||||||||||||||||||||||||||||||||||| (1062) [Max]
Intervalo 0.7 -- 0.8 |||||||||||||||||||||||||||||||||| (1001)
Intervalo 0.8 -- 0.9 |||||||||||||||||||||||||||||||||| (1014)
Intervalo 0.9 -- 1.0 ||||||||||||||||||||||||||||||||||| (1018)
Media calculada: 0.503787
Desviacion Estandar calculada: 0.288886
Presione una tecla para continuar . . .
2.8.1.2 funiforme(total, archivo, A, B)
Funcion 2.8.2
void funiforme(int N, char filename[], float a, float b)
Descripcion: Esta funcion guarda N n umeros pseudoaleatorios con dis-
tribucion uniforme en el intervalo (a, b) en el archivo con nombre filename.
Modicamos la lnea 35 del programa anterior (lnea 25 del siguiente programa)
para utilizar la funci on funiforme, ahora considerando tambien un intervalo
(A, B) dendo por el usuario:
1 #include "estadistica.h"
2
3 using namespace std;
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.8 Implementacion 141
4 int main(void){
5 int total; // n umeros a generar...
6 char archivo[15]; // nombre del archivo...
7 float A, B; // parametros de la distribucion
8 printf("\nEste programa verifica que las funciones");
9 printf("\nincluidas en el codigo del archivo");
10 printf("\n<< estadistica.h >>");
11 printf("\nfuncionen correctamente...");
12 printf("\n\nEstamos probando las funciones: \n");
13 printf("- funiforme(int N, char filename[], float a, float b),\n");
14 printf("- histograma(char filename[]),\n");
15 printf("- media(char filename[]),\n");
16 printf("- desviacionStd(char filename[]),\n");
17 printf("\n\nCuantos numeros desea generar: ");
18 scanf("%i", &total);
19 printf("\n\nLimite inferior de la distribucion: ");
20 scanf("%f", &A);
21 printf("\n\nLimite superior de la distribucion: ");
22 scanf("%f", &B);
23 printf("\nNombre del archivo: [Incluye extension] ");
24 scanf("%s", &archivo);
25 funiforme(total, archivo, A, B);
26 histograma(archivo);
27 printf("\n\nMedia calculada: %f", media(archivo));
28 printf("\n\nDesviacion Estandar calculada: %f", desviacionStd(archivo));
29 printf("\n\n\n");
30 system("PAUSE");
31 return 0;
32 }
Note que se agregaron algunas lneas de codigo para pedir los parametros A
y B, que corresponden a los lmites inferior y superior del intervalo donde se
generaran los n umeros pseudoaleatorios con distribucion uniforme.
El programa ahora arroja los siguientes resultados:
...
Cuantos numeros desea generar: 10000
Limite inferior de la distribucion: -100
Limite superior de la distribucion: 100
Nombre del archivo: [Incluye extension] test.txt
Intervalo -100.0 -- -80.0 |||||||||||||||||||||||||||||||||| (987)
Intervalo -80.0 -- -60.0 |||||||||||||||||||||||||||||||||| (1004)
Intervalo -60.0 -- -40.0 |||||||||||||||||||||||||||||||| (955) [Min]
Intervalo -40.0 -- -20.0 ||||||||||||||||||||||||||||||||| (978)
Intervalo -20.0 -- 0.0 |||||||||||||||||||||||||||||||||| (996)
Intervalo 0.0 -- 20.0 ||||||||||||||||||||||||||||||||| (984)
Intervalo 20.0 -- 40.0 |||||||||||||||||||||||||||||||||||| (1062) [Max]
Intervalo 40.0 -- 60.0 |||||||||||||||||||||||||||||||||| (1001)
Intervalo 60.0 -- 80.0 |||||||||||||||||||||||||||||||||| (1014)
Intervalo 80.0 -- 100.0 ||||||||||||||||||||||||||||||||||| (1018)
Media calculada: 0.757347
Desviacion Estandar calculada: 57.777105
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
142 Codigos
2.8.1.3 fnormal(total, archivo)
Funcion 2.8.3
void fnormal(int N, char filename[])
Descripcion: Esta funcion guarda N n umeros pseudoaleatorios con dis-
tribucion normal con media 0.0 y desviacion estandar 1.0 en el archivo con
nombre filename.
1 #include "estadistica.h"
2
3 using namespace std;
4 int main(void){
5 int total; // n umeros a generar...
6 char archivo[15]; // nombre del archivo...
7 printf("\nEste programa verifica que las funciones");
8 printf("\nincluidas en el codigo del archivo");
9 printf("\n<< estadistica.h >>");
10 printf("\nfuncionen correctamente...");
11 printf("\n\nEstamos probando las funciones: \n");
12 printf("- fnormal(int N, char filename[]),\n");
13 printf("- histograma(char filename[]),\n");
14 printf("- media(char filename[]),\n");
15 printf("- desviacionStd(char filename[]),\n");
16 printf("\n\nCuantos numeros desea generar: ");
17 scanf("%i", &total);
18 printf("\nNombre del archivo: [Incluye extension] ");
19 scanf("%s", &archivo);
20 fnormal(total, archivo);//, A, B
21 histograma(archivo);
22 printf("\n\nMedia calculada: %f", media(archivo));
23 printf("\n\nDesviacion Estandar calculada: %f", desviacionStd(archivo));
24 printf("\n\n\n");
25 system("PAUSE");
26 return 0;
27 }
El programa arroja:
Cuantos numeros desea generar: 10000
Nombre del archivo: [Incluye extension] test.txt
Intervalo -3.8 -- -3.0 | (13)
Intervalo -3.0 -- -2.2 ||| (134)
Intervalo -2.2 -- -1.4 |||||||| (608)
Intervalo -1.4 -- -0.6 |||||||||||||||||||||| (1827)
Intervalo -0.6 -- 0.1 |||||||||||||||||||||||||||||||||||| (3039) [Max]
Intervalo 0.1 -- 0.9 ||||||||||||||||||||||||||||||| (2645)
Intervalo 0.9 -- 1.7 |||||||||||||||| (1308)
Intervalo 1.7 -- 2.5 ||||| (367)
Intervalo 2.5 -- 3.3 || (52)
Intervalo 3.3 -- 4.1 | (6) [Min]
Media calculada: -0.002336
Desviacion Estandar calculada: 0.997851
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.8 Implementacion 143
2.8.1.4 fnormal(total, archivo, media, SD)
Funcion 2.8.4
void fnormal(int N, char filename[], float med, float desvStd)
Descripcion: Esta funcion guarda N n umeros pseudoaleatorios con dis-
tribucion normal con media med y desviacion estandar desvStd en el archivo de
nombre filename.
1 #include "estadistica.h"
2 using namespace std;
3 int main(void){
4 int total; // n umeros a generar...
5 float mean, SD;
6 char archivo[15]; // nombre del archivo...
7 printf("\nEste programa verifica que las funciones");
8 printf("\nincluidas en el codigo del archivo");
9 printf("\n<< estadistica.h >>");
10 printf("\nfuncionen correctamente...");
11 printf("\n\nEstamos probando las funciones: \n");
12 printf("- fnormal(int N, char filename[], float med, float desvStd),\n");
13 printf("- histograma(char filename[]),\n");
14 printf("- media(char filename[]),\n");
15 printf("- desviacionStd(char filename[]),\n");
16 printf("\n\nCuantos numeros desea generar: ");
17 scanf("%i", &total);
18 printf("\n\nMedia de la distribucion: ");
19 scanf("%f", &mean);
20 printf("\n\nDesviacion estandar de la distribucion: ");
21 scanf("%f", &SD);
22 printf("\nNombre del archivo: [Incluye extension] ");
23 scanf("%s", &archivo);
24 fnormal(total, archivo, mean, SD);//
25 histograma(archivo);
26 printf("\n\nMedia calculada: %f", media(archivo));
27 printf("\n\nDesviacion Estandar calculada: %f", desviacionStd(archivo));
28 printf("\n\n\n");
29 system("PAUSE");
30 return 0;
31 }
Cuantos numeros desea generar: 10000
Media de la distribucion: 100
Desviacion estandar de la distribucion: 7
Nombre del archivo: [Incluye extension] test.txt
Intervalo 73.4 -- 78.9 | (13)
Intervalo 78.9 -- 84.5 ||| (134)
Intervalo 84.5 -- 90.0 |||||||| (608)
Intervalo 90.0 -- 95.5 |||||||||||||||||||||| (1827)
Intervalo 95.5 -- 101.0 |||||||||||||||||||||||||||||||||||| (3039) [Max]
Intervalo 101.0 -- 106.6 ||||||||||||||||||||||||||||||| (2645)
Intervalo 106.6 -- 112.1 |||||||||||||||| (1308)
Intervalo 112.1 -- 117.6 ||||| (367)
Intervalo 117.6 -- 123.1 || (52)
Intervalo 123.1 -- 128.7 | (6) [Min]
Media calculada: 99.983645
Desviacion Estandar calculada: 6.984954
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
144 Codigos
2.8.1.5 fexponencial(total, lambda, archivo)
Funcion 2.8.5
void fexponencial(int N, float Lambda, char filename[])
Descripcion: Esta funcion genera N n umeros pseudoaleatorios con dis-
tribucion exponencial, con parametro Lambda, y los graba en el archivo de
nombre filename.
1 #include "estadistica.h"
2
3 using namespace std;
4 int main(void){
5 int total; // n umeros a generar...
6 char archivo[15]; // nombre del archivo...
7 float L; // parametro de la distribucion
8 printf("\nEste programa verifica que las funciones");
9 printf("\nincluidas en el codigo del archivo");
10 printf("\n<< estadistica.h >>");
11 printf("\nfuncionen correctamente...");
12 printf("\n\nEstamos probando las funciones: \n");
13 printf("- fexponencial(int N, float Lambda, char filename[]),\n");
14 printf("- histograma(char filename[]),\n");
15 printf("- media(char filename[]),\n");
16 printf("- desviacionStd(char filename[]),\n");
17 printf("\n\nCuantos numeros desea generar: ");
18 scanf("%i", &total);
19 printf("\n\nParametro Lambda de la distribucion: ");
20 scanf("%f", &L);
21 printf("\nNombre del archivo: [Incluye extension] ");
22 scanf("%s", &archivo);
23 fexponencial(total, L, archivo);//, mean, SD
24 histograma(archivo);
25 printf("\n\nMedia calculada: %f", media(archivo));
26 printf("\n\nDesviacion Estandar calculada: %f", desviacionStd(archivo));
27 printf("\n\n\n");
28 system("PAUSE");
29 return 0;
30 }
Cuantos numeros desea generar: 10000
Parametro Lambda de la distribucion: 0.5
Nombre del archivo: [Incluye extension] test.txt
Intervalo 0.0 -- 1.9 |||||||||||||||||||||||||||||||||||| (6143) [Max]
Intervalo 1.9 -- 3.9 ||||||||||||||| (2400)
Intervalo 3.9 -- 5.8 |||||| (916)
Intervalo 5.8 -- 7.8 ||| (319)
Intervalo 7.8 -- 9.7 || (123)
Intervalo 9.7 -- 11.6 | (58)
Intervalo 11.6 -- 13.6 | (29)
Intervalo 13.6 -- 15.5 | (5)
Intervalo 15.5 -- 17.5 | (4)
Intervalo 17.5 -- 19.4 | (2) [Min]
Media calculada: 2.026312
Desviacion Estandar calculada: 2.031012
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.8 Implementacion 145
2.8.1.6 fgeometrica(total, p, archivo)
Funcion 2.8.6
void fgeometrica(int N, float p, char filename[15])
Descripcion: Esta funcion genera N n umeros pseudoaleatorios con dis-
tribucion geometrica, con parametro p, y los graba en el archivo de nombre
filename.
1 #include "estadistica.h"
2
3 using namespace std;
4 int main(void){
5 int total; // n umeros a generar...
6 char archivo[15]; // nombre del archivo...
7 float p; // parametro de la distribucion
8 printf("\n\nCuantos numeros desea generar: ");
9 scanf("%i", &total);
10 printf("\n\nParametro p de la distribucion: ");
11 scanf("%f", &p);
12 printf("\nNombre del archivo: [Incluye extension] ");
13 scanf("%s", &archivo);
14 fgeometrica(total, p, archivo);//, mean, SD
15 printf("\n\nMedia calculada: %f", media(archivo));
16 printf("\n\nDesviacion Estandar calculada: %f", desviacionStd(archivo));
17 printf("\n\n\n");
18 system("PAUSE");
19 return 0;
20 }
Cuantos numeros desea generar: 1200
Parametro p de la distribucion: 0.75
Nombre del archivo: [Incluye extension] test.txt
Media calculada: 2.045000
Desviacion Estandar calculada: 5.566383
Presione una tecla para continuar . . .
2.8.1.7 fpoisson(total, alpha, archivo)
Funcion 2.8.7
void fpoisson(int N, float a, char filename[])
Descripcion: Esta funcion genera N n umeros pseudoaleatorios con dis-
tribucion poisson, con parametro , y los graba en el archivo de nombre
filename.
1 #include "estadistica.h"
2
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
146 Codigos
3 using namespace std;
4 int main(void){
5 char filename[15];
6 float a; // parametro de la distribucion
7 int total, i;
8 printf("\nEste programa verifica que la funcion");
9 printf("\nvoid fpoisson(int N, float alpha, char filename[])");
10 printf("\nfuncione correctamente...\n");
11 printf("Cuantos numeros desea generar? ");
12 scanf("%i", &total);
13 printf("\nParametro Alpha supuesto: ");
14 scanf("%f", &a);
15 printf("\nNombre del archivo: ");
16 scanf("%s", &filename);
17 fpoisson(total, a, filename);
18 printf("\n\n\n");
19 system("PAUSE");
20 return 0;
21 }
Este programa verifica que la funcion
void fpoisson(int N, float alpha, char filename[])
funcione correctamente...
Cuantos numeros desea generar? 1200
Parametro Alpha supuesto: 3
Nombre del archivo: test.txt
Presione una tecla para continuar . . .
2.8.1.8 fweibull(total, archivo, c, k)
Funcion 2.8.8
void fweibull(int N, char filename[], float C, float K)
Descripcion: Esta funcion genera N n umeros pseudoaleatorios con dis-
tribucion weibull, con parametros C y K, y los graba en el archivo de nombre
filename.
1 #include "estadistica.h"
2 using namespace std;
3 int main(void){
4 int total; // de n umeros a generar...
5 char archivo[15]; // nombre del archivo...
6 float C, K; // parametros de la distribucion
7 printf("\nEste programa verifica que las funciones");
8 printf("\nincluidas en el codigo del archivo");
9 printf("\n<< estadistica.h >>");
10 printf("\nfuncionen correctamente...");
11 printf("\n\nEstamos probando las funciones: \n");
12 printf("- fweibull(int N, char filename[], float C, float K),\n");
13 printf("- histograma(char filename[]),\n");
14 printf("- media(char filename[]),\n");
15 printf("- desviacionStd(char filename[]),\n");
16 printf("\n\nCuantos numeros desea generar: ");
17 scanf("%i", &total);
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.8 Implementacion 147
18 printf("\n\nParametro C de la distribucion: ");
19 scanf("%f", &C);
20 printf("\n\nParametro K de la distribucion: ");
21 scanf("%f", &K);/
**
/
22 printf("\nNombre del archivo: [Incluye extension] ");
23 scanf("%s", &archivo);
24 fweibull(total, archivo, C, K);
25 histograma(archivo);
26 printf("\n\nMedia calculada: %f", media(archivo));
27 printf("\n\nDesviacion Estandar calculada: %f", desviacionStd(archivo));
28 printf("\n\n\n");
29 system("PAUSE");
30 return 0;
31 }
Cuantos numeros desea generar: 10000
Parametro C de la distribucion: 11.86
Parametro K de la distribucion: 1.77
Nombre del archivo: [Incluye extension] test.txt
Intervalo 0.1 -- 4.3 ||||||||||||||||||||| (1534)
Intervalo 4.3 -- 8.6 |||||||||||||||||||||||||||||||||||| (2726) [Max]
Intervalo 8.6 -- 12.9 |||||||||||||||||||||||||||||||||| (2572)
Intervalo 12.9 -- 17.2 ||||||||||||||||||||||| (1682)
Intervalo 17.2 -- 21.4 ||||||||||||| (907)
Intervalo 21.4 -- 25.7 |||||| (367)
Intervalo 25.7 -- 30.0 ||| (132)
Intervalo 30.0 -- 34.3 || (65)
Intervalo 34.3 -- 38.5 | (9)
Intervalo 38.5 -- 42.8 | (5) [Min]
Media calculada: 10.635908
Desviacion Estandar calculada: 6.204015
2.8.1.9 frayleigh(total, archivo, media)
Funcion 2.8.9
void frayleigh(int N, char filename[], float M)
Descripcion: Esta funcion genera N n umeros pseudoaleatorios con dis-
tribucion rayleigh, con media M y los graba en el archivo de nombre filename.
1 #include "estadistica.h"
2 using namespace std;
3 int main(void){
4 int total; // n umeros a generar...
5 char archivo[15]; // nombre del archivo...
6 float mean;
7 printf("\nEste programa verifica que las funciones");
8 printf("\nincluidas en el codigo del archivo");
9 printf("\n<< estadistica.h >>");
10 printf("\nfuncionen correctamente...");
11 printf("\n\nEstamos probando las funciones: \n");
12 printf("- frayleigh(int N, char filename[], float M),\n");
13 printf("- histograma(char filename[]),\n");
14 printf("- media(char filename[]),\n");
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
148 Codigos
15 printf("- desviacionStd(char filename[]),\n");
16 printf("\n\nCuantos numeros desea generar: ");
17 scanf("%i", &total);
18 printf("\n\nMedia de la distribucion: ");
19 scanf("%f", &mean);
20 printf("\nNombre del archivo: [Incluye extension] ");
21 scanf("%s", &archivo);
22 frayleigh(total, archivo, mean);
23 histograma(archivo);
24 printf("\n\nMedia calculada: %f", media(archivo));
25 printf("\n\nDesviacion Estandar calculada: %f", desviacionStd(archivo));
26 printf("\n\n\n");
27 system("PAUSE");
28 return 0;
29 }
Cuantos numeros desea generar: 10000
Media de la distribucion: 9.8
Nombre del archivo: [Incluye extension] test.txt
Intervalo 0.1 -- 3.4 |||||||||||||| (946)
Intervalo 3.4 -- 6.8 ||||||||||||||||||||||||||||||| (2237)
Intervalo 6.8 -- 10.2 |||||||||||||||||||||||||||||||||||| (2598) [Max]
Intervalo 10.2 -- 13.5 |||||||||||||||||||||||||||| (1996)
Intervalo 13.5 -- 16.9 |||||||||||||||||| (1274)
Intervalo 16.9 -- 20.3 ||||||||| (603)
Intervalo 20.3 -- 23.6 |||| (234)
Intervalo 23.6 -- 27.0 || (78)
Intervalo 27.0 -- 30.4 | (28)
Intervalo 30.4 -- 33.7 | (5) [Min]
Media calculada: 9.748030
Desviacion Estandar calculada: 5.145890
2.8.1.10 histograma(archivo, intervalos)
Funcion 2.8.10
histograma(char filename[], int No Int)
Descripcion: Esta funcion genera un histograma de No Int intervalos en la
pantalla a partir de los datos ledos en el archivo de nombre filename.
1 #include "estadistica.h"
2 using namespace std;
3 int main(void){
4 int total; // n umeros a generar...
5 char archivo[15]; // nombre del archivo...
6 float mean; // parametro de la distribucion
7 printf("\nEste programa verifica que las funciones");
8 printf("\nincluidas en el codigo del archivo");
9 printf("\n<< probability.h >>");
10 printf("\nfuncionen correctamente...");
11 printf("\n\nEstamos probando las funciones: \n");
12 printf("- funiforme(int N, char filename[]),\n");
13 printf("- histograma(char filename[]),\n");
14 printf("- media(char filename[]),\n");
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.8 Implementacion 149
15 printf("- desviacionStd(char filename[]),\n");
16 printf("\n\nCuantos numeros desea generar: ");
17 scanf("%i", &total);
18 printf("\n\nMedia de la distribucion: ");
19 scanf("%f", &mean);
20 printf("\nNombre del archivo: [Incluye extension] ");
21 scanf("%s", &archivo);
22 frayleigh(total, archivo, mean);
23 histograma(archivo, 20);
24 system("PAUSE");
25 return 0;
26 }
Cuantos numeros desea generar: 10000
Media de la distribucion: 9.8
Nombre del archivo: [Incluye extension] test.txt
Intervalo 0.1 -- 1.8 |||||||| (259)
Intervalo 1.8 -- 3.4 ||||||||||||||||||| (687)
Intervalo 3.4 -- 5.1 ||||||||||||||||||||||||||| (1027)
Intervalo 5.1 -- 6.8 |||||||||||||||||||||||||||||||| (1210)
Intervalo 6.8 -- 8.5 |||||||||||||||||||||||||||||||||||| (1367) [Max]
Intervalo 8.5 -- 10.2 ||||||||||||||||||||||||||||||||| (1231)
Intervalo 10.2 -- 11.9 |||||||||||||||||||||||||||||| (1116)
Intervalo 11.9 -- 13.5 |||||||||||||||||||||||| (880)
Intervalo 13.5 -- 15.2 |||||||||||||||||||| (747)
Intervalo 15.2 -- 16.9 |||||||||||||| (527)
Intervalo 16.9 -- 18.6 |||||||||| (339)
Intervalo 18.6 -- 20.3 |||||||| (264)
Intervalo 20.3 -- 21.9 ||||| (142)
Intervalo 21.9 -- 23.6 ||| (92)
Intervalo 23.6 -- 25.3 || (45)
Intervalo 25.3 -- 27.0 || (33)
Intervalo 27.0 -- 28.7 | (19)
Intervalo 28.7 -- 30.4 | (9)
Intervalo 30.4 -- 32.0 | (3)
Intervalo 32.0 -- 33.7 | (2) [Min]
Una caso en el que se requiere un histograma con un mayor n umero de intervalos
en el histograma se justica, por ejemplo, en el caso del pronostico del recurso
eolico de un local.
En este caso, la energa electrica que se puede producir utilizando un generador
eolico es proporcional al cubo de la velocidad.
Cuando la velocidad del viento vara en un 25.99%, la cantidad de energa
producida con el viento aumenta al doble, debido a que
3

2 1.2599. Por esa


misma razon, sin la velocidad del viento disminuye en ese mismo porcentaje, la
cantidad de energa producida se reduce ahora a la mitad.
Por otra parte, si la velocidad del viento aumenta un 44.22%, la energa pro-
ducida aumenta al triple, porque
3

3 1.4422.
Entonces, distribucion mas suave nos permite calcular un pronostico de la en-
erga producida por un generador eolico con mayor precision.
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
150 Codigos
Otro ejemplo, donde se hace evidente la cantidad de informacion extra que
muestra esta funcion para un mismo conjunto de datos es el siguiente:
1 #include <iostream>
2 #include "estadistica.h"
3 using namespace std;
4 int main(void){
5 int total; // n umeros a generar...
6 char archivo[15]; // nombre del archivo...
7 float C, K; // parametros de la distribucion...
8 cout << "\nCuantos numeros desea generar: ";
9 cin >> total;
10 cout << "\nParametro C de la distribucion: ";
11 cin >> C;
12 cout << "\nParametro K de la distribucion: ";
13 cin >> K;
14 cout << "\nNombre del archivo: [Incluye extension] ";
15 cin >> archivo;
16 fweibull(total, archivo, C, K);
17 cout << "\nHistograma con 10 intervalos:";
18 histograma(archivo,10);
19 cout << "\nHistograma con 20 intervalos:";
20 histograma(archivo,20);
21 cout << "\nHistograma con 30 intervalos:";
22 histograma(archivo,30);
23 cout << "\nMedia calculada: " << media(archivo);
24 cout << "\nDesviacion Estandar calculada: " << desviacionStd(archivo);
25 cout << "\n\n\n";
26 system("PAUSE");
27 return 0;
28 }
Cuantos numeros desea generar: 525600
Parametro C de la distribucion: 11.86
Parametro K de la distribucion: 1.77
Nombre del archivo: [Incluye extension] weibull.txt
Histograma con 10 intervalos:
Intervalo 0.0 -- 4.5 |||||||||||||||||||| (84735)
Intervalo 4.5 -- 8.9 |||||||||||||||||||||||||||||||||||| (152812) [Max]
Intervalo 8.9 -- 13.4 |||||||||||||||||||||||||||||||| (135245)
Intervalo 13.4 -- 17.8 ||||||||||||||||||||| (85517)
Intervalo 17.8 -- 22.3 ||||||||||| (42269)
Intervalo 22.3 -- 26.7 ||||| (17150)
Intervalo 26.7 -- 31.2 || (5674)
Intervalo 31.2 -- 35.6 | (1712)
Intervalo 35.6 -- 40.1 | (363)
Intervalo 40.1 -- 44.5 | (83) [Min]
Histograma con 20 intervalos:
Intervalo 0.0 -- 2.2 ||||||||||||| (26559)
Intervalo 2.2 -- 4.5 ||||||||||||||||||||||||||| (58176)
Intervalo 4.5 -- 6.7 |||||||||||||||||||||||||||||||||| (74215)
Intervalo 6.7 -- 8.9 |||||||||||||||||||||||||||||||||||| (78597) [Max]
Intervalo 8.9 -- 11.1 |||||||||||||||||||||||||||||||||| (73003)
Intervalo 11.1 -- 13.4 ||||||||||||||||||||||||||||| (62242)
Intervalo 13.4 -- 15.6 ||||||||||||||||||||||| (49103)
Intervalo 15.6 -- 17.8 ||||||||||||||||| (36414)
Intervalo 17.8 -- 20.0 |||||||||||| (25392)
Intervalo 20.0 -- 22.3 ||||||||| (16877)
Intervalo 22.3 -- 24.5 |||||| (10727)
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.8 Implementacion 151
Intervalo 24.5 -- 26.7 |||| (6423)
Intervalo 26.7 -- 28.9 ||| (3664)
Intervalo 28.9 -- 31.2 || (2010)
Intervalo 31.2 -- 33.4 || (1138)
Intervalo 33.4 -- 35.6 | (574)
Intervalo 35.6 -- 37.8 | (244)
Intervalo 37.8 -- 40.1 | (119)
Intervalo 40.1 -- 42.3 | (44)
Intervalo 42.3 -- 44.5 | (39) [Min]
Histograma con 30 intervalos:
Intervalo 0.0 -- 1.5 |||||||||| (13088)
Intervalo 1.5 -- 3.0 ||||||||||||||||||||| (30209)
Intervalo 3.0 -- 4.5 ||||||||||||||||||||||||||||| (41438)
Intervalo 4.5 -- 5.9 |||||||||||||||||||||||||||||||||| (48517)
Intervalo 5.9 -- 7.4 |||||||||||||||||||||||||||||||||||| (52126)
Intervalo 7.4 -- 8.9 |||||||||||||||||||||||||||||||||||| (52169) [Max]
Intervalo 8.9 -- 10.4 |||||||||||||||||||||||||||||||||| (49325)
Intervalo 10.4 -- 11.9 |||||||||||||||||||||||||||||||| (45771)
Intervalo 11.9 -- 13.4 |||||||||||||||||||||||||||| (40149)
Intervalo 13.4 -- 14.8 |||||||||||||||||||||||| (34137)
Intervalo 14.8 -- 16.3 |||||||||||||||||||| (28353)
Intervalo 16.3 -- 17.8 |||||||||||||||| (23027)
Intervalo 17.8 -- 19.3 ||||||||||||| (18022)
Intervalo 19.3 -- 20.8 |||||||||| (13989)
Intervalo 20.8 -- 22.3 |||||||| (10258)
Intervalo 22.3 -- 23.7 |||||| (7683)
Intervalo 23.7 -- 25.2 ||||| (5599)
Intervalo 25.2 -- 26.7 |||| (3868)
Intervalo 26.7 -- 28.2 ||| (2690)
Intervalo 28.2 -- 29.7 || (1796)
Intervalo 29.7 -- 31.2 || (1188)
Intervalo 31.2 -- 32.7 || (841)
Intervalo 32.7 -- 34.1 | (535)
Intervalo 34.1 -- 35.6 | (336)
Intervalo 35.6 -- 37.1 | (187)
Intervalo 37.1 -- 38.6 | (98)
Intervalo 38.6 -- 40.1 | (78)
Intervalo 40.1 -- 41.6 | (29)
Intervalo 41.6 -- 43.0 | (33)
Intervalo 43.0 -- 44.5 | (21) [Min]
Media calculada: 10.5595
Desviacion Estandar calculada: 6.15714
Evidentemente, mientras mas intervalos conozcamos, podremos hacer calculos
mas renados y tener resultados mas precisos. Mientras el primer histograma
(10 intervalos) nos indica alguna informacion, no se compara con el nivel de
detalle que nos proporciona el ultimo histograma (30 intervalos). Si hacemos
el pronostico de la energa producida en un a no a partir de las probabilidades
asignadas a cada intervalo, los resultados seran muy diferentes, porque en ese
caso, cada intervalos representa los lmites superior e inferior de la velocidad del
viento.
Como la energa producida depende del cubo de la velocidad del viento, ten-
dremos una diferencia considerable al realizar el pronostico. Tomando el punto
medio de cada intervalo, elevandolo al cubo y multiplicando por la probabilidad
que le corresponde a ese intervalo, tendremos una aproximacion simplicada del
resultado (falta considerar cuestiones tecnicas relativas al generador eolico, al-
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
152 Codigos
gunas cuestiones de conversion de la energa cinetica del viento a la electricidad
generada por el generador eolico, etc.) y podemos ver la gran diferencia en cada
caso.
Nota: Los datos que se introdujeron en el ultimo ejemplo corresponden a
la distribucion que presenta la velocidad de viento en la Venta, Oaxaca, Mex.
Fuente: Evaluacion del recurso eolico de La Venta, Juchitan, Oaxaca. M. A.
Borja, O. A. Jaramillo, M. F. Morales. Instituto de Investigaciones Electricas.
Temixco, Morelos, Mexico. ojs@iie.org.mx. El valor 525 600 = 60 24 365,
el n umero de minutos en un a no no bisiesto. Entonces, el valor que aparece
entre parentesis indica el n umero de minutos al a no que la velocidad presento
una velocidad en el intervalo que le corresponde.
El promedio calculado con la ayuda de la funcion media(archivo) corresponde
a la media aritmetica de los datos. No considera la frecuencia relativa por la
cual debe multiplicarse para realizar este calculo. Histogramas con mayores in-
tervalos nos muestran informacion que nos ayudaran, en este caso, a pronosticar
con mayor precision el valor buscado, dado que tendremos una curva mas suave.
Histograma con 40 intervalos:
Intervalo 0.0 -- 1.1 |||||||| (7846)
Intervalo 1.1 -- 2.2 |||||||||||||||||| (18713)
Intervalo 2.2 -- 3.3 |||||||||||||||||||||||| (26181)
Intervalo 3.3 -- 4.5 ||||||||||||||||||||||||||||| (31995)
Intervalo 4.5 -- 5.6 ||||||||||||||||||||||||||||||||| (35839)
Intervalo 5.6 -- 6.7 ||||||||||||||||||||||||||||||||||| (38376)
Intervalo 6.7 -- 7.8 |||||||||||||||||||||||||||||||||||| (39618) [Max]
Intervalo 7.8 -- 8.9 ||||||||||||||||||||||||||||||||||| (38979)
Intervalo 8.9 -- 10.0 |||||||||||||||||||||||||||||||||| (37305)
Intervalo 10.0 -- 11.1 ||||||||||||||||||||||||||||||||| (35698)
Intervalo 11.1 -- 12.2 |||||||||||||||||||||||||||||| (32791)
Intervalo 12.2 -- 13.4 ||||||||||||||||||||||||||| (29451)
Intervalo 13.4 -- 14.5 |||||||||||||||||||||||| (26195)
Intervalo 14.5 -- 15.6 ||||||||||||||||||||| (22908)
Intervalo 15.6 -- 16.7 |||||||||||||||||| (19512)
Intervalo 16.7 -- 17.8 |||||||||||||||| (16902)
Intervalo 17.8 -- 18.9 ||||||||||||| (13930)
Intervalo 18.9 -- 20.0 ||||||||||| (11462)
Intervalo 20.0 -- 21.1 ||||||||| (9468)
Intervalo 21.1 -- 22.3 |||||||| (7409)
Intervalo 22.3 -- 23.4 |||||| (5946)
Intervalo 23.4 -- 24.5 ||||| (4781)
Intervalo 24.5 -- 25.6 |||| (3714)
Intervalo 25.6 -- 26.7 ||| (2709)
Intervalo 26.7 -- 27.8 ||| (2100)
Intervalo 27.8 -- 28.9 || (1564)
Intervalo 28.9 -- 30.1 || (1138)
Intervalo 30.1 -- 31.2 || (872)
Intervalo 31.2 -- 32.3 || (667)
Intervalo 32.3 -- 33.4 | (471)
Intervalo 33.4 -- 34.5 | (353)
Intervalo 34.5 -- 35.6 | (221)
Intervalo 35.6 -- 36.7 | (134)
Intervalo 36.7 -- 37.8 | (110)
Intervalo 37.8 -- 39.0 | (75)
Intervalo 39.0 -- 40.1 | (44)
Intervalo 40.1 -- 41.2 | (29)
Intervalo 41.2 -- 42.3 | (15) [Min]
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.8 Implementacion 153
Intervalo 42.3 -- 43.4 | (18)
Intervalo 43.4 -- 44.5 | (21)
Histograma con 50 intervalos:
Intervalo 0.0 -- 0.9 ||||||| (5258)
Intervalo 0.9 -- 1.8 ||||||||||||||| (12698)
Intervalo 1.8 -- 2.7 ||||||||||||||||||||| (18220)
Intervalo 2.7 -- 3.6 |||||||||||||||||||||||||| (22630)
Intervalo 3.6 -- 4.5 |||||||||||||||||||||||||||||| (25929)
Intervalo 4.5 -- 5.3 |||||||||||||||||||||||||||||||| (28446)
Intervalo 5.3 -- 6.2 |||||||||||||||||||||||||||||||||| (30203)
Intervalo 6.2 -- 7.1 |||||||||||||||||||||||||||||||||||| (31348)
Intervalo 7.1 -- 8.0 |||||||||||||||||||||||||||||||||||| (31668) [Max]
Intervalo 8.0 -- 8.9 ||||||||||||||||||||||||||||||||||| (31147)
Intervalo 8.9 -- 9.8 |||||||||||||||||||||||||||||||||| (30042)
Intervalo 9.8 -- 10.7 ||||||||||||||||||||||||||||||||| (28861)
Intervalo 10.7 -- 11.6 ||||||||||||||||||||||||||||||| (27510)
Intervalo 11.6 -- 12.5 ||||||||||||||||||||||||||||| (25550)
Intervalo 12.5 -- 13.4 ||||||||||||||||||||||||||| (23282)
Intervalo 13.4 -- 14.2 ||||||||||||||||||||||||| (21302)
Intervalo 14.2 -- 15.1 |||||||||||||||||||||| (19039)
Intervalo 15.1 -- 16.0 |||||||||||||||||||| (16896)
Intervalo 16.0 -- 16.9 |||||||||||||||||| (14965)
Intervalo 16.9 -- 17.8 |||||||||||||||| (13315)
Intervalo 17.8 -- 18.7 |||||||||||||| (11387)
Intervalo 18.7 -- 19.6 |||||||||||| (9700)
Intervalo 19.6 -- 20.5 |||||||||| (8388)
Intervalo 20.5 -- 21.4 ||||||||| (7033)
Intervalo 21.4 -- 22.3 ||||||| (5761)
Intervalo 22.3 -- 23.2 |||||| (4872)
Intervalo 23.2 -- 24.0 ||||| (4038)
Intervalo 24.0 -- 24.9 ||||| (3413)
Intervalo 24.9 -- 25.8 |||| (2728)
Intervalo 25.8 -- 26.7 ||| (2099)
Intervalo 26.7 -- 27.6 ||| (1732)
Intervalo 27.6 -- 28.5 ||| (1358)
Intervalo 28.5 -- 29.4 || (1088)
Intervalo 29.4 -- 30.3 || (820)
Intervalo 30.3 -- 31.2 || (676)
Intervalo 31.2 -- 32.1 || (571)
Intervalo 32.1 -- 32.9 | (403)
Intervalo 32.9 -- 33.8 | (319)
Intervalo 33.8 -- 34.7 | (241)
Intervalo 34.7 -- 35.6 | (178)
Intervalo 35.6 -- 36.5 | (111)
Intervalo 36.5 -- 37.4 | (104)
Intervalo 37.4 -- 38.3 | (56)
Intervalo 38.3 -- 39.2 | (48)
Intervalo 39.2 -- 40.1 | (44)
Intervalo 40.1 -- 41.0 | (12)
Intervalo 41.0 -- 41.9 | (32)
Intervalo 41.9 -- 42.7 | (0) [Min]
Intervalo 42.7 -- 43.6 | (18)
Intervalo 43.6 -- 44.5 | (21)
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
154 Codigos
2.8.1.11 PchiUniforme(archivo, No Int)
Funcion 2.8.11
void PchiUniforme(char filename[], int Num Int)
Descripcion: Esta funcion sirve de apoyo en la prueba de bondad de ajuste
que los datos contenidos en el archivo de nombre filename presenten una dis-
tribucion uniforme, calculando el valor de
2
.
1 #include "estadistica.h"
2 using namespace std;
3 int main(void){
4 int total; // n umeros a generar...
5 char archivo[15]; // nombre del archivo...
6 int i; // contador
7 printf("\nEste programa verifica que la funcion");
8 printf("\nChiUniforme(char filename[], int Num_Int)");
9 printf("\nfuncione correctamente...");
10 printf("\n\nCuantos numeros desea generar: ");
11 scanf("%i", &total);
12 printf("\nNombre del archivo: [Incluye extension] ");
13 scanf("%s", &archivo);
14 funiforme(total, archivo); // genero uniformes...
15 PchiUniforme(archivo, 15); // prueba chi2
16 printf("\nHistograma Observado...");
17 histograma(archivo, 15); // dibujar histograma...
18 printf("\n\n\n");
19 system("PAUSE");
20 return 0;
21 }
Este programa verifica que la funcion
ChiUniforme(char filename[], int Num_Int, float alpha)
funcione correctamente...
Cuantos numeros desea generar: 20000
Nombre del archivo: [Incluye extension] test.txt
El archivo test.txt contiene 20000 datos.
Chi2 = 0.001277
Los datos contenidos en el archivo test.txt
parecen presentar distribucion uniforme.
Histograma Observado...
Intervalo 0.0 -- 0.1 ||||||||||||||||||||||||||||||||| (1351)
Intervalo 0.1 -- 0.1 ||||||||||||||||||||||||||||||| (1248) [Min]
Intervalo 0.1 -- 0.2 ||||||||||||||||||||||||||||||||| (1345)
Intervalo 0.2 -- 0.3 ||||||||||||||||||||||||||||||||| (1342)
Intervalo 0.3 -- 0.3 |||||||||||||||||||||||||||||||| (1283)
Intervalo 0.3 -- 0.4 |||||||||||||||||||||||||||||||| (1293)
Intervalo 0.4 -- 0.5 ||||||||||||||||||||||||||||||||| (1321)
Intervalo 0.5 -- 0.5 |||||||||||||||||||||||||||||||| (1281)
Intervalo 0.5 -- 0.6 |||||||||||||||||||||||||||||||||| (1367)
Intervalo 0.6 -- 0.7 |||||||||||||||||||||||||||||||||||| (1458) [Max]
Intervalo 0.7 -- 0.7 ||||||||||||||||||||||||||||||||| (1322)
Intervalo 0.7 -- 0.8 |||||||||||||||||||||||||||||||| (1312)
Intervalo 0.8 -- 0.9 |||||||||||||||||||||||||||||||||| (1358)
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.8 Implementacion 155
Intervalo 0.9 -- 0.9 |||||||||||||||||||||||||||||||||| (1359)
Intervalo 0.9 -- 1.0 |||||||||||||||||||||||||||||||||| (1359)
Presione una tecla para continuar . . .
El siguiente prueba un archivo que tiene datos con distribucion normal estandar.
1 #include "estadistica.h"
2 using namespace std;
3 int main(void){
4 char archivo[15]; // nombre del archivo...
5 printf("\nEste programa verifica que la funcion");
6 printf("\nChiUniforme(char filename[], int Num_Int)");
7 printf("\nfuncione correctamente...");
8 printf("\nNombre del archivo: [Incluye extension] ");
9 scanf("%s", &archivo);
10 PchiUniforme(archivo, 15);
11 printf("\nHistograma Observado...");
12 histograma(archivo,15);
13 printf("\n\n\n");
14 system("PAUSE");
15 return 0;
16 }
Este programa verifica que la funcion
ChiUniforme(char filename[], int Num_Int)
funcione correctamente...
Nombre del archivo: [Incluye extension] normal.txt
El archivo normal.txt contiene 99999 datos.
Chi2 = 1.339906
Histograma Observado...
Intervalo -1.1 -- -0.9 | (11) [Min]
Intervalo -0.9 -- -0.7 | (92)
Intervalo -0.7 -- -0.5 || (517)
Intervalo -0.5 -- -0.3 |||| (1948)
Intervalo -0.3 -- -0.1 |||||||||| (5820)
Intervalo -0.1 -- 0.1 ||||||||||||||||||||| (12346)
Intervalo 0.1 -- 0.2 ||||||||||||||||||||||||||||||| (19189)
Intervalo 0.2 -- 0.4 |||||||||||||||||||||||||||||||||||| (22026) [Max]
Intervalo 0.4 -- 0.6 ||||||||||||||||||||||||||||||| (18597)
Intervalo 0.6 -- 0.8 |||||||||||||||||||| (11736)
Intervalo 0.8 -- 1.0 |||||||||| (5414)
Intervalo 1.0 -- 1.2 |||| (1747)
Intervalo 1.2 -- 1.4 || (460)
Intervalo 1.4 -- 1.6 | (80)
Intervalo 1.6 -- 1.8 | (15)
Presione una tecla para continuar . . .
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
156 Codigos
2.8.1.12 PchiNormal(archivo, No Int)
Funcion 2.8.12
void PchiNormal(char filename[], int Num Int)
Descripcion: Esta funcion sirve de apoyo en la prueba de bondad de ajuste
que los datos contenidos en el archivo de nombre filename presenten una dis-
tribucion normal, calculando el valor de
2
. La funcion calcula la media y
la desviacion estandar de los datos contenidos en el archivo y los utiliza para
realizar el calculo de
2
.
1 #include "estadistica.h"
2 using namespace std;
3 int main(void){
4 char archivo[15]; // nombre del archivo...
5 printf("\nEste programa verifica que la funcion");
6 printf("\nPchiNormal(char filename[], int Num_Int)");
7 printf("\nfuncione correctamente...");
8 printf("\nNombre del archivo: [Incluye extension] ");
9 scanf("%s", &archivo);
10 PchiNormal(archivo, 15);
11 printf("\nHistograma Observado...");
12 histograma(archivo,15);
13 printf("\n\n\n");
14 system("PAUSE");
15 return 0;
16 }
Este programa verifica que la funcion
PchiNormal(char filename[], int Num\_Int)
funcione correctamente...
Nombre del archivo: [Incluye extension] Normal.txt
El archivo Normal.txt contiene 99999 datos.
Media calculada: 0.336161
Desviacion Estandar calculada: 0.338613
Chi2 = 0.000004
Los datos contenidos en el archivo Normal.txt
parecen presentar distribucion normal.
Histograma Observado...
Intervalo -1.1 -- -0.9 | (11) [Min]
Intervalo -0.9 -- -0.7 | (92)
Intervalo -0.7 -- -0.5 || (517)
Intervalo -0.5 -- -0.3 |||| (1948)
Intervalo -0.3 -- -0.1 |||||||||| (5820)
Intervalo -0.1 -- 0.1 ||||||||||||||||||||| (12346)
Intervalo 0.1 -- 0.2 ||||||||||||||||||||||||||||||| (19189)
Intervalo 0.2 -- 0.4 |||||||||||||||||||||||||||||||||||| (22026) [Max]
Intervalo 0.4 -- 0.6 ||||||||||||||||||||||||||||||| (18597)
Intervalo 0.6 -- 0.8 |||||||||||||||||||| (11736)
Intervalo 0.8 -- 1.0 |||||||||| (5414)
Intervalo 1.0 -- 1.2 |||| (1747)
Intervalo 1.2 -- 1.4 || (460)
Intervalo 1.4 -- 1.6 | (80)
Intervalo 1.6 -- 1.8 | (15)
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.8 Implementacion 157
Presione una tecla para continuar . . .
Un segundo ejemplo donde se utiliza un archivo con datos uniformes es el sigu-
iente:
Este programa verifica que la funcion
PchiNormal(char filename[], int Num\_Int)
funcione correctamente...
Nombre del archivo: [Incluye extension] Uniforme.txt
El archivo Uniforme.txt contiene 99999 datos.
Media calculada: 0.501481
Desviacion Estandar calculada: 0.288523
Chi2 = 79.591026
Histograma Observado...
Intervalo 0.0 -- 0.1 ||||||||||||||||||||||||||||||||||| (6650)
Intervalo 0.1 -- 0.1 ||||||||||||||||||||||||||||||||||| (6591)
Intervalo 0.1 -- 0.2 ||||||||||||||||||||||||||||||||||| (6733)
Intervalo 0.2 -- 0.3 |||||||||||||||||||||||||||||||||| (6522)
Intervalo 0.3 -- 0.3 |||||||||||||||||||||||||||||||||| (6514)
Intervalo 0.3 -- 0.4 ||||||||||||||||||||||||||||||||||| (6677)
Intervalo 0.4 -- 0.5 ||||||||||||||||||||||||||||||||||| (6681)
Intervalo 0.5 -- 0.5 ||||||||||||||||||||||||||||||||||| (6673)
Intervalo 0.5 -- 0.6 ||||||||||||||||||||||||||||||||||| (6701)
Intervalo 0.6 -- 0.7 |||||||||||||||||||||||||||||||||||| (6880) [Max]
Intervalo 0.7 -- 0.7 ||||||||||||||||||||||||||||||||||| (6665)
Intervalo 0.7 -- 0.8 |||||||||||||||||||||||||||||||||| (6513) [Min]
Intervalo 0.8 -- 0.9 ||||||||||||||||||||||||||||||||||| (6730)
Intervalo 0.9 -- 0.9 |||||||||||||||||||||||||||||||||||| (6849)
Intervalo 0.9 -- 1.0 ||||||||||||||||||||||||||||||||||| (6618)
Presione una tecla para continuar . . .
2.8.1.13 PchiExponencial(archivo, Num Int, lambda)
Funcion 2.8.13
void PchiExponencial(char filename[], int Num Int, float lambda)
Descripcion: Esta funcion sirve de apoyo en la prueba de bondad de ajuste
que los datos contenidos en el archivo de nombre filename presenten una dis-
tribucion normal, calculando el valor de
2
. La funcion calcula la media y
la desviacion estandar de los datos contenidos en el archivo y los utiliza para
realizar el calculo de
2
.
1 #include "estadistica.h"
2 using namespace std;
3 int main(void){
4 int total; // n umeros a generar...
5 char archivo[15]; // nombre del archivo...
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
158 Codigos
6 float L;
7 printf("\nEste programa verifica que la funcion");
8 printf("\nPchiExponencial(char filename[], int Num_Int, float lambda)");
9 printf("\nfuncione correctamente...");
10 printf("\n\nCuantos numeros desea generar: ");
11 scanf("%i", &total);
12 printf("\n\nParametro Lambda de la distribucion: ");
13 scanf("%f", &L);
14 printf("\nNombre del archivo: [Incluye extension] ");
15 scanf("%s", &archivo);
16 fexponencial(total, 3.0, archivo); // genero numeros pseudoaleatorios
17 PchiExponencial(archivo, 15, 3); // prueba de bondad de ajuste
18 printf("\nHistograma Observado...");
19 histograma(archivo,15);
20 printf("\n\n\n");
21 system("PAUSE");
22 return 0;
23 }
Este programa verifica que la funcion
PchiExponencial(char filename[], int Num\_Int, float lambda)
funcione correctamente...
Cuantos numeros desea generar: 250
Parametro Lambda de la distribucion: 3
Nombre del archivo: [Incluye extension] test.txt
El archivo test.txt contiene 250 datos.
Media calculada: 0.337249
Chi2 = 0.762427
Histograma Observado...
Intervalo 0.0 -- 0.2 |||||||||||||||||||||||||||||||||||| (98) [Max]
Intervalo 0.2 -- 0.4 ||||||||||||||||||||||||| (68)
Intervalo 0.4 -- 0.5 |||||||||||||| (35)
Intervalo 0.5 -- 0.7 ||||||||| (23)
Intervalo 0.7 -- 0.9 ||||| (10)
Intervalo 0.9 -- 1.1 ||| (5)
Intervalo 1.1 -- 1.3 || (2)
Intervalo 1.3 -- 1.4 | (1)
Intervalo 1.4 -- 1.6 || (2)
Intervalo 1.6 -- 1.8 || (2)
Intervalo 1.8 -- 2.0 | (1)
Intervalo 2.0 -- 2.2 | (1)
Intervalo 2.2 -- 2.3 | (0) [Min]
Intervalo 2.3 -- 2.5 | (0) [Min]
Intervalo 2.5 -- 2.7 | (1)
Presione una tecla para continuar . . .
Enseguida se da un ejemplo donde se utiliza el archivo Uniforme.txt que con-
tiene datos con distribucion uniforme.
En la lnea 10 del codigo se indica a la funcion que suponemos que el archivo
contiene datos con distribucion exponencial con parametro = 3.0
1 #include "estadistica.h"
2 using namespace std;
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.8 Implementacion 159
3 int main(void){
4 char archivo[15]; // nombre del archivo...
5 float L; // parametro lambda
6 printf("\nEste programa verifica que la funcion");
7 printf("\nChiUniforme(char filename[], int Num_Int, float alpha)");
8 printf("\nfuncione correctamente...\n");
9 printf("\nNombre del archivo: [Incluye extension] ");
10 scanf("%s", &archivo);
11 printf("\nParametro Lambda supuesto: ");
12 scanf("%f", &L);
13 PchiExponencial(archivo, 15, L);
14 printf("\n\n\n");
15 system("PAUSE");
16 return 0;
17 }
Este programa verifica que la funcion
ChiUniforme(char filename[], int Num_Int, float alpha)
funcione correctamente...
Nombre del archivo: [Incluye extension] Uniforme.txt
Parametro Lambda supuesto: 3.0
El archivo Uniforme.txt contiene 99999 datos.
Media calculada: 0.501481
Chi2 = 288.591888
Presione una tecla para continuar . . .
2.8.1.14 PchiWeibull(Archivo, Num Int, C, K)
Funcion 2.8.14
void PchiWeibull(char filename[], int Num Int, float c, float k)
Descripcion: Esta funcion prueba que los datos contenidos en el archivo de
nombre filename presenten una distribucion Weibull con parametro promedio.
Devuelve el n umero de datos leidos del archivo, la media de esos datos el valor
de
2
.
1 #include "estadistica.h"
2 using namespace std;
3 int main(void){
4 char archivo[15]; // nombre del archivo...
5 float C, K; // intervalo para generar uniformes
6 printf("\nEste programa verifica que la funcion");
7 printf("\nChiUniforme(char filename[], int Num_Int, float alpha)");
8 printf("\nfuncione correctamente...");
9 printf("\nNombre del archivo: [Incluye extension] ");
10 scanf("%s", &archivo);
11 printf("\nValor del parametro C: ");
12 scanf("%f", &C);
13 printf("\nValor del parametro K: ");
14 scanf("%f", &K);
15 PchiWeibull(archivo, 15, C, K);
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
160 Codigos
16 printf("\nHistograma Observado...");
17 histograma(archivo,15);
18 printf("\n\n\n");
19 system("PAUSE");
20 return 0;
21 }
Este programa verifica que la funcion
ChiUniforme(char filename[], int Num_Int, float alpha)
funcione correctamente...
Nombre del archivo: [Incluye extension] Weibull.txt
Valor del parametro C: 11.86
Valor del parametro K: 1.77
El archivo Weibull.txt contiene 525577 datos.
Media calculada: 10.559526
Chi2 = 0.000090
Los datos contenidos en el archivo Weibull.txt
parecen presentar distribucion Weibull.
Histograma Observado...
Intervalo 0.0 -- 3.0 |||||||||||||||| (43297)
Intervalo 3.0 -- 5.9 ||||||||||||||||||||||||||||||| (89955)
Intervalo 5.9 -- 8.9 |||||||||||||||||||||||||||||||||||| (104295) [Max]
Intervalo 8.9 -- 11.9 ||||||||||||||||||||||||||||||||| (95096)
Intervalo 11.9 -- 14.8 |||||||||||||||||||||||||| (74286)
Intervalo 14.8 -- 17.8 |||||||||||||||||| (51380)
Intervalo 17.8 -- 20.8 |||||||||||| (32011)
Intervalo 20.8 -- 23.7 ||||||| (17941)
Intervalo 23.7 -- 26.7 |||| (9467)
Intervalo 26.7 -- 29.7 ||| (4486)
Intervalo 29.7 -- 32.7 || (2029)
Intervalo 32.7 -- 35.6 | (871)
Intervalo 35.6 -- 38.6 | (285)
Intervalo 38.6 -- 41.6 | (107)
Intervalo 41.6 -- 44.5 | (54) [Min]
Presione una tecla para continuar . . .
Otro ejemplo, donde los datos NO presentan distribucion Weibull...
Este programa verifica que la funcion
ChiUniforme(char filename[], int Num_Int, float alpha)
funcione correctamente...
Nombre del archivo: [Incluye extension] test.txt
Valor del parametro C: 11.86
Valor del parametro K: 1.77
El archivo test.txt contiene 250 datos.
Media calculada: 0.337249
Chi2 = 1.659585
Histograma Observado...
Intervalo 0.0 -- 0.2 |||||||||||||||||||||||||||||||||||| (98) [Max]
Intervalo 0.2 -- 0.4 ||||||||||||||||||||||||| (68)
Intervalo 0.4 -- 0.5 |||||||||||||| (35)
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.8 Implementacion 161
Intervalo 0.5 -- 0.7 ||||||||| (23)
Intervalo 0.7 -- 0.9 ||||| (10)
Intervalo 0.9 -- 1.1 ||| (5)
Intervalo 1.1 -- 1.3 || (2)
Intervalo 1.3 -- 1.4 | (1)
Intervalo 1.4 -- 1.6 || (2)
Intervalo 1.6 -- 1.8 || (2)
Intervalo 1.8 -- 2.0 | (1)
Intervalo 2.0 -- 2.2 | (1)
Intervalo 2.2 -- 2.3 | (0) [Min]
Intervalo 2.3 -- 2.5 | (0) [Min]
Intervalo 2.5 -- 2.7 | (1)
Presione una tecla para continuar . . .
2.8.1.15 PchiRayleigh(archivo, Num Int, media)
Funcion 2.8.15
void PchiRayleigh(char filename[], int Num Int, float Media)
Descripcion: Esta funcion prueba que los datos contenidos en el archivo de
nombre filename presenten una distribucion exponencial con parametro . De-
vuelve el n umero de datos leidos del archivo, la media de esos datos el valor de

2
.
1 #include "estadistica.h"
2 using namespace std;
3 int main(void){
4 char archivo[15]; // nombre del archivo...
5 float mean; // intervalo para generar uniformes
6 printf("\nEste programa verifica que la funcion");
7 printf("\nChiUniforme(char filename[], int Num_Int, float alpha)");
8 printf("\nfuncione correctamente...");
9 printf("\nNombre del archivo: [Incluye extension] ");
10 scanf("%s", &archivo);
11 printf("\nMedia de la distribuci on: ");
12 scanf("%f", &mean);
13 PchiRayleigh(archivo, 15, mean);
14 printf("\nHistograma Observado...");
15 histograma(archivo,15);
16 printf("\n\n\n");
17 system("PAUSE");
18 return 0;
19 }
Este programa verifica que la funcion
ChiUniforme(char filename[], int Num_Int, float alpha)
funcione correctamente...
Nombre del archivo: [Incluye extension] Rayleigh.txt
Media de la distribucion: 12
El archivo Rayleigh.txt contiene 1000 datos.
Media calculada: 12.064783
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
162 Codigos
Chi2 = 0.541957
Histograma Observado...
Intervalo 0.2 -- 2.6 ||||||| (28)
Intervalo 2.6 -- 5.0 ||||||||||||||||||| (87)
Intervalo 5.0 -- 7.4 ||||||||||||||||||||||||||||| (136)
Intervalo 7.4 -- 9.8 |||||||||||||||||||||||||||||||||||| (172) [Max]
Intervalo 9.8 -- 12.2 |||||||||||||||||||||||||||||| (142)
Intervalo 12.2 -- 14.5 ||||||||||||||||||||||||| (119)
Intervalo 14.5 -- 16.9 ||||||||||||||||||| (89)
Intervalo 16.9 -- 19.3 ||||||||||||||||||| (89)
Intervalo 19.3 -- 21.7 |||||||||||| (53)
Intervalo 21.7 -- 24.1 |||||||||| (43)
Intervalo 24.1 -- 26.5 |||| (17)
Intervalo 26.5 -- 28.8 || (7)
Intervalo 28.8 -- 31.2 || (7)
Intervalo 31.2 -- 33.6 || (5) [Min]
Intervalo 33.6 -- 36.0 || (5) [Min]
Presione una tecla para continuar . . .
2.8.1.16 RL(archivo)
Funcion 2.8.16
void RL(char filename[])
Descripcion: Esta funcion calcula la recta de mejor ajuste a los datos con-
tenidos en el archivo filename.
1 #include "estadistica.h"
2 using namespace std;
3 int main(void){
4 char archivo[15]; // nombre del archivo...
5 printf("\nNombre del archivo: [Incluye extension] ");
6 scanf("%s", &archivo);
7 RL(archivo);
8 system("PAUSE");
9 return 0;
10 }
Nombre del archivo: [Incluye extension] test.txt
La recta de mejor ajuste es:
y = 1.712 + 0.719 x.
Presione una tecla para continuar . . .
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.8 Implementacion 163
2.8.1.17 RC(archivo)
Funcion 2.8.17
void RC(char filename[])
Descripcion: Esta funcion calcula la parabola de mejor ajuste a los datos
contenidos en el archivo filename.
1 #include "estadistica.h"
2 using namespace std;
3 int main(void){
4 char archivo[15]; // nombre del archivo...
5 printf("\nNombre del archivo: [Incluye extension] ");
6 scanf("%s", &archivo);
7 RC(archivo);
8 system("PAUSE");
9 return 0;
10 }
Nombre del archivo: [Incluye extension] test.txt
La parabola de mejor ajuste es:
y = -0.045 x2 + 1.454 x + 0.933
Presione una tecla para continuar . . .
Para las dos funciones anteriores, se utilizo el archivo test.txt que contiene la
siguiente informacion:
# Este archivo contiene 50 numeros
# pseudoaletorios con distribucion normal
# con media = 12.000 y desviacion estandar = 5.000.
28.840973
8.729749
6.863858
6.250802
11.933395
6.088670
7.881029
4.318137
19.204657
7.066312
11.284149
1.689564
23.058068
6.932590
8.060572
16.921389
15.777704
21.330462
13.134103
10.166203
11.624262
13.341073
15.478254
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
164 Codigos
11.428067
12.683624
13.958144
12.400598
8.131033
14.381212
14.918339
6.156746
16.142108
-1.425609
13.150411
10.138522
11.561960
10.334757
8.227782
6.067277
14.986136
8.198230
8.960726
8.599253
10.486869
9.866934
17.731067
9.864873
17.186035
6.512353
7.776886
# Fin del archivo...
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.8 Implementacion 165
2.8.2 Otras funciones
Las siguientes son funciones que estan incluidas en el archivo estadistica.h.
Las funciones antes mencionadas utilizan las funciones denidas en esta seccion
para generar n umeros pseudoaleatorios con distibuciones dadas conocidos sus
parametros (en caso de que se requiera indicar).
2.8.2.1 uniforme()
Funcion 2.8.18
double uniforme(void)
Descripcion: Esta funcion genera un n umero pseudoaleatorio con distribucion
uniforme en el intervalo (0, 1).
1 #include "estadistica.h"
2 using namespace std;
3 int main(void){
4 int total; // n umeros a generar...
5 int i; // contador
6 printf("\n\nCuantos numeros desea generar: ");
7 scanf("%i", &total);
8 for(i = 1 ; i <= total ; i++){
9 printf("\n %i,\t %f", i, uniforme()); //
10 }
11 printf("\n\n\n");
12 system("PAUSE");
13 return 0;
14 }
Cuantos numeros desea generar: 15
1, 0.001251
2, 0.563585
3, 0.193304
4, 0.808741
5, 0.585009
6, 0.479873
7, 0.350291
8, 0.895962
9, 0.822840
10, 0.746605
11, 0.174108
12, 0.858943
13, 0.710501
14, 0.513535
15, 0.303995
Presione una tecla para continuar . . .
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
166 Codigos
2.8.2.2 uniforme(a,b)
Funcion 2.8.19
double uniforme(float a, float b)
Descripcion: Esta funcion genera un n umero pseudo-aleatorio con distribucion
uniforme en el intervalo (a, b).
1 #include "estadistica.h"
2 using namespace std;
3 int main(void){
4 int total; // n umeros a generar...
5 float A, B; // intervalo para generar uniformes
6 int i; // contador
7 printf("\n\nCuantos numeros desea generar: ");
8 scanf("%i", &total);
9 printf("\n\nLimite inferior de la distribucion: ");
10 scanf("%f", &A);
11 printf("\n\nLimite superior de la distribucion: ");
12 scanf("%f", &B);
13 for(i = 1 ; i <= total ; i++){
14 printf("\n %i,\t %f", i, uniforme(A,B)); //
15 }
16 printf("\n\n\n");
17 system("PAUSE");
18 return 0;
19 }
Cuantos numeros desea generar: 25
Limite inferior de la distribucion: -100
Limite superior de la distribucion: 100
1, -99.749748
2, 12.717063
3, -61.339152
4, 61.748100
5, 17.001862
6, -4.025391
7, -29.941710
8, 79.192480
9, 64.568010
10, 49.320963
11, -65.178381
12, 71.788690
13, 42.100284
14, 2.706992
15, -39.201025
16, -97.003082
17, -81.719413
18, -27.109592
19, -70.537431
20, -66.820276
21, 97.705008
22, -10.861538
23, -76.183355
24, -99.066134
25, -98.217719
Presione una tecla para continuar . . .
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.8 Implementacion 167
2.8.2.3 weibull(c,k)
Funcion 2.8.20
double weibull(double c, double k)
Descripcion: Esta funcion genera n umeros pseudoaleatorios con distribucion
Weibull. Los parametros c y k corresponden a la forma y escala de la dis-
tribucion, respectivamente.
1 #include "estadistica.h"
2 using namespace std;
3 int main(void){
4 int total; // n umeros a generar...
5 float C, K; // intervalo para generar uniformes
6 int i; // contador
7 printf("\n\nCuantos numeros desea generar: ");
8 scanf("%i", &total);
9 printf("\n\nParametro C de la distribucion: ");
10 scanf("%f", &C);
11 printf("\n\nParametro K de la distribucion: ");
12 scanf("%f", &K);
13 for(i = 1 ; i <= total ; i++){
14 printf("\n %i,\t %f", i, weibull(C,K)); //
15 }
16 printf("\n\n\n");
17 system("PAUSE");
18 return 0;
19 }
Cuantos numeros desea generar: 25
Parametro C de la distribucion: 11.86
Parametro K de la distribucion: 1.77
1, 0.271845
2, 10.668868
3, 4.974081
4, 15.760481
5, 11.030096
6, 9.327647
7, 7.374055
8, 18.813593
9, 16.168644
10, 14.185015
11, 4.658680
12, 17.339041
13, 13.390201
14, 9.855590
15, 6.684013
16, 1.109751
17, 3.152986
18, 7.584638
19, 4.201994
20, 4.521017
21, 27.628521
22, 8.803132
23, 3.692812
24, 0.572603
25, 0.825961
Presione una tecla para continuar . . .
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
168 Codigos
2.8.2.4 rayleigh(media)
Funcion 2.8.21
double rayleigh(float media)
Descripcion: Esta funcion genera n umeros pseudoaleatorios con distribucion
Rayleigh con media media.
1 #include "estadistica.h"
2
3 using namespace std;
4 int main(void){
5 float mean; // parametro de la distribucion
6 int total, i;
7 printf("\nEste programa verifica que la funcion");
8 printf("\nfloat rayleigh(float media)");
9 printf("\nfuncione correctamente...\n");
10 printf("Cuantos numeros deseas generar? ");
11 scanf("%i", &total);
12 printf("\nMedia de la distribucion: ");
13 scanf("%f", &mean);
14 for(i = 1 ; i <= total ; i++){
15 printf("\nGenerado: %f", rayleigh(mean));
16 }
17 printf("\n\n\n");
18 system("PAUSE");
19 return 0;
20 }
Este programa verifica que la funcion
float rayleign(float media)
funcione correctamente...
Cuantos numeros deseas generar? 25
Media de la distribucion: 12
Generado: 35.005940
Generado: 10.253663
Generado: 17.358807
Generado: 6.238612
Generado: 9.914491
Generado: 11.602552
Generado: 13.868260
Generado: 4.487969
Generado: 5.979245
Generado: 7.319658
Generado: 17.902631
Generado: 5.279985
Generado: 7.916121
Generado: 11.053911
Generado: 14.775617
Generado: 27.752294
Generado: 20.944032
Generado: 13.603776
Generado: 18.738855
Generado: 18.148271
Generado: 1.454668
Generado: 12.172394
Generado: 19.752192
Generado: 31.368345
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.8 Implementacion 169
Generado: 29.418927
Presione una tecla para continuar . . .
2.8.2.5 normal()
Funcion 2.8.22
double normal(void)
Descripcion: Esta funcion genera n umeros pseudoaleatorios con distribucion
uniforme con media = 0.0 y desviacionStd = 1.0, es decir, distribucion normal
estandarizada.
1 #include "estadistica.h"
2 using namespace std;
3 int main(void){
4 int total; // n umeros a generar...
5 int i; // contador
6 printf("\n\nCuantos numeros desea generar: ");
7 scanf("%i", &total);
8
9 for(i = 1 ; i <= total ; i++){
10 printf("\n %i,\t %f", i, normal()); //
11 }
12 printf("\n\n\n");
13 system("PAUSE");
14 return 0;
15 }
Cuantos numeros desea generar: 25
1, 3.368195
2, -0.654050
3, -1.027228
4, -1.149840
5, -0.013321
6, -1.182266
7, -0.823794
8, -1.536373
9, 1.440931
10, -0.986738
11, -0.143170
12, -2.062087
13, 2.211614
14, -1.013482
15, -0.787886
16, 0.984278
17, 0.755541
18, 1.866092
19, 0.226821
20, -0.366759
21, -0.075148
22, 0.268215
23, 0.695651
24, -0.114387
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
170 Codigos
25, 0.136725
Presione una tecla para continuar . . .
2.8.2.6 normal(media, desviacionStd)
Funcion 2.8.23
double normal(double media, double desviacionStd)
Descripcion: Esta funcion genera n umeros pseudoaleatorios con distribucion
uniforme con media media y desviacion estandar desviacionStd, denidas por
el usuario.
1 #include "estadistica.h"
2 using namespace std;
3 int main(void){
4 int total; // n umeros a generar...
5 float mean, SD; // intervalo para generar uniformes
6 int i; // contador
7 printf("\n\nCuantos numeros desea generar: ");
8 scanf("%i", &total);
9 printf("\n\nMedia de la distribucion: ");
10 scanf("%f", &mean);
11 printf("\n\nDesviacion estandar de la distribucion: ");
12 scanf("%f", &SD);
13
14 for(i = 1 ; i <= total ; i++){
15 printf("\n %i,\t %f", i, normal(mean, SD)); //
16 printf("\n\n\n");
17 system("PAUSE");
18 return 0;
19 }
Cuantos numeros desea generar: 20
Media de la distribucion: 100
Desviacion estandar de la distribucion: 12
1, 140.418334
2, 92.151398
3, 87.673259
4, 86.201924
5, 99.840149
6, 85.812808
7, 90.114470
8, 81.563529
9, 117.291178
10, 88.159150
11, 98.281958
12, 75.254955
13, 126.539363
14, 87.838215
15, 90.545373
16, 111.811334
17, 109.066489
18, 122.393108
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.8 Implementacion 171
19, 102.721846
20, 95.598887
Presione una tecla para continuar . . .
2.8.2.7 exponencial(lambda)
Funcion 2.8.24
float exponencial(float lambda)
Descripcion: Esta funcion genera n umeros pseudoaleatorios con distribucion
exponencial y parametro lambda denido por el usuario.
1 #include "estadistica.h"
2 using namespace std;
3 int main(void){
4 int total; // n umeros a generar...
5 int i; // contador
6 float L; // Parametro de la distribucion
7 printf("\n\nCuantos numeros desea generar: ");
8 scanf("%i", &total);
9 printf("\n\nParametro lambda de la distribucion: ");
10 scanf("%f", &L);
11 for(i = 1 ; i <= total ; i++){
12 printf("\n %i,\t %f", i, exponencial(L)); //
13 }
14 printf("\n\n\n");
15 system("PAUSE");
16 return 0;
17 }
Cuantos numeros desea generar: 25
Media de la distribucion: 0.5
1, 0.002504
2, 1.658325
3, 0.429617
4, 3.308248
5, 1.758998
6, 1.307365
7, 0.862463
8, 4.526006
9, 3.461405
10, 2.745610
11, 0.382583
12, 3.917189
13, 2.479210
14, 1.441180
15, 0.724797
16, 0.030196
17, 0.191707
18, 0.906535
19, 0.318725
20, 0.362801
21, 8.935176
22, 1.180071
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
172 Codigos
23, 0.253584
24, 0.009361
25, 0.017903
Presione una tecla para continuar . . .
2.8.2.8 geometrica(p)
Funcion 2.8.25
int geometrica(float p)
Descripcion: Esta funcion genera n umeros pseudoaleatorios con distribucion
geometrica de parametro p.
1 #include "estadistica.h"
2
3 using namespace std;
4 int main(void){
5 float p; // parametro de la distribucion
6 int total, i;
7 printf("\nEste programa verifica que la funcion");
8 printf("\nint geometrica(float p)");
9 printf("\nfuncione correctamente...\n");
10 printf("Cuantos numeros deseas generar? ");
11 scanf("%i", &total);
12 printf("\nParametro p supuesto: ");
13 scanf("%f", &p);
14 for(i = 1 ; i <= total ; i++){
15 printf("\nGenerado: %i", geometrica(p));
16 }
17 printf("\n\n\n");
18 system("PAUSE");
19 return 0;
20 }
Este programa verifica que la funcion
int geometrica(float p)
funcione correctamente...
Cuantos numeros deseas generar? 25
Parametro p supuesto: 0.25
Generado: 0
Generado: 2
Generado: 0
Generado: 5
Generado: 2
Generado: 1
Generado: 0
Generado: 7
Generado: 5
Generado: 4
Generado: 0
Generado: 6
Generado: 3
Generado: 2
Generado: 0
Generado: 0
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.8 Implementacion 173
Generado: 0
Generado: 1
Generado: 0
Generado: 0
Generado: 15
Generado: 1
Generado: 0
Generado: 0
Generado: 0
Presione una tecla para continuar . . .
2.8.2.9 poisson(alpha)
Funcion 2.8.26
int poisson(float alpha)
Descripcion: Esta funcion genera n umeros pseudoaleatorios con distribucion
Poisson de parametro .
1 #include "estadistica.h"
2
3 using namespace std;
4 int main(void){
5 float a; // parametro de la distribucion
6 int total, i;
7 printf("\nEste programa verifica que la funcion");
8 printf("\nint poisson(float alpha)");
9 printf("\nfuncione correctamente...\n");
10 printf("Cuantos numeros deseas generar? ");
11 scanf("%i", &total);
12 printf("\nParametro Alpha supuesto: ");
13 scanf("%f", &a);
14 for(i = 1 ; i <= 25 ; i++){
15 printf("\nGenerado: %i", poisson(a));
16 }
17 printf("\n\n\n");
18 system("PAUSE");
19 return 0;
20 }
Este programa verifica que la funcion
int poisson(float alpha)
funcione correctamente...
Cuantos numeros deseas generar? 25
Parametro Alpha supuesto: 3
Generado: 1
Generado: 598
Generado: 593
Generado: 579
Generado: 655
Generado: 585
Generado: 611
Generado: 604
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
174 Codigos
Generado: 637
Generado: 606
Generado: 616
Generado: 592
Generado: 622
Generado: 628
Generado: 587
Generado: 565
Generado: 618
Generado: 592
Generado: 613
Generado: 616
Generado: 621
Generado: 610
Generado: 612
Generado: 640
Generado: 581
Presione una tecla para continuar . . .
2.8.2.10 media(archivo), desviacionStd(archivo)
Funcion 2.8.27
double media(char filename[])
Descripcion: Esta funcion calcula la media aritmetica de los datos contenidos
en el archivo de nombre filename.
Funcion 2.8.28
double desviacionStd(char filename[])
Descripcion: Esta funcion calcula la desviacion estandar de los datos con-
tenidos en el archivo de nombre filename.
1 #include "estadistica.h"
2 using namespace std;
3 int main(void){
4 char archivo[15]; // nombre del archivo...
5 printf("\nNombre del archivo: [Incluye extension] ");
6 scanf("%s", &archivo);
7 histograma(archivo, 20);
8 printf("\n\nMedia calculada: %f", media(archivo));
9 printf("\n\nDesviacion Estandar calculada: %f", desviacionStd(archivo));
10 printf("\n\n\n");
11 system("PAUSE");
12 return 0;
13 }
Nombre del archivo: [Incluye extension] test.txt
Intervalo 103.8 -- 118.5 | (4) [Min]
Intervalo 118.5 -- 133.2 | (39)
Intervalo 133.2 -- 147.9 | (126)
Intervalo 147.9 -- 162.6 || (458)
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.8 Implementacion 175
Intervalo 162.6 -- 177.3 |||| (1210)
Intervalo 177.3 -- 192.1 ||||||| (3011)
Intervalo 192.1 -- 206.8 |||||||||||||| (5881)
Intervalo 206.8 -- 221.5 |||||||||||||||||||||| (9987)
Intervalo 221.5 -- 236.2 ||||||||||||||||||||||||||||||| (13892)
Intervalo 236.2 -- 250.9 |||||||||||||||||||||||||||||||||||| (16299) [Max]
Intervalo 250.9 -- 265.6 |||||||||||||||||||||||||||||||||||| (16221)
Intervalo 265.6 -- 280.3 |||||||||||||||||||||||||||||| (13426)
Intervalo 280.3 -- 295.0 ||||||||||||||||||||| (9513)
Intervalo 295.0 -- 309.8 ||||||||||||| (5625)
Intervalo 309.8 -- 324.5 ||||||| (2636)
Intervalo 324.5 -- 339.2 ||| (1117)
Intervalo 339.2 -- 353.9 || (404)
Intervalo 353.9 -- 368.6 | (110)
Intervalo 368.6 -- 383.3 | (29)
Intervalo 383.3 -- 398.0 | (10)
Media calculada: 250.080285
Desviacion Estandar calculada: 34.947873
Presione una tecla para continuar...
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
176 Codigos
2.8.3 Simulaci on del recurso eolico
Este es el proyecto que eleg para la materia Simulacion de Sistemas en mis
cursos.
Puedes ver las notas de este curso en mi pagina de Internet
4
.
2.8.3.1 Energa extraida del viento
Un generador eolico utiliza la energa cinetica del viento para generar electrici-
dad.
Lo que pasa en realidad es que la energa del viento es transferida a un rotor
que tiene dos o mas aspas acopladas mecanicamente al generador electrico.
La enega cinetica que contienen m kilogramos de viento que se mueve a veloci-
dad v [m/s] es:
E
k
=
1
2
mv
2
Sin embargo, generalmente no conocemos la masa de aire que atravesaran las
aspas del generador eolico, as que es una mejor idea expresarlo con terminos
de la densidad y la velocidad del viento.
Por denicion, la densidad del viento es igual al cociente de su masa al volu-
men. De donde, m = V .
Podemos ver el volumen de aire que atraviesan las aspas del generador eolico
como el cilindro de altura v t y area de base igual al area A [m
2
] que barren las
aspas del generador. Entonces, por unidad de tiempo, el volumen de aire que
atraviesan las aspas del generador eolico es:
V = A v Flujo volumetrico (m
3
/s)
As que la energa cinetica del viento con velocidad v puede expresarse como:
P =
1
2
Av
3
potencia (W)
El recurso eolico de dos sitios distintos se compara en base a la potencia eolica
especca, es decir, por cada metro cuadrado de area que barren sus aspas.
Sabemos que la potencia eolica especca vara con el cubo de la velocidad del
viento.
4
Puede accesar a mi p agina de Internet en: http://yalma.me.uanl.mx/ efrain/
Para encontrar las notas vaya a Descargas, despues a Notas de mis Cursos, y nalmente a Mis
Notas
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.8 Implementacion 177
Considerando que
3

2 1.2599, podemos darnos cuenta que cuando la velocidad


del viento aumenta en un 25.99% la potencia generada crece al doble. Por otra
parte, si la velocidad del viento disminuye el mismo porcentaje, la potencia
generada disminuye a la mitad.
Tambien,
3

3 1.4422 nos indica que si la velocidad del viento crece un 44.22%,


la potencia electrica generada aumentara al triple, mientras que si la velocidad
del viento disminuye en esa misma cantidad, la potencia generada disminuira a
la tercera parte.
He aqu la importancia de caracterizar la distribucion de la velocidad del viento
para poder determinar correctamente la potencia generada en un sitio especco.
La energa extraida del viento es igual a la diferencia de la energa cinetica del
viento que atraviesa el generador antes y despues de pasar a traves de el:
P
0
=
1
2
m (v
2
v
2
0
)
donde P
0
es la potencia [W] absorvida por el generador, m es el ujo masico
[kg/s], v es la velocidad del viento [m/s] al entrar al generador y v
0
es la velocidad
del viento [m/s] despues de atravesar el generador.
La velocidad del viento es discontinua de v a v
0
en el plano de las aspas del gen-
erador. El ujo masico del viento a traves de las aspas se calcula multiplicando
la densidad por la velocidad promedio:
m = A
_
v +v
0
2
_
La potencia mecanica que mueve al rotor, que mueve nalmente al generador
electrico es:
P
0
=
1
2
_
A
_
v +v
0
2
__
(v
2
v
2
0
)
Esta expresion puede reescribirse como:
P
0
=
1
2
A v
3
_
1 +
v
0
v
_
_
1
_
v
0
v
_
2
_
2
Podemos denir:
C
p
=
_
1 +
v
0
v
_
_
1
_
v
0
v
_
2
_
2
que representa la fraccion del viento que aprovechan las aspas del generador
eolico.
Para velocidades de entrada del viento a las aspas del generador eolico, los
valores de C
p
dependen de la proporcion v
0
/v, alcanzando un maximo cuando
este cociente es igual a 1/3. Entonces, C
p
= 16/27 0.5926.
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
178 Codigos
La maxima potencia transmitida a las aspas ocurrira cuando v = 3 v
0
, o bien,
cuando C
p
= 0.5926. Entonces,
P
0
=
1
2
A v
3
(0.59)
En dise nos practicos de aspas, el valor maximo alcanzado es de aproximada-
mente 0.5 para turbinas de alta velocidad que trabajan con dos aspas, y entre
0.2 y 0.4 para turbinas de baja velocidad con mas aspas.
Considerando C
p
= 0.5 obtenemos una expresion mas simple:
P
0
=
1
4
A v
3
2.8.4 Distribuci on del viento
Dato que el viento se origina con las diferencias de densidad en el aire debido
a los cambios de temperatura que el sol ocasiona en el aire atmosferico, con
la colaboracion del movimiento rotativo de la tierra, los patrones de viento
generalmente se repiten con periodicidad de un a no.
Dado que la potencia generada con un generador eolico es proporcional al cubo
de la velocidad del viento, su distribucion se convierte en la medicion mas im-
portante para determinar la cantidad de energa que un sitio considerado.
El comportamiento de la velocidad del viento nunca es estable. Depende de
muchos factores, entre el clima, la topografa del lugar y la altura en la que se
mide a partir del suelo.
La velocidad del viento cambia continuamente, por lo que la velocidad promedio
debe basarse en mediciones de al menos una decada. De esta manera tendremos
mayor conanza en el valor asignado al sitio. Sin embargo, medir la velocidad
del viento por 10 a nos requiere de una inversion grande ademas de que un
proyecto generalmente no puede esperar tanto. En los casos en que se tienen
poca informacion, se mide la velocidad del viento y esta se compara con la
velocidad medida en otro sitio cercano y a partir de estas consideraciones se
realiza una estimacion del promedio anual del sitio considerado.
Las variaciones de la velocidad del viento se pueden describir por una funcion
de distribucion de probabilidad.
2.8.4.1 Distribuci on Weibull
La distribucion de la velocidad del viento en una localidad puede descibirse
utilizando al distribucion Weibull con el parametro k de forma y el parametro
c de escala.
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.8 Implementacion 179
La probabilidad de que la velocidad de viento sea de v m/s durante alg un
intervalo de tiempo dado es:
h(v) =
_
k
c
_
_
v
c
_
k1
e
(v/c)
k
para 0 < v <
En la graca de distribucion de probabilidad se graca h vs. v para distintos
intervalos de tiempo, donde:
h =
Fraccion de tiempo en que la velocidad del viento esta entre v y v + v
v
Por denicion de la funcion de probabilidad, la probabilidad de que la velocidad
del viento este entre cero e innito en ese periodo de tiempo es igual a uno:

_
0
hdv = 1
Si elegimos el periodo de tiempo igual a un a no, y expresamos la integral en
terminos del n umero de horas en un a no, entonces tenemos:
h =
N umero de horas que la velocidad del viento esta entre v y v + v
v
Las unidades de h son horas por a no por metros por segundo, y la integral se
convierte en 8 760, el n umero total de horas en el a no, en lugar de la unidad.
Para la distribucion Weibull con valor de k = 1 tenemos la distribucion expo-
nencial. En el caso k = 2 la distribucion se conoce como distribucion Rayleigh.
Este tipo de distribucion es el que presenta la velocidad de viento en muchos
sitios.
2.8.4.2 Distribucion Rayleigh
Distribucion Rayleigh:
f(x) =
_
2 xe
x
2
para x > 0
0 para x 0
donde: > 0
(u) =
2 u
c
2
exp
_

_
u
c
_
2
_
Para esta distribucion:
=
1
2
_

2
=
1

_
1

4
_
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
180 Codigos
2.8.4.3 Distribucion de energa
Si denimos la funcion de densidad de energa como:
e =
Contribucion en kWh al a no por las velocidades entre v y v + v
v
podremos gracar esta distribucion y la distribucion de probabilidad de la ve-
locidad y conocer a partir de que velocidad el n umero de horas que el viento
presenta esa velocidad, decrece mas rapido que v
3
. Este valor nos indicara un
decremento neto en la contribucion energetica anual global.
2.8.4.4 Anemometros digitales
La velocidad promedio de un sitio en un periodo de tiempo se calcula sumando
muchas lecturas en ese periodo de tiempo entre el n umero de lecturas. La
mayora de los anemometros se instalaban con el proposito de medir la velocidad
del viento y no con propositos de la medicion del recurso energetico. As que el
promedio calculado como se indico se realizaba de manera semejante para una
hora, un da y para un a no:
v =
1
n
n

i=1
v
i
Pero para estimar el recurso eolico disponible en un lugar necesitamos calcular:
v
rmc
=
3

_
1
n
n

i=1
v
3
i
La expresion anterior no toma en cuenta la densidad del aire, que tambien afecta
la cantidad de energa producida por el viento. Para calcular el recurso eolico
de un sitio se recomienda utilizar la siguiente formula:
P
rmc
=
1
2 n
n

i=1

i
v
3
i
donde n es el n umero de mediciones realizadas,
i
es la densidad del aire [kg/m
3
]
en el momento de realizar la i-esima medicion y v
i
es la velocidad del viento
[m/s] en la i-esima medicion, y P
rmc
representa la densidad de energa promedio.
2.8.4.5 Prediccion del recurso eolico
La energa que podemos aprovechar del viento depende de su velocidad, la cual
es una variable aleatoria. Para el operador de la granja eolica esto representa
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.8 Implementacion 181
una dicultad para designar el despacho de energa a la red, ademas de que no
se conoce la cantidad de energa disponible con anticipacion.
Sin embargo, si la velocidad del viento puede pronosticarse con varias horas
de anticipacion, podemos despachar la energa de una manera comoda. Alexi-
adis, et al
5
, han propuesto una nueva tecnica para pronosticar la velocidad del
viento y la cantidad de energa producida con muchas horas de anticipacion. La
tecnica esta basada en correlacion cruzada en sitios vecinos y redes articiales
neuronales. La tecnica propuesta puede mejorar signicativamente la precision
de las predicciones comparado con el modelo com unmente usado. El modelo
propuesto se calibra en diferentes sitios en un periodo de un a no.
2.8.5 Un caso especco
La Venta, Oaxaca. Mexico
6
.
El viento presenta Distribucion Weibull.
Velocidad promedio del viento: 9.3 m/s.
k = 1.77, c = 11.86 m/s a una altura de 32 metros.
k = 1.73, c = 10.44 m/s a una altura de 15 metros.
2.8.6 Implementaci on
Enseguida se muestra el codigo de la implementacion elaborada en el lenguaje
C
++
.
/
*
Nombre del archivo: windFinal.cpp
Este programa simula la velocidad de viento de
una localidad de acuerdo a la distribucion que
se especifique.
Calcula ademas, la densidad de recurso eolico
local (Watts/metro cuadrado) y en el caso de
la distribucion Weibull, calcula la velocidad
de viento promedio como media ponderada de la
velocidad media de cada intervalo por la
probabilidad de que el viento presente esa
velocidad.
----------------------------------
----------------------------------
Autor: Efran Soto Apolinar
Email: efra.soto.a@gmail.com
efrain@yalma.fime.uanl.mx
Fecha de ultima Modificacion: 01 de mayo de 2008
5
Alexiadis, M. C., Dokopoulos, P. S., and Sahsamanogdou, H. S. 1998. Wind Speed and
Power Forecasting Based on Spatial Correlation Models, IEEE Paper No. PE-437-EC-0-04-
1998.
6
Fuente: Evaluacion del recurso eolico de La Venta, Juchitan, Oaxaca. M. A. Borja, O. A.
Jaramillo, M. F. Morales. Instituto de Investigaciones Electricas. Temixco, Morelos, Mexico.
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
182 Codigos
----------------------------------
----------------------------------
*
/
#include <cstdio> // Librera basica...
#include <cstdlib> // Otra Librera...
#include <iostream> // Funciones basicas: input/output
#include <math.h> // funciones matematicas
#include <conio.h> // para usar: getche, getch
#include <fstream> // para grabar los datos generados...
//
double uniforme (void);
double weibull(double c, double k);
//
void duniforme(void);
void drayleigh(void);
void dweibull(void);
float windPower(double windSpeed);
using namespace std;
int main(void){
char respuesta, semilla;
int i = 0;
int continuar;
char distribucion;
for (;;){ // for infinito...
//continuar = 0;
cout << "Este programa simula el Recurso Eolico";
cout << "\nde un sitio dados los parametros de su distribucion.";
for (;;){ // hasta que presione S o N
cout << "\n\nDesea iniciar la semilla del aleatorio? [S/N] ";
cin >> semilla;
if (semilla == S || semilla == s){
srand(time(0));
cout << "Se reinicia la semilla...";
break; // salir del for infinito
}
if (semilla == N || semilla == n){
cout << "No se reinicia la semilla...";
break; // salir del for infinito
}
cout << "\n\nError en argumento...";
} // end for infinito para la semilla
cout << "\n\nSeleccione la distribucion estadistica ";
cout << "\nque presenta el viento de la localidad: ";
cout << "\n[R] Rayleigh.";
cout << "\n[W] Weibull.";
cout << "\n[C] Cancelar...";
cout << "\nIngrese una opcion: ";
cin >> distribucion;
switch (distribucion){
case R:
drayleigh();
break;
case r:
drayleigh();
break;
case W:
dweibull();
break;
case w:
dweibull();
break;
case C:
break;
case c:
break;
default:
cout << "\n\nError en argumento...";
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.8 Implementacion 183
cout << "\nPor favor, intente de nuevo...";
continuar = 1;
} // end switch
if (continuar == 0){
// se debe salir...
break;
}
// pregunto si desea salir...
cout << "\n\nPresione < S > para salir... < C > para continuar...";
respuesta = getche();
if ((respuesta == S)||(respuesta == s)){
break; // Salir del ciclo for inicial...
}
cout << "\n\n\n";
respuesta = getche();
} // end for infinito...
return 0;
}
/
**************************************
Declaro la funcion UNIFORME...
***************************************
/
double uniforme(void){
// Esta funcion genera un numero pseudoaleatorio
// en el intervalo (0,1) con distribucion uniforme.
return (1.0
*
rand()/(1.0
*
RAND_MAX));
}
/
**************************************
Declaro la funcion WEIBULL...
***************************************
/
double weibull(double c, double k){
// Esta funcion genera numeros pseudoaleatorios
// con distribucion Weibull
double x;
x = c
*
pow(-log(1 - uniforme()), 1/k);
return x;
}
/
**************************************
Declaro la funcion RAYLEIGH...
***************************************
/
double rayleigh(double media){
// Esta funcion genera numeros pseudoaleatorios
// con distribucion rayleigh
// Fuente:
// http://www.brighton-webs.co.uk/distributions/rayleigh.asp
double factor, r;
factor = media / 1.253314;
r = sqrt(-2
*
factor
*
factor
*
log(uniforme()));
return r;
}
/
**************************************
Declaro la funcion DWEIBULL..
***************************************
/
void dweibull(void){
/
*
Para simular viento con distribucion Weibull...
*
/
int I[24]; // los intervalos...
int max =0, min = 1000000;
//int total; // cuantos vamos a generar...
int i = 0, j; // contadores
double x; // el numero generado...
double escala; // para hacer la grafica...
int factor; // para hacer la grafica...
//double k = 0.0, c = 1.0; // parametros
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
184 Codigos
double c, k; // parametros alpha y beta
double t; // tiempo
float velocidadProm = 0; // Velocidad Promedio
float sv3 = 0;// suma de cubo de velocidad
float densidadEnergetica;
float energia = 0; // Energia anual
//
cout << "\nValor del parametro c: ";
cin >> c; // alpha
cout << "Valor del parametro k: ";
cin >> k; // beta
t = 0; // reinicio el tiempo del experimento...
FILE
*
f = fopen("speedwei.txt", "w+");
// limpio la memoria del array...
for (i = 0 ; i <= 24 ; i++){
I[i] = 0;
}
for (t = 0; t < 8760; t++){
x = weibull(c, k);// Genero un pseudoaleatorio
fprintf(f, "%f\n", x); // grabo en archivo...
sv3 += pow(x, 3.0) / 4.0;
energia += windPower(x);
for (i = 0 ; i <= 24 ; i++){
if ((x > 0.1
*
i
*
c) && (x <= 0.1
*
(i + 1)
*
c)){
I[i]++;
break;
}
}
}
fclose(f);
// Calculo la velocidad promedio...
for (i = 0 ; i <= 24 ; i++){
velocidadProm += 1.0
*
I[i]
*
c / 8760;
}
velocidadProm = velocidadProm
*
465 / 593; // factor de escala...
// Encuentro el intervalo con mayor numero de ocurrencias
for (i = 0; i <= 24 ; i++){
if (I[i] > max){
max = I[i];
}
if (I[i] < min){
min = I[i];
}
}
for (i = 0 ; i <= 24 ; i++){
printf("\n%.2f m/s -- %.2f m/s ", (0.1
*
i
*
velocidadProm),
(0.1
*
(i+1)
*
velocidadProm));
escala = 35.0
*
I[i] / max;
factor = (int)(escala + 0.5); // redondeo
// Imprime la barra del intervalo (i-1)
for (j = 0 ; j <= factor ; j++){
cout << "|";
} // termina de imprimir la barra...
if (I[i] == max){
cout << " (" << I[i] << ") [Maximo]";
continue;
}
if (I[i] == min){
cout << " (" << I[i] << ") [Minimo]";
continue;
}
cout << " (" << I[i] << ")";
}
printf("\n\nVelocidad Promedio del viento: %.2f m/s.", velocidadProm);
// calculo recurso energetico...
densidadEnergetica = sv3 / (2
*
8760);
printf("\nDensidad energetica promedio: %.3f W/m2", densidadEnergetica);
printf("\nEnergia anual estimada: %.2f W-hr/m2.", energia);
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.8 Implementacion 185
return;
} // Fin de la funcion DWEIBULL
/
**************************************
Declaro la funcion DRAYLEIGH..
***************************************
/
void drayleigh(void){
int I[24]; // los intervalos...
int max =0, min = 1000000;
int total; // cuantos vamos a generar...
int i, j; // contadores
int imax, imin;
double t;
double x; // el numero generado...
float sv3 = 0.0;
float densidadEnergetica;
float energia = 0; // Energia anual
float media; // parametro de la distribucion
double escala; // para hacer la grafica...
int factor; // para hacer la grafica...
FILE
*
f = fopen("speedray.txt", "w+");
for(;;){// hasta que indique el valor de lambda
cout << "\nIntroduzca la velocidad media del viento: ";
scanf("%f", &media);
if (media <= 0.0){
cout << "\n\nEl valor debe ser positivo...";
cout << "\nPor favor intente de nuevo...\n";
continue;
}
break;
}
// limpio la memoria del array...
for (i = 0 ; i <= 24 ; i++){
I[i] = 0;
}
for (t = 0; t < 8760; t++){
x = rayleigh(media);// Genero un pseudoaleatorio
x = x
*
593 / 465;
fprintf(f, "%f\n", x); // grabo en archivo...
sv3 += pow(x, 3.0) / 4;
energia += windPower(x);
for(i = 0 ; i <= 24 ; i++){
if ((x > 0.1
*
i
*
media) && (x <= 0.2
*
(i + 1)
*
media)){
I[i]++;
break;
}
}
}
fclose(f);
// Encuentro el intervalo con mayor numero de ocurrencias
for (i = 0; i <= 24 ; i++){
if (I[i] > max){
max = I[i];
imax = i;
}
if (I[i] < min){
min = I[i];
imin = i;
}
}
// Ahora imprimo los resultados...
for (i = 0 ; i <= 24 ; i++){
printf("\n%.2f m/s -- %.2f m/s ", (0.1
*
i
*
media), (0.1
*
(i+1)
*
media));
escala = 35.0
*
I[i] / max;
factor = (int)(escala + 0.5); // redondeo
// Imprime la barra del intervalo (i-1)
for (j = 0 ; j <= factor ; j++){
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
186 Codigos
cout << "|";
} // termina de imprimir la barra...
if (I[i] == max){
cout << " (" << I[i] << ") [Maximo]";
continue;
}
if (I[i] == min){
cout << " (" << I[i] << ") [Minimo]";
continue;
}
cout << " (" << I[i] << ")";
}
// calculo recurso energetico...
densidadEnergetica = sv3 / (2
*
8760);
printf("\n\nDensidad energetica promedio: %.3f W/m2", densidadEnergetica);
printf("\nEnergia anual estimada: %.2f W-hr/m2.", energia);
return;
} // Fin de la funcion DRAYLEIGH
/
**************************************
Declaro la funcion WINDPOWER..
***************************************
/
float windPower(double windSpeed){
/
*
Esta funcion calcula la energa producida por el generador
considerando la el teorema de Weltz, Densidad del aire = 1,000 kg/m3,
Area de rotor = 1 m2, v ---> generada por el programa,
windspeed (con distribucion dada)
*
/
double rho = 1.00; // densidad del aire
double potencia; // Potencia generada
double eficiencia = 0.15; // eficiencia del generador
double weltz = 0.59; // factor de terorema de Weltz
potencia = eficiencia
*
rho
*
weltz
*
pow(windSpeed,3);
return potencia;
}s
2.8.7 Resultados de la simulaci on
Se consideraron los siguientes datos:
Velocidad promedio del viento: 9.3 m/s.
k = 1.77, c = 11.86 m/s.
que corresponden a La Venta, Oaxaca. Los parametros de la distribucion
Weibull estan calculados a partir de mediciones de velocidad de viento real-
izadas a 53 metros de altura (respecto del suelo).
Este programa simula el Recurso Eolico
de un sitio dados los parametros de su distribucion.
Desea iniciar la semilla del aleatorio? [S/N] s
Se reinicia la semilla...
Seleccione la distribucion estadistica
que presenta el viento de la localidad:
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.8 Implementacion 187
[R] Rayleigh.
[W] Weibull.
[C] Cancelar...
Ingrese una opcion: w
Valor del parametro c: 11.86
Valor del parametro k: 1.77
0.00 m/s -- 0.93 m/s ||||||||| (168)
0.93 m/s -- 1.85 m/s ||||||||||||||||||| (366)
1.85 m/s -- 2.78 m/s ||||||||||||||||||||||| (443)
2.78 m/s -- 3.70 m/s |||||||||||||||||||||||||||||||| (609)
3.70 m/s -- 4.63 m/s |||||||||||||||||||||||||||||||||||| (693) [Maximo]
4.63 m/s -- 5.55 m/s ||||||||||||||||||||||||||||||||||| (674)
5.55 m/s -- 6.48 m/s |||||||||||||||||||||||||||||||||||| (684)
6.48 m/s -- 7.40 m/s |||||||||||||||||||||||||||||||||| (652)
7.40 m/s -- 8.33 m/s ||||||||||||||||||||||||||||||||||| (681)
8.33 m/s -- 9.25 m/s ||||||||||||||||||||||||||||||| (600)
9.25 m/s -- 10.18 m/s |||||||||||||||||||||||||||| (538)
10.18 m/s -- 11.10 m/s |||||||||||||||||||||||| (453)
11.10 m/s -- 12.03 m/s |||||||||||||||||||||| (420)
12.03 m/s -- 12.95 m/s ||||||||||||||||||| (363)
12.95 m/s -- 13.88 m/s ||||||||||||||| (287)
13.88 m/s -- 14.80 m/s |||||||||||||| (262)
14.80 m/s -- 15.73 m/s |||||||||| (180)
15.73 m/s -- 16.65 m/s |||||||||| (187)
16.65 m/s -- 17.58 m/s |||||||| (144)
17.58 m/s -- 18.50 m/s ||||| (85)
18.50 m/s -- 19.43 m/s ||||| (87)
19.43 m/s -- 20.35 m/s ||| (39)
20.35 m/s -- 21.28 m/s ||| (46)
21.28 m/s -- 22.21 m/s ||| (32)
22.21 m/s -- 23.13 m/s || (22) [Minimo]
Velocidad Promedio del viento: 9.25 m/s.
Densidad energetica promedio: 313.121 W/m2
Energia anual estimada: 1942003.75 W-hr/m2.
Presione < S > para salir... < C > para continuar...c
Este programa simula el Recurso Eolico
de un sitio dados los parametros de su distribucion.
Desea iniciar la semilla del aleatorio? [S/N] s
Se reinicia la semilla...
Seleccione la distribucion estadistica
que presenta el viento de la localidad:
[R] Rayleigh.
[W] Weibull.
[C] Cancelar...
Ingrese una opcion: r
Introduzca la velocidad media del viento: 9.3
0.00 m/s -- 0.93 m/s ||||||| (182)
0.93 m/s -- 1.86 m/s ||||||||||||||||| (496)
1.86 m/s -- 2.79 m/s ||||||||||||||||||||||||| (727)
2.79 m/s -- 3.72 m/s |||||||||||||||||||||||||||||| (895)
3.72 m/s -- 4.65 m/s |||||||||||||||||||||||||||||||||| (991)
4.65 m/s -- 5.58 m/s |||||||||||||||||||||||||||||||||||| (1064) [Maximo]
5.58 m/s -- 6.51 m/s |||||||||||||||||||||||||||||||| (950)
6.51 m/s -- 7.44 m/s |||||||||||||||||||||||||||||||| (937)
7.44 m/s -- 8.37 m/s ||||||||||||||||||||||||| (733)
8.37 m/s -- 9.30 m/s ||||||||||||||||||| (557)
9.30 m/s -- 10.23 m/s |||||||||||||| (399)
10.23 m/s -- 11.16 m/s |||||||||| (284)
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
188 Codigos
11.16 m/s -- 12.09 m/s |||||||| (222)
12.09 m/s -- 13.02 m/s |||||| (145)
13.02 m/s -- 13.95 m/s ||| (75)
13.95 m/s -- 14.88 m/s || (36)
14.88 m/s -- 15.81 m/s || (35)
15.81 m/s -- 16.74 m/s || (17)
16.74 m/s -- 17.67 m/s | (6)
17.67 m/s -- 18.60 m/s | (6)
18.60 m/s -- 19.53 m/s | (1)
19.53 m/s -- 20.46 m/s | (2)
20.46 m/s -- 21.39 m/s | (0) [Minimo]
21.39 m/s -- 22.32 m/s | (0) [Minimo]
22.32 m/s -- 23.25 m/s | (0) [Minimo]
Densidad energetica promedio: 395.494 W/m2
Energia anual estimada: 2452892.00 W-hr/m2.
Presione < S > para salir... < C > para continuar...
El n umero entre parentesis a la derecha de cada intervalo indica la cantidad
de horas que se tuvieron velocidades de viento en ese intervalo en un a no, con-
siderando que la distribucion de probabilidad de esa variable aleatoria sigue la
distribucion indicada.
Es de notar que la densidad energetica vara al considerar distintas distribu-
ciones, a pesar de utilizar los datos de un sitio obtenidos a partir del mismo
estudio y realizar el c alculo de la densidad de recurso eolico local con la misma
metodologa.
Para la distribucion Weibull se obtuvo una densidad energetica de 315.558
W/m
2
, mientras que para el caso de la distribuion Rayleigh se obtuvo un valor
correspondiente de 403.202 W/m
2
. El primer caso siendo un 78.26% de la se-
gunda estimacion.
Tambien es importante indicar que no se calcula la densidad de recurso eolico
a partir de la velocidad promedio estimada, sino con las velocidades de viento,
conforme se van generando estos valores con la distribucion correspondiente.
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.9 Esqueletos 189
2.9 Esqueletos
Aqu encontraras partes de programas que pueden servir.
Solamente necesitas copiar y pegar.
Declaracion de variables y constantes.
double aumento=0.076;
int meses;
char respuesta = c;
const double pi = 3.141592654;
char nombre[15];
// el [15] indica la longitud de la cadena <<nombre>>
Ingresar una variable.
cout << "\nIngresa una variable: ";
cin >> variable;
Ciclo innito.
for (;;)
{
// Aqu va el procedimiento...
}
Preguntar si desea continuar...
// No olvides declarar la variable
// char respuesta;
// al inicio del programa...
// Cuando termine va a preguntar:
cout << "Presione < S > para salir...";
cin >> respuesta;
if ((respuesta == S)||(respuesta == s))
{
break; // Salir del ciclo...
}
cout <<"\n\n\n";
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
190 Codigos
Los dos anteriores combinados.
// No olvides declarar la variable
// char respuesta;
// al inicio del programa...
for (;;)
{
// Aqu va el procedimiento...
// Cuando termine va a preguntar:
cout << "Presione < S > para salir...";
cin >> respuesta;
if ((respuesta == S)||(respuesta == s))
{
break; // Salir del ciclo...
}
cout << "\n\n\n";
}
Manejo de archivos. I/O.
/
*
ifstream -> Significa Input - File - Stream
ofstream -> Significa Ouput - File - Stream
Para trabajar con archivos se requiere incluir:
#include <fstream.h>
en el preambulo del programa...
*
/
// Paso 1. Abrir el archivo de encabezado
#include <fstream.h>
// Otras cosas que se requieren...
int x,y;
// Declaro las variables para el archivo
// desde el cual voy a leer la informacion...
// Paso 2. Declarar el Stream
ifstream in_file; // Desde aqu voy a leer...
ofstream out_file; // Aqu voy agrabar informacion...
// ifstream y ofstream estan definidos en el
// archivo fstream.h
// Paso 3. Abrir el archivo para leer informacion...
in_stream.open("misdatos.dat");
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.9 Esqueletos 191
// Paso 4. Leo informacion desde el archivo...
in_stream >> x >> y;
// Paso 5. Abrir el archivo para grabar infomacion...
out_stream.open("misdatos.dat");
// Paso 6. Escribo informacion en el archivo...
out_stream << x << y;
// Paso 7. Cierro los archivos...
in_stream.close();
out_stream.close();
/
*
En C++ no se requiere cerrar los archivos, pero NO todos
los compiladores tienen esta caractersitica...
Puede ser que en ANSI-C o en C esto cambie...
*
/
Pregunto si se logro abrir el archivo...
in_stream.open("misdatos.dat");
if (in_stream.fail())
{
cout << " No se logro abrir el archivo..."
exit(1); // Finaliza el programa
}
out_stream.open("misdatos.dat");
if (out_stream.fail())
{
cout << " No se logro abrir el archivo..."
exit(1); // Finaliza el programa
}
/
*
La funcion exit esta definida en el archivo:
stdlib.h
de manera que debemos incluir en el preambulo
del programa la instruccion:
#include <stdlib.h>
Utilizamos:
exit(1);
En caso de que el programa deba abortar debido
a un error en el programa o
exit(0);
En cualquier otro caso.
*
/
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
192 Codigos
N umeros de dgitos a grabar...
/
*
Formato para los datos a grabar en los archivos...
En este caso se supone ue se graban datos tipo double.
*
/
out_stream.setf(ios::fixed);
out_stream.setf(ios::showpoint);
out_stream.precision(2);
Uso de manipuladores de formato de datos...
/
*
Para utilizar los manipuladores en este codigo
se requiere incluir:
#include <iomanip.h>
*
/
cout.setf(ios::fixed);
cout.setf(ios::showpoint);
cout << "(" << setprecision(2) << x << "," << y << ")" << endl;
/
*
Esto imprime en pantalla:
(x_val,y_val)
Donde
x_val -> es el valor de la variable x,
y_val -> es el valor de la variable y.
*
/
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
2.10 Lecciones aprendidas 193
2.10 Lecciones aprendidas
1. No utilices dos apostrofos seguidos cuando apliques la instruccion cout.
Debes usar comillas dobles (") en su lugar.
2. En la instruccion cout debes utilizar << sin dejar espacio entre ellos.
3. Podemos denir las variables justo antes de usarlas, igual que al principio.
4. Los identicadores (nombres de las variables y constantes) deben iniciar con
una letra o con un guion bajo.
5. Se requiere un punto y coma (;) por cada cout utilizado. No utilices varios
; a un si se extiende varios renglones.
6. La instruccion \n para indicar un salto de lnea siempre debe estar encerrado
dentro de las comillas. Posiblemente junto a una cadena de caracteres.
7. La instruccion endl; nunca debe estar encerrado dentro de las comillas.
8. Los n umeros no deben contener comas. Usa punto (decimal) en su lugar.
9. Las constantes del tipo int no deben contener punto decimal.
10. Las constantes del tipo long equivale a long int.
11. Las constantes del tipo char deben encerrarse entre apostrofos ().
12. Las constantes del tipo string deben encerrarse entre comillas (").
c es una constante del tipo char.
c es una constante del tipo string.
13. No podemos almacenar el valor de un tipo de dato en un otro tipo.
14. Si una variable del tipo bool tiene un valor distinto de cero, entonces tomara
el valor true. Si su valor es cero, entonces, tomara el valor false.
15. Si sumamos uno o dos datos del tipo double, el resultado sera del tipo
double.
16. El operador % (modulo) debe ser usado con datos del tipo entero.
17. C
++
siempre respeta la prioridad de las operaciones de acuerdo al algebra
basica.
18. El operador para comparar la igualdad entre dos valores es: ==.
19. El operador para asignar un valor a un identicador es: =.
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
194 Codigos
Si cometemos el error de escribir a = 5 en lugar de a == 5, C
++
siem-
pre ejecuta la parte then{}, es decir, supone que la expresion booleana
es verdadera.
lo anterior ocurrira siempre que se asigne un valor distinto de cero.
En caso de que se asigne cero al identicador, se ejecutara la parte
else{}.
20. Las expresiones booleanas deben ser encerradas entre parentesis, para evitar
errores en el uso del if...then.
21. Es una buena idea empezar el programa imprimiendo en pantalla una peque na
descripcion de lo que realiza el mismo. As el usuario conocera que datos tiene
sentido dar al programa y ademas que resultados esperar.
22. Debemos denir la funcion antes de llamarla... Debe hacerse despues de las
instrucciones #include y antes del int main().
23. inline member functions no deben incluir ciclos (for, while...) porque
al compilar las va a enviar como out of line functions. lo mas que se
debe hacer con inline member functions es asignar valores o leerlos.
7
7
Disculpa esta nota... Se que solamente la entiendo yo.
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
3
End matter
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
196 End matter
3.1 Fuentes bibliogr

aficas
Actualmente estoy aprendiendo a programar en el lenguaje C
++
por medio de
varios libros que he encontrado muy buenos, sobre todo para los principiantes,
como yo.
Te recomiendo que los adquieras.
Los libros enlistados son los que mas he consultado, aunque leo otros mas para
conocer varias explicaciones de una misma herramienta y poder adquirir una
vision mas clara del arte llamado C
++
.
C
++
for dummies Stephen Randy Davis. Wiley Publishing Co. 2004. New
Jersey, USA. (5th Edition) m
Problem solving with C
++
Walter Savitch. Ed. Addison Wesley. 1999.
(2nd Edition) m
C
++
for mathematicians Edward Scheinerman. Ed. Chapman & Hall. 2006.
C
++
Demystied: A Self-Teaching Guide Je Kent McGraw-Hill/Osborne.
2004
C
++
for Business Programming John C. Molluzzo Prentice Hall. 2005.
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
Indice alfabetico
Algoritmo, 8
Asignacion, 13
Codigo, 8
Caracteres especiales, 12
Ciclo, 16
do... while, 16
for, 16
while, 16
Comparaciones, 15
Compilador, 8
Compilar, 9
Constantes, 12
Correr, 9
Datos
Tipos de, 11
Ejemplo
Cadenas de caracteres, 41
Ciclo for, 49, 50, 5558
Ciclo while, 58
Condicional If, 46, 5153, 58
Declarar constantes, 41
Formulas matematicas, 42, 43, 45
Funciones matematicas, 54, 55
Error
de Sintaxis, 9
Logico, 10
Mensajes de, 9
Funciones
Predenidas, 22
Trigonometricas, 22
Identicador, 10
If then else, 15
Operaciones
Booleanas, 21
Unitarias, 15
Operadores
de comparacion, 15
Palabras reservadas, 11
Programa, 8
Sintaxis, 9
Formulas matematicas, 14
Variable
Denicion, 10
Variables
Declaracion, 12
Codigos
en C++
Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Efran Soto A.
198 INDICE ALFAB

ETICO
3.2 T

erminos de uso
Utiliza los codigos como una gua para aprender a programar.
No hay ninguna garanta de que los codigos esten libres de cualquier tipo de
error.
Efran Soto Apolinar no es responsable por cualesquiera da nos ocasionados por
el uso de este material.
Tienes derecho de leer el material y de divulgarlo a otras personas, con la unica
condicion de que no modiques el documento en ninguna forma.
Si deseas utilizar alguna parte del material, puedes hacerlo, con la unica condicion
de que menciones la fuente, i.e., este material y a Efran Soto Apolinar como el
autor.
Espero que este material pueda ser de ayuda a muchas personas que desean
aprender a programar en C++.
Con estos programas estoy aprendiendo junto contigo.
En realidad el material que estas leyendo lo estoy generando como un resumen
de lo que voy aprendiendo. Voy a utilizarlo en lo futuro como una referencia.
Este material esta siendo actualizado continuamente.
Te agradecere que me enves un mensaje en caso de que encuentres errores en
los codigos, en las deniciones o en la ortografa y/o gramatica del mismo.
El material no ha tenido ninguna revision. Agradezco innitamente tu ayuda.
Efran Soto Apolinar.
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++
3.3 Cr

editos
Este documento se preparo con el software de tipografa cientca L
A
T
E
X2

.
Creditos
Autor: Efran Soto Apolinar.
Edicion: Efran Soto Apolinar.
Composicion tipograca: Efran Soto Apolinar.
Productor general: Efran Soto Apolinar.
Revision tecnica: Pendiente.
Compilador: DevC++ Ver. 4.9.9.2. (http://www.bloodshed.net/)
A no de edicion: 2007
A no de publicacion: Pendiente

Ultima revision: A u g u s t 1 9 , 2 0 0 87:59pm


Agradezco tus sugerencias, comentarios, correcciones, reclamos y todo lo que se
le parezca a la cuenta de correo electronico:
efra.soto.a@gmail.com
@
200 INDICE ALFAB

ETICO
3.4 Simbolog

a utilizada
i Cuando encuentres un parrafo con este smbolo en el margen del texto,
debes considerarlo como informacion importante que puede ayudarte a evitar
problemas futuros.
! Un parrafo con este smbolo indica que debes poner especial atencion y
metabolizarla bien. Es muy importante.

Este parrafo tiene informacion que te gua de manera que no te confundas


con conceptos parecidos y vayas a entender una cosa por otra.
@ Indica que busques mas informacion relativa al tema en Internet, o bien
enves un mensaje de correo electronico al autor de este material.
j Indica que el parrafo incluye un procedimiento que debes realizar bajo tu
propio riesgo.
Indica que el parrafo incluye un procedimiento que debes realizar bajo tu
propio riesgo.
Indica que nunca debes realizar ese procedimiento, a menos que desees que
la memoria de tu computadora se sature o el programa se cicle y nunca termine.
m Indica que eso todo el mundo lo sabe. T u tambien deberas saberlo.
o Indica que debes ponerte a practicar. Tienes que intentarlo por t mismo
y desarrollar algunas cosas. Nadie aprende en cabeza ajena.
Indica que este c odigo puedes copiarlo y usarlo libremente.
Cuando veas esta imagen, piensa en el compa que esta elaborando estas
notas.
Siempre que aparezca una de estas imagenes a lo largo del texto aparecera en
el margen. Por ejemplo, en este parrafo se incluye la imagen referente a los
parrafos que dan informacion. i
Espero que esto sea de ayuda.
Efran Soto A. Este material NO est a listo para su publicaci on.
Prohibida la reproducci on sin permiso previo del autor.
Codigos
en C++

También podría gustarte