You are on page 1of 23

19/10/2016

SESION 1

Ejemplo de un programa bsico en C/C++


Implementa la programacin estructurada en
Lenguaje C para la simplificacin y eficiencia
#include <iostream>
de cdigo para la solucin a problemas que
involucre el desarrollo de sistemas de using namespace std;

informacin. int main() {


cout << Hola mundo! << endl;
return 0;
}

1. Introduccin a la programacin Ejemplo de un programa bsico en C/C++

2. Estructuras de control y aplicaciones con


Inclusin de archivos de encabezado
arreglos #include <iostream>

3. Manejo de funciones y cadenas using namespace std;


4. Manejo de apuntadores y estructuras
int main() {
5. Manejo de archivos y puertos cout << Hola mundo! << endl;
return 0;
}
19/10/2016

Ejemplo de un programa bsico en C/C++ Antes de poder ejecutar el programa que


escribimos, es necesario compilarlo.

#include <iostream> En DevC++ o CodeBlocks podemos usar los


siguientes atajos:
using namespace std; Uso global de las libreras estndar F9: Compilar
F10: Compilar y ejecutar
F11: Ejecutar (sin recompilar)
int main() {
cout << Hola mundo! << endl;
return 0;
}

Ejemplo de un programa bsico en C/C++ Escriba y ejecute un programa que escriba su


nombre completo en la pantalla dentro de un
marco formado por asteriscos.
#include <iostream>
Ejemplo de salida:
using namespace std;
Declaracin de la funcin principal ****************************
int main() { * Me llamo Sharon *
cout << Hola mundo! << endl; ****************************
return 0;
}

Ejemplo de un programa bsico en C/C++ Para declarar variables en C/C++ se escribe


primero el tipo de variable, seguido del
nombre de una o ms variables (separados
#include <iostream> por comas).

using namespace std; Ejemplos:


int a;
int main() { int i, j, k;
cout << Hola mundo! << endl; float x, y;
return 0;
}
Cdigo a ejecutar por la funcin principal
19/10/2016

Para asignar un valor a una variable se utiliza En C++ se puede usar el flujo cout para imprimir
el operador = informacin en la pantalla, utilizando el operador de
Es posible asignar valores al momento de salida de flujo <<
declarar las variables;
Ejemplos: La constante endl imprime un retorno de carro

x = 10; Ejemplos:
float a = 3.4, b = 5.6; c = -1.7;
cout << El valor de x es << x << endl;
cout << El rea del circulo es << 3.14159 * r * r;
cout << endl << endl << endl;

Desarrolle un programa donde


char entero de 8 bits
1. Declare tres variables de punto flotante: a, b, c
short entero con signo de 16 bits 2. Declare dos variables de tipo double: x1 y x2
int entero con signo de 32 bits 3. Calcule las races (reales) x1 y x2 de la ecuacin
float punto flotante de 32 bits ax2 + bx + c = 0
double punto flotante de 64 bits 4. Imprima los datos y resultados en la pantalla

Ejemplo de salida:
Modificadores: signed / unsigned / long
Clculo de las races de una cuadrtica
Coeficientes: a = 1, b = -1, c = -2
Races: x1 = 2, x2 = -1

En C/C++ se pueden formar expresiones El flujo de entrada cin permite introducir datos
aritmticas con los operadores comunes: desde el teclado y almacenarlos en variables.
+, -, *, /

Debe tenerse siempre en cuenta que los Ejemplo:


operadores actan de acuerdo al tipo de datos de
los operandos involucrados. Ejemplo:
int main() {
x = 5 / 2; // el resultado es 2 int x;
x = 5.0 / 2; // el resultado es 2.5 cout << Escribe un nmero entero: ;
cin >> x;
C/C++ no cuenta con un operador de potencia, cout << El nmero que escribiste es: ;
pero se puede utilizar la funcin pow() de la cout << x << endl;
librera math.h }
19/10/2016

Una expresin booleana es aquella que


Modifique el programa anterior para que el despus de evaluarse puede tomar uno de
usuario pueda introducir los coeficientes a, b, dos posibles resultados: verdadero o falso.
c, sin necesidad de recompilar el programa. En lenguaje C/C++, los valores verdadero y
falso se representan, respectivamente, con
El programa deber imprimir mensajes los nmeros 1 y 0.
informativos indicando al usuario qu hace el Sin embargo, cualquier valor distinto de cero
programa y qu informacin requiere. es considerado como verdadero.

1. Escriba un programa que pida al usuario dos enteros y los


almacene en las variables A y B. Luego el programa debe Una manera de formar expresiones booleanas
intercambiar el valor de A y B.
es utilizando los operadores de comparacin:
2. Escriba un programa que calcule e imprima el permetro y el
rea de una circunferencia de radio r dado por el usuario.
a == b - igualdad
3. Escriba un programa que, usando solamente dos variables, a <b - menor a
calcule el promedio de cinco enteros dados por el usuario.
a >b - mayor a
4. Escriba un programa que dados dos puntos en el plano (x1,y1) y a != b - distinto de
(x2,y2), calcule y escriba la distancia entre ellos (sugerencia:
utilice la funcin sqrt() de la librera math.h). a <= b - menor o igual a
a >= b - mayor o igual a
5. Escriba un programa que dados tres puntos en el plano, calcule
e imprima las coordenadas del centro y el radio de la
circunferencia que pasa por los tres puntos.

Una de las principales aplicaciones de las


expresiones booleanas es la toma de decisiones:

if (expresin) {
SESION 2
// cdigo a ejecutar si la
// expresin es verdadera
} else {
// cdigo a ejecutar si la
// expresin es falsa
}
19/10/2016

1. Elabore un programa que pida al usuario cinco nmeros enteros e


Las expresiones booleanas pueden combinarse imprima el menor y el mayor de ellos.
mediante los operadores booleanos clsicos: 2. Escriba un programa que tome como entrada las coordenadas de un
punto en el plano cartesiano e indique al usuario en qu cuadrante se
encuentra el punto.
&& - conjuncin (and)
|| - disyuncin (or) 3. Elabore un programa que pida al usuario cuatro calificaciones parciales
! - negacin (not) entre 0 y 10. El programa debe verificar que los datos estn en el
rango adecuado y calcular e imprimir el promedio. De acuerdo al
promedio, deber tambin imprimir alguno de los siguientes mensajes:
Notar que estos operadores difieren de los de 6 a 10: Aprobado, de 5 a 6: Derecho a extraordinario, de 2 a 5:
Derecho a ttulo, y de 0 a 2: Sin derecho a acreditar.
operadores lgicos binarios: &, |, ~
4. Elabore un programa que pida al usuario su fecha de nacimiento (en el
Notar que, en muchos casos, los operadores formato da, mes, ao), as como la fecha actual, y calcule la edad del
usuario en das. El programa debe verificar que las fechas son
&& y || pueden reemplazarse, correctas (e.g., 30/02/1998 y 10/13/1980 no lo son) y tomar en
respectivamente, por el producto y la suma. cuenta los aos bisiestos.

Escriba un programa que pida al usuario tres


nmeros enteros entre 0 y 10 (inclusive).

El programa debe verificar que los nmeros SESION 3


estn en el rango correcto, y en ese caso
imprimir el promedio de los nmeros. En
caso contrario debe imprimir un mensaje de
error indicando cul de los nmeros est
fuera de rango.

La instruccin switch se utiliza cuando se


Elabore un programa que pida al usuario los requiere tomar una decisin entre mltiples
coeficientes de una cuadrtica y calcule sus posibilidades, de acuerdo al valor de una
races, las cuales posiblemente son variable o expresin entera.
complejas. El programa deber indicar de qu
tipo son las races (reales, imaginarias o Una de las principales aplicaciones es la
complejas) e imprimir los resultados en el elaboracin de un men de opciones dentro
formato adecuado. de un programa.
19/10/2016

switch (expresin) {
case c1: // cdigo a ejecutar en caso de que expresin Considere el siguiente problema: 3 misioneros y 3
== c1 canbales desean cruzar un ro usando una balsa
break;
para 2 pasajeros. En ningn momento puede haber
case c2: // cdigo a ejecutar en caso de que expresin ==
mas canbales que misioneros en cualquier orilla
c2 del ro. Los movimientos vlidos consisten en
break; trasladar uno o dos personajes de una orilla a otra,
alternando en cada movimiento el origen y destino.

default: // cdigo (opcional) a ejecutar en caso de que no


se cumpla // ninguna de las condiciones anteriores
}

* Es importante recordar que c1, c2, etc.. deben ser constantes enteras!

Usando switch Usando if


int a, b, r, opcion; int a, b, r, opcion;
cout << 1.- Suma << endl;
cout << 1.- Suma << endl; cout << 2.- Resta << endl;
cout << 2.- Resta << endl; cout << 3.- Producto << endl;
cout << 4.- Divisin << endl;
cout << 3.- Producto << endl; cout << Elige una opcin: << endl;
cout << 4.- Divisin << endl; cin << opcion;
if (opcion == 1) {
cout << Elige una opcin: << endl;
r = a + b;
cin << opcion; } else { SESION 4
switch (opcion) { if (opcion == 2) {
r = a b;
case 1: r = a + b; break; } else {
case 2: r = a b; break; if (opcion == 3) {
r = a * b;
case 3: r = a * b; break; } else {
case 4: r = a / b; break; if (opcion == 4) {
r = a / b;
default: cout << Opcion invalida } else {
<< endl; cout << Opcion invalida << endl;
} }
}
cout << El resultado es << r << }
endl; }
cout << El resultado es << r << endl;

En la msica occidental, las notas Do, Re, Mi, Fa, Las estructuras de iteracin se utilizan cuando es
Sol, La, y Si suelen representarse mediante las necesario repetir un cierto bloque de cdigo un
letras C, D, E, F, G, A, y B, respectivamente. nmero determinado o indeterminado de veces.

Elabore un programa que tome como entrada la Todas las estructuras de iteracin se basan en la
letra (mayscula o minscula) correspondiente a ejecucin de un bloque de cdigo de manera
una nota e imprima su nombre. Si la letra dada no repetida mientras el valor de una expresin
corresponde a una nota, el programa debe booleana de control sea verdadero.
indicarlo mediante un mensaje de error.
Por lo tanto, es muy importante asegurarse de
Sugerencia: utilice el tipo char para almacenar
caracteres y recuerde que las constantes de este que la condicin se vuelve falsa en algn
tipo se escriben entre apstrofos (e.g., a, z, *, momento, de manera que el programa no quede
etc..). atascado en un ciclo infinito.
19/10/2016

Sintaxis: La instruccin while siempre verifica primero que la


condicin de control sea verdadera antes de ejecutar
while (expresin) { el bloque de cdigo.
// Cdigo a ejecutar de manera repetida
// mientras la expresin sea verdadera Si se desea ejecutar el bloque de cdigo al menos
} una vez antes de verificar la condicin, se puede
usar la instruccin dowhile:

do {
// bloque de cdigo a ejecutar al menos una vez
} while (expresin);

El siguiente programa calcula el factorial de n, donde n es dado por el Realice un programa que pida al usuario una serie de nmeros
usuario: enteros no negativos utilizando un ciclo dowhile. Una vez
que el usuario introduzca un nmero negativo, el ciclo deber
int main() { terminar y el programa deber imprimir el mayor, menor, y
int i, n, factorial; promedio de todos los nmeros ingresados (excepto el ltimo).
cout << Dame el valor de n: ;
cin >> n;
factorial = 1; Elabore un programa que elija un nmero aleatorio n entre 1 y
i = 1; 100 (usar funciones rand() y srand() de stdlib.h). El programa
while (i <= n) { dar al usuario 5 oportunidades para adivinar el nmero: en
factorial = factorial * i; cada oportunidad, el usuario ingresar su respuesta y el
i = i + 1; programa indicar si la respuesta es menor, mayor, o igual a n
} (en cuyo caso el usuario habr ganado). Si despus de 5
cout << El factorial de << n << es << factorial intentos el usuario no ha adivinado, entonces habr perdido el
<< endl; juego.
}

1. Elabore un programa que implemente el mtodo de


biseccin para encontrar la raz en el intervalo (0, 3) de la
Elabore un programa que pida al usuario un funcin
entero positivo n. Luego, el programa debe
pedir al usuario n enteros usando un ciclo. El
programa deber encontrar el mayor, menor,
y promedio de los valores dados por el
usuario e imprimirlos al final.
2. Elabore un programa que implemente la regla del trapecio
para calcular la integral
19/10/2016

Algoritmo de biseccin:

Dado el intervalo (a, b) y una funcin f(x) continua en (a,b):


Las siguientes estructuras son equivalentes:
1. Verificar que f(a) f(b) < 0. De lo contrario, no podemos asegurar que
existe una raz en el intervalo dado y el algoritmo debe terminar.
2. Hacer r=a. Iterar hasta que r converja: for (inicializacin; condicin; incremento) {
a. Obtener una aproximacin de la raz r como r = (a+b) / 2 . // bloque de instrucciones
b. Si f(a) f(r) < 0, entonces la raz est en la mitad izquierda del }
intervalo. Por lo tanto, hacer b = r.
c. En caso contrario, entonces la raz est en la mitad derecha del
intervalo. Por lo tanto, hacer a = r.
inicializacin;
Regla del trapecio: while (condicin) {
// bloque de instrucciones
incremento;
}
donde n es el nmero de segmentos y h = (b-a)/n.

La instruccin for se usa tpicamente para


realizar ciclos controlados por contador, ya
que permite ver todos los parmetros del
ciclo en una sola lnea:
SESION 5
int main() {
int i, n, f = 1;
cout << Dame un numero entero: ;
cin >> n;
for (i = 1; i <= n; i++) {
f = f * i;
}
cout << n << ! = << f << endl;
}

La otra estructura en C/C++ para la realizacin de ciclos es En muchas aplicaciones se requiere utilizar
proporcionada por la instruccin for, cuya sintaxis es: dos o ms ciclos anidados, de manera que un
ciclo exterior no complete una iteracin hasta
for (inicializacin; condicin; incremento) { que los ciclos interiores hayan finalizado.
// bloque de instrucciones
}
Una manera de entender el funcionamiento
Donde inicializacin es una expresin que se ejecuta de los ciclos anidados es comparndolos con
antes de iniciar el ciclo. El ciclo se ejecuta mientras la el odmetro de un coche:
condicin sea verdadera, y en cada iteracin (despus de
ejecutar el bloque de instrucciones) se evala la expresin
incremento.
19/10/2016

#include <iostream>
#include <cstdlib>
#include <time.h>

using namespace std;


4. Elabore un programa que calcule e imprima el volumen bajo la
int main() { superficie f(x,y) = x2 + y2 r2, donde r2 est dado por el usuario, en
int i, j, k; el intervalo |x|<1, |y|<1. Para esto, divida el intervalo en una rejilla
int t0; de n x n (donde n es dado por el usuario) y utilice integracin por
for (i = 0; i < 10; i++) { paraleleppedos rectangulares.
for (j = 0; j < 10; j++) {
for (k = 0; k < 10; k++) {
cout << "\r" << i << j << k; 5. Modifique el programa anterior para que imprima una tabla de la
cout.flush(); integral de f(x,y) para valores enteros de r desde 1 hasta 20.
t0 = time(0);
while (t0 == time(0)) {}
}
}
}
return 0;
}

a) Escriba un programa que, dado un nmero


entero n, determine si n es primo o no.
Sugerencia: verifique si n es divisible entre
algn entero entre 2 y sqrt(n).
b) Modifique el programa anterior para que SESION 6
pida al usuario un entero positivo N, y luego
imprima los primeros N nmeros primos.

Ejemplo: si el usuario ingresa 10, el programa


debe imprimir: 2, 3, 5, 7, 11, 13, 17, 19, 23,
29.

1. Elabore un programa que utilice uno o mas ciclos for para


factorizar un nmero entero n (dado por el usuario) como el
producto de nmeros primos. Sugerencia: pruebe si n es divisible Una funcin es una seccin de cdigo que
entre 2, 3, , n; cuando lo sea, divida n entre el factor y repita la realiza una tarea especfica, y que puede ser
operacin hasta que n sea 1.
llamada desde otra funcin.
2. Se define la funcin u(n) para n entero no negativo como

Todo programa en C/C++ se compone de


una o ms funciones, incluyendo la funcin
3.
main().
donde a es un entero, y puede mostrarse que para cualquier valor
de a existe un entero Na tal que u(Na) = 1.
El lenguaje C incluye muchas funciones de
Elabore un programa que pida al usuario el valor de a, y luego utilidad general, las cuales estn organizadas
calcule e imprima todos los valores de u(n) desde n = 1 hasta n =
Na. en libreras.
19/10/2016

Una funcin en C/C++ se define de la


manera siguiente: a) Implemente una funcin f(x) que tome por parmetro un
nmero x (de punto flotante) y devuelva 3cos(x) 1

tipo nombre (argumento1, argumento2, b) Implemente una funcin llamada biseccin que tome por
) { parmetros a y b, y encuentre la raz de la funcin f(x) en
el intervalo [a,b]. En caso de no existir una raz, la
// instrucciones a realizar funcin deber devolver el valor de a.
}
Ninguna de las dos funciones anteriores debe pedir datos al
usuario o imprimir informacin en la pantalla.
donde tipo representa el tipo de datos del
Dentro de la funcin main(), pida al usuario los valores de
valor devuelto por la funcin, y los argumentos
c)
a y b, y llame a la funcin de biseccin para encontrar e
son variables (con especificacin de tipo) donde imprimir la raz de f(x) en [a,b]. En caso de no existir una raz,
el programa deber actuar de manera acorde.
se guardan los parmetros de la funcin.

Por lo general, las funciones reciben argumentos por


int factorial(int n) {
valor. Esto significa que los parmetros son
int i, f = 1; variables que solo existen dentro del contexto de la
for (i = 1; i <= n; i++) { funcin:
f = f * i;
} void intercambia(int a, int b) {
return f; int temp = a;
a = b;
}
b = temp;
}
int main() {
int n; int main() {
int a = 1, b = 2;
for (n = 1; n <= 10; n++) {
intercambia(a, b);
cout << n << ! = << factorial(n) << endl; cout << a = << a << , b = << b << endl;
} }
}
La salida de este programa es: a = 2, b = 1

Es posible definir una funcin que no


devuelva ningn resultado si se declara de El paso por referencia asocia los
tipo void: parmetros de una funcin con variables
que existen fuera del contexto de la
funcin, lo cual permite modificar su
void Retardo(int segundos) { valor:
int t0 = time();
while (time() t0 < segundos) {} void intercambia(int &a, int &b) {
int temp = a;
} a = b;
b = temp; Operador de referencia
}
Notar que, en este caso, no es necesario usar la
instruccin return a menos que se desee El paso por referencia es til cuando se
terminar la funcin de manera prematura. requiere que una funcin devuelva ms
de un resultado.
19/10/2016

a) Escriba su propia versin de la funcin exp(x) utilizando la


siguiente serie: Un programa estructurado se compone de
tres tipos bsicos de estructuras de flujo:
donde N es dado como segundo argumento. 1. Secuencia: la cual indica el orden de ejecucin de
las instrucciones.
b) Utilice la funcin anterior para escribir una funcin que
calcule la densidad de probabilidad de una distribucin
2. Seleccin: mediante la cual una secuencia de
Gaussiana con media m y varianza s 2, dada por:
instrucciones se ejecuta dependiendo del estado
del programa.

3. Repeticin: mediante la cual una secuencia de


c) Utilice la regla del trapecio para mostrar que: instrucciones se ejecuta de manera iterativa
mientras el programa se encuentre en un cierto
estado.

1. Escriba una funcin llamada car2pol que tome como argumentos las
coordenadas de un punto (x,y) en el plano cartesiano, as como las
coordenadas polares (r,a) por referencia. La funcin deber calcular r y
a a partir de x y y. De manera similar, escriba una funcin
La programacin procedural es un paradigma
pol2car(r,a,x,y) que realice la operacin inversa. Para probar ambas derivado de la programacin estructurada en
funciones, pida al usuario (dentro de la funcin main) las coordenadas
cartesianas de un punto, convirtalas a polares y nuevamente a el cual un programa se divide en
cartesianas, e imprima el resultado.
procedimientos, subrutinas, o funciones, los
2. Escriba funciones llamadas mcd(a,b) y mcm(a,b) que calculen y cuales simplemente consisten de una serie de
devuelvan, respectivamente, el mximo comn divisor y el mnimo
comn mltiplo de sus dos argumentos enteros. Use estas funciones instrucciones a ser ejecutadas.
dentro de la funcin main() para imprimir el mcd y mcm de dos
nmeros dados por el usuario.

3. Escriba una funcin que calcule el coeficiente binomial:


Cualquier procedimiento puede ser llamado
desde cualquier punto del programa,
incluyendo otros procedimientos, o el mismo.
tratando de que funcione para el mayor valor de n posible. Escriba una
funcin main para probar la funcin anterior.

Dentro de la programacin procedural, las


siguientes caractersticas son deseables:

Modularidad: Para cada procedimiento se especifica


SESION 7 un conjunto de argumentos de entrada y valores de
salida que le permiten comunicarse con otros
procedimientos.

Alcance: Cada procedimiento cuenta con su propio


espacio de variables, las cuales no pueden ser
accedidas desde otros procedimientos, salvo
mediante los mecanismos de paso de argumentos y
retorno de valores.
19/10/2016

Diseo descendente: La modularidad permite al programador



plantear primero una solucin al problema completo, para luego El alcance de una variable o funcin es el
enfocarse en los detalles. contexto desde el cual puede accederse a la
Cooperacin: Mltiples programadores pueden trabajar en un misma.
programa complejo, cada uno desarrollando un mdulo distinto.

Reusabilidad: Los procedimientos escritos para un programa En caso de ambigedad (variables con mismo
pueden reutilizarse en otros programas que requieran la misma
tarea. nombre pero distinto alcance), el lenguaje
Fcil depuracin: Ya que cada procedimiento realiza una tarea
C/C++ elegir la variable declarada en el
especializada, es posible depurar cada procedimiento de manera contexto mas cercano.
individual.

Fcil mantenimiento: Un programa procedural que se escribe


correctamente es fcil de entender, mantener y actualizar,
incluso por otros programadores.

int x = 1;
En programacin, el diseo descendente
int f() {
consiste en dividir una tarea compleja en return x;
sub-tareas, y resolver cada sub-tarea de }
manera independiente hasta que cada paso
int main() {
pueda implementarse fcilmente.
int x = 2;
{ Qu imprime este programa?
int x = 3;
cout << x << endl;
}
cout << x << endl;
cout << f() << endl;
}

Considere el problema de elaborar un sistema de De los dos programas siguientes, desarrolle


navegacin para un robot autnomo.
el que le haya sido asignado, aplicando los
El sistema puede dividirse en las siguientes etapas: conceptos de programacin estructurada y
Capturar informacin sobre el entorno a travs de sensores diseo descendente.
(cmaras, radares, micrfonos, etc.).

Procesar la informacin del entorno para extraer rasgos relevantes


(obstculos, objetos en movimiento, corredores, etc..)
El programa deber cumplir con lo siguiente:
La funcin main() solo debe contener declaraciones
Tomar decisiones de acuerdo a los rasgos observados y el estado de variables y llamadas a otras funciones.
actual (acelerar, detener, girar, etc..)
El programa debe dividirse en funciones, cada una
Actualizar el estado del sistema de acuerdo a las decisiones
tomadas (ajustar velocidad, direccin, etc..) de las cuales debe realizar una tarea especfica.
No debe haber variables globales. Las funciones
Cada una de estas etapas puede dividirse a su vez en otras compartirn informacin mediante los mecanismos
sub-etapas. de paso de argumentos y retorno de valores.
19/10/2016

Elabore un programa para medir la velocidad promedio de


clculo aritmtico de una persona. El programa deber presentar
al usuario una serie de operaciones (suma, resta, multiplicacin y La mayora de las aplicaciones actuales requieren
divisin) elegidas al azar. Para el caso de suma y resta, los
operandos sern de mximo tres dgitos, para la multiplicacin el manejo de grandes cantidades de datos.
de mximo dos dgitos, y para la divisin de tres dgitos para el
dividendo y uno para el divisor, y el resultado siempre debe ser
entero. Si requerimos almacenar N datos, uno podra
declarar variables llamadas x1, x2, , xN. Sin
Al iniciar, el programa pedir al usuario el nmero de
embargo, esto suele ser imprctico, ya que no es

operaciones a realizar. Posteriormente mostrar la operacin


actual (e.g., 182 + 324 = ) y esperar a que el usuario ingrese posible generalizar ciertas tareas para que se
la respuesta. El programa llevar la cuenta del nmero de
respuestas correctas, as como del tiempo de respuesta apliquen a todas las variables.
promedio (calculado solo para las respuestas correctas). Al final,
el programa reportar estos resultados.
Considere, por ejemplo, el problema de estimar
Subrutinas a considerar: imprimir pantalla o men inicial, pedir el histograma de serie de tiros de dado: en cada
datos iniciales al usuario, elegir operacin, ejecutar prueba,
reportar resultados. tiro el valor obtenido est entre 1 y 6. Despus
de N tiros, deseamos saber cuntas veces cay 1,
2, 3, etc..

Elabore un programa que implemente el juego de 3-en- int main() {


int h1, h2, h3, h4, h5, h6;
raya (Gato) para dos jugadores humanos. El programa int i, x, N = 1000;
deber inicialmente mostrar el tablero con las casillas h1 = h2 = h3 = h4 = h5 = h6 = 0;
numeradas del 1 al 9, y, de manera iterativa, pedir la for (i = 0; i < N; i++) {
casilla donde el siguiente jugador desea colocar su ficha, x = rand() % 6 + 1;

verificando que el movimiento sea vlido. Tambin deber


switch (x) {
case 1: h1++; break;
determinar en qu momento hay un ganador, o si llega a case 2: h2++; break;
haber un empate. case 3: h3++; break;
case 4: h4++; break;
case 5: h5++; break;
Sugerencia: utilice nueve variables tipo char para case 6: h6++; break;
representar cada una de las casillas del tablero. Cada }
casilla puede contener un espacio vaco, una X, o una O. }

cout << Tabla de frecuencias: << endl;


Subrutinas a considerar: solicitar jugador inicial (ficha cout << h(1) = << h1 << endl;

X/O), dibujar tablero, solicitar siguiente movimiento,


cout << h(2) = << h2 << endl;
cout << h(3) = << h3 << endl;
determinar ganador. cout << h(4) = << h4 << endl;
cout << h(5) = << h5 << endl;
cout << h(6) = << h6 << endl;
return 0;
}

Una mejor solucin consiste en declarar un


arreglo, el cual consiste en un grupo de
variables del mismo tipo y con el mismo
SESION 8 nombre, pero que se distinguen mediante un
subndice entero.

La forma de declarar un arreglo en C/C++ es:

tipo_datos nombre_arreglo[numero_elementos];
19/10/2016

En C/C++, los elementos de un arreglo de


tamao N estn indexados a partir de cero hasta Es posible pasar un arreglo como argumento
N-1. de una funcin.
Para acceder a los elementos individuales de un
arreglo, se escribe el nombre del arreglo seguido En la mayora de los casos, es necesario
de el subndice del elemento entre corchetes. tambin pasar como argumento el tamao
del arreglo.
Ejemplo:
Ejemplo:
int a[3];
a[0] = 5;
a[1] = 8; float promedio(float x[], int n);
a[2] = a[0] * a[1];

void histo(float x[], int nx, int h[], float a, float b, int nbins) {
int main() { int i, j;
int h[6]; float binsize = (b a) / nbins;
int i, x, N = 1000; for (i = 0; i < nbins; i++) { h[i] = 0; }
for (i = 0; i < nx; i++) {
for (i = 0; i < 6; i++) { h[i] = 0; }
j = (x[i] a) / binsize);
for (i = 0; i < N; i++) { if ((j >= 0) && (j < nbins)) h[j]++;
x = rand() % 6 + 1; }
h[x 1]++; }
}
int main() {
const int N = 1000;
cout << Tabla de frecuencias << endl; float x[N];
for (i = 0; i < 6; i++) { int i, h[6];
cout << h( << i+1 << ) = << h[i] << endl; for (i = 0; i < N; i++) { x[i] = rand() % 6 + 1; }
} histo(x, N, h, 1, 6.1, 6);
for (i = 0; i < 6; i++) { cout << h( << i << ) = << h[i] <<
return 0; endl;}
} return 0;
}

El compilador de C/C++ no verifica que los


subndices de los elementos de un arreglo estn 1. Escriba una funcin llamada minmax() que tome como
parmetros un arreglo de floats y su tamao, as como cuatro
dentro de los lmites correspondientes. variables por referencia: min, nmin, max, nmax. La funcin
deber encontrar el valor mnimo y mximo en el arreglo y
guardarlos en min y max, respectivamente, as como los
El programador debe tener cuidado de no subndices correspondientes en nmin y nmax.
sobrepasar estos lmites. De lo contrario, es posible
que sobrescriba la memoria asignada a otras 2. Utilizando la funcin anterior, escriba otra funcin para
normalizar los datos de un arreglo al rango [0,1] mediante la
variables. Ejemplo: siguiente transformacin:

int main() {
int a[10], x[10];
a[0] = 1; 3. Escriba un programa para probar las dos funciones anteriores,
x[10] = 2; utilizando como datos de ejemplo un arreglo de nmeros
aleatorios entre -10 y 10.
cout << a[0] << endl;
return 0;
}
19/10/2016

1. Escriba una funcin que tome tres arreglos como entrada: x[], h[], y[],
junto con sus respectivos tamaos nx, nh, ny. La funcin debe calcular la
convolucin de x y h, definida como:
Supongamos que nuestra aplicacin requiere
asumiendo que h[] vale cero fuera de sus lmites. Escriba un programa de de arreglos organizados en forma de matriz,
prueba que calcule la convolucin de las seales [3, -1, 2, 4] y [-3, 1, 3, -
1], considerando ny = nx + nh 1. Verifique la conmutatividad de la de manera que se haga referencia a cada
convolucin. elemento mediante dos subndices.
2. Escriba una funcin que tome como parmetros un arreglo de enteros y su
tamao. La funcin debe ordenar el arreglo de manera ascendente. Luego
escriba otra funcin que utilice la anterior para encontrar la mediana de un En C/C++ existen dos tcnicas para
arreglo de enteros. Escriba un programa para probar ambas funciones.
implementar este tipo de arreglos:
3. La entropa de un arreglo X[] se puede definir como:

donde pi = hi / N, hi es el i-simo bin de un histograma de X, n es el 1. Arreglos de arreglos


nmero de bins, y N es el tamao de X. Escriba una funcin que tome
como argumentos un arreglo, su tamao, y el nmero de bins, y devuelva 2. Orden lexicogrfico
la entropa del arreglo. Utilice las funciones histo() y minmax() vistas en
clase. Escriba un programa de prueba.

int x[M][N];
x[0] x[0][ x[0][ x[0]
0] 1] [N-
1]
x[1]
x[1][ x[1][ x[1]
0] 1] [N-
SESION 9 1]

x[M- x[M- x[M-


x[M-1] 1] 1] 1]
[0] [1] [N-
1]

En muchas aplicaciones, se requiere Suponga que se desea implementar un


organizar un gran nmero de datos en un arreglo de M x N donde el elemento (i,j) sea
arreglo cuyos elementos se distingan por igual a (i + j).
medio de dos o ms subndices.
Solucin #1:
Ejemplos: int i, j;
Matrices (subndices: rengln, columna) int x[M][N];
Imgenes (subndices: posicin (x,y) de un pixel) for (i = 0; i < M; i++) {
Video (subndices: posicin (x,y) y tiempo t) for (j = 0; j < N; j++) {
Seales electrofisiolgicas (EEG, EKG, fMRI) x[i][j] = i + j;
}
}
19/10/2016

int x[M*N];
Arreglos de arreglos Orden lexicogrfico
x 0 1 N-1
-Fcil acceso a -Pueden ser muy eficientes
elementos si se programa de manera
N+0 N+1 N+(N- adecuada.
1)
-Fcil acceso a
Ventajas
renglones -Es posible pasar arreglos
2N+0 2N+1 2N+
(N+1)
de dimensin y tamao
-Fcil extensin al caso arbitrarios como argumentos
multidimensional de una funcin.
-Uso limitado como -El acceso a elementos
argumentos de una requiere mayor cuidado y el
funcin: solo para clculo de la posicin del
Desventajas
arreglos cuyas elemento dentro del arreglo
dimensiones (excepto la lineal.
(M- (M- (M- primera) estn fijas.
1)N+ 1)N+ 1)N+
0 1 (N-1)

int i, j; Tambin es posible utilizar arreglos de ms de


int x[M*N]; dos dimensiones; es decir, arreglos en los
for (i = 0; i < M; i++) { cuales los elementos estn indexados mediante
for (j = 0; j < N; j++) { mas de dos subndices.
x[i*N+j] = i + j;
}
Ejemplo: arreglos tridimensionales
}

// Tcnica: arreglo de arreglos // Tcnica: orden lexicogrfico


// Declaracin // Declaracin
int x[M][N][P]; int x[M*N*P];

// Acceso al elemento (i,j,k) // Acceso al elemento (i,j,k)


x[i][j][k] = 0; x[i*N*P + j*P + k] = 0;

Arreglos de arreglos Orden lexicogrfico


void muestra(int x[][10], int m) { void muestra(int x[], int m, int n) {
int i, j;
for (i = 0; i < m; i++) {
int i, j;
for (i = 0; i < m; i++) {
Las operaciones elementales de una matriz son:
for (j = 0; j < 10; j++) { for (j = 0; j < n; j++) { Multiplicar el rengln i por una constante k.
cout << x[i][j] << " ";
}
cout << x[i*n+j] << " ";
Sumar al rengln i el rengln j multiplicado por k.
}
cout << endl; cout << endl; Intercambiar los renglones i y j.
} }
} }
Escriba tres funciones, una para cada operacin
int main() { int main() {
int x[10*10];
elemental. Las funciones deben tomar como
argumentos la matriz, sus dimensiones, y los
int x[10][10];
int i, j; int i, j;
for (i = 0; i < 10; i++) { for (i = 0; i < 10; i++) {
for (j = 0; j < 10; j++) {
parmetros requeridos para la operacin.
for (j = 0; j < 10; j++) {
x[i][j] = i + j; x[i*10+j] = i + j;
} }
} }
imprime(x, 10); imprime(x, 10, 10);
}
}
19/10/2016

Utilizando las funciones anteriores, implemente en una funcin el


mtodo de Gauss-Jordan para encontrar la solucin del sistema
Ax = b. La funcin debe tomar A, b, y el tamao del sistema n
como argumentos:

1. Iniciar con c = 0 y r = 0. SESION 10


2. Mientras c < n y r < n, hacer
a. Sea j = arg max i = r,,n-1 {A(i,c)}
b. Si r es distinto de j, intercambiar renglones r y j.
c. Multiplicar el rengln r por 1/A(r,c)
d. Si A(r,c) es distinto de cero
i. Para cada rengln i = r + 1, , n, sumar al rengln i el resultado de
multiplicar el rengln r por A(i,c).
ii. Incrementar r.
e. Incrementar c.
3. Para r desde n-1 hasta 0,
1. Para cada rengln i = 0,,r-1, sumar al rengln i el resultado de
multiplicar el rengln r por A(i,r).

1. Elabore una funcin que realice el producto C = AB de dos matrices La memoria puede verse como un conjunto
A de m x n y B de n x p. La funcin debe tomar como parmetros A,
B, C, m, n y p.
de celdas numeradas y ordenadas, cada una
de las cuales puede almacenar un byte de
2. Elabore una funcin que, dado el arreglo x[] de tamao N, calcule el informacin. El nmero correspondiente a
arreglo X[k] para k = 0,,N-1, dado por:
cada celda se conoce como su direccin.
X[k] se conoce como la transformada discreta de Fourier (TDF) de
x[n], y es una seal compleja la cual puede representarse como un Cuando se crea una variable, el compilador
arreglo de N x 2. Dada X[k], es posible recuperar x[n] mediante la
transformada discreta inversa de Fourier (TDIF):
reserva el nmero suficiente de celdas de
memoria (bytes) requeridos para almacenar la
variable, y se encarga de que los espacios
Elabore una funcin que implemente la (TDIF) y verifique que ambas reservados no se traslapen.
funciones son una inversa de la otra calculando el error cuadrtico
medio entre una seal de ruido aleatorio x[n], y la versin
recuperada a partir de la TDIF de la TDF de x[n].

3. Considere dos variables aleatorias X y Y, que pueden tomar valores entre En C/C++ es posible obtener la direccin de
0 y K-1. El histograma conjunto hij de X y Y es una matriz que
representa el nmero de veces que se observa simultneamente X=i y memoria donde se encuentra almacenada una
Y=j en una muestra. Escriba una funcin que tome como argumentos los variable mediante el operador de referencia &
arreglos X y Y, ambos de tamao N y con valores entre 0 y K-1, y calcule
el histograma conjunto (de tamao K x K).
Ejemplo:
4. La informacin mutua de dos variables aleatorias X y Y es una medida de
qu tan fcil es predecir X cuando se conoce Y, y se calcula como
int main() {
I(X,Y) = H(X) + H(Y) H(X,Y), int a = 10, b = 20;
donde H(X) es la entropa de X, y H(X,Y) es la entropa conjunta de X y Y, cout << &a << endl;
la cual puede calcularse a partir del histograma conjunto de X y Y como: cout << &b << endl;
return 0;
}
donde pij = hij / N. Escriba una funcin que calcule la informacin mutua
de dos arreglos.
19/10/2016

Podemos tambin obtener la cantidad de memoria que Cuando se declara un arreglo, se reserva un solo
ocupa una variable (en bytes) mediante el operador bloque contiguo de memoria para almacenar
sizeof: todos sus elementos, y stos se almacenan en la
memoria en el mismo orden que ocupan en el
int main() { arreglo:
int a = 10;
cout << Valor de a: << a << endl;
cout << Direccin de a: << &a << endl; int main() {
cout << Tamao de a: << sizeof(a) << endl; int i, a[10];
return 0; for (i = 0; i < 10; i++) {
} cout << &a[i] << endl;
}
return 0; Verificar que &a[i] es igual
} a &a[0] + i *
sizeof(int)

Un apuntador es una variable que contiene una direccin En C/C++, el nombre de un arreglo es tambin un apuntador al
de memoria (donde posiblemente se almacene el valor de primer elemento del arreglo.
otra variable). De hecho, el lenguaje C no puede distinguir entre un arreglo y
un apuntador: ambos son completamente intercambiables.
Para crear apuntadores, se utiliza el operador * como se
muestra a continuacin: int main() {
int i, a[10], *p;
int main() {
int a = 10; for (i = 0; i < 10; i++) { a[i] = i; };
int *p; p = a;
p = &a; for (i = 0; i < 10; i++) {
cout << Valor de p: << p << endl;
cout << Valor en p: << *p << endl; cout << p[i] << endl;
cout << Direccin de p: << &p << endl; }
}
return 0;
}

Recuerde que un apuntador siempre est asociado con el


tipo de dato al que apunta (e.g., apuntador a int,
Cuando se declara un arreglo, se reserva un solo apuntador a float, etc.).
bloque contiguo de memoria para almacenar
todos sus elementos, y stos se almacenan en la Esto hace posible definir la operacin p+k donde p es un
memoria en el mismo orden que ocupan en el apuntador y k es un entero. El resultado de esta operacin
arreglo: es
p + k * sizeof(tipo)
int main() {
int i, a[10]; donde tipo es el tipo de datos asociado a p.
for (i = 0; i < 10; i++) {
cout << &a[i] << endl; Notar entonces que, si p es un arreglo
}
return 0; &p[k] es equivalente a p+k y p[k] equivale a *(p+k)
}
19/10/2016

void MulRen(float *m, int n, int r, float k) {


float *p = m + r * n;
for (int j = 0; j < n; j++) { p[j] *= k; } El lenguaje C/C++ define una constante especial
} llamada NULL, el cual es un apuntador que no
void SumRen(float *m, int n, int r1, int r2, float k) {
apunta a ningn lugar vlido en la memoria y tiene
float *p1 = m + r1 * n; valor numrico cero.
float *p2 = m + r2 * n;
for (int j = 0; j < n; j++) { p1[j] += p2[j] * k; }
} Se recomienda siempre inicializar los apuntadores
con una direccin vlida, o bien, con NULL, de
void InterRen(float *m, int n, int r1, int r2) { manera que no sea posible sobrescribir informacin
float t;
float *p1 = m + r1 * n;
accidentalmente.
float *p2 = m + r2 * n;
for (int j = 0; j < n; j++) {
t = p1[j]; p1[j] = p2[j]; p2[j] = t;
El operador new devuelve NULL si no es capaz de
} reservar la cantidad de memoria solicitada. Esto
} permite detectar la falta de memoria en un
programa.

Declare un arreglo bidimensional X de M x N


Para cada funcin, el compilador de C/C++ elementos como un arreglo de arreglos y llnelo
reserva una cierta cantidad de memoria para con nmeros aleatorios entre 0 y 10.
almacenar las variables locales.
Imprima las direcciones de memoria de cada uno
En algunas ocasiones ser necesario utilizar un de los elementos y verifique que stos estn
arreglo que requiera una mayor cantidad de organizados en orden lexicogrfico.
memoria:

int main() { Declare un apuntador p y asgnele la direccin del


int arreglote[1024 * 1024]; primer elemento de X. Ahora p acta como un
return 0; arreglo unidimensional que hace referencia a los
} mismos elementos que X, pero en orden
lexicogrfico. Utilice p para imprimir el contenido
del arreglo.

Escriba una funcin llamada promedio(x,n) que calcule y devuelva


el promedio de un arreglo x de tamao n. Escriba otra funcin
La solucin consiste en asignar memoria a un arreglo de llamada punto(x,y,n) que devuelva el producto punto de dos
manera dinmica mediante el operador new: vectores x y y, ambos de tamao n.

int main() { Considere el problema de regresin lineal simple, donde uno desea
int i, n = 1024 * 1024; encontrar una funcin de la forma y(x) = mx + b, dado un conjunto
de n datos (xi , yi). Se puede demostrar que los parmetros de la recta
int *a = new int[n]; que mejor se ajusta a los datos estn datos por:
if (a != NULL) {
for (i = 0; i < n; i++) { a[i] = i; }
delete[] a; _
donde representa el producto punto, y x denota el promedio de x.
}
return 0; Escriba una funcin que tome x, y, n como argumentos y que calcule
} y devuelva m y b. Escriba un programa que genere un conjunto de
1,000,000 de datos de prueba con el modelo yi = 3xi 5 + ei, donde
Es importante siempre liberar la memoria reservada xi ~ U(-100,100) y ei ~ U(-10,10), y luego utilice la funcin anterior
para recuperar m y b a partir de los datos de prueba.
mediante el operador delete[] una vez que ya no se
utiliza.
19/10/2016

Escriba una funcin llamada genera(F, m, n, p) que genere una matriz binaria
aleatoria F de tamao m x n donde cada elemento sea igual a 1 con probabilidad p.
La librera <fstream> define los elementos
Escriba una funcin llamada imprime(F, m, n) que borre la pantalla (usando
necesarias para el manejo de archivos. Los

system(cls)) y luego imprima la matriz binaria F de tamao m x n, donde los


ceros se imprimirn como espacios en blanco y los unos como asteriscos.
mas importantes son:
Escriba una funcin llamada evolucion(F, G, m, n) que tome como parmetros
dos matrices de enteros, F y G, de tamao m x n, donde cada elemento es binario (0
1). Digamos que si un elemento vale 1, la celda correspondiente est viva. La
funcin debe calcular Gi,j a partir de los vecinos de Fi,j, considerando las siguientes ofstream : clase de datos utilizada para escritura
reglas: de archivos.
1. Si una celda viva tiene menos de dos vecinos vivos, entonces morir.
2. Si una celda viva tiene mas de tres vecinos vivos, entonces morir.
3. Una celda viva continuar en ese estado solamente si tiene dos o tres vecinos vivos. ifstream : clase de datos utilizada para lectura de
4. Una celda muerta cobrar vida si tiene tres vecinos vivos, de lo contrario continuar en ese
estado. archivos.
Usando las tres funciones anteriores, escriba un programa que implemente el juego
de la vida: el programa iniciar mostrando una matriz binaria aleatoria, y luego, de
manera iterativa, encontrar una nueva matriz realizando una evolucin, la mostrar
en pantalla, y esperar a que el usuario presione la tecla Enter (usando la funcin
getchar()). La iteracin continuar hasta que el usuario presione la tecla x
(seguida de Enter).

Para acceder a un archivo (escritura o lectura) es


necesario siempre abrir primero el archivo
mediante la funcin open(), que recibe como
parmetro el nombre del archivo.

De igual manera, una vez que finaliza el acceso al


SESION 11
archivo, es necesario cerrarlo mediante la funcin
close().

Ejemplo: creacin de un archivo de salida

ofstream of;
of.open(archivo.txt, ios::out);
of << Hola mundo! << endl;
of.close();

MODIFICADORES DE SALIDA AL ARCHIVO

En C++, las operaciones de entrada y salida se


manejan a travs objetos llamados flujos. ios::out . Inicio y reemplaza el existente
ios::trunc . Trunk
ios::app . Append al final
Existen tres libreras estndar para el manejo de
flujos:
<iostream> para entrada desde y salida hacia consola
<fstream> para entrada desde y salida hacia archivos
<sstream> para entrada desde y salida hacia objetos
tipo string (cadenas de caracteres).
19/10/2016

Muchos programas como Excel o Matlab pueden leer archivos de


datos en forma de matriz, los cuales son fciles de exportar
Como se observ en el ejemplo anterior, la desde un programa en C++.
escritura de datos en un archivo de texto se
realiza mediante el operador de insercin <<, int main() {

al igual que con la instruccin cout. float x, y, r;


int i, int n = 100; El archivo puede abrirse desde el
ofstream of(datos.txt); momento de declararlo
for (i = 0; i < n; i++) {
x = 10.0 * rand() / RAND_MAX 5.0;
r = 1.0 * rand() / RAND_MAX - 0.5;
0
y = 0.5 * x - 3.0 + r; -6 -4 -2 0 2 4 6
-1
of << x << \t << y << endl;
-2
} -3

of.close(); -4

} Los datos generados pueden


-5

-6
graficarse en Excel fcilmente
-7

Muchos programas como Excel o Matlab pueden leer archivos de


datos en forma de matriz, los cuales son fciles de exportar
desde un programa en C++. De manera similar, podemos leer de un
archivo de texto al igual que se hace
con la instruccin cin: fft (x) {
int main() {
n=length(x);
float x, y, r; int main() { if (n==1) return x;
int i, int n = 100; int n, k, N = 4096; m = n/2;
ofstream of(datos.txt); float x[N], X[N * 2]; X = (x_{2j})_{j=0}^{m-1};
ifstream in(eeg.txt); Y = (x_{2j+1})_{j=0}^{m-
for (i = 0; i < n; i++) { ofstream out(espectro.txt); 1};
x = 10.0 * rand() / RAND_MAX 5.0; for (n = 0; n < N; n++) { in >> x[n]; } X = FFT(X);
r = 1.0 * rand() / RAND_MAX - 0.5; fft(x, X, N); Y = FFT(Y);
for (k = 0; k < N/2; k++) { U = (X_{k mod
y = 0.5 * x - 3.0 + r;
out << sqrt(X[k] * X[k] + X[k+N] * m})_{k=0}^{n-1};
of << x << \t << y << endl; X[k+N]) << endl; V = (g^{-k}Y_{k mod
} } m})_{k=0}^{n-1};
of.close(); return 0; return U+V;
} }
}

Muchos programas como Excel o Matlab pueden leer archivos de


datos en forma de matriz, los cuales son fciles de exportar 250

desde un programa en C++. 200


150
100
50
int main() { 0
-50
float x, y, r; -100

int i, int n = 100; El archivo puede abrirse desde el


-150
-200
ofstream of(datos.txt); momento de declararlo -250
Seal de EEG
for (i = 0; i < n; i++) {
30000
x = 10.0 * rand() / RAND_MAX 5.0;
25000
r = 1.0 * rand() / RAND_MAX - 0.5;
20000
y = 0.5 * x - 3.0 + r;
15000
of << x << \t << y << endl;
10000
}
of.close(); 5000

} 0
Espectro de frecuencias de la seal
19/10/2016

// Esta funcin imprime el contenido de un archivo


void muestra_archivo(char *s) {
El operador ! puede utilizarse para saber si un int n = 65536;
archivo se abri correctamente. En caso de char temp[n];
haber algn problema, este operador devuelve ifstream in(s);
Iterar hasta llegar al final del archivo
verdadero. if (!in) return;
while (!in.eof()) {
in.getline(temp, n);
Es posible leer una lnea completa de un if (!in.eof()) { cout << temp << endl; }
archivo de texto y almacenarla en una cadena, }
mediante la funcin getline(char *s, int }
in.close();

n).
int main() {
Para detectar si se ha llegado al final del muestra_archivo(ejemplo.cpp);
return 0;
archivo, se puede utilizar la funcin eof(). }

// Esta funcin imprime el contenido de un archivo


void muestra_archivo(char *s) { // Esta funcin imprime el contenido de un archivo
int n = 65536; void muestra_archivo(char *s) {
char temp[n]; int n = 65536;
ifstream in(s); char temp[n];
if (!in) return; ifstream in(s);
while (!in.eof()) { if (!in) return;
while (!in.eof()) { Leer la siguiente lnea del archivo
in.getline(temp, n); y almacenarla en la cadena temp
if (!in.eof()) { cout << temp << endl; } in.getline(temp, n);
} if (!in.eof()) { cout << temp << endl; }
in.close(); }
} in.close();
}
int main() {
muestra_archivo(ejemplo.cpp); int main() {
return 0; muestra_archivo(ejemplo.cpp);
} return 0;
}

// Esta funcin imprime el contenido de un archivo Haga un programa que lea una serie de nmeros enteros
void muestra_archivo(char *s) { desde un archivo de texto. El primer nmero en el archivo
int n = 65536; indica cuntos datos ms hay en el archivo. El programa
char temp[n];
debe almacenar todos los datos (excepto el primero) en un
ifstream in(s); Verifica la apertura del archivo arreglo X de tamao adecuado.
if (!in) return;
while (!in.eof()) {
in.getline(temp, n); Luego, el programa debe generar otro arreglo Y que
if (!in.eof()) { cout << temp << endl; } contenga los mismos datos que X, pero sin repetirse; es
} decir, si un nmero aparece mltiples veces en X,
in.close(); aparecer solo una vez en Y.
}

int main() { Guarde el contenido de Y en un archivo de texto con el


muestra_archivo(ejemplo.cpp); mismo formato que el archivo de entrada; es decir,
return 0; escribiendo primero el nmero de datos, y posteriormente
} los datos.
19/10/2016

Ejemplo de ejecucin:
Picos de frecuencia
Archivo de entrada Archivo de salida
12 7
5 5
8 8

Frecuencia
7 7
8 9
9 2
2 3
3 4
4
5
4
5
8
Valor de intensidad

Histograma de mri.txt

Escriba una funcin


escmat(float *x, int m, int n, char *s)
que escriba una matriz x de tamao m x n en el archivo con nombre s.
Cada rengln de la matriz debe escribirse en un solo rengln del
archivo, y los valores de cada rengln deben separarse por tabuladores
\t.

Escriba una funcin


leemat(float &*x, int &m, int &n, char *s)
que lea una matriz x desde un archivo s en el formato utilizado por
escmat(). Note que el tamao de la matriz es desconocido y debe
obtenerse a partir del mismo archivo (por ejemplo, contando el nmero
total de elementos y el nmero de renglones). Por lo mismo, el espacio
para la matriz debe reservarse (pero no liberarse) de manera dinmica
dentro de la funcin.

Para probar ambas funciones, genere una matriz de nmeros aleatorios.


Gurdela en un archivo y luego recupere la matriz a partir del archivo y
verifique que es idntica a la original. As mismo, intente leer y exportar
matrices en este formato desde Excel.

Una imagen digital puede verse como una matriz donde cada elemento
representa el nivel de intensidad o brillo del pixel correspondiente.

El archivo mri.txt contiene una imagen de resonancia magntica cerebral


en el formato utilizado por la funcin leemat(). Importe este archivo en
Excel y grafique los datos utilizando el tipo de grfico Superficie-
Contorno. Observe cmo los distintos tejidos se muestran con un color
distinto.

Elabore un programa en C++ en el que se cargue la imagen mri.txt


(como una matriz) y calcule el histograma h de los niveles de intensidad
(los cuales son enteros entre 0 y 255). Guarde el histograma en otro
archivo y grafquelo en Excel eliminando el primer dato.

Observe que existen cuatro picos en el histograma. Estime a simple


vista los valores de intensidad que separan estos picos. Suponga que
uno de los picos est entre los valores a y b. Elabore un programa que
modifique la imagen mri.txt haciendo cero cualquier valor de intensidad
que quede fuera del rango [a,b). Guarde la nueva imagen en otro archivo
(e.g., mri2.txt) y mustrela en Excel. Haga lo mismo para los cuatro
picos.