Вы находитесь на странице: 1из 168

Pnocn/V/ci o

Ciiiiic/
Efran Soto Apolinar
Programaci on
Cientca
Estas son las tareas de
Efran Soto Apolinar

PISIS
Monterrey, N.L., M exico. 2008

Indice
1 Introducci on 3
1.1 Criterios de calicaci on . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2 Tareas en C 5
2.1 Tarea 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.2 Tarea 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.3 Tarea 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.4 Tarea 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.5 Tarea 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.6 Tarea 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.7 Tarea 8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.8 Tarea 9 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.9 Tarea 10 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
2.10 Tarea 11 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
2.11 Tarea 12 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
vi
3 Conceptos de C 35
3.1 Conceptos de C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
3.1.1 I/O File manipulation . . . . . . . . . . . . . . . . . . . . . . . . 36
4 Tareas en Java 39
4.1 Tarea 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
4.2 Tarea 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
4.3 Tarea 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
4.4 Tarea 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
4.5 Tarea 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
4.6 Tarea 8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
5 Conceptos de Java 53
5.1 Conceptos de Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
5.1.1 Funciones Matem aticas . . . . . . . . . . . . . . . . . . . . . . 54
6 Proyecto nal 55
6.1 Denici on . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
6.2 Implementaci on . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
6.3 Ejemplos de uso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
6.3.1 funiforme(total, archivo) . . . . . . . . . . . . . . . . . . . . . . . 88
6.3.2 funiforme(total, archivo, A, B) . . . . . . . . . . . . . . . . . . . 89
6.3.3 fnormal(total, archivo) . . . . . . . . . . . . . . . . . . . . . . . . 91
6.3.4 fnormal(total, archivo, media, SD) . . . . . . . . . . . . . . . . 92
6.3.5 fexponencial(total, lambda, archivo) . . . . . . . . . . . . . . . 93
6.3.6 fgeometrica(total, p, archivo) . . . . . . . . . . . . . . . . . . . . 94
6.3.7 fpoisson(total, alpha, archivo) . . . . . . . . . . . . . . . . . . . 94
6.3.8 fweibull(total, archivo, c, k) . . . . . . . . . . . . . . . . . . . . . 95
6.3.9 frayleigh(total, archivo, media) . . . . . . . . . . . . . . . . . . 96
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
6.3.10 histograma(archivo, intervalos) . . . . . . . . . . . . . . . . . . 97
6.3.11 PchiUniforme(archivo, No Int) . . . . . . . . . . . . . . . . . . . 103
6.3.12 PchiNormal(archivo, No Int) . . . . . . . . . . . . . . . . . . . . 105
6.3.13 PchiExponencial(archivo, Num Int, lambda) . . . . . . . . . . 106
6.3.14 PchiWeibull(Archivo, Num Int, C, K) . . . . . . . . . . . . . . . 108
6.3.15 PchiRayleigh(archivo, Num Int, media) . . . . . . . . . . . . . 110
6.3.16 RL(archivo) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
6.3.17 RC(archivo) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
6.4 Otras funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
6.4.1 uniforme() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
6.4.2 uniforme(a,b) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
6.4.3 weibull(c,k) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
6.4.4 rayleigh(media) . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
6.4.5 normal() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
6.4.6 normal(media, desviacionStd) . . . . . . . . . . . . . . . . . . . 119
6.4.7 exponencial(lambda) . . . . . . . . . . . . . . . . . . . . . . . . 120
6.4.8 geometrica(p) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
6.4.9 poisson(alpha) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
6.4.10 media(archivo), desviacionStd(archivo) . . . . . . . . . . . . . 123
7 Procesos Estoc asticos 125
7.1 Simulaci on de la distribuci on binomial . . . . . . . . . . . . . . . . . . 126
7.2 Din amica de poblaciones . . . . . . . . . . . . . . . . . . . . . . . . . . 129
7.3 Caminata aleatoria sobre un grafo . . . . . . . . . . . . . . . . . . . . 134
7.4 Matriz de transici on de un grafo . . . . . . . . . . . . . . . . . . . . . . 143
8 End matter 157
8.1 T erminos de uso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
8.2 Cr editos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
2
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
1
Introducci on
The longest trip begins with one step, but in the right direction.
Budha and Me
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
4 Introducci on
Cniinios ni c/iiiic/ci o
El curso consiste de tareas y un proyecto individual. No hay examen. El estu-
diante tiene que cuidar que la suma de sus puntos de las tareas y del proyecto
excedan 80, que es el lmite mnimo de aprobaci on.
Tareas 70%
Hay un conjunto de tareas de programaci on. El alumno mismo elige entre las
tareas las que mejor corresponden a su nivel actual seg un las recomendaciones
de la profesora. Los puntos m aximos por tarea dependen de la dicultad de la
tarea.
No se tolera ning un tipo de plagio, ni de otros estudiantes, ni libros, ni p aginas
web o sea, no est a permitido copiar nada de c odigo de ninguna parte. Al copiar
c odigo, el estudiante inmediatamente reprueba el curso.
Proyecto individual 30%
El estudiante mismo propone el tema de su proyecto individual a la profesora en
cuanto quiere empezar su elaboraci on. El puntaje mnimo aceptable del proyecto
es 10 puntos (menores de diez se considera reprobados) y el m aximo es 30 puntos.
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
2
Tareas en C
There is no programming language, no matter how structured, that
will prevent programmers from writing bad programs.
L. Flon
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
6 Tareas en C
. 1/ni/
La serie de Fibonacci se dene por la ecuaci on recursiva siguiente:
|(:) = |(: 1) +|(: 2)
Los primeros elementos son |(0) = 0 y |(1) = 1, por lo cual la serie comienza
con:
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946...
Objetivo Escribir un programa en ANSI-C
1
al cual el usuario dene el ndice :
y el programa imprime en la pantalla el valor de |(:).
Calicaci on La tarea vale por m aximo cinco (5) puntos. Es importante entregar
c odigo que por lo menos compile, a un si no ejecuta. Si el programa no calcula
bien el resultado, el m aximo posible es 2 puntos.
Retos para los avanzados
Vericar que la entrada sea v alida.
Insistir por otra entrada hasta que sea v alida.
Permitir que el usuario pida por varios valores de :.
Intentar a generar elementos con valores de : grandes.
Implementarlo de dos maneras: con recursi on y con iteraci on y despu es
experimentar con el tiempo de ejecuci on de las dos implementaciones.
Tarea 1. Serie de Fibonacci. Este programa permite que el usuario de varios
valores de :.
1 /
*
2 Tarea Numero 1.
3 Serie de Fibonacci
4
5 Descripcion:
6 La serie de Fibonacci se define por la ecuaci on
7 recursiva siguiente:
8
9 F(n) = F(n - 1) + F(n - 2)
10
11 Los primeros elementos son F(0) = 0 y F(1) = 1,
12 por lo cual la serie comienza con:
13 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
14 1597 2584 4181 6765 10946...
15
16 Objetivo:
17 Escribir un programa en ANSI-C al cual el usuario
18 define el ndice n y el programa imprime en la
1
Este c odigo compila y funciona correctamente en C++.
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
2.1 Tarea 1 7
19 pantalla el valor de F(n).
20
21 Autor: Efrain Soto Apolinar
22 fecha de ultima modificacion: 01 de febrero de 2008
23
*
/
24
25 #include <stdio.h> // para usar printf, scanf
26 #include <stdlib.h>
27
28 int main(int argc, char
**
args) {
29 int n,r;
30 int b4, bb4, now,i;
31 bb4 = 0;
32 b4 = 1;
33 printf("\nEste programa calcula el valor iterativo");
34 printf("\nde la serie de Fibonacci \n");
35
36 n = atoi(args[1]);
37 //scanf("Inserta el valor de n: %d", &n);
38 //if ((n==1) || (n == 2)){
39 // printf("El valor de F(%d) es: %d",n,bb4);
40 //} else {
41
42 for (i=1;i<(n);i++)
43 {
44 now = bb4 + b4;
45 bb4 = b4;
46 b4 = now;
47 printf("Si n = %d, entonces
48 F(%d) = %d\n",i+1,i+1,bb4);
49 if (now <=0)
50 {printf("\n\n\nLo siento, el valor de n es
51 demasiado grande");
52 break;
53 }
54 }
55 //}
56 printf("\nEl valor de n es: %d\n\n",n );
57 printf("El valor de F(%d) es: %d\n\n",i,bb4);
58
59 return 0;
60 }
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
8 Tareas en C
.. 1/ni/ .
Detector de n umeros primos
Objetivo:
Escribir un programa en ANSI-C
2
al cual el usuario dene un n umero entero
positivo : y el programa determina si es o no primo.
Por ejemplo,
1876953 = 3 13 17 19 149
donde todos los factores son primos.
Calicaci on:
La tarea vale por m aximo cinco (5) puntos. Es importante entregar c odigo que por
lo menos compile, a un si no ejecuta. Si el programa no calcula bien el resultado,
el m aximo posible es 2 puntos.
Retos para los avanzados
Vericar que la entrada sea v alida.
Insistir por otra entrada hasta que sea v alida.
Permitir que el usuario pida por varios valores de :.
Ampliar el rango de entradas por cambiar tipos de datos.
Imprimir todos los factores de : si no es primo, o sea, : como un producto
de n umeros primos.
Hacer la factorizaci on recursivamente.
Optimizar el algoritmo de soluci on por eliminar operaciones redundantes.
Estudiar las matem aticas de los n umeros primos para implementar m etodos
m as avanzados.
Para esta tarea considero la siguiente denici on:
Denici on 2.2.1.
N .Vino PniVo
Es un n umero natural que tiene exactamente dos divisores naturales.
2
Estos c odigos compilan y funcionan correctamente en C
++
.
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
2.2 Tarea 2 9
Esto signica que el n umero 1 NO es primo, dado que tiene solamente un divisor.
No se requiere, pero para no dejar a un lado:
Denici on 2.2.2.
N .Vino CoVi.iso
Es un n umero natural que tiene m as de dos divisores naturales.
De nuevo, el n umero 1 NO es compuesto, pues NO tiene m as de dos divisores
naturales.
Vericar si un n umero es primo. o
1 /
*
2 Tarea Numero 2. Detector de numeros primos
3 Nombre de la Tarea.
4
5 Descripcion:
6 Detector de n umeros primos
7
8 Objetivo
9
10 Escribir un programa en ANSI-C al cual el usuario
11 define un n umero entero positivo n y el programa
12 determina si o no es primo.
13
14 Por ejemplo, 1876953 = 3
*
13
*
17
*
19
*
149,
15 donde todos los (cinco) factores son primos.
16
17 Autor: Efrain Soto Apolinar.
18 fecha de ultima modificacion: 01 de febrero de 2008
19
*
/
20
21 #include <stdio.h> // para usar printf, scanf
22
23 int main(int argc, char
**
args)
24 {
25
26 int n,N,i,j,divisor,prime;
27 int factor[20];
28
29 printf("\nEste programa calcula indica si un");
30 printf("\nnumero dado es primo o no...\n");
31
32 n = atoi(args[1]);
33 N = n; // Nueva variable para modificarla...
34
35
36 // verifico que el numero ingresado sea positivo...
37 if (n<0)
38 {
39 printf("\nError en argumento...");
40 printf("\nPor favor, introduce un numero
41 positivo...");
42 return 0;
43 }
44 if (n==1)
45 {
46 printf("\nEl numero 1 No es primo...");
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
10 Tareas en C
47 printf("...pero tampoco es compuesto...");
48 return 0;
49 }
50
51
52 prime = 0; // Supongo que el numero NO es primo...
53 i = 0; //Inicio el indice del arreglo
54
55 // Reinicio el arreglo factor[20]
56 for (j=0;j<=19;j++)
57 {factor[j]= 0;}
58
59 // verifico que no sea par...
60 divisor = 2;
61 while (N%2==0){
62 factor[i]=divisor;
63 i++;
64 prime = 1;
65 N = N/divisor;
66 }
67 // verifico que no se divida por impares...
68 divisor = 3;
69 while (N>=divisor){
70 while (N%divisor==0){
71 factor[i]=divisor;
72 i++;
73 prime = 1;
74 N = N/divisor;
75 }
76 divisor = divisor + 2;
77 if (divisor%3==0) divisor = divisor + 2;
78 }
79
80 // Ahora imprimo los factores...
81 if (i>=2){
82 printf("\n\n\nEl numero %d no es primo...\n\n\n",n);
83 // reinicio el indice i
84 j = 0;
85 printf("\n\n\n%d = ",n);
86 for (j=0;j<i;j++)
87 {
88 printf(" %d ",factor[j]);
89 if (factor[j+1]!=0)
90 {
91 printf("
*
");
92 }
93 }
94 printf("\n\n\n");
95 }
96 if (i == 1){
97 printf("El numero %d es primo...\n\n\n",n);
98 }
99 return 0;
100 }
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
2.3 Tarea 3 11
. 1/ni/
Piedra, papel y tijera
Objetivo:
Escribir un programa en ANSI-C que juega interactivamente piedra-papel-tijera
con el usuario.
Calicaci on:
La tarea vale por m aximo cinco (5) puntos. Es importante entregar c odigo que por
lo menos compile, a un si no ejecuta. Si el programa no funciona bien, el m aximo
posible es 2 puntos.
Retos para los avanzados:
Vericar que la entrada sea v alida.
Insistir por otra entrada hasta que sea v alida.
Hacer observaciones de c omo distribuyen los puntos por ganar en tiempo
al repetir el juego.
Desarrollar inteligencia articial, o sea, hacer que el programa sepa jugar
y no simplemente elija al azar.
Juego Piedra papel tijera. o
1 /
*
2 Tarea Numero 3.
3 Piedra-Papel-Tijera
4
5 Descripcion:
6 Escribir un programa en ANSI-C que juega interactivamente
7 piedra-papel-tijera con el usuario.
8
9 Autor: Efrain Soto Apolinar.
10 fecha de ultima modificacion: 07 de febrero de 2008
11
*
/
12
13
14 #include <stdio.h> // para usar printf, scanf
15 #include <stdlib.h> // para rand()
16
17 //int main(int argc, char
**
args)
18 int main(void){
19 int usuario,compu;
20 //
21 printf("\n\n\nEste programa juega interactivamente");
22 printf("\n\n\nPiedra - Papel o tijera");
23 printf("\ncon el usuario...");
24
25 for (;;){ // for infinito
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
12 Tareas en C
26 printf("\n\n1 representa piedra...");
27 printf("\n2 representa papel...");
28 printf("\n3 representa tijera...");
29 printf("\nPresiona 0 para salir...");
30 printf("\n\nIntroduce tu jugada...");
31 scanf("%d",&usuario);
32
33 if (usuario == 0){ // hay que salir...
34 printf("\n\nPresionaste <<0>>...");
35 printf("\n\nAdios...\n\n");
36 break;
37 }
38 //
39 //compu = (rand() % 3) + 1;
40 //
41 if ((usuario == 1)){
42 printf("\n\nyo elijo papel....");
43 printf("\n\nYo gano!!!\n");
44 continue;
45 }
46
47 if (usuario == 2){
48 printf("\n\nyo elijo tijera....");
49 printf("\n\nYo gano!!!\n");
50 continue;
51 }
52
53 if (usuario == 3){
54 printf("\n\nyo elijo piedra....");
55 printf("\n\nYo gano!!!\n");
56 continue;
57 }
58
59 printf("\nError en Argumento...\n");
60 printf("\nPor favor, intenta de nuevo...\n\n\n");
61 } // termina el for...
62
63 return 1;
64 }
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
2.4 Tarea 4 13
. 1/ni/
Aproximaci on de
/
*
Tarea 4: Aproximacion de pi con la formula
Bailey-Borwein-Plouffe (BBP)
Objetivo:
Escribir un programa en ANSI-C
para calcular una aproximacion de pi
utilizando la formula BBP:
PI = \sum\limits_{n=0}{\infty}
{\frac{4}{8n+1} - \frac{2}{8n+4} - \frac{1}{8n+5} -
\frac{1}{8n+6}} \cdot \left(\frac{1}{16}\right)n
Autor: Efrain Soto Apolinar.
fecha de ultima modificacion: 07 de febrero de 2008
*
/
#include <stdio.h> // para usar printf, scanf
#include <math.h> // para usar pow(double,double)
int main(int argc, void
*
args){
double approx = 0;
int i,n;
//
printf("\nEste programa calcula una aproximacion");
printf("\ndel valor de PI usando la formula de");
printf("\nBailey - Borwein - Plouffe...");
printf("\nIntroduce el valor de n: ");
scanf("%d",&n);
//
for (i = 0 ; i <= n-1 ; i++){
approx = approx + (4.0/(8.0
*
i + 1.0) - 2.0/(8.0
*
i + 4.0)
- 1.0/(8.0
*
i + 5.0) - 1.0/(8.0
*
i + 6.0))
*
pow(1.0/16.0,i);
printf("\nIteracion %d: %.50f",i+1,approx);
}// Termina el for...
printf("\n\n\nEl valor aproximado es: %.50f\n\n\n",approx);
return 0;
}
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
14 Tareas en C
. 1/ni/
Factoriales y aproximaci on del n umero e
Objetivo: Escribir en ANSI-C un programa que calcula una aproximaci on de e
utilizando su expansi on Taylor ecuaci on
1 + 1 +
1
2!
+
1
3!
+
1
4!
+
as que el usuario controle de alguna manera la exactitud de la aproximaci on.
1 Tarea Numero 5.
2 Nombre de la Tarea
3 Tarea 5: Aproximaci on del n umero e con factoriales
4
5 Objetivo:
6 Escribir un programa en ANSI-C para calcular
7 una aproximaci on del n umero e con la f ormula iterativa:
8
9 PI = \sum\limits_{n=0}{\infty}
10 {\frac{4}{8n+1} - \frac{2}{8n+4} - \frac{1}{8n+5}
11 - \frac{1}{8n+6}} \cdot \left(\frac{1}{16}\right)n
12
13 Autor: Efrain Soto Apolinar.
14 fecha de ultima modificacion: 07 de febrero de 2008
15
*
/
16
17 #include <stdio.h> // para usar printf, scanf
18 #include <math.h> // para usar pow(double,double)
19
20 int main(int argc, void
*
args){
21 double e = 0;
22 int i, j, n;
23 double factorial;
24 //
25 printf("\nEste programa calcula una aproximacion");
26 printf("\ndel valor de la base neperiana");
27 printf("\nusando la serie de MacLaurin...");
28 printf("\nIntroduce el numero de iteraciones: ");
29 scanf("%d",&n);
30 //
31 for (i = 0 ; i <= n-1 ; i++){// Empezamos con las iteraciones...
32 // reinicio el factorial...
33 factorial = 1.0;
34 for (j = 1; j <= i; j++){ // calculo el factorial...
35 factorial
*
= 1.0 / j;
36 }
37 e += factorial;
38 printf("\nIteracion %d: %.50f",i+1,e);
39 }// Termina el for...
40 printf("\n\n\nEl valor aproximado es: %.50f\n\n\n",e);
41 return 0;
42 }
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
2.6 Tarea 6 15
.o 1/ni/ o
Palindromos
Objetivo: Escribir un programa en ANSI-C que examina si una palabra dada por
el usuario es un palndromo, o sea, si se lee igual al derecho y al rev es.
1 /
*
2 Tarea Numero Seis.
3 Nombre de la Tarea: Palindromos
4
5 Objetivo:
6 Escribir un programa en ANSI-C que examina
7 si una palabra dada por el usuario es un
8 pal ndromo, o sea, si se lee igual al reves.
9
10 Autor: Efrain Soto Apolinar.
11 fecha de ultima modificacion: 13 de febrero de 2008
12
*
/
13
14
15 #include <stdio.h> // para usar printf, scanf
16 #include <stdlib.h>
17
18 int main(int argc, char
**
args)
19 {
20 char frase[81]; // la frase que va a dar el usuario
21 int i,j,k; // contadores...
22 int palindromo = 1; // supongo que es palindromo...
23
24 for(;;){
25 printf("\n\nEste programa detecta Palindromos...");
26 printf("\nIntroduce una frase,
27 \npero sin escribir espacios en blanco: ");
28 scanf("%s",frase);
29 if (strlen(frase) < 81){
30 break;
31 }
32 printf("\n\nLo siento...");
33 printf("\nLa frase debe contener a lo mas 80
34 caracteres...");
35 printf("\n\nIntenta de nuevo...\n\n");
36 }
37 k = strlen(frase)-1;
38
39 for (i = 0 ; i<strlen(frase) ; i++){
40 if (frase[i] != frase[k-i]){
41 palindromo = 0;
42 }
43
44 }// fin del for...
45
46 // Pregunto si es o no palindromo...
47 if (palindromo == 1){
48 printf("\n\nLa frase SI es un palindromo...\n\n");
49 }
50 else{
51 printf("\n\nLa frase NO es un palindromo...\n\n");
52 }
53
54 return 0;
55 }
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
16 Tareas en C
., 1/ni/ o
Coecientes binomiales y el tri angulo de Pascal
Objetivo: Escribir un programa en ANSI-C que produce, seg un la elecci on del
usuario, o el coeciente binomial C(n, k), denido como:

:
l

=
:!
l! (: l)!
con valores de : y l denidos por el usuario, (por ejemplo C(31, 5) = 169 911)
o las primeras : lneas del tri angulo de Pascal: el elemento n umero l la lnea
n umero : del tri angulo es exactamente C(:, l).
1 /
*
2 Tarea Numero Ocho.
3 Coeficientes binomiales y el tri angulo de Pascal
4
5 Descripcion:
6 Escribir un programa en ANSI-C que produce,
7 seg un la elecci on del usuario, o el coeficiente
8 binomial C(n, k), definido como
9
10 C(n,k) = \frac{n!}{(n-k)! k!}
11
12 con valores de n y k definidos por el usuario,
13 (por ejemplo C(31, 5) = 169911) o las primeras n
14 l neas del tri angulo de Pascal: el elemento n umero
15 k el la l nea n umero n del tri angulo es
16 exactamente C(n, k). Por ejemplo, las primeras
17 ocho l neas son las siguientes:
18
19 1
20 1 1
21 1 2 1
22 1 3 3 1
23 1 4 6 4 1
24 1 5 10 10 5 1
25 1 6 15 20 15 6 1
26 1 7 21 35 35 21 7 1
27 1 8 28 56 70 56 28 8 1
28
29
30 Autor: Efrain Soto Apolinar.
31 fecha de ultima modificacion: 11 de febrero de 2008
32
*
/
33
34
35 #include <stdio.h> // para usar printf, scanf
36 #include <stdlib.h>
37
38 int main(int argc, char
**
args)
39 {
40 int i,j,n; // contadores
41 long now[100]; // arreglo con los coeficientes actuales
42 long b4[100]; // arreglo con los coeficientes anteriores
43
44 printf("\n\nEste programa imprime los renglones del");
45 printf("\ntriangulo de Pascal...");
46
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
2.7 Tarea 8 17
47 for(;;){
48 printf("\n\nIndique el numero de renglones a imprimir: ");
49 scanf("%d",&n);
50 if (n > 99){
51 printf("\n\nEl valor de n no debe ser mayor a 99...");
52 printf("\nIntente de nuevo...");
53 }
54 else{
55 break;
56 }
57 } // endfor...
58 // reinicio los arreglos
59 for (i = 0 ; i < 100 ; i++){
60 now[i] = 0;
61 b4[i] = 0;
62 }
63
64 // inicio con los coeficientes binomiales...
65 printf("\t1\n\n");
66 // printf("\t1\t1\n\n");
67 for (j = 1 ; j < n ; j++){ // Renglones...
68 // reinicio los valores de los arreglos...
69 now[0] = 1;
70 b4[0] = 1;
71 b4[1] = j-1;
72
73 printf("\t1"); // Imprimo el primer valor del renglon
74
75 for (i = 1 ; b4[i+1] != 0 ; i++){ // Coeficientes
76 now[i] = b4[i] + b4[i-1];
77
78 if (now[i] <= 0){ // verifico que no obtenga un valor negativo...
79 printf("\n\n\nLo siento... se sobrepaso la memoria...\n");
80 return 0;
81 }
82
83 printf ("\t%d", now[i]);
84 }
85
86 now[i+1]=1; // imprimo el ultimo valor del renglon...
87 printf("\t%d\n",now[i+1]);
88
89 for(i = 0 ; i <= j+1 ; i++){ // transfiero la informacion
90 b4[i] = now[i];
91 }
92 printf("\n");
93 }
94
95 return 0;
96 }
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
18 Tareas en C
.o 1/ni/ q
Vericador del uso correcto de los par entesis
Objetivo: Escribir un programa en ANSI-C que examina una expresi on guardada
en un archivo y determina si los par entesis est an correctamente cerradas, o sea,
para cada ( que abre, viene un ), para cada [, un ] y para cada un . Por
ejemplo, la expresi on
(3 + [4 8

5] 42 2
3
)
es correcta mientras que
3 + [4 8

5] (42 2
3
)
no lo es.
1 /
*
2 Tarea Numero Nueve.
3 Verificador del uso correcto de los par entesis
4
5 Objetivo:
6 Escribir un programa en ANSI-C que examina una
7 expresi on guardada en un archivo y determina
8 si los par entesis est an correctamente cerradas,
9 o sea, para cada "(" que abre, viene un ")",
10 para cada "[", un "]" y para cada "{" un "}".
11 Por ejemplo, la expresi on:
12
13 (3+[4 - 8
*
sqrt(5)] - {4.2 - 23})
14
15 es correcta mientras:
16
17 {3+[4 - 8
*
sqrt(5)] - (4.2 - 23})
18
19 no lo es.
20
21 Autor: Efrain Soto Apolinar.
22 fecha de ultima modificacion: 13 de febrero de 2008
23
*
/
24
25 #include <stdio.h> // para usar printf, scanf
26 #include <stdlib.h>
27
28 int main(int argc, char
**
args)
29 {
30 char expresion[51];
31 int i,j;
32 // Los signos de agrupacion son 3 x 2
33 // Parentesis ()
34 // Corchetes []
35 // llaves {}
36 int parentesis = 0;
37 int corchetes = 0;
38 int llaves = 0;
39 int up = 0, ul = 0, uc = 0;
40 int nivel = 0; // anidacion de los agrupadores...
41 int correcto = 1; // Supongo que se escribio bien...
42
43 printf("\n\nEste programa verifica el uso de
44 los signos de agrupacion...");
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
2.8 Tarea 9 19
45 printf("\nIntroduce una expresion matematica: ");
46 scanf("%s",expresion);
47 i = 0;
48 while (expresion[i] != \0){ // Pedir expresion...
49 // cuento los signos...
50 if (expresion[i] == (){// abre un parentesis...
51 parentesis++;
52 nivel ++;
53 up = nivel; // el ultimo parentesis se abrio
54 // en este nivel...
55 }
56 if (expresion[i] == )){// cierra un parentesis...
57 parentesis--;
58 if (nivel != up){
59 correcto = 0;
60 printf("\n\nError, escribiste un parentesis de mas en");
61 printf("\nel caracter %d de tu expresion...",i+1);
62 }
63 nivel --;
64 }
65 if (expresion[i] == [){// abre un corchete...
66 corchetes++;
67 nivel++;
68 uc = nivel; // el ultimo corchete se abrio
69 // en este nivel...
70 }
71 if (expresion[i] == ]){// cierra un corchete...
72 corchetes--;
73 if (nivel != uc){
74 correcto = 0;
75 printf("\n\nError, escribiste un corchete de mas en");
76 printf("\nel caracter %d de tu expresion...",i+1);
77 }
78 nivel--;
79 }
80 if (expresion[i] == {){// abre una llave...
81 llaves++;
82 nivel++;
83 ul = nivel; // la ultima llave se abrio
84 // en este nivel...
85 }
86 if (expresion[i] == }){// cierra una llave...
87 llaves--;
88 if(nivel != ul){
89 correcto = 0;
90 printf("\n\nError, escribiste una llave de mas en");
91 printf("\nel caracter %d de tu expresion...",i+1);
92 }
93 nivel--;
94 }
95 i++;
96 } // Termina de leer la expresion
97 // Ahora envio el mensaje final...
98
99 printf("\n\n\nNivel: %d",nivel); // Un poco de espacio
100
101 if ((correcto == 1) && (nivel == 0)){
102 printf("\n\nFelicidades!!!");
103 printf("\nLa expresion fue escrita
104 correctamente...\n\n\n");
105 }
106 else{
107 printf("\n\nUps!");
108 printf("\nFalto algun signo agrupador...");
109 printf("\nPor favor verifica tu expresion...\n\n");
110 }
111 return 0;
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
20 Tareas en C
112 }
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
2.9 Tarea 10 21
.q 1/ni/ o
N umeros aleatorios uniformes y exponenciales con histogramas
Objetivo: Escribir un programa en ANSI-C que genera n umeros aleatorios uni-
formes y exponenciales y sabe dibujar histogramas de los n umeros generados.
La salida se guarda en un archivo.
1 /
*******************************
2 Tarea 10. N umeros aleatorios uniformes y
3 exponenciales con histogramas
4 Nombre del archivo: diez.c
5 Escribir un programa en ANSI-C que genera n umeros
6 aleatorios uniformes y exponenciales y sabe
7 "dibujar" histogramas de los n umeros generados.
8 La salida se guarda en un archivo.
9
********************************
/
10
11 #include <stdio.h>
12 #include <stdlib.h>
13 #include <assert.h>
14 #include <math.h>
15 const double PI = 3.141592653;
16
17 int semilla; // semilla = 1 ---> se debe reiniciar la semilla.
18 int sel; // seleccion de distribuci on...
19
20 // funci on para generar n umeros
21 // pseudoaleatorios con distribuci on uniforme.
22 double uniforme(void);
23 void duniforme(void);
24
25 // Funci on para generar n umeros
26 // pseudoaleatorios con distribuci on exponencial
27 double exponencial(float lambda);
28 void dexponencial(void);
29
30 // Funci on para generar n umeros
31 // pseudoaleatorios con distribuci on normal
32 double normal(double media, double sigma);
33 void dnormal(void);
34
35 int main(int argc, char
*
argv[]){
36 char respuesta, distribucion;
37 double lambda; // promedio de la exponencial
38 int i, j;
39 for(;;){ // for infinito...
40 printf("\n\nEste programa genera n umeros aleatorios");
41 printf("\ncon las siguientes distribuciones:");
42 printf("\n U ---> Uniforme,");
43 printf("\n E ---> Exponencial, y");
44 printf("\n N ---> Normal.");
45 printf("\n\nElija una distribuci on...");
46 scanf("%s", &distribucion);
47 switch (distribucion){
48 case U:
49 sel = 1;
50 duniforme();
51 break;
52 case u:
53 sel = 1;
54 duniforme();
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
22 Tareas en C
55 break;
56 case E:
57 sel = 2;
58 dexponencial();
59 break;
60 case e:
61 sel = 2;
62 dexponencial();
63 break;
64 case N:
65 sel = 3;
66 dnormal();
67 break;
68 case n:
69 sel = 3;
70 dnormal();
71 break;
72 default:
73 printf("\n\nError en argumento...");
74 printf("\nIntente de nuevo...");
75 printf("\n\n\n");
76 continue;
77 }
78 // pregunto si desea salir...
79 scanf("%c", &respuesta);
80 printf("\n\n\nPresione < S > para salir... ");
81 scanf("%c", &respuesta);
82 if ((respuesta == S)||(respuesta == s)){
83 break; // Salir del ciclo for inicial...
84 }
85 printf("\n\n\n");
86 } // end for infinito...
87 // system("PAUSE");
88 return 0;
89 }
90
91 /
**************************************
92 Declaro la funci on UNIFORME...
93
***************************************
/
94 double uniforme(void){
95 // Esta funci on genera un n umero pseudoaleatorio
96 // en el intervalo (0,1) con distribuci on uniforme.
97 return ((double)(rand())/(double)(RAND_MAX));
98 }
99
100 /
**************************************
101 Declaro la funci on EXPONENCIAL...
102
***************************************
/
103 double exponencial(float lambda){
104 // Esta funci on genera n umeros pseudoaleatorios
105 // con distribuci on exponencial
106 double x1, x2;
107 x1 = - log(1 - uniforme());
108 x2 = x1
*
pow(lambda,-1);
109 return x2;
110 }
111
112 /
**************************************
113 Declaro la funci on NORMAL...
114
***************************************
/
115 double normal(double media, double sigma){
116 /
*
117 Esta funci on genera n umeros pseudoaleatorios
118 con distribuci on uniforme a partir de su media
119 y su desviaci on est andar.
120
*
/
121 double u, x, y, z;
122 u = uniforme();
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
2.9 Tarea 10 23
123 y = uniforme();
124 x = sqrt(-2
*
log(u))
*
cos(2
*
PI
*
y);
125 if (u >= 0.5){
126 z = media + sigma
*
x;
127 }
128 else{
129 z = media - sigma
*
x;
130 }
131 return z;
132 }
133
134 /
**************************************
135 Declaro la funci on DUNIFORME..
136
***************************************
/
137 void duniforme(void){
138 /
*
139 Para generar los n umeros
140 con distribuci on uniforme...
141
*
/
142 int I[10]; // los intervalos...
143 int errores = 0, max =0, min = 1000000;
144 int imax, imin;
145 int total; // cu antos vamos a generar...
146 int i, j; // contadores
147 double x; // el n umero generado...
148 double escala; // para hacer la gr afica...
149 int factor; // para hacer la gr afica...
150 // Para el manejo de archivos...
151 FILE
*
f = fopen("uniforme.txt", "w+");
152 assert(f != NULL);
153 for(;;){ // hasta que ingrese un n umero entero positivo
154 printf("\nIndique cuantos numeros desea generar: ");
155 scanf("%d", &total);
156 if (total <= 0){
157 printf("\n\nError en argumento...");
158 printf("\nPor favor, ingrese un n umero entero positivo...");
159 printf("\n\n\n");
160 continue;
161 }
162 break;
163 }
164 // Limpio la memoria del arreglo:
165 for (i = 0 ; i <= 9 ; i++){
166 I[i] = 0;
167 }
168 for (i = 1; i <= total; i++){
169 // Genero un pseudoaleatorio
170 x = uniforme();
171 fprintf(f, "%f\n", x);
172 for(j = 0 ; j < 10 ; j++){
173 if ((x > 0.1
*
j) && (x <= 0.1
*
(j + 1))){
174 I[j]++;
175 }
176 }
177 }
178 fclose(f);
179 // Encuentro el intervalo con
180 // mayor n umero de ocurrencias
181 for (i = 0; i <= 9 ; i++){
182 if (I[i] > max){
183 max = I[i];
184 imax = i;
185 }
186 if (I[i] < min){
187 min = I[i];
188 imin = i;
189 }
190 }
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
24 Tareas en C
191 // Ahora imprimo los resultados...
192 FILE
*
r = fopen("uniforme.txt", "a+"); // a
193 for (i = 0 ; i <= 9 ; i++){
194 printf("\n Intervalo %.1f -- %.1f ", (1.0
*
i / 10),(1.0
*
(i+1) / 10));
195 fprintf(r, "\n# Intervalo %.1f -- %.1f ", (1.0
*
i / 10),(1.0
*
(i+1) / 10));
196 escala = 35.0
*
I[i] / max;
197 factor = (int)(escala + 0.5); // redondeo
198 // Imprime la barra del intervalo (i-1)
199 for (j = 0 ; j <= factor ; j++){
200 printf("|");
201 fprintf(r, "|");
202 } // termina de imprimir la barra...
203 if (i == imax){
204 printf(" (%i) [Max]\n", I[i]);
205 fprintf(r, " (%i) [Max]\n", I[i]);
206 continue;
207 }
208 if (i == imin){
209 printf(" (%i) [Min]\n", I[i]);
210 fprintf(r, " (%i) [Min]\n", I[i]);
211 continue;
212 }
213 printf(" (%i) \n", I[i]);
214 fprintf(r, " (%i) \n", I[i]);
215 }
216 fclose(r);
217 return;
218 } // Fin de la funci on DUNIFORME
219
220
221 /
**************************************
222 Declaro la funci on EXPONENCIAL..
223
***************************************
/
224 void dexponencial(void){
225 /
*
226 Para generar los n umeros
227 con distribuci on exponencial...
228
*
/
229 int I[10]; // los intervalos...
230 int errores = 0, max =0, min = 1000000;
231 int total; // cu antos vamos a generar...
232 int i, j; // contadores
233 int imax, imin;
234 double x; // el n umero generado...
235 float lambda; // par ametro lambda de la distribuci on
236 double escala; // para hacer la gr afica...
237 int factor; // para hacer la gr afica...
238 FILE
*
f = fopen("exponencial.txt", "w+");
239 for(;;){ // hasta que ingrese un n umero entero positivo
240 printf("\nIndique cuantos numeros desea generar: ");
241 scanf("%d", &total);
242 if (total <= 0){
243 printf("\n\nError en argumento...");
244 printf("\nPor favor, ingrese un n umero entero positivo...");
245 printf("\n\n\n");
246 continue;
247 }
248 break;
249 }
250 for(;;){// hasta que indique el valor de lambda
251 printf("Introduzca el valor de la razon lambda: ");
252 scanf("%f", &lambda);
253 if (lambda <= 0.0){
254 printf("\n\nEl valor de lambda debe ser positivo...");
255 printf("\nPor favor intente de nuevo...\n\n");
256 continue;
257 }
258 break;
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
2.9 Tarea 10 25
259 }
260 // limpio la memoria del array...
261 for (i = 0 ; i <= 9 ; i++){
262 I[i] = 0;
263 }
264 for (i = 1; i <= total; i++){
265 // Genero un pseudoaleatorio
266 x = exponencial(lambda);
267 fprintf(f, "%f\n", x);
268 for(j = 0 ; j < 10 ; j++){
269 if ((x > 0.1
*
j
*
lambda) && (x <= 0.1
*
(j + 1)
*
lambda)){
270 I[j]++;
271 }
272 }
273 }
274 fclose(f);
275 // Encuentro el intervalo con
276 // mayor n umero de ocurrencias
277 for (i = 0; i <= 9 ; i++){
278 if (I[i] > max){
279 max = I[i];
280 imax = i;
281 }
282 if (I[i] < min){
283 min = I[i];
284 imin = i;
285 }
286 }
287
288 // Ahora imprimo los resultados...
289 FILE
*
r = fopen("exponencial.txt", "a+");
290 fprintf(r, "\n\n\n"); // espacio
291 printf("\n\nlos intervalos est an en t erminos del");
292 printf("\npar ametro lambda...\n");
293 for (i = 0 ; i <= 9 ; i++){
294 printf("\n Intervalo %.1f --%.1f ", (1.0
*
(i) / 10),(1.0
*
(i+1) / 10));
295 fprintf(r, "\n# Intervalo %.1f --%.1f ", (1.0
*
(i) / 10),(1.0
*
(i+1) / 10));
296 escala = 35.0
*
I[i] / max;
297 factor = (int)(escala + 0.5); // redondeo
298 // Imprime la barra del intervalo (i-1)
299 for (j = 0 ; j <= factor ; j++){
300 printf("|");
301 fprintf(r, "|");
302 } // termina de imprimir la barra...
303 if (i == imax){
304 printf(" (%i) [Max]\n", I[i]);
305 fprintf(r, " (%i) [Max]\n", I[i]);
306 continue;
307 }
308 if (i == imin){
309 printf(" (%i) [Min]\n", I[i]);
310 fprintf(r, " (%i) [Min]\n", I[i]);
311 continue;
312 }
313 printf(" (%i) \n", I[i]);
314 fprintf(r, " (%i) \n", I[i]);
315 }
316 fclose(r);
317 return;
318 } // Fin de la funci on DEXPONENCIAL
319
320
321 /
**************************************
322 Declaro la funci on DNORMAL..
323
***************************************
/
324 void dnormal(void){
325 /
*
326 Para generar los n umeros
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
26 Tareas en C
327 con distribuci on normal...
328
*
/
329 int I[10]; // los intervalos...
330 int errores = 0, max =0, min = 1000000;
331 int total; // cu antos vamos a generar...
332 int i, j; // contadores
333 double x; // el n umero generado...
334 double escala; // para hacer la gr afica...
335 int factor; // para hacer la gr afica...
336 double media = 0.0, sigma = 1.0; // par ametros
337 FILE
*
f = fopen("normal.txt", "w+");
338 for(;;){ // hasta que ingrese un n umero entero positivo
339 printf("\nIndique cuantos numeros desea generar: ");
340 scanf("%d", &total);
341 if (total <= 0){
342 printf("\n\nError en argumento...");
343 printf("\nPor favor, ingrese un n umero entero positivo...");
344 printf("\n\n\n");
345 continue;
346 }
347 break;
348 }
349 printf("\nSe generan n umeros pseudoaleatorios ");
350 printf("\ncon media cero (0) y ");
351 printf("desviaci on est andar uno (1).\n\n\n");
352 // limpio la memoria del array...
353 for (i = 0 ; i <= 9 ; i++){
354 I[i] = 0;
355 }
356 for (i = 1; i <= total; i++){
357 // Genero un pseudoaleatorio
358 x = normal(0.0, 1.0);
359 fprintf(f, "%f\n", x);
360 for(j = 0 ; j < 10 ; j++){
361 if ((x > j - 5.0) && (x <= j - 4.0)){
362 I[j]++;
363 }
364 }
365 }
366 fclose(f);
367 // Encuentro el intervalo con
368 // mayor n umero de ocurrencias
369 for (i = 0; i <= 9 ; i++){
370 if (I[i] > max){
371 max = I[i];
372 }
373 if (I[i] < min){
374 min = I[i];
375 }
376 }
377 // Ahora imprimo los resultados...
378 FILE
*
r = fopen("normal.txt", "a+");
379 fprintf(r, "\n\n\n"); // espacio
380 for (i = 0 ; i <= 9 ; i++){
381 printf("\nIntervalo %i -- %i ", (i-5), (i-4));
382 fprintf(r, "\n# Intervalo %i -- %i ", (i-5), (i-4));
383 escala = 35.0
*
I[i] / max;
384 factor = (int)(escala + 0.5); // redondeo
385 // Imprime la barra del intervalo (i-1)
386 for (j = 0 ; j <= factor ; j++){
387 printf("|");
388 fprintf(r, "|");
389 } // termina de imprimir la barra...
390 if (I[i] == max){
391 printf(" (%i) [Max]\n", I[i]);
392 fprintf(r, " (%i) [Max]\n", I[i]);
393 continue;
394 }
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
2.9 Tarea 10 27
395 if (I[i] == min){
396 printf(" (%i) [Min]\n", I[i]);
397 fprintf(r, " (%i) [Min]\n", I[i]);
398 continue;
399 }
400 printf(" (%i) \n", I[i]);
401 fprintf(r, " (%i) \n", I[i]);
402 }
403 return;
404 fclose(r);
405 } // Fin de la funci on DNORMAL
Fuente Bilbiogr aca La teora respecto a los procedimientos para generar los
n umeros pseudoaleatorios para las distintas distribuciones se obtuvo del siguien-
te libro:
Autor: Jerry Banks, John S. Carson II, Barry L. Nelson.
Ttulo: DiscniissiV siV.i/io
Editorial: Ed. Prentice Hall.
Edici on: 2da. edici on. 1996.
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
28 Tareas en C
.o 1/ni/
Promedio, varianza y deviaci on est andar
Objetivo: Escribir un programa en ANSI-C que lee un archivo de datos y calcula
su promedio, varianza y deviaci on est andar, sin saber de antemano cu antos datos
ser an.
1 /
*
2 Name: once.c
3 Author: Efrain Soto A.
4 Date: 24/03/08 16:39
5 Description: Tarea 11.
6 Escribir un programa en ANSI-C que lee
7 un archivo de datos y calcula su promedio,
8 varianza y deviaci on est andar, sin saber
9 de antemano cu antos datos ser an.
10
11 mean = (\sum x_i) / n
12 variance = 1/(n-1) [\sum(x_i2) - 1/n (\sum (x))2]
13 standar deviation = sqrt(variance)
14
*
/
15 #include <stdio.h>
16 #include <stdlib.h>
17 #include <math.h>
18 #include <wchar.h>
19 #include <ctype.h>
20 #include <assert.h>
21
22 int main(int argc, char
*
argv[]){
23 char respuesta, letra = ;
24 char filename[15];// = "data.txt"; // nombre de archivo
25 double datum;
26 double x, Sx, Sx2;
27 double varianza, sd, media;
28 int n = 0, j = 1, i = 0; // contadores...
29 char dato[15];
30 char B4; // letra leida antes...
31 FILE
*
stream_datum; // stream_uniforme
32 //FILE
*
f = fopen("datos.txt", "r");
33 //assert(f != NULL);
34
35 for (;;){
36 Sx = 0, Sx2 = 0; // reinicio los contadores
37 printf("\n\nEste programa lee datos numericos");
38 printf("\nde un archivo y calcula la media,");
39 printf("\nla varianza y la desviaci on estandar.");
40 printf("\n\nIntroduzcael nombre del archivo");
41 printf("\ndel cual se leeran los datos...");
42 scanf("%s", &filename);
43 stream_datum = fopen(filename, "r+"); // abrir para lectura
44 if (stream_datum == NULL){
45 printf ("\nNo se puede abrir el archivo %s\n", filename);
46 printf("\nPor favor, verifique el archivo...");
47 printf("\nReinicie el programa entonces...\n");
48 system("PAUSE");
49 return 0; // salir sin avisar...
50 }
51 // Ahora leemos los datos...
52 do{
53 //dato[i] = 0; // opcional
54 letra = fgetc(stream_datum); // leer un char
55 if (letra == feof(stream_datum)){
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
2.10 Tarea 11 29
56 break; // Salir del ciclo...
57 }
58 switch(letra){
59 case \n: // lleg o a un nuevo rengl on
60 if (i > 1){
61 dato[i] = \0; // fin del arreglo de caracteres
62 x = atof(dato); // convierto el arreglo a un float
63 printf("\nDato leido: %f", x); // opcional
64 Sx += x; // Suma de x
65 Sx2 += x
*
x; // Suma de x2
66 i = 0;
67 n++;
68 }
69 break;
70 case \t: // para el caso de varias columnas...
71 //if (i > 0){
72 dato[i] = \0; // fin del arreglo de caracteres
73 x = atof(dato); // convierto el arreglo a un float
74 printf("\nDato leido: %f", x); // opcional
75 Sx += x; // Suma de x
76 Sx2 += x
*
x; // Suma de x2
77 i = 0;
78 n++;
79 //}
80 break;
81 case : // espacio en blanco...
82 if (i > 1){
83 dato[i] = \0; // fin del arreglo de caracteres
84 x = atof(dato); // convierto el arreglo a un float
85 printf("\nDato leido: %f", x); // opcional
86 Sx += x; // Suma de x
87 Sx2 += x
*
x; // Suma de x2
88 i = 0;
89 n++;
90 break;
91 }
92 case #: // comentario...
93 //if (i > 1){
94 do{ // leer todos los alfanum ericos
95 letra = fgetc(stream_datum);
96 if (letra == feof(stream_datum)){
97 break;
98 }
99 } while (letra!=\n);
100 i = 1;
101 dato[0] = letra;
102 //}
103 break;
104 default:
105 dato[i] = letra;
106 i++;
107 }
108 } while(!feof(stream_datum));
109 fclose(stream_datum); // cerrar archivo...
110
111 printf("\n\nResultados: ");
112 printf("\nSx = %f", Sx);
113 printf("\nSx2 = %f", Sx2);
114 printf("\nn = %i\n\n", n);
115 system("PAUSE");
116 varianza = (Sx2 - Sx
*
Sx / (1.0
*
n)) / (n - 1.0);
117 sd = sqrt(varianza);
118 media = Sx / (1.0
*
n);
119 printf("\n\nMedia: %f", media);
120 printf("\nVarianza: %f", varianza);
121 printf("\nDesviaci on estandar: %f", sd);
122 //
123 scanf("%c", &respuesta);
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
30 Tareas en C
124 for (;;){
125 printf("\n\n\nPresione < S > para salir... ");
126 scanf("%c", &respuesta);
127 if ((respuesta == S)||(respuesta == s)){
128 return 0; // Salir del ciclo for inicial...
129 }
130 if (respuesta == \n){
131 continue; // Salir del ciclo for inicial...
132 }
133 else{
134 break;
135 }
136 } // end for infinito...
137 printf("\n\n\n");
138 } // end for infinito...
139 return 0;
140 }
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
2.11 Tarea 12 31
. 1/ni/ .
Ruina del jugador
Objetivo:
Escribir un programa en ANSI-C para simular un juego: un jugador apuesta l
pesos. Con probabilidad 0 < < 1, gana l pesos. Si no gana, pierde su
apuesta. El jugador empieza con l l pesos y quiere jugar hasta que tenga
en total : l pesos. Al momento que el jugador ya no tiene ni l pesos, ha
perdido. Depende de los par ametros l, , , l y : con qu e probabilidad pierde
lo que tiene y con qu e probabilidad gana sus : pesos.
1 /
*
2 Name: doce.c
3 Author: Efrain Soto A.
4 Date: 24/03/08 16:39
5 Description: Tarea 12.
6 Escribir un programa en ANSI-C para simular
7 un juego: un jugador apuesta b pesos. Con
8 probabilidad 0 < p < 1, gana g > b pesos.
9 Si no gana, pierde su apuesto. El jugador
10 empieza con k > b pesos y quiere jugar hasta
11 que tenga en total n > k pesos. Al momento que
12 el jugador ya no tiene ni b pesos, ha perdido.
13 Depende de los par ametros b, p, g, k y n con
14 qu e probabilidad pierde lo que tiene y con qu e
15 probabilidad gana sus n pesos.
16
*
/
17 #include <stdio.h>
18 #include <stdlib.h>
19 #include <math.h>
20
21 double uniforme(void);
22
23 int main(int argc, char
*
argv[]){
24 float p_Exito; // probabilidad de que gane...
25 float Monto_Inicial; // Monto inicial del jugador (k)
26 float Goal = 10000; // meta del jugador...
27 float Ruina = 0; // Ruina del jugador...
28 float Lim = 100; // l mite m n para empezar a jugar...
29 float Apuesta;// = 25; // Monto a apostar...
30 float Monto_Actual; // que posee el jugador en la apuesta actual
31 int i = 0; // N umero de apuesta
32 int gana = 0, pierde = 0;
33 char ch;
34 printf("\n\nEste programa simula la ruina del jugador.");
35 printf("\nIntroduzca los siguientes datos:");
36 for(;;){
37 printf("\n\nProbabilidad de ganar del jugador: ");
38 scanf("%f", &p_Exito);
39 if (p_Exito < 0 || p_Exito > 1){
40 printf("\n\nError en argumento...");
41 printf("\nEl valor debe estar entre cero y uno...");
42 continue;
43 }
44 break;
45 }
46 for(;;){
47 printf("\n\nMonto inicial del jugador: ");
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
32 Tareas en C
48 scanf("%f", &Monto_Actual);
49 if (Monto_Actual < 0){
50 printf("\n\nError en argumento...");
51 printf("\nEl valor debe ser positivo...");
52 continue;
53 }
54 break;
55 }
56 Monto_Inicial = Monto_Actual;
57 printf("Monto Actual = %f\n\n", Monto_Actual);
58 for(;;){
59 printf("\nValor de cada apuesta: ");
60 scanf("%f", &Apuesta);
61 if (Apuesta <= 0 || Apuesta > Monto_Actual){
62 printf("\n\nError en argumento...");
63 printf("\nEl valor debe ser un numero positivo");
64 printf("\nmenor que el monto actual del jugador...");
65 continue;
66 }
67 break;
68 }
69 for(;;){
70 printf("\n\nIndique cuanto desea ganar el jugador: ");
71 scanf("%f", &Goal);
72 if (Goal < Monto_Actual || Goal <= 0){
73 printf("\n\nError en argumento...");
74 printf("\nEl valor debe ser un numero positivo");
75 printf("\nmayor al monto actual...");
76 continue;
77 }
78 break;
79 }
80 printf("\n\n\n"); // espacio...
81 do{
82 if (uniforme() <= p_Exito){// gan o la apuesta!!!
83 Monto_Actual += Apuesta;
84 i++;
85 gana++;
86 printf("\nEl jugador gana la apuesta %i y ahora
87 tiene %f pesos\n", i, Monto_Actual);
88 }
89 else{// perdi o la apuesta!!!
90 Monto_Actual -= Apuesta;
91 i++;
92 pierde++;
93 printf("\nEl jugador pierde la apuesta %i y
94 ahora tiene %f pesos\n", i, Monto_Actual);
95 }
96 //system("PAUSE");
97 } while ((Monto_Actual < Goal) && (Monto_Actual >= Apuesta));
98 //
99 if (gana > pierde){
100 printf("\n\nEl jugador termino con %f despues de %i apuestas...",
101 Monto_Actual, i);
102 printf("\n\nEn total gano: %f pesos.",
103 Monto_Actual - Monto_Inicial);
104 printf("\n\nFelicidades, esta vez tuviste suerte...\n\n\n");
105 }
106 else{
107 printf("\nEl jugador termino con %f despues de %i apuestas...",
108 Monto_Actual, i);
109 printf("\n\nEn total perdio: %f pesos.",
110 Monto_Actual - Monto_Inicial);
111 printf("\nLo siento, esta vez la casa gana...\n\n\n");
112 }
113
114 //
115 printf("\n\n\n");
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
2.11 Tarea 12 33
116 printf("El jugador gano un total de %i apuestas,", gana);
117 printf("\nEs decir, un %.2f%% de las apuestas.\n", (100.0
*
gana / i));
118 printf("\ny perdio un total de %i apuestas,", pierde);
119 printf("\nEs decir, un %.2f%% de las apuestas.", (100.0
*
pierde / i));
120 printf("\n\n\n");
121 //system("PAUSE");
122 printf("Presione una tecla y despues <Enter>...");
123 scanf("%c", &ch);
124 scanf("%c", &ch);
125 /
*
scanf("%c", &ch);
*
/
126 return 0;
127 }
128 /
**************************************
129 Declaro la funci on UNIFORME...
130
***************************************
/
131 double uniforme(void){
132 // Esta funci on genera un n umero pseudoaleatorio
133 // en el intervalo (0,1) con distribuci on uniforme.
134 return (1.0
*
rand()/RAND_MAX);
135 }
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
34 Tareas en C
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
3
Conceptos de C
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
36 Conceptos de C
Cociios ni C
3.1.1 I/O File manipulation
FILE es el tipo de dato usado para representar objetos del tipo stream.
Este tipo de dato est a denido en el archivo stdio.h
Las funciones feof (end of le) ferror (error de lectura y/o escritura)
pueden vericarse con el tipo de dato FILE.
Para redireccionar la salida a un archivo podemos escribir las siguientes
instrucciones:
FILE
*
fopen(const char
*
filename, const char
*
opentype);
/
*
La funcion ||fopen|| abre una stream para I/O al
||filename|| y regresa un apuntador al stream.
El ||opentype|| es una cadena de caracteres que
controla como se va a abrir el archivo...
*
/
Las cadenas de caracteres que acepta opentype son:
r Abre un archivo existente (solo lectura).
w Abre un archivo existente (solo escritura). Si el archivo existe, se
borra su contenido. De otra forma, se crea uno nuevo.
a Abre un archivo existente para agregar informaci on al nal (ap-
pend). Si el archivo no existe, se crea.
r+ Abre un archivo existente para lectura y escritura. El contenido
del archivo no se modica. La posici on inicial es el inicio del archivo.
w+ Abre un archivo existente para lectura y escritura. Si el archivo
existe, se borra su contenido. De otra forma, uno nuevo se crea.
a+ Abre un archivo existente para lectura y appending (agregar
informaci on al nal del archivo). Si no existe otro nueo arhcivo es
creado. La posici on inicial es al inicio del archivo, pero la informaci on
que se agregue, siempre se agrega al nal del mismo.
Ejemplo:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
int main(){
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
3.1 Conceptos de C 37
float f1, f2;
int i1, i2;
FILE
*
my_stream;
char my_filename[] = "jazz.txt";
my_stream = fopen(my_filename, "w");
fprintf(my_stream, "%f %f %#d %#d", 23.5, -12e6, 100, 5);
/
*
cerrar stream... No verifico errores por brevedad...
*
/
fclose(my_stream);
fscanf(my_stream, "%f, %f, %i, %i",f1, f2, i1, i2);
fclose(my_stream);
printf("\n\nFloat 1: %f\n", f1);
printf("Float 2: %f\n", f2);
printf("Int 1: %i\n", i1);
printf("Int 2: %i\n", i2);
system ("PAUSE");
return 0;
}
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
38 Conceptos de C
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
4
Tareas en Java
There is no programming language, no matter how structured, that
will prevent programmers from writing bad programs.
L. Flon
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
40 Tareas en Java
1/ni/
La serie de Fibonacci se dene por la ecuaci on recursiva siguiente:
|(:) = |(: 1) +|(: 2)
Los primeros elementos son |(0) = 0 y |(1) = 1, por lo cual la serie comienza
con:
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946...
Objetivo Escribir un programa en ANSI-C
1
al cual el usuario dene el ndice :
y el programa imprime en la pantalla el valor de |(:).
Calicaci on La tarea vale por m aximo cinco (5) puntos. Es importante entregar
c odigo que por lo menos compile, a un si no ejecuta. Si el programa no calcula
bien el resultado, el m aximo posible es 2 puntos.
Retos para los avanzados
Vericar que la entrada sea v alida.
Insistir por otra entrada hasta que sea v alida.
Permitir que el usuario pida por varios valores de :.
Intentar a generar elementos con valores de : grandes.
Implementarlo de dos maneras: con recursi on y con iteraci on y despu es
experimentar con el tiempo de ejecuci on de las dos implementaciones.
Tarea 1. Serie de Fibonacci. Este programa permite que el usuario de varios
valores de :.
Enseguida se muestra en c odigo en el lenguaje Java.
1 /
*
2
*
Programa Fibonacci
3
*
4
*
Este programa genera la sucesi on de
5
*
Fibonacci
6
*
7
*
Fecha: 26 de marzo de 2008
8
*
9
*
/
10
11 import java.util.Scanner;
12
13 class Fibonacci {
14 static Scanner input = new Scanner(System.in);
15 //
1
Este c odigo compila y funciona correctamente en C++.
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
4.1 Tarea 1 41
16 // Genera los n umeros de Fibonacci
17 public static void main(String[] args) {
18 int b4 = 0;
19 int now = 1;
20 int i;
21 int n;
22 System.out.println("\n\nCuantos terminos de la sucesion");
23 System.out.print("de Fibonacci desea que se impriman? ");
24 for (;;){ // hasta que introduca un numero positivo...
25 n = input.nextInt();
26 if (n <= 0){
27 System.out.println("\n\nError en argumento...");
28 System.out.println("Por favor, intente de nuevo.");
29 System.out.println("Introduzca un entero positivo...\n");
30 }
31 break;
32 } // end for
33 for (i = 0 ; i <= n ; i++) {
34 System.out.println("a_" + i + " = " + now);
35 now = b4 + now;
36 b4 = now - b4;
37 }
38 }
39 }
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
42 Tareas en Java
. 1/ni/ .
Detector de n umeros primos
Objetivo:
Escribir un programa en ANSI-C
2
al cual el usuario dene un n umero entero
positivo : y el programa determina si es o no primo.
Por ejemplo,
1876953 = 3 13 17 19 149
donde todos los factores son primos.
Calicaci on:
La tarea vale por m aximo cinco (5) puntos. Es importante entregar c odigo que por
lo menos compile, a un si no ejecuta. Si el programa no calcula bien el resultado,
el m aximo posible es 2 puntos.
Retos para los avanzados
Vericar que la entrada sea v alida.
Insistir por otra entrada hasta que sea v alida.
Permitir que el usuario pida por varios valores de :.
Ampliar el rango de entradas por cambiar tipos de datos.
Imprimir todos los factores de : si no es primo, o sea, : como un producto
de n umeros primos.
Hacer la factorizaci on recursivamente.
Optimizar el algoritmo de soluci on por eliminar operaciones redundantes.
Estudiar las matem aticas de los n umeros primos para implementar m etodos
m as avanzados.
Para esta tarea considero la siguiente denici on:
Denici on 4.2.3.
N .Vino PniVo
Es un n umero natural que tiene exactamente dos divisores naturales.
2
Este c odigo compila y funciona correctamente en el JCreator Ver. 4.50.010con JDK 6.
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
4.2 Tarea 2 43
Esto signica que el n umero 1 NO es primo, dado que tiene solamente un divisor.
No se requiere, pero para no dejar a un lado:
Denici on 4.2.4.
N .Vino CoVi.iso
Es un n umero natural que tiene m as de dos divisores naturales.
De nuevo, el n umero 1 NO es compuesto, pues NO tiene m as de dos divisores
naturales.
Vericar si un n umero es primo. o
Enseguida se muestra el programa en el lenguaje Java.
1 /
**
2
*
@(#)primos.java
3
*
4
*
5
*
@author: Efra n Soto Apolinar
6
*
@version 1.00
7
*
Fecha: 26 de marzo de 2008.
8
*
/
9 import java.util.Scanner;
10
11 public class primos {
12 static Scanner input = new Scanner(System.in);
13 /
**
14
*
Creates a new instance of <code>primos</code>.
15
*
/
16 public primos() {
17 }
18
19 /
**
20
*
@param args the command line arguments
21
*
/
22 public static void main(String[] args) {
23 // TODO code application logic here
24 int n, N, i, j, divisor, prime;
25 int[] factor = new int[20];
26 System.out.print("\nEste programa calcula indica si");
27 System.out.print("\nun numero dado es primo o no...\n");
28 for(;;){ // Hasta que ingrese un entero positivo
29 System.out.print("\n\nIngresa un entero positivo: ");
30 n = input.nextInt();
31 if (n <= 0){
32 System.out.println("\n\nError en argumento...");
33 System.out.println("Por favor, intente de
34 nuevo...");
35 System.out.println("Introduzca un entero positivo.");
36 continue;
37 }
38 break;
39 }
40 //
41 N = n; // Nueva variable para modificarla...
42 // verifico que el numero ingresado sea positivo...
43 if (n<0){
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
44 Tareas en Java
44 System.out.print("\nError en argumento...");
45 System.out.print("\nPor favor, introduce un numero
46 entero positivo...");
47 return;
48 }
49 if (n==1){
50 System.out.print("\nEl numero 1 No es primo...");
51 System.out.print("...pero tampoco es compuesto...");
52 return;
53 }
54
55
56 prime = 0; // Supongo que el numero NO es primo...
57 i = 0; //Inicio el indice del arreglo
58
59 // Reinicio el arreglo factor[20]
60 for (j=0;j<=19;j++){
61 factor[j]= 0;
62 }
63
64 // verifico que no sea par...
65 divisor = 2;
66 while (N%2 == 0){
67 factor[i]=divisor;
68 i++;
69 prime = 1;
70 N = N/divisor;
71 }
72 // verifico que no se divida por impares...
73 divisor = 3;
74 while (N >= divisor){
75 while (N%divisor == 0){
76 factor[i]=divisor;
77 i++;
78 prime = 1;
79 N = N / divisor;
80 }
81 divisor = divisor + 2;
82 if (divisor%3 == 0) divisor = divisor + 2;
83 }
84
85 // Ahora imprimo los factores...
86 if (i>=2){
87 System.out.print("\n\n\nEl numero " + n + "
88 no es primo...\n\n\n");
89 // reinicio el indice i
90 j = 0;
91 System.out.print("\n\n\n" + n + " = ");
92 for (j=0;j<i;j++){
93 System.out.print(factor[j]);
94 if (factor[j+1]!=0){
95 System.out.print("
*
");
96 }
97 }
98 System.out.print("\n\n\n");
99 }
100 if (i == 1){
101 System.out.print("El numero " + n + "
102 es primo...\n\n\n");
103 }
104 }
105 }
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
4.3 Tarea 3 45
1/ni/
Piedra, papel y tijera
Objetivo:
Escribir un programa en ANSI-C que juega interactivamente piedra-papel-tijera
con el usuario.
Calicaci on:
La tarea vale por m aximo cinco (5) puntos. Es importante entregar c odigo que por
lo menos compile, a un si no ejecuta. Si el programa no funciona bien, el m aximo
posible es 2 puntos.
Retos para los avanzados:
Vericar que la entrada sea v alida.
Insistir por otra entrada hasta que sea v alida.
Hacer observaciones de c omo distribuyen los puntos por ganar en tiempo
al repetir el juego.
Desarrollar inteligencia articial, o sea, hacer que el programa sepa jugar
y no simplemente elija al azar.
Juego Piedra papel tijera. o
Enseguida se muestra el c odigo de este programa en el lenguaje Java:
1 /
**
2
*
@(#)tres.java
3
*
4
*
5
*
@author: Efra n Soto Apolinar.
6
*
@date: 27 de marzo de 2008.
7
*
/
8 import java.util.Scanner;
9
10 public class tres {
11 static Scanner input = new Scanner(System.in);
12 /
**
13
*
Creates a new instance of <code>tres</code>.
14
*
/
15 public tres() {
16 }
17
18 /
**
19
*
@param args the command line arguments
20
*
/
21 public static void main(String[] args) {
22 // TODO code application logic here
23 int usuario,compu;
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
46 Tareas en Java
24 //
25 System.out.print("\n\n\nEste programa juega interactivamente");
26 System.out.print("\n\n\nPiedra - Papel o tijera");
27 System.out.print("\ncon el usuario...");
28
29 for (;;){ // for infinito
30 System.out.print("\n\n1 representa piedra...");
31 System.out.print("\n2 representa papel...");
32 System.out.print("\n3 representa tijera...");
33 System.out.print("\nPresiona 0 para salir...");
34 System.out.print("\n\nIntroduce tu jugada...");
35 usuario = input.nextInt();
36
37 if (usuario == 0){ // hay que salir...
38 System.out.print("\n\nPresionaste <<0>>...");
39 System.out.print("\n\nAdios...\n\n");
40 break;
41 }
42 //
43 //compu = (rand() % 3) + 1;
44 //
45 if ((usuario == 1)){
46 System.out.print("\n\nyo elijo papel....");
47 System.out.print("\n\nYo gano!!!\n");
48 continue;
49 }
50
51 if (usuario == 2){
52 System.out.print("\n\nyo elijo tijera....");
53 System.out.print("\n\nYo gano!!!\n");
54 continue;
55 }
56
57 if (usuario == 3){
58 System.out.print("\n\nyo elijo piedra....");
59 System.out.print("\n\nYo gano!!!\n");
60 continue;
61 }
62
63 System.out.print("\nError en Argumento...\n");
64 System.out.print("\nPor favor, intenta de nuevo...\n\n\n");
65
66 } // termina el for...
67
68 }
69 }
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
4.4 Tarea 4 47
1/ni/
Aproximaci on de
Enseguida se muestra el c odigo de este programa en el lenguaje Java:
1 /
**
2
*
@(#)cuatro.java
3
*
4
*
5
*
@author: Efra n Soto Apolinar
6
*
@date: 27 de marzo de 2008.
7
*
/
8 import java.util.Scanner;
9
10 public class cuatro {
11 static Scanner input = new Scanner(System.in);
12 /
**
13
*
Creates a new instance of <code>cuatro</code>.
14
*
/
15 public cuatro() {
16 }
17
18 /
**
19
*
@param args the command line arguments
20
*
/
21 public static void main(String[] args) {
22 // TODO code application logic here
23
24 double approx = 0, a;
25 int i,n;
26 //
27 System.out.print("\nEste programa calcula una aproximacion");
28 System.out.print("\ndel valor de PI usando la formula de");
29 System.out.print("\nBailey - Borwein - Plouffe...");
30 System.out.print("\nIntroduce el valor de n: ");
31 n = input.nextInt();
32 //
33 for (i = 0 ; i < n ; i++){
34 a = approx;
35 approx=approx+(4.0/(8.0
*
i + 1.0)-2.0/(8.0
*
i + 4.0)
36 - 1.0/(8.0
*
i + 5.0) - 1.0/(8.0
*
i + 6.0))
*
37 Math.pow(1.0/16.0,i);
38 System.out.print("\nIteracion " + (i+1) + " = " + approx);
39 if (a == approx){
40 System.out.print("\n\nSolamente se realizaron "
41 + i + " iteraciones\n");
42 System.out.print("porque el valor de la
43 aproximaci on no cambia.\n");
44 break;
45 }
46 }// Termina el for...
47 System.out.print("\n\n\nEl valor aproximado es: " + approx);
48 }
49 }
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
48 Tareas en Java
1/ni/
Factoriales y aproximaci on del n umero e
Objetivo: Escribir en ANSI-C un programa que calcula una aproximaci on de e
utilizando su expansi on Taylor ecuaci on:
1 + 1 +
1
2!
+
1
3!
+
1
4!
+
as que el usuario controle de alguna manera la exactitud de la aproximaci on.
Enseguida se muestra el c odigo de este programa en el lenguaje Java:
1 /
**
2
*
@(#)cinco.java
3
*
4
*
5
*
@author: Efra n Soto Apolinar.
6
*
@date: 27 de marzo de 2008
7
*
/
8 import java.util.Scanner;
9
10 public class cinco {
11 static Scanner input = new Scanner(System.in);
12 /
**
13
*
Creates a new instance of <code>cinco</code>.
14
*
/
15 public cinco() {
16 }
17
18 /
**
19
*
@param args the command line arguments
20
*
/
21 public static void main(String[] args) {
22 // TODO code application logic here
23 double e = 0, approx;
24 int i, j, n;
25 double factorial;
26 //
27 System.out.print("\nEste programa calcula una aproximacion");
28 System.out.print("\ndel valor de la base neperiana");
29 System.out.print("\nusando la serie de MacLaurin...");
30 System.out.print("\nIntroduce el numero de iteraciones: ");
31 //
32 n = input.nextInt();
33 //
34 for (i = 0 ; i <= n-1 ; i++){// Iteraciones...
35 // reinicio el factorial...
36 factorial = 1.0;
37 approx = e;
38 for (j = 1; j <= i; j++){ // calculo el factorial...
39 factorial
*
= 1.0 / j;
40 }
41 e += factorial;
42 if (approx == e){
43 System.out.print("\n\nSolamente se realizaron "
44 + i + " iteraciones\n");
45 System.out.print("porque el valor de la aproximaci on
46 no cambia.\n");
47 break;
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
4.5 Tarea 5 49
48 }
49 System.out.print("\nIteracion " + (i+1) + " ---> " + e);
50
51 }// Termina el for...
52 System.out.print("\n\n\nEl valor aproximado es: "
53 + e + "\n\n\n");
54 }
55 }
56
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
50 Tareas en Java
o 1/ni/ o
Coecientes binomiales y el tri angulo de Pascal
Objetivo: Escribir un programa en ANSI-C que produce, seg un la elecci on del
usuario, o el coeciente binomial C(n, k), denido como:

:
l

=
:!
l! (: l)!
con valores de : y l denidos por el usuario, (por ejemplo C(31, 5) = 169 911)
o las primeras : lneas del tri angulo de Pascal: el elemento n umero l la lnea
n umero : del tri angulo es exactamente C(:, l).
Enseguida se muestra el c odigo de este programa en el lenguaje Java:
1 /
**
2
*
@(#)ocho.java
3
*
4
*
5
*
@author: Efra n Soto A.
6
*
@date: 27 de marzo de 2008
7
*
/
8 import java.util.Scanner;
9
10 public class ocho {
11 static Scanner input = new Scanner(System.in);
12 /
**
13
*
Creates a new instance of <code>ocho</code>.
14
*
/
15 public ocho() {
16 }
17
18 /
**
19
*
@param args the command line arguments
20
*
/
21 public static void main(String[] args) {
22 int i,j,n; // contadores
23 long[] now = new long[100]; // coeficientes actuales
24 long[] b4 = new long[100]; // coeficientes anteriores
25 //
26 System.out.print("\n\nEste programa imprime los renglones del");
27 System.out.print("\ntriangulo de Pascal...");
28
29 for(;;){
30 System.out.print("\n\nIndique el numero de renglones a
31 imprimir: ");
32 n = input.nextInt();
33 if (n > 99){
34 System.out.print("\n\nEl valor de n no debe ser mayor
35 a 99...");
36 System.out.print("\nIntente de nuevo...");
37 }
38 else{
39 break;
40 }
41 } // endfor...
42 // reinicio los arreglos
43 for (i = 0 ; i < 100 ; i++){
44 now[i] = 0;
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
4.6 Tarea 8 51
45 b4[i] = 0;
46 }
47
48 // inicio con los coeficientes binomiales...
49 System.out.print("\t1\n\n");
50 for (j = 1 ; j < n ; j++){ // Renglones...
51 // reinicio los valores de los arreglos...
52 now[0] = 1;
53 b4[0] = 1;
54 b4[1] = j - 1;
55 System.out.print("\t1"); // primer valor del renglon
56
57 for (i = 1 ; b4[i+1] != 0 ; i++){ // Coeficientes
58 now[i] = b4[i] + b4[i-1];
59
60 if (now[i] <= 0){ // verifico valor negativo...
61 System.out.print("\n\n\nLo siento... se sobrepaso
62 la memoria...\n");
63 return;
64 }
65 System.out.print ("\t " + now[i]);
66 }
67
68 now[i+1] = 1; // imprimo el ultimo valor del renglon...
69 System.out.print("\t " + now[i+1]);
70
71 for(i = 0 ; i <= j+1 ; i++){ // transfiero la informacion
72 b4[i] = now[i];
73 }
74 System.out.print("\n");
75 }
76 }
77 }
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
52 Tareas en Java
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
5
Conceptos de Java
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
54 Conceptos de Java
Cociios ni Java
5.1.1 Funciones Matem aticas
Estas funciones est an denidas en la clase Math.
!
Funci on Devuelve:
abs(arg) el valor absoluto de arg siendo un int, float, double.
cbrt(arg) la raz c ubica de arg, siendo arg un double.
exp(arg) exp(arg), donde arg es un double.
hypot(arg1, arg2) la hipotenusa de un t. rect. con catetos arg1, arg2.
log(arg) ln(cr), siendo arg un double.
log10(arg) log
10
(cr), siendo arg un double.
max(arg1, arg2) el m aximo de arg1 y arg2. (int, float, double)
min(arg1, arg2) el mnimo de arg1 y arg2. (int, float, double)
pow(arg1,arg2) arg
arg
2
1
, siendo arg1, arg2 doubles.
random() un aleatorio en (0.0, 1.0) con dist. uniforme (double).
signum(arg) el signo de arg, pudiendo ser un float o double.
sqrt(arg) la raz cuadrada de arg (double).
ceil(arg) el menor double que es entero arg.
floor(arg) el mayor double que es entero arg.
rint(arg) el double que es entero m as cercano a arg.
round(arg) redondea arg.
Funciones matem aticas en Java
En el caso de la funci on round(arg), si arg es un double, regresa un long. Si
arg es un float, devuelve un int.
Ejemplo de uso
// Ejemplos dl uso de las funciones matematicas en Java
Math.cbrt(m); // raz cubica de m
Math.exp(x); // devuelve ex
Math.log(1+x); devuelve ln (1+x)
Math.max(10,100); // devuelve 100
Math.min(a,b); // devuelve el minimo entre a y b
Math.pow(x.0,5); // devuelve x5
Math.random(); // genera un pseudoaleatorio en (0,1)
Math.sqrt(36); // devuelve 6.000000
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
6
Proyecto nal
Once your goals are achieved, then what? If you have gotten into
the habit of accomplishments, you will have no desire to a dead stop.
Your new goals would have seemed impossible of achievement previ-
ously; now, you will work toward them with a likelihood of success.
Edwin B. Feldman, P.E.
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
56 Proyecto nal
o Diiiici o
Librera de Estadstica Crear una librera con funciones estadsticas b asicas para
utilizar durante los siguientes semestres de la maestra.
Media / Desviaci on est andar / Varianza
Moda (intervalo de mayor frecuencia)
Gracar el histograma de frecuencias
Ajuste de una recta de regresi on
Ajuste de una par abola de regresi on
Generadores de n umeros pseudoalestorios con las siguientes distribuciones:
Uniforme en el intervalo (0,1),
Uniforme en el intervalo (c, l), denido por el usuario,
Normal con media 00 y desviaci on est andar 10,
Normal con media y desviaci on est andar , denidas por el usuario,
Exponencial con par ametro , denido por el usuario,
Weibull con par ametros de forma t y de escala l, denidos por el
usuario,
Rayleigh con media , denida por el usuario.
La librera se codicar a de manera que se pueda utilizar en el lenguaje C
++
, con
posibilidad de adaptarla al lenguaje ANSI-C.
o. ViiiVi/ci o
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 click derecho con un click derecho con un click derecho con un click derecho con un click derecho con un click derecho con un click derecho con un click derecho con un click derecho con un click derecho con un click derecho con un click derecho con un click derecho con un click derecho con un click derecho con un click derecho con un click 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 :
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.
9
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
6.2 Implementaci on 57
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
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[]);
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
58 Proyecto nal
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[]);
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 }
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
6.2 Implementaci on 59
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;
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++){
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 }
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
60 Proyecto nal
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
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;
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
6.2 Implementaci on 61
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;
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)
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
62 Proyecto nal
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
**********************************************
/
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();
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 }
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
6.2 Implementaci on 63
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
***************************************
/
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
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
64 Proyecto nal
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
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;
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
6.2 Implementaci on 65
554 double comparador;
555 double u;
556 do{
557 u = (double)(rand()) / (double)(RAND_MAX);
558 comparador
*
= p
*
u;
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
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)
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
66 Proyecto nal
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:
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
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
6.2 Implementaci on 67
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
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
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
68 Proyecto nal
758 Rayleigh\n");
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
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;
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
6.2 Implementaci on 69
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:
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
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
70 Proyecto nal
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 //}
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
959 int imax, imin;//
960 double vmax = -2147483647, vmin = 2147483647;
961 double anchoIntervalo; // = vmax - vmin
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
6.2 Implementaci on 71
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;
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
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
72 Proyecto nal
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){
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
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
6.2 Implementaci on 73
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...
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
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 >>.
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
74 Proyecto nal
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){
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
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
6.2 Implementaci on 75
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:
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]++;
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
76 Proyecto nal
1302 break;
1303 }
1304 }
1305 break;
1306 case : // espacio en blanco...
1307 if (i > 1){
1308 dato[i] = \0; // fin del arreglo
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++){
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]);
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
6.2 Implementaci on 77
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
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)){
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
78 Proyecto nal
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
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
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
6.2 Implementaci on 79
1506 fseek(stream_histo, 0, SEEK_SET);
1507 // Volvemos a leer los datos...
1508 // Ahora para generar el histograma
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]++;
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;
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
80 Proyecto nal
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
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.");
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
6.2 Implementaci on 81
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
********************************************************
/
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 /////////////////////////////////////////////////////
1709 BUGS:
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
82 Proyecto nal
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 /////////////////////////////////////////////////////
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);
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
6.2 Implementaci on 83
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...
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
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
84 Proyecto nal
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
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;
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
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
6.2 Implementaci on 85
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.");
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...
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
86 Proyecto nal
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
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);
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
6.2 Implementaci on 87
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;
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 #endif // PROBABILITY_H
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
88 Proyecto nal
o iViios ni .so
En esta secci on se muestra c omo utilizar dentro de programas las funciones que
se denieron anteriormente.
Despu es de cada c odigo se muestra el resultado que imprimi o 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 dem as se omite.
6.3.1 funiforme(total, archivo)
Funci on 6.3.1
void funiforme(int N, char filename[])
Descripci on: Esta funci on guarda ^ n umeros pseudoaleatorios con distribuci on
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));
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
6.3 Ejemplos de uso 89
38 printf("\n\nDesviacion Estandar calculada: %f", desviacionStd(archivo));
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 . . .
6.3.2 funiforme(total, archivo, A, B)
Funci on 6.3.2
void funiforme(int N, char filename[], float a, float b)
Descripci on: Esta funci on guarda ^ n umeros pseudoaleatorios con distribuci on
uniforme en el intervalo (c, l) 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 tambi en un intervalo (^, B)
dendo por el usuario:
1 #include "estadistica.h"
2
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
90 Proyecto nal
3 using namespace std;
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 }
N ote que se agregaron algunas lneas de c odigo para pedir los par ametros ^
y B, que corresponden a los lmites inferior y superior del intervalo donde se
generar an los n umeros pseudoaleatorios con distribuci on 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
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
6.3 Ejemplos de uso 91
6.3.3 fnormal(total, archivo)
Funci on 6.3.3
void fnormal(int N, char filename[])
Descripci on: Esta funci on guarda ^ n umeros pseudoaleatorios con distribuci on
normal con media 0.0 y desviacion est andar 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
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
92 Proyecto nal
6.3.4 fnormal(total, archivo, media, SD)
Funci on 6.3.4
void fnormal(int N, char filename[], float med, float desvStd)
Descripci on: Esta funci on guarda ^ n umeros pseudoaleatorios con distribuci on
normal con media med y desviacion est andar 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
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
6.3 Ejemplos de uso 93
6.3.5 fexponencial(total, lambda, archivo)
Funci on 6.3.5
void fexponencial(int N, float Lambda, char filename[])
Descripci on: Esta funci on genera ^ n umeros pseudoaleatorios con distribuci on
exponencial, con par ametro 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
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
94 Proyecto nal
6.3.6 fgeometrica(total, p, archivo)
Funci on 6.3.6
void fgeometrica(int N, float p, char filename[15])
Descripci on: Esta funci on genera ^ n umeros pseudoaleatorios con distribuci on
geometrica, con par ametro , 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 . . .
6.3.7 fpoisson(total, alpha, archivo)
Funci on 6.3.7
void fpoisson(int N, float a, char filename[])
Descripci on: Esta funci on genera ^ n umeros pseudoaleatorios con distribuci on
poisson, con par ametro , y los graba en el archivo de nombre filename.
1 #include "estadistica.h"
2
3 using namespace std;
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
6.3 Ejemplos de uso 95
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 . . .
6.3.8 fweibull(total, archivo, c, k)
Funci on 6.3.8
void fweibull(int N, char filename[], float C, float K)
Descripci on: Esta funci on genera ^ n umeros pseudoaleatorios con distribuci on
weibull, con par ametros C y |, 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);
18 printf("\n\nParametro C de la distribucion: ");
19 scanf("%f", &C);
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
96 Proyecto nal
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
6.3.9 frayleigh(total, archivo, media)
Funci on 6.3.9
void frayleigh(int N, char filename[], float M)
Descripci on: Esta funci on genera ^ n umeros pseudoaleatorios con distribuci on
rayleigh, con media ^ 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");
15 printf("- desviacionStd(char filename[]),\n");
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
6.3 Ejemplos de uso 97
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
6.3.10 histograma(archivo, intervalos)
Funci on 6.3.10
histograma(char filename[], int No Int)
Descripci on: Esta funci on genera un histograma de No Int intervalos en la pan-
talla 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");
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
98 Proyecto nal
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 pron ostico del recurso
e olico de un local.
En este caso, la energa el ectrica que se puede producir utilizando un generador
e olico es proporcional al cubo de la velocidad.
Cuando la velocidad del viento vara en un 25.99%, la cantidad de energa pro-
ducida con el viento aumenta al doble, debido a que
3

2 12599. Por esa misma


raz on, 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 producida
aumenta al triple, porque
3

3 14422.
Entonces, distribuci on m as suave nos permite calcular un pron ostico de la energa
producida por un generador e olico con mayor precisi on.
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
6.3 Ejemplos de uso 99
Otro ejemplo, donde se hace evidente la cantidad de informaci on extra que mues-
tra esta funci on 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)
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
100 Proyecto nal
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 m as intervalos conozcamos, podremos hacer c alculos
m as renados y tener resultados m as precisos. Mientras el primer histograma
(10 intervalos) nos indica alguna informaci on, no se compara con el nivel de
detalle que nos proporciona el ultimo histograma (30 intervalos). Si hacemos
el pron ostico de la energa producida en un a no a partir de las probabilidades
asignadas a cada intervalo, los resultados ser an 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 pron ostico. Tomando el punto
medio de cada intervalo, elev andolo al cubo y multiplicando por la probabilidad
que le corresponde a ese intervalo, tendremos una aproximaci on simplicada del
resultado (falta considerar cuestiones t ecnicas relativas al generador e olico, al-
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
6.3 Ejemplos de uso 101
gunas cuestiones de conversi on de la energa cin etica del viento a la electricidad
generada por el generador e olico, etc.) y podemos ver la gran diferencia en cada
caso.
No/ Los datos que se introdujeron en el ultimo ejemplo corresponden a la
distribuci on que presenta la velocidad de viento en la Venta, Oaxaca, Mex. Fuente:
Evaluaci on del recurso e olico de La Venta, Juchit an, Oaxaca. M. A. Borja, O. A.
Jaramillo, M. F. Morales. Instituto de Investigaciones El ectricas. Temixco, Morelos,
M exico. ojs@iie.org.mx. El valor 525 600 = 6024365, el n umero de minutos
en un a no no bisiesto. Entonces, el valor que aparece entre par entesis indica el
n umero de minutos al a no que la velocidad present o una velocidad en el intervalo
que le corresponde.
El promedio calculado con la ayuda de la funci on media(archivo) corresponde
a la media aritm etica de los datos. No considera la frecuencia relativa por la
cual debe multiplicarse para realizar este c alculo. Histogramas con mayores
intervalos nos muestran informaci on que nos ayudar an, en este caso, a pronosticar
con mayor precisi on el valor buscado, dado que tendremos una curva m as 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]
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
102 Proyecto nal
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)
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
6.3 Ejemplos de uso 103
6.3.11 PchiUniforme(archivo, No Int)
Funci on 6.3.11
void PchiUniforme(char filename[], int Num Int)
Descripci on: Esta funci on sirve de apoyo en la prueba de bondad de ajuste
que los datos contenidos en el archivo de nombre filename presenten una dis-
tribuci on 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)
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
104 Proyecto nal
Intervalo 0.8 -- 0.9 |||||||||||||||||||||||||||||||||| (1358)
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 distribuci on normal est andar.
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 . . .
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
6.3 Ejemplos de uso 105
6.3.12 PchiNormal(archivo, No Int)
Funci on 6.3.12
void PchiNormal(char filename[], int Num Int)
Descripci on: Esta funci on sirve de apoyo en la prueba de bondad de ajuste
que los datos contenidos en el archivo de nombre filename presenten una dis-
tribuci on normal, calculando el valor de
2
. La funci on calcula la media y la
desviaci on est andar de los datos contenidos en el archivo y los utiliza para re-
alizar el c alculo 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)
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
106 Proyecto nal
Intervalo 1.6 -- 1.8 | (15)
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 . . .
6.3.13 PchiExponencial(archivo, Num Int, lambda)
Funci on 6.3.13
void PchiExponencial(char filename[], int Num Int, float lambda)
Descripci on: Esta funci on sirve de apoyo en la prueba de bondad de ajuste
que los datos contenidos en el archivo de nombre filename presenten una dis-
tribuci on normal, calculando el valor de
2
. La funci on calcula la media y la
desviaci on est andar de los datos contenidos en el archivo y los utiliza para re-
alizar el c alculo de
2
.
1 #include "estadistica.h"
2 using namespace std;
3 int main(void){
4 int total; // n umeros a generar...
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
6.3 Ejemplos de uso 107
5 char archivo[15]; // nombre del archivo...
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 distribuci on uniforme.
En la lnea 10 del c odigo se indica a la funci on que suponemos que el archivo
contiene datos con distribuci on exponencial con par ametro = 30
1 #include "estadistica.h"
2 using namespace std;
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
108 Proyecto nal
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 . . .
6.3.14 PchiWeibull(Archivo, Num Int, C, K)
Funci on 6.3.14
void PchiWeibull(char filename[], int Num Int, float c, float k)
Descripci on: Esta funci on prueba que los datos contenidos en el archivo de
nombre filename presenten una distribuci on Weibull con par ametro 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);
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
6.3 Ejemplos de uso 109
15 PchiWeibull(archivo, 15, C, K);
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 distribuci on 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)
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
110 Proyecto nal
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 . . .
6.3.15 PchiRayleigh(archivo, Num Int, media)
Funci on 6.3.15
void PchiRayleigh(char filename[], int Num Int, float Media)
Descripci on: Esta funci on prueba que los datos contenidos en el archivo de nom-
bre filename presenten una distribuci on exponencial con par ametro . 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 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
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
6.3 Ejemplos de uso 111
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 . . .
6.3.16 RL(archivo)
Funci on 6.3.16
void RL(char filename[])
Descripci on: Esta funci on calcula la recta 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 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 . . .
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
112 Proyecto nal
6.3.17 RC(archivo)
Funci on 6.3.17
void RC(char filename[])
Descripci on: Esta funci on calcula la par abola 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 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 utiliz o el archivo test.txt que contiene la
siguiente informaci on:
# 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
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
6.3 Ejemplos de uso 113
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...
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
114 Proyecto nal
o On/s i.ciois
Las siguientes son funciones que est an incluidas en el archivo estadistica.h.
Las funciones antes mencionadas utilizan las funciones denidas en esta secci on
para generar n umeros pseudoaleatorios con distibuciones dadas conocidos sus
par ametros (en caso de que se requiera indicar).
6.4.1 uniforme()
Funci on 6.4.18
double uniforme(void)
Descripci on: Esta funci on genera un n umero pseudoaleatorio con distribuci on
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 . . .
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
6.4 Otras funciones 115
6.4.2 uniforme(a,b)
Funci on 6.4.19
double uniforme(float a, float b)
Descripci on: Esta funci on genera un n umero pseudo-aleatorio con distribuci on
uniforme en el intervalo (c, l).
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 . . .
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
116 Proyecto nal
6.4.3 weibull(c,k)
Funci on 6.4.20
double weibull(double c, double k)
Descripci on: Esta funci on genera n umeros pseudoaleatorios con distribuci on
Weibull. Los par ametros t y l corresponden a la forma y escala de la distribuci on,
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
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
6.4 Otras funciones 117
25, 0.825961
Presione una tecla para continuar . . .
6.4.4 rayleigh(media)
Funci on 6.4.21
double rayleigh(float media)
Descripci on: Esta funci on genera n umeros pseudoaleatorios con distribuci on
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
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
118 Proyecto nal
Generado: 13.603776
Generado: 18.738855
Generado: 18.148271
Generado: 1.454668
Generado: 12.172394
Generado: 19.752192
Generado: 31.368345
Generado: 29.418927
Presione una tecla para continuar . . .
6.4.5 normal()
Funci on 6.4.22
double normal(void)
Descripci on: Esta funci on genera n umeros pseudoaleatorios con distribuci on
uniforme con media = 0.0 y desviacionStd = 1.0, es decir, distribuci on 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
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
6.4 Otras funciones 119
18, 1.866092
19, 0.226821
20, -0.366759
21, -0.075148
22, 0.268215
23, 0.695651
24, -0.114387
25, 0.136725
Presione una tecla para continuar . . .
6.4.6 normal(media, desviacionStd)
Funci on 6.4.23
double normal(double media, double desviacionStd)
Descripci on: Esta funci on genera n umeros pseudoaleatorios con distribuci on
uniforme con media media y desviaci on est andar 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
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
120 Proyecto nal
12, 75.254955
13, 126.539363
14, 87.838215
15, 90.545373
16, 111.811334
17, 109.066489
18, 122.393108
19, 102.721846
20, 95.598887
Presione una tecla para continuar . . .
6.4.7 exponencial(lambda)
Funci on 6.4.24
float exponencial(float lambda)
Descripci on: Esta funci on genera n umeros pseudoaleatorios con distribuci on
exponencial y par ametro 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
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
6.4 Otras funciones 121
15, 0.724797
16, 0.030196
17, 0.191707
18, 0.906535
19, 0.318725
20, 0.362801
21, 8.935176
22, 1.180071
23, 0.253584
24, 0.009361
25, 0.017903
Presione una tecla para continuar . . .
6.4.8 geometrica(p)
Funci on 6.4.25
int geometrica(float p)
Descripci on: Esta funci on genera n umeros pseudoaleatorios con distribuci on
geometrica de par ametro .
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
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
122 Proyecto nal
Generado: 7
Generado: 5
Generado: 4
Generado: 0
Generado: 6
Generado: 3
Generado: 2
Generado: 0
Generado: 0
Generado: 0
Generado: 1
Generado: 0
Generado: 0
Generado: 15
Generado: 1
Generado: 0
Generado: 0
Generado: 0
Presione una tecla para continuar . . .
6.4.9 poisson(alpha)
Funci on 6.4.26
int poisson(float alpha)
Descripci on: Esta funci on genera n umeros pseudoaleatorios con distribuci on
Poisson de par ametro .
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
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
6.4 Otras funciones 123
Generado: 1
Generado: 598
Generado: 593
Generado: 579
Generado: 655
Generado: 585
Generado: 611
Generado: 604
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 . . .
6.4.10 media(archivo), desviacionStd(archivo)
Funci on 6.4.27
double media(char filename[])
Descripci on: Esta funci on calcula la media aritm etica de los datos contenidos
en el archivo de nombre filename.
Funci on 6.4.28
double desviacionStd(char filename[])
Descripci on: Esta funci on calcula la desviaci on est andar de los datos contenidos
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");
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
124 Proyecto nal
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)
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...
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
7
Procesos Estocasticos
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
126 Procesos Estoc asticos
, 'iV.i/ci o ni i/ nisniu.ci o ui
oVi/i
Utilizando ANSI-C y las funciones de generaci on de n umeros pseudoaleatorios,
escribe un programa que por simulaci on y la ley de grandes n umeros aproxima
la distribuci on binomial con : y para todos los valores de l = 0, 1, 2, , :.
Incluye en tu respuesta el c odigo que escribiste junto con un dibujo preparado
con gnuplot de la distribucion Bin(:, ) con los valores denidos para : y .
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);
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
7.1 Simulaci on de la distribuci on binomial 127
37 printf("\n\nValores teoricos:\n");
38 for(i = 0 ; i < 16 ; i++){
39 printf("\nk = %i, p = %f,", i, binomial(p,N,i));
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...
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
128 Procesos Estoc asticos
87 Voy a realizar n exprimentos de Bernoulli
88 p = probabilidad de exito
89 N = numero de ensayos por experimento
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.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
7.2 Din amica de poblaciones 129
,. Di/Vic/ ni ioui/ciois
Tama no de poblaci on
Con una simulaci on (programado por ti en la herramienta/lenguaje de tu elecci on
como ya vimos en clase) para un proceso simple de nacimiento y muerte
en tiempo discreto, prepara con gnuplot una gr aca que muestra el desarrollo
tpico (o por promediar o por sobreponer varias, como quieras) del tama no de la
poblaci on sobre el tiempo.
Enseguida se enlista el c odigo del programa:
/*
Nombre del archivo: population.c
Simulacion de la dinamica de poblaciones
Fecha de ultima modificacion: 26 de agosto de 2008
Autor: Efrain Soto Apolinar.
efrain@yalma.fime.uanl.mx
efra.soto.a@gmail.com
Con una simulacion (programado por ti en la herramienta/lenguaje
de tu eleccion | como ya vimos en clase) para un proceso simple
de nacimiento y muerte en tiempo discreto, prepara con gnuplot
una grafica que muestra el desarrollo tipico (o por promediar o
por sobreponer varias, como quieras) del tama~no de la poblacion
sobre el tiempo.
*/
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
double uniforme(void);
int main(int argc, char** args){
int i = 0; // contadores
double p = 0.4; // probabilidad de nuevo nacimiento
double q = 0.5; // probabilidad de muerte
double eq = 1 - p - q; // probabilidad de quedar igual
double r; // numero aleatorio
int N = 50; // poblacion inicial
int MAXP = 100 * N; // poblacion final
// para el manejo del archivo...
FILE *stream_f; //
stream_f = fopen("pop.txt", "w"); // abrir para lectura
if (stream_f == NULL){
printf ("\nNo se puede abrir el archivo <<datos.txt>>\n");
printf("\nPor favor, verifique el nombre archivo");
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
130 Procesos Estoc asticos
}
srand(unsigned(time(0)));
printf("\nEspere por favor...\n");
printf("\nSimulando dinamica de la poblacion...");
while (N > 0 && N < MAXP){
r = uniforme();
if (r <= p){
// Felicidades! nacio un changuito
N++;
}
if (r > p && r <= p + q){
// Desgracia, un changuito fue devorado
N--;
}
//if (r > p + q){
// Nadie nacio...
// Nadie murio...
//}
// guardo en archivo...
if(i % 25 == 0){
fprintf(stream_f, "\n%i \t%i",i, N);
}
i++;
if (i > 10000){
break;
}
}
fclose(stream_f);
printf("\nSimulacion exitosa...");
return 0;
}
/*-----------------------------------------------
Funcion para generar uniformes (0,1)
-------------------------------------------------*/
double uniforme(void){
double u;
u = 1.0 * rand() / RAND_MAX;
return u;
}
Enseguida se muestran las gr acas de 10 corridas.
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
7.2 Din amica de poblaciones 131
i
0 100 200 300 400 500
|(i)
10
20
30
40
50
60
En la gr aca, |(i) representa la poblaci on en el tiempo i, que representa la
i esima iteraci on del algoritmo. Los puntos marcados (i, |(i)) son los valores
que se grabaron en el archivo pop.txt. Estos datos se fueron recolectando cada
25 iteraciones (valores de i). Las gr acas que se muestran NO llegan a tocar el
eje horizontal i, porque la simulaci on termin o antes de llegar al valor de i que
es m ultiplo de 25, es decir, |(i) se hizo cero antes.
Evidentemente, debido a que la tasa de nacimiento ( = 04) es inferior a la tasa
de muerte ( = 05), al largo plazo, esperamos que la especie se extinga.
Probabilidad de extinci on y sobrepoblaci on
Estima con la simulaci on la probabilidad de que se muera la poblaci on comple-
tamente, igual como la probabilidad de sobrepoblaci on (o sea, su tama no crece
innitamente).
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
132 Procesos Estoc asticos
Se modic o el programa anterior para realizar la simulaci on m ultiples veces y
vericar en cu antos casos la poblaci on se extingue, en cu antos casos la poblaci on
crece mucho. A partir de esos valores podemos aproximar la probabilidad de
extinci on con los valores de , antes mencionados.
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
double uniforme(void);
int main(int argc, char** args){
int i = 0, j; // contadores
double p = 0.4; // probabilidad de nuevo nacimiento
double q = 0.5; // probabilidad de muerte
double eq = 1 - p - q; // probabilidad de quedar igual
double r; // numero aleatorio
int N = 50; // poblacion inicial
float n; // poblacion inicial escalada para LaTeX2e
float x; // i escalada para LaTeX2e
int MAXP = (int)(1.25 * N); // poblacion final
int total = 100000; // total de corridas...
int ext = 0; // total de extincion de poblacion
int sob = 0; // total de sobrepoblacion
//
srand(unsigned(time(0)));
printf("\nEspere por favor...\n");
printf("\nSimulando dinamica de la poblacion...");
for(j = 1; j <= total ; j++){
while (N > 0 && N < MAXP){
r = uniforme();
if (r <= p){
// Felicidades! nacio un changuito
N++;
}
if (r > p && r <= p + q){
// Desgracia, un changuito fue devorado
N--;
}
i++;
}
if (N == 0){
// extincion...
ext++;
}
if (N > MAXP){
// sobrepoblacion
sob++;
}
}
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
7.2 Din amica de poblaciones 133
printf("\nSimulacion exitosa...");
printf("\nTotal de extinciones: %i", ext);
printf("\nTotal Sobrepoblaciones: %i", sob);
printf("\nTotal de simulaciones: %i", j-1);
printf("\n\n\a");
return 0;
}
/*-----------------------------------------------
Funcion para generar uniformes (0,1)
-------------------------------------------------*/
double uniforme(void){
double u;
u = 1.0 * rand() / RAND_MAX;
return u;
}
Los resultados que se obtuvieron con el programa son los siguientes:
Espere por favor...
Simulando dinamica de la poblacion...
Simulacion exitosa...
Total de extinciones: 100000
Total Sobrepoblaciones: 0
Total de simulaciones: 100000
De acuerdo a esta simulaci on, de las 100 000 veces que se simul o la din amica
de la poblaci on, cero veces hubo sobrepoblaci on, que en este caso, equivaldra a
que la poblaci on creciera un 25% arriba de la poblaci on inicial (50).
Inicialmente consider e como sobrepoblaci on el caso en el que la poblaci on creciera
5 veces m as que la poblaci on inicial. Debido a que obtena cero sobrepoblaciones
fui disminuyendo el factor para que hubiera mayor posibilidad de tener al menos
algunos casos de sobrepoblaci on.
Conclusi on:
Probabilidad de extinci on de la poblaci on: 1.
Probabilidad de sobrepoblaci on: 0.
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
134 Procesos Estoc asticos
, C/Vi// /ii/oni/ souni . cn/io
Usando un programa que genera un grafo aleatorio desde dos par ametros: el
n umero de v ertices : y la probabilidad de conexi on , estudia experimentalmente
los siguientes aspectos sobre la caminatas aleatorias en grafos.
El dise no experimental es libre, pero hay que documentarlo. Es recomendable
usar cuadros y gr acas en la respuesta para mayor claridad.
El c odigo del programa que en el lenguaje ANSI-C que simula la caminara aleato-
ria se encuentra enlistado al nal de esta secci on, junto con un ejemplo del
desempe no del mismo.
Las partes de esta tarea son:
Efecto del estado inicial
C omo afecta el estado inicial el comportamiento de la caminata en el largo plazo?
Intenta explicar por qu e ocurre lo que ocurre.
Antes de iniciar con los experimentos creo que el algoritmo, evidentemente visi-
tar a m as veces los nodos que tienen m as vecinos, porque cada nodo tiene prob-
abilidad de ser visitado proporcional al grado de el mismo. En otras palabras
espero que la frecuencia de visita de cada nodo sea directamente proporcional a
su grado.
Pero el nodo inicial nada tiene que afectar a la caminata aleatoria, porque en
cuanto llega a un nodo con un grado relativamente alto, el algoritmo se resetea
en el sentido de que la historia pasada no le afecta, porque tanto pudo haber
llegado de un nodo con grado bajo (cercano a 1) o de un nodo con grado alto.
As que el nodo inicial no afecta el desempe no del algoritmo y del nodo nal de
la caminata aleatorial.
Frecuencias de visita
Qu e tipo de relaci on observas entre la frecuencia de visitas al v ertice v y el
grado deg(v)? Intenta explicar por qu e ocurre lo que ocurre.
Un ejemplo de corrida sirve para mostrar los argumentos que se dieron en el
inciso anterior.
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
7.3 Caminata aleatoria sobre un grafo 135
Introduzca el numero de nodos:
(Numero entero positivo): 10
Introduzca la probabilidad de conexion:
(Numero entre 0 y 1): 0.4
Se muestra la matriz que representa la red:
0 1 0 0 0 1 0 1 1 0 Grado: 4
1 0 0 0 0 1 0 1 0 0 Grado: 3
0 0 0 1 0 1 0 0 0 1 Grado: 3
0 0 1 0 0 1 1 0 0 0 Grado: 3
0 0 0 0 0 1 0 0 0 1 Grado: 2
1 1 1 1 1 0 0 0 0 0 Grado: 5
0 0 0 1 0 0 0 0 0 1 Grado: 2
1 1 0 0 0 0 0 0 0 1 Grado: 3
1 0 0 0 0 0 0 0 0 1 Grado: 2
0 0 1 0 1 0 1 1 1 0 Grado: 5
Se iniciara la simulacion de la caminata aleatoria...
Introduzca el numero de pasos a simular: 100
Introduzca el nodo inicial de la caminata: 0
Introduzca el numero de simulaciones: 50
Simulacion exitosa...
Frecuencias de visita:
Nodo: Grado: Frec. Visita total: Frec. Nodo Final:
0 4 619 7
1 3 464 3
2 3 492 6
3 3 477 4
4 2 313 3
5 5 763 4
6 2 315 2
7 3 472 12
8 2 311 3
9 5 774 6
En la columna que corresponde a la frecuencia de visita total a cada nodo, los
nodos con grado menor (4, 6 y 8, con grado 2) son los que tienen las menores
frecuencias de visita total en todas las caminatas aleatorias.
Por otra parte, para los nodos con mayor grado (5 y 9 con grado 5), las frecuen-
cias de visita total son las mayores de todos los nodos, lo que apoya mi previo
argumento (inciso anterior).
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
136 Procesos Estoc asticos
Cercana
Sin poder explcitamente ver un grafo imagina que un adversario lo tiene y no
te lo quiere mostrar ni te dice cu antos v ertices tiene el grafo en total pero con
permiso para realizar tantas caminatas aleatorias que quieras en ello y obtener
las frecuencias de visitas a todos los v ertices (el adversario te los corre y reporta
los resultados), c omo estimaras cu ales v ertices del grafo est an en alg un sentido
cerca del v ertice n umero uno?
Explica qu e sentido das a cercana en un grafo y si percibes alguna utilidad en
conceptos tipo cercana en grafos y la posibilidad de estimarlos.
Una primera aproximaci on sera, por ejemplo, considerando los resultados en-
listados en el inciso anterior, observar que a pesar de que el nodo 2 tiene una
grado bajo (3), la frecuencia de visitas es el m as alto para los nodos que tienen
esa mismo grado. Esto puede ser un indicador de que este nodo est a conectado
a nodos con grado bajo, de manera que cuando se llega a un nodo vecino este le
da una probabilidad de visitar al nodo 2 m as alta, relativa a la que asignan los
dem as nodos (obviamente, si un nodo no es su vecino, la probabilidad asignada
es cero.)
Por cierto, los vecinos del nodo 2 son: nodo 3 (grado 3), nodo 5 (grado 5) y nodo
9 (grado 5).
Ahondando m as en el inciso anterior (frecuencia de visita), podemos ver que:
En total, la suma de los grados de los nodos es 32. Sabemos que se hicieron
100 50 = 5 000 pasos en todas las caminatas.
A cada arista le corresponden un total de 5 000 32 = 15625 veces que
por ah se pas o en promedio.
Si multiplicamos el grado de cada nodo por 156.25, tendramos el valor
esperado de visitas a cada uno de ellos.
Nodo Grado Esperado Observado Vecinos
0 4 625.00 619 1, 5, 7, 8
1 3 468.72 464 0, 5, 7
2 3 468.72 492 3, 5, 9
3 3 468.72 477 2, 5, 6
4 2 312.50 313 5, 9
5 5 781.25 763 0, 1, 2, 3, 4
6 2 312.50 315 3, 9
7 3 468.72 472 0, 1, 9
8 2 312.50 311 0, 9
9 5 781.25 774 2, 4, 6, 7, 8
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
7.3 Caminata aleatoria sobre un grafo 137
Yo solamente tengo acceso a las columnas 1 y 4. El resto me son descono-
cidas.
Considerando la siguiente
Denici on. Cercana de nodos
Se dice que dos nodos v(i), v(l) de una red est an cerca si para llegar desde
v(l) se requieren a lo m as 2 pasos, es decir, si entre ellos siempre hay un
nodo v(,) intermedio, o tal vez no haya un intermedio, con lo que v(i) sera
un vecino de v(,).
Ahora, si conociera los grados de cada nodo, formara conjuntos de nodos que
tengan el mismo grado. De cada uno de estos, los que tengan mayor frecuencia
de visita, a pesar de tener la misma frecuencia, tienen mayor probabilidad de ser
vecino de otro cualquiera, porque tienen m as aristas. En ese caso, podra decir
que tienen mayor probabilidad de ser vecino de cero el nodo l si a pesar de
tener el mismo grado que el v ertice ,, tiene una mayor frecuencia de visita. Pero
yo desconozco esta informaci on.
Pero si conozco la frecuencia de visitas en la caminata aleatoria, esta informaci on
me indica de una manera el grado de cada nodo. As, de una manera menos
precisa que el m etodo anterior, donde conoca el grado de cada nodo, puedo
decir que los vecinos m as probables del nodo l son aquellos que tienen mayor
frecuencia de visita durante la caminata aleatoria.
Aparte de eso, considerando la denici on dada de cercana, podemos realizar
(si nos es permitido) caminatas de dos o tres pasos a lo m as. En este caso
recorreremos con mayor frecuencia los nodos que est an muy cerca del nodo en
estudio.
Si no nos es permitido cambiar la longitud del horizonte de la caminata, no se
me ocurre algo m as.
Implementaci on del c odigo Para la simulaci on se utiliz o siempre la misma red,
una vez que se generaba esta de manera aleatoria.
A continuaci on se enlista el c odigo del programa en el lenguaje ANSI-C que se
utiliz o para encontrar los anteriores resultados experimentales.
Puede acce-
der al progra-
ma desde el
siguiente cono:
/*
Nombre del archivo: tarea09.c
Fecha de ultima modificacion: Jue/04 de septiembre de 2008
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
138 Procesos Estoc asticos
Autor: Efrain Soto Apolinar.
efrain@yalma.fime.uanl.mx
efra.soto.a@gmail.com
Tarea Grafo aleatorio y caminata aleatoria sobre el.
Generar un grafo aleatorio.
1. pedir el numero de vertices
2. Pedir probabilidad de conexion
3. Construir el conjunto de aristas
4. Guardar las aristas en una matriz de adyacencia
5 realizar una caminata aleatoria
6. Imprimir resultados.
*/
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
double uniforme(void);
int main(int argc, char** args){
char letra;
int h, i, j, k, v, simulaciones; // contadores
int aristas = 0;
int N; // numero de nodos
int z; // Numero de veces que se repitira la caminata aleatoria
int pasos = 0; // pasos de la caminata aleatoria
float p; // probabilidad de conexion
double u; // aleatorio uniforme
double pc; // probabilidad de conexion a otros nodos... = 1.0 / freq[i];
int cabe; // siguiente nodo por probabilidad...
int NodoInicial, NodoActual, totalVecinosNodoActual;
srand(unsigned(time(0)));
//printf("\nEste programa genera un grafo aleatorio");
//printf("\na partir del numero de nodos y la");
//printf("\nprobabilidad de conexion entre nodos...");
for(;;){
printf("\n\nIntroduzca el numero de nodos: ");
printf("\n(Numero entero positivo): ");
scanf("%i", &N);
if (N <= 0){
printf("\nError en argumento...");
printf("\nIntroduzca un numero entero positivo...");
continue;
}
break;
}
//
for(;;){
printf("\n\nIntroduzca la probabilidad de conexion: ");
printf("\n(Numero entre 0 y 1): ");
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
7.3 Caminata aleatoria sobre un grafo 139
scanf("%f", &p);
if(p > 1 || p < 0){
printf("\nError en argumento...");
printf("\nIntroduzca un numero entre cero y uno...");
continue;
}
break;
}
//
//
// Genero la matriz de markov
int M[N][N];
// Genero los grados de renglones y columnas
int grado[N+1];
int freq[N+1]; // frecuencia de visita al nodo
int ultimoNodoVisitado[N+1]; // frecuencias finales
int vecino[N+1]; // vecinos del nodo i-esimo
for(i = 0 ; i < N ; i++){
freq[i] = 0;
ultimoNodoVisitado[i] = 0;
}
// Reinicio los asientos de la matriz...
// El grafo no tiene aristas...
for(i = 0; i < N ;i++){
grado[i] = 0;
for(j = 0 ; j < N ; j++){
M[i][j] = 0;
}
}
// genero aristas
for(i = 0; i < N ; i++){
for(j = i ; j < N ; j++){ // checar si j=i+1 funciona
if (i == j){
continue;
// Elimino aristas anidadas en un nodo...
}
u = uniforme();
if (u <= p){
M[i][j] = 1;
M[j][i] = 1; // simetrico
}
}
}
// Quito aristas redundantes...
for(i = 0 ; i < N ; i++ ){
M[i][i] = 0;
}
// Calculo los grados de cada nodo...
for(i = 0; i < N ;i++){
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
140 Procesos Estoc asticos
for(j = 0 ; j < N ; j++){ // checar si j=i+1 funciona
if (M[i][j] == 1){
grado[i]++;
}
}
}
// imprimo los resultados...
printf("\n\nSe muestra la matriz que representa la red:\n\n");
for(i = 0; i < N ;i++){
for(j = 0 ; j < N ; j++){
printf("%i\t", M[i][j]);
}
printf("\tGrado: %i", grado[i]);
printf("\n");
}
printf("\nSe iniciara la simulacion de la caminata aleatoria...");
printf("\nIntroduzca el numero de pasos a simular: ");
scanf("%i", &pasos);
k = 0;
for(;;){
printf("\nIntroduzca el nodo inicial de la caminata: ");
scanf("%i", &i);
if (i < 0 || i > N){
printf("\nError en argumento...");
printf("\nIntroduzca un numero entre 0 y %i.\n", N-1);
continue;
}
break;
}
for(;;){
printf("\n\nIntroduzca el numero de simulaciones: ");
scanf("%i", &simulaciones);
if(simulaciones <= 0){
printf("\nError en argumento...");
printf("\nIntroduzca un numero entero positivo.");
continue;
}
break;
}
for(z = 1 ; z <= simulaciones ; z++){
NodoActual = NodoInicial = i;
freq[NodoActual]++;
//printf("\nNodo Actual: %i", NodoActual);
v = 0;
for(i = 0 ; i < N ; i++){
if (M[NodoActual][i] == 1){
vecino[v] = i;
v++;
}
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
7.3 Caminata aleatoria sobre un grafo 141
}
totalVecinosNodoActual = v + 1;
//
for(h = 1 ; h < pasos ; h++){
// generar pseudoaleatorio
pc = 1.0 / grado[NodoActual]; // prob. de conexion c/nodos vecinos
u = uniforme(); // genero un aleatorio pseudo-uniforme
cabe = (int)(u/pc);
v = 0; // numero de vecino del nodo actual
// identificar a los vecinos de manera ordenada...
for(i = 0 ; i < N ; i++){
if (M[NodoActual][i] == 1){
vecino[v] = i;
v++;
}
}
totalVecinosNodoActual = v + 1;
// Asignar el siguiente nodo... [i+1]
//printf("\ncabe = %i", cabe);
NodoActual = vecino[cabe];
// Actualizar frecuencia del Nodo Actual
freq[NodoActual]++;
//printf("\nNodo Actual: %i,\tFrecuencia: %i", NodoActual, freq[NodoActual]);
// reinicio los vecinos...
for (i = 0 ; i <= v ; i++){
vecino[i] = 0;
}
}
// Agrego al contador ultimoNodoVisitado
ultimoNodoVisitado[NodoActual]++;
//printf("\n\nSimulacion %i realizada con exito...", z);
//printf("\nUltimo nodo visitado: %i", NodoActual);
}
printf("\nSimulacion exitosa...\n\n");
//printf("Nodo Inicial: %i", NodoInicial);
//printf("\nNodo Final: %i", NodoActual);
printf("\nFrecuencias de visita:\n");
printf("\nNodo:\t Grado:\t Frec. Visita total:\tFrec. Nodo Final:");
for(i=0 ; i < N ; i++){
printf("\n %i \t %i \t\t %i \t\t %i",
i, grado[i], freq[i], ultimoNodoVisitado[i]);
}
printf("\n\nPresione una tecla...");
scanf("%c", &letra);
return 0;
}
/*-----------------------------------------------
Funcion para generar uniformes (0,1)
-------------------------------------------------*/
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
142 Procesos Estoc asticos
double uniforme(void){
double u;
u = 1.0 * rand() / RAND_MAX;
return u;
}
Un ejemplo de corrida se muestra enseguida:
Introduzca el numero de nodos:
(Numero entero positivo): 10
Introduzca la probabilidad de conexion:
(Numero entre 0 y 1): 0.35
Se muestra la matriz que representa la red:
0 1 0 0 1 1 0 0 0 0 Grado: 3
1 0 1 0 1 0 1 0 1 0 Grado: 5
0 1 0 1 0 1 1 0 0 0 Grado: 4
0 0 1 0 0 0 0 1 1 0 Grado: 3
1 1 0 0 0 0 0 0 0 0 Grado: 2
1 0 1 0 0 0 0 0 0 0 Grado: 2
0 1 1 0 0 0 0 0 1 1 Grado: 4
0 0 0 1 0 0 0 0 0 0 Grado: 1
0 1 0 1 0 0 1 0 0 1 Grado: 4
0 0 0 0 0 0 1 0 1 0 Grado: 2
Se iniciara la simulacion de la caminata aleatoria...
Introduzca el numero de pasos a simular: 100
Introduzca el nodo inicial de la caminata: 0
Introduzca el numero de simulaciones: 50
Simulacion exitosa...
Frecuencias de visita:
Nodo: Grado: Frec. Visita total: Frec. Nodo Final:
0 3 501 4
1 5 814 7
2 4 668 10
3 3 504 4
4 2 337 2
5 2 346 3
6 4 682 5
7 1 166 3
8 4 666 9
9 2 316 3
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
7.4 Matriz de transici on de un grafo 143
, \/niz ni n/sici o ni . cn/io
Transiciones Genera un grafo aleatorio (o en Matlab/Octave o en el generador
que utilizaste en la tarea anterior) tal que el n umero de v ertices : 30 es de
tu elecci on, pero el grado esperado de los v ertices del grafo tiene que ser tres.
Forma su matriz de adyacencia A y calcula desde ella su matriz de transiciones
P.
El c odigo del programa que escrib en el lenguaje ANSI-C, se enlista al nal
del documento. A continuaci on se muestra una corrida con : = 10. Se pueden
realizar redes con mayor cantidad de nodos, pero la informaci on aparece muy
confusa (demasiados ceros y decimales...)
De cualquier manera, los dem as incisos evidencian que se podan correr instan-
cias con valores de : 30.
Introduzca el numero de nodos:
(Numero entero positivo): 10
Introduzca el grado esperado de cada nodo del grafo:
(Numero entero positivo): 3
Valor de p = 0.30000
Se muestra la matriz que representa la red:
0 0 1 0 0 0 1 0 0 0 Grado: 2
0 0 0 0 0 0 1 0 1 0 Grado: 2
1 0 0 1 1 0 1 1 0 0 Grado: 5
0 0 1 0 0 1 0 0 0 1 Grado: 3
0 0 1 0 0 1 0 1 0 0 Grado: 3
0 0 0 1 1 0 0 0 1 0 Grado: 3
1 1 1 0 0 0 0 0 0 0 Grado: 3
0 0 1 0 1 0 0 0 1 1 Grado: 4
0 1 0 0 0 1 0 1 0 0 Grado: 3
0 0 0 1 0 0 0 1 0 0 Grado: 2
Se muestra la matriz de transicion:
0.000 0.000 0.500 0.000 0.000 0.000 0.500 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 0.000 0.500 0.000 0.500 0.000
0.200 0.000 0.000 0.200 0.200 0.000 0.200 0.200 0.000 0.000
0.000 0.000 0.333 0.000 0.000 0.333 0.000 0.000 0.000 0.333
0.000 0.000 0.333 0.000 0.000 0.333 0.000 0.333 0.000 0.000
0.000 0.000 0.000 0.333 0.333 0.000 0.000 0.000 0.333 0.000
0.333 0.333 0.333 0.000 0.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.250 0.000 0.250 0.000 0.000 0.000 0.250 0.250
0.000 0.333 0.000 0.000 0.000 0.333 0.000 0.333 0.000 0.000
0.000 0.000 0.000 0.500 0.000 0.000 0.000 0.500 0.000 0.000
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
144 Procesos Estoc asticos
Presione una tecla...
Tiempos de absorci on Convierte (manualmente) tres estados de la cadena de la
parte (a) a estados absorbentes, denota esta cadena por

P. Calcula la diferencia
en el n umero esperado de pasos que se necesita para llegar al estado absorbente
m as probable de los tres versus al menos probable en la cadena representada
por

P.
El estado absorvente m as probable es aquel nodo absorvente que tiene el mayor
grado. De manera semejante, el estado absorvente menos probable es aquel nodo
absorvente que tiene el menor grado.
Esto signica que yo puedo causar que en la simulaci on de caminatas aleatorias
sobre el grafo generado en la computadora sea m as o menos probable que se
vaya pronto o m as tarde a un nodo absorvente. Para eso elijo como candidato a
nodo absorvente al nodo que tenga mayor (o menor, seg un sea el caso) grado en
mi grafo.
Para calcular el n umero esperado de pasos realizo caminatas y cuento a los
cu antos pasos llego a un nodo absorvente. Finalmente, calculo el promedio de la
longitud (n umero de pasos) de las caminatas simuladas y ese n umero representa
el n umero esperado de pasos en una caminata aleatoria sobre ese grafo.
El c odigo del programa modicado para resolver este inciso se elista al nal del
documento.
El programa se corri o y se obtuvieron los siguientes resultados:
Introduzca el numero de nodos:
(Numero entero positivo): 40
Introduzca el grado esperado de cada nodo del grafo:
(Numero entero positivo): 3
Valor de p = 0.07500
Se permitiran modificar tres nodos
a nodos absorventes...
Por favor, indique los nodos...
Nodo 0 absorvente: 12
Se ha modificado correctamente el nodo 12.
Nodo 1 absorvente: 35
Se ha modificado correctamente el nodo 35.
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
7.4 Matriz de transici on de un grafo 145
Nodo 2 absorvente: 23
Se ha modificado correctamente el nodo 23.
Se iniciara la simulacion de la caminata aleatoria...
Introduzca el nodo inicial de la caminata: 0
Introduzca el numero de simulaciones: 100
Simulacion exitosa...
Frecuencias de visita:
Nodo: Grado: Frec. Visita total: Frec. Nodo Final:
0 6 54 0
1 3 10 0
2 4 31 0
3 3 31 0
4 4 46 0
5 4 88 0
6 3 67 0
7 3 26 0
8 3 30 0
9 3 55 0
10 1 4 0
11 4 25 0
12 1 14 14
13 5 62 0
14 5 60 0
15 1 17 0
16 1 10 0
17 4 40 0
18 1 13 0
19 2 17 0
20 3 29 0
21 2 30 0
22 1 22 0
23 3 32 32
24 5 34 0
25 1 11 0
26 2 31 0
27 2 18 0
28 5 57 0
29 5 27 0
30 2 21 0
31 2 19 0
32 7 64 0
33 2 35 0
34 5 52 0
35 5 54 54
36 2 23 0
37 4 39 0
38 2 18 0
39 1 15 0
Numero de pasos esperado: 12.310000
Presione una tecla...
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
146 Procesos Estoc asticos
Como es obvio, solamente es posible que el nodo nal sea alguno de los nodos
que se modicaron para ser nodos absorventes. Adem as, la mayor frecuencia de
cada uno de estos nodos es aquel que tiene el mayor grado de entre los tres
nodos absorventes (nodo 35, grado 5).
Otro ejemplo de corrida con m as caminatas (500 en luga de 100) sobre otro grafo
es el siguiente:
Introduzca el numero de nodos:
(Numero entero positivo): 40
Introduzca el grado esperado de cada nodo del grafo:
(Numero entero positivo): 3
Valor de p = 0.07500
Se permitiran modificar tres nodos
a nodos absorventes...
Por favor, indique los nodos...
Nodo 0 absorvente: 13
Se ha modificado correctamente el nodo 13.
Nodo 1 absorvente: 31
Se ha modificado correctamente el nodo 31.
Nodo 2 absorvente: 19
Se ha modificado correctamente el nodo 19.
Se iniciara la simulacion de la caminata aleatoria...
Introduzca el nodo inicial de la caminata: 0
Introduzca el numero de simulaciones: 500
Simulacion exitosa...
Frecuencias de visita:
Nodo: Grado: Frec. Visita total: Frec. Nodo Final:
0 5 456 0
1 3 206 0
2 5 363 0
3 2 157 0
4 2 137 0
5 3 343 0
6 4 449 0
7 5 559 0
8 4 281 0
9 4 324 0
10 3 332 0
11 3 256 0
12 4 310 0
13 2 123 123
14 2 194 0
15 5 427 0
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
7.4 Matriz de transici on de un grafo 147
16 2 171 0
17 6 411 0
18 6 299 0
19 5 330 330
20 2 170 0
21 3 257 0
22 4 313 0
23 3 211 0
24 4 275 0
25 4 317 0
26 4 366 0
27 3 211 0
28 2 133 0
29 3 285 0
30 4 311 0
31 1 47 47
32 5 209 0
33 4 327 0
34 4 244 0
35 2 102 0
36 1 34 0
37 2 140 0
38 9 759 0
39 3 265 0
Numero de pasos esperado: 21.208000
Presione una tecla...
Todava no he encontrado c omo calcular el n umero esperado de pasos usando
f ormulas de probabilidad. Sospecho que tiene que ver con el grado de los nodos
absorventes, el grado promedio de los nodos del grafo y el n umero de grafos del
nodo.
Probabilidad de absorci on Calcula la probabilidad de absorci on en la cadena
representada por

P a cada uno de estos tres estados.
Intenta sacar conclusiones sobre la dependencia entre las probabilidades de ab-
sorci on a un cierto estado y su tiempo de absorci on.
Para este inciso utilizo la informaci on obtenida en la ultima corrida del programa
del inciso anterior.
Recordamos que los nodos absorventes son
13
,
19
y
31
.
De las 500 caminatas aleatorias que se realizaron en el grafo, 123 veces se lleg o
a
13
, 330 veces se naliz o en el nodo
19
y 47 se termin o la caminata en el nodo
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
148 Procesos Estoc asticos

31
, por lo que, de acuerdo a la simulaci on,
|(
13
) =
123
500
= 0246
|(
19
) =
330
500
= 066
|(
31
) =
47
500
= 0094
Sean deg (
1
), deg (
2
), deg (
3
) los grados de los nodos absorventes
1
,
2
,
3
, y
sea
c
=

deg (
i
) la suma de los grados de todos los nodos absorventes del
grafo actual. Entonces, la probabilidad de absorci on en una canimata aleatoria
en este grafo es, para cada nodo absorvente
i
:
|(
1
) =
deg (
1
)

c
=
deg (
1
)

deg (
i
)
|(
2
) =
deg (
2
)

c
=
deg (
2
)

deg (
i
)
|(
3
) =
deg (
3
)

c
=
deg (
3
)

deg (
i
)
Para el grafo actual, tenemos, deg (
1
) = 2, deg (
2
) = 5, deg (
3
) = 1 y
c
= 8.
Sustituyendo estos valores en las anteriores f ormulas obtenemos:
|(
13
) =
2
8
= 025
|(
19
) =
5
8
= 0625
|(
31
) =
1
8
= 0125
Lo cual coincide bastante bien con los resultados obtenidos en la simulaci on.
En las siguientes p aginas se encuentran los c odigos de los programas que se
utilizaron para la simulaci on.
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
7.4 Matriz de transici on de un grafo 149
C odigo del programa para el inciso 1.
Transiciones
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
double uniforme(void);
int main(int argc, char** args){
char letra;
int i, j, k; // contadores
int N; // numero de nodos
float p; // probabilidad de conexion
double u; // aleatorio uniforme
int gradoEsperado;
srand(unsigned(time(0)));
for(;;){
printf("\nIntroduzca el numero de nodos: ");
printf("\n(Numero entero positivo): ");
scanf("%i", &N);
if (N <= 0){
printf("\nError en argumento...");
printf("\nIntroduzca un numero entero positivo...");
continue;
}
break;
}
// Ahora necesito calcular la probabilidad de conexion
// de manera que el grado esperado de los nodos del grafo sea 3
for(;;){
printf("\nIntroduzca el grado esperado de cada nodo del grafo: ");
printf("\n(Numero entero positivo): ");
scanf("%i", &gradoEsperado);
if(gradoEsperado < 0){
printf("\nError en argumento...");
printf("\nIntroduzca un numero entero positivo...");
continue;
}
break;
}
// Asigno el valor de p
p = 1.0 * gradoEsperado / N;
printf("\nValor de p = %.5f", p);
int M[N][N]; // Matriz de Adyacencia
float P[N][N]; // Matriz de Transiciones
int grado[N+1];
// Reinicio los asientos de la matriz...
// El grafo no tiene aristas...
for(i = 0; i < N ;i++){
grado[i] = 0;
for(j = 0 ; j < N ; j++){
M[i][j] = 0;
P[i][j] = 0.0;
}
}
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
150 Procesos Estoc asticos
// genero aristas
for(i = 0; i < N ; i++){
for(j = i ; j < N ; j++){
if (i == j){
continue;
}
u = uniforme();
if (u <= p){
M[i][j] = 1;
M[j][i] = 1; // simetrico
}
}
}
// Calculo los grados de cada nodo...
for(i = 0; i < N ;i++){
for(j = 0 ; j < N ; j++){
if (M[i][j] == 1){
grado[i]++;
}
}
}
// imprimo los resultados...
printf("\nSe muestra la matriz que representa la red:\n\n");
for(i = 0; i < N ;i++){
for(j = 0 ; j < N ; j++){
printf("%i\t", M[i][j]);
}
printf("\tGrado: %i", grado[i]);
printf("\n");
}
// Calculo la matriz de transicion...
for(i = 0; i < N ;i++){
for(j = 0 ; j < N ; j++){
P[i][j] = 1.0 * M[i][j] / grado[i];
}
}
//
printf("\nSe muestra la matriz de transicion:\n\n");
for(i = 0; i < N ;i++){
for(j = 0 ; j < N ; j++){
printf("%f\t", P[i][j]);
}
printf("\n");
}
printf("\nPresione una tecla...");
scanf("%c", &letra);
printf("\n");
return 0;
}
/*-----------------------------------------------
Funcion para generar uniformes (0,1)
-------------------------------------------------*/
double uniforme(void){
double u;
u = 1.0 * rand() / RAND_MAX;
return u;
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
7.4 Matriz de transici on de un grafo 151
}
C odigo del programa para el inciso 2.
Tiempo de Absorci on
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
double uniforme(void);
int main(int argc, char** args){
char letra;
int h, i, j, k, v, simulaciones; // contadores
int x, y; // coordenadas de nodo absorvente
int aristas = 0;
int N; // numero de nodos
int z; // Numero de veces que se repitira la caminata aleatoria
float p; // probabilidad de conexion
double u; // aleatorio uniforme
double pc; // probabilidad de conexion a otros nodos... = 1.0 / freq[i];
int cabe; // siguiente nodo por probabilidad...
int gradoEsperado;
int NodoInicial, NodoActual, totalVecinosNodoActual;
int Nax[3]; // Nodos absorventes
int totalPasos = 0;
int absorvente = 0;
float NPEsperado = 0.0;
int correcto = 0;
srand(unsigned(time(0)));
for(;;){
printf("\nIntroduzca el numero de nodos: ");
printf("\n(Numero entero positivo): ");
scanf("%i", &N);
if (N <= 0){
printf("\nError en argumento...");
printf("\nIntroduzca un numero entero positivo...");
continue;
}
break;
}
// Ahora necesito calcular la probabilidad de conexion
// de manera que el grado esperado de los nodos del grafo sea 3
for(;;){
printf("\nIntroduzca el grado esperado de cada nodo del grafo: ");
printf("\n(Numero entero positivo): ");
scanf("%i", &gradoEsperado);
if(gradoEsperado < 0){
printf("\nError en argumento...");
printf("\nIntroduzca un numero entero positivo...");
continue;
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
152 Procesos Estoc asticos
}
break;
}
// Asigno el valor de p
p = 1.0 * gradoEsperado / N;
printf("\nValor de p = %.5f", p);
// Genero matrices
int M[N+1][N+1]; // Matriz de Adyacencia
float P[N+1][N+1]; // Matriz de Transiciones
int grado[N+1];
int freq[N+1]; // frecuencia de visita al nodo
int ultimoNodoVisitado[N+1]; // frecuencias finales
int vecino[N+1]; // vecinos del nodo i-esimo
for(i = 0 ; i < N ; i++){
freq[i] = 0;
ultimoNodoVisitado[i] = 0;
}
//
while(correcto == 0){
// Reinicio los asientos de la matriz...
// El grafo no tiene aristas...
for(i = 0; i < N ;i++){
grado[i] = 0;
for(j = 0 ; j < N ; j++){
M[i][j] = 0;
P[i][j] = 0.0;
}
}
// genero aristas
for(i = 0; i < N ; i++){
for(j = i ; j < N ; j++){ // checar si j=i+1 funciona
if (i == j){
continue;
}
u = uniforme();
if (u <= p){
M[i][j] = 1;
M[j][i] = 1; // simetrico
}
}
}
// Calculo los grados de cada nodo...
for(i = 0; i < N ;i++){
for(j = 0 ; j < N ; j++){ // checar si j=i+1 funciona
if (M[i][j] == 1){
grado[i]++;
}
}
}
// supongo que se creo bien el grafo
correcto = 1;
for(i = 0 ; i < N ; i++){
if (grado[i] == 0){
//printf("\n\nMatriz con nodo aislado...");
//printf("\nSe genera nuevo grafo...");
correcto = 0;
break;
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
7.4 Matriz de transici on de un grafo 153
}
}
}
//printf("\nSe calcula la matriz de transiciones:");
for(i = 0; i < N ;i++){
for(j = 0 ; j < N ; j++){
P[i][j] = 1.0 * M[i][j] / grado[i];
}
}
/* INICIA la parte II*/
// Convierto a estados absorventes...
printf("\n");
printf("\nSe permitiran modificar tres nodos ");
printf("\na nodos absorventes...");
printf("\nPor favor, indique los nodos...");
// Reinicio las coordenadas de los nodos absorventes
for(i = 0 ; i < 3; i++){
Nax[i] = 0;
}
// pedir las coordenadas y modificar las matrices...
k = 0;
while(k < 3){// hasta lograr 3 nodos...
for(;;){
printf("\nNodo %i absorvente: ", k);
scanf("%i", &x);
if(x < 0 || x > N){
printf("\nError en argumento...");
printf("\nIntroduzca un numero entero entre 0 y %i.", N-1);
continue;
}
break;
}
// tenemos un nodo valido...
// Modificamos la matriz de transicion...
for(i = 0 ; i < N ; i++){
P[i][x] = 0;
P[x][i] = 0;
}
P[x][x] = 1; // nodo absorvente...
// Guardo el nodo modificado
Nax[k] = x;
k++; // un nodo mas...
printf("\nSe ha modificado correctamente el nodo %i.\n", x);
}
/*
Inicia la simulacion de la caminata aleatoria
*/
// /*
printf("\nSe iniciara la simulacion de la caminata aleatoria...");
k = 0;
for(;;){
printf("\nIntroduzca el nodo inicial de la caminata: ");
scanf("%i", &i);
if (i < 0 || i > N){
printf("\nError en argumento...");
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
154 Procesos Estoc asticos
printf("\nIntroduzca un numero entre 0 y %i.\n", N-1);
continue;
}
break;
}
for(;;){
printf("\n\nIntroduzca el numero de simulaciones: ");
scanf("%i", &simulaciones);
if(simulaciones <= 0){
printf("\nError en argumento...");
printf("\nIntroduzca un numero entero positivo.");
continue;
}
break;
}
for(z = 1 ; z <= simulaciones ; z++){
NodoActual = NodoInicial = i;
freq[NodoActual]++;
v = 0;
for(i = 0 ; i < N ; i++){
if (M[NodoActual][i] == 1){
vecino[v] = i;
v++;
}
}
totalVecinosNodoActual = v + 1;
absorvente = 0;
//
for(; absorvente == 0 ;){
// generar pseudoaleatorio
pc = 1.0 / grado[NodoActual]; // probabilidad de conexion con nodos vecinos
u = uniforme(); // genero un aleatorio pseudo-uniforme
cabe = (int)(u/pc);
v = 0; // n umero de vecinos del nodo actual
// identificar a los vecinos de manera ordenada...
for(i = 0 ; i < N ; i++){
if (M[NodoActual][i] == 1){
vecino[v] = i;
v++;
}
}
totalVecinosNodoActual = v + 1;
// Asignar el siguiente nodo... [i+1]
NodoActual = vecino[cabe];
// Actualizar frecuencia del Nodo Actual
freq[NodoActual]++;
totalPasos++;
//printf("\ttotalPasos = %i", totalPasos);
if (NodoActual == Nax[0]){
//printf("\nSe termino la caminata %i en el nodo %i.", z, NodoActual);
absorvente = 1;
}
if (NodoActual == Nax[1]){
//printf("\nSe termino la caminata %i en el nodo %i.", z, NodoActual);
absorvente = 1;
}
if (NodoActual == Nax[2]){
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
7.4 Matriz de transici on de un grafo 155
//printf("\nSe termino la caminata %i en el nodo %i.", z, NodoActual);
absorvente = 1;
}
//printf("\nNodo Actual: %i,\tFrecuencia: %i", NodoActual, freq[NodoActual]);
// reinicio los vecinos...
for (i = 0 ; i <= v ; i++){
vecino[i] = 0;
}
}
// Agrego al contador ultimoNodoVisitado
ultimoNodoVisitado[NodoActual]++;
}
printf("\nSimulacion exitosa...\n\n");
NPEsperado = 1.0 * totalPasos / simulaciones;
printf("\nFrecuencias de visita:\n");
printf("\nNodo:\t Grado:\t Frec. Visita total:\tFrec. Nodo Final:");
for(i=0 ; i < N ; i++){
printf("\n %i \t %i \t\t %i \t\t %i", i, grado[i], freq[i], ultimoNodoVisitado[i]);
}
printf("\nNumero de pasos esperado: %f", NPEsperado);
// */
printf("\n\nPresione una tecla...");
scanf("%c", &letra);
return 0;
}
/*-----------------------------------------------
Funcion para generar uniformes (0,1)
-------------------------------------------------*/
double uniforme(void){
double u;
u = 1.0 * rand() / RAND_MAX;
return u;
}
Ejemplo de corrida.
Las siguientes lneas muestran un ejemplo de salida del programa que se uti-
liz o para vericar que las modicaciones a la matriz de transici on se hicieran
correctamente.
Introduzca el numero de nodos:
(Numero entero positivo): 10
Introduzca el grado esperado de cada nodo del grafo:
(Numero entero positivo): 3
Valor de p = 0.30000
Se muestra la matriz que representa la red:
0 0 0 0 1 1 1 1 0 1 Grado: 5
0 0 0 0 0 1 0 0 1 0 Grado: 2
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
156 Procesos Estoc asticos
0 0 0 1 0 0 0 0 0 0 Grado: 1
0 0 1 0 0 0 0 1 1 0 Grado: 3
1 0 0 0 0 0 0 0 0 1 Grado: 2
1 1 0 0 0 0 0 0 0 0 Grado: 2
1 0 0 0 0 0 0 1 0 0 Grado: 2
1 0 0 1 0 0 1 0 0 1 Grado: 4
0 1 0 1 0 0 0 0 0 0 Grado: 2
1 0 0 0 1 0 0 1 0 0 Grado: 3
Se muestra la matriz de transiciones actual:
0.000 0.000 0.000 0.000 0.200 0.200 0.200 0.200 0.000 0.200
0.000 0.000 0.000 0.000 0.000 0.500 0.000 0.000 0.500 0.000
0.000 0.000 0.000 1.000 0.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.333 0.000 0.000 0.000 0.000 0.333 0.333 0.000
0.500 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.500
0.500 0.500 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
0.500 0.000 0.000 0.000 0.000 0.000 0.000 0.500 0.000 0.000
0.250 0.000 0.000 0.250 0.000 0.000 0.250 0.000 0.000 0.250
0.000 0.500 0.000 0.500 0.000 0.000 0.000 0.000 0.000 0.000
0.333 0.000 0.000 0.000 0.333 0.000 0.000 0.333 0.000 0.000
Se muestran las aristas de la red actual
Arista = (i,j).
(0,4) (0,5) (0,6) (0,7)
(0,9) (1,5) (1,8) (2,3)
(3,7) (3,8) (4,9) (6,7)
(7,9)
Se permitiran modificar tres nodos
a nodos absorventes...
Por favor, indique las coordenadas de cada nodo
en orden...
Nodo 0 absorvente: 2
Se ha modificado correctamente el nodo 2.
Nodo 1 absorvente: 1
Se ha modificado correctamente el nodo 1.
Nodo 2 absorvente: 6
Se ha modificado correctamente el nodo 6.
Se muestra la matriz de transiciones modificada:
0.000 0.000 0.000 0.000 0.200 0.200 0.000 0.200 0.000 0.200
0.000 1.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 1.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.333 0.333 0.000
0.500 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.500
0.500 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 0.000 1.000 0.000 0.000 0.000
0.250 0.000 0.000 0.250 0.000 0.000 0.000 0.000 0.000 0.250
0.000 0.000 0.000 0.500 0.000 0.000 0.000 0.000 0.000 0.000
0.333 0.000 0.000 0.000 0.333 0.000 0.000 0.333 0.000 0.000
Se iniciara la simulacion de la caminata aleatoria...
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
7.4 Matriz de transici on de un grafo 157
Introduzca el nodo inicial de la caminata: 0
Introduzca el numero de simulaciones: 1000
Simulacion exitosa...
Frecuencias de visita:
Nodo: Grado: Frec. Visita total: Frec. Nodo Final:
0 5 1160 0
1 2 328 328
2 1 220 220
3 3 645 0
4 2 737 0
5 2 467 0
6 2 675 452
7 4 824 0
8 2 213 0
9 3 810 0
Numero de pasos esperado: 5.079000
Presione una tecla...
Este programa se modic o para que no mostrara las matrices, especialmente
cuando se tenian matrices muy grandes.
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
158 Procesos Estoc asticos
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
8
End matter
No programming technique solves all problems.
No programming language produces only correct results.
No programmer should start each project from scratch.
Axel-Tobias Schreiner
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
Indice alfabetico
Java
Funciones Matem aticas, 54
Tarea 1
Lenguaje Java, 40
Lenguaje C, 6
Tarea 10
Lenguaje C, 21
Tarea 11
Lenguaje C, 28
Tarea 2
Lenguaje Java., 43
Lenguaje C, 9
Tarea 3
Lenguaje Java., 45
Lenguaje C, 11
Tarea 4
Lenguaje Java., 47
Lenguaje C, 13
Tarea 5
Lenguaje Java., 48
Lenguaje C, 14
Tarea 6
Lenguaje C, 15
Tarea 8
Lenguaje C, 16, 50
Tarea 9
Lenguaje C, 18
Efran Soto A.
Estudiante del PISIS
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Programaci on
Cientca
8.1 T erminos de uso 161
o 1inVios ni .so
Este material est a siendo generado conforme voy avanzando en las tareas y
proyectos de distintas materias que estudio como parte de la Maestra en Ciencias
en Ingeniera de Sistemas, ofrecida por la Facultad de Ingeniera Mec anica y
El ectrica de la Universidad Aut onoma de Nuevo Le on.
Si eres un compa nero de alg un curso, por favor, pregunta al profesor responsable
del curso (Dra. Elisa Schaeer, Dr. Arturo Berrones, Dr. C esar Villarreal, Dra.
Jazmn Ros, etc.) acerca de las consecuencias de utilizar los c odigos de las
tareas o partes de estas, contenidas en este material.
En caso de que no estudies la maestra, tal vez tengas el mismo tipo de apren-
dizaje que yo, porque aprendo viendo un ejemplo y a partir de el, s e c omo hacer
lo que estoy buscando. En este caso, puedes utilizar los c odigos como una gua
para aprender a programar.
No hay ninguna garanta de que los c odigos est en libres de cualquier tipo de
error.
El autor no es responsable por cualesquiera da nos ocasionados por el uso de
este material.
Utiliza los c odigos de los programas bajo tu propio riesgo.
Tienes derecho de leer el material y de divulgarlo a otras personas, con la unica
condici on de que no modiques el documento en forma alguna.
Si deseas utilizar alguna parte del material, puedes hacerlo, con la unica condici on
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 deseen
aprender a programar en C, C
++
y/o Java.
Este material est a siendo actualizado continuamente.
Te agradecer e que me enves un mensaje en caso de que encuentres errores en
los c odigos, en las deniciones o en la ortografa y/o gram atica del mismo.
El material no ha tenido ninguna revisi on. Agradezco innitamente tu ayuda.
Efran Soto Apolinar.
Programaci on
Cientca
Este material NO est a listo para su publicaci on.
Requiere de revisi on t ecnica.
Efran Soto A.
Estudiante del PISIS
o. Cninios
Este documento se prepar o con el software de tipografa cientca L
A
T
E
X2

.
Cr editos...
Estudiante: Efran Soto Apolinar.
Edici on: Efran Soto Apolinar.
Composici on tipogr aca: Efran Soto Apolinar.
Revisi on t ecnica: Pendiente.
A no de edici on: 2008
A no de publicaci on: No Aplica

Ultima revisi on: S e p t e m b e r 1 9 , 2 0 0 8 10:28am


Agradezco tus sugerencias, comentarios, correcciones, reclamos y todo lo que se
le parezca a cualquiera de las cuentas de correo electr onico:
efra.soto.a@gmail.com @
efrain@yalma.me.uanl.mx
@

Вам также может понравиться