Buscar en el Blog

lunes, 17 de febrero de 2014

Programacion C++ - Relaci on de Ejercicios y Soluciones II




Tema 1: Almacenamiento en Memoria Secundaria. Ficheros 2
Tema 2: Tipos Abstractos de Datos 15
Tema 2.1: Programacion Modular . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
Tema 2.2: Tipos Abstractos de Datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
Tema 2.3: Tipos Abstractos de Datos Gen ericos . . . . . . . . . . . . . . . . . . . . . . . . 49
Tema 3: Gesti on de Memoria Din amica 74
Tema 3.1: Listas Enlazadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
Tema 3.2: Abstracci on en la Gesti on de Memoria Din amica . . . . . . . . . . . . . . . . . 93
Tema 3.3: Genericidad en la Gesti on de Memoria Din amica . . . . . . . . . . . . . . . . . 136
Tema 4: Colecciones 147
Pr acticas de Laboratorio 162
Pr actica 1: Almacenamiento Persistente de Datos . . . . . . . . . . . . . . . . . . . . . . . 162
Pr actica 2: Tipos Abstractos de Datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
Pr actica 3: Tipos Abstractos de Datos Gen ericos . . . . . . . . . . . . . . . . . . . . . . . 181
Pr actica 4: Gesti on de Memoria Din amica . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
Pr actica 5: Abstracci on en la Gesti on de Memoria Din amica . . . . . . . . . . . . . . . . . 200
Pr actica 6: Biblioteca Est andar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
Problemas de Examen 214
Examen 1: Gesti on de Agencia de Viajes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
Examen 2: Juego de Ajedrez . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
Examen 3: Gesti on de Hotel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231





Escribir un programa con la opci on de encriptar y de desencriptar un chero de texto, dependiendo de la
extensi on del chero de entrada. La encriptaci on (codi caci on) consiste en que dado un chero de texto
de entrada (extensi on txt) genere otro chero de salida encriptado (extensi on cod). Esta codi caci on
consiste reemplazar cada letra por la tercera siguiente de forma circular (ej. a!d, b!e, , w!z, x!a,
y!b, z!c). La opci on de desencriptado consiste en leer un chero codi cado (extensi on cod) y recuperar
la informaci on original en un chero de texto (extensi on txt).


Soluci on
#include <iostream>
#include <fstream>
using namespace std;
const unsigned DESPL = 3;
enum Operacion {
CIFRAR, DESCIFRAR, ERROR
};
// cifrado rotacional (DESPL) de letra
char cifrar(char c)
{
if (c >= 'a' && c <= 'z') {
c = char(c + DESPL);
if (c > 'z') {
c = char('a' + c - 'z' - 1);
}
} else if (c >= 'A' && c <= 'Z') {
c = char(c + DESPL);
if (c > 'Z') {
c = char('A' + c - 'Z' - 1);
}
}
return c;
}
// descifrado rotacional (DESPL) de letra
char descifrar(char c)
{
if (c >= 'a' && c <= 'z') {
c = char(c - DESPL);
if (c < 'a') {
c = char('z' + c - 'a' + 1);
}
} else if (c >= 'A' && c <= 'Z') {
c = char(c - DESPL);
if (c < 'A') {
c = char('Z' + c - 'A' + 1);
}
}
return c;
}
// transforma una letra segun el codigo de operacion
char transformar(char c, Operacion op)
{
char res;
if (op == CIFRAR) {

res = cifrar(c);
} else {
res = descifrar(c);
}
return res;
}
// trasnforma el fichero de entrada y lo escribe en el fichero de salida
void transformar_fichero(const string& entrada, const string& salida,
Operacion op, bool& ok)
{
ifstream f_ent;
f_ent.open(entrada.c_str());
if (f_ent.fail()) {
ok = false;
} else {
ofstream f_sal;
f_sal.open(salida.c_str());
if (f_sal.fail()) {
ok = false;
} else {
char ch;
f_ent.get(ch);
while (! f_ent.fail() && ! f_sal.fail()) {
f_sal.put(transformar(ch, op));
f_ent.get(ch);
}
ok = (f_ent.eof() && ! f_sal.fail());
f_sal.close();
}
f_ent.close();
}
}
// busca un caracter e una cadena
unsigned buscar(const string& nombre, char c)
{
unsigned i = 0;
while ((i < nombre.size())&&(c != nombre[i])) {
++i;
}
return i;
}
// devuelve la extension del nombre de fichero
string extension(const string& nombre)
{
string res = "";
unsigned i = buscar(nombre, '.');
if (i < nombre.size()) {
res = nombre.substr(i+1, nombre.size()-(i+1));
}
return res;
}
// calcula la operacion a realizar a partir de las extensiones de los
// ficheros de entrada y salida
Operacion codigo_op(const string& entrada, const string& salida)
{
Operacion res;
if ((extension(entrada)=="txt")&&(extension(salida)=="cod")) {
res = CIFRAR;
} else if ((extension(entrada)=="cod")&&(extension(salida)=="txt")) {
res = DESCIFRAR;
} else {
res = ERROR;
}
return res;
}
int main()
{
bool ok;
cout << "Introduzca el nombre del fichero de entrada: ";

string nombre_ent;
cin >> nombre_ent;
cout << "Introduzca el nombre del fichero de salida: ";
string nombre_sal;
cin >> nombre_sal;
Operacion op = codigo_op(nombre_ent, nombre_sal);
if (op != ERROR) {
transformar_fichero(nombre_ent, nombre_sal, op, ok);
if (ok) {
cout << "Procesamiento correcto" << endl;
} else {
cout << "Error al procesar el fichero" << endl;
}
} else {
cout << "Error: extensiones erroneas" << endl;
}
}





No hay comentarios:

Publicar un comentario