Prácticas de C++ Practica Nº 1 Informática II Fundamentos de Programación Prof. Dr. Paul Bustamante
Prácticas de Programación en C++ Pág. 1 ÍNDICE ÍNDICE... 1 1. Introducción... 1 1.1 Ejercicio 1: Cálculo de la letra del NIF a través del DNI... 1 1.2 Ejercicio 2: Mejorando el programa anterior... 2 1.3 Ejercicio 3: Encriptación V1.1... 2 1.4 Ejercicio 4: Detección de errores: CheckSum... 3 1.5 Ejercicio 5: MiniCalculadora v1.0... 4 1.6 Ejercicio 6: MiniCalculadora v1.1... 5 1. Introducción. Comienza Informática II y Fundamentos de Programación, y comienza con algunos ejemplos sencillos, de repaso, referidos a la programación en C++, que nos ayuden a recordar los conceptos básicos vistos en Informática I y Fundamentos de Computadores I. No es importante que hagan todos los ejercicios durante la práctica, sino que entiendan muy bien cómo y por qué se hacen las cosas. Es preferible que entiendan muy bien un programa a que hayan acabado todo sin haberse enterado de nada. Los primeros ejercicios servirán para familiarizarse con el modo de programar y para que vayan entendiendo las cosas. Les animamos a que intenten hacer uds. mismos modificaciones y variaciones, incluso hay veces que un mismo problema puede resolverse de varias maneras diferentes que son igualmente correctas. Para realizar los Ejercicios de esta práctica debe apoyarse en el entorno de programación de Visual C++ 6.0, recordando de utilizar siempre el Debugger. Para cada Ejercicio deberá crear un Proyecto en un subdirectorio especial. Todos estos subdirectorios estarán dentro de un directorio de su disco G:\. 1.1 Ejercicio 1: Cálculo de la letra del NIF a través del DNI Para que su introducción en esta asignatura de Programación en C++ sea todo un éxito, le hemos preparado un sencillo programa de bienvenida. Este consiste en calcular la letra que va al final del DNI. Como ya sabéis, esta letra se calcula de acuerdo a un algoritmo, el cual es muy sencillo. Esto permite que nadie se invente un número de DNI y una letra no válida. Sin más preámbulos, a continuación se muestra el programa que realiza esta tarea. // Calculo de la Letra del DNI #include <string.h> #include <stdlib.h> char DNI[20]; char letras[] = "TRWAGMYFPDXBNJZSQVHLCKE"; int len=0; while(len!=8) cout << "Dar el número del DNI(XX - Salir):"; cin >> DNI; if ( strcmp(dni,"xx") == 0) return; //fin len = strlen(dni);
Prácticas de Programación en C++ Pág. 2 if (len < 8) cout << "\a"; //algoritmo para calcular la letra int num=atoi(dni); int pos=num%23; char let = letras[pos]; cout << "El DNI es: " << DNI <<"-"<<let << endl; cout << "Adios...\n"; /* fin de main() */ Deberá copiar este programa en el editor del Visual C++, compilarlo y ejecutarlo para comprobar su funcionamiento. El nombre del proyecto será Ejer1 y el del programa será Ejer1.cpp. Para compilar y linkar el programa debe utilizar el menú Build y las opciones Compile File (para compilar), Build (para linkar) y Execute (para ejecutar). Cada opción comprende las anteriores, esto es, si se quiere ejecutar y no se ha compilado y linkado, se realizan primero estas operaciones. Si ha olvidado cómo se crea un proyecto en C++, recurra a la documentación del entorno que se le dio en clase. 1.2 Ejercicio 2: Mejorando el programa anterior Seguro que el programa del ejercicio anterior le ha dejado con ganas de continuar programando. Pues sigamos adelante.. En este nuevo ejercicio, que realizará Ud. solo, debe lograr dos cosas: Que permita recibir por la línea de argumentos el DNI y haga el cálculo de la Letra correspondiente, de tal forma que el programa se pueda ejecutar de la siguiente manera: Ejer2 87645327 Que el programa pida un número de DNI con la letra incluida (o el NIF) y que haga el cálculo y diga si ese número es correcto o no. Para este ejercicio debe crear un proyecto llamado Ejer02, en el cual debe escribir el código correspondiente. 1.3 Ejercicio 3: Encriptación V1.1. Después de estos dos ejercicios, vamos a profundizar un poco más en los algoritmos matemáticos con C++. Como Ud. ya sabe, la Encriptación es una medida de seguridad utilizada para que al momento de almacenar y/o transmitir información sensible, ésta no pueda ser obtenida con facilidad por terceros. La encriptación hace uso de diversas fórmulas matemáticas, con el propósito de transformar el texto en algo ilegible. Después existe el proceso de Desencriptación, que permite obtener el texto nuevamente. En este ejercicio vamos a realizar un programa (versión 1.1), que para encriptar primero rota los bits del carácter y luego le hace una operación lógica XOR. Para desencriptar se hace el proceso contrario. Escriba el programa y sálvelo como Encriptar.cpp. // Encriptación de Datos
Prácticas de Programación en C++ Pág. 3 #include <iomanip.h> #include <string.h> //para strlen() int len; const int NUM=120; //num. maximo de caracteres. unsigned char texto[num],key; cout << "Escriba un texto:"; cin.getline(texto,120); cout << "Introduzca la clave para codificar (un digito):"; cin >> key; len=strlen((char*)texto); cout << "\t*** texto Codificado ***\n"; for (int i=0;i<len;i++) texto[i] = (texto[i] >> i%8) (texto[i]<<(8-i%8));//rot a la der texto[i] = texto[i] ^ key; //XOR cout << texto << endl; cout.fill('*'); cout << setw(50) << " Transmitiendo texto "; cout << setw(30) << " "<<endl; cout << "\t*** texto DeCodificado ***\n"; for (i=0;i<len;i++) texto[i] = texto[i] ^ key; texto[i] = (texto[i] << i%8) (texto[i]>>(8-i%8));//rot a la izq. cout << texto << endl << endl; 1.4 Ejercicio 4: Detección de errores: CheckSum. En comunicaciones de datos, por ejemplo envío de ficheros, se debe verificar que la transmisión ha sido correcta, para lo cual se utilizan diversas técnicas de detección de errores, donde el algoritmo más sencillo de implementar es el CheckSum, el cual también se envía al final de la transmisión de dichos datos. El checksum consiste en ir sumando los valores de los bytes a enviar, e ir almacenando el valor resultante en un byte. El resultado se comprueba con el valor enviado, y si los datos son iguales, la transmisión ha sido correcta, caso contrario hay error en la transmisión. A continuación tenemos el código: // Cálculo del CheckSum #include <iomanip.h> #include <string.h> #include <stdlib.h> #define NUM 5 char array[num+1]; int dat; int num=0; //uno para el checksum
Prácticas de Programación en C++ Pág. 4 char chk=0; for (int i=0;i<num;i++) cout << "Dato["<<i<<"]:?"; cin >> dat; //directamente no se puede poner array[i] array[i] = dat; chk += array[i]; //calcula el checksum array[num] = chk; //transmitir datos for ( i=0;i<num+1;i++) //SendData( array[i] ); //transmision dat = array[i] & 0xFF; cout << setw(3) << hex << dat; cout << "\nel Byte de Checksum es: " << (int)(array[num]&0xff); cout << "\nadios..."<<endl; Para comprender bien el funcionamiento del programa, debe ir ejecutándolo paso a paso con el debugger e ir viendo los valores en el array array[i] y en la variable chk. Debe crear un proyecto Ejer4 y al nombre del fichero fuente llámele checksum.cpp. 1.5 Ejercicio 5: MiniCalculadora v1.0 Este ejercicio consiste en hacer un programa que permita realizar las 4 operaciones básicas: Suma, Resta, Multiplicación y División. Este programa tendrá un funcionamiento similar a Matlab, es decir que la operación se dará completa, por ejemplo: >>5.5*15.6 y luego Enter. El resultado aparecerá en la consola y estará listo para escribir otra operación. El programa finaliza con la letra E. A continuación se da el código. Recuerde que no solo basta con escribir el código, hay que entenderlo: // MiniCalculadora Version 1.0 #include <string.h> #include <math.h> char str[30]; bool ope=false; char op1[20],op2[20]; int cont=0; char chope; //operador double dop1=0,dop2=0, val; while(true) cout << ">>"; cin.getline(str,30); if (str[0]=='e') break; ope=false; cont=0; for (int i=0;i<strlen(str);i++) if (str[i]=='+' str[i]=='-' str[i]=='*' str[i]=='/') ope=true;
Prácticas de Programación en C++ Pág. 5 op1[cont]=0; cont=0; chope=str[i]; else if (!ope) op1[cont++]=str[i]; else op2[cont++]=str[i]; op2[cont]=0; dop1=atof(op1); dop2=atof(op2); switch(chope) case '+': val = dop1 + dop2; break; case '-': val = dop1 - dop2; break; case '*': val = dop1 * dop2; break; case '/': val = dop1 / dop2; break; default: val=0; //fin de cadena op1 //para segundo contador //almacena qué operador es cout << "\tans = " << val << endl; cout << "Fin de la MiniCalculadora" << endl; 1.6 Ejercicio 6: MiniCalculadora v1.1 En este ejercicio haremos la versión 1.1 de la MiniCalculadora, agregando lo siguiente: Agregar el operador % para hallar el resto de una división de ENTEROS. El resultado de una operación anterior sea almacenado en una variable (por ejemplo a ), de tal forma que pueda hacer una nueva operación con esa variable. Véase el ejemplo: 3.5*10 ( Mostrar resultado (35) y almacenar internamente en variable a ) a/7 ( Mostrar resultado, que será igual a 5) La variable puede usarse en cualquier operando, ya sea el de la derecha como en el de la izquierda. Notas: - No olvide poner siempre ; al final de cada sentencia. - No olvide cerrar las comillas, los paréntesis y las llaves. - No olvide declarar las variables, antes de usarlas. - Por último, recuerde que C++ distingue de minúsculas y mayúsculas.