Immissione candidati tramite liste

di il
1 risposte

Immissione candidati tramite liste

Ciao a tutti, vi pongo un nuovo problema su cui vorrei avere delle delucidazioni.
Dovrei creare un programma dove mi si chiede (utilizzando le liste):
1) Login come amministratore o candidato (ad esempio 1 per il primo e 2 per il secondo tramite uno switch)
2) Se scelgo la prima azione: si è in grado di
- a) inserire un candidato mettendo come credenziali: nome, cognome, indirizzo, età e parametro qualitativo (è un valore che deve essere compreso tra 20 e 50;
- b) Stampare la lista totale dei candidati;
- c) Cercare in base al parametro qualitativo quello/i che soddisfa/no maggiormente il ruolo da coprire (ad esempio, se ha un valore compreso tra 45 e 50 viene preso in considerazione come programmatore e così via per gli altri)

3)Se scelgo la seconda: si è in grado di inserirsi come candidati (quindi utilizzando la stessa funzione di a).

Per adesso io ho abbozzato questo scheletro ma ho dei problemi al momento della stampa della lista... Stampa solo il secondo candidato



#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct lista_personale
{
    char nome[20];
    char cognome[30];
    char indirizzo[100];
    int eta;
    int parametro_qualita;
    struct lista_personale *next;
};

struct lista_personale *personale = NULL;

void menu();
void inserimento();
void selezione();
void stampa(struct lista_personale *personale);
void switch1();


int main(int argc, const char * argv[]) {
    
    int choice;
    for (; ; ) {
    menu();
    scanf("%d", &choice);
        while (getchar() != '\n') {
            ;
        }
        switch (choice) {
            case 1:
                printf("Loggato come amministratore.\n");
                printf("Premi [1] per inserire un candidato - [2] per stampare la lista - [3] per cercare candidato per parametro di qualità.\n");
                switch1();
                break;
            case 2:
                printf("Loggato come candidato.\n");
                printf("Inserisci i tuoi dati: ");
                inserimento();
                break;
                
            case 0:
                return EXIT_SUCCESS;
                break;
                
                
            default:
                printf("Scelta errata.\n");
                break;
        }
    }
    return EXIT_SUCCESS;
}
    
void stampa(struct lista_personale *personale) {
    
    if(personale != NULL) {
        printf("Candidato: \n\n");
        printf("Nome: %s\n", personale->nome);
        printf("Cognome: %s\n", personale->cognome);
        printf("Indirizzo: %s\n", personale->indirizzo);
        printf("Età: %d\n", personale->eta);
        printf("Parametro qualità: %d", personale->parametro_qualita);
        personale = personale->next;
    } printf("\n");
    
}

void menu()
{
    printf("Premere: [1] per loggarti come amministratore - [2] come candidato - [0] per uscire.\n");
}

void inserimento()
{
    struct lista_personale *cur, *prev, *new_node;
    
    new_node = malloc(sizeof(struct lista_personale));
    if (new_node == NULL) {
        printf("Database pieno.\n");
        return;
    }
    
    printf("Inserisci nome candidato: ");
    //gets(new_node->nome);
    scanf("%s", new_node->nome);
    printf("Inserisci cognome candidato: ");
    //gets(new_node->cognome);
    scanf("%s", new_node->cognome);
    printf("Inserisci indirizzo: ");
    scanf("%s", new_node->indirizzo);
    //gets(new_node->indirizzo);
    printf("Inserisci età candidato: ");
    scanf("%d", &new_node->eta);
    printf("Inserisci parametro qualità: ");
    scanf("%d", &new_node->parametro_qualita);
    while ((new_node->parametro_qualita < 20) || (new_node->parametro_qualita > 50)){

           {
               printf("Valore errato. Reinserire.\n");
               scanf("%d", &new_node->parametro_qualita);
           }
    }

    for (cur = personale, prev = NULL; cur != NULL && new_node->parametro_qualita < cur->parametro_qualita; prev = cur, cur = cur->next) {
        ;
    }
    if (cur != NULL && new_node->cognome == cur->cognome) {
        printf("Candidato già inserito\n");
        free(new_node);
        return;
    }
    
    new_node->next = cur;
    
    if (prev == NULL) {
        personale = new_node;
    }
    else
        prev->next = new_node;
    
}

void switch1()
{
    int choice;
    scanf("%d", &choice);
    switch (choice) {
        case 1:
            printf("Inserimento candidato: \n");
            inserimento();
            break;
            
        case 2:
            stampa(personale);
            break;
            
        case 3:
            printf("Cerca candidato per parametro di qualità.\n");
            break;
            
        case 0:
            EXIT_SUCCESS;
            
        default:
            break;
    }
}

1 Risposte

  • Re: Immissione candidati tramite liste

    Salve, Alexander
    
    void stampa(struct lista_personale *personale) {
       
        if(personale != NULL) {
            printf("Candidato: \n\n");
            printf("Nome: %s\n", personale->nome);
            printf("Cognome: %s\n", personale->cognome);
            printf("Indirizzo: %s\n", personale->indirizzo);
            printf("Età: %d\n", personale->eta);
            printf("Parametro qualità: %d", personale->parametro_qualita);
            personale = personale->next;
        } printf("\n");
    }
    
    In questo frammento di codice avviene la stampa, il problema sta nel fatto che dopo aver fatto "personale = personale -> next" termina la if e la funzione si conclude invece di ripetersi.
    Sostanzialmente potresti anzitutto spostare il printf("\n") all'interno della if, e poi sostituire la if con un while: in questo modo l'operaio ne di stampa è ripetuta per ogni elemento.
    
        void stampa(struct lista_personale *personale)
        {
        while(personale != NULL) {
            printf("Candidato: \n\n");
            printf("Nome: %s\n", personale->nome);
            printf("Cognome: %s\n", personale->cognome);
            printf("Indirizzo: %s\n", personale->indirizzo);
            printf("Età: %d\n", personale->eta);
            printf("Parametro qualità: %d", personale->parametro_qualita);
            personale = personale->next;
            printf("\n");
        }
    }
    
    Sul momento non ho modo di verificare il codice, tuttavia in questo modo dovrebbe funzionare... Fammi sapere
Devi accedere o registrarti per scrivere nel forum
1 risposte