Programacion I
Programacion I
Programacion I
PROGRAMACIÓN
Curso de Programación en C++
Facultad de Ingeniería de sistemas e Informática
UNMSM
DESCRIPCIÓN Y OBJETIVOS
• Este curso tiene como objetivos:
– Repasar los conceptos básicos de programación estructurada
en lenguaje C/C++
– Incrementar la práctica en la elaboración de programas para
problemas específicos
– Evaluar las habilidades de programación de los aspirantes al
posgrado
#include <iostream>
int main() {
cout << “Hola mundo!” << endl;
return 0;
}
ESTRUCTURA BÁSICA DE UN PROGRAMA EN
C/C++
Ejemplo de un programa básico en C/C++
int main() {
cout << “Hola mundo!” << endl;
return 0;
}
ESTRUCTURA BÁSICA DE UN PROGRAMA EN
C/C++
Ejemplo de un programa básico en C/C++
#include <iostream>
Uso global de las librerías estándard
using namespace std;
int main() {
cout << “Hola mundo!” << endl;
return 0;
}
ESTRUCTURA BÁSICA DE UN PROGRAMA EN
C/C++
Ejemplo de un programa básico en C/C++
#include <iostream>
#include <iostream>
int main() {
cout << “Hola mundo!” << endl;
return 0;
}
Código a ejecutar por la función principal
COMPILACIÓN Y EJECUCIÓN
Antes de poder ejecutar el programa que escribimos, es
necesario compilarlo.
• Ejemplo de salida:
****************************
* Me llamo Chamo *
****************************
VARIABLES Y ASIGNACIÓN
• Para declarar variables en C/C++ se escribe primero el
tipo de variable, seguido del nombre de una o más
variables (separados por comas).
• Ejemplos:
int a;
int i, j, k;
float x, y;
ASIGNACIÓN DE VARIABLES
Para asignar un valor a una variable se utiliza el operador
=
Es posible asignar valores al momento de declarar las
variables;
Ejemplos:
x = 10;
float a = 3.4, b = 5.6; c = -1.7;
TIPOS DE VARIABLES
char – entero de 8 bits
short – entero con signo de 16 bits
x = 5 / 2; // el resultado es 2
x = 5.0 / 2; // el resultado es 2.5
• Ejemplos:
• Ejemplo de salida:
• Ejemplo:
int main() {
int x;
cout << “Escribe un numero entero: “;
cin >> x;
cout << “El numero que escribiste es: “;
cout << x << endl;
}
PRÁCTICA #3
Modifique el programa anterior para que el usuario
pueda introducir los coeficientes a, b, c, sin necesidad de
recompilar el programa.
4. Escriba un programa que dados dos puntos en el plano (x1,y1) y (x2,y2), calcule y
escriba la distancia entre ellos (sugerencia: utilice la función sqrt() de la librería
math.h).
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.
EXPRESIONES BOOLEANAS Y
ESTRUCTURAS DE DECISION
SESION 2
EXPRESIONES BOOLEANAS
Una expresión booleana es aquella que después de
evaluarse puede tomar uno de dos posibles resultados:
verdadero o falso.
En lenguaje C/C++, los valores verdadero y falso se
representan, respectivamente, con los números 1 y 0.
Sin embargo, cualquier valor distinto de cero es
considerado como “verdadero”.
OPERADORES DE COMPARACIÓN
• Una manera de formar expresiones booleanas es
utilizando los operadores de comparación:
a == b - igualdad
a<b - menor a
a>b - mayor a
a != b - distinto de
a <= b - menor o igual a
a >= b - mayor o igual a
ESTRUCTURAS DE DECISIÓN
• Una de las principales aplicaciones de las expresiones
booleanas es la toma de decisiones:
if (expresion) {
// código a ejecutar si la
// expresión es verdadera
} else {
// código a ejecutar si la
// expresión es falsa
}
OPERADORES BOOLEANOS
• Las expresiones booleanas pueden combinarse mediante
los operadores booleanos clásicos:
* Es importante recordar que c1, c2, etc. deben ser constantes enteras!
EJEMPLO: MENÚ DE OPCIONES
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.- División” << endl;
cout << “3.- Producto” << endl; cout << “Elige una opción: “ << endl;
cin << opcion;
cout << “4.- División” << endl; if (opcion == 1) {
cout << “Elige una opción: “ << endl; r = a + b;
} else {
cin << opcion; if (opcion == 2) {
switch (opcion) { r = a – b;
} else {
case 1: r = a + b; break; if (opcion == 3) {
case 2: r = a – b; break; r = a * b;
} else {
case 3: r = a * b; break; if (opcion == 4) {
case 4: r = a / b; break; r = a / b;
} else {
default: cout << “Opcion invalida” << endl; cout << “Opcion invalida” << endl;
}
}
}
cout << “El resultado es “ << r << endl; }
}
cout << “El resultado es “ << r << endl;
PRÁCTICA #1
• En la música occidental, las notas Do, Re, Mi, Fa, Sol, La,
y Si suelen representarse mediante las letras C, D, E, F, G,
A, y B, respectivamente.
while (expresion) {
// Código a ejecutar de manera
repetida
// mientras la expresión sea verdadera
}
EJEMPLO
• El siguiente programa calcula el factorial de n, donde n es dado por el usuario:
int main() {
int i, n, factorial;
cout << “Dame el valor de n: “;
cin >> n;
factorial = 1;
i = 1;
while (i <= n) {
factorial = factorial * i;
i = i + 1;
}
cout << “El factorial de “ << n << “ es “ << factorial << endl;
}
PRÁCTICA #1
Elabore un programa que pida al usuario un 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.
INSTRUCCIÓN DO…WHILE
• La instrucción while siempre verifica primero que la condición de
control sea verdadera antes de ejecutar el bloque de código.
do {
// bloque de código a ejecutar al menos una
vez
} while (expresion);
PRÁCTICA #2
Realice un programa que pida al usuario una serie de
números enteros no negativos utilizando un ciclo do…
while. Una vez que el usuario introduzca un número
negativo, el ciclo deberá terminar y el programa deberá
imprimir el mayor, menor, y promedio de todos los
números ingresados (excepto el último).
TAREA #4
1. Elabore un programa que implemente el método de bisección para
encontrar la raíz en el intervalo (0, ) de la función
x
f ( x) log(1 cos x)
2.
2 trapecio para
Elabore un programa que implemente la regla del
calcular la integral
2
1
0 1 x e
(sin x ) /( x 1) 2
dx
3. Elabore un programa que elija un número aleatorio n entre 1 y 100
(usar funciones rand() y srand() de stdlib.h). El programa dará al
usuario 5 oportunidades para adivinar el número: en cada oportunidad,
el usuario ingresará su respuesta y el programa indicará si la respuesta
es menor, mayor, o igual a n (en cuyo caso el usuario habrá ganado).
Si después de 5 intentos el usuario no ha adivinado, entonces habrá
perdido el juego.
TAREA #4 (SUGERENCIAS)
• Algoritmo de bisección:
Dado el intervalo (a, b) y una función f(x) contínua en (a,b):
1. Verificar que f(a) f(b) < 0. De lo contrario, no podemos asegurar que
existe una raíz en el intervalo dado y el algoritmo debe terminar.
2. Hacer r=a. Iterar hasta que r converja:
a. Obtener una aproximación de la raíz r como r = (a+b) / 2 .
b. Si f(a) f(r) < 0, entonces la raíz está en la mitad izquierda del
intervalo. Por lo tanto, hacer b = r.
c. En caso contrario, entonces la raíz está en la mitad derecha del
intervalo. Por lo tanto, hacer a = r.
h n 1
f ( x)dx f (a ) f (b) 2 f (a kh),
b
a 2 k 1
donde n es el número de segmentos y h = (b-a)/n.
ESTRUCTURAS DE ITERACION
II
SESION 5
LA INSTRUCCIÓN FOR
• La otra estructura en C/C++ para la realización de ciclos es
proporcionada por la instrucción for, cuya sintaxis es:
inicializacion;
while (condicion) {
// bloque de instrucciones
incremento;
}
EJEMPLO
• La instrucción for se usa típicamente para realizar ciclos
controlados por contador, ya que permite ver todos los
parámetros del ciclo en una sola línea:
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;
}
CICLOS ANIDADOS
En muchas aplicaciones se requiere utilizar dos o más
ciclos anidados, de manera que un ciclo exterior no
complete una iteración hasta que los ciclos interiores
hayan finalizado.
int main() {
int i, j, k;
int t0;
for (i = 0; i < 10; i++) {
for (j = 0; j < 10; j++) {
for (k = 0; k < 10; k++) {
cout << "\r" << i << j << k;
cout.flush();
t0 = time(0);
while (t0 == time(0)) {}
}
}
}
return 0;
}
PRÁCTICA #1
a) Escriba un programa que, dado un número entero n,
determine si n es primo o no. Sugerencia: verifique si
n es divisible entre algún entero entre 2 y sqrt(n).
b) Modifique el programa anterior para que pida al
usuario un entero positivo N, y luego imprima los
primeros N números primos.
4. Modifique el programa anterior para que imprima una tabla de la integral de f(x,y) para
valores enteros de r desde 1 hasta 20.
FUNCIONES
SESION 6
FUNCIONES
• Una función es una sección de código que realiza una tarea
específica, y que puede ser llamada desde otra función.
int main() {
int n;
for (n = 1; n <= 10; n++) {
cout << n << “! = “ << factorial(n) << endl;
}
}
FUNCIONES TIPO VOID
• Es posible definir una función que no devuelva ningún
resultado si se declara de tipo void:
int main() {
int a = 1, b = 2;
intercambia(a, b);
cout << “a = “ << a << “, b = “ << b << endl;
}
n 0 n!
donde N es dado como segundo argumento.
1 ( x )2
n , ( x) exp
2 2 2
c) Utilice la regla del trapecio para mostrar que 4
n ( x) dx 1.
4
,
TAREA #6
1. Escriba una función 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 función deberá calcular r y a a partir de x y y. De manera similar, escriba
una función pol2car(r,a,x,y) que realice la operación inversa. Para probar
ambas funciones, pida al usuario (dentro de la función main) las coordenadas
cartesianas de un punto, conviértalas a polares y nuevamente a cartesianas, e imprima
el resultado.
n n!
,
tratando de que funcione para el mayor (n dek )!n kposible.
k valor ! Escriba una función main
para probar la función anterior.
PROGRAMACION
ESTRUCTURADA
SESION 7
PROGRAMACIÓN ESTRUCTURADA
• Un programa estructurado se compone de tres tipos básicos de
estructuras de flujo:
int f() {
return x;
}
int main() {
¿Qué imprime este programa?
int x = 2;
{
int x = 3;
cout << x << endl;
}
cout << x << endl;
cout << f() << endl;
}
TAREA #7
• De los dos programas siguientes, desarrolle el que le haya sido
asignado, aplicando los conceptos de programación
estructurada y diseño descendente.
tipo_datos nombre_arreglo[numero_elementos];
ARREGLOS
• En C/C++, los elementos de un arreglo de tamaño N están
indexados a partir de cero hasta N-1.
• Ejemplo:
int a[3];
a[0] = 5;
a[1] = 8;
a[2] = a[0] * a[1];
HISTOGRAMA: SOLUCIÓN CON
ARREGLOS
int main() {
int h[6];
int i, x, N = 1000;
for (i = 0; i < 6; i++) { h[i] = 0; }
for (i = 0; i < N; i++) {
x = rand() % 6 + 1;
h[x – 1]++;
}
int main() {
int a[10], x[10];
a[0] = 1;
x[10] = 2;
cout << a[0] << endl;
return 0;
}
ARREGLOS COMO ARGUMENTOS DE FUNCIONES
• Es posible pasar un arreglo como argumento de una función.
• Ejemplo:
int main() {
const int N = 1000;
float x[N];
int i, h[6];
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] << endl;
return 0;
}
PRÁCTICA #1
1. Escriba una función llamada minmax() que tome como parámetros un
arreglo de floats y su tamaño, así como cuatro variables por
referencia: min, nmin, max, nmax. La función deberá encontrar el
valor mínimo y máximo en el arreglo y guardarlos en min y max,
respectivamente, así como los subíndices correspondientes en nmin y
nmax.
2. Escriba una función que tome como parámetros un arreglo de enteros y su tamaño. La
función debe ordenar el arreglo de manera ascendente. Luego escriba otra función que
utilice la anterior para encontrar la mediana de un arreglo de enteros. Escriba un programa
para probar ambas funciones.
• Ejemplos:
– Matrices (subíndices: renglón, columna)
– Imágenes (subíndices: posición (x,y) de un pixel)
– Video (subíndices: posición (x,y) y tiempo t)
– Señales electrofisiológicas (EEG, EKG, fMRI)
ARREGLOS BIDIMENSIONALES
• Supongamos que nuestra aplicación requiere de arreglos
organizados en forma de matriz, de manera que se haga
referencia a cada elemento mediante dos subíndices.
1. Arreglos de arreglos
2. Orden lexicográfico
ARREGLOS DE ARREGLOS
int x[M][N];
x[0] x[0][0] x[0][1] x[0]
[N-1]
x[1]
x[1][0] x[1][1] x[1]
[N-1]
x[M-1]
x[M- x[M- x[M-
EJEMPLO: ARREGLOS DE ARREGLOS
• Suponga que se desea implementar un arreglo de M x N donde
el elemento (i,j) sea igual a (i + j).
• Solución #1:
int i, j;
int x[M][N];
for (i = 0; i < M; i++) {
for (j = 0; j < N; j++) {
x[i][j] = i + j;
}
}
ORDEN LEXICOGRÁFICO
int x[M*N];
x 0 1 N-1
1. Iniciar con c = 0 y r = 0.
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 renglón r por 1/A(r,c)
d. Si A(r,c) es distinto de cero
i. Para cada renglón i = r + 1, …, n, sumar al renglón i el resultado de multiplicar el
renglón r por –A(i,c).
ii. Incrementar r.
e. Incrementar c.
3. Para r desde n-1 hasta 0,
1. Para cada renglón i = 0,…,r-1, sumar al renglón i el resultado de multiplicar el renglón r
por –A(i,r).
TAREA #9 – PARTE 1
1. Elabore una función que realice el producto C = AB de dos matrices A de m x n y B
de n x p. La función debe tomar como parámetros A, B, C, m, n y p.
2. Elabore una función que, dado el arreglo x[] de tamaño N, calcule el arreglo X[k]
para k = 0,…,N-1, dado por:
N 1
X [k ] x[n] exp{i (2kn / N )}.
X[k] se conoce como la transformada
n 0 discreta de Fourier (TDF) de x[n], y es una
señal compleja la cual puede representarse como un arreglo de N x 2. Dada X[k], es
posible recuperar x[n] mediante la transformada discreta inversa de Fourier (TDIF):
1 N 1
n] X [kla] exp{
Elabore una función quex[implemente i (2kn
(TDIF) y /verifique
N )}. que ambas funciones
N k 0
son una inversa de la otra calculando el error cuadrático medio entre una señal de
ruido aleatorio x[n], y la versión recuperada a partir de la TDIF de la TDF de x[n].
TAREA #9 – PARTE 2
3. Considere dos variables aleatorias X y Y, que pueden tomar valores entre 0 y K-1. El
histograma conjunto hij de X y Y es una matriz que representa el número de veces
que se observa simultáneamente X=i y Y=j en una muestra. Escriba una función que
tome como argumentos los arreglos X y Y, ambos de tamaño N y con valores entre 0
y K-1, y calcule el histograma conjunto (de tamaño K x K).
donde pij = hij / N. Escriba una función que calcule la información mutua de dos
arreglos.
APUNTADORES Y ASIGNACION
DINAMICA DE MEMORIA
SESION 10
ALMACENAMIENTO EN MEMORIA
• La memoria puede verse como un conjunto de celdas
numeradas y ordenadas, cada una de las cuales puede
almacenar un byte de información. El número correspondiente
a cada celda se conoce como su dirección.
• Ejemplo:
int main() {
int a = 10, b = 20;
cout << &a << endl;
cout << &b << endl;
return 0;
}
TAMAÑO DE UNA VARIABLE
Podemos también obtener la cantidad de memoria que ocupa una
variable (en bytes) mediante el operador sizeof:
int main() {
int a = 10;
cout << “Valor de a: “ << a << endl;
cout << “Dirección de a: “ << &a << endl;
cout << “Tamaño de a: “ << sizeof(a) << endl;
return 0;
}
APUNTADORES
Un apuntador es una variable que contiene una dirección de memoria
(donde posiblemente se almacene el valor de otra variable).
int main() {
int a = 10;
int *p;
p = &a;
cout << “Valor de p: “ << p << endl;
cout << “Valor en p: “ << *p << endl;
cout << “Dirección de p: “ << &p << endl;
}
APUNTADORES
Un apuntador es una variable que contiene una dirección de memoria
(donde posiblemente se almacene el valor de otra variable).
int main() {
int a = 10;
int *p;
p = &a;
cout << “Valor de p:La“variable
<< p p<<
es endl;
de tipo
cout << “Valor en p:“apuntador
“ << *pa int”
<< endl;
cout << “Dirección de p: “ << &p << endl;
}
ALMACENAMIENTO DE ARREGLOS
• Cuando se declara un arreglo, se reserva un solo bloque contiguo
de memoria para almacenar todos sus elementos, y éstos se
almacenan en la memoria en el mismo orden que ocupan en el
arreglo:
int main() {
int i, a[10];
for (i = 0; i < 10; i++) {
cout << &a[i] << endl;
}
return 0;
}
ALMACENAMIENTO DE ARREGLOS
• Cuando se declara un arreglo, se reserva un solo bloque contiguo
de memoria para almacenar todos sus elementos, y éstos se
almacenan en la memoria en el mismo orden que ocupan en el
arreglo:
int main() {
int i, a[10];
for (i = 0; i < 10; i++) {
cout << &a[i] << endl;
}
return 0; Verificar que &a[i] es igual a
} &a[0] + i * sizeof(int)
ARREGLOS Y APUNTADORES
• En C/C++, el nombre de un arreglo es también un apuntador al primer elemento del arreglo.
int main() {
int i, a[10], *p;
return 0;
}
ARITMÉTICA DE APUNTADORES
• Recuerde que un apuntador siempre está asociado con el tipo de dato al
que apunta (e.g., apuntador a int, apuntador a float, etc).
p + k * sizeof(tipo)
int main() {
int arreglote[1024 * 1024];
return 0;
}
ASIGNACIÓN DINÁMICA DE MEMORIA
• La solución consiste en asignar memoria a un arreglo de manera dinámica
mediante el operador new:
int main() {
int i, n = 1024 * 1024;
int *a = new int[n];
if (a != NULL) {
for (i = 0; i < n; i++) { a[i] = i; }
delete[] a;
}
return 0;
}
Considere el problema de regresión lineal simple, donde uno desea encontrar una
función de la forma y(x) = mx + b, dado un conjunto de n datos (xi , yi). Se puede
demostrar que los parámetros de la recta que mejor se ajusta a los datos están datos
por: x y nxy
m , b y mx ,
x x nx 2
_
Escriba una función 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 xi ~ U(-100,100) y ei ~ U(-10,10), y luego
utilice la función anterior para recuperar m y b a partir de los datos de prueba.
TAREA #10 – PARTE 2
• Escriba una función llamada genera(F, m, n, p) que genere una matriz binaria
aleatoria F de tamaño m x n donde cada elemento sea igual a 1 con probabilidad p.
• Escriba una función llamada evolucion(F, G, m, n) que tome como parámetros dos
matrices de enteros, F y G, de tamaño m x n, donde cada elemento es binario (0 ó 1).
Digamos que si un elemento vale 1, la celda correspondiente está “viva”. La función debe
calcular Gi,j a partir de los “vecinos” de Fi,j, considerando las siguientes reglas:
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.
4. Una celda muerta cobrará vida si tiene tres vecinos vivos, de lo contrario continuará en ese estado.
• 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 evolución, la mostrará en pantalla, y
esperará a que el usuario presione la tecla Enter (usando la función getchar()). La
iteración continuará hasta que el usuario presione la tecla ‘x’ (seguida de Enter).
MANEJO DE ARCHIVOS
SESION 11
FLUJOS DE ENTRADA Y SALIDA EN C++
En C++, las operaciones de entrada y salida se manejan a través
objetos llamados flujos.
ofstream of;
of.open(“archivo.txt”);
of << “Hola mundo!” << endl;
of.close();
ESCRITURA DE ARCHIVOS DE TEXTO
Como se observó en el ejemplo anterior, la escritura de
datos en un archivo de texto se realiza mediante el
operador de inserción <<, al igual que con la instrucción
cout.
EJEMPLO
Muchos programas como Excel o Matlab pueden leer archivos de datos en
forma de matriz, los cuales son fáciles de exportar desde un programa en C++.
int main() {
float x, y, r;
int i, int n = 100;
ofstream of(“datos.txt”);
for (i = 0; i < n; i++) {
x = 10.0 * rand() / RAND_MAX – 5.0;
r = 1.0 * rand() / RAND_MAX - 0.5;
y = 0.5 * x - 3.0 + r;
of << x << “\t” << y << endl;
}
of.close();
}
EJEMPLO
Muchos programas como Excel o Matlab pueden leer archivos de datos en
forma de matriz, los cuales son fáciles de exportar desde un programa en C++.
int main() {
float x, y, r;
int i, int n = 100; El archivo puede abrirse desde el
momento de declararlo
ofstream of(“datos.txt”);
for (i = 0; i < n; i++) {
x = 10.0 * rand() / RAND_MAX – 5.0;
r = 1.0 * rand() / RAND_MAX - 0.5;
y = 0.5 * x - 3.0 + r;
of << x << “\t” << y << endl;
}
of.close();
}
EJEMPLO
Muchos programas como Excel o Matlab pueden leer archivos de datos en
forma de matriz, los cuales son fáciles de exportar desde un programa en C++.
int main() {
float x, y, r;
int i, int n = 100; El archivo puede abrirse desde el
momento de declararlo
ofstream of(“datos.txt”);
for (i = 0; i < n; i++) {
x = 10.0 * rand() / RAND_MAX – 5.0;
r = 1.0 * rand() / RAND_MAX - 0.5;
y = 0.5 * x - 3.0 + r;
of << x << “\t” << y << endl;
}
of.close();
}
int main() {
int n, k, N = 4096;
float x[N], X[N * 2];
ifstream in(“eeg.txt”);
ofstream out(“espectro.txt”);
for (n = 0; n < N; n++) { in >> x[n]; }
fft(x, X, N);
for (k = 0; k < N/2; k++) {
out << sqrt(X[k] * X[k] + X[k+N] * X[k+N]) << endl;
}
return 0;
}
LECTURA DE ARCHIVOS DE TEXTO
Señal de EEG
Para
detectar si se ha llegado al final del archivo, se
puede utilizar la función eof().
EJEMPLO
// Esta función imprime el contenido de un archivo
void muestra_archivo(char *s) {
int n = 65536;
char temp[n];
ifstream in(s);
if (!in) return;
while (!in.eof()) {
in.getline(temp, n);
if (!in.eof()) { cout << temp << endl; }
}
in.close();
}
int main() {
muestra_archivo(“ejemplo.cpp”);
return 0;
}
EJEMPLO
// Esta función imprime el contenido de un archivo
void muestra_archivo(char *s) {
int n = 65536;
char temp[n];
ifstream in(s); Verifica la apertura del archivo
if (!in) return;
while (!in.eof()) {
in.getline(temp, n);
if (!in.eof()) { cout << temp << endl; }
}
in.close();
}
int main() {
muestra_archivo(“ejemplo.cpp”);
return 0;
}
EJEMPLO
// Esta función imprime el contenido de un archivo
void muestra_archivo(char *s) {
int n = 65536;
char temp[n];
ifstream in(s);
Iterar hasta llegar al final del archivo
if (!in) return;
while (!in.eof()) {
in.getline(temp, n);
if (!in.eof()) { cout << temp << endl; }
}
in.close();
}
int main() {
muestra_archivo(“ejemplo.cpp”);
return 0;
}
EJEMPLO
// Esta función imprime el contenido de un archivo
void muestra_archivo(char *s) {
int n = 65536;
char temp[n];
ifstream in(s);
if (!in) return;
Leer la siguiente línea del archivo
while (!in.eof()) { y almacenarla en la cadena temp
in.getline(temp, n);
if (!in.eof()) { cout << temp << endl; }
}
in.close();
}
int main() {
muestra_archivo(“ejemplo.cpp”);
return 0;
}
PRÁCTICA #1
Haga un programa que lea una serie de números enteros desde un
archivo de texto. El primer número en el archivo indica cuántos
datos más hay en el archivo. El programa debe almacenar todos
los datos (excepto el primero) en un arreglo X de tamaño
adecuado.
Para probar ambas funciones, genere una matriz de números aleatorios. Guárdela en
un archivo y luego recupere la matriz a partir del archivo y verifique que es idéntica a
la original. Así mismo, intente leer y exportar matrices en este formato desde Excel.
TAREA #11 – PARTE 2
Una imagen digital puede verse como una matriz donde cada elemento representa el
nivel de intensidad o brillo del pixel correspondiente.
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 muéstrela en Excel. Haga lo
mismo para los cuatro picos.
TAREA #11 – PARTE 2
Picos de frecuencia
Frecuencia
Valor de intensidad
Histograma de mri.txt