[ Foro de C ]
rdena: que reciba como parámetros un dato u objeto de tipo listaSolicitudes y un entero (integer).
La función debe devolver un objeto o dato de tipo listaSolicitudes con las peticiones de la lista de entrada, ordenadas en orden alfabético ascendente del atributo ciudad de origen (si el valor del segundo parámetro es 1), en orden alfabético ascendente de la ciudad de destino (si el valor es 2), y en cualquier otro caso, en orden alfabético ascendente del usuario.
4. Anexa la instrucción de que necesita almacenar información más detallada sobre sus usuarios.
En particular, para cada usuario se debe guardar la siguiente información:
usuario: id del usuario (por ejemplo, jperez)
nombre (Para simplificar, trabajar solo con nombres de pila).
edad
sexo
númerodequejas
5. Implementa una función o clase árbol de búsqueda binaria para almacenar la información de los usuarios.
La clase debe contener los siguientes métodos:
insertaUsuario, toma un dato u objeto Usuario y lo agrega a la estructura de datos. Tiene que estar ordenado alfabéticamente por nombre de usuario. Si ya hay un usuario con el mismo nombre, el método solo muestra un mensaje de error “El usuario ya existe”.
remueveUsuario, recibe una cadena (String) como parámetro y elimina del árbol al usuario cuyo nombre de usuario es igual al parámetro.
encuentraUsuario, recibe una cadena (String) y devuelve el usuario cuyo nombre completo es igual al parámetro. El método tiene que imprimir toda la información del usuario.
Muestra (): muestra todos los usuarios en orden alfabético (ascendente) por nombre de usuario.
muestraNivel(): muestra todos los usuarios del árbol binario de búsqueda por orden de nivel.
Quejas (): recibe una cadena (String) como parámetro y aumenta el número de quejas recibidas por un usuario cuyo nombre es igual al parámetro de entrada. Si el número de quejas es igual a 5, el usuario debe ser eliminado.
usuariosCríticos(): devuelve los nombres de usuario o de los usuarios con más y menos quejas en el sistema.
cuento con el siguiente codigo:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
/* #ifdef _WIN32
#define LIMPIAR_PANTALLA system("cls");
#else
#define LIMPIAR_PANTALLA system("clear");
#endif */
/*Definiciones de estructuras*/
typedef struct
{
int G[5][5];
int num_ciudades;
} Datos;
int RutaOptima (void);
void PedirCaminos (Datos *);
void BuscarRutaOptima (Datos *,int [5][2]);
int BuscarEnFila (Datos *,int, int[5][2]);
void GuardarCiudad (int [5][2], int);
void GuardarValor (int [5][2], int);
void QuitarCiudadesVisitadas (Datos *, int [5][2], int, bool);
void ImprimirRutaOptima (int [5][2], int);
int SumarTrayectorias (int [5][2], int);
void RepetirPrograma (void);
void Flush_in (void);
int main()
{
RutaOptima();
return 0;
}
int RutaOptima(void)
{
int ruta[5][2]= {0};
Datos datos = {0,0};
do
{
/* system ("cls");*/
printf("\n\n\n\tTeclee el numero de ciudades a visitar (1 - 5): ");
scanf("%d",&datos.num_ciudades);
Flush_in();
if (datos.num_ciudades < 5 || datos.num_ciudades > 5)
{
printf("\n\n\t\t** El numero de ciudades tiene que estar entre 1 y 5 **");
getchar();
}
} while (datos.num_ciudades < 5 || datos.num_ciudades > 5);
PedirCaminos(&datos);
BuscarRutaOptima(&datos, ruta);
ImprimirRutaOptima(ruta, datos.num_ciudades);
RepetirPrograma();
return 0;
}
void PedirCaminos(Datos *datos)
{
int i, j;
/*system ("cls");*/
printf("\n\n\tA continuacion escriba la distancia en kilometros de las siguientes\n\ttrayectorias:\n\n");
for (i = 0; i < (datos -> num_ciudades); i++)
{
datos -> G[i][i] = 0;
for (j = i + 1; j < (datos -> num_ciudades); j++)
{
printf("\n\tCiudad %d --> Ciudad %d : ", i+1, j+1);
scanf("%d",&datos -> G[i][j]);
Flush_in();
datos -> G[j][i] = datos -> G[i][j];
}
}
}
void BuscarRutaOptima(Datos *datos, int r[5][2])
{
int i, inicio, indice_del_menor;
do
{
/*system ("cls");*/
printf("\n\n\n\t\tCon cual ciudad desea comenzar su ruta: ");
scanf("%d", &inicio);
Flush_in();
if (inicio < 1 || inicio > (datos -> num_ciudades))
{
printf("\n\t\t** La ciudad debe estar entre 1 y %d **", datos -> num_ciudades);
getchar();
}
}while(inicio < 1 || inicio > (datos -> num_ciudades));
r[0][0] = inicio;
inicio--;
for (i = 0; i < (datos -> num_ciudades); i++)
{
if(i == 0)
{
indice_del_menor = BuscarEnFila(datos, inicio, r);
QuitarCiudadesVisitadas(datos, r, indice_del_menor, false);
}
else
{
if (i == (datos -> num_ciudades) - 2)
{
indice_del_menor = BuscarEnFila(datos, indice_del_menor, r);
QuitarCiudadesVisitadas(datos, r, indice_del_menor, true);
}
else
{
indice_del_menor = BuscarEnFila(datos, indice_del_menor, r);
QuitarCiudadesVisitadas(datos, r, indice_del_menor, false);
}
}
}
}
int BuscarEnFila(Datos *datos, int inicio, int r[5][2])
{
int j, menor = 999999, indice_del_menor;
for (j = 0; j < (datos -> num_ciudades); j++)
{
if ( (datos -> G[inicio][j]) != 0 )
{
if ( (datos -> G[inicio][j]) < menor )
{
menor = datos -> G[inicio][j];
indice_del_menor = j;
}
}
}
GuardarCiudad(r ,indice_del_menor);
GuardarValor(r, menor);
return indice_del_menor;
}
void GuardarCiudad(int r[5][2] , int indice_del_menor)
{
int i, num_ciudades_visitadas;
i= 0;
num_ciudades_visitadas = 0;
while(r[i][0] != 0)
{
i++;
num_ciudades_visitadas++;
}
r[num_ciudades_visitadas][0] = indice_del_menor + 1;
}
void GuardarValor(int r[5][2], int menor)
{
int i, num_ciudades_visitadas;
i=0;
num_ciudades_visitadas = 0;
while(r[i][1] != 0)
{
i++;
num_ciudades_visitadas ++;
}
r[num_ciudades_visitadas][1] = menor;
}
void QuitarCiudadesVisitadas(Datos *datos, int r[5][2], int indice_del_menor, bool penultimo)
{
int i, num_ciudades_visitadas, aux;
i = 0;
num_ciudades_visitadas = 0;
while(r[i][1] != 0)
{
i++;
num_ciudades_visitadas++;
}
if (penultimo == true)
{
for (i = num_ciudades_visitadas; i >= 1; i--)
{
aux = r[i][0];
aux = aux - 1;
datos -> G[indice_del_menor][aux] = 0;
}
}
else
{
for (i = num_ciudades_visitadas; i >= 0; i--)
{
aux = r[i][0];
aux = aux - 1;
datos -> G[indice_del_menor][aux] = 0;
}
}
}
void ImprimirRutaOptima(int ruta[5][2], int n)
{
int i, total;
total = SumarTrayectorias(ruta, n);
printf("\n\n\tUna ruta optima seria: ");
for (i = 0; i < n + 1; i++)
{
if (i == n)
printf(" %d\n", ruta[i][0]);
else
printf(" %d ->", ruta[i][0]);
}
printf("\n\n\tTotal de kilometros recorridos:");
for (i = 0; i < n; i++)
{
if (i == n-1)
printf(" %d = %d\n\n", ruta[i][1],total);
else
printf(" %d +", ruta[i][1]);
}
getchar();
}
int SumarTrayectorias(int r[5][2], int n)
{
int i, total=0;
for (i = 0; i < n; i++)
total += r[i][1];
return total;
}
void RepetirPrograma(void){
int opcion;
do
{
/*system ("cls");*/
printf("\n\n\t\tDesea repetir de nuevo el programa\n\n\t 1.Si\n\n\t 2.No");
printf("\n\n\n\tElegir opcion: ");
scanf("%d", &opcion);
Flush_in();
switch(opcion)
{
case 1:
RutaOptima();
break;
case 2:
/*system ("cls");*/
break;
default:
printf("\n\n\tOpcion no valida");
getchar();
break;
}
} while (opcion < 1 || opcion > 2);
}
void Flush_in (void)
{
char caracter;
while((caracter = fgetc(stdin)) != EOF && caracter != '\n');
}
(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)