Programación Científica
description
Transcript of Programación Científica
Programación CientíficaDr. Romeo Sánchez Nigenda.E-mail: [email protected]://yalma.fime.uanl.mx/~romeo/Oficina: 1er. Piso del CIDET. Oficina con Dr. Oscar ChacónHoras de Tutoría: 10am-11am 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. Fundamentos de Programación en C2. Apuntadores y Funciones3. Arreglos y Estructuras4. Manejo de Memoria5. Recursividad6. Entrada y Salida de Archivos7. Desarrollo y Depuración de Proyecto de
Programación
Total a calificar: 110 puntos!
40% Proyecto30% Examen Parcial30% Examen Final10% Participación
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. McGraw 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
ArreglosDefiniciones
◦ 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;
ArreglosDeclaración
◦ Tipo NombreArreglo [NúmeroElementos]◦ 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’, ‘\0’}; char vocales[10] = {‘a’, ’e’, ‘i’, ‘o’, ‘u’,’\0’};
índice
El nombre del arreglo es la dirección de su primer elemento (base) int v[50]; int *p; p = v; // Equivalente a p = &v[0]; *p = 5; // Equivalente a v[0] = 5; p = p + 5; // Equivalente a p = &v[5]; *p = 9; // Equivalente a v[5] = 9;
Arreglos y punteros
double x[40];int i;
for (i = 0; i < 40; i++) x[i] = 1.0;
for (i = 0; i < 40; i++) *(x + i) = 1.0;
double *p, x[40];int i;
p = x;for (i = 0; i < 40; i++) p[i] = 1.0;
for (i = 0; i < 40; i++) *(p + i) = 1.0;
for (i = 0; i < 40; i++, p++) *p = 1.0;
5 3 … 4 10
v
índice 10 N-2 N-1N
No existen Strings en C, son solamente arreglos de caracteres con la convención que un carácter nulo (‘\0’) 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”); Copiamos la constante de caracteres en el arreglo local
Arreglos de caracteres (strings)
P E P I T O 0 X X X
Traversando arreglos de caracteres usando punteros:
Arreglos de caracteres (strings)
int string_length(char* x) { int l = 0;
while (*x ) { x++; l++; }
return l;}
int string_length(char* x) { int l = 0;
while (*(x++)) l++;
return l;}
Revirtiendo los valores de un arreglo.
Arreglos de caracteres (strings)
int main(){ char string[1000]; int longitud; strcpy(string, “helloworld”); longitud = strlen(string);
}
int i, j;char temp;for(i=0, j=longitud-1; i<j;i++,j--){ temp = string[i]; string[i] = string[j]; string[j] = temp;}
h e l l o w o r l d
d l r o w o l l e h
Arreglos Multidimensionales Por dimensión entendemos como el número de índices
utilizados para referirse a un elemento particular en el arreglo. Bidimensional: Type ArrayName[numFilas][numColumnas]
Ejemplo: int miarray[3][5];
Columna0
Columna1
Columna2
Columna3
Columna4
Fila 0Fila 1Fila 2
miarray[1][2]Inicializamos el array:int fila, columna;for(fila = 0; fila < numFilas; fila++) for(columna = 0; columna<numColumnas; columna++)
miarray[fila][columna] = 0;
[0][0][0][1][0][2][0][3][0][4][1][0][1][1][1][2]
……
[Filas-1][Cols-1]
En memoria
A través de punteros:
Arreglos Multidimensionales
[0][0][0][1][0][2][0][3][0][4][1][0][1][1][1][2]
……
[Filas-1][Cols-1]
int miarray[3][5]
int *p = *myarray;for(int fila=0;fila<3;fila++) for(int col=0;col<5;col++)
*(p + 5*fila + col) = 0;
int (*nn)[5] = ia;for (int pn=0;pn<15;pn++){ cout<<"ia: "<<*(*nn+pn)<<endl;}
int *myp = *ia;for (int pn=0;pn<15;pn++){ cout<<"ia: "<<*(myp+pn)<<endl;}
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};
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 usar etiquetas, y declarar variables usando la etiqueta:
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 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 estructuracout<<minombre.sexo;
Registros (estructuras) en C/C++
Puede declararse un arreglo de estructuras para agrupar información:
struct tiponombre nombres[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 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; //x es una instancia de tiponombrestruct tiponombre* y; //y es un puntero a una instancia de tiponombrex.sexo = ‘M’;y = &x; //y apunta a la dirección de la estructura xy ->sexo = ‘f’; //Equivalente a x.sexo = ‘f’;
}
Qué representa la siguiente definición?typedef struct{
TIPOALUMNO alumno; RECORDS * palumno;
} RECORDS;
Registros (estructuras) en C/C++
Estructuras como parámetrosPor 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;}…
}