Programacin Cientfica Dr Romeo Snchez Nigenda Email romeo

  • Slides: 19
Download presentation
Programación Científica Dr. Romeo Sánchez Nigenda. E-mail: romeo. sanchez@gmail. com http: //yalma. fime. uanl.

Programación Científica Dr. Romeo Sánchez Nigenda. E-mail: romeo. sanchez@gmail. com http: //yalma. fime. uanl. mx/~romeo/ Oficina: 1 er. Piso del CIDET. Oficina con Dr. Oscar Chacón Horas de Tutoría: 10 am-11 am Martes y Jueves Website: http: //yalma. fime. uanl. mx/~romeo/Prog/ Sesiones: 48 * Slides aumentados con información de Dr. Roger Ríos, y Dr. Fernando López

Temario: 1. 2. 3. 4. 5. 6. 7. 40% Proyecto 30% Examen Parcial 30%

Temario: 1. 2. 3. 4. 5. 6. 7. 40% Proyecto 30% Examen Parcial 30% Examen Final 10% Participación Fundamentos de Programación en C Apuntadores y Funciones Arreglos y Estructuras Manejo de Memoria Recursividad Entrada y Salida de Archivos Desarrollo y Depuración de Proyecto de Programación Total a calificar: 110 puntos!

Material de apoyo: A. KELLY, I. POHL. A Book on C. Addison-Wesley, Reading, EUA,

Material de apoyo: A. KELLY, I. POHL. A Book on C. Addison-Wesley, Reading, EUA, 1998. 2. B. KERNIGHAN, D. RITCHIE. The C Programming Language. Prentice Hall, Second Edition, 1988. 3. D. KNUTH. The Art of Computer Programming. Addison Wesley, 1998. 4. H. DEITEL, P. DEITEL. Como Programar en C/C++. Prentice Hall, Segunda Edición. 1995. 5. L. Joyanes, I. Zahonero. Programación en C - Metodología, Algoritmos y Estructura de Datos. Mc. Graw Hill-Interamericana, 2006. 6. B. Stroustrup. The C++ Programming Language. Addison Wesley. Third Edition. 1997. Software: Compiladores GCC (GNU Compiler Collection) IDEs (Integrated Development Environment): http: //www. eclipse. org/downloads/ http: //kdevelop. org/ http: //www. bloodshed. net/devcpp. html

Arreglos � Definiciones ◦ Unidimensional: Conjunto finito y ordenado de elementos homogéneos ◦ Elementos

Arreglos � Definiciones ◦ Unidimensional: Conjunto finito y ordenado de elementos homogéneos ◦ Elementos de igual tamaño almacenados linealmente en posiciones de memoria consecutivas � El nombre del arreglo es visto como un puntero al primer elemento del arreglo � Operaciones Básicas ◦ Extracción: Función que toma un arreglo a y un índice i, y retorna un elemento del arreglo: int x = a[i]; ◦ Almacenamiento: Acepta un arreglo a, un índice i, y un elemento x, y asigna a[i] = x;

Arreglos � Declaración ◦ Tipo Nombre. Arreglo [Número. Elementos] ◦ Ejemplos: � float salarios[5];

Arreglos � Declaración ◦ Tipo Nombre. Arreglo [Número. Elementos] ◦ Ejemplos: � float salarios[5]; � char alfabeto[30]; [0] [1] [2] [3] [4] � Inicialización ◦ Por defecto: Cuando son creados, se aplica solamente a arreglos globales y estáticos ◦ Explícita: Cuando son creados, suministrando datos de iniciación ◦ En ejecución: Durante ejecución, cuando se asignan o copian datos al arreglo. ◦ Ejemplos � double scores[5] = {5. 5, 6. 7, 9. 8, 10. 0, 8. 7}; � int estado[3] = {-1, 0, 1}; � char alfabeto[] = {‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’, ‘’}; � char vocales[10] = {‘a’, ’e’, ‘i’, ‘o’, ‘u’, ’’}; índice

Arreglos y punteros � El nombre del arreglo es la dirección de su primer

Arreglos y punteros � El nombre del arreglo es la dirección de su primer elemento (base) v int v[50]; int *p; 5 p = v; // Equivalente a p = &v[0]; índice 0 *p = 5; // Equivalente a v[0] = 5; p = p + 5; // Equivalente a p = &v[5]; *p = 9; // Equivalente a v[5] = 9; 3 1 double x[40]; int i; double *p, x[40]; int i; for (i = 0; i < 40; i++) x[i] = 1. 0; p = x; for (i = 0; i < 40; i++) p[i] = 1. 0; for (i = 0; i < 40; i++) *(x + i) = 1. 0; … for (i = 0; i < 40; i++) *(p + i) = 1. 0; for (i = 0; i < 40; i++, p++) *p = 1. 0; 4 10 N-2 N-1 N

Arreglos de caracteres (strings) �No existen Strings en C, son solamente arreglos de caracteres

Arreglos de caracteres (strings) �No existen Strings en C, son solamente arreglos de caracteres con la convención que un carácter nulo (‘’) es almacenado al final del último carácter para marcar el final de la cadena. �Ejemplo: char *p = “ejemplo”; �La variable puntero p obtiene la dirección del primer elemento en el arreglo (e). El compilador coloca un carácter null al final del arreglo char localnombre [10]; strcpy(localnombre, “PEPITO”); P E I Tde caracteres O 0 en. Xel arreglo X X �Copiamos la. Pconstante local

Arreglos de caracteres (strings) �Traversando arreglos de caracteres usando punteros: int string_length(char* x) {

Arreglos de caracteres (strings) �Traversando arreglos de caracteres usando punteros: int string_length(char* x) { int l = 0; while (*x ) { x++; l++; } while (*(x++)) l++; return l; }

Arreglos de caracteres (strings) �Revirtiendo los valores de un arreglo. int main(){ char string[1000];

Arreglos de caracteres (strings) �Revirtiendo los valores de un arreglo. int main(){ char string[1000]; int longitud; strcpy(string, “helloworld”); longitud = strlen(string); h e int i, j; char temp; for(i=0, j=longitud-1; i<j; i++, j--){ temp = string[i]; string[i] = string[j]; d l string[j] = temp; } } l l o w o r l d r o w o l l e h

Arreglos Multidimensionales � Por dimensión entendemos como el número de índices utilizados para referirse

Arreglos Multidimensionales � Por dimensión entendemos como el número de índices utilizados para referirse a un elemento particular en el arreglo. � Bidimensional: Type Array. Name[num. Filas][num. Columnas] En memoria Ejemplo: [0][0] int miarray[3][5]; [0][1] Columna 0 Columna 1 Columna 2 Columna 3 Columna 4 [0][2] [0][3] [0][4] Fila 0 Fila 1 Fila 2 [1][0] [1][1] miarray[1][2] Inicializamos el array: int fila, columna; for(fila = 0; fila < num. Filas; fila++) for(columna = 0; columna<num. Columnas; columna++) miarray[fila][columna] = 0; [1][2] … … [Filas-1][Cols-1]

Arreglos Multidimensionales �A través de punteros: int *p = *myarray; for(int fila=0; fila<3; fila++)

Arreglos Multidimensionales �A través de punteros: int *p = *myarray; for(int fila=0; fila<3; fila++) for(int col=0; col<5; col++) *(p + 5*fila + col) = 0; int miarray[3][5] [0][0] [0][1] [0][2] [0][3] [0][4] int (*nn)[5] = ia; for (int pn=0; pn<15; pn++){ cout<<"ia: "<<*(*nn+pn)<<endl; } [1][0] [1][1] [1][2] … int *myp = *ia; for (int pn=0; pn<15; pn++){ cout<<"ia: "<<*(myp+pn)<<endl; } … [Filas-1][Cols-1]

Tipos de Datos Complejos: Registros (estructuras) en C/C++ � Un registro o estructura es

Tipos de Datos Complejos: Registros (estructuras) en C/C++ � Un registro o estructura es un grupo de componentes en el cual cada componente tiene su propio identificador, cada uno de los cuales se conoce como un elemento (campo) de la estructura � Es un grupo de variables (elementos) que pueden ser de diversos tipos sostenidas agrupadas en una sola unidad. La unidad es la estructura. � Definición general: struct type-name {elementos};

Registros (estructuras) en C/C++ �Ejemplo: struct { char sexo; int edad; char primernombre[10]; char

Registros (estructuras) en C/C++ �Ejemplo: struct { char sexo; int edad; char primernombre[10]; char apellido[15]; } minombre; �La definición crea una variable minombre de tipo estructura con 3 campos �La definición por sí misma no genera asignación de memoria, ésta se da únicamente cuando variables del tipo de la estructura son instanciadas

Registros (estructuras) en C/C++ � Podemos etiqueta: usar etiquetas, y declarar variables usando la

Registros (estructuras) en C/C++ � Podemos etiqueta: usar etiquetas, y declarar variables usando la struct tiponombre{ char sexo; int edad; char primernombre[10]; char apellido[30]; }; struct tiponombre minombre, tunombre; typedef struct{ char sexo; int edad; char primernombre[10]; char apellido[30]; } TIPONOMBRE; TIPONOMBRE minombre, tunombre;

Registros (estructuras) en C/C++ � Para acceder a los elementos de una estructura, usamos

Registros (estructuras) en C/C++ � Para acceder a los elementos de una estructura, usamos la variable y el nombre del elemento separados por el operador de punto: struct tiponombre minombre; Para almacenar valores: minombre. sexo = ‘M’; minombre. edad = 5; Para leer información de la estructura cout<<minombre. sexo;

Registros (estructuras) en C/C++ � Puede declararse un arreglo de estructuras para agrupar información:

Registros (estructuras) en C/C++ � Puede declararse un arreglo de estructuras para agrupar información: struct tiponombres[100]; Esto crea un conjunto de 100 registros de tipo estructura. Para acceder a uno de los registros se utilizan índices. nombres[0]. sexo = ‘M’; nombres[0]. edad = 5;

Registros (estructuras) en C/C++ � Puede declararse que un elemento de una estructura sea

Registros (estructuras) en C/C++ � Puede declararse que un elemento de una estructura sea otra estructura: typedef struct{ char calle[30]; int num; char ciudad [10]; char estado [3]; char cpostal [6]; } TIPODIRECCION; typedef struct{ TIPONOMBRE alumnonombre; TIPODIRECCION alumnodireccion; } TIPOALUMNO; TIPOALUMNO alumno_x; Como accesar al valor de calle a través de la variable alumno_x?

Registros (estructuras) en C/C++ �Punteros a Estructuras: El operador -> main(){ struct tiponombre x;

Registros (estructuras) en C/C++ �Punteros a Estructuras: El operador -> main(){ struct tiponombre x; //x es una instancia de tiponombre struct tiponombre* y; //y es un puntero a una instancia de tiponombre x. sexo = ‘M’; y = &x; //y apunta a la dirección de la estructura x y ->sexo = ‘f’; //Equivalente a x. sexo = ‘f’; } Qué representa la siguiente definición? typedef struct{ TIPOALUMNO alumno; RECORDS * palumno; } RECORDS;

Estructuras como parámetros �Por referencia . . . struct seguro poliza; imprime_poliza(&poliza); void imprime_poliza(struct

Estructuras como parámetros �Por referencia . . . struct seguro poliza; imprime_poliza(&poliza); void imprime_poliza(struct seguro * mipoliza){ cout<<“Número de Póliza: <<mipoliza->numseguro; …. if(mipoliza->clase == VIDA){ cout<<mipoliza->seguroinfo. beneficiario; } … }