#include<iostream>
#include<locale.h>
#include<string.h>
#include<stdlib.h>
#include<conio.h>
/*
Programa: Una empresa desea un pequeño sistema que les permita guardar los datos de 20 empleados;
número de empleado y primer nombre.
autor: Kevin Elián Valarezo Guamán
date: 20/03/2024
*/
int main(){
setlocale(LC_CTYPE, "Spanish");
/*Variables 'int' a usar
opcion: Servirá para que el usuario pueda navegar por el menú de opciones del programa.
n: Será la cantidad máxima de empleados, siendo menor a 20 y no menor o igual a 0.
iInferior: Servirá para buscar a los empleados por su respectivo número en saber el que tiene una
posición menor. Útil para la búsqueda binaria.
iSuperior: Servirá para buscar a los empleados por su respectivo número en saber el que tiene una
posición mayor. Útil para la búsqueda binaria.
iCentro: Servirá para buscar a los empleados por su respectivo número en saber el que esta en el
centro. Útil para la búsqueda binaria.
buscar: Será la condición de búsqueda para el número del empleado.
posicion: Servirá para ordenar a los empleados, contendrá la posición anterior de un empleado.
aux: Servirá para ordenar a los empleados, guardará el número de empleado a comparar.
e: Otro tipo de contador como lo son i y j.
v: Servirá en verificar si ya se ingreso un empleado con su número para luego comparar con otros
y que no sea igual.
cont: Servirá para cambiar de posición a la cadena original fn[n].
cont2: Sirve para cambiar de posición a la cadena copia fnC[n].
*/
//cont = 0. Usar en caso de querer un contador.
int opcion = 0, n = 0, iInferior = 0, iSuperior = 0, iCentro = 0, buscar = 0, posicion = 0, aux = 0,
e = 0, v = 0, cont = 0, cont2 = 0;
/*Variables 'char' a usar.
buscarN[20]: Será la condición de búsqueda para el nombre del empleado.
bandera: Útil para verificar si se ha encontrado el número de empleado con otro.
ayuda[20]: Ayuda para ordenar los nombres.
banderaN: Útil para verificar si se ha encontrado el nombre de empleado con otro.
*/
char buscarN[20] = "", bandera = 'F', ayuda[20] = "", banderaN = 'F';
std::cout<<"LA FAVORITA\n"; //Bienvenida del programa,
do{
std::cout<<"Ingrese la cantidad de empleados que va ingresar: "; std::cin>>n;
if(n<=0 || n>20){
system("cls");
std::cout<<"Error: Máxima cantidad de empleados: 20\n";
} else{
system("cls");
}
}while(n<=0 || n>20); //Ciclo do...while() para que el ingreso de empleados sea menor a 20 y mayor que 0 y diferente de este.
/*Vectores 'int' a usar
empleados[n]: Tendrá la cantidad máxima de empleados para saber su número.
empleadosC[n]: Tendrá los valores de empleados[n] como respaldo.
*/
int empleados[n] = {}, empleadosC[n] = {};
/*Cadenas 'char' a usar
fn[n][20] (first name): Contendrá el primer nombre del empleado.
fnC[n][20]: Contedrá los datos de fn[n][20] como respaldo.
vrf[n]: Verificará la posición donde se ha encontrado el nombre con otro empleado.
*/
char fn[n][20], fnC[n][20], vrf[n];
for(int i = 0; i<n; i++){ //Todas las posiciones de vrf en F.
vrf[i] = 'F';
}
std::cout<<"INGRESO DE EMPLEADOS\n\n";//Ingreso de empleados
for(int i = 0; i<n; i++){ //Ciclo for para el ingreso de empleados con su número y primer nombre.
do{
bandera = 'F';
std::cout<<"N° de empleado: "; std::cin>>empleados[i];
if(v == 1){
for(int j = 0; j<n; j++){
if(empleados[i] == empleadosC[j]){
bandera = 'V';
j = n;
}
}
}
if(empleados[i]<=0 || empleados[i]>n){
std::cout<<"\nNúmero de empleado fuera del límite de "<<n<<"\n\n";
}else if(bandera == 'V'){
std::cout<<"\nNúmero de empleado ya asignado.\n\n";
}
}while(empleados[i]<=0 || empleados[i]>n || bandera == 'V');
std::cin.ignore(10000, '\n'); //Se lo pone aquí para que se pueda almacenar bien los nombres en fn[i].
std::cout<<"Primer nombre del empleado: "; std::cin.getline(fn[i], 20, '\n');
//Paso de datos.
empleadosC[i] = empleados[i];
strcpy(fnC[i], fn[i]);
std::cout<<std::endl;
v = 1; //Despues que se haya ingresado un empleado se podrá comparar con otros empleados con su número.
}
/*Fase N°1 de prueba del programa.
Comprobar el paso de datos del nombre de empleados.
Aprendiendo algo nuevo: Al momento de pedir el ingreso de un valor númerico antes de ingresar una palabra
en una cadena, no se almacenará, por ende, se debe poner std::cin.ignore(10000, '\n'); antes de pedir
el ingreso de una cadena.
*/
/*for(int i = 0; i<n; i++){
std::cout<<empleadosC[i];
std::cout<<fnC[i]<<std::endl;
}*/
//Método de ordenamiento por insercion. Ordena los empleados de manera ascedente.
for(int i = 0; i<n; i++){
strcpy(ayuda, fn[i]);
posicion = i;
aux = empleados[i];
while((empleados[posicion-1] > aux) && posicion > 0){
empleados[posicion] = empleados[posicion - 1];
strcpy(fn[posicion], fn[posicion - 1]);
posicion--;
}
empleados[posicion] = aux;
strcpy(fn[posicion], ayuda);
}
do{
//Variables a utilizar en 0 en caso de que se vuelva a usar el mené de opciones y así evitar errores.
cont = 0;
cont2 = 0;
buscar = 0;
opcion = 0;
bandera = 'F';
banderaN = 'F';
iCentro = 0;
iInferior = 0;
iSuperior = n-1;
e = 0;
v = 0;
for(int i = 0; i<n; i++) vrf[i] = 'F';
//Menú de opciones.
std::cout<<">> 1 Buscar el nombre de un empleado por su número de empleado.\n";
std::cout<<">> 2 Buscar el número de empleado por su nombre.\n";
std::cout<<">> 3 Saber si un usuario no existe.\n";
std::cout<<">> 4 Saber si hay nombres similares entre sus empleados.\n";
std::cout<<">> 5 Mostrar empleados de forma ascendente por número de empleado.\n";
std::cout<<">> 6 Mostrar empleados de forma descendente por número de empleado.\n";
std::cout<<">> 7 Salir del programa\n";
std::cout<<" Opción: ";
std::cin>>opcion;
system("cls");
switch(opcion){
case 1:
std::cout<<"Ingrese el número del empleado: "; std::cin>>buscar;
if(buscar <= 0 || buscar > n){ //if para verificar en primera nuevamente que el número de empleado sea
//mayor a 0 y menor que la cantidad de empleados.
std::cout<<"El número no corresponde a ningún empleado.";
} else{
//Búsqueda binaria. Búsca a los empleados por medio de su número.
while(iInferior <= iSuperior){
iCentro = (iInferior + iSuperior) / 2;
if(empleados[iCentro] == buscar){
bandera = 'V';
break;
}
else if(empleados[iCentro] > buscar){
iSuperior = iCentro - 1;
}
else {
iInferior = iCentro + 1;
}
}
if(bandera == 'V'){
std::cout<<"\nEl empleado N°"<<buscar<<" es: "<<fn[iCentro]<<"\n\n";
} else{
std::cout<<"\nEl número no corresponde a ningún empleado.\n\n";
}
}
break;
case 2:
std::cin.ignore(10000, '\n'); //Evitar errores en escribir el nombre que se desea buscar.
std::cout<<"Ingrese el nombre del empleado: "; std::cin.getline(buscarN, 20, '\n');
//Método de búsqueda secuencial. Para buscar a los empleados por su nombre.
while(e<=n-1){
if(strcmp(buscarN, fn[e])==0){
vrf[e] = 'V';
banderaN = 'V';
}
e++;
}
if(banderaN == 'V'){
for(int i = 0; i<n;i++){
if(vrf[i] == 'V'){
std::cout<<"El numéro del empleado "<<buscarN<<": "<<empleados[i]<<"\n";
}
}
}
else std::cout<<"El nombre no corresponde a ningún empleado.\n";
std::cout<<std::endl;
break;
case 3:
do{
std::cout<<"Saber si existe por:\n";
std::cout<<" 1 Número\n";
std::cout<<" 2 Nombre\n";
std::cout<<"\nOpción: "; std::cin>>opcion;
switch(opcion){
case 1:
std::cout<<"\nIngrese el número del empleado: "; std::cin>>buscar;
//Método de búsqueda secuencial. Para buscar a los empleados por su nombre.
while((bandera == 'F') && (e<=n-1)){
if(empleados[e] == buscar){
bandera = 'V';
}
e++;
}
break;
case 2:
std::cin.ignore(10000, '\n'); //Evitar errores en escribir el nombre que se desea buscar.
std::cout<<"\nIngrese el nombre del empleado: "; std::cin.getline(buscarN, 20, '\n');
//Método de búsqueda secuencial. Para buscar a los empleados por su nombre.
while(e<=n-1){
if(strcmp(buscarN, fn[e])==0){
banderaN = 'V';
v++;
}
e++;
}
break;
default:
system("cls");
std::cout<<"Error: Opción no disponible\n";
break;
}
if(bandera == 'V' || banderaN == 'V'){
std::cout<<" Este empleado si existe\n";
if(opcion==2){
if(v==1) std::cout<<" Registrado una 1 vez\n";
else std::cout<<" Registrado "<<v<<" veces\n";
}
std::cout<<std::endl;
} else if((opcion<2 && opcion>0)||(bandera == 'F'||banderaN == 'F')){ //else if para que no salga este mensaje en caso de que el usuario ingrese una
//opción del menú fuera de los parametros.
std::cout<<"Este empleado no existe\n\n";
}
}while(opcion <=0 || opcion >2); //Ciclo do...while() para verificar que la opcion no este fuera de los parametros.
break;
case 4: //Pendiente en verificar a empleados con el mismo nombre.
std::cout<<"Empleados repetidos\n\n";
for(int i = 0; i<n; i++){
cont = i;
std::cout<<"Empleado N°"<<cont+1<<" "<<fn[cont]<<" repetido con los empleados: \n";
for(int j = 0; j<n; j++){
cont2 = j;
if((strcmp(fn[cont], fnC[cont2])==0)&&(empleados[cont]!=empleadosC[cont2])){
std::cout<<" N°"<<cont2+1<<" "<<fnC[cont2]<<std::endl;
}
}
std::cout<<std::endl;
}
break;
case 5:
std::cout<<"Empleados ordenados de manera ascendente: \n\n";
for(int i = 0; i<n; i++){
std::cout<<"Empleado N°"<<empleados[i]<<"\n "<<fn[i];
std::cout<<std::endl;
}
std::cout<<std::endl;
break;
case 6:
std::cout<<"Empleados ordenados de manera descendente: \n\n";
for(int i = n-1; i>=0; i--){ //Ciclo for para presentar los empleados de manera descendente en vez de ordenar de
//otra manera.
std::cout<<"Empleado N°"<<empleados[i]<<"\n "<<fn[i];
std::cout<<std::endl;
}
std::cout<<std::endl;
break;
case 7:
std::cout<<"Gracias por usar este programa :D";
getch(); //No cerrará el programa de golpe.
break;
default: //En caso de que el usuario elija una opción fuera de los paranetros.
system("cls");
std::cout<<"Error: Opción no disponible\n";
break;
}
}while(opcion<7 || opcion > 0); //Ciclo do...while(). Servirá para el usuario pueda navegar el menú.
return 0;
}