0% encontró este documento útil (0 votos)
33 vistas10 páginas

Tixtix Practica3

Este documento describe una práctica de programación en C++ que involucra operaciones con cadenas binarias sobre un alfabeto {0,1}. El programa permite al usuario seleccionar entre 7 operaciones (longitud, igualdad, palíndromo, reemplazo, quitar espacios, complemento a 1, búsqueda) aplicadas a dos cadenas ingresadas. Se implementan funciones para cada operación y se muestra un menú iterativo para la selección de operaciones y visualización de resultados.

Cargado por

Saúl Alvarez
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
33 vistas10 páginas

Tixtix Practica3

Este documento describe una práctica de programación en C++ que involucra operaciones con cadenas binarias sobre un alfabeto {0,1}. El programa permite al usuario seleccionar entre 7 operaciones (longitud, igualdad, palíndromo, reemplazo, quitar espacios, complemento a 1, búsqueda) aplicadas a dos cadenas ingresadas. Se implementan funciones para cada operación y se muestra un menú iterativo para la selección de operaciones y visualización de resultados.

Cargado por

Saúl Alvarez
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 10

INSTITUTO POLITÉCNICO NACIONAL

ESCUELA SUPERIOR DE CÓMPUTO

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

Calcular la longitud de cadenas

Igualdad de cadenas

Palíndromo

Reemplazo de cadenas

Quitar espacios en blanco


Complemento a 1

Búsqueda de una cadena dentro de otra

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 una cadena y retorna la


longitud
* de cadena con la funcion length()*/
int longitud(string cadena) { return cadena.length(); }

/*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;
}

/*Función que recibe como parametro de entrada una cadena y retorna 0 si es


* palindromo y -1 si no lo es*/
int palindromo(string cadena) {
int i, j;
// Recorre la cadena ingresada con dos indices
for (i = 0, j = cadena.size() - 1; i < cadena.size(); i++, j--)
// Si un caracter no es igual en las posiciones i y j retorna -1
if (cadena[i] != cadena[j])
return -1;
return 0;
}

/*Función que recibe como parametro de entrada una cadena y retorna la


cadena
* sin espacios en blanco*/
string quitar_espacios(string cadena) {
/*Se recorre el arreglo en busqueda de espacios en blanco, en caso de que
*no
*sea un espacio en blanco se concatena en una cadena auxiliar, al
finalizar
*se retorna la cadena auxiliar sin espacios
*/
string cad_sin_e;
for (int i = 0; i < cadena.size(); i++) {
if (!isspace(cadena[i]))
cad_sin_e += cadena[i];
}
return cad_sin_e;
}

/*Función que recibe como parametro de entrada una cadena y retorna su


* complemento a 1*/
string complemento(string cadena) {
// Recorre la cadena ingresada
for (int i = 0; i < cadena.size(); i++) {
if (cadena[i] == ' ')
i++;
// Realiza el complemento a 1 sustituyendo el 1 por 0 y viceversa
if (cadena[i] == '1')
cadena[i] = '0';
else
cadena[i] = '1';
}
return cadena;
}
/*Función que recibe como parametro 2 cadenas, una de ellas es la referencia
* otra es la cadena a buscar, retorna un cadena diciendo si esta dentro de
la
* cadena referencia o no lo esta
* complemento a 1*/
string busqueda_cad(string ref, string com, string c) {
int j, contador = 0;
for (int i = 0; i <= (ref.size() - com.size()); i++) {
// Verificar si los caracteres consecutivos son iguales al primer
carácter
// de la cadena de búsqueda
for (j = 0; j < com.size(); j++) {
// Si no es igual, reinicia el contador a 0
if (ref[i + j] != com[j]) {
contador = 0;
break;
} else
contador++;
}
if (contador == com.size())
break;
}
if (contador > 0)
return "La cadena " + com + " esta dentro de la cadena " + c;
else
return "La cadena " + com + " NO esta dentro de la cadena " + c;
}

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

• Kelley, D. (1995). Teoría de autómatas y lenguajes formales. PRENTICE


HALL.

También podría gustarte