PROBLEMA Salve a tutti, non so come continuare questo esercizio con le struct in C

Esultanti fermenti

Nuovo Utente
1
0
Non so come modificare/continuare

Implementare una struct con gli studenti della facoltà di Bioinformatica di TorVergata. Per ogni studente è necessario specificare le seguenti informazioni: nome, cognome, matricola, data di nascita (tipo derivato), indirizzo di residenza (tipo derivato con: nome via, civico, cap, comune), ISEE, anno accademico di iscrizione. Implementare una struct con i docenti della facoltà di Bioinformatica di TorVergata. Per ogni docente è necessario specificare: nome, cognome, codice fiscale, data di nascita (tipo derivato), indirizzo di residenza (tipo derivato con: nome via, civico, cap, comune). Implementare una struct con i corsi della facoltà di Bioinformatica di TorVergata. Per ogni corso è necessario specificare: nome, cfu, anno di erogazione (primo o secondo), semestre di erogazione (primo o secondo), docente (tipo derivato).

4.Segue dall'esercizio precedente. Implementare un menu scelta e le funzioni per: aggiungere un nuovo studente/docente/corso, rimuovere uno studente/docente/corso, modificare i dati relativi all’indirizzo di residenza (per studente/docente) o all’ISEE (solo studente), modificare il docente di un corso. Gli studenti/docenti devono essere aggiunti in una lista ordinata per cognome, i corsi i una lista ordinata per nome.

5.Implementare una struct con gli esami sostenuti da ogni studente della facoltà di Bioinformatica di TorVergata, modificando in modo opportuno la struct degli studenti. Per ogni esame è necessario specificare: data in cui è stato sostenuto (tipo derivato), voto, corso (che punta all’elemento corretto della lista dei corsi). Implementare nel menu scelta le funzioni per aggiungere un esame per uno studente (in base alla matricola), calcolare la media ponderata di uno studente.

C:
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>

struct nascita { //struttura dati per la nascita degli studenti
    int giorno;
    int mese;
    int anno;
};

struct residenza { //struttura dati per la residenza
    char via[10];
    int civico;
    int cap;
    char comune [10];
};

struct studente{  //struttura dati studente
    char nome[10];
    char cognome [10];
    int matricola;
    struct nascita n;
    struct residenza r;
    int ISEE;
    int anno_iscrizione;
};
typedef struct studente Tstudente;

struct docente {
    char nome[10];
    char cognome[10];
    char codice_fiscale[16];
    struct nascita n;
    struct residenza r;
};
typedef struct docente Tdocente;
struct corsi{
    char nome[10];
    int cfu;
    int anno_erogazione;
    int semestre_erogazione;
    struct docente d;
};
typedef struct corsi Tcorsi;
struct SNode_studente{
    Tstudente studente;
    struct  SNode_studente *link_s; //puntatore al nodo successivo
};
typedef struct SNode_studente TNode_studente; // ridefinizione della struttura
typedef TNode_studente *TList_s; // definizione del puntatore per indirizzo della struttura

struct SNode_docente{
    Tdocente docente;
    struct  SNode_docente *link_d; //puntatore al nodo successivo
};
typedef struct SNode_docente TNode_docente; // ridefinizione della struttura
typedef TNode_docente *TList_d; // definizione del puntatore per indirizzo della struttura

struct SNode_corso{
    Tcorsi corsi;
    struct  SNode_corso *link_c; //puntatore al nodo successivo
};
typedef struct SNode TNode_corso; // ridefinizione della struttura
typedef TNode_corso *TList_c; // definizione del puntatore per indirizzo della struttura

/* Segue dall'esercizio precedente. Implementare un menu scelta e le funzioni per:
 * aggiungere un nuovo studente/docente/corso, rimuovere uno studente/docente/corso,
 * modificare i dati relativi all’indirizzo di residenza (per studente/docente)
 * o all’ISEE (solo studente),
 * modificare il docente di un corso. Gli studenti/docenti devono essere
 * aggiunti in una lista ordinata
 * per cognome, i corsi i una lista ordinata per nome. */

int scelta;
TList_c Crea_Lista_c();
TList_d Crea_Lista_d();
TList_s Crea_Lista_s();
Tstudente info_studente();
Tdocente info_docente();
Tstudente studente;
Tcorsi corsi;
Tdocente docente;
TList_s inserisci_studente(TList_s list, Tstudente studente);
TList_d inserisci_docente (TList_d list, Tdocente docente);
void inserisci_edit_dato(TNode_studente *node, struct residenza r);
struct residenza leggi_nuova_residenza(); //inserisce la nuova residenza
Tstudente Cancella_Elemento(Tstudente studente, char *cognome);
Tcorsi Cancella_elemento(Tcorsi corsi, char *nome);
Tdocente cancella_elemento(Tdocente docente, char *cognome);
TNode_studente * Cerca_Cognome (Tstudente lista, char *cognome); //cerca un elemento della lista per cognome
TNode_docente * Cerca_cognome (Tdocente lista, char *cognome); //cerca un elemento della lista per cognome

int menu();
int main() {
    char cognome[10];
    char codice[16];
    struct residenza r;
    char municipio[2];
    TList_c list_c;
    TList_s list_s;
    TList_d list_d;
    TNode_corso *node_c;
    TNode_docente *node_d;
    TNode_studente *node_s;
    list_c = Crea_Lista_c();
    list_d = Crea_Lista_d();
    list_s = Crea_Lista_s();
    menu();
    while (scelta = menu()) {
        switch (scelta) {
            case 1: {
                studente = info_studente();
                list_s = inserisci_studente(list_s,studente);
                docente = info_docente();
                list_d = inserisci_docente(list_d, docente);
                break;
            }
            case 2:{
                printf("Inserire cognome da voler eliminare ");
                scanf("%s", cognome);
                Tstudente Cancella_Elemento(Tstudente studente, char *cognome);
                Tdocente cancella_elemento(Tdocente docente, char *cognome);
                printf ("Eliminato\n");
                break;
            }


        }

        return 0;
    }
}
        int menu() {
            printf("------\n");
            printf("scegliere 1 per aggiungere uno studente  \n");
            printf("scegliere 2 per aggiungere un docente \n");
            printf("scegliere 3 per aggiungere un corso \n");
            printf("scegliere 4 per modificare residenza \n");
            printf("scegliere 5 per modificare ISEE \n");
            printf("------\n");
            scanf("%d", &scelta);

            return scelta;
        }
        TList_c Crea_Lista_c() {
            // inizializzo la lista corsi
            return NULL;
        }
        TList_d Crea_Lista_d() {
            // inizializzo la lista docenti
            return NULL;
        }
        TList_s Crea_Lista_s() {
            // inizializzo la lista studenti
            return NULL;
        }

Tstudente inserisci_studente(){
    printf("\nInserisci nome studente  ");
    scanf("%s", studente.nome );
    printf("\nInserisci cognome: ");
    scanf("%s", studente.cognome);
    printf("\nInserisci matricola: ");
    scanf("%d", &studente.matricola);
    printf("\nInserisci giorno di nascita: ");
    scanf("%d", &studente.n.giorno);
    printf("\nInserisci via di residenza: ");
    scanf("%s", studente.r.via );
    printf("\nInserisci civico di residenza: ");
    scanf("%d", &studente.r.civico);
    printf("\nInserisci cap di residenza: ");
    scanf("%d", &studente.r.cap);
    printf("\nInserisci comune: ");
    scanf("%s", &studente.r.comune);


    return studente;
}
Tdocente docente;
Tdocente inserisci_docente(){
    printf("\nInserisci nome docente   ");
    scanf("%s", docente.nome);
    printf("\nInserisci cognome: ");
    scanf("%s", docente.cognome);
    printf("\n Inserisci codice fiscale  ");
    scanf("%s", docente.codice_fiscale);
    printf("Inserisci giorno di nascita:  ");
    scanf("%d", &docente.n.giorno);
    scanf("%s", docente.r.via );
    printf("\nInserisci civico di residenza: ");
    scanf("%d", &docente.r.civico);
    printf("\nInserisci cap di residenza: ");
    scanf("%d", &docente.r.cap);
    printf("\nInserisci comune: ");
    scanf("%s", &docente.r.comune);

    return docente;

}

Tcorsi corsi;
Tcorsi inserisci_corso(){
    printf("\nInserisci nome   ");
    scanf("%s", corsi.nome);
    printf("\nInserisci cfu"  );
    scanf("%d", corsi.cfu);
    printf("\nInserisci anno di erogazione  ");
    scanf("%d", corsi.anno_erogazione);
    printf("\nInserisci semestre di erogazione  ");
    scanf("%d", corsi.semestre_erogazione);
    printf("\nInserisci docente  ");
    scanf("%s", &docente);

    return corsi;

}

TList_s inserisci_studente(TList_s list_s, Tstudente info){
    TList_s prec, curr, newnode;
    // nodo precedente punta null
    prec = NULL;
    // nodo corrente è impostato al primo nodo della lista
    curr = list_s;
    // devo scorrere finchè curr sia null e se il cognome che voglio inserire ha un  valore maggiore del nodo che stiamo
    // visitando allora deve scorrere in avanti
    while ((curr != NULL) && (strcmp(info.cognome, curr->studente.cognome) > 0)) {
        prec = curr;
        curr = curr->link_s;
    }
    newnode = (TNode_studente *) malloc(sizeof(TNode_studente));
    assert(newnode != NULL);
    newnode-> studente = info;

    if (prec == NULL) {
        newnode->link_s = list_s;
        list_s = newnode;
        return list_s;
    } else {
        prec->link_s = newnode; //il nodo precedente deve puntare al nuovo nodo inserito
        newnode->link_s = curr;
        return list_s;
    }
}
void inserisci_edit_dato(TNode_studente *node, struct residenza r)  //inserisci un dato dell' elemento della lista che è stato modificato
{
    strcpy(node->studente.r.via, r.via);
    node->studente.r.civico = r.civico;
    node->studente.r.cap = r.cap;
    strcpy(node->studente.r.comune, r.comune);
}

struct residenza leggi_nuova_residenza() {  //modifica dato
    printf("\nInserisci la nuova via di residenza: ");
    scanf("%s", studente.r.via);
    printf("\nInserisci il nuovo n. civico di residenza: ");
    scanf("%d", &studente.r.civico);
    printf("\nInserisci il nuovo cap di residenza: ");
    scanf("%d", &studente.r.cap);
    printf("\nInserisci il nuovo municipio di residenza: ");
    scanf("%s", studente.r.comune);
    printf("il suo indirizzo è:%s%d%d%s", studente.r.via, studente.r.civico, studente.r.cap, studente.r.comune);

    return studente.r;
}
 
Ultima modifica da un moderatore:

bigendian

Utente Attivo
738
424
OS
Linux
Non sai come continuare, o hai copiato male ? Perche mancano delel graffe di chiusura funzione, ad esempio prima di menu().

Di cosa hai bisogno ? Esclusivamente portare il compitino al prof ? Su fattura, qualcuno puo dartelo funzionante in pochi minuti :).
Imparare e dunque completarlo tu ? Allora fai una domanda precisa su cosa non funziona riportando che errori ti da.
 
  • Mi piace
Reazioni: r3dl4nce

Andretti60

Utente Èlite
6,440
5,091
Purtroppo direi che l’unica cosa che hai azzeccato è la definizione delle strutture (non perfetta ma passabile, direi hai la sufficienza).
Il resto è completamente sbagliato, a cominciare dalle variabili buttate giù a caso, per esempio la funzione menu() utilizza una variabile locale (int scelta) che è dichiarata globale, di cui ne ritorna il valore. Ed è un errore che fai ovunque.

Il mio consiglio: tieni solo la definizione delle strutture, il resto butta al macero.

Scrivi una funzione alla volta, e prima di continuare prova che funzioni , è la comune pratica di programmazione, nessuno scrive migliaia di linee di codice tutte in una volta, una funzione deve essere il più corta possibile, fare solo una cosa, in modo che possa essere provata subito.

Inizia dalla funzione menu(). Dichiara la variabile ‘scelta’ localmente. Cosa succede se qualcuno digita un numero che non fa parte della scelta? Devi controllare che tale numero rientri nei valori; aggiungi un valore per terminare il programma (in genere lo zero). Scrivi il main() e chiama solo la funzione menu(), stampa il valore che ritorna. Compila, prova, eventualmente correggi errori di compilazione e logici. Solo quando sei sicuro che funziona, aggiungi una seconda funzione.
Scrivi, compila, correggi, prova, e così via.
Io programmo da più di trenta anni, non ho mai cambiato il metodo (a parte usare UML per la progettazione)

Questo è quello che si impara il primo giorno nei corsi di programmazione.
Mi spiace dirtelo, ma quello che hai scritto mostra che hai serie lacune.
Qui siamo ben lieti di aiutarti, ma non aspettarti che scriviamo l’esercizio per te (è anche contro il regolamento).
Non esitare a fare domande specifiche.
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,222
1,853
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Lascio aperto con la speranza che @Esultanti fermenti ci dia lumi in merito, che ponga domande o altro, così diamo un senso al suo post iniziale (anche se sono trascorsi 3 mesi).
 

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili