Pues considero que los fallos que tienes son de principiante y para estar acabando el curso ya tendrías que saber hacer algo asi.
1- validar supongo que lo que hace es inicializar todos los campos para comenzar a trabajar con el, en ese caso lo que tienes q hacer es pasarle el vector y recorrerlo poniendo el campo valid a cero.
void validar (struct alumnos *p)
{
int i;
for (i = 0; i < DIM; i++)
p[i].valid = 0;
}
La llamada sería:
validar(listin);
Y no tendrías que poner el bucle
2- En la funcion es borrar marcas como borrado un regristro, por tanto has de pasarle el registro en cuestion
void esborrar (struct alumnos *p)
{
p->valid = 0;
}
La llamada saria:
esborrar (&listin[i]);
Como esborrar y validar sin el fondo hacen lo mismo puedes sustituir validar por esborrar pasandole todas las posicion, es decir el codigo que pongo a continuacion hace lo mismo que la funcion validar
int i;
for (i = 0; i < DIM; i++)
esborrar(&listin[i]);
3- La funcion que introduce los alumnos está mal y no comentaré todos los fallos que tiene, una alternativa sería:
void IntroducirAlumnos( struct alumnos *p)
{
int i;
for (i = 0; i < DIM; i++)
{
printf("\nIntrodueix el nom del contacte:");
gets(p[i]nom);
printf("Introdueix el primer cognom del contacte:");
gets(p[i].cognom_primer);
//--resto de codigo
}
}
Si kieres modificar la condicion del bucle y cambiarlo por un do while o un while podrias.
4- Dudo que conozcas el sentido de los indices en los arrays. No hay ni una sola vez que los uses bien. El sentido de los bucles es precisamente recorrer el vector/array.
Si pones por ejemplo:
for (i = 0; i < 10; i++)
if (listin.activar == 1)
printf ("activado");
Lo que vas a tener es 10 veces la misma salida ya que no estas cambiandoel indice. por definicion el nombre de un array te lleva al primer elemento del mismo y eso es lo que haces, no te muevesdel primer elemento.
Con ello te quiero explicar que si kieres buscar un nombre has de recorrer el array
for (i=0; i<w; i++)
{
if ((strcmp(cadena, listin[i].nom)==0) &&
(strcmp(cadena2, listin[i].cognom_primer)==0))
{
//--lo que vaya en el if
}
}//fin for
4.1 El uso del xivato está confuso. Solucion:
xivato=0;
BUSCAMOS EN TODO EL ARRAY
SI (es el nombre que buscamos) HACEMOS
{
esborrar(&listin[i]);
xivato = 1;
}
SI xivato == 0 HACEMOS
escribimos ("No esta en la lista");
5- Para los casos de buscar se hace de forma análoga, la diferencia es que en vez de marcar como borrado listaras una informacion y en vez de buscar por el nombre y apellido lo haras por el nombre o por el campo que sea.
6- Si tienes problemas para saber como pasar el vector a las funciones lo único que has de hacer es declararlo como global.
7- Usa funciones para buscar, asi será mas claro el código
8- Declarar variables globales tan solo sería el vector. Si el vector tiene 20 registros y solo hay 5 en uso y no kieres recorrer los 20 tan solo has de avanzar en el vector hasta encontrar el 0 lo que indicaria que el resto de las posciones estan vacias. Para ello has de cambiar la forma de marcar los registros borrardos por ejemplo marcandolos con -1. Cuando vayas a introducir nuevos registros lo haras en las posiciones marcadas con 0 o -1.
while (listin[i].activ != 0 && listin[i].activ != -1 && i < DIM)
i++;
if ( i == DIM)
printf ("vector lleno\n");
else
IntroducirAlumno(listin[i]);
Si declaras el vector como global solo le pasarias el indice
9- Ahorra la variable comp ya puedes hacer la evaluacion con un if, al igual que en el caso borrar.
Un saludo!
PD: No he compilado el codigo asi que es posible que tenga algun pekeño error que seguro sabras resolver sin problema, pero de no ser asi pregunta nuevamente