Você está na página 1de 96

ndice general

1.1. Introduccin a la programacin..................................03 1.1.1. El Ordenador: Conceptos Bsicos. ..............................03 1.1.2. Algoritmos. . . . . . . . . . . . . . . . . . . ..05 1.1.3. Lenguajes de programacin. . . . . . . ..06 1.1.4. Programas. . . . . . . . . . . . . . ... . . ....08 1.2. Especificacin de programas .................................10 1.2.1. Escritura y organizacin de un programa...........10 1.2.2. Elementos bsicos de un lenguaje de programacin 13 1.2.2.1. Tokens y reglas sintcticas.. . . .13 1.2.2.2. Palabras reservadas. . . . . . . ..........14 1.2.3. Tipos de errores en la programacin. . . 15 1.3. Datos, tipos de datos y literales . . . . . . . . . .. 16 1.3.1. Representacin en memoria de datos e instrucciones..16 1.3.2. Datos y tipos de datos. . . . . . . . . . . . .. 17 1.3.2.1. Literales. . . . . . . . . . . . . . . ..18 1.3.2.2. Declaracin de datos. . . . . . . . 18 1.3.2.3. Datos constantes. . . . . . . . . . . 19 1.3.2.4. Normas para la eleccin del identificador . . . . . . . ......20 1.4. Operadores y Expresiones. . . . . . . . . . . . .. 21 1.4.1. Terminologa en Matemticas. . . . . . . . .. 21 1.4.2. Operadores en un lenguaje de programacin..21 1.4.3. Expresiones. . . . . . . . . . . . . . . . . . .. 22 1.5. Tipos de datos comunes en C++ . . . . . . . .. . .. 22 1.5.1. Rango y operadores aplicables a un tipo de dato...... 22 1.5.2. Los tipos de datos enteros. . . . . . . . . ......23 1.5.2.1. Rango de los enteros. . . . . . . ..23 1.5.2.2. Operadores. . . . . . . . . . . . . . 23 1.5.3. Los tipos de datos reales. . . . . . . . . . ...25 1.5.3.1. Rango. . . . . . . . . . . . . . . . 25 1.5.3.2. Operadores. . . . . . . . . . . . . . 24 1.5.3.3. Funciones estndar. . . . . ... . 26 1.5.3.4. Expresiones reales. . . . . . . . . ..26 1.5.4. Operaciones con tipos numricos distintos..26 1.5.5. El tipo de dato carcter. . .. . . . . . . . 27 1.5.5.1. Rango. . . . . . . . . . . . . . . . 27 1.5.5.2. Funciones estndar. . . . . . . . 28 1.5.6. El tipo de dato cadena de caracteres . . ...28
Programacin I 1 UCENM

1.5.7 El tipo de dato lgico o booleano . . ..29 1.5.7.1. rango.. . ...29 1.5.7.2. operadores.. . ......29 1.5.7.3. operadores relacionales .. . ......30 2.2. Estructura Condicional . . . . . . . . . . . . . . . . 32 2.2.1. Introduccin . . . . . . . . . . . . . . . . . . ...34 2.2.2. Estructura Condicional Simple . . . . . . . 34 2.2.3. Una notacin para describir algoritmos .35 2.2.4. Condicional Doble . . . . . . . . . . . . . . .37 2.2.5. Anidamiento de Estructuras Condicionales.. 39 2.2.6. Estructura Condicional Mltiple . . . . . . ..45 2.2.7. Cuestiones adicionales . . . . . . . . . . . .47 2.2.7.1. Evaluacin en ciclo corto y en ciclo largo .. . . . . . . . . . ,. 47 2.2.7.2. Particularidades de C++ . . . .47 2.3. Estructuras Repetitivas .. . . . . . . . . . . . . 47 2.3.1. Bucles controlados por condicin: pre-test y post-test . . ..48 2.3.1.1. Formato . . . . . . . . . . . . . . . .48 2.3.1.2. Lectura Anticipada . . . . . . . . . ... 52 2.3.1.3. Bucles sin fn . . . . . . . . . . . . .. 54 2.3.1.4. Creacin de filtros con ciclos posttest . . . . . . . . . . . . . . 54 2.3.1.5. Bucles controlados por contador .54 2.3.2. Bucle for como bucle controlado por contador. . . . . . . . . . 56 2.3.2.1. Formato . . . . . . . . . . . . 56 2.3.2.2. Algunas Aplicaciones . . .. 58 2.3.2.3. Criterio de uso de bucle for. . 59 2.3.2.4. Bucles for con sentencias vacas..60 2.3.2.5. El bucle for como ciclo controlado por condicin . . . . . . 60 2.3.3. Anidamiento de bucles . . . . . . . . . . . 64 3.1. ejercicios propuestos ...68 Guia practica Capitulo I..71 Bibliografa.96

Programacin I

UCENM

1.1. Introduccin
La principal razn para que las personas aprendan lenguajes y tcnicas de programacin es utilizar la computadora como una herramienta para resolver problemas. La resolucin de problemas exige al menos los siguientes pasos 1. definicin o anlisis del problema 2. diseo del algoritmo 3. transformacin del algoritmo en programa 4. ejecucin y validacin del programa Para la cual se hace necesaria ensearle al estudiante la introduccin a la programacin, que contemple los conceptos bsicos de algoritmo, estructura de datos y las tcnicas de programacin en un lenguaje, en nuestro casos c ++. 1.1.1. La computadora: CONCEPTOS BSICOS Los sistemas modernos de computacin consisten en una gran conjuncin de elementos de circuitos (hardware) y de programacin (software) que han sido diseados para proporcionar a la computacin un ambiente productivo y hasta cierta medida agradable.

Programacin I

UCENM

Componentes de un Sistema de Computacin

La computadora :
- dispositivo electrnico que procesa datos y los convierte en informacin til para el usuario, siguiendo un programa de instrucciones

Hardware. Dispositivos fsicos que componen el ordenador: teclado,


pantalla, ratn, discos, memoria, CD-ROM, unidades de procesamiento, etc.

Software
Conjunto de programas que el ordenador puede ejecutar El conjunto de instrucciones se llama programa Cuando un ordenador usa un programa se dice que ejecuta el programa Los dos tipos ms comunes de software son: Software del sistema: Sistema operativo

Programacin I

UCENM

Software de aplicacin: Hojas de clculo, bases de datos, etc

Personas Entretenimiento, medicina, educacin, empresas, etc. Datos e informacin


- dato representacin de algn concepto o entidad real, pueden tomar diferentes formas por ejemplo palabra escrita , imagines, numero y sonidos - informacin implica datos procesados y organizados

Programa:
- es simplemente una secuencia de instrucciones que orienta a la Unidad de Control de Procesamiento (CPU) en el desarrollo de los clculos, el cual debe expresarse de forma que sea entendido por el CPU. Un CPU slo puede entender instrucciones que estn expresadas en trminos de su lenguaje mquina.

Programador :persona encargada de desarrollar los algoritmos en el cualquier de los lenguajes existentes.

1.1.2. ALGORITMOS "Un algoritmo se define como un mtodo que se realiza paso a paso para solucionar un problema que termina en un nmero finito de pasos". Podemos decir que es una secuencia ordenada de instrucciones que resuelve un problema concreto, atendiendo a las siguientes caractersticas bsicas: Debe ser preciso. e indicar el orden de realizacin de cada paso. Debe ser definido. Si se sigue un algoritmo dos veces, se debe obtener el mismo resultado cada vez. Debe ser finito. Si se sigue un algoritmo, se debe terminar en algn momento; o sea debe tener un nmero finito de pasos.
Programacin I 5 UCENM

Usualmente, los algoritmos reciben unos datos de entrada con los que operan, y a veces, calculan unos nuevos datos de salida. Ejemplo 1.- Algoritmo de la media aritmtica de N valores. 1. Sumar los N valores. 2. Dividir el resultado por N. Datos de entrada: los N valores. Datos de salida: la media. 2.- Disear un algoritmo para cambiar una llanta a un coche. 1. Inicio. 2. Traer gato. 3. Levantar el coche con el gato. 4. Aflojar tornillos de las llantas. 5. Sacar los tornillos de las llantas. 6. Quitar la llanta. 7. Poner la llanta de repuesto. 8. Poner los tornillos. 9. Apretar los tornillos. 10. Bajar el gato. 11. Fin Datos de entrada: la rueda pinchada, parches, pegamento, gata etc. Datos de salida: la rueda preparada. Dato auxiliar: las burbujas que salen donde esta el pinchazo.

1.1.3. LENGUAJES DE PROGRAMACIN


Un algoritmo se describe utilizando algn lenguaje especfico. Lenguaje natural: Es aqul que describe en espaol, para nuestro caso, los pasos a seguir utilizando un vocabulario cotidiano. Como los ejercicios anteriores Lenguaje de programacin: Lenguaje utilizado para comunicarnos con un ordenador e imponerle la realizacin concreta de un conjunto de rdenes.

Programacin I

UCENM

Algunos lenguajes de programacin: 1. Lenguaje mquina. Son aqullos que estn escritos en lenguajes directamente entendibles por la mquina (computadora), ya que sus instrucciones son cadenas binarias (cadenas o series de caracteres de dgitos 0 y 1) que especifican una operacin y las posiciones (direccin) de memoria implicadas en la operacin se denominan instrucciones de mquina o cdigo mquina. El cdigo mquina es el conocido cdigo binario. Las instrucciones en lenguaje mquina dependen del hardware de la computadora y, por tanto, diferirn de una computadora a otra. 2. Lenguajes de alto nivel Son ms fciles de utilizar que los lenguajes mquina, pero al igual que ellos, dependen de la mquina en particular. El lenguaje de bajo nivel por excelencia es el ensamblador. Las instrucciones en lenguaje ensamblador son instrucciones conocidas como nemotcnicos. Por ejemplo, nemotcnicos tpicos de operaciones aritmticas son: en ingls: ADD, SUB, DIV, etc. ; en espaol : SUM, RES, DIV, etc. Una instruccin tpica de suma sera : ADD M, N, P Esta instruccin significa "sumar el contenido en la posicin de memoria M al nmero almacenado en la posicin de memoria N y situar el resultado en la posicin de memoria P" . Evidentemente es ms sencillo recordar la instruccin anterior con un nemotcnico que su equivalente en cdigo mquina. 0110 1001 1010 1011 Un programa escrito en lenguaje ensamblador, requiere de una fase de traduccin al lenguaje mquina para poder ser ejecutado directamente por la computadora. El programa original escrito en lenguaje ensamblador se denomina programa fuente y el programa traducido en lenguaje mquina se conoce como programa objeto, el cual ya es directamente entendible por la computadora.

Programacin I

UCENM

1.1.4. PROGRAMAS
Programa: Es un conjunto de instrucciones escritas en un lenguaje de programacin que indican a la computadora la secuencia de pasos para resolver un problema. Puede incluir uno o ms algoritmo. EJEMPLO // Primer programa en C++ // Escribe en pantalla un mensaje #include <iostream> using namespace std; int main() { cout << "Bienvenido a C++" << endl; system("pause"); } Al cdigo escrito en un lenguaje concreto se le denomina cdigo fuente. ste se guarda en ficheros de texto normales (en el caso de C++ suelen tener extensin .cpp). bienvenido.cpp es un simple fichero de texto. Para obtener el programa ejecutable (el fichero en binario que puede ejecutarse en un ordenador) a partir del cdigo fuente, se utiliza un compilador:

Ejemplo no 2.

Programacin I

UCENM

// Programa que lee dos nmeros enteros por teclado // y muestra por pantalla su divisin real #include <iostream> using namespace std; int main() { int dato1; int dato2; double division; cout << "Introducir primer dato: "; cin >> dato1; cout << "Introducir segundo dato: "; cin >> dato2; if ( dato2 !=0 ) { division = (1.0*dato1) / dato2; cout << "La division es: " << division; } else cout << "Error: Division por cero" << endl; system("pause"); } Ejemplo no 3 / * Este programa solicita las longitudes de los lados de un triangulo y calcula su hipotenusa. */ #include <iostream> #include <cmath> using namespace std; int main(void) { double lado1, lado2, hipotenusa; //ENTRADAS

Programacin I

UCENM

cout << "Este programa calcula la hipotenusa de un triangulo." << endl; cout << "Introduzca la longitud del lado 1: "; cin >> lado1; cout << "Introduzca la longitud del lado 2: "; cin >> lado2; //PROCESO hipotenusa = sqrt(lado1*lado1+lado2*lado2); //SALIDA cout << "La hiponusa es " << hipotenusa << endl; system("pause"); }

1.2. ESPECIFICACIN DE PROGRAMAS 1.2.1. ESCRITURA Y ORGANIZACIN DE UN PROGRAMA


Los programas en C++ pueden dividirse en varios archivos aunque por ahora vamos a suponer que cada programa est escrito en un nico fichero (por ejemplo, hipotemusa.cpp). Se pueden incluir comentarios en lenguaje natural. /* Comentario en varias lneas */ // Comentario 1 sola lnea El texto de un comentario no es procesado por el compilador. Al principio del fichero se indica que vamos a usar una serie de recursos definidos en un fichero externo o biblioteca #include <iostream> #include <cmath> using namespace std; A continuacin aparece int main(){ que indica que comienza el programa principal. ste se extiende desde la llave abierta {, hasta encontrar la correspondiente llave cerrada. Dentro del programa principal van las sentencias que componen
Programacin I 10 UCENM

el programa. Una sentencia es una parte del cdigo fuente que el compilador puede traducir en una instruccin en cdigo binario. Las sentencias van obligatoriamente separadas por punto y coma (;) El compilador va ejecutando las sentencias secuencialmente de arriba abajo. Cuando llega a la llave cerrada } correspondiente a main(), y si no han habido problemas, el programa termina de ejecutarse y el Sistema Operativo libera los recursos asignados a dicho programa. Existen varios tipos de sentencias: Sentencias de declaracin de datos. double lado1, lado2; // <- Separados por coma double hip; // <- Pueden usarse varias lneas Declara tres datos (variables) de tipo real que el programador puede usar en el programa. Cada dato que se use en un programa debe declararse al principio (despus de main), asocindole un tipo de dato concreto. Sentencias de clculo, a travs de la asignacin = lado1 = 7; lado2 = 5; hip = sqrt(lado1*lado1 + lado2*lado2); asigna a la variable hip el resultado de evaluar lo que aparece a la derecha de la asignacin. Sentencias para mostrar informacin en el perifrico de salida establecido por defecto. Dicho perifrico ser la pantalla, pero podra ser un archivo en disco o dispositivo externo (impresora, plotter, puerto FireWire, etc.). Se construyen usando cout, que es un recurso externo incluido
Programacin I 11 UCENM

en la biblioteca iostream. _ Lo que se vaya a imprimir va separado de cout por <<. _ Lo que haya dentro de un par de comillas dobles se muestra tal cual, excepto los caracteres precedidos de \. Por ejemplo, \n hace que el cursor salte al principio de la lnea siguiente. _ Los nmeros se escriben tal cual. cout << "Valor de Pi: " << 3.1415927; _ Si ponemos una variable, se imprime su contenido. cout << "Introduzca la longitud del primer cateto: "; ..... hip = sqrt(lado1*lado1+lado2*lado2); cout << "\nLa hipotenusa vale " << hip; _ Aunque no es recomendable, tambin pueden ponerse expresiones como: cout << "\nLa hipotenusa vale " << sqrt(lado1*lado1+lado2*lado2); Sentencias para leer datos desde el dispositivo de entrada establecido por defecto. Por ahora, ser el teclado. Se construyen usando cin, que es un recurso externo incluido en la biblioteca iostream. Su sintaxis ms elemental es la siguiente cin >> variable; Por ejemplo, cin >> lado1, espera a que el usuario introduzca un valor real (double) desde el teclado (dispositivo de entrada) y, cuando se pulsa la tecla Intro, lo almacena en la variable lado1. Conforme se va escribiendo el valor, ste se muestra en pantalla, incluyendo el salto de lnea. Es una asignacin en tiempo de ejecucin Las entradas de datos deben etiquetarse adecuadamente: // MAL: cin >> lado1;
Programacin I 12 UCENM

cin >> lado2; // BIEN: cout << "Introduzca la longitud del primer cateto: "; cin >> lado1; cout << "Introduzca la longitud del segundo cateto: "; cin >> lado2; Estructura bsica de un programa (los corchetes delimitan secciones opcionales):

1.2.2. Elementos bsicos de un lenguaje de programacin


1.2.2.1. tokens y reglas sintcticas Cada lenguaje de programacin tiene una sintaxis propia que debe respetarse para poder escribir un programa. Bsicamente, queda definida por: a) Los componentes lxicos o tokens. Un token es un carcter o grupo de caracteres alfanumricos o simblicos que representa la unidad lxica mnima que el lenguaje entiende. Por ejemplo: main ; { double hip *

Programacin I

13

UCENM

b) Reglas sintcticas que determinan como han de combinarse los tokens para formar sentencias. Algunas reglas sintcticas se especifican con tokens especiales (formados usualmente por smbolos): o Separador de sentencias ; o Para agrupar varias sentencias se usa { } o Para agrupar expresiones (frmulas) se usa ( ) hip = sqrt((lado1*lado1)+(lado2*lado2)); 1.2.2.2. PALABRAS RESERVADAS Suelen ser tokens formados por caracteres alfabticos. Tienen un significado especfico para el compilador, y por tanto, el programador no puede definir variables con el mismo identificador. Algunos usos: main Para definir tipos de datos como por ejemplo double Para establecer el flujo de control, es decir, para especificar el orden en el que se han de ejecutar las sentencias, como if, while, for etc. // Errores sintcticos int main(){ double main; // main es un nombre de dato incorrecto double double; // double es un nombre de dato incorrecto }

Palabras reservadas comunes a C (C89) y C++

Programacin I

14

UCENM

1.2.3. TIPOS DE ERRORES EN LA PROGRAMACIN Errores en tiempo de compilacin. Ocasionados por un fallo de sintaxis en el cdigo fuente. No se genera el programa ejecutable. /* CONTIENE ERRORES */ #include <iostre am> USING namespace std; int main{}( double la do1, lado2, hip: lado1 = 2; lado2 = 3 hip = sqrt(lado1**lado1 + ladp2*ladp2); cout << "La hipotenusa vale << hip; ) Errores en tiempo de ejecucin. Se ha generado el programa ejecutable, pero se produce un error durante la ejecucin.

.........
Programacin I 15 UCENM

lado1 = 9; lado2 = 4; hip = sqrt(-lado1*lado1-lado2*lado2); variable = 0; dato = 10 / variable; ......... Errores lgicos Se ha generado el programa ejecutable, pero el programa ofrece una solucin equivocada. ......... lado1 = 4; lado2 = 9; hip = sqrt(lado1+lado1+lado2*lado2); ......... 1.3. DATOS, TIPOS DE DATOS Y LITERALES 1.3.1. REPRESENTACIN EN MEMORIA DE DATOS E INSTRUCCIONES. Un programa realiza instrucciones y opera con datos. Una vez compilado el programa, todo son combinaciones adecuadas de 0 y 1.

Programacin I

16

UCENM

1.3.2. DATOS Y TIPOS DE DATOS Al trabajar con un lenguaje de alto nivel, no haremos referencia a la secuencia de 0 y 1 que codifican un valor concreto, sino a lo que representa para nosotros. Un dato es un conjunto de celdas o posiciones de memoria que tiene asociado un nombre (identificador) y un contenido (valor). NombreEmpleado "Juan Prez" NmeroHabitantes 75.225.813 Pi 3.14159 El compilador reconoce distintas categoras de datos (numricas, texto, etc.). Necesitamos almacenar muchos tipos de informacin (enteros, reales, caracteres, cadenas de caracteres,etc.). Para cada tipo, el lenguaje ofrece un tipo de dato. Por ejemplo, en C++:

Programacin I

17

UCENM

1.3.2.1. LITERALES
Son la especificacin de un valor concreto de un tipo de dato. Dependiendo del tipo, tenemos: Literales numricos: son tokens numricos. Para representar datos reales, se usa el punto. Para especificar la parte decimal: 2 3 3.5 Literales de caracteres: Es un nico carcter encerrado entre comillas simples: 'a' Literales de cadenas de caracteres: Son cero o ms caracteres encerrados entre comillas dobles: "Hola" Literales lgicos: true para representar verdadero y false para falso.

1.3.2.2. DECLARACIN DE DATOS


Cada dato que se use en un programa debe declararse al principio (despus de main), asocindole un tipo de dato concreto y un identificador. Al declarar un dato, el compilador reserva una zona de memoria para trabajar con l. Ningn otro dato podr usar dicha zona. Cada dato debe estar asociado a un nico tipo de dato (el tipo no puede cambiarse durante la ejecucin). El valor que se le puede asignar a un dato depende del tipo de dato con el que es declarado. Los datos se pueden clasificar como: datos : variables y constantes Las variables con datos cuyo valor puede variar a lo largo del programa, p.e., lado1. Las constantes son datos cuyo contenido no vara a lo largo de la ejecucin del programa, p.e., el nmero

Declaracin de variables: Un nico identificador por declaracin:


<tipo> <identificador1>; <tipo> <identificador2>;
Programacin I 18 UCENM

...
Ejemplo: double lado1; double lado2; double hip; Varios identificadores por declaracin: <tipo> <identificadores separados por coma>; Ejemplo: double lado1, lado2, hip; Opcionalmente, se puede dar un valor inicial durante la declaracin: <tipo> <identificador> = <valor_inicial>; <tipo> <identificador> = <valor_inicial>, <identificador>...; Ejemplo: double dato = 4.5; int sumaCuentas = 0, totalVentas; Cuando se declara una variable y no se inicializa, sta no tiene ningn valor asignado por defecto. Puesto que desconocemos su valor, lo podremos considerar como basura, y lo representaremos grficamente por ?. 1.3.2.3. DATOS CONSTANTES Si slo permitimos un nico valor para un dato, usaremos una constante. Se declaran como sigue: const <tipo> <identif> = <expresin>; Suelen usarse identificadores slo con maysculas para diferenciarlos de los datos variables. Una sintaxis de programa algo ms completa

Programacin I

19

UCENM

1.3.2.4. NORMAS PARA LA ELECCIN DEL IDENTIFICADOR Cada dato necesita un identificador nico. Un identificador de un dato es un token formado por caracteres alfanumricos con las siguientes restricciones: Debe empezar por una letra o subrayado (_) No pueden contener espacios en blanco ni ciertos caracteres especiales como letras acentuadas, la letra ee, las barras \ o /, etc. Ejemplo: lado1 lado2 precio_con_IVA El compilador determina la mxima longitud que pueden tener (por ejemplo, 31 caracteres) Sensibles a maysculas y minsculas. lado y Lado son dos identificadores distintos. No se podr dar a un dato el nombre de una palabra reservada. No es recomendable usar el nombre de algn identificador usado en las bibliotecas estndar (por ejemplo, cout)

Programacin I

20

UCENM

1.4. Operadores y Expresiones 1.4.1. TERMINOLOGA EN MATEMTICAS Notaciones usadas en los operadores: Prefija. El operador va antes de los argumentos. Estos suelen encerrarse entre parntesis. seno(3), tangente(x), media(valor1, valor2) Infija. El operador va entre los argumentos. 3+5 x / y Segn el nmero de argumentos, diremos que un operador es: Unario. Slo tiene un argumento: seno(3), tangente(x) Binario. Tienes dos argumentos: media(valor1, valor2) 3+5 x/y n-ario. Tiene ms de dos argumentos.

1.4.2. OPERADORES EN UN LENGUAJE DE PROGRAMACIN


Al igual que en Matemticas, los operadores realizan una accin especfica. Suelen devolver un valor. Los operadores operan sobre los datos (variables o constantes), literales y sobre el resultado que dan otros operadores. Ejemplos: + (suma), - (resta), * (producto), etc. int main() { const double PI = 3.1415926; double area, radio; cout << "Introduzca el valor del radio "; cin >> radio; area = PI * radio * radio; La asignacin es otro operador (infijo y binario). En primer lugar, se evala el argumento de la derecha y se asigna el resultado al dato (variable) de la izquierda. lado = 3 + 5;

Programacin I

21

UCENM

1.4.3. EXPRESIONES Una expresin es una combinacin de datos y operadores sintcticamente correcta, que el compilador evala y devuelve un valor. 3 3+5 lado1 lado1*lado1 lado1*lado1 + lado2*lado2 sqrt(lado1*lado1 + lado2*lado2) Las expresiones pueden aparecer a la derecha de una asignacin, pero no a la izquierda. Tambin pueden pasarse como argumentos de operadores. Una expresin NO es una sentencia de un programa: Expresin: sqrt(lado1*lado1 + lado2*lado2) Sentencia: hip = sqrt(lado1*lado1 + lado2*lado2) 1.5. TIPOS DE DATOS COMUNES EN C++ 1.5.1. RANGO Y OPERADORES APLICABLES A UN TIPO DE DATO Las caractersticas que definen el comportamiento de un tipo de dato son: El rango de valores que puede representar, que depende de la cantidad de memoria que dedique el compilador a su representacin interna. Intuitivamente, cuanta ms memoria se dedique para un tipo de dato, mayor ser el nmero de valores que podremos representar. La forma de hacerlo (codificacin en binario) se ve en otras asignaturas. La cantidad de memoria que el compilador asigna a cada tipo se puede consultar mediante la operacin sizeof(<tipo>) cuyo resultado es un entero que contiene el nmero de bytes asignados a <tipo>. Los valores mnimos y mximos que se pueden representar para cada tipo se pueden consultar en los ficheros climits y cfloat El conjunto de operadores que pueden aplicarse a los datos de ese tipo.
Programacin I 22 UCENM

1.5.2. LOS TIPOS DE DATOS ENTEROS 1.5.2.1. RANGO DE LOS ENTEROS Subconjunto del conjunto matemtico Z. La cardinalidad depender del nmero de bytes que cada compilador utiliza para su almacenamiento. Cuanta ms memoria, ms datos distintos podrn representarse. Los compiladores suelen ofrecer distintos tipos enteros. En C(C++): int, long, short, etc. Por simplificar, usaremos un nico tipo entero: int Literales enteros Los literales son la especificacin de un valor concreto de un tipo de dato. Los literales enteros son tokens formados por smbolos numricos. Pueden empezar con un signo negativo 34 -406778 0

1.5.2.2. OPERADORES
Operadores binarios + - * / % suma, resta, producto, divisin entera y mdulo. Devuelven un entero. Binarios. Notacin infija: a*b int n; n = 5 * 7; // Asigna a la variable n el valor 35 n = n + 1; // Asigna a la variable n el valor 36 n = 5 / 7; // Asigna a la variable n el valor 0 5 / 7 = n; // Sentencia Incorrecta. 5 / 7; // Sentencia Incorrecta.

Programacin I

23

UCENM

El operador mdulo (%) representa el resto de la divisin entera int a, b, cociente, resto; a = 10; b = 3; cociente = a / b; // Asigna a cociente el valor 3 resto = a % b; // Asigna a resto el valor 1 b = 7 / 5; // Asigna a b el valor 1 Operadores unarios de incremento y decremento

++ y -Incrementan y decrementan, respectivamente, el valor de la variable entera sobre la que se aplican (no pueden aplicarse sobre una expresin). Unarios de notacin postfija. <variable>++; /* Incrementa la variable en 1 Es equivalente a: <variable> = <variable> + 1; */ <variable>--; /* Decrementa la variable en 1 Es equivalente a: <variable> = <variable> - 1; */ ------------------------------------------------int dato=4, aux1, aux2; dato = dato+1; // Asigna 5 a dato aux1 = dato; // Asigna 5 a aux1 dato++; // Asigna 6 a dato aux2 = dato; // Asigna 6 a aux2 -------------------------------------------------------Operador unario de cambio de signo Cambia el signo de la variable sobre la que se aplica. Unario de notacin prefija. int dato=4, aux1, aux2; aux1 = -dato; // Asigna -4 a aux1 aux1 = -aux1; // Asigna 4 a aux1

Programacin I

24

UCENM

1.5.3. LOS TIPOS DE DATOS REALES 1.5.3.1. RANGO Subconjunto finito de R Parte entera de 4;56 = 4 Parte real de 4;56 = 56 La precisin de un tipo real puede definirse como la diferencia entre 1,0 y el siguiente nmero que se puede representar. En Matemticas, R es denso, por lo que la precisin es infinita. En cualquier lenguaje de programacin los reales tendrn una precisin limitada, que depender de la cantidad de memoria utilizada para representar la parte decimal. Por ejemplo, si la precisin es 0;001, el valor 0;0003 no podra representarse. Los compiladores suelen ofrecer distintos tipos reales. Por ejemplo, en C(C++): float, double Por simplificar, usaremos un nico tipo real: double En aplicaciones reales habr que escoger el tipo adecuado dependiendo de lo que representa. Literales reales Son tokens formados por dgitos numricos y con un nico punto que separa la parte decimal de la real. Pueden llevar el signo - al principio. 800.457 4.0 -3444.5 Tambin se puede utilizar notacin cientfica: 3e-5 que representa el valor 3 _ 10_5 = 0;00001

1.5.3.2. OPERADORES
+, -, *, / Binarios, de notacin infija. Tambin se puede usar el operador unario de cambio de signo (-) Aplicados sobre reales, devuelven un real. double r;

Programacin I

25

UCENM

r = 5.0 * 7.0; // Asigna a r el valor 35.0 r = 5.0 / 7.0; // Asigna a r el valor 0.7142857 Cuidado! El comportamiento del operador / depende del tipo de los operandos: si todos son enteros, es la divisin entera. Si todos son reales, es la divisin real. 1.5.3.3. FUNCIONES ESTNDAR Hay algunas bibliotecas estndar que proporcionan funciones que trabajan sobre datos numricos (enteros o reales) y que suelen devolver un real. Por ejemplo, cmath pow(), cos(), sin(), sqrt(), tan(), log(), log10(), fabs(), .... Todos los anteriores son unarios excepto pow, que es binario. Devuelven un real. #include <iostream> #include <cmath> using namespace std; int main() { double real, r; real = 5.4; r = sqrt(real); r = pow(real,real); } 1.5.3.4. EXPRESIONES REALES Son expresiones cuyo resultado es un nmero real. En general, diremos que las expresiones aritmticas o numricas son aquellas expresiones bien enteras, bien reales. double a, x, y, c, resultado; resultado = x - sqrt(sqrt(a)-a*c))/(x-y); 1.5.4. OPERACIONES CON TIPOS NUMRICOS DISTINTOS Muchos operadores numricos permiten como argumentos, expresiones de tipos distintos. double r; r = 5.0 * 7.0; // Asigna a r el valor 35.0

Programacin I

26

UCENM

r = 5.0 / 7.0; // Asigna a r el valor 0.7142857 r = 5.0 / 7; // Asigna a r el valor 0.7142857 r = 5 / 7; // Asigna a r el valor 0 Para evaluar una expresin con tipos distintos, el compilador usar el tipo adecuado que sea capaz de albergar el resultado. Por ejemplo, usar un double para almacenar el resultado de 5.0 / 7, es decir, 0.7142857. El operador de asignacin tambin lo permite: double real; int entero = 5; real = 5; // double = int real = entero // double = int

1.5.5. EL TIPO DE DATO CARCTER 1.5.5.1. RANGO Es un conjunto finito y ordenado de caracteres: letras minsculas, maysculas, dgitos del 0 al 9 y otros caracteres especiales. Hay varios tipos de dato de carcter: char, wchar, signed char, etc. usaremos char. secuencia de escape,

Programacin I

27

UCENM

1.5.5.2. FUNCIONES ESTNDAR El fichero de cabecera cctype contiene varias funciones relativas a caracteres. Por ejemplo: tolower toupper #include <cctype> using namespace std; int main(){ char car; car = tolower('A'); // Almacena 'a' car = toupper('A'); // Almacena 'A' car = tolower('B'); // Almacena 'b' car = tolower('?'); // Almacena '?' .................. 1.5.6. EL TIPO DE DATO CADENA DE CARACTERES Los literales de cadenas de caracteres son una sucesin de caracteres encerrados entre comillas dobles: "Hola", "a" son literales de cadena de caracteres cout << "Esto es un literal de cadena de caracteres"; Hay que destacar que las secuencias de escape tambin pueden aparecer en los literales de cadena de caracteres presentes en cout int main(){ cout << "Bienvenidos"; cout << "\nEmpiezo a escribir en la siguiente lnea"; cout << "\n\tAcabo de tabular esta lnea"; cout << "\n"; cout << "\nEsto es una comilla simple '"; cout << " y esto es una comilla doble \""; } Escribira en pantalla: Bienvenidos Empiezo a escribir en la siguiente lnea Acabo de tabular esta lnea Esto es una comilla simple ' y esto es una comilla doble "

Programacin I

28

UCENM

El tipo de dato para declarar estos datos es string int main(){ string mensaje_bienvenida; mensaje_bienvenida = "\tCubero Corporation\n"; cout << mensaje_bienvenida; ........ } Los operadores para string trabajan con una sintaxis distinta a la que sabemos. #include <iostream> using namespace std; int main(){ string cad; cad = "Hola y "; cad.append("adis"); cout << cad; ..... 1.5.7. EL TIPO DE DATO LGICO O BOOLEANO Es un tipo de dato muy comn en los lenguajes de programacin que se utiliza para representar los valores verdadero y falso que suelen estar asociados a una condicin. En C++ se usa el tipo bool 1.5.7.1. RANGO Un dato lgico, slo puede tomar dos valores: true (verdadero) y false (falso). Una expresin lgica es una expresin cuyo resultado es un tipo de dato lgico. 1.5.7.2. OPERADORES Son los operadores clsicos de la lgica NO, Y, O que en C++ son los operadores !, &&, ||, respectivamente.

Programacin I

29

UCENM

Muchas funciones de cctpye devuelven un valor lgico Isalpha isalnum isdigit ... Por ejemplo, isalpha('3') es una expresin lgica (devuelve false) /* Ejemplo de tipo de dato lgico (bool) */ #include <cctype> using namespace std; int main() { bool es_alfa, es_alfanum, es_digito_numerico; bool compuesto; es_alfa = isalpha('3'); // Asigna false a es_alfa es_alfanum = isalnum('3'); // Asigna true a es_alfanum es_digito_numerico = isdigit('3'); // Asigna true a es_digito_numerico compuesto = (es_alfa && es_alfanum); // Resultado: false compuesto = (es_alfa || es_alfanum); // Resultado: true compuesto = !es_alfa; // Resultado: true ....... } 1.5.7.3. OPERADORES RELACIONALES Son los operadores habituales de comparacin de expresiones numricas. Pueden aplicarse a operandos tanto enteros, reales, como de caracteres y tienen el mismo sentido que en Matemticas.
Programacin I 30 UCENM

El resultado es de tipo bool. == (igual), != (distinto), <, >, <= (menor o igual) y >= (mayor o igual) La expresin (4 < 5) devuelve valor true La expresin (4 > 5) devuelve el valor false Nota: != es el operador relacional distinto. ! es la negacin lgica. == es el operador relacional de igualdad. = es la operacin de asignacin. Tanto en == como en != se usan 2 signos para un nico operador // Ejemplo de operadores relacionales int main(){ int entero1 = 3, entero2 = 5; double real1, real2; bool menor, iguales; menor = entero1 < entero2; menor = entero2 < entero1; menor = (entero1 < entero2) && !(entero2 < 7); real1 = 3.8; real2 = 8.1; menor = real1 > entero1; menor = !menor && (real1 > real2); iguales = real1 == real2; } Veremos su uso en la sentencia condicional: if (4 < 5) cout << "4 es menor que 5"; if (!(4 > 5)) cout << "4 es menor o igual que 5"; Nota. Cuidado cuando se comparan reales. La expresin 1.0e15 == (1.0/3.0)*3.0*1.0e15 podra evaluarse a false debido a problemas de precisin. Reglas de Precedencia: () !
Programacin I 31 UCENM

< <= > >= == != && || A es menor o igual que B y B no es mayor que C A <= B && !B > C MAL (A <= B) && (!(B > C)) BIEN (A <= B) && !(B > C) RECOMENDADO 2.2. ESTRUCTURA CONDICIONAL 2.2.1. INTRODUCCIN Los elementos bsicos que integran un programa o algoritmo son: Palabra reservada Constantes Variables Expresiones Instrucciones Adema de estos elementos bsicos existen otros elementos que forman parte de los programas, cuya comprensin ser vital para el correcto diseo de un algoritmo y la codificacin del programaba. Estos elementos son Bucles Contadores Acumuladores Interruptores Estructuras o Secuenciales o Selectivas o Repetitivas El conocimiento de todos estos elementos de programacin y el modo de su integracin en los programas constituyen las tcnicas de programacin que todo buen programador debe conocer.

La ejecucin de una estructura condicional consiste en la ejecucin de una (o ms) sentencia(s) dependiendo de la evaluacin de una condicin. Una estructura condicional es una estructura que permite una Ejecucin condicional. Existen tres tipos: Simple, Doble y Mltiple.

Programacin I

32

UCENM

Ejemplo: Calcular las races de una ecuacin de 2o grado. Algoritmo: Entradas: Los parmetros de la ecuacin a, b, c. Salidas: Las races de la parbola r1, r2 Descripcin: Calcular r1, r2 en la forma siguiente:

/* Programa que calcula las races de una ecuacin de segundo grado (primera versin ) */ #include <iostream> #include <cmath> using namespace std; int main(){ double a, b, c; // Parmetros de la ecuacin double r1, r2; // Races obtenidas 1 cout << "\nIntroduce coeficiente de 2o grado: "; 2 cin >> a; 3 cout << "\nIntroduce coeficiente de 1er grado: "; 4 cin >> b; 5 cout << "\nIntroduce coeficiente independiente: "; 6 cin >> c; 7 r1 = ( -b + sqrt( b*b-4*a*c ) ) / (2*a); 8 r2 = ( -b - sqrt( b*b-4*a*c ) ) / (2*a); 9 cout << "Las races son" << r1 << " y " << r2 << endl; } Flujo de control: (1,2,3,4,5,6,7,8,9) Pregunta: Es a distinto de cero? Si. Entonces sigue la ejecucin.
Programacin I 33 UCENM

No. Entonces salta las sentencias 79 y termina. /* Programa que calcula las races de una ecuacin de segundo grado (SEGUNDA VERSION ) */ #include <iostream> #include <cmath> using namespace std; int main(){ double a, b, c; // Parmetros de la ecuacin double r1, r2; // Races obtenidas 1 cout << "\nIntroduce coeficiente de 2o grado: "; 2 cin >> a; 3 cout << "\nIntroduce coeficiente de 1er grado: "; 4 cin >> b; 5 cout << "\nIntroduce coeficiente independiente: "; 6 cin >> c; 7 if (a!=0) { 8 r1 = ( -b + sqrt( b*b-4*a*c ) ) / (2*a); 9 r2 = ( -b - sqrt( b*b-4*a*c ) ) / (2*a); 10 cout << "Las races son" << r1 << " y " << r2 << endl; } } 2.2. ESTRUCTURA CONDICIONAL 2.2.1. INTRODUCCIN Una ejecucin condicional consiste en la ejecucin de una (o ms) sentencia(s) dependiendo de la evaluacin de una condicin. Una estructura condicional es una estructura que permite una ejecucin condicional. Existen tres tipos: Simple, Doble y Mltiple. 2.2.2. ESTRUCTURA CONDICIONAL SIMPLE if (<condicin>) <bloque if> <condicin> es una expresin lgica <bloque if> es el bloque de ejecucin condicional

Programacin I

34

UCENM

Si hay varias sentencias, es necesario encerrarlas entre llaves. Dicho de otra forma: si no ponemos llaves, el compilador entiende que la nica sentencia del bloque if es la que hay justo debajo. if (a!=0) r1 = ( -b + sqrt( b*b-4*a*c ) ) / (2*a); r2 = ( -b - sqrt( b*b-4*a*c ) ) / (2*a); // :-( Error lgico) cout << "Las races son" << r1 << " y " << r2 << endl; 2.2.3. UNA NOTACIN PARA DESCRIBIR ALGORITMOS Diagramas de flujo Smbolos bsicos

Smbolos adicionales

Programacin I

35

UCENM

Programacin I

36

UCENM

2.2.4. CONDICIONAL DOBLE

Programacin I

37

UCENM

/* Programa que calcula las races de una ecuacin de segundo grado (TERCERA VERSION ) */ #include <iostream> #include <cmath> using namespace std; int main(){ double a, b, c; // Parmetros de la ecuacin double r1, r2; // Races obtenidas cout << "\nIntroduce coeficiente de 2o grado: "; cin >> a; cout << "\nIntroduce coeficiente de 1er grado: "; cin >> b; cout << "\nIntroduce coeficiente independiente: "; cin >> c; if (a!=0) { r1 = ( -b + sqrt( b*b-4*a*c ) ) / (2*a); r2 = ( -b - sqrt( b*b-4*a*c ) ) / (2*a); cout << "Las races son" << r1 << " y " << r2 << endl; } else { r1=-c/b; cout << "La nica raz es " << r1 << endl; } }

Ejercicio. Identifica y corrige los errores de este cdigo: if edad >= 65 cout << "Jubilado"; else; cout << "Poblacion activa" Ejemplo: El mayor de tres nmeros a, b y c (primera versin ). Algoritmo: Entradas: a y b Salidas: El mayor entre a y b Descripcin:
Programacin I 38 UCENM

Si a es mayor que los otros, el mayor es a Si b es mayor que los otros, el mayor es b Si c es mayor que los otros, el mayor es c if ((a>=b) && (a>=c)) max = a; if ((b>=a) && (b>=c)) max = b; if ((c>=a) && (c>=b)) max = c; cout << "El mayor es " << max << endl;

2.2.5. ANIDAMIENTO DE ESTRUCTURAS CONDICIONALES Dentro de un bloque if (else), puede incluirse otra estructura condicional, anidndose tanto como permita el compilador.

Programacin I

39

UCENM

if (condic_1) { inst_1; if (condic_2) { inst_2; } else { inst_3; } inst_4; } else { inst_5; }


Cundo se ejecuta cada instruccin?

condic_1 condic_2 inst_1 true independiente inst_2 true true inst_3 true false inst_4 true independiente inst_5 false independiente
Ejemplo: El mayor de tres nmeros (segunda aproximacin) Algoritmo: Entradas y Salidas: idem Descripcin: Si a es mayor que b, entonces: Calcular el mayor entre a y c En otro caso, Calcular el mayor entre b y c if (a>=b) if (a>=c) max = a; else
Programacin I 40 UCENM

max = c; else if (b>=c) max = b; else max = c; cout << "El mayor es " << max << endl;

Ejemplo: El mayor de tres nmeros (tercera aproximacin) Algoritmo: Entradas y Salidas: dem Descripcin: Calcular el mximo (max) entre a y b. Calcular el mximo entre max y c. if (a>=b) max = a; else max = b;

Programacin I

41

UCENM

if (c>max) max = c; cout << "El mayor es " << max << endl;

Con qu algoritmo nos quedamos?


Supongamos que todos los valores son distintos La solucin 1 siempre evala 3 condiciones y realiza 1 asignacin. La solucin 2 siempre evala 2 condiciones y realiza 1 asignacin. La solucin 3 siempre evala 2 condiciones y realiza 1 2 asignaciones. La solucin 2 es ms eficiente. Pero la solucin 3 es mucho mejor:
Programacin I 42 UCENM

Es mucho ms fcil de entender Es mucho ms fcil de extender a varios valores. El mayor de cuatro nmeros. Aproximacin 1: if (a>=b) if (a>=c) if (a>=d) max = a; else max = d; else if (c>=d) max = c; else max = d; else if (b>=c) If (b>=d) max = b; else max = d; else if (c>=d) max = c; else max = d; cout << "El mayor es " << max << endl; Aproximacin 2: Algoritmo: Entradas y Salidas: idem Descripcin: Calcular el mximo (max) entre a y b. Calcular el mximo entre max y c. Calcular el mximo entre max y d.

Programacin I

43

UCENM

if (a>=b) max = a; else max = b; if (c>max) max = c; if (d>max) max = d; cout << "El mayor es " << max << endl; En general: Calcular el mximo (max) entre a y b. Para cada uno de los valores restantes, calcular el mximo entre max y dicho valor. Ejemplo: Estructuras condicionales anidadas /* Programa que permite sumar o restar dos nmeros enteros */ #include <iostream> using namespace std; int main(){ int dato1, dato2; char opcion; cout << "\nIntroduce el primer operando: "; cin >> dato1; cout << "\nIntroduce el segundo operando: "; cin >> dato2; cout << "\nSelecciona (S) sumar, (R) restar: "; cin >> opcion; if (opcion == S) cout << "Suma = " << dato1+dato2 << endl; if (opcion == R) cout << "Resta = " << dato1-dato2 << endl; if (opcion != R && opcion != S)

Programacin I

44

UCENM

cout << "Ninguna operacin" << endl; } El mismo ejercicio pero ms eficientemente: if (opcion == S) cout << "Suma = " << dato1+dato2 << endl; else if (opcion == R) cout << "Resta = " << dato1-dato2 << endl; else cout << "Ninguna operacin" << endl; } 2.2.6. ESTRUCTURA CONDICIONAL MLTIPLE

<expresin> es un expresin entera. <constante1> <constante2> es un literal tipo entero o tipo carcter. switch slo comprueba la igualdad. No debe haber dos casos (case) con la misma<constante> en el mismo switch. Si esto ocurre, slo se ejecutan las sentencias correspondientes al caso que aparezca primero.
Programacin I 45 UCENM

El identificador especial default permite incluir un caso por defecto, que se ejecutar si no se cumple ningn otro. Se suele colocar como el ltimo de los casos. En las estructuras condicionales mltiples tambin se permite el anidamiento. Se usa frecuentemente en la construccin de mens: /* Programa que permite sumar o restar dos nmeros enteros */ #include <iostream> using namespace std; int main(){ int dato1,dato2; char opcion; cout << "\nIntroduce el primer operando: "; cin >> dato1; cout << "\nIntroduce el segundo operando: "; cin >> dato2; cout << "\nSelecciona (S) sumar, (R) restar: "; cin >> opcion; switch (opcion) { case S: cout << "Suma = " << dato1+dato2 << endl; break; case R: cout << "Resta = " << dato1-dato2 << endl; break; default: cout << "Ninguna operacin" << endl; } } Se pueden realizar las mismas operaciones para un grupo determinado de constantes: switch (opcin) { case s: case S: cout << "Suma = " << dato1+dato2 << endl; break; case r: case R: cout << "Resta = " << dato1-dato2 << endl;
Programacin I 46 UCENM

break; default: cout << "Ninguna operacin" << endl; break; // Ponemos break; aunque no sea necesario } 2.2.7. CUESTIONES ADICIONALES 2.2.7.1. EVALUACIN EN CICLO CORTO Y EN CICLO LARGO Evaluacin en ciclo corto: El compilador optimiza la evaluacin de expresiones lgicas evaluando sus trminos de izquierda a derecha hasta que sabe el resultado de la expresin completa (lo que significa que puede dejar trminos sin evaluar). La mayora de los compiladores realizan este tipo de evaluacin por defecto. Evaluacin en ciclo largo: El compilador evala todos los trminos de la expresin lgica para conocer el resultado de la expresin completa. Ejemplo:

if ( (a>0) && (b<0) && (c<1) ) ...


Supongamos a = -3. Ciclo largo: El compilador evala (innecesariamente) todas las expresiones lgicas Ciclo corto: El compilador evala slo la primera expresin lgica. 2.2.7.2. PARTICULARIDADES DE C++ En C++, el tipo lgico es compatible con un tipo entero. Cualquier expresin entera que devuelva el cero, se interpretar como false. Si devuelve cualquier valor distinto de cero, se interpretar como true.

2.3. ESTRUCTURAS REPETITIVAS


Las estructuras repetitivas son tambin conocidas como bucles,
Programacin I 47 UCENM

ciclos o lazos. Una estructura repetitiva permite la ejecucin de una secuencia de sentencias: o bien, hasta que se satisface una determinada condicin (controladas por condicin) o bien, un nmero determinado de veces (controladas por contador)

2.3.1. BUCLES CONTROLADOS POR CONDICIN: PRE-TEST Y POST-TEST 2.3.1.1. FORMATO

Funcionamiento: En ambos, se va ejecutando el cuerpo del bucle mientras la condicin sea verdad. En un bucle while, primero se pregunta y luego (en su caso) se ejecuta. En un bucle do while, primero se ejecuta y luego se pregunta.

Programacin I

48

UCENM

Eleccin Pre-test, o post-test: Quiero que siempre se ejecute al menos una vez el cuerpo? Ejemplo: Escribir 20 lneas con 5 estrellas cada una. total = 1; do{ cout << "*****" << endl; total++; }while (total <= 20); O bien: total = 0; do{ cout << "*****" << endl;
Programacin I 49 UCENM

total++; }while (total < 20);

O bien: total = 1; while (total <= 20){ cout << "*****" << endl; total++; } O bien: total = 0; while (total < 20){ cout << "*****" << endl; total++; } Ejemplo: Leer un nmero positivo tope desde teclado e imprimir tope lneas con 5 estrellas cada una. cin >> tope; total = 0; do{ cout << "*****" << endl; total++; }while (total < tope);

Problema: Qu ocurre si tope = 0? Solucin: cin >> tope; total = 0; while (total < tope){ cout << "*****" << endl; total++; }

Programacin I

50

UCENM

Ejemplo: Leer un entero tope y escribir los pares

_ tope

cin >> tope; par = 0; while (par<= tope){ par = par+2; cout << par; }
Ejercicio. Calcular el mximo comn divisor de dos nmeros a y b. Probad con todos los enteros menores que el menor de ambos ambos nmeros, hasta llegar al primero que divida a los dos. Algoritmo: Entradas: Los dos enteros a y b Salidas: el entero MCD de a y b Descripcin: Calcular el menor entre a y b Probar con todos los enteros menores que menor, hasta encontrar uno que divida a ambos (a y b).

Ejemplo: // Programa que suma los valores ledos desde teclado // hasta que se introduzca el valor -1. #include<iostream> using namespace std; int main(){ int suma, numero; suma = 0; do{ cin >> numero; suma = suma + numero; }while (numero != -1); cout << "La suma es " << suma << endl; }

Programacin I

51

UCENM

Problema: Procesa el -1y lo suma. Solucin: do{ cin >> numero; if (numero != -1) suma = suma + numero; }while (numero != -1); Funciona, pero evala dos veces la misma condicin. Solucin: tcnica de lectura anticipada.

2.3.1.2. LECTURA ANTICIPADA Antes de entrar a un bucle pre-test, se comprueba el primer candidato. Ejemplo: // Programa que suma los valores ledos desde teclado // hasta que se introduzca el valor -1. // Usamos ciclo pre-test y lectura anticipada: #include <iostream> using namespace std; int main(){ int suma, numero; suma = 0; cin >> numero; // Primer candidato while (numero != -1) { // Es bueno? suma = suma + numero; cin >> numero; // Leer siguiente candidato } cout << "La suma es " << suma << endl; } Esta lectura anticipada nos permite ser ms especficos con los mensajes en pantalla:

Programacin I

52

UCENM

#include <iostream> using namespace std; int main(){ int suma, numero; suma = 0; cout << "\nIntroduzca un valor entero\n" cout << "Para terminar introduzca -1"; cout << "\nValor: "; cin >> numero; // Primer candidato while (numero != -1) { // Es bueno? suma = suma + numero; cout << "\nValor: "; cin >> numero; // Leer siguiente candidato } cout << "La suma es " << suma << endl; } Ejemplo: // Programa que va leyendo nmeros enteros hasta que se // introduzca el cero. Imprimir el nmero de pares e // impares introducidos. #include <iostream> using namespace std; int main(){ int ContPar, ContImpar, valor; ContPar=0; ContImpar=0; cout << "Introduce valor: " << endl; cin >> valor; while (valor != 0) { if (valor % 2 == 0) ContPar = ContPar + 1; else ContImpar = ContImpar + 1; cout << "Introduce valor: " << endl; cin >> valor; } cout << "Fueron " << ContPar << " pares y " << ContImpar << " impares" << endl; }
Programacin I 53 UCENM

2.3.1.3. BUCLES SIN FN Ejercicio:Cuantas iteraciones se producen? contador = 2; while (contador < 3) { contador--; cout << contador << endl; }

contador = 1; while (contador != 10) { contador = contador + 2; }

2.3.1.4. CREACIN DE FILTROS CON CICLOS POST-TEST Objetivo: Leer un valor y no permitir al usuario que lo introduzca fuera de un rango determinado. Una de las pocas veces que se usarn ciclos post-test. Ejemplo: // Introducir un nico valor, pero positivo. // Imprimir el coseno. #include <iostream> #include <cmath> using namespace std; int main(){ int valor; do{ cout << "\nIntroduzca un valor positivo: "; cin >> valor; }while (valor < 0); cout << cos(valor); }
Programacin I 54 UCENM

2.3.1.5. BUCLES CONTROLADOS POR CONTADOR Se utilizan para repetir un conjunto de sentencias un nmero fijo de veces. Se necesita una variable controladora, un valor inicial, un valor final y un incremento. Ejemplo: Hallar la media aritmtica de cinco enteros. // Hallar la media de 5 nmeros enteros. #include <iostream> using namespace std; int main(){ int i, valor, suma; double media; suma = 0; i = 1; // v_c = Vinic while (i <= 5){ // v_c <= Vfinal cout << "Introduce el nmero " << i << "o: \n"; cin >> valor; suma = suma + valor; i++; // v_c = v_c + 1 } media = suma / 5.0; cout << "La media es " << media << endl; }

Programacin I

55

UCENM

Diagrama de flujo

v_c es la variable controladora del ciclo. Vinic valor inicial que toma v_c. Vfinal valor final que debe tomar v_c.
2.3.2. BUCLE for COMO BUCLE CONTROLADO POR CONTADOR 2.3.2.1. FORMATO La sentencia for permite la construccin de una forma compacta de los ciclos controlados por contador, aumentando la legibilidad del cdigo.

// Hallar la media de 5 nmeros enteros. // Ejemplo de uso del for.

Programacin I

56

UCENM

#include <iostream> using namespace std; int main(){ int i, valor, suma; double media; suma = 0; for (i=1 ; i <= 5 ; i++){ cout << "Introduce el nmero " << i << "o: \n"; cin >> valor; suma = suma + valor; } media = suma / 5.0; cout << "La media es " << media << endl; }

Programacin I

57

UCENM

<asig. inicial> asignacin del valor inicial a la variable controladora del ciclo. v_c = Vinic <incremento> determina el modo en que la variable controladora cambia su valor para la siguiente iteracin. Incrementos positivos: v_c = v_c + incremento Incrementos negativos: v_c = v_c incremento <condicion> determina cundo ha de continuar la ejecucin del cuerpo del bucle. v_c <= Vfinal bien v_c < Vfinal para incrementos positivos v_c >= Vfinal bien v_c > Vfinal para incrementos negativos

Ejemplo: Imprimir 9 veces el mensaje Hola int i; for (i = 1; i <= 9; i++) cout << "Hola \n"; Con qu valor sale la variable i? 10 Cuando termina un bucle for, la variable contadora se queda con el primer valor que hace que la condicin del bucle sea falsa. Ejercicios: Qu salida producen los siguientes trozos de cdigo? int i, j, total; total = 0; for(i=1 ; i<=10; i++) total = total + 3; cout << total << endl; numero 2 total = 0; for (i=4 ; i<=36 ; i=i+4) total++; ejercicio 3
Programacin I 58 UCENM

total = 0; i = 4; while (i <= 36){ total++; i = i+4; } Encuentre errores en este cdigo: For {x = 100, x>=1, x++} cout << x << endl; 2.3.2.3. CRITERIO DE USO DE BUCLE for nicamente mirando la cabecera de un bucle for sabemos cuantas iteraciones se van a producir. Por eso, en los casos en los que sepamos de antemano cuantas iteraciones necesitamos, usaremos un bucle for. En otro caso, usaremos un bucle while do while. Para mantener dicha finalidad, es necesario respetar la siguiente restriccin: No se debe modificar el valor de la variable controladora, ni el valor final dentro del cuerpo del bucle. Ejemplo. Sumar pares hasta un tope suma = 0; for (par=2; par<=tope ; par++){ if (par%2 == 0) suma = suma+valor; else par++; // :-( }

Escribe los enteros entre inf y sup, hasta llegar al primer mltiplo de 13.

Programacin I

59

UCENM

cin >> inf; cin >> sup; for (entero = inf; entero < sup; entero++) { cout << entero << endl; if (entero % 13 == 0) entero = sup; // :-( } Ejercicio. Haga el ejercicio anterior con un bucle while

2.3.2.4. BUCLES for CON SENTENCIAS VACAS


Qu ocurrira en el siguiente cdigo? for (x = 1; x <= 20; x++); cout << x << endl; A veces s se usan bucles for con sentencias vacas: todo se hace dentro del for. Ejemplo. MCD de dos enteros a y b. if (b<a) menor = b; else menor = a; for (divisor = menor ; (a%divisor!=0) || (b%divisor!=0) ; divisor--) ; MCD = divisor; .

2.3.2.5. EL BUCLE for COMO CICLO CONTROLADO POR


CONDICIN Si bien en muchos lenguajes tales como PASCAL, FORTRAN o BASIC el comportamiento del ciclo for es semejante al descrito en la seccin anterior, existen otros lenguajes (como es el caso de C y C++) donde este tipo de ciclo no es un ciclo controlado por contador, sino que es un ciclo controlado por condicin.
Programacin I 60 UCENM

En el caso concreto de C++, su sintaxis es la siguiente:

donde,

<sentencia inicial> es la sentencia de inicializacin de la variable controladora, <expresion booleana> es cualquier expresin lgica que verifica

si el ciclo debe terminar o no, <sentencia actualizacion> actualiza el valor de la variable controladora despus de cada ejecucin de <cuerpo bucle>.

Por tanto, la condicin impuesta en el ciclo no tiene por que ser de la forma v_c < Vfinal, sino que puede ser cualquier tipo de condicin. Esto implica que se puede construir con una sentencia for un ciclo donde no se conoce a priori el nmero de iteraciones que debe realizar el cuerpo del ciclo. Ejemplo: Construir un programa que indique el nmero de valores que introduce un usuario hasta que se encuentre con un cero. // Programa para contar el numero de valores que se // introducen hasta que se encuentra un cero. // --- Usando un ciclo while --#include <iostream> using namespace std; int main(){ int i, valor;
Programacin I 61 UCENM

cin >> valor; i=0; // inicializacion while (valor !=0){ // condicion cin >> valor; i++; // incremento } cout << "El nmero de valores introducidos es " << i; } Ejemplo // Programa para contar el nmero de valores que se // introducen hasta que se encuentra un cero. // --- Usando un ciclo for --#include <iostream> using namespace std; int main(){ int i, valor; cin >> valor; for (i=0; valor!=0; i++) cin >> valor; cout << "El nmero de valores introducidos es " << i << endl; } REFLEXIN: Cuando usar un ciclo for como ciclo controlado por condicin? Cuando el flujo de control del ciclo sea semejante al de un ciclo controlado por contador Se preserve la norma de buena prctica de programacin de los ciclos for, es decir, sin modificar en el cuerpo del ciclo la variable controladora Resulte ms legible que hacerlo con otro tipo de ciclo. Ejemplo. Escribe los enteros entre inf y sup, hasta llegar al primer mltiplo de 13.
Programacin I 62 UCENM

cin >> inf; cin >> sup; for (entero = inf; (entero<sup) && (entero%13)!=0 ; entero++) cout << entero<< endl;

Ejemplo. Comprobar si un nmero es primo. #include <iostream> #include <cmath> using namespace std; int main(){ int valor, divisor; bool es_primo; cout << "Introduzca un numero natural: "; cin >> valor; es_primo = true; for (divisor = 2 ; divisor < valor ; divisor++) if (valor % divisor == 0) es_primo = false; if (es_primo) cout << valor << " es primo\n"; else cout << valor << " no es primo\n"; } Para hacerlo ms eficiente, nos salimos en cuanto sepamos que no es primo. es_primo = true; for (divisor = 2 ; divisor < valor ; divisor++) if (valor % divisor == 0){
Programacin I 63 UCENM

es_primo = false; divisor = valor; }

// :-((

Nos salimos del bucle con un bool. La misma variable es_primo nos sirve:

for (divisor = 2 ; divisor < valor && es_primo ; divisor++) if (valor % divisor == 0) es_primo = false;
2.3.3. ANIDAMIENTO DE BUCLES
Dos bucles se encuentran anidados, cuando uno de ellos est en el bloque de sentencias del otro. En principio no existe lmite de anidamiento, y la nica restriccin que se debe satisfacer es que deben estar completamente inscritos unos dentro de otros.

Programacin I

64

UCENM

Ejemplo: // Programa que imprime la tabla de multiplicar de // los N primeros nmeros. #include <iostream> using namespace std; int main(){ const int N=3; int i, j; for (i=1 ; i<=N ; i++) { for (j=1 ; j<=N ; j++) cout << i << "*" << j <<"=" << i*j << " "; cout << endl; } } Salida

Qu salida producen los siguientes trozos de cdigo?

iteraciones=0;
for (i=0; i<3; i++) for (j=0; j<3 ; j++) iteraciones++;

Programacin I

65

UCENM

total = 3; for (i=2 ; i<=10 ; i=i+2) for (j=1 ; j<=8 ; j++) total++; cout << total << endl;
Ejemplo. Imprimir en pantalla los divisores primos del entero N Algoritmo: Entradas: N Salidas: ninguna Descripcin: Recorrer todos los enteros menores que N Comprobar si el entero es primo. En dicho caso, comprobar si divide a N Ineficiente. Recorrer todos los enteros menores que N Comprobar si el entero divide a N. En dicho caso, comprobar si el entero es primo. Nota. Mejor an si empezamos desde N/2 for (divisor_N = N/2 ; divisor_N > 1 ; divisor_N--){ if (N % divisor_N == 0){ es_primo = true; tope = sqrt(1.0*divisor_N); for ( divisor_primo = 2 ; divisor_primo <= tope && es_primo ; divisor_primo++){ if (divisor_N % divisor_primo == 0) es_primo = false; } if (es_primo)

Programacin I

66

UCENM

cout << "\nEl primo " << divisor_N << " divide a " << N; } }

Programacin I

67

UCENM

Ejercicios propuestos
1. Determinar cuales de los siguientes son identicadores validos. Si son invalidos explicar por que. a) registro1 b) 1registro c) archivo_3 d) main e) nombre y direccion f) direccion g) diseo 2. Determinar cuales de las siguientes son constantes de cadena de caracteres validas, y determinar la salida que tendra si se pasase como argumento a cout a) "8:15 P.M." b) "'8:15 P.M." c) '"8:15 P.M."' d) "Direccion\n" e) "Direccion'n" f) "Direccion\'n" g) "Direccion\\'n" 3. Reescribir las siguientes expresiones con parentesis, teniendo en cuenta la precedencia de los operadores. a) a+b*c-d b) a * b / c c) a * c % b - d

4. Realizar un programa para intercambiar los contenidos de dos variables enteras. 5. Realizar un programa que declare las variables x, y y z, les asigne los valores 10, 20 y 30 e intercambien entre si sus valores de forma que el valor de x pasa a y, el de y pasa a z y el valor de z pasa a x (se pueden declarar tantas variables adicionales como se desee). 6. Razonar sobre la falsedad o no de las siguientes afirmaciones: a) 'c' es una expresin de caracteres. b) (4+3)<5 es una expresin numrica. c) 4<3 es una expresin numrica. d) cout <<a da como salida la escritura en pantalla de una a. e) >Que realiza cin >>cte, siendo cte una constante entera? 7. Disear un programa que lea un carcter en mayscula, lo pase a minscula y lo imprima en pantalla. 8. Dado un carcter que contiene un valor entre '0' y '9' extraer su valor numrico. Por ejemplo, para '7' queremos obtener el entero 7. 9. Escribir una expresin lgica que sea verdadera si el carcter letra es una letra minscula y falso en otro caso.

Programacin I

68

UCENM

10. Encontrar el valor de la variable Final despus de la ejecucin de este cdigo real1 = 4.0; real2 = 3.0; resultado = real1/real2 - real1*real2; cout << "\nResultado = " << resultado; dependiendo de si las variables reales se declaran como float o como double. 11. Indique que tipo de dato usara para representar: Edad de una persona Producto interior bruto de un pas Ingresos anuales Sexo de una persona Estado civil 12.. El precio final de un automvil para un comprador es la suma total del costo del vehiculo, del porcentaje de ganancia de dicho vendedor y del IMP. Disear un algoritmo para obtener el precio final de un automvil sabiendo que el porcentaje de ganancia de este vendedor es del 20% y el IMP. Aplicable es del 12 %.

Ejercicios de estructura de control repetitivo 1.- Realizar un programa que lea desde teclado un entero final e imprima en pantalla todos sus divisores. Obligad a que el entero ledo sea un positivo. Para obtener los divisores, basta recorrer todos los enteros menores que el valor introducido y comprobar si lo dividen. 2.- Realizar un programa que lea nmeros reales desde teclado y calcule el Mximo de dichos valores. Se dejara de leer datos cuando el usuario introduzca un valor negativo. Realizad la lectura de los reales dentro de un bucle sobre una nica variable llamada dato. 3,- Un banco presenta la siguiente oferta. Si se deposita una cantidad de lempiras C (de Capital) durante un ao a plazo fijo, se dar un inters del I %. Realizad un programa que lea una cantidad C y un

Programacin I

69

UCENM

inters I desde teclado y calcule e imprima el dinero que se tendr al cabo de un ao. Tanto el capital como el inters sern valores reales. Adems el inters se introducir como un valor entre 0 y 1, es decir, un inters del 5% se introducir como 0.05

4.- Supongamos ahora que se quiere reinvertir todo el dinero obtenido (el original C mas los intereses producidos) en otro plazo fijo a un ao. Haga un programa para que lea un numero de aos N, y calcule e imprima todo el dinero obtenido durante cada uno de los N aos, suponiendo que todo lo ganado (incluido el capital original C) se reinvierte a plazo fijo durante el siguiente ano. El programa debe mostrar una salida del tipo: Capital en el ao numero 1 = 240 Capital en el ao numero 2 = 288 Capital en el ao numero 3 = 345.6

Programacin I

70

UCENM

Guia proctica capitulo 1 1. introduccin Esta gua practica esta orientada para que el alumno de educacin a distancia pueda realizarlos en el tiempo que no este con su tutor, de forma autnoma, no necesitando mas que la informacin que se proporciona en ellos, junto con los conocimientos previamente adquiridos tanto en las clases de teora como de practicas, que se llevaran a cabo con el docente encargado de la materia. Su estructura es de la siguiente forma: Seccin se describe la habilidad que el alumno debe adquirir. Dentro de cada seccin se presenta un ejemplo practico que ilustra las tareas necesarias que se necesitan para el aprendizaje de la habilidad. Despus de dicho ejemplo, aparece uno o ms ejercicios para consolidar la habilidad. Estos ejercicios pueden ser de los siguientes o Ejercicios obligatorios: Los alumnos deben realizarlos en la sesin de practicas justo en el momento en el que aparecen en la descripcin de la seccin o Ejercicios optativos: Son ejercicios pensados para aquellos alumnos que, habiendo terminado los ejercicios obligatorios, dispusieran de tiempo restante para seguir haciendo ejercicios. La resolucion de dichos ejercicios puede retrasarse hasta que se complete el guion. Aunque su resolucion no es obligatoria, si que resulta conveniente intentar realizarla en la correspondiente sesion de practicas. o . Ejercicios adicionales: Son ejercicios adicionales para reforzar la habilidad adquirida. No es necesario que se realicen durante la sesion de practicas. Introduccin a Dev-C++ Para la realizacin de estas practicas de la asignatura programacin I, se utilizara el entorno de programacin Dev-C++.

Programacin I

71

UCENM

Dev-C++ es un Entorno de Desarrollo Integrado (IDE) para el lenguaje de Programacin C/C++ que usa Mingw de GCC (GNU Compiler Collection) como compilador y permite crear: o Programas ejecutables para Win32. o Programas ejecutables para consola. o Construccin de DLLs y bibliotecas estticas. o Adems, se puede utilizar en combinacion con otros compiladores basados en GCC.

Dev-C++ es un software de libre distribucion (www.bloodshed.net) sujeto a los trminos de la Licencia Publica General (GPL) de GNU. Vamos a utilizar la versin 5 Beta 9 (4.9.9.2) y sus caractersticas mas relevantes son : o Soporta compiladores basados en GCC, como por ejemplo el Mingw. o Tiene integrado un depurador basado en GDB. o Soporta multiples lenguajes (el castellano es uno de ellos).
Programacin I 72 UCENM

o Mantiene una lista con las clases utilizadas en el desarrollo de un programa. o Tiene ayuda para el autocompletado del cdigo. o Mantiene la lista de funciones definidas en el desarrollo del programa. o Tiene un manejador de proyectos (se usa cuando el programa se compone de mas de un fichero fuente). o Tiene un editor que resalta la sintaxis del cdigo que es configurable. o Soporta plantillas para la creacin de tus propios tipos de proyectos. o Crea Makefiles para la compilacin separada de archivos fuente. o Edita y compila ficheros de recursos. o Soporta la actualizacin del software y bibliotecas a traves de Internet. Instalacin de Dev-C++ Requisitos del sistema Los requerimientos mnimos para ejecutar Dev-C++ son: Microsoft Windows 95, 98, NT 4, 2000, XP 32 MB RAM 100 Mhz Intel compatible CPU 30 MB de espacio libre de disco Los requerimientos aconsejados para Dev-C++ son: Microsoft Windows 2000, XP 64 MB RAM 400 Mhz Intel compatible CPU 200 MB de espacio libre de disco En la pagina www.bloodshed.net/dev/devcpp.html se puede encontrar la ultima versin del entorno de programacin. Una vez conseguido, el fichero de instalacin devcpp-4.9.9.2 setup.exe contiene todo lo necesario para instalar el entorno de programacion Dev-C++ y el compilador de C/C++.

Programacin I

73

UCENM

Ejecutar el programa de instalacin


La instalacin de este software es bastante simple. nicamente hay que acceder al directorio donde se descargo y hacer doble click sobre el fichero devcpp-4.9.9.2 setup.exe. Automticamente, se ejecuta el software de instalacin, ser necesario seguir los siguientes pasos. 1. Seleccionamos el idioma en el que se instalara el programa (Figura 2). 2. Aceptamos la licencia para lo cual pinchamos en Acepto (Figura3). 3. Tomamos la instalacion tipica Full seleccinando Siguiente (Figura 4) 4. Elegimos el directorio donde se desea instalar. Se puede dejar el que viene por defecto seleccionado en Instalar (Figura 5). El software de instalacin copiara los archivos en el directorio elegido y para terminar la instalacin seleccionamos Terminar (Figura 6). 5. Arrancar el entorno por primera vez. Una vez arrancado el entorno por primera vez (Figura 7).

Programacin I

74

UCENM

Programacin I

75

UCENM

Algunas configuraciones posteriores. a) Poner el idioma en Espao. Una de las ventajas de este software es que permite personalizar el entorno de programacin al idioma espaol. Para poner esta configuracion se elige la opcion Tools Environment Options. Tras dicha eleccion aparece la ventana de la Figura (8), donde en el apartado Language debemos elegir la opcion Espaol(Castellano) y pulsar el boton Ok.Esta operacion pondra todos los menus y opciones del entorno en el idioma Espaol. b) Mantener actualizado el entorno. En el caso de disponer en casa de conexin a Internet se puede actualizar el entorno, ya que este software aun esta en fase de desarrollo y con bastante Frecuencia aparecen nuevas modificaciones. Para actualizar el entorno, elegimos la opcion Herramientas Buscar actualizaciones. c) Habilitar depuracin de programas. Herramientas Opciones de Compilador (Figura 9), poner a Yes la opcion Generar informacion de debug.

Programacin I

76

UCENM

Programacin I

77

UCENM

d) Activar las copias de seguridad de los ficheros de programas. Herramientas Opciones de Entorno Principal Crear archivo de respaldo (Figura 10). e) Herramientas Opciones del editor Principal Resaltar llaves y parentesis concordantes Permite ver resaltadas y emparejadas las llaves y los parentesis (Figura 11. f ) Herramientas-Opciones del editor-Visualizacion-numero de linea para ver las lneas de codigo numeradas en una secuencia que aparece a la izquierda de la ventana de texto (Figura 12. g) Para mostrar la sintaxis resaltada (coloreada) y poder detectar algunos errores sintacticos de forma rapida. Herramientas Opciones del editor-Sintaxis-Preconfiguraciones-Classic (Figura 13).

Programacin I

78

UCENM

Programacin I

79

UCENM

Creacin del primer programa


Edicion Para crear un programa nuevo seleccionamosArchivo Nuevo Codigo Fuente (Figura 14) Y a continuacin, escribimos en la ventana de texto el programa a implementar (figura 15)

Programacin I

80

UCENM

Compilacion Despues de escribir y guardar el codigo fuente del programa pasamos a generar un fichero en codigo maquina que permita ejecutar en el computador el algoritmo que hemos construido (Ejecutar -Compilar o bien el metodo abreviado Ctrl+F9, o bien pulsando sobre el icono ). La compilacin tiene asociado tres procesos que se ejecutan de forma secuencial: 1. Se aplican sobre el fichero fuente las modificaciones que indican las directivas de precompilacion indicadas en cdigo fuente inicial. 2. Ese cdigo fuente modificada se traduce a un lenguaje Intermedio conocido como cdigo objeto. Este cdigo objeto es Prcticamente el cdigo maquina de nuestro cdigo fuente a falta de incluir el cdigo maquina de las funciones que se han Utilizado. Para que el proceso de compilacin se realice de forma correcta y se obtenga el cdigo objeto, es necesario que el codigo fuente no contenga errores sintcticos. Si aparecen errores, es necesario volver a la fase de edicin, guardar de nuevo el cdigo fuente y repetir la fase de compilacin. 3. A partir del cdigo objeto, se genera un fichero ejecutable mediante el proceso de enlazado. Esta ultima fase, completa el cdigo objeto aadiendo los trozos de cdigo maquina que quedan pendientes de resolver. El fichero ejecutable tiene el mismo nombre que el nombre del fichero fuente, pero cambiando su extensin por .exe. Como resultado de la fase de compilacin, en la pestaa Resultado de la compilacin debe aparecer algo como lo que muestra la Figura16 Esto indica que hemos conseguido generar un fichero ejecutable que se llamara igual que nuestro fichero pero sustituyendo la extensin cpp por exe.

Programacin I

81

UCENM

Figura 16 programa con errores y sin errores

Prueba del programa


Uno podra pensar que una vez que consigo un fichero ejecutable a partir de mi cdigo fuente, el problema esta terminado. Sin embargo esto no es as. Tras el proceso de compilado se requiere una fase de prueba. Dicha fase intenta probar que el algoritmo planteado resuelve el problema propuesto. Para llevar a cabo esta fase, es necesario ejecutar el programa y verificar que los resultados que obtiene son los esperados. Para ejecutar un programa que hemos compilado basta con pulsar el icono o con el mtodo abreviado Ctrl+F10 o bien con la opcin de men Ejecutar+Ejecutar. La ejecucin del programa se realizara en una ventana de MS-DOS Emergente como la mostrada en la Figura 17

La

Programacin I

82

UCENM

ejecucin del programa se detendr en aquellos puntos del mismo donde se requiera la interaccin del usuario para poder proseguir, es decir, en las operaciones de entrada de datos a travs del dispositivo estndar de entrada. Una vez que el algoritmo supera la fase de prueba, podemos considerar que se ha concluido con la fase inicial del desarrollo del software, pero donde se encuentra el fichero ejecutable? Por defecto, el fichero ejecutable se crea en el mismo directorio donde se almaceno el fichero fuente. Para mostrar que el fichero generado es independiente del entorno de programacin, hacemos lo siguiente: Introduccin a la correccin de errores Si ya instalo su compilador devxxxx, introduzca el cdigo siguiente

/* Calculo los divisores de un nmero entero positivo >0 */ #include <iostream> using namespace std; int main(){ int numero, divisor // Entrada de datos do{ cout << "Introduce un numero entero positivo mayor que 0: "; cin >> numero; }while (numero<=0); // Fase de clculo for (divisor=1; divisor<=numero; divisor++) if (numero%divisor==0) cout << divisor << " es un divisor de " << numero << endl; /* para deter la ejecucin */ cout << "Pulsa una tecla y RETURN para continuar\n"; cin >> divisor; }
Programacin I 83 UCENM

1.- Que contiene el cdigo fuente necesario para calcular los divisores de un numero entero positivo mayor que 0. 2. Ejecutar el entorno de DevC++ . 3. Compilar el cdigo fuente (Ctrl+F9). Podemos observar que la compilacin no se ha realizado con xito tal y como muestra la Figura 19. Cuando esto sucede en la parte inferior de la ventana principal aparece activada la pestaa Compilador. En ella aparece una tabla con tres columnas: lnea, unidad, mensaje. La primera de ellas indica la lnea donde el compilador detecto el error sobre el archivo fuente. Este dato se debe interpretar como que el error se encuentra en esta lnea o en alguna de las lneas anteriores a esta. Archivo o Unidad indica la ubicacin del archivo en la unidad de almacenamiento. El mensaje indica el tipo de error detectado por el compilador. Normalmente, aparece una fila dentro de esta ventana que no tiene asociado numero de lnea. Esta fila da informacin sobre la funcin en la que se produjo el error. En el caso anterior, podemos leer: In function int main(): que debemos interpretar como que el error o errores que se detallan a continuacin estn localizados en el programa principal. Los pasos que debemos seguir para la correccin son los siguientes:

Programacin I

84

UCENM

1. Ir a la primera fila de la ventana que tiene asociado un numero De lnea. 2. Leer el mensaje de error e intentar entenderlo. 3. Hacer doble click sobre esa fila con el ratn. Esto nos posiciona sobre la lnea en el fichero fuente donde el compilador detecto el error. 4. Comprobar la sintaxis de la sentencia que aparece en esa lnea. Si se detecta el error, corregirlo. Si no se detecta el error mirar en La lnea anterior, comprobar la sintaxis y repetir el proceso hasta Encontrar el error. 5. Despus de corregir el posible error, guardamos de nuevo el Archivo y volvemos a compilar. Esto lo hacemos aunque Aparezcan ms errores en la ventana. La razn es que es Posible que el resto de los errores sean consecuencia del primer error. 6. Si despus de corregir el error aparecen nuevos errores, volver a Repetir el proceso desde el paso 1.

Programacin I

85

UCENM

7. Ahora, aplicaremos este proceso a nuestro ejemplo, as que nos vamos a la primera fila que contiene numero de lnea (Figura 20) El error que nos aparece suele ser el mas comn, es un error sintctico y se debe a que el compilador se ha encontrado con un token (la palabrareservada do en este caso) que no es el tipo de token que esperaba. Este tipo de errores los debemos interpretar como que nos hemos equivocado en la sintaxis de una sentencia anterior a donde dice que esta el error. Hacemos doble click sobre esta fila, y el cursor se posiciona sobre la lnea indicada en el editor. En nuestro caso, se sita sobre la sentencia que aparece remarcada en rojo en la Figura 19 en la que no parece haber ningn error. As que miramos la lnea anterior. En ella encontramos un comentario que podemos observar que esta bien construido; por consiguiente, el error tampoco se encuentra en esta lnea. En la lnea anterior al comentario hay una lnea vaca. Aqu tampoco esta el error, as que tenemos que seguir con la anterior. En dicha lnea nos encontramos la siguiente sentencia: int numero, divisor Es una sentencia de declaracin de variables en la que podemos observar que no esta correcta, ya que le falta el punto y coma que indica el final de la sentencia. Una vez detectado el error, lo corregimos aadiendo el punto y coma que falta, guardamos el fichero y volvemos a compilar. Podemos observar que la nueva compilacin es exitosa y no se ha encontrado ningn error. Ejecutamos el programa y probamos que funciona correctamente.

/*

Programacin I

86

UCENM

Este programa calcula la descomposicin en nmero primos de un numero positivo mayor que 0*/ #include <iostream> #include <conio.h> using namespace std; int main(){ int numero, i, elevado=0; // Entrada de datos do{ cout << "Introduce un numero entero mayor que 0: "; cin >> numero; }while (numero<=0);

i=2; while (numero>1){ if (numero%i==0){ numero = numero/i; elevado++; } else { if (elevado!=0) cout << i << " elevado a " << elevado << endl; elevado=0; i++; } } cout << i << " elevado a " << elevado << endl; // detener la ejecucin cout << "Pulsa una tecla para acabar\n"; getch();

}
Programacin I 87 UCENM

Para familiarizarnos con los errores mas frecuentes y su correccin Vamos a realizar el siguiente proceso: a partir de un cdigo fuente que compila perfectamente iremos introduciendo deliberadamente errores para conocer que mensajes nos aparecen. Digite el programa que calcula la descomposicin en nmeros primos 1.- Introducir el error que se indica en la lista que aparece mas adelante. 2. Guardamos el fichero. 3. Compilamos el cdigo modificado con la introduccin del error. 4. Miramos el error y lo anotamos en la tabla. 5. Corregir el error y pasar a introducir el siguiente error de la lista. La lista de errores que introduciremos son los siguientes: 1. Falta el fichero de cabecera de alguna biblioteca donde se encuentra definida alguna funcin utilizada en el programa. Accin: Convertimos en un comentario la primera lnea del programa aadiendo dos barras invertidas antes de la sentencia, es decir, dejndola como: // #include <conio.h> 2. El mismo error anterior, pero esta vez comentando el fichero de cabecera iostream. Accion: Convertimos en comentario: // #include <iostream> 3. Nos equivocamos al introducir el nombre del fichero de cabecera. Accion: Poner en lugar de iostream, el nombre iotream. 4. Se nos olvida los parntesis de la funcin principal. Accin: Borrar los dos parntesis de la declaracin de la funcin main, de manera que quede de la siguiente forma: int main { 5. Introducimos un identificador incorrecto. Accin: En la definicin de variables cambiar el nombre a la variable nmero por el identificador 1numero.
Programacin I 88 UCENM

6. Se nos olvida una de las dobles comillas en una constante de cadena de caracteres. Accin: Quitar las dobles comillas finales de la sentencia: cout << "Introduce un numero mayor que 0; 7. Se nos olvida cerrar alguna de las llaves que definen el cuerpo de Un ciclo o una estructura condicional. Accin: Borrar la llave que se encuentra antes del else. 8. Usar una variable no declarada. Accin: Borrar en la declaracin de variables el identificador numero. 9. Cambiamos de sentido las dobles puntas de flecha en un cout Accin: Cambiamos las dobles puntas de flecha del primer cout, es decir, cout >> "Introduce un numero entero mayor que 0: "; Ahora proponemos algunos algunos ejercicios para afianzar los conocimientos Ejercicio numero 1 Copie o corrija el siguiente programa o algoritmo. Guardelo en su directorio personal. #include <iostream> using namespace std; int main{ char l; int ca=0, ce=0, ci=0, co=0, cu=0, cd=0, 1n, i do{ cout << "Introduce el numero de caracteres que se van a leer: "; cin >> n; }while (n<=0) for (i=0; i<n, i++) { cout << endl <<"Introduce el carcter " << i << ": "; cin >>l; switch(l) {
Programacin I 89 UCENM

case 'a': case 'A': ca++; break; case 'e': case 'E': ce++; break; case 'i': case 'I': ci++; break; case 'o': case 'O': co++; break; case 'u': case 'U': cu++; break; default: cd++; break; } } cout <<endl << " La vocal \"a\" ha salido : " << ca; << " veces"; cout <<endl << " La vocal \"e\" ha salido : " << ce; << " veces"; cout <<endl << " La vocal \"i\" ha salido : " << ci; << " veces"; cout <<endl << " La vocal \"o\" ha salido : " << co; << " veces"; cout <<endl << " La vocal \"u\" ha salido : " << cu; << " veces"; cout <<endl << " Ha habido : " << cd << " caracteres que no eran vocales"<<endl; system("pause"); }

Los errores en la fase de ejecucin En esta parte abordaremos el tema de la correccin de errores en tiempo de ejecucin, tarea que normalmente se conoce como

Programacin I

90

UCENM

Depuracin. Un depurador de programas (debugger en ingles) permite ir ejecutando un programa sentencia a sentencia (ejecucion paso a paso). Adems, nos permite ver en cualquier momento el valor de las variables usadas por el programa. El uso de un depurador facilita la localizacin de errores lgicos en nuestros programas, que de otra forma resultaran bastante difciles de localizar directamente en el cdigo. Esta seccin esta dedicada a aprender el funcionamiento de un depurador de programas. En particular, usaremos el depurador gdb que esta integrado en el entorno Dev-C++. Para aprender las principales utilidades que tiene el depurador de programas del Dev-C++, vamos a depurar una versin del programa polinomio.cpp Una vez abierto el fichero con el Dev-C++, lo compilaremos. Antes de compilar, debemos asegurarnos que esta seleccionada la opcin Generar Informacin de Debug en el Dev-C++ (Menu Herramientas Opciones del Compilador -Linker, ver Figura 9), para que as se aada al fichero ejecutable, cierta informacin que luego necesita usar el depurador de programas. Ejecuta el programa polinomio.cpp, probando todas las opciones, y con diferentes nmeros. Comprueba que el programa da resultados correctos. /* Programa para la gestin de polinomios de segundo grado */ #include <iosteam> #include <cmath> using namespace std; int main() { double a, b, c, x1, x2, rad; char opcion; int i; bool haypol=false, terminar=false; do {
Programacin I 91 UCENM

/* Menu principal */ do { // ciclo para pintar una lnea de asteriscos for (i=1; i<56;i++) cout << "*"; cout << endl; cout << "* Men Principal // ciclo para pintar una lnea de asteriscos for (i=1; i<56;i++) cout << "*"; cout << endl;

*\n";

// Opciones del programa if haypol cout << "El polinomion existente es: " << a << "x2+" << b << "x+" << c << endl; else cout << "An no se ha introducido ningn polinomio" << endl; cout << "Introduce la opcin deseada:" << endl; cout <<"\t 1. Leer Coeficientes\n"; cout <<"\t 2. Encontrar raices\n"; cout <<"\t 3. Salir\n"; cout <<"\n\t\t Elige opcion: "; cin >> opcion; }while (opcion<'1' || opcion>'3'); switch(opcion) { case '1': cout << "Introduce el coeficiente \"a\": "; cin >> a; cout << "Introduce el coeficiente \"b\": "; cin >> b; cout << "Introduce el coeficiente \"c\": "; cin << c; haypol=true; break; case '2': if (haypol) { rad=pow(b,2)-4*a*c; if (rad >= 0) {
Programacin I 92 UCENM

x1=(-b+sqrt(pow(b,2)-4*a*c))/(2*a); x2=(-b-sqrt(pow(b,2)-4*a*c))/(2*a); cout << " Primera Raiz: " << x1 << endl; cout << " Segunda Raiz: " << x2 << endl; else cerr << "Races complejas. No es posible hacer el clculo" << endl; } else cerr << "An no se ha introducido ningn polinomio" << endl; break; case '3': terminar=true; break; } }while (terminar==false); // Esta condicin se podra poner tambin como while (!terminar) } Para comenzar la depuracin colocaremos el cursor sobre la sentencia de la lnea 29 if (haypol) y pulsaremos Ctrl+F5. Veremos que la instruccin queda marcada en rojo y pulsamos la Pestaa inferior de depuracin ( ) para abrir la ventana de controles del depurador (Figura 21). Lo que hemos hecho es pedirle al depurador que detenga la ejecucion del programa en este punto (esto se conoce como un punto de ruptura o breakpoint

Programacin I

93

UCENM

A continuacin le pediremos al depurador que empiece a ejecutar nuestro programa pulsando sobre el botn . Esto provocara que el programa empiece a ejecutarse, mostrando la lnea que se va a ejecutar a continuacin remarcada en azul (Figura 22) mostrando la ventana de ejecucin del programa (Figura 23).

Control de la depuracin A partir de ahora podremos realizar una serie de acciones mediante las cuales podremos examinar el contenido de variables, ejecutar el programa paso a paso o bien dejar que continen la ejecucin hasta el final. Los botones asociados a estas acciones para el control de la ejecucin del depurador son las siguientes: Siguiente Paso: Ejecuta la siguiente instruccin del programa (aquella que aparece resaltada en color azul). Tambin podramos haberlo hecho con el botn Avanzar Paso a paso Saltar Paso: Ejecuta instrucciones hasta el siguiente punto de ruptura o hasta el final del programa en caso de que no haya ninguno mas. Ir a cursor: Ejecuta sentencias hasta el lugar donde se sita el cursor. Se puede aplicar al comenzar la depuracin para saltar determinadas sentencias que no queremos revisar. Al usarlo tras el comienzo de la depuracin, simplemente introduce un punto de ruptura, tal y como hemos hecho anterioremente. Despus podramos avanzar usando Saltar Paso para alcanzar este punto, el cual dejar a de ser punto de ruptura.

Programacin I

94

UCENM

Parar ejecucin: Cuando deseemos terminar el programa en el punto actual, sin llegar al final del programa podemos escoger esta opcin

Figura 23: El programa se esta ejecutando en esta ventana, pero se encuentra interrumpido, a punto de ejecutar la sentencia que aparece remarcada en azul (Figura 22)

Programacin I

95

UCENM

Bibliografa

1. Garrido, A., Fundamentos de Programacin en C++. Delta Publicaciones, 2005. 2. Savitch, W., Resolucin de problemas en C++, 2a Edicin, Prentice Hall. Mayo, 2000.

3. jayanes, luis fundamentos de programacion libro de problemas mc graw hill . 4. varios autores en la web

Programacin I

96

UCENM

Você também pode gostar