PDA

View Full Version : [ C ] Ricerca Sequenziale in un elenco tramite Array di Puntatori


Riccardo88
28-05-2013, 14:37
Ciao, devo cercare una struttura tramite un suo campo ( cognome ) e lo devo fare tramite un array di puntatori.

.main
#include "StudenteRicercaSequenziale.h"

int main(int argc, char *argv[])
{
studente mioStudente;

inserisciStudenti( mioStudente );
stampaStudenti( mioStudente );
cognomeDaRicercare( mioStudente );

printf("\n\n");

system("PAUSE");
return 0;
}

.header

#ifndef StudenteRicercaSequenziale_h
#define StudenteRicercaSequenziale_h
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define NMAX 30

typedef struct{
char nome[ NMAX ];
char cognome[ NMAX ];
int matricola;
}utente;

typedef utente studente[ 10 ];


void inserisciStudenti( studente s );
void stampaStudenti( studente s );
void cognomeDaRicercare( studente s );
int ricercaSequenziale( utente *uPnt[], char *key, int r );

#endif

.c

#include "StudenteRicercaSequenziale.h"

void inserisciStudenti( studente s )
{
int register i;

printf("Inserisci i 10 studenti:\n");

for( i = 0; i < 10; i++ )
{
printf("Studente numero %d\n", i );
printf("Nome: ");
scanf("%s", &( s[ i ].nome ) );
printf("Cognome: ");
scanf("%s", &( s[ i ].cognome ) );
printf("Matricola: ");
scanf("%d", &( s[ i ].matricola ) );

printf("\n");

}

printf("\n");

}

void stampaStudenti( studente s )
{
int register i;

printf("Stampo i 10 studenti:\n\n");

for( i = 0; i < 10; i++ )
{
printf("Studente numero %d\n", i );
printf("Nome: ");
printf("%s\n", s[ i ].nome );
printf("Cognome: ");
printf("%s\n", s[ i ].cognome );
printf("Matricola: ");
printf("%d\n", s[ i ].matricola );

printf("\n");

}

}

void cognomeDaRicercare( studente s )
{
int register i;
int risultato;
char chiave[ NMAX ];
char c;

utente *utentePnt[ 10 ];

for( i = 0; i < 10; i++ ) //carica array di puntatori
{
utentePnt[ i ] = &s[ i ];
}

printf("Inserisci cognome da ricercare: ");

i = 0;

while( ( c = getchar() ) != '\n' )
{
chiave[ i++ ] = c;
}
chiave[ i ] = '\0';

printf("\nRicerco il cognome all'interno dell'elenco...\n");
risultato = ricercaSequenziale( utentePnt, chiave, 10 );

if( risultato != -1 )
{
printf("\nStudente %s trovato in posizione %d\n", utentePnt[ risultato ]->cognome, risultato+1 );
}

else
{
printf("\nStudente non trovato\n");
}

}

int ricercaSequenziale( utente *uPnt[], char *key, int r )
{
int register i;

printf("\nChiave da cercare vale: " );
puts( key );

for( i = 0; i < r; i++ )
{
printf("\nCognome: %s = %s ?\n", uPnt[ i ]->cognome, key );
if( strcmp( uPnt[ i ]->cognome, key ) == 0 )
{
return i;
}
}

return -1;

}

Non capisco il perchè ma non mi permette di inserire il cognome da cercare nell'elenco. :confused:

in questo punto:

printf("Inserisci cognome da ricercare: ");

i = 0;

while( ( c = getchar() ) != '\n' )
{
chiave[ i++ ] = c;
}
chiave[ i ] = '\0';


perchè non mi si fila questa parte di codice ? :mbe:

Riccardo88
29-05-2013, 15:45
Ci ho provato ma niente... qualcuno sa dirmi perchè la stringa non viene presa ? :confused:

[Kendall]
29-05-2013, 16:40
Ci ho provato ma niente... qualcuno sa dirmi perchè la stringa non viene presa ? :confused:

Non conosco la sequenza precisa delle operazioni che esegui, ma può essere che un simile problema sia dovuto al fatto che tu abbia un buffer non del tutto svuotato dopo operazioni precedenti di lettura che hanno lasciano un "\n" residuo.
Prova con un brutale

fflush(stdin);

prima delle righe incriminate.

Riccardo88
29-05-2013, 18:26
Grazie, funziona! :D

Mi è rimasto un unico problema alquanto misterioso, se inserisco fino a 5 cognomi ( a tempo di programmazione ) il programma funziona a meraviglia se però i cognomi sono 6 o di più crasha... che differenza fa se sono 5 o 6+ ???

typedef utente studente[ 5 ]; // Funziona

typedef utente studente[ 6 ]; // NON funziona :muro:

Riccardo88
30-05-2013, 15:44
RISOLTOOOOOOOOOOOOOO!!!!!!!!!!! Era solo un problema di compilatore... ho cambiato NMAX 300 ho riassemblato e poi riassemblato con il mio valore di NMAX 30 ed è andato! :D :sofico:

Grazie Kendall! :D