PROBLEMA Salvataggio dati e stampa a video di un array di struct in c.

GianD95

Nuovo Utente
6
0
CPU
Intel core i7 6700k
Dissipatore
Lepa exllusion 240
Scheda Madre
Asus z170 pro gaming
HDD
WD blue 1tb, samsung 850 evo.
RAM
16gb ddr4
GPU
gtx 970
Ciao a tutti, come scritto nel titolo ho un problema a stampare e probabilmente anche a salvare i dati in una struttura dati c. L' esercizio richiede di implementare un programma per la simulazione di un conto corrente e che stampi a video la lista movimenti di un dato correntista in diversi periodi dell'anno. Allego il codice di quello che sono riuscito ad abbozzare, il problema principale sta nella funzione per effettuare i movimenti di denaro tra utenti. In parole povere dovrei stampare a video tutti i movimenti effettuati da un dato correntista, ma nella function che ho scritto mi stampa solo l'ultimo movimento per num_mov volte.




C:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 20




struct u {

    char nome [MAX];
    char cognome [MAX];
    int saldo;
    int id;

} utenti [MAX];

struct m {

int giorno;
int mese;
int anno;
int importo;
int codice;


} movimento[MAX];




int num_utenti = 0;

int num_movimenti = 0;

int menu();
int ricerca_conto(int id);
int ricerca_movimento(int codice);
void inserisci_utente(void);
void cerca_utente(void);
void deposito(void);
void prelievo(void);
int movim();
void stampa_movimenti(void);
//void stampa(void);


int main (){

int scelta;

    while(scelta = menu()) {

        switch ( scelta ){

    case 1: system("CLS");

            inserisci_utente();

        break;

    case 2: system("CLS");

            cerca_utente();

        break;

    case 3: system("CLS");

            deposito();

        break;

    case 4: system("CLS");

            prelievo();

        break;

    case 5: system("CLS");

            movim();

            break;

    case 6: system("CLS");

            stampa_movimenti();

            break;

    case 0:

         return 0;

        }

}
   }

int ricerca_conto(int id) //Function che cerca la presenza di un dato correntista.
{
    int i;

    for( i = 0; i < num_utenti; i++)
        if ( utenti[i].id == id)
        return i;
    return -1;
}


void inserisci_utente(void) //Function che permette l'inserimento di un nuovo correntista.

{
    int num_conto;

  if ( num_utenti == MAX )
  {
      printf("Numero utenti massimo raggiunto.\n");
      return;
  }

  printf("\nInserire numero di conto: ");
    scanf("%d", &num_conto);

if ( ricerca_conto(num_conto) >= 0){

    printf("Utente già esistente.\n");
    return;
}

utenti[num_utenti].id = num_conto;

fflush(stdin);

printf("\nInserire nome: ");
    gets(utenti[num_utenti].nome);

fflush(stdin);

printf("\nInserire cognome: ");
    gets(utenti[num_utenti].cognome);

printf("\nInserire saldo: ");
    scanf("%d", &utenti[num_utenti].saldo);

num_utenti++;

}




void cerca_utente(void) //Function per la ricerca di un dato correntista.
{
    int i, n;

    printf("\nInserire numero di conto: ");
        scanf("%d", &n);
    i = ricerca_conto(n);

    if ( i >= 0) {

        printf("\nNome utente: %s\t     Cognome utente: %s\t    Saldo: %d\n", utenti[i].nome, utenti[i].cognome, utenti[i].saldo);
        //printf("Saldo: %d", utenti[i].saldo);

    }

    else
        printf("Utente non trovato.\n");
}


void deposito(void) //Function che permetta di effettuare un deposito.
{
    int i, n;

    printf("\nInserire numero di conto: ");
        scanf("%d", &n);

    i = ricerca_conto(n);

    if ( i >= 0 ){
        printf("Quanto vuoi depositare?: ");
            scanf("%d", &movimento[i].importo);
        utenti[i].saldo += movimento[i].importo;
    }
    else
        printf("Conto non trovato.\n");

}


void prelievo(void) //Function che permette di effettuare un prelievo
{
    int i, n, importo;

    printf("\nInserire numero di conto: ");
        scanf("%d", &n);

    i = ricerca_conto(n);

    if ( i >= 0 ){
        printf("Quanto vuoi prelevare?: ");
            scanf("%d", &importo);
        utenti[i].saldo -= importo;
    }
    else
        printf("Conto non trovato.\n");

}



int menu() { //Function che stampa a video il menu di scelta.

int scelta;

    printf("\n\t\t\t\t\t*** Conto Corrente 1.0 ***\n\n");

    printf("[1] Inserisci utente.\n\n");

    printf("[2] Ricerca utente.\n\n");

    printf("[3] Effettua Deposito.\n\n");

    printf("[4] Effettua Prelievo.\n\n");

    printf("[5] Effettua movimento.\n\n");

    printf("[6] Stampa movimenti.\n\n");

    printf("[0] Esci.\n\n");

        scanf("%d", &scelta);

    while ( scelta < 0 || scelta > 6 ){

        printf("Comando non riconosciuto!\n");

        printf("scelta: ");

        scanf("%d", &scelta);

            return scelta;
    }
    return scelta;
}


int movim() //Function che permette di effettuare un movimento di denaro.
{
    int i, n, mittente, destinatario;

    printf("\nInserire numero di conto del mittente: ");

        scanf("%d", &mittente);

    i = ricerca_conto(mittente);

    if ( i >= 0 ){

        printf("\nQuanto vuoi inviare?: ");

            scanf("%d", &movimento[i].importo);

        utenti[i].saldo -= movimento[i].importo;
    }

    else{
        printf("Utente inesistente.\n");
        return menu();
    }

    printf("\nInserire numero di conto del destinatario: ");

        scanf("%d", &destinatario);

    n = ricerca_conto(destinatario);

    printf("\nInserire giorno: ");

        scanf("%d", &movimento[i].giorno);

    printf("\nInserire mese: ");

        scanf("%d", &movimento[i].mese);

    printf("\nInserire anno: ");

        scanf("%d", &movimento[i].anno);

    if ( n >= 0 ){
        utenti[n].saldo += movimento[i].importo;

    printf("Movimento effettuato con successo!\n");

    num_movimenti++; movimento[i].codice++;

    return menu();
    }

    else{
        printf("Utente inesistente.\n");

    return menu();
    }
}


int ricerca_movimento(int codice) //Function che verifica la presenza di un movimento.
{
    int i;

    for( i = 0; i < num_movimenti; i++)
        if (movimento[i].codice == codice)
        return i;
    return -1;
}


void stampa_movimenti(void) //Function che stampa a video la lista movimenti di un dato correntista.
{
    int i, n, utente, x;

    printf("\nInserire il numero del conto di cui stampare i movimenti: ");

        scanf("%d", &utente);

    x = ricerca_conto(utente);

    if ( i >= 0 ){
        n = ricerca_movimento(utente);

        printf("Lista movimenti Numero conto:%d\t Nome: %s\t Cognome: %s\n", utente, utenti[i].nome, utenti[i].cognome);

        for (x = 0; x < num_movimenti; x++){
            printf("Importo: %d\t   Giorno: %d\t   Mese: %d\t   Anno: %d\t", movimento[i].importo, movimento[i].giorno, movimento[i].mese, movimento[i].anno);
        }

    }


}
 

Andretti60

Utente Èlite
6,440
5,091
Beh, e' completamente sbagliato, in quanto utilizzi una struttuta Movimento per ogni struttura Utente, in quanto usi lo stesso indice per i due vettori che sono entita' separate.
Devi avere una vettore di strutture Movimento per ogni struttura Utente. Vettore o Lista, fai tu, dipende da cosa richiede l'esercizio. Il problema del vettore e' che se e' statico hai un massimo di valori, raggiunto quello non puoi piu fare altro se no riscrivere sul dato piu' vecchio, se e' dinamico lo devi allocare e poi reallocare quando non c'e' piu posto.

Un altro problema (non correlato a questo) e' che i campi nome e cognome solo lunghe MAX caratteri, ma quando le inizializzi non controlli che le stringhe che leggi da tastiera siano piu' lunghe (quindi potenzialmente causi una corruzione della memoria)
 
  • Mi piace
Reazioni: GianD95

GianD95

Nuovo Utente
6
0
CPU
Intel core i7 6700k
Dissipatore
Lepa exllusion 240
Scheda Madre
Asus z170 pro gaming
HDD
WD blue 1tb, samsung 850 evo.
RAM
16gb ddr4
GPU
gtx 970
Ciao, scusa il ritardo.
Ho dato una sistematina al codice ma la funzione stampa continua a darmi problemi, ti posto il codice.


C:
/* Si supponga di voler gestire i conti correnti di n utenti. Ogni utente è identificato dal
Cognome, Nome, numero del conto, lista movimenti in diversi giorni dell’anno.
Gestire i conti corrente e gestire le seguenti operazioni
• Inserire un nuovo correntista a cui viene assegnato un codice univoco.
• Visualizzare la lista movimenti di un dato correntista (dato il numero del
conto o Cognome/Nome) in una fissata data. */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 20
#define LEN 100

struct movimento {

int giorno;
int mese;
int anno;
int importo;




};


struct utente {

    char nome [MAX + 1];
    char cognome [MAX + 1];
    int saldo;
    int id;
    struct movimento movements[LEN];
    unsigned int num_mov;


} utenti[MAX];






int num_utenti = 0;

int num_movimenti = 0;

int menu();
int ricerca_conto(int id);
int ricerca_movimento();
void inserisci_utente(void);
int cerca_utente();
void deposito(void);
void prelievo(void);
int movim();
void stampa_movimenti();
int ricerca_utente();
//void stampa(void);


int main (){

int scelta, id;

    while(scelta = menu()) {

        switch ( scelta ){

    case 1: system("CLS");

            inserisci_utente();

        break;

    case 2: system("CLS");

            cerca_utente();

        break;

    case 3: system("CLS");

            deposito();

        break;

    case 4: system("CLS");

            prelievo();

        break;

    case 5: system("CLS");

            movim();

            break;

    case 6: system("CLS");

            stampa_movimenti(num_movimenti);

            break;

    case 7: system("CLS");

            ricerca_movimento();

            break;

    case 0:

         return 0;

        }

}
   }

int ricerca_conto(int id) //Function che cerca la presenza di un dato correntista.
{
    int i;

    for( i = 0; i < num_utenti; i++)
        if ( utenti[i].id == id)
        return i;
    return -1;
}


void inserisci_utente(void) //Function che permette l'inserimento di un nuovo correntista.

{
    int num_conto, n, m;

  if ( num_utenti == MAX )
  {
      printf("Numero utenti massimo raggiunto.\n");
      return;
  }

  printf("\nInserire numero di conto: ");
    scanf("%d", &num_conto);

if ( ricerca_conto(num_conto) >= 0){

    printf("Utente già esistente.\n");
    return;
}

utenti[num_utenti].id = num_conto;

fflush(stdin);

printf("\nInserire nome: ");

    gets(utenti[num_utenti].nome);

        n = strlen(utenti[num_utenti].nome);

    if ( n > MAX + 1) //Controllo che la stringa inserita non sia maggiore del consentito.

    {
        printf("Nome troppo lungo!\n");

        return;
    }

fflush(stdin);

printf("\nInserire cognome: ");

    gets(utenti[num_utenti].cognome);

        m = strlen(utenti[num_utenti].cognome);

    if ( m > MAX + 1) //Controllo che la stringa inserita non sia maggiore del consentito.

    {
        printf("Cognome troppo lungo!\n");

        return;
    }

printf("\nInserire saldo: ");
    scanf("%d", &utenti[num_utenti].saldo);

num_utenti++;

}




int cerca_utente() //Function per la ricerca di un dato correntista.
{
    int i, n;

    printf("\nInserire numero di conto: ");
        scanf("%d", &n);
    i = ricerca_conto(n);

    if ( i >= 0) {

        printf("\nNome utente: %s\t     Cognome utente: %s\t    Saldo: %d\n", utenti[i].nome, utenti[i].cognome, utenti[i].saldo);
        //printf("Saldo: %d", utenti[i].saldo);

    }

    else
        printf("Utente non trovato.\n");
}


void deposito(void) //Function che permetta di effettuare un deposito.
{
    int i, n;

    printf("\nInserire numero di conto: ");
        scanf("%d", &n);

    i = ricerca_conto(n);

    if ( i >= 0 ){
        printf("Quanto vuoi depositare?: ");
            scanf("%d", &utenti[i].movements[i].importo);
        utenti[i].saldo += utenti[i].movements[i].importo;
    }
    else
        printf("Conto non trovato.\n");

}


void prelievo(void) //Function che permette di effettuare un prelievo
{
    int i, n, importo;

    printf("\nInserire numero di conto: ");
        scanf("%d", &n);

    i = ricerca_conto(n);

    if ( i >= 0 ){
        printf("Quanto vuoi prelevare?: ");
            scanf("%d", &importo);
        utenti[i].saldo -= importo;
    }
    else
        printf("Conto non trovato.\n");

}



int menu() { //Function che stampa a video il menu di scelta.

int scelta;

    printf("\n\t\t\t\t\t*** Conto Corrente 1.0 ***\n\n");

    printf("[1] Inserisci utente.\n\n");

    printf("[2] Ricerca utente.\n\n");

    printf("[3] Effettua Deposito.\n\n");

    printf("[4] Effettua Prelievo.\n\n");

    printf("[5] Effettua movimento.\n\n");

    printf("[6] Stampa movimenti.\n\n");

    printf("[7] Ricerca movimenti.\n\n");

    printf("[0] Esci.\n\n");

        scanf("%d", &scelta);

    while ( scelta < 0 || scelta > 7 ){

        printf("Comando non riconosciuto!\n");

        printf("scelta: ");

        scanf("%d", &scelta);

            return scelta;
    }
    return scelta;
}


int movim() //Function che permette di effettuare un movimento di denaro.
{
    int i, n, mittente, destinatario, o = 0;

    printf("\nInserire numero di conto del mittente: ");

        scanf("%d", &mittente);

    i = ricerca_conto(mittente);

    if ( i >= 0 ){

        printf("\nQuanto vuoi inviare?: ");

            scanf("%d", &utenti[i].movements[mittente].importo);

        utenti[i].saldo -= utenti[i].movements[mittente].importo;

        utenti[i].num_mov++;
    }

    else{
        printf("Utente inesistente.\n");
        return -1;
    }

    printf("\nInserire numero di conto del destinatario: ");

        scanf("%d", &n);

    destinatario = ricerca_conto(n);

    printf("\nInserire giorno: ");

        scanf("%d", &utenti[i].movements[i].giorno);

    printf("\nInserire mese: ");

        scanf("%d", &utenti[i].movements[i].mese);

    printf("\nInserire anno: ");

        scanf("%d", &utenti[i].movements[i].anno);

        num_movimenti++;

    if ( n >= 0 ){
        utenti[destinatario].saldo += utenti[i].movements[mittente].importo;

    printf("Movimento effettuato con successo!\n");

    utenti[mittente].num_mov++; utenti[destinatario].num_mov++;

    //num_movimenti++;

    return -1;
    }

    else{
        printf("Utente inesistente.\n");

    getchar();
    }
}


int ricerca_movimento() //Function che verifica la presenza di un movimento.
{
    int g, m, a, i, trovato = 0;

    printf("\nInserire giorno: ");

        scanf("%d", &g);

    printf("\nInserire mese: ");

        scanf("%d", &m);

    printf("\nInserire anno: ");

        scanf("%d", &a);

        for( i = 1, trovato = 0; i < utenti[i].num_mov && i < utenti[i].movements[i].giorno && i < utenti[i].movements[i].mese && i < utenti[i].movements[i].anno; i++)
        {
            if ( g == utenti[i].movements[i].giorno && m == utenti[i].movements[i].mese && a == utenti[i].movements[i].anno)

                trovato += 1;
        }

        if ( trovato == 0 )

            printf("Non ci sono movimenti nella data selezionata.\n");

        else

            printf("Sono stati trovati %d movimenti\n", trovato);


    }




void stampa_movimenti() //Function che stampa a video la lista movimenti di un dato correntista.
{
    int i, x, utente;

        printf("\nInserire il numero del conto di cui stampare i movimenti: ");

            scanf("%d", &i);

                utente =ricerca_conto(i);

                    if ( utente >= 0 ){


                system("CLS");

        printf("Lista movimenti dell'utente:\nNumero conto:%d\t Nome: %s\t Cognome: %s\n", utenti[utente].id, &utenti[utente].nome, &utenti[utente].cognome);

    for (x = 1; x <= utenti[utente].num_mov; x++){

        printf("Importo: %d\t   Giorno: %d\t   Mese: %d\t   Anno: %d\t\n", utenti[utente].movements[x].importo, utenti[utente].movements[x].giorno, utenti[utente].movements[x].mese, utenti[utente].movements[x].anno);

            }

        }


}




int ricerca_utente() //Function per la ricerca di un dato correntista.
{
    int i, n;

    printf("\nInserire numero di conto di cui stampare i movimenti: ");

        scanf("%d", &n);

            i = ricerca_conto(n);

                if ( i >= 0) {

                    return i;
                }

            else
    {
        printf("Utente non trovato.\n");

    return -1;


    }


return 0;
}
 

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!