Vous êtes sur la page 1sur 163

Programacin y simulacin de

Sistemas Elctricos
IC Elctrica (IN1198C)

Claudio Romn
clauroman@udec.cl
Lenguajes de programacin y
Software
Compilador C
o Dev C++
o Gratis, disponible en:
https://sourceforge.net/projects/orwelldevcpp/

MATLAB
o Software matemtico
o Software propietario
o Lenguaje de programacin propio

2017
Evaluaciones

2 Certmenes Tericos (CT)


30%
3 Tareas de Programacin(TP)
30%
1 Certamen Prctico (CP)
40%
Objetivos de aprendizaje

Usar notaciones adecuadas para expresar


definiciones, procedimientos y tcnicas en la
solucin de problemas.

Desarrollar el razonamiento algortmico y lgico.

Disear algoritmos en C y MATLAB para dar solucin


a un problema.
Lenguajes de programacin

Objetivo:
Indicar al computador lo que deseamos
que haga
Ejemplo:
Queremos que el computador sume 1
mas 1
Sumar 1 mas 1 (computador no
entiende lenguaje natural)
El computador esta diseado
para entender cdigo binario.
00011101011001110111
Programacin de computadores
Programar un computador
Expresar la solucin a un problema en trminos que el computador
entienda.
Se realiza en forma secuencial o paralela lo que nosotros le ordenamos
que haga a travs de la programacin.

Programa:
Coleccin de instrucciones de un computador necesarias para resolver
un problema determinado.

Algoritmo:
Mtodo utilizado para resolver un problema determinado.
Existen miles de formas para resolver un problema. Esta depende de:
Lenguaje de programacin a usar.
Sistema Computacional.
Programador.
Ninguna persona programa de la misma forma.
Lenguajes de programacin

Lenguaje de programacin:
Forma a travs de la cual el programador se expresa
computacionalmente.

Tipos de Lenguajes:
Lenguajes de bajo nivel.

Lenguajes de alto nivel.

(nivel de abstraccin con el PC)


Lenguajes de programacin:

C
Matlab
Lenguajes de programacin
0 0 0
33: = 0 0 0
0 0 0

C:
int M[3][3] = { { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 } };

Matlab:
M=[[0,0,0];[0,0,0];[0,0,0]] o
M= [0,0,0;0,0,0;0,0,0] o
M = zeros(3); o
Lenguajes de programacin
Lenguajes Compilados:

Lenguajes Interpretados:
Lenguajes de programacin
Compilados Interpretados Mixtos
C Javascript Python
C++ BASIC Perl
FORTRAN Scheme PHP
COBOL MATLAB Java
Pascal Mathematica
C# Smalltalk
BASIC Maple
Ruby
Programacin en C
Ejemplo: Desplegar en pantalla Hello World.
Programacin y simulacin de
Sistemas Elctricos
IC Elctrica (IN1198C)

Claudio Romn
clauroman@udec.cl
Programacin en C

Tipos de variables
Tipos de variables
El tipo entero (int)

Enteros de 2-4 bytes (16-32 bits)


o Rangos -2147483648 a 2147483647.

Variantes:
o long (32 bits)
o short (16 bits)
o long long (64 bits)
o unsigned int (rango: 0 a 4294967295 )
o signed int
Tipos de variables
Operador sizeof()

sizeof(long) sizeof(int) sizeof(short)


sizeof(short) = 2
sizeof(long) = 4
sizeof(int) = 2 o 4
sizeof(long long) = 8
sizeof(char) = 1
Tipos de variables

El tipo punto flotante (float)


Nmeros reales (decimales) de 4 bytes (32
bits)
o Rangos 3,4E-38 a 3,4E38.

El tipo punto flotante doble (double)


Nmeros reales (decimales) de 8 bytes (64
bits)
o Rangos 1,7E-307 a 1,7E308.
Tipos de variables

El tipo caracter (char)


Caracteres codificados en 1 byte (8 bits)
o Rangos 0 a 255.
o Cdigo ASCII
Ej:
char Letra;

Letra = A;
//equivalente a
Letra = 65;
// En ambos casos almacena el caracter A en la variable Letra.
Tipos de variables

El tipo booleano (bool)


Slo puede tomar dos valores (0 o 1
equivalentes a true o false)
Ej:
bool p=true;
//equivalente a
bool p=1;
Cdigo ASCII
(American Standard Code for Information Interchange)
Por qu codificar en 1 byte?

CPU ve la memoria como un vector lineal


de bytes
o Cada byte con una direccin asociada.
o Unidad mnima direccionable.
Secuencias de bytes

Una secuencia de bits


00110101 11011001 11011110 11000010
Puede representar:
o Un nmero entero
o Un nmero decimal
o Una secuencia de 4 caracteres
o Una instruccin de cdigo de mquina
o Una imagen en blanco y negro

Toda informacin se almacena como bits y su


significado depender del contexto.
Nmeros en base 10

Base usada naturalmente


10 dgitos (smbolos): 0,1,2,3,4,5,6,7,8,9
Notacin posicional
o Valor de acuerdo a la posicin
o 123410 = 1000 + 200 + 30 + 4

o 123410 = 1*103+2*102+3*101+4*100
Por qu usar base 2?

Computadores digitales usan base 2

o Toda informacin se traduce en cdigo binario


o Fcil deteccin de estado
o Fcil de implementar
Slo requiere 2 dgitos: 0 y 1
Compuerta abierta/cerrada
Corriente circula/no circula
Nmeros en base 2

Slo 2 dgitos: 0 y 1
Valor dado por la posicin
Ej:
2510 =110012
110012=100002+10002+12
110012=1*24+1*23+1*20
110012= 16 + 8 + 1 =25
Nmeros en base 16

16 dgitos (smbolos)
Usa dgitos 0-9 y A-F
Equivalente a base 2

Ej:
36F016 =3*163+6*162+F*161+0*160
36F016 =3*163+6*162+15*161 = 1406410
Equivalencia
F016 = 1111 00002 F16 = 11112
Representacin binaria y hexadecimal
Operadores de bits

Operador Descripcin
| OR (O)
& AND (Y)
^ XOR (O exclusivo)
Complemento a uno o
~
negacin
Desplazamiento a la
>>
derecha
Desplazamiento a la
<<
izquierda
Formateadores
printf
printf permite dar formato especfico a la salida, aqu algunos ejemplos:
Formateadores
printf
printf permite dar formato especfico a la salida, aqu algunos ejemplos:
Programacin y simulacin de
Sistemas Elctricos
IC Elctrica (IN1198C)

Claudio Romn
clauroman@udec.cl
Errores

Depuracin (debugging):
o Proceso en el cual verificamos los errores cometidos en la
programacin.

Tipos de errores:
o Los detectados por el compilador (generalmente de
sintaxis)
o Los detectados por el ejecutor (libreras)
o Errores no detectados
Errores
Sintaxis
o El compilador revisa la sintaxis. Revisa si el cdigo esta escrito
de forma correcta.
Ej: int a=5 b=4;
o El compilador tambin advierte (warning!)
Una variable declarada no se esta usando

Errores de ejecucin
o Aparecen en plena ejecucin
Ej: c=a/b;
Cdigo vlido pero si c vale 0 ?

Continuacin
o El programa se compila y se ejecuta sin problema pero...
No hace lo que queremos
Operadores aritmticos
+ Suma
++ Incremento en 1
- Resta/Negativo
-- Decremento en 1
* Multiplicacin
/ Divisin
% Mdulo o Resto

Operadores de comparacin
Sentencias de control
Un algoritmo puede necesitar:
o Cumplimiento de condiciones
o Realizar ciclos

Ej: (Bucle: repetir una tarea un nmero determinado de veces)


Queremos imprimir en pantalla una secuencia de nmeros
enteros desde 1 a 100

Programa mas corto!


Sentencias de control
Sentencia de condicin if:
Si (condicional)

Pseudocdigo

Solicitar un entero por teclado


a <- dato ingresado
Si a es positivo:
Imprimir: a es un nmero positivo

Cdigo C

int a;
printf( "Introduce un numero " );
scanf( "%i", &a );
if (a>=0)
printf( \n a es un numero positivo" );
Sentencias de control
Sentencia de condicin if - else:
if ( condicin )
{
bloque que se ejecuta
si se cumple la condicin
}
else
{
bloque que se ejecuta
Si no se cumple la condicin
}

*Nota: Si la instruccin a cumplir si se cumple o no la condicin


es de slo una lnea, no es necesario el parntesis { }.

if ( condicin )
Lnea que se ejecuta si se cumple la condicin
else
Lnea que se ejecuta si no se cumple la condicin
Sentencias de control
Sentencia de condicin if - else:
Pseudocdigo

Solicitar un entero por teclado


a <- dato ingresado
Si a es positivo:
Imprimir: a es un nmero positivo
Si no es positivo:
Imprimir: a es un nmero negativo

Cdigo C

int a;
printf( "Introduce un numero " );
scanf( "%i", &a );
if (a>=0)
printf( \n a es un numero positivo" );
else
printf( \n a es un numero negativo" );
Sentencias de control
Sentencia de condicin if else if:
if ( condicin 1)
{
bloque que se ejecuta si se cumple la condicin 1
}
else if ( condicin 2)
{
bloque que se ejecuta si se cumple la condicin 2
}
else if ( condicin 3)
{
bloque que se ejecuta si se cumple la condicin 3
}
else
{
bloque que se ejecuta si no se cumplen las condiciones anteriores
}
Sentencias de control
Bucle for:
Para realizar iteraciones o ciclos

Formato

for( valor inicial ; condicin de trmino ; incremento )


{
Instrucciones a ejecutar
}
Sentencias de control
Bucle for:
Para realizar iteraciones o ciclos

Pseudocdigo

i <- 0
Mientras i<=10 hacer:
Imprimir valor de i
incrementar i en 1
Fin Ciclo

Cdigo C

for(int i=0;i<=10;i++)
printf(%i\n,i);
Sentencias de control
Bucle while:
Para realizar iteraciones o ciclos

Formato

while ( condicin )
{
Instrucciones a ejecutar
}
Sentencias de control
Bucle while:
Para realizar iteraciones o ciclos

Pseudocdigo

i<-0
Mientras i <= 10
imprimir valor de i
incrementar i en 1

Cdigo C

int i=0;
while( i<=10 )
{
printf(%i\n,i);
i++;
}
Sentencias de control
Bucle do while:
Para realizar iteraciones o ciclos

Formato

do {
Instrucciones a ejecutar
} while (condicin);

Ej: imprimir en pantalla letras de la a a la z 97 122

char letra=97; //equivalente a a


do{
printf(%c,letra);
letra++;
} while (letra<123); // z tiene como cdigo ASCII el nmero 122
Programacin y simulacin de
Sistemas Elctricos
IC Elctrica (IN1198C)

Claudio Romn
clauroman@udec.cl
Funciones

Qu es una Funcin?
Una funcin en C es una subrutina o procedimiento
que permite agrupar una serie de operaciones de tal
manera que se puedan utilizar mas tarde sin tener
que preocuparnos de cmo estn implementadas,
simplemente sabiendo lo que hacen.
Funciones
Formato

Declaracin de una funcin:

tipo_devuelto Nombre_funcion (argumentos);

Definicin:

tipo_devuelto Nombre_funcion (argumentos)


{
sentencias;
}
Funciones
Formato de la funcin
Tipo
Nombre (parmetros)
cuerpo

Tipo de la funcin
Retorno. Este puede ser cualquier tipo de variable:
int, float, char, puntero, etc.
Parmetros
Tipo de argumento
Nombre del argumento
Cuerpo
Variables locales
Cdigo a ejecutar
Limitado generalmente por { y }
Funciones
Ejemplo
Funcin que retorna el entero mayor entre dos
nmeros a y b.

int mayor (int a, int b)


{
return a > b ? a : b;
}
Tipo: retorna int
Nombre: mayor
Parmetros o argumentos: enteros a y b
Cuerpo : return a > b ? a : b;
Funciones
Ejemplo
Funcin que retorna el entero mayor entre dos nmeros a
y b.

int mayor (int a, int b)


{
return a > b ? a : b;
}

int mayor (int a, int b)


{
if (a > b)
return a;
else
return b;
}

Funciones equivalentes, ambas tendrn el mismo perfil de


uso (mismo tipo, nombre y argumentos).
Uso: int c=mayor(12,56);
c toma el valor de 56.
Funciones
Ejemplo
Calcular Hipotenusa a partir del valor de dos
catetos.

int hipotenusa (int x, int y)


{
int z;
z=sqrt( (x*x) + (y*y) );
return z;
}

*Nota: funcin sqrt() esta definida en la librera


math.h y retorna el valor de una raz cuadrada.
Funciones
Ejemplo
Calcular Hipotenusa a partir del valor de dos catetos.
Ejemplo de uso:

int a=24, b=7, c;


c=hipotenusa (a,b);
/*
x recive el valor de 24 y la variable y recive el valor de 7. se
calcula el valor de la hipotenusa=25, funcin retorna 25.
*/

Variables:
c <- 25
a <- 24
z no existe!
Funciones
Tipos de funcines
Funciones void no retornan valores (compilador
detecta uso incorrecto de void)

o Ej:
void imprimir_suma (int a, int b)
{
printf(la suma es: %i,a+b);
}
Funciones
Funcin main()
Es la nica funcin especial en C
o Es la primera en ejecutarse
o Slo puede haber una por
programa
Funciones
Variables locales y globales:
#include <stdio.h>
int a=0,i,j; //variable global

int hipotenusa (int x, int y);

int main()
{
int b=1, x=9; //variables locales (slo se
//pueden ocupar en funcin main)
a=b+x; // variable global (a) no necesita ser
//declarada dentro de main()
/* Instrucciones*/
b=hipotenusa(24,7);
printf(z vale: %i, z); //Error!! Variable z es de bloque azul!!
return 0;
}

int hipotenusa (int x, int y)


{
int z; //variable local (slo se puede ocupar
//en funcin hipotenusa())
z=sqrt( (x*x) + (y*y) );
return z;
}
Programacin y simulacin de
Sistemas Elctricos
IC Elctrica (IN1198C)

Claudio Romn
clauroman@udec.cl
Arrays
(matrices)
Qu es un Array?
Conjunto de variables de un mismo tipo, las cuales
estn ordenadas y pueden identificarse con su
ndice.
Tambin llamados Arreglos, Matrices o Vectores.
Arrays
Ej:
Necesitamos registrar la temperatura de un lugar los 30 das del
mes y calcular la temperatura promedio.

#include <stdio.h>

int main()
{
int temp1, temp2, temp3, temp4, temp5, temp6, temp7, temp8, temp9,
temp10, temp11, temp12, temp13, temp14, temp15, temp16, temp17,
temp18, temp19, temp20 , ., temp30, media;

/* registro de cada temperatura*/

media= (temp1 + temp2 + temp3 + + temp30)/30;

Cdigo muy largo!


Arrays
Ej:
Necesitamos registrar la temperatura de un lugar los 30
das del mes y calcular el promedio.

#include <stdio.h>

int main()
{
int temp[30];
float media=0;

/* registro de cada temperatura*/

for (int dia=0; dia<=30;dia++)


media = media + temp[dia];

media = media/30;

}
Arrays
Declaracin
Tipo_dato Nombre_array [ dimensin ];

Tipo_dato puede ser int, float, char, etc.


Dimensin siempre debe ser numero entero positivo.

Ej:

int v[5]={1,2,4,6,11};

vector de 5 elementos (ndices del 0 al 4)

elemento v[0] vale 1


elemento v[1] vale 2
elemento v[2] vale 4
elemento v[3] vale 6
elemento v[4] vale 11
Arrays
Declaracin
Tipo_dato Nombre_array [ dimensin ];

Tipo_dato puede ser int, float, char, etc.


Dimensin siempre debe ser numero entero positivo.

Ej2:

int v[5]={1,2,4,6};

vector de 5 elementos , pero solo definimos 4 de ellos!

elemento v[0] vale 1


elemento v[1] vale 2
elemento v[2] vale 4
elemento v[3] vale 6
elemento v[4] vale 0 (elemento no definido asume valor 0)
Arrays
Declaracin
Tipo_dato Nombre_array [ dimensin ];

Tipo_dato puede ser int, float, char, etc.


Dimensin siempre debe ser numero entero positivo.

Ej3:

int v [ ]={1,2,4,6,11};

vector de 5 elementos!, no especificamos su dimensin de forma


explicita pero lo iniciamos con 5 elementos.

elemento v[0] vale 1


elemento v[1] vale 2
elemento v[2] vale 4
elemento v[3] vale 6
elemento v[4] vale 11
elemento v[5] no existe!
Arrays
Recorriendo el vector
Ej:

int v [10]={1,2,4,6,11,3,5,8,4,2};

for (int i=0; i<10;i++)


{
printf(valor de v [%i] = %i \n,i,v[i]);
}
Arrays
Array multidimensional
o Declaracin
Tipo_dato nombre_array [ filas ] [ columnas ];

Formato:
int matriz [filas][columnas]={
{columnas de la fila 1},
{columnas de la fila 2},
,
{columnas de la ultima fila} };
o Ej:
Matriz 3x3
int m [3][3]={{1,2,3},{4,5,6},{7,8,9}};

1 2 3
= 4 5 6
7 8 9
Strings (cadenas de texto)
Formato:
char texto[dimensin];

Ej:

char texto[10];
texto = Hola; // cadena de 10 caracteres (slo 5 definidos)

elemento texto[0] vale H


elemento texto[1] vale o
elemento texto[2] vale l
elemento texto[3] vale a
elemento texto[4] vale \0

*Nota: \0 se considera un solo caracter e indica el trmino de un string (le indica al


programa que queremos imprimir hasta encontrar un caracter \0).

Ej2:

char texto[] = {H,o,l,a,\0}; // cadena de 5 caracteres


//equivalente a
char texto[5]={H,o,l,a,\0};
//equivalente a
char texto[]=Hola;
Programacin y simulacin de
Sistemas Elctricos
IC Elctrica (IN1198C)

Claudio Romn
clauroman@udec.cl
Punteros
Qu es un puntero?
En pocas palabras, una variable que guarda una
direccin en memoria.
Un puntero nos dice dnde se encuentra
almacenado el valor de una variable a la que
apunta.
Punteros
Cmo ve la memoria la CPU
Vector lineal de bytes, cada byte con
una direccin asociada.

Los valores de las variables declaradas


son guardadas en diferentes direcciones
en la memoria.
int A ocupa 4 bytes en memoria a
partir de la direccin 100.
char B ocupa 1 byte de memoria a
partir de la direccin 104.
Direcciones desde la 105 estn
vacas.
Punteros
Un puntero
Variable que en vez de almacenar un valor, almacena la
direccin en memoria de otra variable.
Un puntero nos dice dnde se encuentra almacenado el
valor de una variable a la que apunta.

Declaracin
int *p // (puntero apuntando a entero)

Uso:
p corresponde al contenido del puntero
La direccin
*p hace referencia a lo apuntado por la direccin p
Valor almacenado en p

Nota: para usar un puntero siempre tenemos que asignarle


una direccin. Caso contrario ERROR! Puntero no
inicializado!
ERROR!
Punteros
Qu problema nos solucionan los
punteros?
A un array siempre tenemos que declararlo definiendo su
dimensin, es decir, siempre estar limitada su capacidad.
Usando punteros podemos usar memoria dinmica.
Una funcin no puede retornar mas de una variable, ni
arrays.
Usando punteros podemos retornar la direccin de un
array!
Una funcin copia el valor de sus argumentos, pero que
pasa si queremos modificar esos argumentos?
Con punteros podemos utilizar paso por referencia.

Esto nos demuestra que usando punteros le podemos dar una gran
potencia a nuestros programas ya que podremos acceder de
forma directa a cualquier espacio en memoria.
Punteros
Cmo averiguamos la direccin de una
veriable?
Operador &
int a= 43;
printf( "Direccin de a = %p, valor de a = %i\n", &a, a );

Resultado:
Direccin de a = 00003, valor de numero = 43
Punteros
Direcciones vs contenido
int a = 110, b = -1;
float c=3.14;
int *d = &a;
float *e;
e = &c;
Modificando una variable a partir de un puntero:
Punteros y Funciones
Argumentos

Paso por valor


La funcin recibe una copia de los valores de los
argumentos.
Funcin puede modificar las copias sin alterar las
variables originales.
Paso por referencia
Funcin recibe direccin de los argumentos.
Modificadores s afectan las variables originales.
Punteros y Funciones
Argumentos

Paso por valor


Ej:

void intercambio (int x, int y)


{
int temp;
temp = x;
x = y;
y = temp;
}

Error! El programa no hace lo que queremos!


Valores de x e y no cambian fuera de la funcin.
Punteros y Funciones
Argumentos

Paso por referencia


Ej:

void intercambio (int *x, int *y)


{
int temp;
temp = *x;
*x = *y;
*y = temp;
}

Funcin recibe direcciones de variables


En este caso usar operador &
intercambio(&a,&b);
Punteros y Arrays
Punteros a arrays:

int *puntero;
int temp [24]={ 15, 18, 20, 23, 22, 24, 22, 25, , 14, 13, 12, 12 };
puntero = &temperaturas[0];

//equivalente a

int *puntero;
int temp[24]={ 15, 18, 20, 23, 22, 24, 22, 25, , 14, 13, 12, 12 };
puntero = temperaturas;

Para este caso


puntero es la direccin del primer elemento del vector, por lo tanto, *puntero
corresponde al primer valor del vector temp[0]

Qu pasa si hacemos puntero++?


el valor de puntero ya no sera la direccin del primer elemento, ahora ser
la direccin del segundo elemento, por lo tanto *puntero ahora ser temp[1]

*Nota: Al aumentar el valor de un puntero, por ejemplo puntero++, este siempre


pasara a la direccin del siguiente elemento (independiente del espacio en memoria
que ocupe el tipo de variable)
Punteros y Arrays
Tenemos
int a[]={5,2,4,5,6}, *p;
char t[]=Hola, *q;
p=a;
q=t;

p contiene la direccin del entero a[0], y q tiene la direccin del


caracter t[0]. Supongamos que la direccin de a es 1002 y la
direccin de t es 6005.

Entonces, si hacemos p++ y q++, las nuevas direcciones sern

p -> 1006 //se salt 4 direccines porque cada entero ocupa 4 bytes en
memoria
q -> 6006 //un char ocupa solo un byte en memoria

Y ahora *p apunta al entero a[1] y *q apunta al caracter t[1].


Programacin y simulacin de
Sistemas Elctricos
IC Elctrica (IN1198C)

Claudio Romn
clauroman@udec.cl
Punteros
Un puntero almacena una referencia a un objeto:

o De esta forma podemos acceder al valor apuntado con el


operador *
o Si el puntero no esta inicializado, es decir, si no referenciamos
nada. Al usar el operador * , este no encontrar que es lo
apuntado! Error.
Ej:
int *p;
*p=5;
Que pasa si queremos usar un puntero pero que
este, en un principio, no apunte a ninguna de las
variables creadas?
Punteros
Ej: Puntero no inicializado!
int *p; //puntero a entero
*p=5; //asignamos 5 a *p

A donde apunta a?
Si a apunta a direccin ilegal, el programa se cae.
Si a apunta a una direccin legal, el programa puede:
Modificar datos existentes.
Modificar el programa.
Punteros
Que pasa si queremos usar un puntero pero que
este, en un principio, no apunte a ninguna de las
variables creadas?

Funcin malloc(): Se usa para crear un objeto de


un determinado espacio (reserva de memoria).
Formato:
void* malloc ( unsigned numero_de_bytes );

Ej: Queremos crear un objeto de tipo entero y


hacer que x apunte a l.
int *x;
x = malloc(sizeof(int)); //recordemos sizeof() retorna numero de bytes
//equivalente a

int *x = malloc(sizeof(int));
Punteros a Funciones
Ej: Queremos obtener un vector aleatorio
mediante una funcin. Solucin: retornar la
direccin de un vector.
int *vector_random(void)
{
int *p=(int*)malloc(sizeof(int)*10); //creo objeto de largo 10 enteros
for (int i=0;i<10;i++)
*(p+i)=rand()%10;
return p;
}

Funcin crea objeto con espacio necesario para almacenar una


secuencia de 10 enteros (equivalente a un array de enteros), luego le
damos valores random a cada elemento y retornamos la direccin del
puntero.
Nota: funcin rand() retorna un numero entero aleatorio, usando el
operador % podemos limitar el rango de nmeros a generar.
Puntero NULL
Puntero que no apunta a nada (Nulo)
Equivalente a valor 0
Puede ser asignado a otros punteros
No puede ser dereferenciado
float *p=NULL;
float f = *p; //Error!

Se usa para inicializar punteros


til para comparar con direcciones
Punteros
Funcin free()
Libera memoria obtenida va malloc()
void free(void *p)

Ej:
float *ptr = (float*)malloc ( 300*sizeof(float) );
// pedimos 1200 bytes de memoria

/* cdigo x */

free(ptr); // liberamos los 1200 bytes de memoria


//(ahora se puede utilizar para otra cosa)
Programacin y simulacin de
Sistemas Elctricos
IC Elctrica (IN1198C)

Claudio Romn
clauroman@udec.cl
Estructuras
Qu es una estructura?
Coleccin de datos de tipos diferentes.
Define tipo de dato compuesto.
Estructura de datos.

Formato:

struct nombre_de_la_estructura {
miembro 1;
miembro 2;

miembro n;
} variables;

Nota: nombre o variable pueden ser omitidos, pero no ambos!


Estructuras
Una estructura puede:
Ser argumento de funciones
Contener miembros que pueden ser cualquier tipo
de dato, incluso otras estructuras.

Tambin podemos:
Declarar punteros a estructuras
Obtener direccin de una estructura
Crear vector de estructuras
Estructuras
Formas de declarar una estructura:
struct mystruct
{
int miembro1;
char miembro2[20];
double miembro3;
};

struct mystruct variable;


struct mystruct variable2;

En este caso tenemos una estructura llamada mystruct que


contiene 3 miembros y declaramos una variable llamada
variable del tipo mystruct.
Estructuras
Formas de declarar una estructura:

struct mystruct
{
int miembro1;
char miembro2[20];
double miembro3;
}variable,variable2;

Ahora declaramos las variables del tipo mystruct en la misma


declaracin de la estructura. (equivalente al cdigo
anterior)
Estructuras
Formas de declarar una estructura (usando
typedef):
typedef struct
{
int miembro1;
char miembro2[20];
double miembro3;
} mystruct;

mystruct variable,variable2;

En este caso al final de la declaracin de la estructura , se


encuentra el nombre del tipo de estructura. Esto sirve para
simplificar la declaracin de nuevas variables.
(equivalente a codigos anteriores).
Estructuras
Para acceder a los miembros de una
estructura usamos el operador (.)
Ej:
struct punto3D
{
int x;
int y;
int z;
}

struct punto3D a;

a.x=3; //le asignamos valor 3 al miembro x de la estructura a del tipo punto3D.


a.y=4;
a.z=0;
Estructuras
Punteros
Si tenemos un puntero a estructura, podemos
acceder a los miembros usando el operadpr ->.

Ej:
struct punto3D a;
struct punto3D *p=a;

(*p).x=10;
// equivalente a
p->x=10;
Estructuras
Ejemplo estructura complejo.

typedef struct {
float r;
float im;
} complejo;

complejo x, y, *z; // variables tipo complejo


Estructuras
Funciones y estructuras
o Ej: funcin que calcula el conjugado de un nmero complejo
(usando la estructura complejo definida anteriormente).
Paso por valor:
complejo conjugado (complejo x){
x.im = -x.im;
return x;
}

Uso:
complejo a;
a.r=10;
a.im=5;
complejo b= conjugado (a);
printf(b.im = %f,b.im);

Resultado:
b.im = -5
Estructuras
Funciones y estructuras
o Ej: funcin que calcula el conjugado de un nmero complejo
(usando la estructura complejo definida anteriormente).
Paso por referencia:
complejo conjugado (complejo *x){
x->im = -x->im;
}

Uso:
complejo a;
a.r=10;
a.im=5;
conjugado (a);
printf(a.im = %f,a.im);

Resultado:
a.im = -5
Estructuras
Ejemplos con estructuras:
typedef struct {
int a;
short b[2];
} S2;

struct S1{
int a;
char b[3];
S2 c;
struct S1 *d;
} x;
Estructuras
Ejemplos con estructuras:
x = {10, Hi, {5, {-1, 25}}, 0};
struct S1 *px=&x;

Px contiene la direccin de la estructura x


*px apunta al contenido de la estructura x
px->a apunta al contenido de a (10)
px->c.b[1] seria el segundo elemento de la estructura b en c
(25)
Estructuras
Ejemplos con estructuras:
struct S1 y;
x.d = &y;

px->d->a = ?
px->d->c.b[1] = ?
Programacin y simulacin de
Sistemas Elctricos
IC Elctrica (IN1198C)

Claudio Romn
clauroman@udec.cl
Entrada/Salida
Problema:
Tenemos un archivo que contiene datos que
queremos procesar en C.
Tenemos datos procesados en C y queremos
guardarlos.

Solucin:
Manejo de archivos (Ficheros)
Nos permite:
Guardar datos de forma permanente
Leer datos guardados
Entrada/Salida
Puntero FILE *
Todas las funciones de entrada/salida usan este puntero
para conseguir informacin sobre el fichero abierto.
FILE es una estructura de datos usada para acceso a flujos.

typedef struct {
int _cnt;
char *_ptr;
char *_base;
int _bufsiz;
int _flag;
int _file;
char *_name_to_remove;
int _fillsize;
} FILE;
Entrada/Salida
Declarar puntero a FILE por cada flujo a
utilizar.
Abrir flujo usando funcin fopen()
Tipo de acceso (lectura, escritura, ambos)
Leer y/o escribir desde y hacia el flujo
Cerrar flujo con funcin fclose()
Libera estructura FILE
Entrada/Salida
Funcin fopen.
Formato
FILE *fopen(const char *nombre_fichero, const char *modo);

//ejemplo
FILE *fichero;
fichero = fopen(datos.txt,r);

// para cerrar el fichero


fclose(fichero);
Entrada/Salida
Modos de operacin de un flujo.

r+ Abre un fichero de texto para actualizacin (lectura y escritura)


w+ Trunca, a longitud cero o crea un fichero de texto para actualizacin
a+ Aade; abre o crea un fichero de texto para actualizacin, escribiendo a final del
fichero (EOF)

r+b rb+ Abre un fichero en modo binario para actualizacin (lectura y escritura)
w+b wb+ Trunca, a longitud cero o crea un fichero en modo binario para actualizacin
a+b ab+ Aade; abre o crea un fichero en modo binario para actualizacin,
escribiendo al final del fichero (EOF)
rt Abre fichero en modo texto.
Entrada/Salida
Verificacin fichero, existe?

fichero = fopen("sin200h.txt","r");
if (fichero != NULL)
printf("existe");
else
printf(no existe");
Entrada/Salida
Flujo binario
Teniendo nuestro puntero a FILE:
Leer desde el archivo:
int fscanf(FILE *fichero, const char *formato, argumento, ...);

Escribir en el archivo:
int fprintf(FILE *archivo, const char *formato, argumento, ...);

Verificar final del archivo (cursor):


int feof(FILE *fichero);
Entrada/Salida
Funcin fscanf():
Formato:

Ejemplo:
Entrada/Salida
Funcin fprintf():
Formato:

Ejemplo:
Entrada/Salida
Funcin feof():
Formato:

Si se llega al final del fichero la funcin devuelve un


valor distinto de 0.
Programacin y simulacin de
Sistemas Elctricos
IC Elctrica (IN1198C)

Claudio Romn
clauroman@udec.cl
Math (math.h)
Biblioteca estndar de C diseado para
operaciones matemticas bsicas
Math (math.h)
Funciones
Math (math.h)
Ej: Generar vector que represente la sinusoidal de
la corriente alterna.
Oscilacin senoidal a(t) en el tiempo t
A0: Amplitud
: Frecuencia angular
f : Frecuencia
: ngulo de fase inicial

Valor eficaz (rms):


Programacin y simulacin de
Sistemas Elctricos
IC Elctrica (IN1198C)

II
Claudio Romn
clauroman@udec.cl
MATLAB
MATLAB
Lenguaje de programacin interpretado.
Dedicado a personas que necesitan mas
que una calculadora pero no quieren
mancharse las manos con un lenguaje de
programacin.
Entorno sencillo de manejar.
MATLAB
Permite realizar clculos matemticos.
Entrega herramientas para crear grficos de
muchos tipos.
Ventajas a la hora de trabajar con:
Matrices
Nmeros complejos
Polinomios
Funciones trigonomtricas
Logaritmos
Etc
MATLAB
Grandes diferencias respecto a otros
lenguajes que simplifican la programacin.
C Matlab
int x = 5; x=5;
/*vector creciente %vector creciente
de 0 a 9 */ % de 0 a 9
int v[10]; v=0:9;
for (int i=0;i<10;i++)
v[i]=i
MATLAB
Grandes diferencias respecto a otros
lenguajes que simplifican la programacin.
Ej: multiplicacin punto a punto de dos vectores de 10
elementos v y v2.
C Matlab
int v3[10]; v3=v.*v2;
for (int i=0;i<10;i++)
v3[i]=v[i]*v2[i];
MATLAB

4 1 3

5
2
1-Editor 4-Current Folder
2-Command Window 5-Command History
3-Workspace
MATLAB
MATLAB
Funciones elementales:
MATLAB
Funciones elementales:
Sentencias
Bucle for:
for x=xi : x: xf
%codigo
end

%comentarios con %
x=xi condicin de inicio del for .
x cantidad que se incrementa la variable x
xf condicin final (hasta que x sea 10).
end termino del ciclo for.
Sentencias
Bucle for:
for k=0 : 10
%codigo
end

%comentarios con %
k=0 condicin de inicio del for .
10 Condicin final (hasta que k sea 10).
end termino del ciclo for.
Sentencias
Bucle for:
for k=4:2:20
%codigo
end

%comentarios con %
k=4 condicin de inicio del for.
2 k incrementa en 2 en cada iteracin.
20 condicin final (hasta que k sea 20).
end termino del ciclo for.
Sentencias
Bucle while:
while condicion
%codigo
end

% podemos romper ciclos con break y continue


Sentencias
Bucle while:
K=0;
while k<10
%codigo
end

%comentarios con %
k<10 bucle while funciona mientras k<10.
end termino del ciclo while.
Sentencias
Sentencia if:
if condicion
%codigo
end

%comentarios con %
%podemos usar operador & (and), | (or), ~ (not)
Sentencias
Sentencia if y else:
if condicion
%codigo
else
%codigo2
end
Sentencias
Sentencia elseif:
if condicion
%codigo
elseif condicion2
%codigo2
else
%codigo3
end
Matrices
Vector creciente:
V= I:N; %vector creciente desde I hasta N
Ej:
>>v=1:9
v=
123456789

V= I::N; %vector creciente desde I hasta N con salto de

Ej:
>>v=0:3:9
v=
0369
Matrices
Matriz con ceros (zeros):
zeros(N) %para matrices NxN
zeros(M,N) %para matrices MxN

Ej:
>> zeros(1,3)
ans =
0 0 0

>> zeros(2)
ans =
0 0
0 0
Matrices
Matriz con unos (ones):
ones(N) %para matrices NxN
ones(M,N) %para matrices MxN

Ej:
>> ones(1,3)
ans =
1 1 1

>> ones(2)
ans =
1 1
1 1
Matrices
Matriz identidad (eye):
eye(N) %para matrices NxN
eye(M,N) %para matrices MxN

Matriz aleatoria (rand):


rand(N) %para matrices NxN valores en intervalo [0 1]
rand(M,N) %para matrices MxN

Ej:
>> eye(2)
ans =
1 0
0 1

>> rand(2)
ans =
0.9575 0.1576
0.9649 0.9706
Matrices
Matriz magica (magic):
magic(N) %para matrices NxN
Matriz en la que sus filas, columnas y diagonales suman lo
mismo, para todo N>0, excepto N=2.

Ej:
>> magic(3)
ans =
8 1 6
3 5 7
4 9 2
Matrices
Largo de un vector (length(v))
>> v=0:3:13;
>> length(v)
ans =
5
>> size(v)
ans =
1 5

Dimensiones de una matriz (size(M))


>> M=rand(3,4);
>> length(M)
ans =
4
>> size(M)
ans =
3 4
Matrices
Extraer porcin de matriz:
Si A es una matriz NxM, podemos extraer A(n:n2,m:m2),
donde n<n2 [0 N] y m<m2 [0 M]

>> A=rand(4)
A=
0.3171 0.3816 0.4898 0.7547
0.9502 0.7655 0.4456 0.2760
0.0344 0.7952 0.6463 0.6797
0.4387 0.1869 0.7094 0.6551

>> a=A(1:2,2:3)
a=
0.3816 0.4898
0.7655 0.4456
Matrices
Redimensionar matriz (reshape):
reshape(X,M,N)
Retorna matriz MxN reordenando los elementos de una matriz X,
(X debe tener MxN elementos).

>> X=rand(2)
X=
0.2575 0.2543
0.8407 0.8143

>> x=reshape(X,4,1)
x=
0.2575
0.8407
0.2543
0.8143
Matrices
Funciones tiles para manejo de vectores:
sum(v) suma elementos del vector (v)
cumsum(v) suma acumulada de los elementos
mean(v) media de los elementos
max(v) nmero mximo contenido en el vector
min(v) nmero mnimo
std(v) desviacin estndar (dispersin)
Matrices
Multiplicacin de matrices:
Tenemos una matriz A de dimensin 3x3 y una matriz B dimensin 3x3.
A*BB*A B.*A, pero A.*B=B.*A

Operador * entre matrices corresponde producto de matrices.


Operador .* corresponde a multiplicacin punto a punto.

>> A=[0 1;2 3] >> B=[2 3;4 5]


A= B=
0 1 2 3
2 3 4 5

>> C=A*B >> c=A.*B


C= c=
4 5 0 3
16 21 8 15
Grficos 2D
plot() grfico de lneas
bar() crea diagramas de barras
barh() diagramas de barras horizontales
bar3() diagramas de barras con aspecto 3-D
bar3h() diagramas de barras horizontales con aspecto 3-D
pie() grficos con forma de tarta
pie3() grficos con forma de tarta y aspecto 3-D
area() similar plot(), pero rellenando en ordenadas de 0 a y
stairs() funcin anloga a bar() sin lneas internas
errorbar() representa sobre una grfica mediante barras valores de
errores
compass() dibuja los elementos de un vector complejo como un
conjunto de vectores partiendo de un origen comn
feather() dibuja los elementos de un vector complejo como un
conjunto de vectores partiendo de orgenes
uniformemente espaciados sobre el eje de abscisas
hist() dibuja histogramas de un vector
rose() histograma de ngulos (en radianes)
quiver() dibujo de campos vectoriales como conjunto de vectores
Grficos 2D
plot()
Comando bsico: plot(x1, y1, x2, y2,,
opciones).
x e y: vectores de la misma longitud.
Opciones: color, estilo, etc.

Ej:
X=-2.5:0.2:2.5;
Y=exp(-x.*x);
plot(X,Y)

plot(y) -> eje abscisas por omisin


Grficos 2D
Opciones
String que especifica estilo de lnea, color, grosor,
etc.
Color: r (Red), g(Green), b(Blue), c(Cyan), m
(Magenta), y (Yellow), k (blacK), w (White).
Estilo: - (solida), -- (trazas), : puntos), -. (lineas y
puntos).
Marcadores: +, o, *, ., x, s (square), d (diamante), ^ v
> o < (tringulos en distinto sentido), p (estrella 5
puntas, pentagram), h (estrella 6 puntas,
hexagram).
Ej: plot(x,y,s-r)
Grficos 2D
Objetos grficos
xlabel('etiqueta del eje x')
ylabel('etiqueta eje y')
title('ttulo del grfico')
grid on | off | minor
Rejilla del grfico
legend('leyenda)
legend(..., 'location',posicin)
Posicin: center top, right center, left top, left
bottom, etc.
axis([xmin xmax ymin ymax])
Limites del grfico
Grficos 2D
Ej:
x = 0:.2:12;
plot (x, bessel(1, x), x, bessel(2, x), x, bessel(3,x));
legen('Primero', 'Segundo', 'Tercero', 'Location',
'NortEastOutside'); grid on
Funciones
Formato:
function retorno = nombre_funcion (argumentos)

% lneas de cdigo

end
Seales discretas

Muestreo: Consiste en seleccionar muestras peridicas de una seal


analgica. El ritmo (tasa) del muestreo, denominado frecuencia de
muestreo (Fs), determina la cantidad de muestras que se
seleccionan de la seal original analgica en un determinado
tiempo. Suponiendo que se desea muestrear una seal continua a
una tasa de 2 [Hz] (dos muestras por segundo), el periodo de
muestreo (Ts) sera:
Ts = 1/Fs = 1/2 = 0.5 [s]
Es decir, se toman muestras cada 0.5 [s] de la seal analgica.
Interpolacin y
Decimacin
Para cambiar la frecuencia de muestreo de
una seal digital podemos interpolar o
decimar.
Interpolacin:
Se agregan datos entre puntos de la
seal (aumenta frecuencia de muestreo)

Decimacin:
Se eliminan datos cada M puntos
(disminuye frecuencia de muestreo)
Decimacin
Decimacin (para sacar muestras)
Ds=s(1:M:end); %seal s
%se eliminan M-1 datos cada M datos

Comandos matlab:
downsample (sin filtro)
decimate (con filtro)

*Se debe respetar teorema de Nyquist


Interpolacin
Interpolacin lineal:
Teniendo una seal discreta y=f(x), siendo (x1,y1)
y (x2,y2) puntos consecutivos de nuestra seal,
podemos agregar puntos intermedios (x,y) tal
que x1<x<x2.
Para esto se traza una recta entre los puntos
(x1,y1) y (x2,y2) para calcular los valores
intermedios.

Funcin:
Interpolacin
Interpolacin lineal:
Desventajas: valores interpolados no se asemejan
mucho a valores originales

Lnea negra representa seal continua original,


puntos rojos corresponden a los datos muestreados,
lnea roja corresponden a los datos interpolados.
Interpolacin
Interpolacin (agregar puntos):
Is = zeros(1,length(s)*L)
Is(1:L:end)=s;
%se agregan L-1 puntos entre puntos de seal (s) original
(en este caso se agregan ceros)

Comandos matlab:
upsample (sin filtro)
interp (con filtro) %no es interp. lineal
Interpolacin y
Decimacin
Ejercicio:
Con una frecuencia de muestreo de 200 Hz, crear seal senoidal con
los siguientes parmetros.
Amplitud=300, frecuencia de senoidal = 2Hz, fase= , 1
segundo de seal.
t=0:199;
A1=300;
f1=2;
O1= pi;
t=t/200;
S1= A1 * sin( 2*pi*f1*t+O1);

Cambiar la frecuencia de muestreo a 400 Hz usando interpolacin


lineal.
Interpolar usando comandos de matlab y calcular la diferencia.
Crear nueva seal con los mismos parmetros pero con frecuencia
de muestreo de 400 Hz y calcular diferencia.
Decimar seal a 100 Hz.

Vous aimerez peut-être aussi