BANCA IN LINGUAGGIO C

di il
16 risposte

BANCA IN LINGUAGGIO C

Il programma gestisce le informazioni di una banca:
esso aggiornerà i conti esistenti, aggiungera dei conti nuovi, (li eliminerà) e stampa a video la lista con tutti i conti
IL programma a 5 scelte:
1 stampa elenco conti
2 updateRecord per aggiornare un conto (aggiorna un conto gia esistente)
3 new record aggiungere un nuovo conto
4 delete record per eliminare un conto
5 uscita programma
il programma mi da problemi di stampa
la stampa avviene in questo modo:
||CONTO||COGNOME||NOME||BILANCIO||
1 ROSSI @( 11.00
2 GIALLI (998@ 00.00
INVECE DOVREBBE USCIRE:
||CONTO||COGNOME||NOME||BILANCIO||
1 ROSSI MARCO 12.56
2 GIALLI ANTONIO 09.88

#include <stdio.h>
#include <stdlib.h>

 struct DatiCliente {
	int conto; //numero di contocorrente
	char cognome[50]; //cognome del cliente
	char nome[50]; //nome del cliente
	double bilancio; //bilancio denaro cliente
};

//prototipi

int sceltamenu(void);
void stampaFile(FILE*ptf);
void aggiungiConto(FILE*ptf);
void aggiornaConto(FILE*ptf);
void eliminaConto(FILE*ptf);

int main() {
	int scelta; //scelta utente per operazioni in menu
	FILE*cptf;

	//fopen apre il file se non riesce ad aprirlo provoca l'uscita dal programma
	if((cptf=fopen("elencoCLienti.dat", "rb+"))==NULL) {
		printf("ERRORE: file non aperto correttamente\n\a");
	}//fine if
	else {
		//permette all'utente di specificare un azione
		while((scelta=sceltamenu())!=5){
			switch(scelta) {
			//stampa contenuti file
			case 1:
				stampaFile(cptf);
				break;
			case 2:
				aggiungiConto(cptf);
				break;
			case 3:
				aggiornaConto(cptf);
				break;
			case 4:
				eliminaConto(cptf);
				break;
				//visualizza un messaggio se l'utente non specifica una scelta valida
			default:
				printf("ERRORE: la scelta selezionata non e' corretta");
				break;

			}//fine switch
		}//fine while
		fclose(cptf);//chiude il file
	}//fine else
	system("PAUSE");
	return 0;
}//fine main

//stampa a video il contenuto del file
void stampaFile(FILE*ptf) {


	//crea dati cliente con informazioni di default
			struct DatiCliente cliente= {0,"", "", 0.0};

			/*fopen apre il file; se non riesce ad aprire il file;
		   	 * provoca l'uscita dal file
		   	 */
			if((ptf=fopen("elencoClienti.dat", "rb"))==NULL) {
				printf ("ERRORE: file non aperto corretamente\n");
			}
			else {
				printf("%-15s%-20s%-11s%10s\n","||N. conto||", " COGNOME||", " NOME||", " BILANCIO||");

				while(!feof(ptf)) {
				//legge tutti i record da file finche non viene visualizzato l EOF
				fread(&cliente, sizeof(struct DatiCliente),1,ptf);

				//visualizza il record
				if(cliente.conto !=0) {
					printf("%-15d%-20s%-11s%10.2f\n",cliente.conto, cliente.cognome, cliente.nome, cliente.bilancio);
			} //fine if
				}//fine while

				fclose(ptf);//chiusura file
			}//fine else

}//fine stampa

void aggiornaConto(FILE*ptf) {
	int conto; //numero di conto
		double trans; //transazione conto

		//crea dati cliente con info di default
			struct DatiCliente cliente = { 0, "", "", 0.0 };

			//ottiene numero di conto da aggiornare
			printf("inserisci il numero di conto da aggiornare (1-100): ");
			scanf("%d", &conto);

			//sposta il puntatore del file nel punto del record giusto del file

			fseek(ptf,(conto-1)*sizeof(struct DatiCliente),SEEK_SET);

			//legge il record da file
			fread(&cliente, sizeof(struct DatiCliente),1,ptf);

			//visualizza un messaggio di errore se il conto non esiste

			if(cliente.conto==0) {
				printf("ERRORE: il conto #%d non risulta essere attivo\n", conto);
			}//fine if

			else { //aggiornamento record
				printf("%-15d%-20s%-11s%10.2f\n\n", cliente.conto,
						cliente.cognome,cliente.nome, cliente.bilancio);

				//richiesta di inserire il bilancio da aggiornare
				printf("inserisci il denaro da aggiungere al conto: ");
				scanf("%lf", &trans);
				cliente.bilancio += trans; //aggiornamento bilancio

				printf("%-15d%-20s%-11s%10.2f\n",
						cliente.conto, cliente.cognome, cliente.nome,  cliente.bilancio);

				//sposta il puntatore del file per correggere il record nel file
				fseek(ptf,(conto-1)*sizeof(struct DatiCliente), SEEK_SET);

				//sovrascrizione del vecchio record con il nuovo record aggiornato

				fwrite(&cliente, sizeof(struct DatiCliente),1,ptf);
				}//fine else
}//fine aggiorna conto

//cancella conto esistente
void eliminaConto(FILE*ptf) {
	struct DatiCliente cliente; //memorizza il record letto da file

	struct DatiCliente blankcliente= {0,"","",0}; //cliente vuoto
	int conto;

	   //ottieni il numero del conto da cancellare
	   printf("inserisci il numero di conto da cancellare (1-100): ");
	   scanf("%d",&conto);

	   //sposta il puntatore del file nel punto del record
	   fseek(ptf,(conto-1)*sizeof(struct DatiCliente), SEEK_SET);

	   //legge il record del file
	   fread(&cliente, sizeof(struct DatiCliente),1,ptf);

	   //visualizza un messaggio di errore se il conto non esistesse
	   if(cliente.conto==0) {
	   printf("ERRORE:il conto #%d non esiste\n", cliente.conto);
	   }//fine if

	   else { //cancella record
		//sposta il puntatore del file ne punto giusto del record

		  fseek(ptf, (conto-1)*sizeof(struct DatiCliente), SEEK_SET);
		  //legge il record del file
		  fread(&cliente,sizeof(struct DatiCliente),1,ptf);

		//visualizza un messaggio d'errore se il conto non esiste

	        }//fine else
		if(cliente.conto==0) {
			printf("ERRORE: il conto #%d non esiste", conto);
		    }//fine if
		else {
			//sposta  il puntatore del punto giusto del file

			fseek(ptf,(conto-1)*sizeof(struct DatiCliente), SEEK_SET);
			//sostituisce il record esistente con uno vuoto
			fwrite(&blankcliente, sizeof(struct DatiCliente),1,ptf);

		     }//fine else
}//fine cancella conto

void aggiungiConto(FILE*ptf) {
	struct DatiCliente cliente= {0,"","",0.0}; //record con informazioni di default
		int conto; //numero conto

		// ottieni il numero del conto da creare
		printf("inserisci il nuovo numero di conto (0-100): ");
		scanf("%d",&conto);

		//sposta il puntatore del file nel punto di record giusto nel file
		fseek(ptf, (cliente.conto-1)*sizeof(struct DatiCliente), SEEK_SET);

		//legge il record dal file
		fread(&cliente, sizeof(struct DatiCliente),1,ptf);

		//visualizza un messaggio di errore se il conto è gia esistente
		if(cliente.conto !=0) {
			printf("ERRORE: conto #%d e' gia' presente", cliente.conto);
		}// fine if
		else {
			//l'utente inserisce il cognome, il nome e il bilancio
			printf ("inserisci, cognome, nome e bilancio\n-");
			scanf("%s%s%lf", cliente.cognome, cliente.nome, &cliente.bilancio);
			cliente.conto=conto;

			//sposta il puntatore del file nel punto del record giusto nel file
			fseek(ptf,(cliente.conto-1)* sizeof(struct DatiCliente), SEEK_SET);

			//inserisci il record nel file
			fwrite(&cliente, sizeof(struct DatiCliente), 1,ptf);
		}// fine else
}//fine nuovo conto

//permette all'utente di scegliere una funzione nel menu

int sceltamenu (void) {
	int scelta; //variabile di memorizzazione della scelta

	printf("\n benvenuto nella tua banca\n"
			"seleziona una opzione:\n"
			"1) stampa contenuto  file\n"
			"2) aggiorna conto\n"
			"3) inserisci un nuovo conto\n"
			"4) elimina conto\n"
			"5) esci dal programma\n");
	scanf("%d", &scelta);
	return scelta;
}//fine menu







16 Risposte

  • Re: BANCA IN LINGUAGGIO C

    Perché apri nuovamente il file nella stampa se passi il puntatore al file aperto?
    La feof va esaminata dopo aver letto dal file.

    La stampa deve essere
    
    		struct DatiCliente cliente;
    
    		printf("%-15s%-20s%-11s%10s\n","||N. conto||", " COGNOME||", " NOME||", " BILANCIO||");
    
    		fread(&cliente, sizeof(struct DatiCliente),1,ptf);
    			
    		while(!feof(ptf)) 
    		{
    			printf("%-15d%-20s%-11s%10.2f\n",cliente.conto, cliente.cognome, cliente.nome, cliente.bilancio);
    
    			fread(&cliente, sizeof(struct DatiCliente),1,ptf);
    		}
    
    Cancella il file dei dati e crealo nuovamente.
  • Re: BANCA IN LINGUAGGIO C

    oregon ha scritto:


    ..
    ??
  • Re: BANCA IN LINGUAGGIO C

    Ho modificato il post ... in quel momento non potevo.
  • Re: BANCA IN LINGUAGGIO C

    oregon ha scritto:


    Perché apri nuovamente il file nella stampa se passi il puntatore al file aperto?
    La feof va esaminata dopo aver letto dal file.

    La stampa deve essere
    
    		struct DatiCliente cliente;
    
    		printf("%-15s%-20s%-11s%10s\n","||N. conto||", " COGNOME||", " NOME||", " BILANCIO||");
    
    		fread(&cliente, sizeof(struct DatiCliente),1,ptf);
    			
    		while(!feof(ptf)) 
    		{
    			printf("%-15d%-20s%-11s%10.2f\n",cliente.conto, cliente.cognome, cliente.nome, cliente.bilancio);
    
    			fread(&cliente, sizeof(struct DatiCliente),1,ptf);
    		}
    
    Cancella il file dei dati e crealo nuovamente.
    ho provato a risolvere cosi...ma ora mi stampa le prime due righe come me le stampava in precedenza e il resto mi esce solo 0, da considerare che ho cambiato file e creato uno nuovo
  • Re: BANCA IN LINGUAGGIO C

    A me visualizza correttamente.

    Utilizzi gcc o mingw?

    Prova ad aggiungere, all'inizio del main, la linea

    setbuf(stdout, NULL);
  • Re: BANCA IN LINGUAGGIO C

    oregon ha scritto:


    A me visualizza correttamente.

    Utilizzi gcc o mingw?

    Prova ad aggiungere, all'inizio del main, la linea

    setbuf(stdout, NULL);
    mingw poichè solo quello ci fanno usare in università
  • Re: BANCA IN LINGUAGGIO C

    Hai aggiunto la setbuf ?
  • Re: BANCA IN LINGUAGGIO C

    oregon ha scritto:


    Hai aggiunto la setbuf ?
    si continua a darmi l'errore sui nomi non riesco a capire il perchè...solo sui nomi
  • Re: BANCA IN LINGUAGGIO C

    Che nome hai usato? Con il codice che ho provato io va bene
  • Re: BANCA IN LINGUAGGIO C

    Succede anche se esegui e scegli subito la stampa?
  • Re: BANCA IN LINGUAGGIO C

    oregon ha scritto:


    Succede anche se esegui e scegli subito la stampa?
    si anche mandando subito in stampa , comunque nomi semplici come "mario" e "luca
  • Re: BANCA IN LINGUAGGIO C

    All'inizio della stampa non devi aprire il file ma eseguire una fseek per portare il puntatore all'inizio.

    Per il resto dovrebbe funzionare.

    L'ho pure compilato con Visual C e funziona perfettamente così come ti ho detto.

    Se vuoi, dammi un link da cui scaricare il tuo sorgente così provo direttamente.
  • Re: BANCA IN LINGUAGGIO C

    void eliminaConto(FILE*ptf) {
    	struct DatiCliente cliente; //memorizza il record letto da file
    
    	struct DatiCliente blankcliente= {0,"","",0}; //cliente vuoto
    	int conto;
    
    	   //ottieni il numero del conto da cancellare
    	   printf("inserisci il numero di conto da cancellare (1-100): ");
    	   scanf("%d",&conto);
    
    	   //sposta il puntatore del file nel punto del record
    	   fseek(ptf,(conto-1)*sizeof(struct DatiCliente), SEEK_SET);
    
    	   //legge il record del file
    	   fread(&cliente, sizeof(struct DatiCliente),1,ptf);
    
    	   //visualizza un messaggio di errore se il conto non esistesse
    	   if(cliente.conto==0) {
    	   printf("ERRORE:il conto #%d non esiste\n", cliente.conto);
    	   }//fine if
    
    	   else { //cancella record
    		//sposta il puntatore del file ne punto giusto del record
    
    		  fseek(ptf, (conto-1)*sizeof(struct DatiCliente), SEEK_SET);
    		  //legge il record del file
    		  fread(&cliente,sizeof(struct DatiCliente),1,ptf);
    
    		//visualizza un messaggio d'errore se il conto non esiste
    
    	        }//fine else
    		if(cliente.conto==0) {
    			printf("ERRORE: il conto #%d non esiste", conto);
    		    }//fine if
    		else {
    			//sposta  il puntatore del punto giusto del file
    
    			fseek(ptf,(conto-1)*sizeof(struct DatiCliente), SEEK_SET);
    			//sostituisce il record esistente con uno vuoto
    			fwrite(&blankcliente, sizeof(struct DatiCliente),1,ptf);
    
    		     }//fine else
    }//fine cancella conto
    Perche' la funzione cancellaConto va due volte al punto fseek(ptf,(conto-1)*sizeof(struct DatiCliente), SEEK_SET); e controlla due volte if(cliente.conto==0) { e solo dopo la seconda volta scrivi il campo vuoto?
  • Re: BANCA IN LINGUAGGIO C

    E la stampa come è finita? Non si discute di più problemi (il problema va scritto nel titolo) in un thread, si fa confusione.

    E poi parli di cancellaConto ma la funzione è eliminaConto (è quella giusta?) ...
    E della linea di cui parli ce ne sono due ...
    Perché ci sono due linee if(cliente.conto==0) { ?
Devi accedere o registrarti per scrivere nel forum
16 risposte