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