Tixtix Practica3
Tixtix Practica3
PRÁCTICA NO. 3
OTRAS OPERACIONES CON
CADENAS Y LENGUAJES
UNIDAD DE APRENDIZAJE: TEORIA DE LA COMPUTACIÓN
GRUPO: 4CM1
EQUIPO: tixtix
INTEGRANTES:
ALVAREZ CAMPOS SAUL MIGUEL
MEDINA ANGELES ANA CRISTINA
MORALES MARTÍNEZ JOSÉ ANTONIO
PROFESORA: SANCHEZ GARCIA LUZ MARIA
FECHA: 11 DE MAYO DE 2023
OBJETIVO
Realizar un programa en lenguaje C que dado un alfabeto Σ={0,1}, realice
operaciones con cadenas.
PLANTEAMIENTO DEL PROBLEMA
El problema que resolveremos en esta práctica es realizar de forma correcta las
operaciones con cadenas siguientes: calcular la longitud de una cadena, igualdad
de cadenas, palíndromo, reemplazo de cadenas, quitar espacios en blanco,
complemento a 1 y la búsqueda de una cadena dentro de otra, todo esto a través
de un menú de opciones en un programa.
Para el desarrollo de esta, se tiene en cuenta la definición de un alfabeto, de
cadenas o también llamadas palabras, lenguajes, así mismo como el concepto y
propiedades de las operaciones a realizar mencionadas anteriormente. Para la
implementación de cada operación utilizaremos el lenguaje c++ y el uso de
funciones.
Finalmente se podrá observar las características, consideraciones y propiedades de
las operaciones con cadenas sobre un alfabeto binario.
ACTIVIDADES
1. Programar en ANSI C, cada una de las siguientes operaciones:
• Calcular la longitud de cadenas
• Igualdad de cadenas
• Palíndromo
• Reemplazo de cadenas
• Quitar espacios en blanco
• Complemento a 1 (Ej. 100 -> 011)
• Búsqueda de una cadena dentro de otra
2. El programa deberá ser capaz de recibir al menos dos cadenas binarias sobre
Σ={0,1} para realizar cada una de las operaciones. Cadenas que no sean
binarias, serán rechazadas.
3. Usar un menú de opciones para que el usuario elija el tipo de operación a realizar,
el cual debe iterar hasta que el usuario desee abandonar el programa.
4. Mostrar la salida en pantalla de cada uno de los resultados de las operaciones
con cadenas.
5. Finalmente responda a las siguientes preguntas
a) ¿Cuál de las operaciones es más utilizada?
La operación más utilizada es la longitud de la cadena, debido a que sirve de
base para implementar las demás funciones. Es tan importante que en todos
los lenguajes de programación que soportan el tipo string tienen un método
que regresa la longitud de cadena.
b) ¿Cuál de las operaciones tiene menor utilidad?
La operación de palíndromo a nuestra consideración la menos irrelevante,
esto se debe a que al menos de que el usuario a conciencia introduzca un
palíndromo, difícilmente se suele presentar un palíndromo en las cadenas.
c) ¿Qué problemas se presentaron al programar las operaciones?
Al validar la cadena se presentó el problema, debido a que olvidamos
considerar que para este programa el usuario podía ser capaz de introducir
cadenas con espacios. Al agregar la validación solo consideramos el carácter
(“ ”) , no consideramos que un espacio también puede ser un tabulador, por
ello más delante de nueva forma tuvimos problemas.
Otro problema es que durante la implementación de la operación de
búsqueda, optamos por prescindir del método find(), y programar el algoritmo
de búsqueda, la primera aproximación para la solución fue equiparar de
forma simultánea ambas cadenas y en caso de que el índice de la cadena a
comparar fuera igual a su magnitud, entonces esa cadena si se encontraba
dentro de la otra. No obstante, hubo casos de prueba en los cuales no debía
de estar dentro de la cadena.
d) De los errores detectados, ¿se pudieron resolver? ¿cuáles si y cuáles no?
Si se lograron resolver, tuvimos que investigar en la documentación de c++,
y existe un método que se conoce como: “isspace()”. Este método nos
regresa true en caso de que sea un espacio o false de lo contrario. La bondad
de este método es que no solo considera el spc, sino que también tab y el
retorno de carro.
Respecto al otro problema, al final se replanteó el algoritmo de solución, y se
baso en la idea de las subcadenas de la práctica pasada, en el cual consistía
en dejar un índice fijo de la cadena de referencia e ir comparando con la
subcadena que se forma, de forma contigua, en caso de que un carácter no
coincidiese se corta el for y no coincide el índice de la cadena a comparar
con su tamaño.
e) ¿Qué recomendaciones daría de otras operaciones con cadenas?
Una operación interesante sería encontrar la subcadena común más larga,
otra opción sería encontrar las subcadenas comunes entre 2 cadenas.
PRUEBAS
Cadena rechazada
Cadenas aceptadas
Menú de opciones
Igualdad de cadenas
Palíndromo
Reemplazo de cadenas
ANEXO
/*
Titulo: Otras operaciones con cadenas y lenguajes
Descripción: Programa en c++ que que dado un alfabeto Σ={0,1}, calcula
operaciones con 2 cadenas ingresadas por el usuario: longitud, igualdad,
palíndromo, reemplazo, quitar espacios en blanco, complemento a 1 y
busqueda.
Fecha: 17/05/2023 Versión: 1.0
Autor: Saúl Alvarez, Ana Medina y José Morales
*/
#include <algorithm>
#include <cstring>
#include <iostream>
#include <set>
using namespace std;
/*Función que recibe como parametro de entrada una cadena, determina si una
* cadena es valida o rechazada.*/
void validar_cadena(string cadena, string c) {
// Recorre la cadena de entrada haciendo la verificación caracter a
caracter
for (int i = 0; i < cadena.size(); i++)
// Si encuentra un caracter distinto de 0 y 1, el programa termina
if (cadena[i] != '0' && cadena[i] != '1' && !isspace(cadena[i])) {
cout << "\nLa cadena " + c + " fue rechazada";
exit(0);
}
}
/*Función que retorna una cadena valida*/
string cadena(string c) {
string palabra;
cout << "Ingresa la cadena " << c << ":" << endl;
getline(cin, palabra);
// Validar cadena
validar_cadena(palabra, c);
return palabra;
}
/*Función que recibe como parametro de entrada dos cadenas y retorna si son
* iguales*/
int igualdad(string u, string v) {
// Si no tienen la misma longitud no son iguales
if (u.size() != v.size())
return -1;
for (int i = 0; i < u.size(); i++)
// Si un caracter no es igual en ambas cadenas retorna -1
if (u[i] != v[i])
return -1;
// Si ambas cadenas son iguales retorna 0
return 0;
}
int main() {
int op = 0, p;
string u, v;
cout << "\t\tOTRAS OPERACIONES CON CADENAS Y LENGUAJES" << endl;
u = cadena("u");
v = cadena("v");
do {
cout << "\n\t\tMenu de opciones\n\tu = " + u + "\t\tv = " + v << endl;
cout << "1. Longitud\n2. Igualdad\n3. Palindromo\n4. Reemplazo\n5.
Quitar "
"espacios en blanco\n6. Complemento a 1\n7. Busqueda\n8. Salir\n
"
"Que opcion desea realizar?"
<< endl;
cin >> op;
switch (op) {
case 1:
system("clear");
cout << "LONGITUD DE CADENAS" << endl;
cout << "|u| = " << longitud(u) << endl;
cout << "|v| = " << longitud(v) << endl;
break;
case 2: {
system("clear");
cout << "IGUALDAD DE CADENAS" << endl;
cout << "Ingresa la cadena con la que deseas comparar" << endl;
string aux;
cin >> aux;
if (igualdad(u, aux) == 0)
cout << "La cadena u y la cadena ingresada son iguales." << endl;
else
cout << "La cadena u y la cadena ingresada NO son iguales." << endl;
if (igualdad(v, aux) == 0)
cout << "La cadena v y la cadena ingresada son iguales." << endl;
else
cout << "La cadena v y la cadena ingresada NO son iguales." << endl;
}
break;
case 3:
system("clear");
cout << "PALINDROMO" << endl;
if (palindromo(u) == 0)
cout << "La cadena u es un palindromo." << endl;
else
cout << "La cadena u no es un palindromo." << endl;
if (palindromo(v) == 0)
cout << "La cadena v es un palindromo." << endl;
else
cout << "La cadena v no es un palindromo." << endl;
break;
case 4:
system("clear");
cout << "REEMPLAZO DE CADENAS" << endl;
cin.ignore(256, '\n');
u = cadena("u");
cout << "La cadena u ha sido reemplazada" << endl;
v = cadena("v");
cout << "La cadena v ha sido reemplazada" << endl;
break;
case 5:
system("clear");
cout << "QUITAR ESPACIOS EN BLANCO" << endl;
cin.ignore(256, '\n');
u = quitar_espacios(u);
v = quitar_espacios(v);
cout << "u = " << u << endl;
cout << "v = " << v << endl;
break;
case 6:
system("clear");
cout << "COMPLEMENTO A 1" << endl;
cout << "u = " << complemento(u) << endl;
cout << "v = " << complemento(v) << endl;
break;
case 7: {
system("clear");
int opc = 0;
cout << "BUSQUEDA DE UNA CADENA DENTRO DE OTRA" << endl;
cout << "Ingrese la cadena a buscar:" << endl;
string aux;
cin >> aux;
cout << "\n" << busqueda_cad(u, aux, "u") << endl;
cout << busqueda_cad(v, aux, "v") << endl;
break;
}
case 8:
break;
default:
system("clear");
cout << "Opcion invalida" << endl;
break;
}
} while (op != 8);
return 0;
}
BIBLIOGRAFÍA