Manipulación de cadenas y estructuras de datos en C: Listas y Tablas

Enviado por Chuletator online y clasificado en Informática y Telecomunicaciones

Escrito el en español con un tamaño de 21,82 KB

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 el la pantalla la frase: "Nombre ha enviaso 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);

      // para escribir el texto:

      puts (p);

}

Void construir_mensaje (char mensaje [80])


/* Lee Del teclado un nomnbre 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;

}

Listas

Ejercicio 1

Int anadir_usuarios (Tlista *l, char Mensaje[80])


/* recibe Como parámetro un mensaje con el siguiente

 * formato: "Código*nombre,Código*nombre,..."

 * Y añade al lista cada uno de los usuarios del Mensaje, si no

 * está ya en la lista.

 * Devuelve el numero 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.Código,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.Código,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, ",");

      }

      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].Código);

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 nombre 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;

      }

}

Tablas

Ejercicio 1

int construir_frase (Ttabla t, char frase [80])

/* Construye una frase que contiene todos los nombre

 * de los elementos de la tabla cuyo Identificador es par.

 * Los nombres aparecerán en la frase sepadados

 * 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 hace 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 elemmentos 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;

}

Entradas relacionadas: