Implementación de Funciones en C para Gestión de Listas y Tablas

Informática y Telecomunicaciones7,68 KB

Funciones de Procesamiento de Cadenas

int contar(char frase[80])
// Devuelve el número de veces que aparece la letra 'a' en la frase
{
    int i = 0;
    int cont = 0;
    while (i < strlen(frase))
    {
        if (frase[i] == 'a')
            cont = cont + 1;
        i = i + 1;
    }
    return cont;
}
void extraer_texto(char mensaje[80])
/* Recibe un mensaje con el formato: 3/Nombre:Texto
 * Escribe en la pantalla la frase: "Nombre ha enviado el siguiente mensaje: Texto"
 */
{
    char texto[80];
    char nombre[10];
    char *p;
    char m[80];
    strcpy(m, mensaje);
    p = strtok(m, ":");
    sscanf(p, "3/%s", nombre);
    printf("%s\n", nombre);
    p = strtok(NULL, ":");
    sscanf(p, "%s", texto);
    printf("%s ha enviado el siguiente mensaje: ", nombre);
    puts(p);
}
void construir_mensaje(char mensaje[80])
/* Lee del teclado un nombre y un texto y construye el mensaje:
 * 3/Nombre:Texto
 */
{
    char nombre[10];
    char texto[80];
    printf("Escribe el nombre y el texto : \n");
    scanf("%s", nombre);
    gets(texto); // Aquí lee toda la frase hasta el final
    sprintf(mensaje, "3/%s:", nombre);
    strcat(mensaje, texto);
}
int contar_palabras(char texto[80])
/* Devuelve el número de palabras que hay en el texto con más
 * de tres caracteres
 */
{
    int cont = 0;
    char *p;
    char t[80];
    strcpy(t, texto);
    p = strtok(t, " ");
    while (p != NULL)
    {
        if (strlen(p) > 3)
            cont = cont + 1;
        p = strtok(NULL, " ");
    }
    return cont;
}

Gestión de Listas

Ejercicio 1

int anadir_usuarios(Tlista *l, char mensaje[80])
/* Recibe como parámetro un mensaje con el siguiente
 * formato: "Codigo*nombre,Codigo*nombre,..."
 * Y añade a la lista cada uno de los usuarios del mensaje, si no
 * está ya en la lista.
 * Devuelve el número de usuarios añadidos.
 */
{
    char lista[80];
    char *p;
    Tusuario t;
    int cont = 0;
    strcpy(lista, mensaje);
    p = strtok(lista, ",");
    sscanf(p, "%d*%s", &t.codigo, t.nombre); // Separamos el código y el nombre
    if (buscar(t.nombre, *l) == -1)
    {
        pon_usuario(l, t);
        cont = cont + 1;
    }
    p = strtok(NULL, ",");
    while (p != NULL)
    {
        sscanf(p, "%d*%s", &t.codigo, t.nombre);
        if (buscar(t.nombre, *l) == -1)
        {
            pon_usuario(l, t);
            cont = cont + 1;
        }
        p = strtok(NULL, ",");
    }
    return cont;
}
int pon_usuario(Tlista *l, Tusuario u)
/* Añade el usuario u al final de la lista.
 * Devuelve 0 si todo bien y -1 si no hay espacio en la lista
 */
{
    if (l->num == MAX)
        return -1;
    else
    {
        l->usuarios[l->num] = u;
        l->num = l->num + 1;
        return 0;
    }
}
void escribir_lista(Tlista l)
// Escribe en pantalla todos los usuarios de la lista
{
    printf("Lista de usuarios:\n");
    int i = 0;
    while (i < l.num)
    {
        printf("Nombre: %s, código %d\n", l.usuarios[i].nombre, l.usuarios[i].codigo);
        i = i + 1;
    }
    printf("\n\n");
}
int eliminar(int i, Tlista *l)
/* Elimina de la lista el usuario que ocupa la posición i
 * Devuelve 0 si ok y -1 si no hay usuario en la posición i
 */
{
    int j;
    if (i >= MAX)
        return -1;
    else
    {
        j = i;
        while (j < l->num - 1)
        {
            l->usuarios[j] = l->usuarios[j + 1];
            j = j + 1;
        }
        l->num = l->num - 1;
        return 0;
    }
}
int buscar(char nombre[10], Tlista l)
/* Devuelve la posición que ocupa en la lista el usuario cuyo nombre se recibe
 * como parámetro. Si el usuario no está en la lista devuelve un -1
 */
{
    int encontrado = 0;
    int i = 0;
    while ((i < l.num) && (!encontrado))
    {
        if (strcmp(l.usuarios[i].nombre, nombre) == 0)
            encontrado = 1;
        if (!encontrado)
            i = i + 1;
    }
    if (encontrado)
        return i;
    else
        return -1;
}
void construir_lista(Tlista l, char mensaje[80])
/* Construye un mensaje de texto con los nombres de los usuarios que
 * hay en la lista l, separados por una coma */
{
    int i = 1;
    strcpy(mensaje, l.usuarios[0].nombre);
    while (i < l.num)
    {
        sprintf(mensaje, "%s,%s", mensaje, l.usuarios[i].nombre);
        i = i + 1;
    }
}

Gestión de Tablas

Ejercicio 1

int construir_frase(Ttabla t, char frase[80])
/* Construye una frase que contiene todos los nombres
 * de los elementos de la tabla cuyo identificador es par.
 * Los nombres aparecerán en la frase separados
 * por comas. La función retorna el número de
 * nombres que tiene la frase.
 */
{
    int i;
    int cont = 0;
    for (i = 0; i < MAX; i++)
        if (t[i].id % 2 == 0)
        {
            cont = cont + 1;
            sprintf(frase, "%s,%s", frase, t[i].nombre);
        }
    return cont;
}

Ejercicio 2

int buscar_posicion(Ttabla t, char nombre[10])
/* Devuelve la posición que ocupa en la tabla el elemento cuyo
 * nombre se recibe como parámetro
 * Si no lo encuentra devuelve un -1
 */
{
    int encontrado = 0;
    int i = 0;
    while ((i < MAX) && !encontrado)
    {
        if (strcmp(t[i].nombre, nombre) == 0)
            encontrado = 1;
        if (!encontrado)
            i = i + 1;
    }
    if (encontrado)
        return i;
    else
        return -1;
}
void escribir_posiciones(Ttabla t, char frase[80])
/* Recibe la tabla y una frase que contiene nombres
 * separados por ,. El procedimiento escribe en pantalla las posiciones en las que está
 * cada uno de los elementos cuyo nombre aparece en la frase.
 */
{
    char aux[80];
    char nombre[10];
    char *p;
    int pos;
    strcpy(aux, frase); // Para poder usar strtok hay que hacer una copia de la frase
    p = strtok(aux, ",");
    while (p != NULL)
    {
        sscanf(p, "%s", nombre); // Obtenemos el siguiente nombre
        pos = buscar_posicion(t, nombre); // Buscamos el nombre en la tabla
        if (pos != -1)
            printf("%s está en la posición %d\n", nombre, pos);
        else
            printf("%s no está en la tabla\n", nombre);
        p = strtok(NULL, ","); // Vamos a por el siguiente nombre
    }
}
void escribir_tabla(Ttabla t)
/* Escribe en pantalla los datos de los elementos de la tabla */
{
    int i;
    printf("Contenido de la tabla:\n");
    for (i = 0; i < MAX; i++)
        if (t[i].id != -1)
            printf("Nombre: %s, Id: %d\n", t[i].nombre, t[i].id);
}
int pon_elemento(Ttabla t, Telemento e)
/* Busca un sitio libre en la tabla y coloca allí el elemento
 * Retorna 0 si OK y -1 si la lista está llena
 */
{
    int encontrado = 0;
    int i = 0;
    while ((i < MAX) && !encontrado)
    {
        if (t[i].id == -1)
            encontrado = 1;
        if (!encontrado)
            i = i + 1;
    }
    if (encontrado)
    {
        t[i] = e;
        return 0;
    }
    else
        return -1;
}
int eliminar(Ttabla t, char nombre[10])
/* Elimina de la tabla el usuario cuyo nombre se recibe como parámetro
 * Devuelve 0 si OK y -1 si el usuario no está en la lista
 */
{
    int encontrado = 0;
    int i = 0;
    while ((i < MAX) && !encontrado)
    {
        if (strcmp(t[i].nombre, nombre) == 0)
            encontrado = 1;
        if (!encontrado)
            i = i + 1;
    }
    if (encontrado)
    {
        t[i].id = -1;
        return 0;
    }
    else
        return -1;
}

Descargar

PDF Word HTML