Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Programacin
Curso Propedutico
Posgrado en Ingeniera
Electrnica
Facultad de Ciencias, UASLP
Junio, 2010
Descripcin y objetivos
Este curso tiene como objetivos:
Repasar los conceptos bsicos de
programacin estructurada en lenguaje C/C+
+
Incrementar la prctica en la elaboracin de
programas para problemas especficos
Evaluar las habilidades de programacin de
los aspirantes al posgrado
ESTRUCTURA BASICA DE
UN PROGRAMA EN C/C++
Estructura bsica de un programa
en C/C++
Ejemplo de un programa bsico en C/C++
#include <iostream>
int main() {
cout << Hola mundo! << endl;
return 0;
}
Estructura bsica de un programa
en C/C++
Ejemplo de un programa bsico en C/C++
int main() {
cout << Hola mundo! << endl;
return 0;
}
Estructura bsica de un programa
en C/C++
Ejemplo de un programa bsico en C/C++
#include <iostream>
Uso global de las libreras estndar
using namespace std;
int main() {
cout << Hola mundo! << endl;
return 0;
}
Estructura bsica de un programa
en C/C++
Ejemplo de un programa bsico en C/C++
#include <iostream>
#include <iostream>
int main() {
cout << Hola mundo! << endl;
return 0;
}
Cdigo a ejecutar por la funcin principal
Compilacin y ejecucin
Antes de poder ejecutar el programa
que escribimos, es necesario
compilarlo.
Ejemplo de salida:
****************************
* Me llamo Chamo *
****************************
Variables y asignacin
Para declarar variables en C/C++ se
escribe primero el tipo de variable,
seguido del nombre de una o ms
variables (separados por comas).
Ejemplos:
int a;
int i, j, k;
float x, y;
Asignacin 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
int entero con signo de 32 bits
float punto flotante de 32 bits
double punto flotante de 64 bits
x = 5 / 2; // el resultado es 2
x = 5.0 / 2; // el resultado es 2.5
Ejemplos:
cout << El valor de x es << x << endl;
cout << El area del circulo es << 3.14159 * r * r;
cout << endl << endl << endl;
Prctica #2
Desarrolle un programa donde
Ejemplo de salida:
Ejemplo:
int main() {
int x;
cout << Escribe un numero entero: ;
cin >> x;
cout << El numero que escribiste es: ;
cout << x << endl;
}
Prctica #3
Modifique el programa anterior para
que el usuario pueda introducir los
coeficientes a, b, c, sin necesidad de
recompilar el programa.
EXPRESIONES
BOOLEANAS Y
ESTRUCTURAS DE
DECISION
Expresiones booleanas
Una expresin booleana es aquella que
despus 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 nmeros 1 y 0.
Sin embargo, cualquier valor distinto de
cero es considerado como verdadero.
Operadores de comparacin
Una manera de formar expresiones
booleanas es utilizando los operadores
de comparacin:
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 decisin
Una de las principales aplicaciones de las
expresiones booleanas es la toma de
decisiones:
if (expresion) {
// cdigo a ejecutar si la
// expresin es verdadera
} else {
// cdigo a ejecutar si la
// expresin es falsa
}
Operadores booleanos
Las expresiones booleanas pueden combinarse
mediante los operadores booleanos clsicos:
INSTRUCCIN SWITCH
Instruccin switch
La instruccin switch se utiliza cuando
se requiere tomar una decisin entre
mltiples posibilidades, de acuerdo al
valor de una variable o expresin
entera.
ESTRUCTURAS DE
ITERACION
Estructuras de iteracin
Las estructuras de iteracin se utilizan
cuando es necesario repetir un cierto bloque
de cdigo un nmero determinado o
indeterminado de veces.
while (expresion) {
// Cdigo a ejecutar de manera repetida
// mientras la expresin 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;
}
Prctica #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.
Instruccin dowhile
La instruccin while siempre verifica primero
que la condicin de control sea verdadera
antes de ejecutar el bloque de cdigo.
do {
// bloque de cdigo a ejecutar al menos una vez
} while (expresion);
Prctica #2
Realice un programa que pida al
usuario una serie de nmeros enteros
no negativos utilizando un ciclo do
while. Una vez que el usuario
introduzca un nmero negativo, el
ciclo deber terminar y el programa
deber imprimir el mayor, menor, y
promedio de todos los nmeros
ingresados (excepto el ltimo).
Tarea #4
1. Elabore un programa que implemente el mtodo de biseccin para
encontrar la raz en el intervalo (0, ) de la funcin
x
f ( x) log(1 cos x)
2
2. Elabore un programa que implemente la regla del trapecio para
calcular la integral
2
1
0 1 x e
(sin x ) /( x 1) 2
dx
3. Elabore un programa que elija un nmero aleatorio n entre 1 y 100
(usar funciones rand() y srand() de stdlib.h). El programa dar al
usuario 5 oportunidades para adivinar el nmero: 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
despus de 5 intentos el usuario no ha adivinado, entonces habr
perdido el juego.
Tarea #4 (sugerencias)
Algoritmo de biseccin:
Dado el intervalo (a, b) y una funcin f(x) contnua en (a,b):
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:
a. Obtener una aproximacin de la raz r como r = (a+b) /
2.
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.
ESTRUCTURAS DE
ITERACION II
La instruccin for
La otra estructura en C/C++ para la realizacin de
ciclos es proporcionada por la instruccin for, cuya
sintaxis es:
inicializacion;
while (condicion) {
// bloque de instrucciones
incremento;
}
Ejemplo
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:
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 ms ciclos anidados, de manera que
un ciclo exterior no complete una iteracin
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;
}
Prctica #1
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
pida al usuario un entero positivo N, y luego
imprima los primeros N nmeros primos.
FUNCIONES
Funciones
Una funcin es una seccin de cdigo
que realiza una tarea especfica, y que
puede ser llamada desde otra funcin.
int main() {
int n;
for (n = 1; n <= 10; n++) {
cout << n << ! = << factorial(n) << endl;
}
}
Funciones tipo void
Es posible definir una funcin que no
devuelva ningn 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!
c)
n ( x) dx 1.
Utilice la regla del trapecio para mostrar
que 4
,
Tarea #6
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
pol2car(r,a,x,y) que realice la operacin inversa. Para probar
ambas funciones, pida al usuario (dentro de la funcin main) las
coordenadas cartesianas de un punto, convirtalas a polares y
nuevamente a cartesianas, e imprima el resultado.
n n!
3. el coeficiente
Escriba una funcin que calcule
k , binomial:
(n k )! k!
PROGRAMACION
ESTRUCTURADA
Programacin estructurada
Un programa estructurado se compone de
tres tipos bsicos de estructuras de flujo:
int f() {
return x;
}
int main() {
int x = 2; Qu imprime este programa?
{
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 programacin estructurada y
diseo descendente.
ARREGLOS
Motivacin
La mayora de las aplicaciones actuales requieren
el manejo de grandes cantidades de datos.
tipo_datos nombre_arreglo[numero_elementos];
Arreglos
En C/C++, los elementos de un arreglo de
tamao N estn 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: solucin 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 funcin.
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;
}
Prctica #1
1. Escriba una funcin llamada minmax() que tome como parmetros un
arreglo de floats y su tamao, as como cuatro 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 subndices correspondientes en nmin y nmax.
x min
x .
max min
3. Escriba un programa para probar las dos funciones anteriores,
utilizando como datos de ejemplo un arreglo de nmeros aleatorios
entre -10 y 10.
Tarea #8
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 ncomo:
1
x
ARREGLOS
MULTIDIMENSIONALES
Motivacin
En muchas aplicaciones, se requiere
organizar un gran nmero de datos en
un arreglo cuyos elementos se distingan
por medio de dos o ms subndices.
Ejemplos:
Matrices (subndices: rengln, columna)
Imgenes (subndices: posicin (x,y) de un
pixel)
Video (subndices: posicin (x,y) y tiempo t)
Seales electrofisiolgicas (EEG, EKG, fMRI)
Arreglos bidimensionales
Supongamos que nuestra aplicacin
requiere de arreglos organizados en
forma de matriz, de manera que se
haga referencia a cada elemento
mediante dos subndices.
1. Arreglos de arreglos
2. Orden lexicogrfico
Arreglos de arreglos
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-1]
x[M-1] x[M-
1]
x[M-
1]
x[M-
1]
[0] [1] [N-1]
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).
Solucin #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 lexicogrfico
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 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).
Tarea #9 Parte 1
1. Elabore una funcin que realice el producto C = AB de dos matrices A de
m x n y B de n x p. La funcin debe tomar como parmetros A, B, C, m, n
y p.
donde pij = hij / N. Escriba una funcin que calcule la informacin mutua
de dos arreglos.
SESION 10
APUNTADORES Y
ASIGNACION DINAMICA
DE MEMORIA
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
informacin. El nmero correspondiente a
cada celda se conoce como su direccin.
Ejemplo:
int main() {
int a = 10, b = 20;
cout << &a << endl;
cout << &b << endl;
return 0;
}
Tamao de una variable
Podemos tambin 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 << Direccin de a: << &a << endl;
cout << Tamao de a: << sizeof(a) << endl;
return 0;
}
Apuntadores
Un apuntador es una variable que contiene una direccin 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 << Direccin de p: << &p << endl;
}
Apuntadores
Un apuntador es una variable que contiene una direccin de
memoria (donde posiblemente se almacene el valor de otra
variable).
int main() {
int a = 10;
int *p;
p = &a; La variable p es de
cout << Valor de p: <<tipo apuntador
p << endl; a
cout << Valor en p: <<int
*p << endl;
cout << Direccin 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 tambin un apuntador
al primer elemento del arreglo.
int main() {
int i, a[10], *p;
return 0;
}
Aritmtica 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;
}
Asignacin dinmica de
memoria
La solucin consiste en asignar memoria a un arreglo de
manera dinmica 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;
}
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 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).
SESION 11
MANEJO DE ARCHIVOS
Flujos de entrada y salida
en C++
En C++, las operaciones de entrada y salida
se manejan a travs 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 insercin <<, al igual
que con la instruccin cout.
Ejemplo
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++.
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 fciles de exportar
desde un programa en C++.
int main() {
El archivo puede abrirse
float x, y, r; desde el momento de
int i, int n = 100; 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 fciles de exportar
desde un programa en C++.
int main() {
El archivo puede abrirse
float x, y, r; desde el momento de
int i, int n = 100; 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();
} Los datos generados
pueden graficarse en
Excel fcilmente
Lectura de archivos de texto
De manera similar, podemos leer de un archivo de texto al
igual que se hace con la instruccin cin:
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
Seal de EEG
int main() {
muestra_archivo(ejemplo.cpp);
return 0;
}
Ejemplo
// Esta funcin 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 funcin imprime el contenido de un archivo
void muestra_archivo(char *s) {
int n = 65536;
char temp[n];
ifstream in(s);
if (!in) return; Iterar hasta llegar al final del archivo
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 funcin 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()) { Leer la siguiente lnea del archivo
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;
}
Prctica #1
Haga un programa que lea una serie de nmeros
enteros desde un archivo de texto. El primer nmero en
el archivo indica cuntos datos ms hay en el archivo. El
programa debe almacenar todos los datos (excepto el
primero) en un arreglo X de tamao adecuado.
Valor de intensidad
Histograma de mri.txt