Programación de Computadores Andrea Rueda Pontificia Universidad Javeriana Departamento de Ingeniería de Sistemas Repaso de conceptos ● Problema: Se desea encontrar uno o varios objetos desconocidos, que cumplen condiciones o relaciones, previamente definidas, respecto a uno o varios objetos conocidos. Repaso de conceptos ● Resolución de problemas: Encontrar los objetos desconocidos. Requiere caracterizar claramente objetos conocidos, condiciones y objetos desconocidos. Repaso de conceptos ● Algoritmo: Secuencia finita y bien definida de tareas bien definidas, cada una de las cuales se puede realizar con una cantidad de recursos finitos. – Preciso. – Definido. – Finito. Repaso de conceptos ● Algoritmo: Secuencia finita y bien definida de tareas bien definidas, cada una de las cuales se puede realizar con una cantidad de recursos finitos. – Datos. – Instrucciones. – Estructuras de control. Repaso de conceptos ● Metodología de programación: Métodos, principios y reglas que permiten desarrollar sistemáticamente un programa que resuelva un problema algorítmico. Estructura: secuencia de pasos que parten de la definición del problema y culminan con un programa que lo resuelve. Problema Metodología Programa Repaso de conceptos Pasos generales de la metodología: 1. Análisis: comprensión del problema. 2. Especificación: identificación precisa de los elementos constituyentes. 3. Diseño: construcción del algoritmo. 4. Prueba y refinamiento: comprobación y corrección. 5. Codificación: en un lenguaje de programación. 6. Verificación: pruebas de la implementación. Repaso de conceptos Metodología simplificada (a usar en el curso): 1. Análisis entender completamente el problema. 2. Diseño identificación precisa de elementos, relaciones y pasos para resolver el problema. 3. Implementación codificación en el lenguaje de programación. 4. Pruebas verificación de la exactitud de la solución. Repaso de conceptos 1. Análisis Determinar de una manera clara y concisa: - Objetos, datos conocidos o datos de entrada: información presente en el problema. - Objetos, datos desconocidos o datos de salida: datos a entregar como solución al problema. - Condiciones: o relaciones a cumplir por los datos de entrada y salida. Repaso de conceptos 1. Análisis Ejemplo: dada una serie de N números enteros, determinar si la suma de los mismos es un cuadrado perfecto. Repaso de conceptos 1. Análisis Ejemplo: dada una serie de N números enteros, determinar si la suma de los mismos es un cuadrado perfecto. Objetos conocidos Objetos desconocidos Condiciones N números enteros Una propiedad de la suma de los N números Debe haber al menos un número. Es cuadrado perfecto si la raíz cuadrada de la suma de los N números es un número entero, en otro caso no lo es. Repaso de conceptos 2. Diseño Especificar y describir de manera formal (lenguaje matemático): - Entradas: (objetos conocidos) descripción, cantidad y tipo. - Salidas: (objetos desconocidos) descripción, cantidad y tipo. - Condiciones: condiciones o propiedades de los datos de entrada, dependencia de las salidas obtenidas con las entradas recibidas. Repaso de conceptos 2. Diseño Proponer la secuencia de pasos o instrucciones que permiten resolver el problema (algoritmo), partiendo de las entradas y utilizando las condiciones definidas para llegar a las salidas especificadas. Descripción a través de un diagrama de flujo. inicio instrucción A instrucción B instrucción C fin Repaso de conceptos 2. Diseño Elementos del diagrama de flujo: Inicio / fin Lectura de datos Selección Impresión de datos Proceso Dirección de flujo Ciclo Repaso de conceptos 2. Diseño Ejemplo: dada una serie de N números enteros, determinar si la suma de los mismos es un cuadrado perfecto. Repaso de conceptos 2. Diseño Ejemplo: dada una serie de N números enteros, determinar si la suma de los mismos es un cuadrado perfecto. Entradas N (número de datos) d1, d2, …, dN (los números enteros) Salidas es_cuadrado, tipo booleano Condiciones N>0 es_cuadrado → verdadero, si la parte entera de la raíz cuadrada de la suma de los n números enteros es igual a la raíz cuadrada de la suma de los n enteros es_cuadrado → falso, en caso contrario Repaso de conceptos 2. Diseño inicio N d1, d2, …, dN suma = d1 + d2 + … + dN V piso(raiz(suma)) == raiz(suma) la suma es un cuadrado perfecto F la suma no es un cuadrado perfecto fin Repaso de conceptos 3. Implementación Codificar en un lenguaje de programación específico. (en nuestro caso: C++) La implementación debe coincidir con las especificaciones realizadas en el diseño: – – – – Cantidad y tipo de entradas. Cantidad y tipo de salidas. Condiciones de las entradas y salidas. Secuencia de instrucciones especificada en el diagrama de flujo. Repaso de conceptos 3. Implementación Ejemplo: dada una serie de N números enteros, determinar si la suma de los mismos es un cuadrado perfecto. Repaso de conceptos 3. Implementación 1 int n, suma, dato, i; 2 cout << “número de enteros:”; 3 cin >> n; 4 suma = 0; 5 for (i=1; i<=n; i++) { 6 cout << “ingrese un número entero:”; 7 cin >> dato; 8 suma = suma + dato; 9 } 10 if (floor(sqrt(suma))==sqrt(suma)) 11 cout << “la suma de los números es un cuadrado perfecto”; 12 else 13 cout << “la suma de los números no es un cuadrado perfecto”; Repaso de conceptos 4. Pruebas Realización de diferentes pruebas del programa implementado, para determinar su efectividad en la resolución del problema. - Identificar diferentes casos o posibilidades. - Generar datos de ejemplo para cada uno de los casos. - Manualmente calcular o generar las soluciones (pruebas de escritorio). - Ejecutar el programa con los datos de ejemplo, y verificar la coincidencia con las soluciones manuales. Repaso de conceptos 4. Pruebas Ejemplo: dada una serie de N números enteros, determinar si la suma de los mismos es un cuadrado perfecto. Repaso de conceptos 4. Pruebas instrucción N suma dato i operaciones Línea 2 Línea 3 Línea 4 Número de enteros: 2 0 Línea 5 1 Línea 6 Ingrese un número entero: Línea 7 Línea 8 7 7 0+7 Línea 5 2 1+1 Línea 6 Ingrese un número entero: Línea 7 Línea 8 Línea 10 Línea 12 pantalla 5 12 7+5 ⌊√12⌋=3; √12=3.46 La suma de los números no es un cuadrado perfecto Repaso de conceptos ● Dato: elemento básico de información. ● Tipo de dato: conjunto al que el dato pertenece. entero real caracter booleano int, long float, double char bool Repaso de conceptos Nombre Descripción Tamaño Rango bool Valor de verdad 1 byte true (1) o false (0) char Caracter 1 byte 0 a 255 signed char Entero pequeño 1 byte -128 a 127 unsigned char Entero pequeño sin signo 1 byte 0 a 255 short int (short) Entero corto 2 bytes -32768 a 32767 2 bytes 0 a 65535 unsigned short int Entero corto sin signo (unsigned short) Repaso de conceptos Nombre Descripción Tamaño Rango int Entero 4 bytes -2147483648 a 2147483647 unsigned int Entero sin signo 4 bytes 0 a 4294967295 long int (long) Entero largo 8 bytes -9223372036854775808 a 9223372036854775807 unsigned long int (unsigned long) Entero largo sin signo 8 bytes 0a 18446744073709551615 float Punto flotante 4 bytes +/- 3.4e +/- 38 (~7 dígitos) double Punto flotante de doble precisión 8 bytes +/- 1.7e +/- 308 (~15 dígitos) Repaso de conceptos ● Variable: símbolo para referenciar un espacio en memoria donde se puede almacenar un dato. – Nombre. – Tipo. – Estado o valor. int numero = 135; float x = 23.45; char simb = 'ñ'; Repaso de conceptos ● ● Conversiones: permiten realizar operaciones entre variables de diferentes tipos de datos. Conversión implícita: el compilador detecta la conversión. short n1 = 450; int n2; n2 = n1; el valor de n1 pasa de short a int ● Advertencia en caso de conversión a menor capacidad. Repaso de conceptos ● Conversión explícita: indicar específicamente el tipo de dato al que se quiere cambiar. – Notación funcional int n1; float n2 = 45.76; n1 = int (n2); – Notación tipo C int n1; float n2 = 45.76; n1 = (int) n2; Repaso de conceptos ● Expresiones numéricas: ( a + 5 ) * ( y + abs ( x ) ) ● Expresiones lógicas: ( a + 5 < 4) ʌ ( b == 3 ) Repaso de conceptos ● Precedencia de operadores: Repaso de conceptos ● Instrucciones sobre variables: Repaso de conceptos ● Instrucciones sobre variables: – Asignación: x = 145.76; – Lectura: std::cin >> x; – Escritura: std::cout << x; Repaso de conceptos ● Estructura de selección: if (<cond>) { <bloque de instrucciones> } if (<cond>) { <bloque de instrucciones 1> } else { <bloque de instrucciones 2> } Repaso de conceptos ● Estructuras de selección anidadas: if (<cond 1>) { <bloque de instrucciones 1> } else { if (<cond 2>) { <bloque de instrucciones 2> } else { <bloque de instrucciones 3> } } Repaso de conceptos ● Estructura de selección múltiple: switch (<opcion>) { case <constante 1>: <bloque de instrucciones 1> break; case <constante 2>: <bloque de instrucciones 2> break; default: <bloque de instrucciones 3> break; } Repaso de conceptos ● Estructuras de iteración: while (<cond>) { <bloque de instrucciones> } do { <bloque de instrucciones> } while (<cond>); Repaso de conceptos ● Estructuras de iteración.: for (i=<lim_inf>; i<=<lim_sup>; i++) { <bloque de instrucciones> } ● ● Variables contadoras: llevan la cuenta dentro de un ciclo (tipo entero). Variables acumuladoras: almacenan valores numéricos en cada paso del ciclo. Repaso de conceptos ● Ejercicio (código): Dado un número entero, imprimir en pantalla la tabla de multiplicar (del 1 al 10) de ese número. Repaso de conceptos ● Ejercicio (código): Dado un número entero, imprimir en pantalla la tabla de multiplicar (del 1 al 10) de ese número. int n, i; cout << “Ingrese número:”; cin >> n; for (i=1; i<=10; i++) { cout << n << “*” << i << “=”; cout << (n*i) << “\n”; } Repaso de conceptos ● Función: proceso que recibe valores de entrada (parámetros) y retorna un resultado. – Nombre. – Tipo de retorno. – Número de parámetros. ● ● Nombre. Tipo. Repaso de conceptos ● Función: proceso que recibe valores de entrada (parámetros) y retorna un resultado. int potencia (int base, int exponente) { int resultado = base; for (int i=1; i<exponente; i++) { resultado = resultado * base; } return resultado; } Repaso de conceptos ● Ejercicio (código): Escribir una función que calcule el máximo de dos números reales. – Tipo de retorno. – Cantidad de parámetros. ● Tipo de dato de cada parámetro. Repaso de conceptos ● Ejercicio (código): Escribir una función que calcule el máximo de dos números reales. – Tipo de retorno → real. – Cantidad de parámetros → 2 números. ● Tipo de dato de cada parámetro → reales. Repaso de conceptos ● Ejercicio (código): Escribir una función que calcule el máximo de dos números reales. float maximo (float num1, float num2) { if (num1 > num2) return num1; else return num2; } Repaso de conceptos ● Arreglo o vector: espacio en memoria que permite almacenar una colección de datos de un mismo tipo. – Nombre. – Tipo de dato. – Dimensión. float arreglo[3]; arreglo[0] = 4.5; cin >> arreglo[2]; cout << arreglo[0]; Repaso de conceptos ● Arreglos bidimensionales (matrices): organización en filas y columnas. – Nombre. – Tipo de dato. – Dimensión (cantidad de filas, cantidad de columnas). float matriz[3][3]; matriz[0][1] = 4.5; cin >> matriz[2][0]; cout << matriz[0][1]; Repaso de conceptos ● Ejercicio (código): Dado un arreglo de enteros (junto con su tamaño), ¿cómo llenar una matriz cuadrada con los datos del arreglo? Repaso de conceptos ● Ejercicio (código): Dado un arreglo de enteros (junto con su tamaño), ¿cómo llenar una matriz cuadrada con los datos del arreglo? – leer tamaño del arreglo y cada uno de los enteros. – calcular la dimensión de la matriz cuadrada que puede contener todos los elementos. – llenar la matriz de izquierda a derecha y de arriba a abajo con los datos del arreglo. Repaso de conceptos ● Ejercicio (código): Dado un arreglo de enteros (junto con su tamaño), ¿cómo llenar una matriz cuadrada con los datos del arreglo? – leer tamaño del arreglo y cada uno de los enteros. int n; cin >> n; int arr[n]; for (int i=0; i<n; i++) cin >> arr[i]; Repaso de conceptos ● Ejercicio (código): Dado un arreglo de enteros (junto con su tamaño), ¿cómo llenar una matriz cuadrada con los datos del arreglo? – calcular la dimensión de la matriz cuadrada que puede contener todos los elementos. int tam = int(ceil(sqrt(n))); int mat[tam][tam]; Repaso de conceptos ● Ejercicio (código): Dado un arreglo de enteros (junto con su tamaño), ¿cómo llenar una matriz cuadrada con los datos del arreglo? – llenar la matriz de izquierda a derecha y de arriba a abajo con los datos del arreglo. int l=0; for (int i=0; i<tam; i++) for (int j=0; j<tam; j++) { mat[i][j] = arr[l]; l = l+1; } Creación de librerías Librerías ● ● ● Archivos que almacenan funciones y rutinas de uso repetitivo. Facilitan la organización y reutilización de código. Constan de: – Archivo cabecera (declaraciones). – Archivo de implementación o objeto precompilado. Librerías en C++ ● Archivo cabecera (.h) – ● declaración de métodos, funciones. Archivo de implementación (.cpp, .cxx). (exactamente mismo nombre que la cabecera) – incluye el archivo de cabecera. – implementa todas las funciones. (información de las funciones coincide exactamente con la declaración en la cabecera) Librerías en C++ ● Ejemplo: int sumaArr (int arr[], int n) { int res = 0; for (int i=0; i<n; i++) res = res + arr[i]; return res; } Librerías en C++ ● Archivo cabecera “arreglo.h”: #ifndef ARREGLO_H #define ARREGLO_H int sumaArr (int arr[], int n); #endif Librerías en C++ ● Archivo de implementación “arreglo.cpp”: #include “arreglo.h” int sumaArr (int arr[], int n) { int res = 0; for (int i=0; i<n; i++) res = res + arr[i]; return res; } Librerías en C++ ● Listo para usar! (archivo “prueba.cpp”): #include <iostream> #include “arreglo.h” int main (int argc, char** argv) { int arrA[5] = {5,­3,2,­11,7}; cout << ”Suma: ” << sumaArr(arrA,5); return 0; }